1. 程式人生 > >程式設計師必讀書單 1.0

程式設計師必讀書單 1.0

本文把程式設計師所需掌握的關鍵知識總結為三大類19個關鍵概念,然後給出了掌握每個關鍵概念所需的入門書籍,必讀書籍,以及延伸閱讀。旨在成為最好最全面的程式設計師必讀書單。

前言

Reading makes a full man; conference a ready man; and writing an exact man.

Francis Bacon

優秀的程式設計師應該具備兩方面能力:

  • 良好的 程式設計 能力:
    • 掌握常用的資料結構和演算法(例如連結串列,棧,堆,佇列,排序和雜湊);
    • 理解電腦科學的核心概念(例如計算機系統結構、作業系統、編譯原理和計算機網路);
    • 熟悉至少兩門以上程式語言(例如 C++,Java,C#,和 Python);
  • 專業的 軟體開發 素養:
    • 具備良好的程式設計實踐,能夠編寫可測試(Testable),可擴充套件(Extensible),可維護(Maintainable)的程式碼;
    • 把握客戶需求,按時交付客戶所需要的軟體產品;
    • 理解現代軟體開發過程中的核心概念(例如面向物件程式設計,測試驅動開發,持續整合,和持續交付等等)。

和其它能力一樣, 程式設計 能力和 軟體開發 素養源自專案經驗和書本知識。專案經驗因人而異(來自不同領域的程式設計師,專案差異會很大);但書本知識是相通的——尤其是經典圖書,它們都能夠拓寬程式設計師的視野,提高程式設計師的成長速度。

在過去幾年的學習和工作中,我閱讀了大量的程式設計/軟體開發書籍。隨著閱讀量的增長,我意識到:

  • 經典書籍需要不斷被重讀——每一次重讀都會有新的體會;
  • 書籍並非讀的越多越好——大多數書籍只是經典書籍中的概念延伸(有時甚至是照搬);

意識到這兩點之後,我開始思考一個很 功利 的問題:如何從儘可能少的書中,獲取儘可能多的關鍵知識?換句話說:

  • 優秀的程式設計師應該掌握哪些關鍵概念?
  • 哪些書籍來可以幫助程式設計師掌握這些關鍵概念?

這即是這篇文章的出發點——我試圖通過 程式設計師必讀書單 這篇文章來回答上面兩個問題。

標準

進入必讀書單之前,我先介紹下書單裡的書籍選擇標準和領域選擇標準。當然你也 點選這裡 直接跳轉到書單開始閱讀。

書籍選擇標準

  1. 必讀:什麼是必讀書籍呢?如果學習某項技術有一本書無論如何都不能錯過,那麼這本書就是必讀書籍——例如 
    Effective Java
     於Java, CLR via C# 於C#;
    • 注意我沒有使用“經典”這個詞,因為經典計算機書籍往往和電腦科學聯絡在一起,而且經典往往需要10年甚至更長的時間進行考驗;
  2. 注重實踐,而非理論:所以這個書單不會包含過於原理性的書籍;
  3. 入門—必讀—延伸:必讀書籍的問題在於:1. 大多不適合入門;2. 不夠全面。考慮到沒有入門閱讀和延伸閱讀的閱讀列表是不完整的——所以書單中每個關鍵概念都會由一本入門書籍,一本必讀書籍(有時入門書籍和必讀書籍是同一本),和若干延伸閱讀書籍所構成。

概念選擇標準

  1. 全面:全面覆蓋軟體開發中重要的概念;
  2. 通用:適用於每一個程式設計師,和領域特定方向無關;
  3. 注重基礎,但不過於深入:優秀的程式設計師需要良好的電腦科學基礎,但程式設計師並沒必要掌握過於深入的電腦科學知識。以演算法為例,每個程式設計師都應該掌握排序、連結串列、棧以及佇列這些基本資料結構和演算法,但計算幾何、線性規劃和網路流這些演算法可能就不是每個程式設計師都需要掌握的了;

通過這幾個標準,我把程式設計師應掌握的關鍵概念分為程式設計,軟體開發,以及個人成長三大類,每一大類均由若干關鍵概念組成。

快速通道

自從開博以來,經常會有朋友在論壇,微博,和QQ上提問學習X技術讀什麼書合適(例如:學習Java讀什麼書合適?如何學習程式設計?)所以我在這裡列出了一個“快速通道”——把常見的問題集中在一起,點選問題,即可直接進入答案。(當然,如果你把本文從頭讀到尾幫助會更大 :-))

入門書籍

程式設計:

軟體開發:

個人成長:

必讀書籍

程式設計:

軟體開發:

個人成長:

這個閱讀列表覆蓋了軟體開發各個關鍵領域的入門書籍和必讀書籍,我相信它可以滿足絕大多數程式設計師的需求,無論你是初學者,還是進階者,都可以從中獲益:

  • 基礎理論 包括了程式設計師應該掌握的計算機基礎知識;
  • 程式語言 對軟體開發至關重要,我選擇了 C , C++ , Java , C# , Python ,和 JavaScript 這六門 主流程式語言 進行介紹,如果想進一步理解程式語言,可以閱讀 程式語言理論 裡的書目;
  • 在理解程式語言的基礎上,優秀的程式設計師還應該瞭解各種 程式設計 技巧,熟悉基本的 演算法資料結構 ,並且能夠高效的進行 程式除錯 。
  • 良好的程式設計能力是成為優秀程式設計師的前提,但軟體開發知識也是必不可少的:優秀的程式設計師應具備良好的 程式設計實踐 ,知道如何利用 面向物件 , 重構 ,和 軟體測試 編寫可複用,可擴充套件,可維護的程式碼,並具備軟體 專案管理 知識和 專業開發素養;
  • 就像我們可以從名人傳記裡學習名人的成功經驗,程式設計師也可以通過追隨優秀程式設計師的足跡使自己少走彎路。 大師之言 包含一系列對大師程式設計師/電腦科學家的訪談,任何程式設計師都可以從中獲益良多;
  • 為了打造使用者滿意的軟體產品,程式設計師應當掌握一定的 介面設計 知識和 互動設計知識(是的,這些工作應該交給UI和UX,但如果你想獨自打造一個產品呢?);
  • 專業程式設計師應當對自己進行 職業規劃 ,並熟悉程式設計師 求職面試 的流程,以便在職業道路上越走越遠;
  • 軟體開發是一項需要不斷學習的技能,學習 思維方式 可以有效的提升學習能力和學習效率;
  • 軟體開發是一項國際化的工作,為了讓更多的人瞭解你的程式碼(工作),良好的 英語寫作 能力必不可少。

儘管我儘可能的去完善這個書單,但受限於我的個人經歷,這個書單難免會有所偏頗。所以如果你有不同的意見,或者認為這個書單漏掉了某些重要書籍,請在評論中指出,我會及時更新。:-)

程式設計

編碼:隱匿在計算機軟硬體背後的語言

編碼:隱匿在計算機軟硬體背後的語言 這本書其實不應該叫編碼——它更應該叫“Petzold教你造計算機”——作者 Charles Petzold 創造性的以編碼為主題,從電報機和手電筒講到數位電路,然後利用 數位電路 中的邏輯閘構造出 加法器 和 觸發器 ,最後構造出一個完整的 儲存程式計算機 。不要被這些電路概念嚇到—— 編碼 使用大量形象貼切的類比簡化了這些概念,使其成為最精彩最通俗易懂的計算機入門讀物。

深入理解計算機系統(第2版)

深入理解計算機系統(第2版) 這本書的全名是:Computer Systems:A Programmer’s Perspective(所以它又被稱為 CSAPP),我個人習慣把它翻譯為程式設計師所需瞭解的計算機系統知識,儘管土了些,但更名副其實。

深入理解計算機系統 是我讀過的最優秀的計算機系統導論型作品,它創造性的把作業系統,計算機組成結構,數位電路,以及編譯原理這些計算機基礎學科中的核心概念彙集在一起,從而覆蓋了指令集體系架構,組合語言,程式碼優化,計算機儲存體系架構,連結,裝載,程序,以及虛擬記憶體這些程式設計師所需瞭解的關鍵計算機系統知識。如果想打下紮實的計算機基礎又不想把作業系統計算機結構編譯原理這些書統統讀一遍,閱讀 深入理解計算機系統 是最有效率的方式。

延伸閱讀:

  • 世界是數字的 : K&R 中的 K( Brian Kernighan )的近作,這本書源自 Brian 在普林斯頓大學所教授的計算機基礎課程,以通俗易懂的方式講述了現代人所應瞭解的計算機知識和網路知識;
  • 計算機系統概論(第2版) :另一部優秀的計算機系統導論型作品,和 深入理解計算機系統 不同,這本書採用自下而上的方式,從二進位制,和數字邏輯這些底層知識一步步過渡到高階程式語言(C),從而以另一種方式理解計算機系統。

程式語言是程式設計師必不可少的日常工具。工欲善其事,必先利其器。我在這裡給出了 C,C++,Java,C#,JavaScript,和Python 這六種 常用程式語言 的書單(我個人不熟悉 Objective-C 和 PHP,因此它們不在其中)。

需要注意的是:我在這裡給出的是程式語言(Programming Language)書籍,而非程式設計平臺(Programming Platform)書籍。以 Java 為例, Effective Java 屬於程式語言書籍,而 Android程式設計權威指南 就屬於程式設計平臺書籍。

C

C和指標

忘記譚浩強那本糟糕不堪的 C 程式設計, C和指標 才是 C 語言的最佳入門書籍。它詳細但又不失簡練的介紹了 C 語言以及 C 標準庫的方方面面。

對於C語言初學者,最難的概念不僅僅是指標和陣列,還有指向陣列的指標和指向指標的指標。 C和指標 花了大量的篇幅和圖示來把這些難懂但重要的概念講的清清楚楚,這也是我推薦它作為C語言入門讀物的原因。

C程式設計語言(第2版)

儘管 C程式設計語言 是二十多年前的書籍,但它仍然是C語言——以及電腦科學中最重要的書籍之一,它的重要性不僅僅在於它用清晰的語言和簡練的程式碼描述了 C 語言全貌,而且在於它為之後的計算機書籍——尤其是程式語言書籍樹立了新的標杆。以至於在很多計算機書籍的扉頁,都會有“感謝 Kernighan 教會我寫作”這樣的字樣。

延伸閱讀:

  • C 專家程式設計 :不要被標題中的“專家”嚇到,這實際是一本很輕鬆的書籍,它既包含了大量 C 語言技術細節和程式設計技巧,也包含了很多有趣的程式設計軼事;
  • C 陷阱與缺陷 :書如其名,這本書介紹了 C 語言中常見的坑和一些稀奇古怪的程式設計“技巧”,不少刁鑽的C語言面試題都源自這本小冊子;
  • C 語言參考手冊 :全面且權威的 C 語言參考手冊,而且覆蓋 C99,如果你打算成為 C 語言專家,那麼這本書不可錯過;
  • C 標準庫 :給出了15個C標準庫的設計思路,實現程式碼,以及測試程式碼,配合 C 程式設計語言 閱讀效果更佳;
  • C 語言介面與實現 :這本書展示瞭如何使用C語言實現可複用的資料結構,其中包含大量 C 語言高階技巧,以至於 Amazon 上排行第一的評論是 “Probably the best advanced C book in existance”,而排行第二的評論則是 “By far the most advanced C book I read”。

C++

C++ 程式設計原理與實踐

作為C++的發明者,沒有人能比 Bjarne Stroustrup 更理解C++。Bjarne在Texas A&M大學任教時使用C++為大學新生講授程式設計,從而就有了 C++ 程式設計原理與實踐這本書——它面向程式設計初學者,既包含 C++ 教程,也包含大量程式設計原則。它不但是我讀過最好的C++入門書,也是我讀過最好的程式設計入門書。

比較有趣的是, C++ 程式設計原理與實踐 直到全書過半都沒有出現指標,我想這可能是Bjarne為了證明不學C也可以學好C++吧。

C++ 程式設計語言(第4版)

同樣是 Bjarne Stroustrup 的作品, C++ 程式設計語言 是 C++ 最權威且最全面 的書籍。第4版相對於之前的版本進行了全面的更新,覆蓋了第二新的C++ 11標準,並砍掉了部分過時的內容。

延伸閱讀:

  • A Tour of C++ :如果你覺得 C++程式設計語言 過於龐大,但你又想快速的瀏覽一遍新版 C++ 的語言特色,那麼可以試試這本小紅書;
  • C++ 語言的設計與演化 :C++ 的“歷史書”,講述了 C++ 是如何一步一步從 C with Classes 走到如今這一步,以及 C++ 語言特性背後的故事;
  • C++ 標準庫(第2版) :相對於其它語言的標準庫,C++ 標準庫雖然強大,但學習曲線十分陡峭,這本書是學習 C++ 標準庫有力的補充;
  • 深度探索 C++ 物件模型 :這本書系統的講解了 C++ 是如何以最小的效能代價實現物件模型,很多C++面試題(包括被問爛的虛擬函式指標)都可以在這本書裡找到答案;
  • Effective C++ 和 More Effective C++ :由於 C++ 的特性實在繁雜,因此很容易就掉到坑裡。Effective 系列既講述了 C++ 的良好程式設計實踐,也包含C++的使用誤區,從而幫你繞過這些坑。

Java

Java 核心技術(第9版)

平心而論 Java 核心技術 (即Core Java)並不算是一本特別出色的書籍:示例程式碼不夠嚴謹,充斥著很多與C/C++的比較,語言也不夠簡潔——問題在於Java並沒有一本很出色的入門書籍,與同類型的 Java 程式設計思想 相比, Java 核心技術 至少做到了廢話不多,與時俱進( Java 程式設計思想 還停留在 Java 6之前),矮子裡面選將軍, Java 核心技術 算不錯了。

Effective Java(第 2 版)

儘管 Java 沒有什麼出色的入門書籍,但這不代表 Java 沒有出色的必讀書籍。 Effective Java 是我讀過的最好的程式設計書籍之一,它包含大量的優秀Java程式設計實踐,並對泛型和併發這兩個充滿陷阱的 Java 特性給出了充滿洞察力的建議,以至於 Java 之父 James Gosling 為這本書作序:“我很希望 10 年前就擁有這本書。可能有人認為我不需要任何 Java 方面的書籍,但是我需要這本書。”

延伸閱讀:

  • 深入理解 Java 虛擬機器(第2版) :非常優秀且難得的國產佳作,系統的介紹了 Java 虛擬機器和相關工具,並給出了一些調優建議;
  • Java 程式設計師修煉之道 :在這本書之前,並沒有一本 Java 書籍系統詳細的介紹 Java 7 的新特性(例如新的垃圾收集器,try using 結構和 invokedynamic 指令),這本書填補了這個空白;
  • Java 併發程式設計實踐 :系統全面的介紹了 Java 的併發,如何設計支援併發的資料結構,以及如何編寫正確的併發程式;
  • Java Puzzlers :包含了大量的 Java 陷阱——以至於讀這本書時我說的最多的一個詞就是 WTF,這本書的意義在於它是一個 反模式 大全, Effective Java 告訴你如何寫好的 Java 程式,而 Java Puzzlers 則告訴你糟糕的 Java 程式是什麼樣子。更有意思的是,這兩本書的作者都是 Joshua Bloch 。

C#

精通 C#(第6版)

可能你會疑問我為什麼會推薦這本接近 1200 頁的“鉅著”用作 C# 入門,這是我的答案:

  1. C# 的語言特性非常豐富,很難用簡短的篇幅概括這些特性;
  2. 精通 C# 之所以有近 1200 頁的篇幅,是因為它不但全面介紹了 C# 語言,而且還覆蓋了 ADO.NET,WCF,WF,WPF,以及 ASP.NET 這些 .Net 框架。你可以把這本書視為兩本書——一本 500 多頁的 C# 語言教程和一本 600 多頁的 .Net 平臺框架快速上手手冊。
  3. 儘管標題帶有“精通”兩字, 精通 C# 實際上是一本面向初學者的C#書籍,你甚至不需要太多程式設計知識,就可以讀懂它。

CLR via C#(第 4 版)

CLR via C# 是C#/.Net最重要的書籍,沒有之一。它全面介紹了 .Net 的基石—— CLR的執行原理,以及構建於 CLR 之上的 C# 型別系統,執行時關係,泛型,以及執行緒/並行等高階內容。任何一個以 C# 為工作內容的程式設計師都應該閱讀此書。

延伸閱讀:

  • 深入理解 C#(第 3 版) :C# 進階必讀,這本書偏重於C#的語言特性,它系統的介紹了C#從1.0到C# 4.0的語言特性演化,並展示瞭如何利用C#的語言特性編寫優雅的程式;
  • .NET設計規範(第 2 版) :C# 專業 程式設計師必讀,從變數命名規範講到型別系統設計原則,這本書提供了一套完整的.Net程式設計規範,使得程式設計師可以編寫出一致,嚴謹的程式碼,
  • C# 5.0 權威指南 :來自 O’Reilly 的 C# 參考手冊,嚴謹的介紹了 C# 語法,使用,以及核心類庫,C#程式設計師案頭必備;
  • LINQ to Objects Using C# 4.0 和 Async in C# 5.0 :LINQ 和 async 分別是 .Net 3.5 和 .Net 4.5 中所引入的最重要的語言特性,所以我認為有必要在它們上面花點功夫——這兩本書是介紹 LINQ 和 async 程式設計的最佳讀物。

JavaScript DOM 程式設計藝術(第 2 版)

儘管JavaScript現在可以做到客戶端伺服器端通吃,儘管 JQuery 之類的前端框架使得一些人可以不懂JavaScript也可以程式設計,但我還是認為學習JavaScript從HTML DOM開始最為適合,因為這是JavaScript設計的初衷。 JavaScript DOM程式設計藝術 系統的介紹瞭如何使用JavaScript,HTML,以及 CSS 建立可用的 Web 頁面,是一本前端入門佳作。

JavaScript 語言精粹

JavaScript語言包含大量的陷阱和誤區,但它卻又有一些相當不錯的特性,這也是為什麼 Douglas Crockford 稱JavaScript為 世界上最被誤解的語言 ,並編寫了 JavaScript 語言精粹 一書來幫助前端開發者繞開JavaScript中的陷阱。和同類書籍不同, JavaScript 語言精粹 用精煉的語言講解了JavaScript語言中好的那部分(例如閉包,函式是頭等物件,以及物件字面量),並建議讀者 不要 使用其它不好的部分(例如混亂的型別轉換,預設全域性名稱空間,以及 奇葩的相等判斷符 ),畢竟,用糟糕的特性編寫出來的程式往往也是糟糕的。

延伸閱讀:

  • JavaScript 高階程式設計(第 3 版) :詳盡且深入的介紹了Javascript語言,DOM,以及Ajax,並針對HTML5做了對應更新;
  • 編寫可維護的 JavaScript :書如其名,這本書給出了大量的優秀 JavaScript 程式設計實踐,使得程式設計師編寫出健壯且易於維護的 JavaScript 程式碼;
  • JavaScript 非同步程式設計 :和常見的支援併發的程式語言(例如 Java 和 C#)不同,JavaScript 本身是 單執行緒 的,因此不能把其它語言處理併發的方式照搬到 JavaScript。 JavaScript 非同步程式設計 系統的介紹了JavaScript 中的併發原理,並闡述瞭如何使用 PromiseDeferred 以及 Async.js 編寫出簡潔高效的非同步程式。

Python 基礎教程(第二版)

Python 的入門書籍很多,而且據說質量大多不錯,我推薦 Python 基礎教程 的原因是因為它是我的Python入門讀物——簡潔,全面,程式碼質量很不錯,而且有幾個很有趣的課後作業,使得我可以快速上手。

這裡順便多說一句,不要用 Python 學習手冊 作為Python入門——它的廢話實在太多,你能想象它用了15頁的篇幅去講解if語句嗎?儘管 O’Reilly 出了很多經典程式設計書,但這本 Python 學習手冊 絕對不在其中。

Python 參考手冊(第 4 版)

權威且實用 Python 書籍,覆蓋 Python 2和 Python 3。儘管它名為參考手冊,但 Python 參考手冊 在 Python 語法和標準庫基礎之上對其實現機制也給出了深入的講解,不容錯過。

延伸閱讀:

  • Python 袖珍指南(第 5 版) :實用且便攜的 Python 參考手冊,我會說我在飛機上寫程式時用的就是它麼 -_-#;
  • Python Cookbook(第 3 版) :非常好的 Python 進階讀物,包含各種常用場景下的 Python 程式碼,使得讀者可以寫出更加 Pythonic 的程式碼;
  • Python 原始碼剖析 :少見的國產精品,這本書以 Python 2.5 為例,從原始碼出發,一步步分析了 CPython 是如何實現型別,控制流,函式/方法的宣告與呼叫,型別以及裝飾器等 Python 核心概念,讀過之後會大大加深對 Python 的理解。儘管這本書有些過時,但我們仍然可以按照它分析原始碼的方式來分析新版Python。

程式語言實現模式

大多數程式設計師並不需要從頭編寫一個編譯器或直譯器,因此 龍書(編譯原理) 就顯得過於重量級;然而多數程式設計師還是需要解析文字,處理配置檔案,或者寫一個小語言, 程式語言實現模式 很好的滿足了這個需求。它把常用的文字解析/程式碼生成方法組織成一個個模式,併為每個模式給出了例項和應用場景。這本書既會提高你的動手能力,也會加深你對程式語言的理解。Python 發明者 Guido van Rossum 甚至為這本書給出了 “Throw away your compiler theory book!” 這樣的超高評價。

程式設計語言——實踐之路(第 3 版)

程式設計師每天都要和程式語言打交道,但是思考程式語言為什麼會被設計成這個樣子的程式設計師並不多, 程式設計語言——實踐之路 完美的回答了這個問題。這本書從程式語言的解析和執行開始講起,系統了介紹了名稱空間,作用域,控制流,資料型別以及方法(控制抽象)這些程式設計語言的核心概念,然後展示了這些概念是如何被應用到過程式語言,面嚮物件語言,函式式語言,指令碼式,邏輯程式語言以及併發程式語言這些具有不同程式設計正規化的程式語言之上。這本書或極大的拓寬你的視野——無論你使用什麼程式語言,都會從這本書中獲益良多。理解這一本書,勝過學習十門新的程式語言。

延伸閱讀:

  • 七週七語言:理解多種程式設計範型 :儘管我們在日常工作中可能只使用兩三門程式語言,但是瞭解其它程式語言正規化是很重要的。 七週七語言 一書用精簡的篇幅介紹了 Ruby,Io,Prolog,Scala,Erlang,Clojure,和 Haskell 這七種具有不同程式設計正規化的語言——是的,你沒法通過這本書變成這七種語言的專家,但你的視野會得到極大的拓寬;
  • 自制程式語言 :另一本優秀的編譯原理作品, 自制程式語言 通過從零開始製作一門無型別語言 Crowbar 和一門靜態型別語言 Diksam,把型別系統,垃圾回收,和程式碼生成等程式語言的關鍵概念講的清清楚楚;
  • 計算的本質:深入剖析程式和計算機 :披著 Ruby 外衣的 計算理論 入門書籍,使你對程式語言的理解更上一層樓。

程式設計方法

現代程式語言的語法大多很繁雜,初學者使用這些語言學習程式設計會導致花大量的時間在程式語言語法(諸如指標,引用和型別定義)而不是程式設計方法(諸如資料抽象和過程抽象)之上。 程式設計方法 解決了這個問題——它專注於程式設計方法,使得讀者無需把大量時間花在程式語言上。這本書還有一個與之配套的教學開發環境 DrScheme,這個環境會根據讀者的程度變換程式語言的深度,使得讀者可以始終把注意力集中在程式設計方法上。

我個人很奇怪 程式設計方法 這樣的佳作為什麼會絕版,而譚浩強C語言這樣的垃圾卻大行其道——好在是程式設計方法 第二版 已經被免費釋出在網上。

計算機程式的構造與解釋(第 2 版)

計算機程式的構造與解釋 是另一本被國內大學忽視(至少在我本科時很少有人知道這本書)的教材,這本書和 程式設計方法 有很多共同點——都使用 Scheme )作為教學語言;都專注於程式設計方法而非程式語言本身;都擁有相當出色的課後題。相對於 程式設計方法 , 計算機程式的構造與解釋 要更加深入程式設計的本質(過程抽象,資料抽象,以及元語言抽象),以至於 Google 技術總監 Peter Norvig 給了這本書 超高的評價 。

延伸閱讀:

  • 程式設計原本 : STL 作者的關於程式設計方法佳作——他把關係代數和群論引入程式設計之中,試圖為程式設計提供一個堅實的理論基礎,從而構建出更加穩固的軟體。這本書是 程式設計方法 和 計算機程式的構造與解釋 的絕好補充——前者使用函式式語言(Scheme)講授程式設計,而 程式設計原本 則使用命令式語言(C++);
  • 元素模式 : 設計模式 總結了 面向物件程式設計 中的模式,而 元素模式 這本書分析了 程式設計 中的常見模式的本質,閱讀這本書會讓你對程式設計有更深的理解;
  • The Science of Programming :會程式設計的人很多,但能夠編寫正確程式的人就少多了。 The Science of Programming 通過 前條件——不變式——後條件 以及邏輯謂詞演算,為編寫正確程式提供了強有力的理論基礎,然後這本書通過例項闡述瞭如何應用這些理論到具體程式上。任何一個想大幅提高開發效率的程式設計師都應閱讀此書。

演算法(第 4 版)

我在 演算法學習之路 一文中提到我的演算法入門教材是 資料結構與演算法分析:C語言描述,我曾經認為它是最好的演算法入門教材,但自從我讀到 Sedgewick 的 演算法 之後我就改變了觀點——這本 演算法 才是最好的演算法入門教材:

  • 使用更為容易的Java語言作為教學語言;
  • 覆蓋所有常用的資料結構和演算法,並均給出其完整實現;
  • 包含大量的圖示用於視覺化演算法——事實上這是我讀過的圖示最為豐富形象的書籍,這也是我稱其為最好的演算法入門書籍的原因。

程式設計珠璣(第 2 版)

程式設計珠璣(第 2 版) 是一本少見的實踐型演算法書籍——它並非一一介紹資料結構/演算法的教材,而是實踐性極強的演算法應用手冊。作者( Jon Bentley )從他多年的實際經驗精選出一些有趣而又實用的問題,然後展示了他解決這些問題的過程(分析問題,選擇合適的演算法,解決問題,以及驗證答案)。任何程式設計師都可以從中獲益。

延伸閱讀:

  • 程式設計珠璣(續) :嚴格來說這本書並非 程式設計珠璣 的續作,而是一本類似於番外篇的程式設計技巧/實踐手冊;它不像 程式設計珠璣 那般重視演算法的應用,而是全面覆蓋了程式設計師所需的能力;
  • 演算法導論(第 3 版) :儘管我在這邊文章開頭提到會盡量避免理論性的書籍,但沒有 演算法導論 的演算法閱讀列表是不完整的,我想這本書就不需要我多介紹了; :-)
  • 演算法設計與分析基礎(第 3 版) :側重於演算法設計,這本書創新的把常見演算法分為分治,減治,變治三大類,並覆蓋了動態規劃,回溯,以及分支定界等高階演算法設計方法,屬於演算法設計的入門佳作。

除錯九法——軟硬體錯誤的排查之道

一個讓非程式設計從業人員驚訝的事實是程式設計師的絕大多時間都花在除錯上,而不是寫程式上,以至於 Bob 大叔 把 除錯時間佔工作時間的比例 作為衡量程式設計師開發能力的標準。 除錯九法——軟硬體錯誤的排查之道 既是除錯領域的入門作品,也是必讀經典之作。 除錯九法 的作者是一個具有豐富實戰經驗的硬體工程師,他把他多年的除錯經驗總結成九條除錯法則,並對每一條法則都給對應的實際案例。任何程式設計師都應通過閱讀這本書改善除錯效率,即便是非程式設計師,也可以從這本書中學到系統解決問題的方法。

延伸閱讀:

  • Writing Solid Code :最好的除錯是不除錯—— Writing Solid Code 介紹了斷言,設計清晰的 API,以及單步程式碼等技巧,用於編寫健壯的程式碼,減少除錯的時間;
  • 軟體除錯的藝術 :除錯工具書——這本書詳細的介紹了常見的偵錯程式工具,並通過具體案例展示了它們的使用技巧;

軟體開發

程式設計實踐

儘管程式設計實踐只有短短 200 餘頁,但它使用精煉的程式碼和簡要的原則覆蓋了程式設計的所有關鍵概念(包括程式設計風格,演算法與資料結構,API 設計,除錯,測試,優化,移植,以及領域特定語言等概念)。如果你想快速掌握良好的程式設計實踐,或者你覺著900多頁的 程式碼大全 過於沉重,那麼程式設計實踐是你的不二之選。我第一次讀這本書就被它簡潔的語言和優雅的程式碼所吸引,以至於讀研時我買了三本程式設計實踐——一本放在學校實驗室,一本放在宿舍,一本隨身攜帶閱讀。我想我至少把它讀了十遍以上——每一次都有新的收穫。

程式碼大全(第2版)

無論在哪個版本的程式設計師必讀書單, 程式碼大全 都會高居首位。和其它程式設計書籍不同, 程式碼大全 用通俗清晰的語言覆蓋了軟體構建(Software Construction)中各個層次上 所有 的重要概念——從變數命名到型別設計,從控制迴圈到程式碼結構,從測試和除錯到構建和整合, 程式碼大全 可謂無所不包,你可以把這本書看作為程式設計師的一站式(Once and for all)閱讀手冊。更珍貴的是, 程式碼大全 在每一章末尾都給出了價值很高的參考書目(參考我之前的 如何閱讀書籍 一文),如果你是一個初出茅廬的程式設計師, 程式碼大全 是絕好的閱讀起點。

延伸閱讀:

  • 編寫可讀程式碼的藝術 :專注於程式碼可讀性(Code Readability),這本書來自 Google 的兩位工程師對