程序員必讀書單

原文地址:http://lucida.me/blog/developer-reading-list/

關於

本文把程序員所需掌握的關鍵知識總結爲三大類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讀什麼書合適?如何學習程序設計?)所以我在這裏列出了一個“快速通道”——把常見的問題集中在一起,點擊問題,即可直接進入答案。(當然,如果你把本文從頭讀到尾幫助會更大 :-))

程序員必讀書單

入門書籍

程序設計:

  1. 基礎理論編碼:隱匿在計算機軟硬件背後的語言
  2. 編程語言

  3. 編程語言理論編程語言實現模式
  4. 程序設計程序設計方法
  5. 算法與數據結構算法(第4版)
  6. 程序調試調試九法——軟硬件錯誤的排查之道

軟件開發:

  1. 編程實踐程序設計實踐
  2. 面向對象程序設計Head First設計模式
  3. 重構重構
  4. 軟件測試How to Break Software
  5. 項目管理極客與團隊
  6. 專業開發程序員修煉之道:從小工到專家
  7. 大師之言奇思妙想:15位計算機天才及其重大發現
  8. 界面設計寫給大家看的設計書
  9. 交互設計通用設計法則

個人成長:

  1. 職業規劃軟件開發者路線圖
  2. 思維方式程序員的思維修煉:開發認知潛能的九堂課
  3. 求職面試金領簡歷:敲開蘋果微軟谷歌的大門
  4. 英語寫作The Only Grammar Book You'll Ever Need

必讀書籍

程序設計:

  1. 基礎理論深入理解計算機系統(第2版)
  2. 編程語言

  3. 編程語言理論程序設計語言——實踐之路(第3版)
  4. 程序設計計算機程序的構造與解釋(第2版)
  5. 算法與數據結構編程珠璣(第2版)
  6. 程序調試調試九法——軟硬件錯誤的排查之道

軟件開發:

  1. 編程實踐代碼大全(第2版)
  2. 面向對象程序設計設計模式
  3. 重構修改代碼的藝術
  4. 軟件測試xUnit Test Patterns
  5. 項目管理人月神話
  6. 專業開發程序員職業素養
  7. 大師之言編程人生:15位軟件先驅訪談錄
  8. 界面設計認知與設計:理解UI設計準則(第2版)
  9. 交互設計交互設計精髓(第3版)

個人成長:

  1. 職業規劃軟件開發者路線圖
  2. 思維方式如何把事情做到最好
  3. 求職面試程序員面試金典(第5版)
  4. 英語寫作風格的要素

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

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

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

程序設計

1. 基礎理論

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

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

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

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

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

延伸閱讀:

2. 編程語言

編程語言是程序員必不可少的日常工具。工欲善其事,必先利其器。我在這裏給出了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.0Async in C# 5.0:LINQ和async分別是.Net 3.5和.Net 4.5中所引入的最重要的語言特性,所以我認爲有必要在它們上面花點功夫——這兩本書是介紹LINQ和async編程的最佳讀物。

JavaScript

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語言中好的那部分(例如閉包,函數是頭等對象,以及對象字面量),並建議讀者不要使用其它不好的部分(例如混亂的類型轉換,默認全局命名空間,以及奇葩的相等判斷符),畢竟,用糟糕的特性編寫出來的程序往往也是糟糕的。

延伸閱讀:

Python

Python基礎教程(第二版)

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

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

Python參考手冊(第4版)

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

延伸閱讀:

3. 編程語言理論

編程語言實現模式

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

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

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

延伸閱讀:

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

4. 程序設計

程序設計方法

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

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

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

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

延伸閱讀:

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

5. 算法與數據結構

算法(第4版)

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

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

編程珠璣(第2版)

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

延伸閱讀:

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

6. 程序調試

調試九法——軟硬件錯誤的排查之道

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

延伸閱讀:

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

軟件開發

1. 編程實踐

程序設計實踐

Brian Kernighan是這個星球上最好的計算機書籍作者:從上古時期的Software Tools,到早期的Unix編程環境C程序設計語言,再到這本程序設計實踐,每本書都是必讀之作。

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

代碼大全(第2版)

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

延伸閱讀:

  • 編寫可讀代碼的藝術:專注於代碼可讀性(Code Readability),這本書來自Google的兩位工程師對Google Code Readability的總結。它給出了大量命名,註釋,代碼結構,以及API設計等日常編碼的最佳實踐,幷包含了很多看似細微但卻可以顯著提升代碼可讀性的編程技巧。這本書的翻譯還不錯,但如果你想體會書中的英語幽默(例如Tyrannosaurus——Stegosaurus——Thesaurus),建議閱讀它的英文影印版
  • 卓有成效的程序員:專注於生產效率(Productivity),它既包含源自作者多年經驗的高生產率原則,也包含大量的提高生產率的小工具,每個追求高生產率的程序員都應該閱讀這本書;
  • UNIX編程藝術:專注於程序設計哲學,這本書首先總結出包括模塊化,清晰化,可組合,可分離等17個Unix程序設計哲學,接下來通過Unix歷史以及各種Unix編程工具展示了這些原則的應用。儘管個人覺的這本書有些過度拔高Unix且過度貶低Windows和M$,但書中的Unix設計哲學非常值得借鑑。

2. 面向對象程序設計

Head First設計模式

無論是在Amazon還是在Google上搜索設計模式相關書籍,Head First設計模式都會排在首位——它使用風趣的語言和詼諧的圖示講述了觀察者,裝飾者,抽象工廠,和單例等關鍵設計模式,使得初學者可以迅速的理解並掌握設計模式。Head First設計模式在Amazon上好評如潮,就連設計模式原書作者Erich Gamma都對它給出了很高的評價。

需要注意,Head First設計模式是非常好的設計模式入門書,但千萬不要把這本書作爲學習設計模式的唯一的書——是的,Head First設計模式擁有風趣的語言和詼諧的例子,但它既缺乏實際的工程範例,也沒有給出設計模式的應用/適用場景。我個人建議是在讀過這本書之後立即閱讀“四人幫”設計模式Bob大叔敏捷軟件開發,以便理解設計模式在實際中的應用。

設計模式

設計模式作爲設計模式領域的開山之作,Erich Gamma,Richard Helm,Ralph Johnson等四位作者將各個領域面向對象程序開發的經驗總結成三大類23種模式,並給出了每個模式的使用場景,變體,不足,以及如何克服這些不足。這本書行文嚴謹緊湊(四位作者都是PhD),並且代碼源自實際項目,屬於設計模式領域的必讀之作。

需要注意:設計模式不適合初學者閱讀——它更像是一篇博士論文而非技術書籍,加上它的範例都具有很強的領域背景(諸如GUI窗口系統和富文本編輯器),缺乏實際經驗的程序員很難理解這本書。

延伸閱讀:

3. 重構

重構

任何產品代碼都不是一蹴而就,而是在反覆不斷的修改中進化而來。重構正是這樣一本介紹如何改進代碼的書籍——如何在保持代碼行爲的基礎上,提升代碼的質量(這也是重構的定義)。

我見過很多程序員,他們經常聲稱自己在重構代碼,但他們實際只做了第二步(提升代碼的質量),卻沒有保證第一步(保持代碼行爲),因此他們所謂的重構往往會適得其反——破壞現有代碼或是引入新bug。這也是我推薦重構這本書的原因——它既介紹糟糕代碼的特徵(Bad smell)和改進代碼的方法,也給出了重構的完整流程——1. 編寫單元測試保持(Preserve)程序行爲;2. 重構代碼;3. 保證單元測試通過。重構還引入了一套重構術語(諸如封裝字段,內聯方法,和字段上移),以便程序員之間交流。只有理解了這三個方面,才能算是理解重構。

修改代碼的藝術

這裏再重複一遍重構的定義——在保持代碼行爲的基礎上,提升代碼的質量。重構專注於第二步,即如何提升代碼的質量,而修改代碼的藝術專注於第一步,即如何保持代碼的行爲。

提升代碼質量並不困難,但保持代碼行爲就難多了,尤其是對沒有測試的遺留代碼(Legacy Code)而言——你需要首先引入測試,但遺留代碼往往可測試性(Testability)很差,這時你就需要把代碼變的可測試。修改代碼的藝術包含大量的實用建議,用來把代碼變的可測試(Testable),從而使重構變爲可能,使提高代碼質量變爲可能。

延伸閱讀:

  • 重構與模式:這本書的中文書名存在誤導,它的原書書名是Refactoring to Patterns——通過重構,把模式引入代碼。這本書闡述了重構和設計模式之間的關係,使得程序員可以在更高的層次上思考重構,進行重構。

4. 軟件測試

How to Break Software

關於軟件測試的書籍很多,但很少有一本測試書籍能像How to Break Software這般既有趣又實用。不同於傳統的軟件測試書籍(往往空話連篇,無法直接應用),How to Break Software非常實際——它從程序員的心理出發,分析軟件錯誤/Bug最可能產生的路徑,然後針對這些路徑進行殘酷的測試,以保證軟件質量。

我在第一次閱讀這本書時大呼作者太過“殘忍”——連這些刁鑽詭異的測試招數都能想出來。但這種毫不留情(Relentless)的測試風格正是每個專業程序員所應具備的心態。

注意:如果你是一個測試工程師,那麼在閱讀這本書前請三思——因爲閱讀它之後你會讓你身邊的程序員苦不堪言,甚至連掐死你的心都有 :-D。

xUnit Test Patterns

How to Break Software注重黑盒測試,而這本xUnit Test Patterns則注重白盒測試。正如書名所示,xUnit Test Patterns覆蓋了單元測試的每個方面:從如何編寫良好的單元測試,到如何設計可測試(Testable)的軟件,再到如何重構測試——可以把它看作爲單元測試的百科全書。

延伸閱讀:

  • Practical Unit Testing with JUnit and Mockito:儘管xUnit Test Patterns覆蓋了單元測試的方方面面,但它的問題在於不夠與時俱進(07年出版)。Practical Unit Testing彌補了這個缺陷——它詳細介紹瞭如何通過測試框架JUnit和Mock框架Mockito編寫良好的單元測試,並給出了大量優秀單元測試的原則;
  • 單元測試的藝術(第2版):可以把這本書看作爲前一本書的.Net版,適合.Net程序員;
  • Google軟件測試之道:這本書詳細介紹了Google如何測試軟件——包括Google的軟件測試流程以及Google軟件測試工程師的日常工作/職業發展。需要注意的是:這本書中的測試流程在國內很可能行不通(國內企業缺乏像Google那般強大的基礎設施(Infrastructure)),但它至少可以讓國內企業有一個可以效仿的目標;
  • 探索式軟件測試James Whittaker的另一本測試著作,不同於傳統的黑盒/白盒測試,這本書創造性的把測試比喻爲“探索”(Exploration),然後把不同的探索方式對應到不同的測試方式上,以便儘早發現更多的軟件錯誤/Bug。

5. 項目管理

極客與團隊

很多程序員都向往成爲橫掃千軍(One-man Army)式的“編程英雄”,但卓越的軟件並非一人之力,而是由團隊合力而成。極客與團隊就是這樣一本寫給程序員的如何在團隊中工作的絕好書籍,它圍繞着HRT三大原則(Humility謙遜,Respect尊重,和Trust信任),系統的介紹瞭如何融入團隊,如何打造優秀的團隊,如何領導團隊,以及如何應對團隊中的害羣之馬(Poisonous People)。這本書實用性極強,以至於Python之父Guido van Rossum都盛讚這本書“說出了我一直在做但總結不出來的東西”

人月神話

儘管人月神話成書於40年前,但它仍是軟件項目管理重要的書籍。人月神話源自作者Fred Brooks領導並完成System/360OS/360這兩個即是放到現在也是巨型軟件項目的里程碑項目的經驗總結。它覆蓋了軟件項目各個方面的關鍵概念:從工期管理(Brooks定律)到團隊建設(外科團隊),從程序設計(編程的本質是使用正確的數據結構)到架構設計(概念完整性),從原型設計(Plan to Throw one away)到團隊交流(形式化文檔+會議)。令人驚訝的是,即便40年之後,人月神話中的關鍵概念(包括焦油坑,Brooks定律概念完整性外科團隊第二版效應等等)依然適用,而軟件開發的核心複雜度仍然沒有得到解決(沒有銀彈)。

延伸閱讀:

  • 人件(原書第3版):從人的角度分析軟件項目。人件從僱傭正確的人,創建健康的工作環境,以及打造高效的開發團隊等角度闡述瞭如何改善人,從而改善軟件項目;
  • 門後的祕密:卓越管理的故事:這本書生動的再現了軟件項目管理工作的場景,並給出了各種實用管理技巧,如果你有意轉向管理崗位,這本書不容錯過;
  • 大教堂與集市:這本書從黑客的歷史說起,系統而又風趣的講述了開源運動的理論和實踐,以及開源軟件項目是如何運作並發展的。瞭解開源,從這本書開始。

6. 專業開發

程序員修煉之道:從小工到專家

不要被庸俗的譯名迷惑,程序員修煉之道是一本價值極高的程序員成長手冊。這本書並不侷限於特定的編程語言或框架,而是提出了一套切實可行的實效(Pragmatic)開發哲學,並通過程序設計,測試,編程工具,以及項目管理等方面的實例展示瞭如何應用這套開發哲學,從而使得程序員更加高效專業。有人把這本書稱之爲迷你版代碼大全——代碼大全給出了大量的優秀程序設計實踐,偏向術;而程序員修煉之道給出了程序設計實踐背後的思想,注重道。

程序員職業素養

程序員修煉之道指出了如何成爲專業程序員,這本程序員職業素養則指出了專業程序員應該是什麼樣子——承擔責任;知道自己在做什麼;知道何時說不/何時說是;在正確的時間編寫正確的代碼;懂得自我時間管理和工期預估;知道如何應對壓力。如果你想成爲專業程序員(Professional Developer)(而不是碼農(Code Monkey)),這本書會爲你指明前進的方向。

延伸閱讀:

7. 大師之言

奇思妙想:15位計算機天才及其重大發現

奇思妙想:15位計算機天才及其重大發現是一本極具眼光的技術訪談書籍——在這本書訪談的15位計算機科學家中,竟出現了12位圖靈獎獲得者——要知道圖靈獎從1966年設獎到現在也只有六十幾位獲獎者而已。

奇思妙想把計算機科學分爲四大領域:編程語言;算法;架構;人工智能。並選取了每個領域下最具代表性的計算機科學家進行訪談。因爲這些計算機科學家都是其所在領域的開拓者,因此他們能給出常人無法給出的深刻見解。通過這本書,你可以瞭解前三十年的計算機科學的發展歷程——計算機科學家做了什麼,而計算機又能做到/做不到什麼。從而避免把時間浪費在前人已經解決的問題(或者根本無法解決的問題)上面。

編程人生:15位軟件先驅訪談錄

同樣是訪談錄,同樣訪談15個人,編程人生把重點放在程序員(Coders at work)上。它從各個領域選取了15位頂尖的程序員,這些程序員既包括Ken ThompsonJamie Zawinski這些老牌Unix黑客,也包括Brad Fitzpatrick這樣的80後新生代,還包括Frances AllenDonald Knuth這樣的計算機科學家。這種多樣性(Diversity)使得編程人生兼具嚴謹性和趣味性,無論你是什麼類型的程序員,都能從中受益良多。

延伸閱讀:

  • 圖靈和ACM圖靈獎(1966-2011):通過圖靈獎介紹整個計算機科學發展史,非常難得的國產精品圖書;
  • 編程大師訪談錄:可以把這本書看作爲二十年前的編程人生,被訪談者都是當時叱吒風雲的人物(例如微軟的創造者Bill Gates,Macintosh的發明者Jeff Raskin,以及Adobe的創始人John Warnock等等)。有趣的是這本書中大量的經驗和建議到如今依然適用;
  • 編程大師智慧:類似於編程人生,不同的是被訪談者都是編程語言的設計者——這本書覆蓋了除C語言以外的幾乎所有主流編程語言。通過這本書,你可以從中學到編程語言背後的設計思想——編程語言爲什麼要被設計成這樣,是什麼促使設計者要在語言中加入這個特性(或拒絕那個特性)。從而提升對編程語言的理解。

8. 界面設計

寫給大家看的設計書

書如其名,寫給大家看的設計書是一本面向初學者的快速設計入門。它覆蓋了版式,色彩,和字體這三個設計中的關鍵元素,並創造性的爲版式設計總結出CRAP四大原則(Contrast對比,Repetition重複,Alignment對齊,Proximity親密)。全書使用豐富生動的範例告訴讀者什麼是好的設計,什麼是不好的設計,使得即便是對設計一無所知的人,也可以從這本書快速入門。

認知與設計:理解UI設計準則(第2版)

寫給大家看的設計書強調實踐,即如何做出好的設計;認知與設計:理解UI設計準則強調理論,即爲什麼我們會接受這樣的設計而反感那樣的設計。如果你想要搞清楚設計背後的心理學知識,但又不想閱讀大部頭的心理學著作,那麼認知與設計是你的首選。

延伸閱讀:

  • GUI設計禁忌 2.0:這本書指出了GUI設計的原則和常見誤區,然後通過具體範例指出瞭如何避免這些誤區。如果你的工作涉及到用戶界面,那麼這本書會爲你減少很多麻煩;
  • 界面設計模式(第2版):這本書將用戶界面中的常見元素/行爲組織成彼此關聯的模式,以便讀者理解並舉一反三,從而將其運用到自己的應用中;
  • 移動應用UI設計模式:類似於界面設計模式,但面向移動平臺。它給出了iOS,Android,以及Windows Phones上常用的90餘種界面設計模式,從而使得你不必把這些平臺的應用挨個玩一遍也可以掌握各個平臺的設計精髓。如果你主攻Android平臺,那麼Android應用UI設計模式會是更好的選擇;
  • 配色設計原理版式設計原理:如果你讀過寫給大家看的設計書之後想繼續深入學習設計,這兩本書是不錯的起點。

9. 交互設計

通用設計法則

書如其名,通用設計法則給出了重要的125個設計原則,並用簡練的語言和範例展示了這些原則的實際應用。每個原則都有對應的參考文獻,以便讀者進一步學習。我之所以推薦這本書,是因爲:1. 程序員需要對設計有全面的認識;2. 程序員並不需要知道這些設計原則是怎麼來的,知道怎麼用即可。這本書很好的滿足了這兩個要求。

交互設計精髓(第3版)

交互設計精髓是交互設計領域的聖經級著作。交互設計專家(以及VB之父)Alan Cooper在這本書中詳細介紹了交互設計的原則,流程,以及方法,然後通過各種範例(主要來自桌面系統)展示瞭如何應用這些原則。

需要注意的是這本書的第4版已經出版,它在第三版的基礎上增加了移動設計以及Web設計等內容。

延伸閱讀:

  • The Design of Everyday Things:交互設計領域的另一本經典之作,它通過解讀人類行動背後的心理活動,展示了設計問題的根源,並給出了一系列方法用以解決設計問題(需要注意,儘管這本書有中譯版,但中譯版對應的是02年的舊版,而非13年的新版);
  • The Inmates Are Running the AsylumAlan Cooper的另一本經典,這本書非常辛辣的指出讓不具備人機交互知識的程序員直接編寫面向用戶的軟件就像讓精神病人管理瘋人院(The Inmates Are Running the Asylum),然後給出了一套交互設計流程以挽救這個局面;
  • 簡約至上:交互式設計四策略:專注於把產品變的更加簡單易用。作者通過刪除,組織,隱藏,和轉移這四個策略,展示瞭如何創造出簡約優質的用戶體驗。

個人成長

1. 職業規劃

軟件開發者路線圖

軟件開發者路線圖是一本優秀且實用的程序員職業規劃手冊。這本書由若干個模式組成,每個模式都對應於程序員職業生涯中的特定階段。通過這本書,讀者可以很方便的找到自己目前所處的模式(階段),應該做什麼,目標是什麼,以及下一個模式(階段)會是什麼。如果你時常感到迷茫,那麼請閱讀這本路線圖,找到自己的位置,確定接下來的方向。

延伸閱讀:

  • 卡耐基全集:非常著名的爲人處世書籍。很多人把這本書歸類到成功學,但我並不這麼認爲——在我看來,這本書教的更多的是如何成爲一個讓大家喜歡的人。作爲天天和機器打交道的程序員,這套書會幫助我們與人打交道;
  • 沃頓商學院最受歡迎的談判課:這本書不是教你去談判,而是教你通過談判(Negotiation)去得到更多(Getting more,這也是這本書的原書書名)。小到買菜砍價,大到爭取項目,這本書中的談判原則會讓你收益良多;
  • 程序員健康指南:作爲長期與計算機打交道的職業,程序員往往會受到各式各樣疾病的困擾,這本書正是爲了解決這個問題而出現:它從改善工作環境,調整飲食結構,預防頭痛眼痛,以及進行室內/室外鍛鍊等方面出發,給出了一套全面且可行的程序員健康改善計劃,以幫助程序員打造健康的身體。

2. 思維方式

程序員的思維修煉:開發認知潛能的九堂課

作爲程序員,我們需要不斷地學習——既要學習新技術,也要學習如何解決各種領域的問題。爲了提升學習效率,我們需要學習如何學習程序員的思維修煉正是這樣一本講如何學習的書,它集合了認知科學,神經學,以及行爲理論的最新研究成果,並系統的介紹了大腦的工作機制。通過這本書,你將學會如何高效的使用自己的大腦,從而提高思考能力,改善學習效率。

如何把事情做到最好

Mastery is not about perfection. It’s about a process, a journey. The master is the one who stays on the path day after day, year after year. The master is the one who is willing to try, and fail, and try again, for as long as he or she lives.

爲什麼同樣資質的人,大多數人會碌碌無爲,而只有極少數能做到登峯造極?如何在領域內做到頂尖?如何克服通往頂尖之路上的重重險阻?如何把事情做到最好回答了這些問題,並極具哲理的指出登峯造極並不是結果,而是一段永不停止的旅程。閱讀這本書不會讓你立刻脫胎換骨,但它會指引你走向正確的道路——通往登峯造極之路。

延伸閱讀:

  • 怎樣解題:數學思維的新方法:不要被標題中的“數學思維”嚇到,它並不僅僅只是一本數學解題書,它所提出的四步解題法(理解題目->擬定方案->執行計劃->總結反思)適用於任何領域;
  • 暗時間劉未鵬所寫的關於學習思維方法的文章集,既包含了他對學習方法的思考,也包含了大量進一步閱讀的資源;
  • 批判性思維:帶你走出思維的誤區:這本書系統的分析了人類思維的常見誤區,並針對各個誤區給出瞭解決方案,從而幫助程序員養成嚴謹正確的思考方式;
  • Conceptual Blockbusting: A Guide to Better Ideas:與批判性思維相反,這本書專注於創造性思維(Creative Thinking),它分析了阻礙創造性思維的常見思維障礙(Blockbuster)以及這些思維障礙背後的成因,並給出了各種方法以破除這些障礙。

3. 求職面試

金領簡歷:敲開蘋果微軟谷歌的大門

知己知彼,百戰不殆。金領簡歷:敲開蘋果微軟谷歌的大門是程序員求職的必讀書籍,它覆蓋了程序員求職的方方面面:從開始準備到編寫簡歷,從技術面試到薪酬談判。由於該書作者曾在Google,微軟,和蘋果任職並進行過技術招聘,因此這本書的內容非常實用。

順便吐個槽:這本書翻譯的還不錯,但我實在無法理解封面上的“進入頂級科技公司的葵花寶典”這段文字——找個工作而已,用不着切JJ這麼兇殘吧。-_-#

程序員面試金典(第5版)

同樣是來自金領簡歷作者的作品,程序員面試金典(第5版)專注於技術面試題,它既包含了IT企業(諸如微軟,Google,和蘋果)的面試流程以及如何準備技術面試,也包含了大量(超過200道)常見技術面試題題目以及解題思路。無論你打算進入國內企業還是外企,你都應該把這本書的題目練一遍,以找到技術面試的感覺(我在求職時就曾經專門搞了一塊白板,然後每二十分鐘一道題的練習,效果很不錯)。

延伸閱讀:

  • 編程之美:微軟技術面試心得:恐怕是國內技術面試第一書,這本書裏面的多數題目都曾經是國內IT企業面試的必問題目。這本書的缺點是它太舊而且被用濫了(以至於一些企業開始避免使用這本書上的題目)——但你可以把它當成一本算法趣題來讀;
  • 劍指Offer:名企面試官精講典型編程題:相對於東拼西湊的XX面試寶典,劍指Offer是一本少見的國產精品技術面試書籍,儘管這本書的技術面試題目不多(60餘道),但作者爲大多數題目都給出了不同方式的解法,並分析了這些解法之間的優劣,此外作者還以面試官的視角分析了技術面試的各個環節,從而幫助讀者把握技術面試;
  • 人人都有好工作:IT行業求職面試必讀:可以把它看做金領簡歷的補充閱讀——這本書的特點在於它給出了非常詳細的簡歷/求職信/電子郵件編寫技巧,而這正是不少國內程序員所缺乏的。

4. 英語寫作

The Only Grammar Book You'll Ever Need

詞彙量決定閱讀能力,語法決定寫作能力。計算機專業詞彙並不多,但精確性非常重要,因此每個程序員都應具備良好的英語語法,但程序員並不需要過於專業的英語語法——掌握常用語法並把它用對就可以。The Only Grammar Book You'll Ever Need正好可以滿足這個需求,儘管它篇幅不大(不足200頁),卻覆蓋了英語中的關鍵語法以及常見錯誤。把這本書讀兩遍,它會大幅度提高你的英語寫作能力。

風格的要素

既是最暢銷的英語寫作書籍,也是計算機書籍中引用最多的非計算機書籍。風格的要素用極其簡練的語言講述瞭如何進行嚴肅精確清楚的英語寫作。從這本書中,你不僅可以學到英語寫作,更可以學到一種嚴謹至簡的處事態度,而這正是專業開發所必需的。

延伸閱讀:

  • 牛津英語用法指南(第3版):全面且權威的英語用法指南,它覆蓋語法,詞彙,發音,以及修辭等方面,併兼顧口語和書面語,以幫助讀者掌握合理的英語用法(Proper English Usage)。不要被這本書的篇幅(1000多頁)嚇到——原書並沒有這麼厚,因爲這本書被翻譯成中文但又得保留原有的英文內容,所以它的篇幅幾乎翻了一倍。考慮到這本書使用的詞彙都很基礎,所以我認爲具有英語基礎的讀者直接閱讀原版(Practical English Usage)會更合適;
  • 寫作法寶:非虛構寫作指南(30週年紀念版):詳盡的非虛構(Non-Fiction)寫作指南,無論你要寫地方,技術,商務,運動,藝術,還是自傳,你都可以從這本書中找到珍貴的建議;
  • 中式英語之鑑:中國人使用英語最大的問題就是會把中式思維摻雜其中,從而形成囉裏囉嗦不倫不類的中式英語(Chinglish)。中式英語之鑑系統的探討了中式英語以及其成因,然後根據成因對中式英語進行歸類,並對每個類別給出了大量的實際案例以及修改建議。如果你想擺脫中式英語,那麼這本書是絕好的起點。

如何使用這個書單

學而不思則罔,思而不學則殆。

不憤不啓,不悱不發。舉一隅不以三隅反,則不復也。

不聞不若聞之,聞之不若見之,見之不若知之,知之不若行之,學至於行之而止矣。

來自他人的書單

它山之石,可以攻玉。我在本文最後給出其他中外優秀程序員的書單,以便參考&補充。

劉未鵬(暗時間作者)

以下同一條目下用“/”隔開的表示任選,當然也可以都讀。

  1. 編碼:隱匿在計算機軟硬件背後的語言
  2. 深入理解計算機系統 / Windows核心編程 / 程序員的自我修養
  3. 代碼大全 / 程序員修煉之道
  4. 編程珠璣 / 算法概論 / 算法設計 / 編程之美
  5. C程序設計語言
  6. C++程序設計語言 / C++程序設計原理與實踐 / Accelerated C++
  7. 計算機程序的構造與解釋
  8. 代碼整潔之道 / 實現模式
  9. 設計模式 / 敏捷軟件開發(原則模式與實踐)
  10. 重構

雲風(中國遊戲編程先行者,前網易遊戲部門資深程序員,簡悅創始人)

  1. C++編程思想
  2. Effective C++
  3. 深度探索C++對象模型
  4. C++語言的設計與演化
  5. C專家編程
  6. C陷阱與缺陷
  7. C語言接口與實現
  8. Lua程序設計
  9. 鏈接器和加載器
  10. COM本質論
  11. Windows核心編程
  12. 深入解析Windows操作系統
  13. 程序員修煉之道
  14. 代碼大全
  15. UNIX編程藝術
  16. 設計模式
  17. 代碼優化:有效使用內存
  18. 深入理解計算機系統
  19. 深入理解LINUX內核
  20. TCP/IP詳解

洪強寧(豆瓣技術總監)

  1. 代碼大全
  2. 人月神話
  3. 編碼:隱匿在計算機軟硬件背後的語言
  4. 計算機程序設計藝術
  5. 程序員修煉之道
  6. 設計模式
  7. 計算機程序的構造與解釋
  8. 重構
  9. C程序設計語言
  10. 算法導論

張崢(微軟亞洲研究院副院長)

  1. 算法概論
  2. Data Structure and Algorithms
  3. C程序設計語言
  4. UNIX操作系統設計
  5. 編譯原理
  6. 計算機體系結構:量化研究方法
  7. 當下的幸福
  8. 異類:不一樣的成功啓示錄

Jeff Atwood(Stackoverflow聯合創始人)

  1. 代碼大全
  2. 人月神話
  3. 點石成金:訪客至上的Web和移動可用性設計祕笈
  4. 快速軟件開發
  5. 人件
  6. The Design of Everyday Things
  7. 交互設計精髓
  8. The Inmates Are Running the Asylum
  9. GUI設計禁忌 2.0
  10. 編程珠璣
  11. 程序員修煉之道
  12. 精通正則表達式

Joel Spolsky(Stackoverflow聯合創始人)

軟件項目管理

  1. 人件
  2. 人月神話
  3. 快速軟件開發

編程技藝

  1. 代碼大全
  2. 程序員修煉之道

編程哲學

  1. 禪與摩托車維修藝術
  2. 哥德爾、艾舍爾、巴赫:集異璧之大成
  3. 建築模式語言

界面設計

  1. 點石成金:訪客至上的Web和移動可用性設計祕笈
  2. 交互設計精髓
  3. The Design of Everyday Things

資本運作

  1. 漫步華爾街

圖形設計

  1. 寫給大家看的設計書

思維方式

  1. 影響力
  2. Helplessness On Depression, Development and Death

編程入門

  1. 編碼:隱匿在計算機軟硬件背後的語言
  2. C程序設計語言

DHH(Ruby on Rails創始人)

  1. Smalltalk Best Practice Patterns
  2. 重構
  3. 企業應用架構模式
  4. 領域驅動設計
  5. 你的燈亮着嗎?發現問題的真正所在

參考

  1. 怎樣花兩年時間去面試一個人
  2. What is the single most influential book every programmer should read?
  3. Recommended Reading for Developers
  4. Book Reviews -- Joel Spolsky
  5. The five programming books that meant most to me

以上


作者:Lucida

原文鏈接:http://lucida.me/blog/developer-reading-list/


發佈了19 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章