您好,登錄后才能下訂單哦!
本人首發:http://www.infoq.com/cn/articles/each-programmer-must-have-programming-books-bookcase
原文參考了Dan Luu的博客,經作者授權,由InfoQ編譯、整理并分享。
一提到有關編程方面的書籍,你就會想起江湖中傳說的“每個程序員必讀的12本計算機科學書籍”,然而,這份清單并沒有什么實用性。因為,計算機科學領域非常寬泛,幾乎所有程序員都可以閱讀任何主題,就算某個主題很重要,但由于讀者的學習偏好天懸地隔,因此對所有讀者而言,某個主題并不存在所謂“最好的”書籍。
本文是我已經閱讀過的主題和書籍的清單。這些都是我很熟悉的主題,也許你可以在此文中,了解關于該主題更多的情況,并閱讀其他相關書籍。換而言之,就是說你為什么需要閱讀另一本書。
為什么要關心算法、數據結構和復雜性? 好吧,有一個實用的結論:在工作中,即使你從來沒有用到這些東西,但是,大多數一流的支付公司在面試中會測試這些內容。我決不瞎扯,算法真的很有用,就像我發現數學很有用一樣。任何特定算法適用于任何特定問題的概率很低,但從總體上說明什么類型的問題如何解決,什么樣的問題難以處理,通常當近似有效時就有用了。
《Cracking the Coding Interview》
作者:McDowell
出版社:CareerCup; 6th edition (July 1, 2015)
中文版:《程序員面試金典》
譯者:李琳驍、漆犇
出版社:人民郵電出版社,第五版
《程序員面試金典》的作者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
(意識流,文字更少或者沒有草稿)那樣撰寫。我必須回去重讀十多年前曾經閱讀過的書,然后寫出有意義的評論,但這不符合我這個實驗。關于這一點,因為這份清單是根據我記憶寫的,幾年前我就幾乎沒再讀過那些所有的書,而且可能有所遺忘很多書,我打算日后將補充。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。