我看過很多類似#程序員必讀XX本書#的書單,似乎在幾乎所有的推薦書單里面,《程序設計實踐》(英文名The Practice of Programming)都沒有出現作為一本被推薦的書。我也是在今年暑假突然想開始讀一些英文版的技術書籍,然后豆瓣上大致瀏覽了一下,機緣巧合的買下了這本書。
在技術博客,出版書籍充斥着各種雲計算、大數據等時髦名詞的今天,這本書從名字上就不是太引人注目,作為作者之一的Brian W. Kernighan這個名字似乎也很陌生,不過他還有一本書,就是被奉為C聖經的《The C Programming Language》,相信你一定聽過。而另一位作者Rob Pike,可能更加陌生,不過他設計了一門最近非常紅火的語言:Go。《The Practice of Programming》這本書確實頗為冷門,豆瓣上各個版本的評價數目加起來也不過400來人,分數倒是可以,9/10分的樣子。
在閱讀這本書之前一兩個月,我大概做過如下一件事:
- 在網易公開課上看了斯坦福的《編程范式》里面關於C語言的幾集。
- 看完了《The C Programming Language》,是中文版。
- 開始在HDOJ平台上做題,熟悉C語言,用C寫一些基本的算法。
從05年開始,我就一直對C/C++保持半生不熟的狀態,之后差不多兩年的工作,基本上也以使用SQL、Ruby和Java為主,雖然能拿來用解決一些問題,但是一直都沒有系統的學習過,總感覺不踏實,干脆,在語言的學習上,一切推倒重來,從C開始。
好像扯得比較遠了,不過也當做是我看這本書的背景吧;關於《程序設計實踐》這本書,首先,書很不算太厚,我所看的評注版也就300多頁,分為9個章節,像我一天看兩個小時,大概一個禮拜就能看完一章的樣子,當然,里面有些章節可能會圍繞一個程序來展開,這樣的話,自己把程序實現一下會更好。雖然書中代碼大部分都是由C來實現的,但是一般同時也會給出一個C++、Java甚至是Awk,tcl實現的版本,所以,可以說這本書不算是語言類的書籍,作者在用不同的語言實現同一個程序的時候,更多展示的是不同語言在設計思維上的差別、在編程范式上的差別以及在適用領域上的差別。
從章節上來講,以下更多是我個人的一些體會
第一章:Style,養成良好的編程習慣和編程風格比較重要,包括遵循一些約定成俗的代碼風格和程序設計風格。其一,這樣寫出的代碼更容易理解;其二,這在很大程度上降低了BUG出現的概率。這一章給我印象最為深刻的一段代碼是C的qsort函數經常用到的一個cmp函數的寫法。被注釋掉的return寫法非常常見,也很好用,但是在極端情況下卻有問題。
1 int cmp ( const void *a , const void *b ) 2 { 3 //return *(int *)a - *(int *)b;//會有溢出隱患 4 return *(int *)a > *(int *)b; 5 } 6 7 qsort(array,arrayLength,sizeof(array[0]),cmp);
第二章:Algorithms and Data Structures, 主要是一些常見的查找、排序算法和一些常見的數據結構,這一章內容不多,但是結構相當緊湊,很多代碼實現清晰明了,很接地氣,雖然由於書比較老,像使用Java的版本比較舊,但是一點都不影響閱讀。
第三章:Design and Implementation,整章圍繞一個馬爾科夫鏈的單詞后綴的程序展開,給出了C、C++(STL deque)、C++(STL list)、Java、Awk、Perl的設計和實現方式,讓人嘆為觀止,這一章應該是值得反復閱讀並且自己去動手實現完整代碼的。雖然以前在排隊論的課上也接觸過隨機過程里面的馬爾科夫鏈,但是當時的那些枯燥的公式讓我實在是沒啥收獲,而書中的程序給了馬爾科夫鏈一個非常通俗易懂而且優雅的解釋。
后面的幾個章節,包括接口的設計,在我們日常Coding中,也是頻繁接觸的;作者分別給Debugging和Testing各自一個章節,這兩個經常被我們在學習過程中忽略而在實際工作中又避免不了的東西,至少你應該明白Debugging是發現問題后去想方設法解決問題fix bug的過程,而Testing是系統化地去挖掘潛在問題(BUG)的過程;兩者是不可以混為一談的。最后的三章包括性能、可移植性和Notation(我在中文中找不到一個詞能准確描述這個詞,雖然有人翻譯成“記法”,但似乎不夠全面,這章更多是在講述論證要學會選擇在正確的領域選擇好正確的工具做正確的事),毫無疑問,也是非常不錯的。
總的來說,我認為這本書非常適合作為你#閱讀的第一本英語技術書籍#,學過了基礎算法和數據結構的學生,可以把這本書作為一本進階書籍,然后開始嘗試動手將你所學習到的東西運用起來。而剛剛步入工作的同志們也應該好好讀一讀這本書,在職業素養上做好身份的轉型。工作兩三年的同志們也可以讀一讀,見賢思齊。
