本人首發:http://www.infoq.com/cn/articles/each-programmer-must-have-programming-books-bookcase html
原文參考了Dan Luu的博客,經做者受權,由InfoQ編譯、整理並分享。git
一提到有關編程方面的書籍,你就會想起江湖中傳說的「每一個程序員必讀的12本計算機科學書籍」,然而,這份清單並無什麼實用性。由於,計算機科學領域很是寬泛,幾乎全部程序員均可以閱讀任何主題,就算某個主題很重要,但因爲讀者的學習偏好天懸地隔,所以對全部讀者而言,某個主題並不存在所謂「最好的」書籍。程序員
本文是我已經閱讀過的主題和書籍的清單。這些都是我很熟悉的主題,也許你能夠在此文中,瞭解關於該主題更多的狀況,並閱讀其餘相關書籍。換而言之,就是說你爲何須要閱讀另外一本書。面試
爲何要關心算法、數據結構和複雜性? 好吧,有一個實用的結論:在工做中,即便你歷來沒有用到這些東西,可是,大多數一流的支付公司在面試中會測試這些內容。我決不瞎扯,算法真的頗有用,就像我發現數學頗有用同樣。任何特定算法適用於任何特定問題的機率很低,但從整體上說明什麼類型的問題如何解決,什麼樣的問題難以處理,一般當近似有效時就有用了。算法
《Cracking the Coding Interview》
做者:McDowell
出版社:CareerCup; 6th edition (July 1, 2015)
中文版:《程序員面試金典》
譯者:李琳驍、漆犇
出版社:人民郵電出版社,第五版spring
《程序員面試金典》的做者McDowell,是原Google資深面試官的經驗之做,層層緊扣了程序員面試的每個環節,全面詳盡介紹了程序員應當如何應對面試才能脫穎而出。該書涉及到面試流程解析、面試官的幕後決策及可能提出的問題、面試前的準備工做、對面試結果的處理等內容,還涵蓋了數據結構、概念與算法、知識類問題和附加面試題四個方面,爲讀者提供了來自Google、Facebook、Microsoft等多家知名公司的編程面試題,併爲每一道面試題分別給出了詳細的解決方案。我會向那些並無真正掌握算法、但又想經過面試的程序員推薦這本書。這本書讀起來尚可,不過並不能真正教會你知識,若是想真正掌握算法和數據結構,那麼繼續往下看。數據庫
《Algorithms》
做者:Dasgupta、Papadimitriou、Vazirani
出版社:McGraw-Hill Education
中文版:《算法概論》
譯者: 王沛、唐揚斌、劉齊軍
出版社:清華大學出版社編程
《算法概論》是一本適合入門的讀物,但卻不失深度以及廣度,讀來讓人興趣盎然。我認爲,認真讀完這本書,而且思考每章後面的習題,會對算法有一個很好的大局觀。固然要掌握算法,只靠這一本書是不夠的,不過算做最佳入門是當之無愧的。該書全面介紹了算法的基本知識,將算法分紅類(例如分治法、,或貪婪算法),在表達每一種技術時,強調每一個算法背後的數學思想,讓你掌握如何判斷應該使用什麼樣的算法來解決特定的問題。性能優化
該書合理挑選主題,釐清了一條算法這門學問的線索,對結構的精心安排,對問題的數學結構的剖析,從而推出一個算法的過程的講解。長度適宜,僅有三百多頁,能夠利用幾個週末進行閱讀。網絡
不過,我知道有些讀者不會喜歡這本書,由於它包括了太多的數學思想。若是是你,我猜你可能喜歡Skiena著的那本書。
《The Algorithm Design Manual》
做者:Skiena
出版社:Springer; 2nd edition (July 26, 2008)
《The Algorithm Design Manual》要比Dasgupta所著的那本《Algorithms》更長,更全面,也更實用,並且涉及到的數學也更少。它差很少就是試圖教你如何識別問題並使用正確的算法來解決問題、以及給出一個清晰的算法解釋的那本書。該書內容豐富,各個主題幾乎無不涉及,從常見的各類數據結構到算法策略、可計算性。若是想當作教科書,該書每章結尾都有不少練習,值得推薦。這本書充滿了激情的「戰爭故事」,顯示了算法在現實世界編程的影響。
《Introduction to Algorithms》
做者:Cormen、Leiserson、Rivest、Stein(CLRS)
出版社:The MIT Press; 3rd edition (July 31, 2009)
中文版:《算法導論》
譯者:殷建平、徐雲、王剛、劉曉光、蘇明、鄒恆明、王宏志
出版社:機械工業出版社; 第1版 (2013年1月1日)
在江湖中流傳的各類版本「全部程序員必讀之書」的清單中,《算法導論》就佔據了半壁江山。這本書將嚴謹性和全面性融爲一體,深刻討論了各類算法。實際上,幾乎沒有讀者會讀完整本書。不過,全書各章自成體系,能夠做爲獨立的學習單元。它是全球讀者最多的算法聖經。該書的特色是選材經典、內容翔實、結構合理、邏輯清晰。每章前半部分介紹了講授和學習算法的有效方法,後半部分爲更專業的讀者和求知慾強的學生提供了更引人入勝的資料來討論這個迷人領域的各類可能性和挑戰,對本科生的數據結構課程和研究生的算法課程而言是很是棒的教科書。
好比說,有整整一章是關於Van Emde Boas樹,寫得很工整,這有點奇怪,像的平衡樹結構的插入、刪除、就像查找、繼承同樣好,也許之前的書籍可能如此,但它是第一個沒有包含Van Emde Boas樹的算法導論。
《Algorithm Design》
做者:Kleinberg、Tardos
出版社:PEARSON EDUCATION; 1 edition (2013)
《Algorithm Design》廣受好評,堪比CLRS所著《Introduction to Algorithms》,被推薦爲關於算法設計和分析的一本不可多得的優秀入門書。我發現,這本書與CLRS所著的書相比,該書將直觀性與嚴謹性完美結合起來。覆蓋面比較寬廣,凡屬串行算法的經典論題,都有所涉獵。
《Advanced Data Structures》
做者:Demaine
《Advanced Data Structures》是一套講稿和筆記,而非一本書。若是你想要一套條理清楚但不難綜合的數據結構的學習資料,在大多本科課程中,你不大可能看到,所以這套講課和筆記,功德無量。
這些筆記沒有出單行本的計劃,因此若是您還沒有看過這些資料,就必須觀看教學視頻。
《Purely Functional Data Structures》
做者:Okasaki
Cambridge University Press (June 13, 1999)
出版社: Cambridge University Press
《Purely Functional Data Structures》讀起來頗有趣,但不一樣於其餘算法和數據結構的讀物的是,我從這本書中,還沒能獲得真正解決實際問題的重要能力。
在我讀完這本書後過了幾年,有人告訴我,推理出純函數冗餘數據結構的性能並不難。我就向他們請教這本書中把我難倒的證實部分,我並非在討論那些晦澀難懂的超難習題,而是說這本書的主要內容,做者有太多過於明顯的解釋性的東西。可是並無人解釋。這種東西的推理比你們說的還要難。
《Higher Order Perl》
做者:Dominus
出版社: Morgan Kaufmann Publishers
中文版:《華章程序員書庫:高階Perl》
譯者:滕家海
出版社:機械工業出版社
《高階Perl》在Perl領域深刻探討了各類最新的主題,如遞歸、迭代器、過濾器、劃分、數值方法、高階函數、惰性求值等內容,並將這些轉換成現實變成工做中強有力的實用工具:HTML處理、數據庫訪問、網頁抓取、家庭理財等等。
該書恰當地介紹了使用Perl的函數式編程。經過這本書的學習,你可能像Python或Ruby那樣很容易進行工做。
不過,若是你跟得上潮流,你會發現這本書可能有點過期,由於講解的是2005年的Perl 5,而如今是2015年12月25日發行的Perl 6。不過,這本書提到的思想,目前已成主流。
《Algorithms》
做者:Levitin
出版社:Pearson; 3 edition (October 9, 2011)
「強化學習的其餘特色,包括:章節摘要,習題提示。這是一本詳細的解決方案手冊。」、「學生經過習題提示和章節摘要進一步支持學習。」其中一個廣告甚至印在書上。當我看到這兩個廣告後,就在亞馬遜下了訂單購買《Algorithms》。但在我拿到這本書後,我惟一的自學資源倒是在雅虎問答(Yahoo Answers)裏的一些帖子,在那裏你能找到提示或者解答。
最後,我拿起了Dasgupta的著做來取代了這本書,由於他的網站資源能夠無償使用。
《Probability and Computing: Randomized Algorithms and Probabilistic Analysis》
做者:Mitzenmacher、Upfal
出版社: Cambridge University Press (January 31, 2005)
我得到的算法知識可能比其餘任何算法書籍講述的都多。許多隨機算法移植到其餘應用程序雖然很瑣碎,但卻能夠簡化不少事情。
《Probability and Computing: Randomized Algorithms and Probabilistic Analysis》有關機率學的介紹部分很翔實,就算讀者不具有任何機率學的背景也能輕鬆入門。此外,的內容(例如,)對許多計算機科學理論的證實頗有用,這些在我所閱讀到的機率學介紹內容中都沒有提到。
《Introduction to the Theory of Computation》
做者:Sipser
出版社:Cengage Learning; 3 edition (June 27, 2012)
中文版:《計算理論導引》
譯者:段磊、唐常傑
出版社:機械工業出版社,初版
《計算理論導引》以獨特的視角,系統介紹了計算理論的三大板塊:自動機與語言、可計算性理論、計算複雜性理論。講述了寬泛的數學原理,沒有拘泥於某些低層次的細節。在證實以前,都有直觀的「證實思路」,幫助讀者理解數學形式下蘊涵的概念。不少重要的結果,如定理,都被做爲練習題。因此你真的須要作這些關鍵練習題。可是,大多數關鍵練習題沒有提供答案,所以你也沒法知道你解答是否正確。
若是想選擇更爲現代的主題,也許能夠閱讀Aurora和Barak的著做。
《Computation》
做者:Bernhardt
《Computation》這部教學影片涵蓋了一些計算機理論的重點部分。影片講解使人愉悅,爲了觀看Bernhardt講解的內容,這個影片我已經觀看不止一次了。該影片的受衆是那些沒有計算機科學背景的通常程序員。
《An Introduction to Computational Learning Theory》
做者:Kearns & Vazirani
出版社:The MIT Press (August 15, 1994)
《An Introduction to Computational Learning Theory》是一本很是經典的讀物。可是這本書已通過時(InfoQ注:該書1994年出版,距今已經22年了),並且漏洞百出,沒有勘誤。我最終從幾門課程拼湊了一些筆記,一個是Klivans的著做,另外一個是Blum的著做。
爲何要關心操做系統?由於,掌握一些關於操做系統的知識,可讓你節省幾天或一週的調試時間。 這是Julia Evans博客上常常提到的話題,我發現,就我我的經驗來講,確實如此。
那些創建可行的系統並瞭解一些操做系統知識的人,卻沒有發覺若是有操做系統知識的話會很節省時間,這點我很難想象。
但是,讀過操做系統書籍的人每每有偏見——正是作這方面的相關人士,若是你是骨灰級玩家,除非閱讀這些,你可能得不到一樣的結果。
《Operating System Concepts》
做者:Silberchatz、Galvin、Gagne
出版社:Wiley; 9 edition (December 17, 2012)
中文版:《操做系統概念》(第七版)(翻譯版)
譯者:鄭扣根
出版社:高等教育出版社; 第1版 (2010年1月1日)
好吧,這是Comet Book成爲標準以前,咱們在Wisconsin就用過的一本書。
《操做系統概念》涵蓋了高階概念並擊中要點,可是在技術層次的深度稍顯不足,沒有詳細闡述事情是如何工做的,也沒有清晰列出更高級的主題。
順便說一下,我據說了關於Comet書籍的好消息,可是我不敢妄言,畢竟我尚未閱讀過。
《xv6》
做者:Cox、Kasshoek、Morris
這本《xv6》真的太棒了!它解釋了你如何可以在真實系統上有效運做,你能夠設想本身實現一個可執行的操做系統。按照本書寫做的設計,做者傾向於簡單的實現而非優化的實現,所以,書中使用的算法、數據結構和日常的生產系統徹底不一樣。
這本書與介紹現代操做系統如何工做的書籍配合閱讀,好比Love著的《Linux Kernel Development》或者Russinovich著的《Windows Internals》,學習效果會更好。
《Linux Kernel Development》
做者:Love
出版社:Addison-Wesley Professional; 3 edition (July 2, 2010)
《Linux Kernel Development》的書名可能有誤導之嫌,這不是關於Linux內核開發的讀物,基本上是一本闡述Linux內核如何工做的書籍:事物是如何契合的,使用了什麼算法和數據結構等等。我閱讀的是第二版,如今已經徹底過期了。
第三版內容有所更新,可是也引進了一些錯誤和矛盾之處。並且,這一版本仍然過期,這本書2010年出版,講的是內核2.6.34。雖然如此,該書仍然不啻一本優秀的介紹現代操做系統原理的讀物。
該書還有一個缺點,在做者拿Linux和Windows進行比較時,有失客觀,基本上就是每次比較的時候,就宣揚Linux是明確無疑的正確選擇,Windows老是幹蠢事。整體來講,Linux和Windows我都喜歡,在有些領域,Windows作得更好。並且在有些地區,Windows已經領先不少年了。但在這本書中,你甭想看到相似這些評價。
《Windows Internals》
做者:Russinovich、Solomon、Ionescu
出版社:Microsoft Press; 6 edition (March 25, 2012)
中文版:《深刻解析Windows操做系統:第6版(上冊)》
譯者:潘愛民、範德成
出版社:出版社: 電子工業出版社; 第1版 (2014年4月1日)
《深刻解析Windows操做系統》是闡述現代操做系統如何工做最全面的一本書,只不過碰巧這本書是關於微軟Windows。做爲從*nix走過來的人,看到Windows和*nix不一樣的差別,這樣的閱讀很是有趣。
然而,該書並不是簡單的入門書,在閱讀本書以前你必須掌握一些操做系統知識。
若是想買這本書,你要等到2017年初發行的第七版。
《The Little Book of Semaphores》
做者:Downey
《The Little Book of Semaphores》是一本這樣的讀物:列出一個主題,一般從操做系統的教科書中抽取一兩個章節,而後拼湊成爲本身長達300頁的書。
這本書是一系列的習題,有點像小型提綱,但更多的是闡述。它首先解釋了什麼是信號量,而後給出構建高併發原語知識的一系列習題。
在我開始編寫併發線程代碼時,這本書提供了很大的幫助。我訂閱了Butler Lampson學院關於併發的資料,我喜歡把併發相關代碼塞到別人寫的黑盒。可是有時候你堅持本身寫黑盒的話,若是是這樣,這本書有很好的導論,要求思考方式纔可能寫出不是徹底錯誤的併發代碼。
我但願有朝一日,能有這樣的一本書問世:既照顧低水平的讀者,又兼顧高水平讀者,我很喜歡這樣的寫做設計。從幾個指令集原語不一樣的內存模型的體系結構(如x86和Alpha),而不是從信號量開始講起。若是今天我寫低劣的低級線程代碼,我會更喜歡用C++ 11的線程原語,因此我想用這些東西而非信號量。若是由我來寫線程代碼的話,我可能會用Win32 API來編寫。但到目前爲止,還不存在這樣的一本書。之後若是有這樣一本書問世,那將是最好不過的了。
我據說Doug Lee的Java併發編程很是不錯,但我只泛泛而讀沒有深刻研讀。
爲何要關心計算機體系架構?當你進行底層性能優化的時候,你所學到的具體事實和細節,將會很是有用。可是,真正的價值就是學習如何在性能和其餘因素進行權衡,不管是功耗、成本、體積、重量,亦或者其餘因素。
從理論上講,這種推理應該不分專業進行教授,但個人經驗是,那些學習計算機體系結構的人更可能會「得出」那種推理和粗略的計算:才能讓他們拋開一個沒有理由在性能上2倍或10倍(或100倍)的因素。聽上去很顯然,可是我想到大公司的多個生產系統放棄10到100倍的性能,而以一個標準來運行,甚至2倍的性能差別,都足以支付VP的薪水。全是由於人們沒有意識到他們的設計帶來的性能影響。
《Computer Architecture: A Quantitative Approach》
做者:Hennessy、Patterson
《Computer Architecture: A Quantitative Approach》教你如何用多約束(如性能、TCO(總開銷)、功率等)進行系統設計,以及如何推論權衡。它主要以微處理器和超級計算機爲例。
該書的新版增長了實質性的補充,這個版本纔是你真正想要的讀物。好比,新版增長了一個關於數據中心設計的章節,回答瞭如下問題:用於電力、功率分佈、製冷的運營開支OPEX/資本支出CAPEX,以及支持團隊和機器的支付費用,使用低功耗機器對tail larency的結果質量及影響(以必應搜索的結果爲例),在設計數據中心時應該考慮哪些其餘因素。
假設讀者具有一些背景,但背景已在附錄中提供,而且可免費在線獲取。
《Modern Processor Design》
做者:Shen、Lipasti
出版社:Waveland Press, Inc.; 1 edition (July 30, 2013)
《Modern Processor Design》展現了設計Pentium Pro(1995年)時代高性能微處理器所須要瞭解的大部份內容。由於這種處理器的複雜性,闡述清楚絕非易事。另外,還介紹了一些更爲先進的想法和從各類工做負荷能夠運行的平行計算的範圍(以及你可能會如何進行如此計算)。該書有一個很長的章節,是關於值預測,由於做者發明了這個概念,當初版發行的時候,還很熱門。
對於純CPU架構,這本可獲得的讀物大概是最好的。
《Readings in Computer Architecture》
做者:Hill、Jouppi、Sohi
出版社:Morgan Kaufmann; 1 edition (September 23, 1999)
由於歷史緣由而閱讀,看看咱們所理解的解釋有多好。好比,比較Amdal關於定律的論文(沒有公式,只有一幅並不是顯而易見的圖表的兩張紙),相對與現代教科書的表述(一個段落,一個公式,或者一幅圖表來闡明,雖然一般來講足夠清晰,不須要額外的圖表)。
糟糕的是,《Readings in Computer Architecture]》看上去讓你後退得更遠。由於計算機架構真的是很年輕的領域,這裏沒有什麼真正難以理解的東西。若是你想看到一個動人心魄的例子,例如咱們怎樣更好解釋這一些,像比較Maxwell在方程組的最初論文與現代對同一事物的解釋。若是你喜歡歷史的話,這本書頗有趣。可是若是你只是想學習的話,它勉爲其難。
爲何要關注這些知識(博弈算法理論、拍賣理論、機制設計)?由於這些知識介紹了世界上最大的科技公司在廣告收入的運做方式,而這些廣告是經過拍賣來銷售的。該領域介紹了它們運做的方法和理由。另外,當你嘗試弄明白如何設計有效分配資源的系統,這些知識就派上用場了。此外,若是你玩桌遊,拍賣理論解釋了爲何經過拍賣機制來固化博弈失衡是重要的,每每使遊戲更糟。
尤爲對設計公司內部激勵相容制度(粗略的說,就是如何建立能提供人們出於私心而追求最佳利益的全局最優結果的系統)的人員而言,這些書應爲必讀書籍。若是你曾在兩家大公司供職過,其中一家創建了有效的內部激勵相容制度,而另外一家沒有創建相應制度。你就會發現,沒有創建內部激勵相容制度的那家大公司燒了大把大把的錢,由於這些人創建了超級沒用的激勵系統。
這個領域展示了這麼一幅畫卷,讓你瞭解什麼樣的機制會帶來什麼樣的結果。經過閱讀案例研究,你會獲得一個耗資數百萬甚至數十億美圓的錯誤列表,洋洋灑灑,也頗有趣。
《Auction Theory》
做者:Krishna
出版社:Academic Press; 2 edition (August 26, 2009)
中文版:《拍賣理論》
譯者:羅德明、奚錫燦
出版社:中國人民大學出版社
上一次我閱讀《拍賣理論》的時候,它是當時惟一對拍賣理論進行全面且最近介紹的一本書。在第一章中,涵蓋了經典的第二價格拍賣的結論,而後涵蓋了風險規避、競標操縱、多個拍賣、非對稱信息和其餘現實世界的問題。該書涵蓋了拍賣的大部分理論,對深刻理解拍賣理論的主要脈絡很是必要。但這本書至關枯燥無趣,不大可能激起閱讀慾望。除非你對這個主題感興趣。須要瞭解基本的機率學和微積分學的知識。該書對致力拍賣研究的研究生是不可或缺的讀物。
《Snipers, Shills, and Sharks: eBay and Human Behavior》
做者:Steighlitz
出版社: Princeton University Press (April 1, 2007)
《Snipers, Shills, and Sharks: eBay and Human Behavior》看上去彷佛是專門爲外行介紹拍賣理論、帶有娛樂性質的書籍。該書解釋了eBuy的工做方式及理由,正如書名的副標題所言,做者還探討了人類在eBuy和其餘地方拍賣中的怪癖行爲。這本書妙不可言,無需讀者具有數學背景,可能包含了Krishna所著《Auction Theory》的少許內容,能讓讀者對拍賣理論產生興趣。
《Combinatorial Auctions》
做者:Crampton、Shoham、Steinberg
出版社: The MIT Press
《Combinatorial Auctions》所討論的是,是像美國通訊委員會(FCC)那次頻段拍賣,因爲拍賣機制設計中的「漏洞」引發數億甚至數十億美圓的價差被擺上檯面的案例(InfoQ注:有興趣的讀者能夠經過google檢索「美國拍賣600MHz頻段」來了解這個事件)。該書雖然是由不一樣做者共同撰寫的讀物,但讀起來仍然行雲流水一鼓作氣,讓我樂意閱讀。這本書在組合拍賣領域有着深度和廣度,於細微處見功夫,它還羅列了詳細的做者和主題索引,排版質量很是棒,以致於能夠跳過開頭提到的Krishna的著做進行閱讀,但我不會推薦它。這本書對於想了解組合拍賣的研究人員和從業者,都是必不可少的讀物。
《Multiagent Systems:Algorithmic,Game-Theoretic,and Logical Foundations》
做者:Shoham、Leyton-Brown
出版社:Cambridge University Press; 1 edition (December 15, 2008)
《Multiagent Systems:Algorithmic,Game-Theoretic,and Logical Foundations》最槽的就是書名了。然而,它是Multiagent System方面最值得閱讀的讀物之一。該書涵蓋了基本的博弈論、拍賣理論,以及在計算機科學中讀者可能不知道的其餘經典主題,囊括了不少新穎的前沿理論,還有計算機科學和這些主題的交集內容,好比博弈學習模型等,甚至還有邏輯學的內容(這也是Shoham最關注的方向,將博弈理論上升到哲學層次)。這本書很是有特點,前面幾章有不少例子,計算機科學學術味很濃。該書假定讀者對主題沒有特定的背景。
《Algorithmic Game Theory》
做者:Nisan、Roughgarden、Tardos、Vazirani
出版社:Cambridge University Press; 1 edition (September 24, 2007)
《Algorithmic Game Theory》包含了博弈算法理論的各類調查結果。要求讀者具備至關數量的背景(首先要閱讀過Shoham和Leyton-Brown的著做),例如第五章基本上是Devanur、Papadimitriou、Saberi和Vazirani的JACM論文:《Market Equilibrium via a Primal-Dual Algorithm for a Convex Program》(《經過用於Convex程序的原始對偶算法的市場均衡》),並引出一些相關問題,讓讀者有更上一層樓的動機。若是你深刻了這本書的話,會發現該書闡述很棒,並且頗有趣。但若是你想經過閱讀一本書來窺探一個領域的話,它未必是你想要的那種書。
《Site Reliability Engineering》
做者:Beyer、Jones、Petoff、Murphy
出版社:O'Reilly Media; 1 edition (April 16, 2016)
中文版:《SRE:Google運維解密》
譯者:孫宇聰
出版社:電子工業出版社; 第1版 (2016年10月1日)
《SRE:Google運維解密》可讓讀者學習到Google工程師在提升系統部署規模、改進可靠性和資源利用效率方面的指導思想與具體實踐——這些都是能夠當即直接應用的寶貴經驗。任何一個想要建立、擴展大規模集成系統的人都應該閱讀,該書針對如何構建一個可長期維護的系統提供了很是寶貴的實踐經驗。
要看更豐富的簡要說明,請閱讀這本22頁的該書的筆記。
《Refactoring》
做者:Fowler、Beck、Brant、Opdyke、Roberts
出版社:Addison-Wesley Professional; 1 edition (July 8, 1999)
中文版:《重構:改善既有代碼的設計》
譯者:熊節
出版社:人民郵電出版社; 第2版 (2015年8月1日)
那時候當我讀這本《重構:改善既有代碼的設計》時,因爲它在關於代碼異味的單獨章節所花的篇幅,使得這本書很是值這個價。該書很是成功,由於它使重構和代碼異味的觀念成爲主流。
Steve Yegge曾對這本書不吝讚譽之詞:
2003年10月,我第一次閱讀這本書,有一種不寒而粟的感受。若是你意識到,當你想離職時,你已經工做5年。轉天我就隨意問周圍:「嗯,你已經讀太重構方面的書,對吧?我只是隨便問問,由於我好久之前讀過,固然不是如今。」在我所調查的20我的中,只有一我的讀過。感謝上帝,全部的人都很尷尬,不僅是我。
……
若是你是資深工程師,你會發現該書中至少80%,都是你所熟知的東西。但該書羅列了全部的名稱,並客觀地討論這些技術的利弊,這一點頗有用。它戳穿了我剛成爲程序員時所珍藏的若干個「祕籍」的真相。不註釋代碼?局部變量是萬惡之源?這瘋子是狂人嗎?要不要閱讀這本書,取決於你本身!
《Peopleware》
做者:Demarco、Lister
出版社:Addison-Wesley Professional; 3 edition (June 28, 2013)
中文版:《人件(原書第3版)(珍藏版)》
譯者:肖然、張逸、滕雲
出版社:機械工業出版社; 第1版 (2014年9月1日)
在大學時我讀到這本《人件》,該書彷佛很使人信服,甚至全部的研究結果都支持該書的觀點:不設置截止日期就比設置截止日期要好;辦公室比隔間要好,等等。全部開發人員跟我討論的時候,基本都贊同這些觀點。
但實際上每家成功的公司都是以大相徑庭的方式運做的。甚至微軟公司也從我的辦公室轉爲開放式辦公室進行了建築改造。是否是這些觀點都無所謂?若是真的很重要的話,那些公司怎麼會成爲真正信徒,像Fog Creek公司不去踐踏競爭對手?
由於該書符合個人「偏見」,我就但願這本書是正確的。可是,薈萃分析(InfoQ注:Meta分析,指將多個研究結果整合在一塊兒的統計方法)的理念讓我用鑑定的眼光重讀來查證主要來源。
《Renegades of the Empire》
做者:Drummond
出版社:Crown; 1 edition (November 16, 1999)
《Renegades of the Empire》講述了DirectX歷程的故事。它還揭示了今天的微軟狼性文化是怎麼造成的。閱讀介紹:
微軟未必會僱傭像蓋茨的人(雖然企業園區有很多這樣的人),但會招聘那些有着更爲顯著的蓋茨特徵的人——傲慢、進取心和高智商。
……
由於嘲笑某人的想法是「愚蠢的」,或者更爲槽糕的是,「胡說八道」——蓋茨所以臭名昭著——只是爲了看他如何捍衛一個位置。這種敵對的管理技術貫穿一系列的命令,創造了一種衝突的文化。
……
微軟創建了達爾文的秩序,資源常常被掠奪,囤積力量、財富和威望。一名外出休假的經理回來時可能會發現他的部門被競爭對手襲擊,他的項目被勒令降級或者徹底取締。
在微軟面試:
「你喜歡微軟什麼呢?」
「比爾踢屁股。」St. John說,「我喜歡踢屁股。我喜歡那種扼殺競爭對手和支配市場的感受。」
結果St. John被僱傭了。多年來他沒有犯任何錯誤。這本書就講述了他的故事,以及像他那樣的員工的故事。若是你想在微軟公司謀差,你就須要讀這本書。我但願我加入以前就讀過這本書而不是以後!
爲何要關注數學?從純ROI(InfoQ注:Return On Investment,投資回報率)觀點來看,我懷疑,對於99%的工做,學習數學是值得的。據我所知,我用數學比大多數程序員要多,但我並無那麼常用數學。不過,有正確的數學背景可能會派上用場。我很享受學習數學的樂趣。
《Introduction to Probability》
做者:Bertsekas
出版社:Athena Scientific; 2nd edition (July 15, 2008)
中文版:《機率導論(第2版)》(修訂版)
譯者:鄭忠國、童行偉
出版社:人民郵電出版社; 第1版 (2016年1月1日)
《機率導論》是入門的大學課程,對 闡述定義比較嚴謹、直觀。對任何關心嚴密推導的讀者而言,該書後面有一些更爲詳細的習題。有不少可用解決方案的練習題,使得本書更適宜做爲自學用書。
《A First Course in Probability》
做者:Ross
出版社:Pearson Prentice Hall; 8th edition (January 7, 2009)
中文版:《華章教育·華章數學譯叢:機率論基礎教程(原書第9版) 》
譯者:童行偉、梁寶生
出版社:機械工業出版社; 第1版 (2014年1月1日)
爲了使學生購買《機率論基礎教程》,該書常常推出新版本,亞馬遜訂價更是高達174美圓,我曾跟做者請教過這個問題,他抱怨說,這幾年,二手書市場破壞了教科書的收入,而做者的版稅並很少,因此要有更多收入,就不得不保持每兩年推出新版的節奏來保證版稅收入。新做者要編寫前人著過的經典書籍,常常大發牢騷,由於最先的做者一般比後來的做者拿更多的版稅,即便他的後續版本並無什麼更新。
我在Wisconsin學習機率學的時候,該書是一本標準的教科書。我真的想不起有誰發現這本書有所幫助。
《Introductory Combinatorics》
做者:Brualdi
出版社:Pearson; 5 edition (January 7, 2009)
中文版:《組合數學(原書第5版) 》
譯者:馮速
出版社:機械工業出版社; 第1版 (2012年5月1日)
Brualdi是一名大教授,是我大學生涯最好的教授之一。可是他著的《組合數學》充滿了錯誤,並且也不特別清晰。自從我使用該書後,有兩個新版本,但從亞馬遜評論來看,這本書仍然有不少錯誤。
至於另外一本基礎入門型的教科書,我聽過關於Camina和Lewis合著的《An Introduction to Enumeration (Springer Undergraduate Mathematics Series)》好消息,但我本身沒有讀過。此外,Lovasz的《Combinatorial Problems and Exercises (AMS Chelsea Publishing)》是一本關於組合數學的名著,但它並未被廣爲人知。
《Calculus》
做者:Apostol
出版社:Wiley; 2nd edition (January 16, 1991)
《Calculus》第一卷涵蓋了你所指望的微積分I和微積分II的內容。第二卷涵蓋了線性代數和多元微積分。在多元微積分以前,講述線性代數,這樣使得多元微積分更易理解。
從編程角度來看,微積分學也是頗有意義的。由於我在微積分獲得的價值觀就是近似應用等等。教授這一連串的概念,很清晰。
若是你沒有教授或助教幫你的話,該書多是一本粗略的入門書。Spring SUMS系列叢書在各門功課上更易自學,但我並無讀過它們的微積分書籍,所以,我不敢妄下結論來推薦。
《Calculus》
做者:Stewart
出版社:Cengage Learning; 7 edition (2012)
中文版:《微積分(第六版)》(雙語教材)
譯者:張乃嶽
出版社:中國人民大學出版社; 第1版 (2014年10月1日)
《微積分》是那些做者經過可有可無的變動推出新版來賺錢的衆多書籍中的一本。這是Wisconsin大學Non-Honor學位的標準教科書。結果是,我教了不少人用Apostol的那本書所教授的方法來計算複雜的微積分,對許多人而言,更直觀一些。
該書採用的方式是,對於某種類型的問題,你應該將該模式匹配不少可能的公式,而後套用該公式。而Apostle更多的是教授你一些技巧和直覺,讓你足以應付各類各樣的問題。我不知道你爲何會買這本書,除非你須要一些類。
爲何要關注硬件基礎?人們常常宣稱,要成爲優秀程序員,你必須理解所用的每個抽象概念。這是無稽之談,由於現代計算過於複雜,以致於任何人都不可能真正徹底理解到底發生了什麼事情。事實上,現代計算之因此能高效完成它所作的工做,是由於它不須要程序員深刻了解底層的相關內容,大部分也低於你的水平。
話雖如此,若是你對底層軟件充滿好奇,這裏有一些適合你的入門書籍。
《nand2tetris》
做者:Nisan、Shocken
若是你只想讀一本單一內容的書,那麼非這本《nand2tetris》莫屬。它是一本關於邏輯門和布爾邏輯的「101級」入門書。正如書名所示,它帶你從與非門(NAND gate)到編一個可用的俄羅斯方塊遊戲。
《Fundamentals of Logic Design》
做者:Roth
出版社:CL Engineering; 5 edition (June 11, 2003)
《Fundamentals of Logic Design》在關於邏輯門和邏輯設計的細節上比《nand2tetris》還要多。該書有大量習題,彷佛是爲自學而著。注意,上面的連接是第五版,目前有更貴的新版本,但彷佛沒有什麼改進,並且新版也有不少錯誤,並且更昂貴。
《CMOS VLSI Design》
做者:Weste、Harris、Bannerjee
出版社:Pearson; 4 edition (March 11, 2010)
中文版:《CMOS超大規模集成電路設計(第4版) 》
譯者:周潤德
出版社:電子工業出版社; 第1版 (2012年7月1日)
邏輯門下一級的就是VLSI(very large scale integration),即超大規模集成電路。然而,在今天真的沒有任何意義。
《CMOS超大規模集成電路設計》比其餘書籍更有廣度和深度,而且闡述極爲清晰。在探索設計空間,好比,加法器的章節,不只僅說起了幾種不一樣的類型,並且也提供了問題和解決方案,很是適合自學。
《CMOS Digital Integrated Circuits》
做者:Kang、Leblebici
《CMOS Digital Integrated Circuits》是Wisconsin當前的教科書。但這本書很難跟上,助教基本上從新解釋了幾乎全部的必要項目和考試。我以爲它是參考書而不是用來學習的讀物。
與West等人相比,Weste 花費了更多的精力討論設計中的折衷,如,建立並行前綴樹加法器時,在設計空間的某個特定點,它意味着什麼?
《Semiconductor Device Fundamentals》
做者:Pierret
出版社:Addison Wesley; 2nd edition (April 12, 1996)
超大規模集成電路(VLSI)下一級,也就是晶體管,你將瞭解晶體管其實是如何工做的。
《Semiconductor Device Fundamentals》真正完美地解說了固態設備(SSD)。該書指出了你要真正理解諸如波段圖解的這些東西,須要知道什麼。而後用這些基礎原理和清晰的解釋,給你創建一個良好的思想模型,理解不一樣類型的交匯點和設備的工做原理。
《Solid State Electronic Devices》
做者:Streetman、Bannerjee
出版社:Prentice Hall; 6 edition (August 5, 2005)
《Solid State Electronic Devices》講述的內容,與Pierret的著做相同。但彷佛用了數學公式來取代了Pierrot的意會。
《Engineering Electromagnetics》
做者:Ida
出版社:Springer; 3rd ed. 2015 edition (March 26, 2015)
比晶體管低一級的,是電磁學。
《Engineering Electromagnetics》比其餘的入門教科書厚兩三倍,由於它有更多的工做示意圖和圖表。該書將事物分解成問題、子問題的類型,使得事情變得更容易。對於自學者而言,比Griffiths或者Purcell的入門書更溫和。
《Pentium Pro and Pentium II System Architecture》
做者:Shanley
出版社:Addison-Wesley Professional; 2 edition (January 10, 1998)
與本文提到的其餘書不一樣,《Pentium Pro and Pentium II System Architecture》是關於實踐而非理論。它有點像Windows內部,由於它涉及一個真實的工做系統的細節。主題包括硬件總線協議、I/O其實是如何工做的(如APIC,Advanced Programmable Interrupt Controller,即高級可編程終端控制器)等等。
實際介紹的問題,就是從8080的CPU以來,複雜性一直呈指數級的增加。當你學得越深,你就越容易理解系統重要的可移動部分,而知識越不相關。由於總線和I/O協議不得不操做多處理器,這本書彷佛妥協了,這些系統包含了現代系統中的許多元素,只不過是以更簡單的形式。
在這些我喜歡的讀物中,我會說,這些圖書中,軟件讀物最多佔據25%、硬件讀物佔據5%。通常說來,未在清單中羅列出來的讀物更爲專業。清單還缺乏不少領域的主題,如PL,關於如何學習編程語言的實用書籍、網絡等等。
未涉及某些領域的緣由有多種,好比我沒有列出任何PL相關書籍,由於我不閱讀PL方面的書籍。我沒有提到網絡是由於我雖然讀過一些書,但我這方面的瞭解程度不足以提供有用書籍的建議。絕大部分硬件相關的書籍都沒有包含在內,由於它們涉及到你不會關心的內容,除非你是專家(好比容錯電路設計(《Skew-Tolerant Circuit Design (The Morgan Kaufmann Series in Computer Architecture and Design》,Harris著)或超快光學《Ultrafast Optics》,Weiner著))一樣也適用於數學和計算機科學理論。我遺落了至關數量的一些我認爲是名著的讀物,由於在我平常編程生活中基本沒有機會用到,好比極值組合論(Extremal Combinatorics)。我也沒有羅列那些我沒有讀完的書籍,除非我停下來,由於這些書籍極爲晦澀難讀。由於我沒有讀完像SICP和The Little Schemer的書籍,這意味着我沒法列出經典的清單。那些書籍很好,只是我沒有完成閱讀的緣由。
清單中還不包括歷史和文化相關的書籍,像《Inside Intel》或《Masters of Doom》。我可能會在將來某個時候,在清單中添加一個類別,就是我一直嘗試的實驗,像Julia Evans(意識流,文字更少或者沒有草稿)那樣撰寫。我必須回去重讀十多年前曾經閱讀過的書,而後寫出有意義的評論,但這不符合我這個實驗。關於這一點,由於這份清單是根據我記憶寫的,幾年前我就幾乎沒再讀過那些全部的書,並且可能有所遺忘不少書,我打算往後將補充。