算法導(dǎo)論(Introduction to Algorithms)(CLRS)這本書的名稱是所有出版過的計(jì)算機(jī)書籍中最讓人誤解一個(gè)。它被廣泛的使用在很多大學(xué)里,通常被當(dāng)作畢業(yè)生必需的算法課程。于是,只要在大學(xué)里上過計(jì)算機(jī)課程的學(xué)生幾乎都有一本這樣的書。然而,除非你擁有計(jì)算機(jī)碩士學(xué)位(而且是算法研究領(lǐng)域的),我懷疑你頂多只讀過算法導(dǎo)論(Introduction to Algorithms)里節(jié)選的幾章內(nèi)容。這個(gè)書名讓人誤解,是因?yàn)椤盜ntroduction”這個(gè)詞讓人以為它很適合初級程序員。實(shí)際上不是。這本書對算法做盡可能詳盡綜合的介紹,就像其它一些隨處可見的類似的書一樣。請不要再把這本書推薦給初學(xué)者。
編譯原理(Compilers: Principles, Techniques, and Tools)(the Dragon Book).這本恐龍封面的書涵蓋了開發(fā)一個(gè)編譯器你所需要的全部的知識。它的內(nèi)容包括詞匯分析,語法分析,類型檢查,代碼優(yōu)化,以及其它很多高深的題目。請不要把這本書推薦給初級程序員,他們需要的只是分析簡單的包含數(shù)學(xué)公式或 HTML 的字符串。除非你真的需要實(shí)現(xiàn)一個(gè)能夠?qū)嵱玫木幾g器(或解釋器),你根本不需要掌握這本“恐龍”書的全部強(qiáng)大威力。把它推薦給一個(gè)遇到簡單文本分析問題的人,這證明你根本沒有讀過它。
計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)(The Art of Computer Programming)(TAOCP)我經(jīng)常聽到人們把這本書描述為“每個(gè)程序員必讀”的系列計(jì)算機(jī)書籍。我認(rèn)為這明顯不是實(shí)情。在我說出這樣大不敬的話、被你們用板磚拍死之前,請讓我做解釋一下。這不是一本讓你一頁一頁翻著讀的書。這是一本參考大全書。把它放在你的書架上看起來會很不錯(實(shí)際上也它確實(shí)很好),但如果想把它通讀一遍,你需要幾年時(shí)間,而且最后什么都沒記住。這并不是說手邊放這樣一本書沒有什么價(jià)值。它是一本參考書,當(dāng)我遇到難題,走投無路時(shí),很多次我都在這本書里找到辦法。但這本書終究是被我當(dāng)作參考書。它復(fù)雜難懂,很理論,里面的例子都是匯編語言的。好的一面是,如果你想在這本書里尋找針對某一問題的解決方案,如果你找不到,那就說明這個(gè)問題無解。它是一本對它所涉及到的領(lǐng)域做了最最詳盡介紹的一本書。
Design Patterns: Elements of Reusable Object-Oriented Software (Gang of Four)這本書是唯一一本在這個(gè)清單里我從頭到尾讀過的書,讀的結(jié)果是,我不知道該把這本書歸到哪個(gè)類別。它出現(xiàn)在這個(gè)清單里,并不是因?yàn)槲艺J(rèn)為只有很少人真正讀過它。很多人都讀過。只是因?yàn)橛懈嗤扑]過這本書的人自己卻沒有讀過。Design Patterns 這邊書的問題在于,很多書里給出的信息,你在其它很多地方都能看到。這樣就使得一個(gè)初學(xué)者在維基百科上讀了幾篇關(guān)于設(shè)計(jì)模式的內(nèi)容后,就敢在面試中宣稱自己看過這本書。這就是為什么 Singleton 成了一種新的全局變量的原因。如果有更多的人花時(shí)間讀過這本也叫做 Gang of Four 的書的原著,那世界上就不會有這么多人會把 17 種設(shè)計(jì)模式硬塞到一個(gè)日志(logging)框架里了。這本書最精彩的部分是每章里描述如何正確的使用一種模式的段落。遺憾的是,這些精華卻在很多其它設(shè)計(jì)模式資料里被漏掉了。
C++程序設(shè)計(jì)語言(The C++ Programming Language)這本書不像一本編程教材,更像一本編程語言參考。有很多的跡象表明有人確實(shí)讀過這本書,否則我們不可能有這么多的C++ 編譯器可選擇。編程初學(xué)者(或者甚至其它語言的專家),如果想學(xué)C++,不應(yīng)該直接去啃 C++ 程序設(shè)計(jì)語言(The C++ Programming Language)這本書。告訴他們?nèi)プx《C++ Primer 中文版》。
正如我之前說的,我知道你們當(dāng)中會有一些人真正的讀過這些書。那這篇文章不是針對你的,針對的是那些企圖通過假裝讀過這些書來表現(xiàn)自己的民眾。 如果你自己沒有讀過這些計(jì)算機(jī)書籍,請不要推薦給別人。這樣做會耽誤別人的時(shí)間,誤人子弟,因?yàn)橐恍╅啔v更豐富的人可能會有更好的書(更針對某一領(lǐng)域,更容易理解,跟某種編程語言或某種編程水平更契合的書)來推薦。除此之外,你也能避免被那些真正讀過計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)(The Art of Computer Programming)的人用 MMIX 知識給拷問住造成的尷尬(如果你不知道我在說什么,那我指的就是你)。