《算法導論》爲什麼經典

長期以來,我對於是否要在博客上寫非技術類的東西取決不下。同是從0開頭學習技術,一定會遇到許多相似的問題,我把它們記下來,還會給人以幫助。但是非技術類的東西,寫了也是給自己看的,在沒有從“對小我的思考”轉變爲“對大我的思考”之前(看了劉未鵬的博客後的感觸),我不需要別人的理解和同情。再者,即使面對面交流,也不能保證使一個人完全理解另一個人,更何況活的思考變成死的文字。然而今天,我只是想把憋在心裏的話寫出來。人的層次並不相同,譬如許多計算機專業的學生在進入大學之前已能熟練編程,而我其時還連光驅和光盤都弄不清楚。我只是也想在這裏說說自己一直放在心裏沒有說的話,來我博客的朋友請略過這一篇。

事情源於一次對比。最近學習網絡流算法,啃了國內一本知名的算法教材好幾天,通過不斷重複倒是熟記了很多基本概念,但是記住的概念越多,心裏的問號越多。對於算法學習來說,死記硬背算法是很低效的。我於是翻開《算法導論》,交叉學習。看了《算法導論》幾頁,發現兩本書講解方式上有非常大的不同,簡單對比如下:《算法導論》中,第26章講網絡流算法,總共用了35頁(翻譯過來的中文版),使用了10組演示圖片,總共使用了64行僞代碼;國內的那本知名教材,講解同樣內容的網絡流算法,用了40頁,4張圖片,沒有一張圖片是用來演示算法執行流程的,最讓我喫驚的是,在40頁的算法講解中,C++代碼超過了20頁!

64行僞代碼和超過20頁的C++代碼,這巨大的反差,使我對國內那本教材非常失望和惋惜。這讓我想到霍金引用過的一句話,大意是書中每一條物理公式會使讀者的數量減少一半,同樣,對於講解算法的書,代碼的行數是與書的可讀性成反比的。代碼是非常有個人特色的,看到與自己風格不同的代碼,不自覺就會產生一種排斥的心理。更不用說我們國內教材中的代碼:風格混亂,字體難看,紙張低劣,印刷錯誤。最讓我痛苦的是,完整的代碼被切割得很碎,配合着講解算法的需要,這裏撒一小塊,那裏撒一小塊,我經常爲了一個莫名其妙的變量和函數調用到處在前面的書頁中找它的意義,或者根據上下文去猜它的意義。代碼中不可避免地要用到如棧、隊列、鏈表等這些基本數據結構,爲了能集中精力講算法,這些數據結構的實現代碼是不應該貼上來的,所以只好杜撰一些名稱,用慣了STL,我對這些不遵守STL中的約定的代碼非常反感。一邊看書我一邊提醒自己,知道這些代碼表示什麼意思就行了,沒必要對這些代碼這麼認真。我想,作者的初衷是爲了實用,我仔細讀了些代碼,感覺作者對算法的實現是非常精簡的,代碼的細節也處理的很好,但是很可惜,代碼中有太多的細節了,一門生僻的僞代碼又會加重讀者的負擔,兩難的選擇。

如果說這本教材讓我感到惋惜,那麼其它的教材,書店裏鋪天蓋地的基礎教程、入門教程,就讓人憤怒了。儘管電子工業出版社和機械工業出版社不斷推出讓人一看就想買下來的書,這卻對教材沒有產生任何的影響。回想我大學時候的教材,C、C++、數據結構、算法,其中充斥着大量風格糟糕的代碼:沒有縮進,沒有註釋、變量名一律abcd或者漢語拼音。我當時痛苦地寫着這樣的代碼,在我上C++課時看到老師在黑板上寫下int anIntVar;這樣的語句時,我爲這個變量名興奮了好久。隨着寫的代碼多了起來,與非教材類的經典技術書籍的接觸多了起來,我對大學的教材和課堂的失望和反感也與日俱增。大學裏那些理論性強的專業課的教材,很多地方明明幾句話就可以點透的東西,卻囉哩囉嗦晦澀難懂的講上一大堆,在需要仔細講解的時候,卻往往又一句話帶過,似乎唯恐不能炫耀其高超的水平。那些艱澀的文字,讀完很多遍才發現也不過就是那麼回事,真讓人覺得,採用這種方式講解的目的,就是因爲對真正的難題束手無策,才專門在這些小問題上大做文章。既沒有數學的簡潔直接,又不通俗,一句話:入的貌似很深,出的絕對不淺。

這些爛教材和爛書導致了一個更嚴重的後果:真正好的教材被忽視了。而今,一提起“教材”這個詞語,我們的印象就是一堆內容陳腐、講解死板、形式僵化、專門用來應付考試的垃圾紙。這使得那些教材中十分珍貴的精華被一起當成了垃圾,考完試就隨手拋掉。這對任何一方,都是巨大的浪費。

事實上,大學的專業課教材有些並不比那些經典著作省錢。爲什麼我們在課堂上就只能看到那些紙張低劣的教材,既然自己沒有好的,爲什麼不“拿來”更好的?

上面這些只是我的牢騷,我剛上大學時對計算機是個白癡,經常被一大堆名詞弄的暈頭轉向,上很多課,我看不到這和計算機有什麼聯繫,老師也從不講開的這些課都有什麼用,所以經常逃課,等到知道逃的課很有用的時候,那門課已經考完試了,所以積累了不少牢騷。但我也在網上看到很多的對我極有啓發的博客,看到很多文筆非常優秀的技術作家,牢騷歸牢騷,我還是充滿了希望的。只是感覺,需要時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章