原文地址:http://gossipcoder.com/?p=739 作者:陳鋼
摸著鍵盤寫這篇東西的直接動力是給程傑剛剛出版的大作《大話資料結構》寫個書評,外加利用我這微乎其微的影響力做做廣告——怎麼說程傑同學也送了我一本親筆簽名的繁體版《大話資料結構》。不過,今天早上看到了劉未鵬的新文章,“知其所以然(三):為什麼演算法這麼難?”,我覺得光寫書評不太爽,寫點我學演算法的失敗經曆吧,順帶說說程傑同學的這本新書。
說實話,本文的標題是個偽命題。演算法是否好學,或者說是否容易學,完全取決於你的學習目標,是要應付下個月的考試,還是準備考個研究生,或者是想搞定二三流公司的筆試,還是想去微軟當科學家——當然,不排除有人的目標是圖靈獎。不動腦子都能知道,只是應付考試的學習應該是難度最低的,真正在複雜的商務程序中合理的設計和應用高效的演算法的難度無疑要高出一截,至於圖靈獎——我也不知道,那玩意太遙遠。
目標的不同導致了所需的學習資料是完全不同的,《大話資料結構》的封底是這樣描述它的目標讀者的:
《大話資料結構》適合學過一門程式設計語言的如下讀者:
在讀的大中專電腦專業學生;
想轉行做開發的非科班人員;
想考電腦專業研究生的應屆或在職人員;
工作後想重溫資料結構和演算法的程式員;
顯然,從目標讀者就能看出,這本書不是給“高手”看的。我曾經扮演過其中的一種角色,“想考電腦專業研究生的應屆或在職人員”,不過我那時候讀的是一本經典的教材,嚴蔚敏老師的《資料結構》(其實在《大話》前言中也提及了這本書)。因為所學的專業跟電腦搭界不多,所以在考研前所有的電腦知識來自於三門包羅永珍卻連點到即止就算不上的課程:電腦導論、電腦軟體設計、電腦硬體設計。當時的學習方法就是劉未鵬說的“背”,不管演算法和各種資料結構的來龍去脈,也無論能否理解,一律背下來。反正當時的目標就是考研究生。
但我也發現,本為考研究生而短期惡補的知識,應付一般的企業筆試和面試也勉強夠了。考研複習其實挺枯燥的,每天重複幾乎類似的生活。有天同學說,傳說中的華為來學校宣講。為了調劑一下生活,捏著一頁紙的簡曆就跑去應聘軟體開發職位。一輪筆試,幾輪面試下來,憑著我兩個月惡補的那點資料結構知識,我竟然全部通過了。體驗完簽約儀式——注意,只是體驗了一下,然後回到教室繼續備考。
最後,考研的專業課也得了個還不錯的成績。從這方面看,演算法、資料結構之類的東西學起來似乎並不難,短時間抱著死板的教材就能應付考試,應付企業的筆試面試。如果能讀讀《大話》這樣通俗易懂的讀物,達到這樣的目的應該是更加容易。我當時真正的水平怎麼樣?啥都不會,動態規劃都寫不完整,分治法之類的東西就更不懂了。NP-complete理論?沒聽說過。光是背了幾篇經典小說的人,看過小說背景介紹的人是寫不出什麼好東西的。必須要瞭解別人作品的前前後後方方面面,自己不停地寫,不停地想,才有可能真的寫出好東西。演算法也是如此,弄清楚每個資料結構、演算法的每個細節的緣由,才能設計出自己的好演算法。但市面上能像劉未鵬的“知其所以然(三):為什麼演算法這麼難?”這樣解析演算法的書是沒有的。即使是劉未鵬寫了幾篇,要等他攢出一本完整的書,也需要漫長的等待。而且全書每個演算法的解析是否都能到這個水平也是個疑問。
程傑兄的《大話》不可能解決這種問題,也沒有填補這個空白的企圖。應付考試,參加筆試面試,方便看懂開發文檔——這才是《大話》能辦到,而且辦得不錯的事情。很難想象如何在公交車上學習嚴蔚敏老師的《資料結構》或是餓啃《演算法導論》,但我今天確實在回家的公交車上讀完了兩章《大話》。
但如果搞電腦的人都停留在《大話》所要達到的水平,那無疑是一種悲哀。我學演算法的經曆之所以失敗,正是因為如此。為了考試而啃完嚴蔚敏老師的《資料結構》和一兩本考試參考書之後,我再也沒有讀完一本演算法的書,也沒有自己寫過稍有難度的演算法。所以,水平也就一直停留在看看文檔,調調函數的水平上。
希望有人能以《大話》為起點,而不是以讀完此書為終點;也期望程傑兄能創作出更高水平的佳作。
陳鋼同學是我的朋友,在我寫作時給予了我很多協助。此評論寫得相當客觀,並沒有誇大地說好話,而是強調了《大話資料結構》僅僅只是資料結構與演算法學習的起步而已。我轉帖出來,也是希望讀者可以瞭解,演算法要學好,可真不是幾日之功。我們都需要不斷努力!