馬克·吐溫曾經(jīng)說(shuō)過(guò),所謂經(jīng)典小說(shuō),就是指很多人希望讀過(guò),但很少人真正花時(shí)間去讀的小說(shuō)。這種說(shuō)法同樣適用于“經(jīng)典”的計(jì)算機(jī)書(shū)籍。
在 Stack Overflow (以及其它很多軟件論壇)上,諸如”程序員最應(yīng)該讀的計(jì)算機(jī)書(shū)籍有哪些?“這樣的問(wèn)題會(huì)周期性的出現(xiàn)。這樣的問(wèn)題不斷的被提出、被回答,只是形式不同罷了。相同的幾本書(shū)總是會(huì)出現(xiàn)在清單的前幾名內(nèi),所以,如果想知道人們談?wù)摰亩际切┦裁?,你有必要去讀一讀這些書(shū)的。
大多數(shù)程序員真正讀過(guò)的計(jì)算機(jī)書(shū)籍
- 代碼大全(Code Complete)——兩屆 Software Jolt Award 震撼大獎(jiǎng)得主!
- 程序員修煉之道(The Pragmatic Programmer)
- C程序設(shè)計(jì)語(yǔ)言( C Programming Language)(第 2 版)
- 重構(gòu):改善既有代碼的設(shè)計(jì)(Refactoring: Improving the Design of Existing Code)
- 人月神話(huà)(The Mythical Man-Month)
- 編碼——隱匿在計(jì)算機(jī)軟硬件背后的語(yǔ)言(Code: The Hidden Language of Computer Hardware and Software)
- Head First 設(shè)計(jì)模式(Head First Design Patterns)
- 編程珠璣(Programming Pearls)
- Effective Java 中文版(Effective Java (2nd Edition))or Effective C++(第三版)中文版
- Test Driven Development: By Example
上面的這些書(shū)我自己都讀過(guò),所以我不難相信很多不是很優(yōu)秀的程序員也都讀過(guò)它們。如果你對(duì)編程有足夠的興趣,能夠來(lái)到這里讀這篇博客,你很可能讀過(guò)其中的大部分,甚至還有很多不在這個(gè)清單中的,所以我就不浪費(fèi)時(shí)間每本書(shū)都評(píng)論一番了。我想說(shuō)的是,這個(gè)清單上的每本書(shū)都是它各自領(lǐng)域里的奇書(shū)。所以,很多有愿望不斷提高自己的編程技術(shù)的程序員都讀過(guò)這些書(shū),這就不足為怪了。
在人們備受推崇的計(jì)算機(jī)書(shū)籍中,還有一類(lèi)書(shū)受到了獨(dú)特的待遇。我稱(chēng)下面這個(gè)清單為“最常被程序員們謊稱(chēng)讀過(guò)的計(jì)算機(jī)書(shū)籍”。這并不是說(shuō)推薦這些書(shū)的人都沒(méi)有真正讀過(guò)它們。我只是有相當(dāng)?shù)男判膽岩筛嗟娜酥皇窃诳陬^上宣稱(chēng)讀過(guò)下列書(shū)籍,而實(shí)際上很少人真正讀過(guò)它們。下面就是這個(gè)清單。
最常被程序員們謊稱(chēng)讀過(guò)的計(jì)算機(jī)書(shū)籍
- 算法導(dǎo)論(Introduction to Algorithms)(CLRS) 這本書(shū)的名稱(chēng)是所有出版過(guò)的計(jì)算機(jī)書(shū)籍中最讓人誤解一個(gè)。它被廣泛的使用在很多大學(xué)里,通常被當(dāng)作畢業(yè)生必需的算法課程。于是,只要在大學(xué)里上過(guò)計(jì)算機(jī)課程的學(xué)生幾乎都有一本這樣的書(shū)。然而,除非你擁有計(jì)算機(jī)碩士學(xué)位(而且是算法研究領(lǐng)域的),我懷疑你頂多只讀過(guò)算法導(dǎo)論(Introduction to Algorithms)里節(jié)選的幾章內(nèi)容。這個(gè)書(shū)名讓人誤解,是因?yàn)?#8221;Introduction”這個(gè)詞讓人以為它很適合初級(jí)程序員。實(shí)際上不是。這本書(shū)對(duì)算法做盡可能詳盡綜合的介紹,就像其它一些隨處可見(jiàn)的類(lèi)似的書(shū)一樣。請(qǐng)不要再把這本書(shū)推薦給初學(xué)者。
- 編譯原理(Compilers: Principles, Techniques, and Tools)(the Dragon Book). 這本恐龍封面的書(shū)涵蓋了開(kāi)發(fā)一個(gè)編譯器你所需要的全部的知識(shí)。它的內(nèi)容包括詞匯分析,語(yǔ)法分析,類(lèi)型檢查,代碼優(yōu)化,以及其它很多高深的題目。請(qǐng)不要把這本書(shū)推薦給初級(jí)程序員,他們需要的只是分析簡(jiǎn)單的包含數(shù)學(xué)公式或 HTML 的字符串。除非你真的需要實(shí)現(xiàn)一個(gè)能夠?qū)嵱玫木幾g器(或解釋器),你根本不需要掌握這本“恐龍”書(shū)的全部強(qiáng)大威力。把它推薦給一個(gè)遇到簡(jiǎn)單文本分析問(wèn)題的人,這證明你根本沒(méi)有讀過(guò)它。
- 計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)(The Art of Computer Programming)(TAOCP) 我經(jīng)常聽(tīng)到人們把這本書(shū)描述為“每個(gè)程序員必讀”的系列計(jì)算機(jī)書(shū)籍。我認(rèn)為這明顯不是實(shí)情。在我說(shuō)出這樣大不敬的話(huà)、被你們用板磚拍死之前,請(qǐng)讓我做解釋一下。這不是一本讓你一頁(yè)一頁(yè)翻著讀的書(shū)。這是一本參考大全書(shū)。把它放在你的書(shū)架上看起來(lái)會(huì)很不錯(cuò)(實(shí)際上也它確實(shí)很好),但如果想把它通讀一遍,你需要幾年時(shí)間,而且最后什么都沒(méi)記住。這并不是說(shuō)手邊放這樣一本書(shū)沒(méi)有什么價(jià)值。它是一本參考書(shū),當(dāng)我遇到難題,走投無(wú)路時(shí),很多次我都在這本書(shū)里找到辦法。但這本書(shū)終究是被我當(dāng)作參考書(shū)。它復(fù)雜難懂,很理論,里面的例子都是匯編語(yǔ)言的。好的一面是,如果你想在這本書(shū)里尋找針對(duì)某一問(wèn)題的解決方案,如果你找不到,那就說(shuō)明這個(gè)問(wèn)題無(wú)解。它是一本對(duì)它所涉及到的領(lǐng)域做了最最詳盡介紹的一本書(shū)。
- Design Patterns: Elements of Reusable Object-Oriented Software (Gang of Four) 這本書(shū)是唯一一本在這個(gè)清單里我從頭到尾讀過(guò)的書(shū),讀的結(jié)果是,我不知道該把這本書(shū)歸到哪個(gè)類(lèi)別。它出現(xiàn)在這個(gè)清單里,并不是因?yàn)槲艺J(rèn)為只有很少人真正讀過(guò)它。很多人都讀過(guò)。只是因?yàn)橛懈嗤扑]過(guò)這本書(shū)的人自己卻沒(méi)有讀過(guò)。Design Patterns 這邊書(shū)的問(wèn)題在于,很多書(shū)里給出的信息,你在其它很多地方都能看到。這樣就使得一個(gè)初學(xué)者在維基百科上讀了幾篇關(guān)于設(shè)計(jì)模式的內(nèi)容后,就敢在面試中宣稱(chēng)自己看過(guò)這本書(shū)。這就是為什么 Singleton 成了一種新的全局變量的原因。如果有更多的人花時(shí)間讀過(guò)這本也叫做 Gang of Four 的書(shū)的原著,那世界上就不會(huì)有這么多人會(huì)把 17 種設(shè)計(jì)模式硬塞到一個(gè)日志(logging)框架里了。這本書(shū)最精彩的部分是每章里描述如何正確的使用一種模式的段落。遺憾的是,這些精華卻在很多其它設(shè)計(jì)模式資料里被漏掉了。
- C++程序設(shè)計(jì)語(yǔ)言(The C++ Programming Language) 這本書(shū)不像一本編程教材,更像一本編程語(yǔ)言參考。有很多的跡象表明有人確實(shí)讀過(guò)這本書(shū),否則我們不可能有這么多的C++ 編譯器可選擇。編程初學(xué)者(或者甚至其它語(yǔ)言的專(zhuān)家),如果想學(xué)C++,不應(yīng)該直接去啃 C++ 程序設(shè)計(jì)語(yǔ)言(The C++ Programming Language)這本書(shū)。告訴他們?nèi)プx《C++ Primer 中文版》。
正如我之前說(shuō)的,我知道你們當(dāng)中會(huì)有一些人真正的讀過(guò)這些書(shū)。那這篇文章不是針對(duì)你的,針對(duì)的是那些企圖通過(guò)假裝讀過(guò)這些書(shū)來(lái)表現(xiàn)自己的民眾。 如果你自己沒(méi)有讀過(guò)這些計(jì)算機(jī)書(shū)籍,請(qǐng)不要推薦給別人。這樣做會(huì)耽誤別人的時(shí)間,誤人子弟,因?yàn)橐恍╅啔v更豐富的人可能會(huì)有更好的書(shū)(更針對(duì)某一領(lǐng)域,更容易理解,跟某種編程語(yǔ)言或某種編程水平更契合的書(shū))來(lái)推薦。除此之外,你也能避免被那些真正讀過(guò)計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)(The Art of Computer Programming)的人用 MMIX 知識(shí)給拷問(wèn)住造成的尷尬(如果你不知道我在說(shuō)什么,那我指的就是你)。