讀程式碼可能有兩種原因,一是對這個東西某處不滿意想改,二是想學習其中的設計實現思路,前者動力更直接一些,如 @陸亦斌 所說,後者則不好選,因為純粹泛泛地看跟你實際環境關係不大的程式碼,其實不太容易學到東西。而且現代軟體設計其實也充滿了許多妥協和折衷,大家最常用的軟體,往往不是程式碼最乾淨的,而是做了許多妥協折衷的。比如最明顯的有 Linux Kernel,有很多風格不一致的程式碼 (但這並不減弱它的學習價值);mplayer 的程式碼是我見過的最醜陋但又非常實用的,在這樣的程式碼基礎上為啥能夠活躍發展到今天,也很值得研究;vim 程式碼打滿了各種 #ifdef,你看了也會很驚訝為啥一個人能維護如此錯綜複雜的程式碼這麼多年。我們有句老話,叫做水至清則無魚,軟體設計其實很多時候是在受限的條件下解決問題的本事。Beautiful Code [1] 介紹了很多精彩的程式碼,Beautiful Architecture [2] 介紹了很多值得學習的架構。下面還可以補充一些:
git
FreeType
fontconfig
cairo
DTrace
WebKit
Mac OS X 的 launchd
從擴充套件思路的角度來說,一個程式設計師應該好好讀過這樣一些程式碼:
一個作業系統核心
一個編譯器
一個直譯器
一個數據庫
一個 Web 伺服器
一個 Web 瀏覽器
一個編輯器
因為這些都是幾十年來被頻繁地反覆實現的程式碼,無數天才的程式設計師在這些領域發揮智慧,所以在它們各自領域“state of the art”的程式碼,可想而知質量是很高的。
[1] http://oreilly.com/catalog/9780596510046
[2] http://oreilly.com/catalog/9780596517984
讀程式碼可能有兩種原因,一是對這個東西某處不滿意想改,二是想學習其中的設計實現思路,前者動力更直接一些,如 @陸亦斌 所說,後者則不好選,因為純粹泛泛地看跟你實際環境關係不大的程式碼,其實不太容易學到東西。而且現代軟體設計其實也充滿了許多妥協和折衷,大家最常用的軟體,往往不是程式碼最乾淨的,而是做了許多妥協折衷的。比如最明顯的有 Linux Kernel,有很多風格不一致的程式碼 (但這並不減弱它的學習價值);mplayer 的程式碼是我見過的最醜陋但又非常實用的,在這樣的程式碼基礎上為啥能夠活躍發展到今天,也很值得研究;vim 程式碼打滿了各種 #ifdef,你看了也會很驚訝為啥一個人能維護如此錯綜複雜的程式碼這麼多年。我們有句老話,叫做水至清則無魚,軟體設計其實很多時候是在受限的條件下解決問題的本事。Beautiful Code [1] 介紹了很多精彩的程式碼,Beautiful Architecture [2] 介紹了很多值得學習的架構。下面還可以補充一些:
git
FreeType
fontconfig
cairo
DTrace
WebKit
Mac OS X 的 launchd
從擴充套件思路的角度來說,一個程式設計師應該好好讀過這樣一些程式碼:
一個作業系統核心
一個編譯器
一個直譯器
一個數據庫
一個 Web 伺服器
一個 Web 瀏覽器
一個編輯器
因為這些都是幾十年來被頻繁地反覆實現的程式碼,無數天才的程式設計師在這些領域發揮智慧,所以在它們各自領域“state of the art”的程式碼,可想而知質量是很高的。
[1] http://oreilly.com/catalog/9780596510046
[2] http://oreilly.com/catalog/9780596517984