2016/02/25

《秒懂資料結構》研讀法

  在這本書中,所有的演算法都會以三種面貌出現:
  • 流程圖:呈現整個處理的流程;
  • 測試個案:將演算法所處理的資料結構以各種可能出現的樣貌列出(尤其是各種特例),以驗證演算法的處理過程;
  • 文字解說:在內文中,將流程圖的關鍵運作一個步驟、一個步驟的解讀,並在測試個案中標出各個步驟所帶來的影響。
以該書67頁將新節點「加入到指定的節點之前」為例,整個演算法以圖5-9的流程圖呈現(如右圖1),並於圖5-10中列出連結資料結構當時可能的幾種樣貌(如右圖2),然後在流程圖、測試個案圖、以及內文解說(如右圖3)中,用明顯的數字符號標出三者間的交互參照關係。這種參照,便如同教師親臨講解一般。
圖1、流程圖
圖2、測試個案
圖3、內文講解

2016/02/16

讀韓愈〈與陳給事書〉


『他愛我?他不愛我?他愛我?他不愛我?…』男女面對心儀對象的一句言語、一個動作都可以如此反覆猜想著。『對了,當時他的意思一定是暗示我這樣啦!』『去找他?不不不,我把自己當什麼了?…』『可是,他上次暗示了…。』然後再找個自己可以接受的理由,再接再厲一番。韓愈謀官,也是如此。說白了,就是如何在熱臉貼人冷屁股時,依舊能維持最起碼的尊嚴?

2016/02/03

逮丸朗,愛逮丸

每次到選舉季節,不論是何種選舉(包括現在還在選的「內部事務」),常聽到政客說的一句話是:
「我這麼多年吃台灣米、喝台灣水,我當然是逮丸朗、愛逮丸。」
其實,我們不仿考究一下「漢奸」這個詞,如果一個人來自外國,或是從來與本土無關,他會被罵成漢奸嗎?他應該夠不上格。所謂的漢奸,應該是:
「食漢家米、喝漢家水,而所言所行、所思所為均以外族利益為依歸的人。」
不是嗎?
不談漢奸這麼大的帽子,光看看歷來史冊,有幾位居廟堂者、食俸祿者,有真的想到己身所受供養來自民脂民膏?

因此,政客前述的這些說詞是沒有說服力的。「聽其所言,察其所行」,握有選票者也該有這份能耐才好。否則被賣了,也只能怪自己。

2016/01/25

第一本完全沒有程式碼的資料結構讀本:《秒懂資料結構》誕生

我對於國內資訊相關的書籍一直有兩點抱怨:

  1. 介紹工具的書總是充斥著一大堆畫面截圖,介紹理論性的書則是充斥著延綿多頁的程式碼。所謂「充斥」,有的佔了將近三分之一至一半的總篇幅。除了佔版面有灌水之嫌外,在內文中對它們的討論實在是不成比例。介紹工具的書暫且不說,介紹理論的書籍中對這些程式碼幾乎談都不談,只是印在那兒,要看的人自己去看。根據這幾年的經驗,只要接觸程式碼,同學大半哀鴻遍野,真的很好奇這些程式碼到底有多少人去讀一讀它?上課怎麼教?可是,篇幅決定書價啊?
  2. 喜歡附一片光碟。不管收錄的是第幾版,大部分書所附的軟體其實在出版當下便已屬舊版,必須另行到軟體相關網站下載,光碟完全無用。至於書中的程式碼或範例,何不放在網路上讓有需要者去下載就好呢?何必附上這麼一片增加製作成本、提高書價呢?許多電腦不安裝光碟機已漸成趨勢了,有再附光碟的必要嗎?

說歸說,過去一年,我很努力的寫了一本「完全沒有程式碼的資料結構讀本」,完全擺脫了前述惡習。書最近上市了。以下是這本書的基本資料:

書名:《秒懂資料結構》
作者:施保旭
出版:五南圖書出版有限公司
ISBN:978-957-11-8458-6
購買:博客來專頁

書的序言如下:

  對於以資訊為核心的理工系所而言,「資料結構」是核心課程,是許多專業課程的基礎;對於以資訊為應用或工具的整合性系所而言,「資料結構」則是將工具發揮至極致,甚至能拉出與其他競爭者差距的必修課程;在就業考試或國考中,只要和資訊沾上邊,即使沒有考科叫「資料結構」,只要考「計算機概論」或是「電腦概論」,資料結構實際便在其中扮演很重要的角色。
  以前念書時,教授很喜歡搞數學,到了期末課本只上了半本。為了升學,我搜集了一堆課本,從頭到尾努力的啃過,在這過程中,圖解(包括演算法的流程圖以及測試案例的分解動作圖)成了最大幫手,克服了近乎自學的困境。到了職場,歷經技術研發、產品開發、系統整合、專案管理,到今日以誤人子弟為業,逐漸體驗到唯有真正理解過的才能帶著走。教了多年的「資料結構」,每年換一本課本,總不合意。今年暑假,在聖嬰現象的溽暑中,終於下定決心自己寫一本,將多年來累積的筆記與教學講義加以文字化。市面上「資料結構」的產品已多如過江之鯽,為什麼還要再來寫一本?為了思考其存在價值,我決定這本書的特色是:

  • 不貪多、不求快:我們寧可將時間、篇幅花在核心議題的觀念介紹,以及用不同的角度以生活化的話題來做比擬,連繫生活經驗,目的是讓讀者能確切的掌握這些觀念,甚至在必要時,可以用他自己的語言重述這些觀念。
  • 不被任何程式語言所綁架:資料結構的多寡以及支援資料結構實作的強弱,本就是不同程式語言演化時的重點。因此,當一本書採用特定一種程式語言來介紹資料結構的主題時,其內容便被該語言所綁架,該語言未支援的無法討論,能討論的在其他語言又未必和書上所說的相同。用電腦程式來解釋資料結構,又往往將資料結構的問題,轉變成了程式設計的問題。即使在實務上,演算法的設計者與程式的寫作者往往是不同人。實務如此,學習時又何必要求學習者必須二項功力同時兼備?「設計」與「製作」的分開,往往是加速進步的一個關鍵。因此,我們捨棄用電腦語言來做例子的作法,而將重點放在觀念上。觀念掌握了,如何寫成程式是程式設計功力的問題,而程式設計的功力高低,不該成為學習資料結構的入門門檻。
  • 不限以資工/資科的專業生為想像讀者:太多書雖未明言,實際均以資工/資科背景的學習者為假想讀者,因此,對於其他在程式設計上受訓有限的人而言,讀起來便是一件苦差事。甚至,許多學習者修習一門課並不是因為他要以此作為進修或職場工作目標,而只是因為在整體課程設計中,它是核心課程,同學必須修習,否則在團隊合作中將與另一項專長的人無法溝通。此時,他們需要的是觀念的理解,而非程式寫作。在整合性的科系越來越多時,面臨此困境的學生也越來越多。事實上,這些年來,由於對客製化、介面調適化,以及功能延伸性的重視,越來越多的軟體提供了它自己的「描述語言」(Script Language),使用者可以使用這些語言把原來的軟體當作平台,而進行二次開發,許多二次開發人員均不是資工/資科背景。我們希望達到的境界是,資工/資科背景的讀者可以知其然亦知所以然,其他讀者則可以掌握資料結構的精神與設計技巧。總之,我們假設的讀者是,「學習上或是工作上,需要寫程式或是需要與寫程式的人共事者」。
  • 盡量延後術語的定義:任何一門發展已久的學問常常面臨的一個問題是「專業術語」相當的多。此現象的主要原因是早期有些觀念是在不同領域中發展,後來才逐步匯流,而各家的術語依然殘留,甚至有一義多詞的情形。基本上,對於術語的定義,我們將盡量推遲,需要用到時才加以定義,甚至直接以案例說明該術語的意涵,以免徒增困擾。
  • 仔細切割材料,縮小各章的規模,同時使其定位更加明確。有些較具技術性或數學推演的課題,則把它們放到習題中,然後於習題參考解答中去詳析它。這樣設計的目的很簡單:減少蔓藤效應。學習理論曾指出,一項學習的開始和結束前的一小段時間學習效果最好,我們的設計便是要製造最多的「開始」和「結束」,也避免因學習單元過長引起的學習焦慮感。
  這是一本學習、實證、與教學之後的反芻之作,希望能獲得期待中的效用,讓喜歡或不喜歡「資料結構」的學習者均能接受。期待各方的指正。

其他相關連結:

2016/01/21

說冷笑話的人真寂寞

  有時,人必須耐得住寂寞。
  你說了一個預言,知你者說它是寓言,不知你者說它是冷笑話。
  好一陣子前我說了昔日老闆告訴我的一個故事(在這邊),拿給一些人看,沒人看得懂,倒笑我年紀大了開始回想當年。
  是啦,當年年輕真好。
  但是對照一下這個故事,你不覺得很有時事fu嗎?
  儘管明眼人從一開始就認為他是來鬧場的,他卻以當年那一段「勇敢之舉」而一直說嘴至今,彷彿成了英雄。在他的一班子中,還確實公認是個英雄,有的還忿忿的怪當年教練丟毛巾是不智之舉呢。

  嗯,One more thing ...
  過完元旦假日,發現我家窗前的喜鵲開始營巢了。賢伉儷忙進忙出,這是目前的進度:

2016/01/18

年輕人懂個?

親戚有個小孩在中部念大學,元旦假期返鄉吃拜拜時遇到他,我隨口提了一句:「16號記得回來投票!」「當然是一定要回來投的!」
我再開玩笑的補了一句當時最紅的電視新聞內容:「不要被笑年輕人懂個屁!」
「我會讓他知道年輕人懂什麼!」,他說。

不知,那些不知年輕人懂個屁的人,現在知道了嗎?