# 軟件開發
[TOC=2,2]
## 1\. 編程實踐
[](http://book.douban.com/subject/1173548/)
[Brian Kernighan](http://en.wikipedia.org/wiki/Brian_Kernighan)是這個星球上最好的計算機書籍作者:從上古時期的[Software Tools](http://www.amazon.cn/gp/product/020103669X/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=020103669X&linkCode=as2&creative=3132),到早期的[Unix編程環境](http://www.amazon.cn/gp/product/B00IYTQBYS/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00IYTQBYS&linkCode=as2&creative=3132)和[C程序設計語言](http://www.amazon.cn/gp/product/B0011425T8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011425T8&linkCode=as2&creative=3132),再到這本[程序設計實踐](http://book.douban.com/subject/1173548/),每本書都是**必讀**之作。
盡管程序設計實踐只有短短200余頁,但它使用精煉的代碼和簡要的原則覆蓋了程序設計的所有關鍵概念(包括編程風格,算法與數據結構,API設計,調試,測試,優化,移植,以及領域特定語言等概念)。如果你想快速掌握良好的編程實踐,或者你覺著900多頁的[代碼大全](http://www.amazon.cn/gp/product/B0061XKRXA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0061XKRXA&linkCode=as2&creative=3132)過于沉重,那么程序設計實踐是你的不二之選。我第一次讀這本書就被它簡潔的語言和優雅的代碼所吸引,以至于讀研時我買了三本程序設計實踐——一本放在學校實驗室,一本放在宿舍,一本隨身攜帶閱讀。我想我至少把它讀了十遍以上——每一次都有新的收獲。
[](http://www.amazon.cn/gp/product/B0061XKRXA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0061XKRXA&linkCode=as2&creative=3132)
無論在哪個版本的程序員必讀書單,[代碼大全](http://www.amazon.cn/gp/product/B0061XKRXA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0061XKRXA&linkCode=as2&creative=3132)都會高居首位。和其它程序設計書籍不同,[代碼大全](http://www.amazon.cn/gp/product/B0061XKRXA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0061XKRXA&linkCode=as2&creative=3132)用通俗清晰的語言覆蓋了軟件構建(Software Construction)中各個層次上**所有**的重要概念——從變量命名到類型設計,從控制循環到代碼結構,從測試和調試到構建和集成,[代碼大全](http://www.amazon.cn/gp/product/B0061XKRXA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0061XKRXA&linkCode=as2&creative=3132)可謂無所不包,你可以把這本書看作為程序員的一站式(Once and for all)閱讀手冊。更珍貴的是,[代碼大全](http://www.amazon.cn/gp/product/B0061XKRXA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0061XKRXA&linkCode=as2&creative=3132)在每一章末尾都給出了價值很高的參考書目(參考我之前的[如何閱讀書籍](http://lucida.me/blog/on-reading-books/)一文),如果你是一個初出茅廬的程序員,[代碼大全](http://www.amazon.cn/gp/product/B0061XKRXA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0061XKRXA&linkCode=as2&creative=3132)是絕好的閱讀起點。
**延伸閱讀:**
* [編寫可讀代碼的藝術](http://www.amazon.cn/gp/product/B008B4DTG4/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B008B4DTG4&linkCode=as2&creative=3132):專注于代碼可讀性(Code Readability),這本書來自Google的兩位工程師對[Google Code Readability](http://www.quora.com/What-is-Googles-internal-code-review-policy-process)的總結。它給出了大量命名,注釋,代碼結構,以及API設計等日常編碼的最佳實踐,并包含了很多看似細微但卻可以顯著提升代碼可讀性的編程技巧。這本書的翻譯還不錯,但如果你想體會書中的英語幽默(例如Tyrannosaurus——Stegosaurus——Thesaurus),建議閱讀它的[英文影印版](http://www.amazon.cn/gp/product/B008IBND20/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B008IBND20&linkCode=as2&creative=3132);
* [卓有成效的程序員](http://www.amazon.cn/gp/product/B001XCWFOI/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B001XCWFOI&linkCode=as2&creative=3132):專注于生產效率(Productivity),它既包含源自作者多年經驗的高生產率原則,也包含大量的提高生產率的小工具,每個追求高生產率的程序員都應該閱讀這本書;
* [UNIX編程藝術](http://www.amazon.cn/gp/product/B008Z1IEQ8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B008Z1IEQ8&linkCode=as2&creative=3132):專注于程序設計哲學,這本書首先總結出包括模塊化,清晰化,可組合,可分離等17個Unix程序設計哲學,接下來通過Unix歷史以及各種Unix編程工具展示了這些原則的應用。盡管個人覺的這本書有些過度拔高Unix且過度貶低Windows和M$,但書中的Unix設計哲學非常值得借鑒。
## 2\. 面向對象程序設計
[](http://www.amazon.cn/gp/product/B0011FBU34/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011FBU34&linkCode=as2&creative=3132)
無論是在Amazon還是在Google上搜索設計模式相關書籍,[Head First設計模式](http://www.amazon.cn/gp/product/B0011FBU34/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011FBU34&linkCode=as2&creative=3132)都會排在首位——它使用風趣的語言和詼諧的圖示講述了觀察者,裝飾者,抽象工廠,和單例等關鍵設計模式,使得初學者可以迅速的理解并掌握設計模式。[Head First設計模式](http://www.amazon.cn/gp/product/B0011FBU34/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011FBU34&linkCode=as2&creative=3132)在Amazon上[好評如潮](http://www.amazon.com/Head-First-Design-Patterns-Freeman/product-reviews/0596007124/),就連設計模式原書作者[Erich Gamma](http://en.wikipedia.org/wiki/Erich_Gamma)都對它給出了很高的評價。
需要注意,[Head First設計模式](http://www.amazon.cn/gp/product/B0011FBU34/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011FBU34&linkCode=as2&creative=3132)是非常好的設計模式入門書,但**千萬不要**把這本書作為學習設計模式的唯一的書——是的,Head First設計模式擁有風趣的語言和詼諧的例子,但它既缺乏**實際**的工程范例,也沒有給出設計模式的應用/適用場景。我個人建議是在讀過這本書之后立即閱讀[“四人幫”](http://en.wikipedia.org/wiki/Gang_of_Four_(disambiguation))的[設計模式](http://www.amazon.cn/gp/product/B001130JN8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B001130JN8&linkCode=as2&creative=3132)或[Bob大叔](http://en.wikipedia.org/wiki/Robert_Cecil_Martin)的[敏捷軟件開發](http://www.amazon.cn/gp/product/B00116MMA8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00116MMA8&linkCode=as2&creative=3132),以便理解設計模式在實際中的應用。
[](http://www.amazon.cn/gp/product/B001130JN8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B001130JN8&linkCode=as2&creative=3132)
[設計模式](http://www.amazon.cn/gp/product/B001130JN8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B001130JN8&linkCode=as2&creative=3132)作為設計模式領域的開山之作,Erich Gamma,Richard Helm,Ralph Johnson等四位作者將各個領域面向對象程序開發的經驗總結成三大類23種模式,并給出了每個模式的使用場景,變體,不足,以及如何克服這些不足。這本書行文嚴謹緊湊(四位作者都是PhD),并且代碼源自實際項目,屬于設計模式領域的必讀之作。
需要注意:[設計模式](http://www.amazon.cn/gp/product/B001130JN8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B001130JN8&linkCode=as2&creative=3132)**不適合**初學者閱讀——它更像是一篇博士論文而非技術書籍,加上它的范例都具有很強的領域背景(諸如GUI窗口系統和富文本編輯器),缺乏實際經驗的程序員很難理解這本書。
**延伸閱讀:**
* [敏捷軟件開發(原則模式與實踐)](http://www.amazon.cn/gp/product/B00116MMA8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00116MMA8&linkCode=as2&creative=3132):盡管標題帶有“敏捷”,但這本書實際是一本面向對象程序設計讀物——[Bob大叔](http://en.wikipedia.org/wiki/Robert_Cecil_Martin)通過豐富的例子講解設計模式的應用和[SOLID面向對象設計原則](http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)),如果你覺著[設計模式](http://www.amazon.cn/gp/product/B001130JN8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B001130JN8&linkCode=as2&creative=3132)過于晦澀,那么你完全可以從這本書開始學習。這本書使用Java作為講解語言,它也有對應的[C#版本](http://www.amazon.cn/gp/product/B00ACXX034/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00ACXX034&linkCode=as2&creative=3132);
* [代碼整潔之道](http://www.amazon.cn/gp/product/B0031M9GHC/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0031M9GHC&linkCode=as2&creative=3132):同樣是[Bob大叔](http://en.wikipedia.org/wiki/Robert_Cecil_Martin)的作品,這本書教導讀者使用面向對象+敏捷開發原則編寫清晰可維護的代碼;
* [企業應用架構模式](http://www.amazon.cn/gp/product/B003LBSRDM/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B003LBSRDM&linkCode=as2&creative=3132):這本書專注于架構,作者[Martin Fowler](http://en.wikipedia.org/wiki/Martin_Fowler)針對企業應用的特點(諸如持久化數據,多人訪問,操作數據的界面以及復雜的業務邏輯),總結出若干企業架構模式,以便程序員構建強大且可擴展的企業應用。
## 3\. 重構
[](http://book.douban.com/subject/4262627/)
任何產品代碼都不是一蹴而就,而是在反復不斷的修改中進化而來。[重構](http://book.douban.com/subject/4262627/)正是這樣一本介紹如何改進代碼的書籍——如何在保持代碼行為的基礎上,提升代碼的質量(這也是重構的定義)。
我見過很多程序員,他們經常聲稱自己在重構代碼,但他們實際只做了第二步(提升代碼的質量),卻沒有保證第一步(保持代碼行為),因此他們所謂的重構往往會適得其反——破壞現有代碼或是引入新bug。這也是我推薦[重構](http://book.douban.com/subject/4262627/)這本書的原因——它既介紹糟糕代碼的特征(Bad smell)和改進代碼的方法,也給出了重構的完整流程——1\. 編寫單元測試保持(Preserve)程序行為;2\. 重構代碼;3\. 保證單元測試通過。[重構](http://book.douban.com/subject/4262627/)還引入了一套重構術語(諸如封裝字段,內聯方法,和字段上移),以便程序員之間交流。只有理解了這三個方面,才能算是理解重構。
[](http://www.amazon.cn/gp/product/B00KMJ2Q1U/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00KMJ2Q1U&linkCode=as2&creative=3132)
這里再重復一遍重構的定義——**在保持代碼行為的基礎上,提升代碼的質量。**[重構](http://book.douban.com/subject/4262627/)專注于第二步,即如何提升代碼的質量,而[修改代碼的藝術](http://www.amazon.cn/gp/product/B00KMJ2Q1U/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00KMJ2Q1U&linkCode=as2&creative=3132)專注于第一步,即如何保持代碼的行為。
提升代碼質量并不困難,但保持代碼行為就難多了,尤其是對沒有測試的遺留代碼(Legacy Code)而言——你需要首先引入測試,但遺留代碼往往可測試性(Testability)很差,這時你就需要把代碼變的可測試。[修改代碼的藝術](http://www.amazon.cn/gp/product/B00KMJ2Q1U/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00KMJ2Q1U&linkCode=as2&creative=3132)包含大量的實用建議,用來把代碼變的可測試(Testable),從而使重構變為可能,使提高代碼質量變為可能。
**延伸閱讀:**
* [重構與模式](http://www.amazon.cn/gp/product/B00A9YD7A2/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00A9YD7A2&linkCode=as2&creative=3132):這本書的中文書名存在誤導,它的原書書名是Refactoring to Patterns——通過重構,把模式引入代碼。這本書闡述了重構和設計模式之間的關系,使得程序員可以在更高的層次上思考重構,進行重構。
## 4\. 軟件測試
[](http://www.amazon.cn/gp/product/0201796198/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0201796198&linkCode=as2&creative=3132)
關于軟件測試的書籍很多,但很少有一本測試書籍能像[How to Break Software](http://www.amazon.cn/gp/product/0201796198/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0201796198&linkCode=as2&creative=3132)這般既有趣又實用。不同于傳統的軟件測試書籍(往往空話連篇,無法直接應用),[How to Break Software](http://www.amazon.cn/gp/product/0201796198/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0201796198&linkCode=as2&creative=3132)非常實際——它從程序員的心理出發,分析軟件錯誤/Bug最可能產生的路徑,然后針對這些路徑進行**殘酷**的測試,以保證軟件質量。
我在第一次閱讀這本書時大呼作者太過“殘忍”——連這些刁鉆詭異的測試招數都能想出來。但這種毫不留情(Relentless)的測試風格正是每個專業程序員所應具備的心態。
**注意**:如果你是一個測試工程師,那么在閱讀這本書前請三思——因為閱讀它之后你會讓你身邊的程序員苦不堪言,甚至連掐死你的心都有 :-D。
[](http://www.amazon.cn/gp/product/0131495054/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0131495054&linkCode=as2&creative=3132)
[How to Break Software](http://www.amazon.cn/gp/product/0201796198/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0201796198&linkCode=as2&creative=3132)注重黑盒測試,而這本[xUnit Test Patterns](http://www.amazon.cn/gp/product/0131495054/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0131495054&linkCode=as2&creative=3132)則注重白盒測試。正如書名所示,[xUnit Test Patterns](http://www.amazon.cn/gp/product/0131495054/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0131495054&linkCode=as2&creative=3132)覆蓋了單元測試的每個方面:從如何編寫良好的單元測試,到如何設計可測試(Testable)的軟件,再到如何重構測試——可以把它看作為單元測試的百科全書。
**延伸閱讀:**
* [Practical Unit Testing with JUnit and Mockito](http://www.amazon.com/Practical-Unit-Testing-JUnit-Mockito/dp/8393489393/):盡管[xUnit Test Patterns](http://www.amazon.cn/gp/product/0131495054/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0131495054&linkCode=as2&creative=3132)覆蓋了單元測試的方方面面,但它的問題在于不夠與時俱進(07年出版)。[Practical Unit Testing](http://www.amazon.com/Practical-Unit-Testing-JUnit-Mockito/dp/8393489393/)彌補了這個缺陷——它詳細介紹了如何通過測試框架[JUnit](http://junit.org/)和Mock框架[Mockito](http://code.google.com/p/mockito/)編寫良好的單元測試,并給出了大量優秀單元測試的原則;
* [單元測試的藝術(第2版)](http://www.amazon.cn/gp/product/B00MBQMFLI/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00MBQMFLI&linkCode=as2&creative=3132):可以把這本書看作為前一本書的.Net版,適合.Net程序員;
* [Google軟件測試之道](http://www.amazon.cn/gp/product/B00FH36R6G/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00FH36R6G&linkCode=as2&creative=3132):這本書詳細介紹了Google如何測試軟件——包括Google的軟件測試流程以及Google軟件測試工程師的日常工作/職業發展。需要注意的是:這本書中的測試流程在國內很可能行不通(國內企業缺乏像Google那般強大的基礎設施(Infrastructure)),但它至少可以讓國內企業有一個可以效仿的目標;
* [探索式軟件測試](http://www.amazon.cn/gp/product/B003JBIV0S/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B003JBIV0S&linkCode=as2&creative=3132):[James Whittaker](http://blogs.msdn.com/b/jw_on_tech/)的另一本測試著作,不同于傳統的黑盒/白盒測試,這本書創造性的把測試比喻為“探索”(Exploration),然后把不同的探索方式對應到不同的測試方式上,以便盡早發現更多的軟件錯誤/Bug。
## 5\. 項目管理
[](http://www.amazon.cn/gp/product/B00BLZMG8W/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00BLZMG8W&linkCode=as2&creative=3132)
很多程序員都向往成為橫掃千軍(One-man Army)式的“編程英雄”,但卓越的軟件并非一人之力,而是由團隊合力而成。[極客與團隊](http://www.amazon.cn/gp/product/B00BLZMG8W/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00BLZMG8W&linkCode=as2&creative=3132)就是這樣一本寫給程序員的如何在團隊中工作的絕好書籍,它圍繞著HRT三大原則(Humility謙遜,Respect尊重,和Trust信任),系統的介紹了如何融入團隊,如何打造優秀的團隊,如何領導團隊,以及如何應對團隊中的害群之馬(Poisonous People)。這本書實用性極強,以至于Python之父[Guido van Rossum](http://en.wikipedia.org/wiki/Guido_van_Rossum)都盛贊這本書*“說出了我一直在做但總結不出來的東西”*。
[](http://www.amazon.cn/gp/product/B0011C2P7W/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011C2P7W&linkCode=as2&creative=3132)
盡管[人月神話](http://www.amazon.cn/gp/product/B0011C2P7W/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011C2P7W&linkCode=as2&creative=3132)成書于40年前,但它仍是軟件項目管理**最**重要的書籍。[人月神話](http://www.amazon.cn/gp/product/B0011C2P7W/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011C2P7W&linkCode=as2&creative=3132)源自作者[Fred Brooks](http://en.wikipedia.org/wiki/Fred_Brooks)領導并完成[System/360](http://en.wikipedia.org/wiki/IBM_System/360)和[OS/360](http://en.wikipedia.org/wiki/OS/360_and_successors)這兩個即是放到現在也是巨型軟件項目的里程碑項目的經驗總結。它覆蓋了軟件項目各個方面的關鍵概念:從工期管理([Brooks定律](http://en.wikipedia.org/wiki/Brooks%27s_law))到團隊建設([外科團隊](http://en.wikipedia.org/wiki/The_Mythical_Man-Month#The_surgical_team)),從程序設計(編程的本質是使用正確的數據結構)到架構設計([概念完整性](http://en.wikipedia.org/wiki/The_Mythical_Man-Month#Conceptual_integrity)),從原型設計(Plan to Throw one away)到團隊交流(形式化文檔+會議)。令人驚訝的是,即便40年之后,[人月神話](http://www.amazon.cn/gp/product/B0011C2P7W/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011C2P7W&linkCode=as2&creative=3132)中的關鍵概念(包括焦油坑,[Brooks定律](http://en.wikipedia.org/wiki/Brooks%27s_law),[概念完整性](http://en.wikipedia.org/wiki/The_Mythical_Man-Month#Conceptual_integrity),[外科團隊](http://en.wikipedia.org/wiki/The_Mythical_Man-Month#The_surgical_team),[第二版效應](http://en.wikipedia.org/wiki/The_Mythical_Man-Month#The_second-system_effect)等等)依然適用,而軟件開發的[核心復雜度](http://en.wikipedia.org/wiki/Essential_complexity)仍然沒有得到解決([沒有銀彈](http://en.wikipedia.org/wiki/The_Mythical_Man-Month#No_silver_bullet))。
**延伸閱讀:**
* [人件(原書第3版)](http://www.amazon.cn/gp/product/B00MO7R1SG/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00MO7R1SG&linkCode=as2&creative=3132):從人的角度分析軟件項目。[人件](http://www.amazon.cn/gp/product/B00MO7R1SG/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00MO7R1SG&linkCode=as2&creative=3132)從雇傭正確的人,創建健康的工作環境,以及打造高效的開發團隊等角度闡述了如何改善人,從而改善軟件項目;
* [門后的秘密:卓越管理的故事](http://www.amazon.cn/gp/product/B00CBBKRQ8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00CBBKRQ8&linkCode=as2&creative=3132):這本書生動的再現了軟件項目管理工作的場景,并給出了各種實用管理技巧,如果你有意轉向管理崗位,這本書不容錯過;
* [大教堂與集市](http://www.amazon.cn/gp/product/B00KQDTZ4S/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00KQDTZ4S&linkCode=as2&creative=3132):這本書從黑客的歷史說起,系統而又風趣的講述了開源運動的理論和實踐,以及開源軟件項目是如何運作并發展的。了解開源,從這本書開始。
## 6\. 專業開發
[](http://www.amazon.cn/gp/product/B004GV08CY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004GV08CY&linkCode=as2&creative=3132)
不要被庸俗的譯名迷惑,[程序員修煉之道](http://www.amazon.cn/gp/product/B004GV08CY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004GV08CY&linkCode=as2&creative=3132)是一本價值極高的程序員成長手冊。這本書并不局限于特定的編程語言或框架,而是提出了一套切實可行的實效(Pragmatic)開發哲學,并通過程序設計,測試,編程工具,以及項目管理等方面的實例展示了如何應用這套開發哲學,從而使得程序員更加高效專業。有人把這本書稱之為迷你版[代碼大全](http://www.amazon.cn/gp/product/B0061XKRXA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0061XKRXA&linkCode=as2&creative=3132)——[代碼大全](http://www.amazon.cn/gp/product/B0061XKRXA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0061XKRXA&linkCode=as2&creative=3132)給出了大量的優秀程序設計實踐,偏向術;而[程序員修煉之道](http://www.amazon.cn/gp/product/B004GV08CY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004GV08CY&linkCode=as2&creative=3132)給出了程序設計實踐背后的思想,注重道。
[](http://www.amazon.cn/gp/product/B0098NRHHY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0098NRHHY&linkCode=as2&creative=3132)
[程序員修煉之道](http://www.amazon.cn/gp/product/B004GV08CY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004GV08CY&linkCode=as2&creative=3132)指出了**如何**成為專業程序員,這本[程序員職業素養](http://www.amazon.cn/gp/product/B0098NRHHY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0098NRHHY&linkCode=as2&creative=3132)則指出了專業程序員應該是**什么**樣子——承擔責任;知道自己在做什么;知道何時說不/何時說是;在正確的時間編寫正確的代碼;懂得自我時間管理和工期預估;知道如何應對壓力。如果你想成為專業程序員(Professional Developer)(而不是碼農(Code Monkey)),這本書會為你指明前進的方向。
**延伸閱讀:**
* [高效程序員的45個習慣](http://www.amazon.cn/gp/product/B00OA9L3NU/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00OA9L3NU&linkCode=as2&creative=3132):“敏捷”版的[程序員修煉之道](http://www.amazon.cn/gp/product/B004GV08CY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004GV08CY&linkCode=as2&creative=3132),可以把這本書作為[程序員修煉之道](http://www.amazon.cn/gp/product/B004GV08CY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004GV08CY&linkCode=as2&creative=3132)的補充;
* [精益創業](http://www.amazon.cn/gp/product/B008MIFWJG/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B008MIFWJG&linkCode=as2&creative=3132):盡管這是一本講如何創業的書,但其中的精益生產,最小價值產品,以及構建-度量-學習循環都值得程序員借鑒。
## 7\. 大師之言
[](http://www.amazon.cn/gp/product/B007ED88CI/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B007ED88CI&linkCode=as2&creative=3132)
[奇思妙想:15位計算機天才及其重大發現](http://www.amazon.cn/gp/product/B007ED88CI/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B007ED88CI&linkCode=as2&creative=3132)是一本極具眼光的技術訪談書籍——在這本書訪談的15位計算機科學家中,竟出現了12位[圖靈獎](http://zh.wikipedia.org/wiki/%E5%9B%BE%E7%81%B5%E5%A5%96)獲得者——要知道圖靈獎從1966年設獎到現在也只有六十幾位獲獎者而已。
[奇思妙想](http://www.amazon.cn/gp/product/B007ED88CI/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B007ED88CI&linkCode=as2&creative=3132)把計算機科學分為四大領域:編程語言;算法;架構;人工智能。并選取了每個領域下最具代表性的計算機科學家進行訪談。因為這些計算機科學家都是其所在領域的開拓者,因此他們能給出常人無法給出的深刻見解。通過這本書,你可以了解前三十年的計算機科學的發展歷程——計算機科學家做了什么,而計算機又能做到/做不到什么。從而避免把時間浪費在前人已經解決的問題(或者根本無法解決的問題)上面。
[](http://www.amazon.cn/gp/product/B00QA7GA2Y/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00QA7GA2Y&linkCode=as2&creative=3132)
同樣是訪談錄,同樣訪談15個人,[編程人生](http://www.amazon.cn/gp/product/B00QA7GA2Y/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00QA7GA2Y&linkCode=as2&creative=3132)把重點放在程序員(Coders at work)上。它從各個領域選取了15位頂尖的程序員,這些程序員既包括[Ken Thompson](http://en.wikipedia.org/wiki/Ken_Thompson)和[Jamie Zawinski](http://en.wikipedia.org/wiki/Jamie_Zawinski)這些老牌Unix黑客,也包括[Brad Fitzpatrick](http://en.wikipedia.org/wiki/Brad_Fitzpatrick)這樣的80后新生代,還包括[Frances Allen](http://en.wikipedia.org/wiki/Frances_E._Allen)和[Donald Knuth](http://en.wikipedia.org/wiki/Donald_Knuth)這樣的計算機科學家。這種多樣性(Diversity)使得[編程人生](http://www.amazon.cn/gp/product/B00QA7GA2Y/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00QA7GA2Y&linkCode=as2&creative=3132)兼具嚴謹性和趣味性,無論你是什么類型的程序員,都能從中受益良多。
**延伸閱讀:**
* [圖靈和ACM圖靈獎(1966-2011)](http://www.amazon.cn/gp/product/B008G80O9K/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B008G80O9K&linkCode=as2&creative=3132):通過圖靈獎介紹整個計算機科學發展史,非常難得的國產精品圖書;
* [編程大師訪談錄](http://www.amazon.cn/gp/product/B00ALPRKMA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00ALPRKMA&linkCode=as2&creative=3132):可以把這本書看作為二十年前的[編程人生](http://www.amazon.cn/gp/product/B00QA7GA2Y/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00QA7GA2Y&linkCode=as2&creative=3132),被訪談者都是當時叱咤風云的人物(例如微軟的創造者[Bill Gates](http://en.wikipedia.org/wiki/Bill_Gates),Macintosh的發明者[Jeff Raskin](http://en.wikipedia.org/wiki/Jef_Raskin),以及Adobe的創始人[John Warnock](http://en.wikipedia.org/wiki/John_Warnock)等等)。有趣的是這本書中大量的經驗和建議到如今依然適用;
* [編程大師智慧](http://www.amazon.cn/gp/product/B00451BP72/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00451BP72&linkCode=as2&creative=3132):類似于[編程人生](http://www.amazon.cn/gp/product/B00QA7GA2Y/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00QA7GA2Y&linkCode=as2&creative=3132),不同的是被訪談者都是編程語言的設計者——這本書覆蓋了除C語言以外的幾乎所有主流編程語言。通過這本書,你可以從中學到編程語言背后的設計思想——編程語言為什么要被設計成這樣,是什么促使設計者要在語言中加入這個特性(或拒絕那個特性)。從而提升對編程語言的理解。
## 8\. 界面設計
[](http://www.amazon.cn/gp/product/B00KQBLI5E/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00KQBLI5E&linkCode=as2&creative=3132)
書如其名,[寫給大家看的設計書](http://www.amazon.cn/gp/product/B00KQBLI5E/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00KQBLI5E&linkCode=as2&creative=3132)是一本面向初學者的快速設計入門。它覆蓋了版式,色彩,和字體這三個設計中的關鍵元素,并創造性的為版式設計總結出CRAP四大原則(Contrast對比,Repetition重復,Alignment對齊,Proximity親密)。全書使用豐富生動的范例告訴讀者什么是好的設計,什么是不好的設計,使得即便是對設計一無所知的人,也可以從這本書快速入門。
[](http://www.amazon.cn/gp/product/B00MFHRAK4/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00MFHRAK4&linkCode=as2&creative=3132)
[寫給大家看的設計書](http://www.amazon.cn/gp/product/B00KQBLI5E/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00KQBLI5E&linkCode=as2&creative=3132)強調實踐,即**如何**做出好的設計;[認知與設計:理解UI設計準則](http://www.amazon.cn/gp/product/B00MFHRAK4/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00MFHRAK4&linkCode=as2&creative=3132)強調理論,即**為什么**我們會接受這樣的設計而反感那樣的設計。如果你想要搞清楚設計背后的心理學知識,但又不想閱讀大部頭的心理學著作,那么[認知與設計](http://www.amazon.cn/gp/product/B00MFHRAK4/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00MFHRAK4&linkCode=as2&creative=3132)是你的首選。
**延伸閱讀:**
* [GUI設計禁忌 2.0](http://www.amazon.cn/gp/product/0123706432/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0123706432&linkCode=as2&creative=3132):這本書指出了GUI設計的原則和常見誤區,然后通過具體范例指出了如何避免這些誤區。如果你的工作涉及到用戶界面,那么這本書會為你減少很多麻煩;
* [界面設計模式(第2版)](http://www.amazon.cn/gp/product/B00EV562SY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00EV562SY&linkCode=as2&creative=3132):這本書將用戶界面中的常見元素/行為組織成彼此關聯的模式,以便讀者理解并舉一反三,從而將其運用到自己的應用中;
* [移動應用UI設計模式](http://www.amazon.cn/gp/product/B00SFZGX08/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00SFZGX08&linkCode=as2&creative=3132):類似于[界面設計模式](http://www.amazon.cn/gp/product/B00EV562SY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00EV562SY&linkCode=as2&creative=3132),但面向移動平臺。它給出了iOS,Android,以及Windows Phones上常用的90余種界面設計模式,從而使得你不必把這些平臺的應用挨個玩一遍也可以掌握各個平臺的設計精髓。如果你主攻Android平臺,那么[Android應用UI設計模式](http://www.amazon.cn/gp/product/B00GU73RHA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00GU73RHA&linkCode=as2&creative=3132)會是更好的選擇;
* [配色設計原理](http://www.amazon.cn/gp/product/B0030IMDUY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0030IMDUY&linkCode=as2&creative=3132)和[版式設計原理](http://www.amazon.cn/gp/product/B0011C25KY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011C25KY&linkCode=as2&creative=3132):如果你讀過[寫給大家看的設計書](http://www.amazon.cn/gp/product/B00KQBLI5E/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00KQBLI5E&linkCode=as2&creative=3132)之后想繼續深入學習設計,這兩本書是不錯的起點。
## 9\. 交互設計
[](http://www.amazon.cn/gp/product/B00ES8JL8W/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00ES8JL8W&linkCode=as2&creative=3132)
書如其名,[通用設計法則](http://www.amazon.cn/gp/product/B00ES8JL8W/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00ES8JL8W&linkCode=as2&creative=3132)給出了重要的125個設計原則,并用簡練的語言和范例展示了這些原則的實際應用。每個原則都有對應的參考文獻,以便讀者進一步學習。我之所以推薦這本書,是因為:1\. 程序員需要對設計有全面的認識;2\. 程序員并不需要知道這些設計原則是怎么來的,知道怎么用即可。這本書很好的滿足了這兩個要求。
[](http://www.amazon.cn/gp/product/B007Q2XXXG/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B007Q2XXXG&linkCode=as2&creative=3132)
[交互設計精髓](http://www.amazon.cn/gp/product/B007Q2XXXG/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B007Q2XXXG&linkCode=as2&creative=3132)是交互設計領域的圣經級著作。交互設計專家(以及VB之父)[Alan Cooper](http://en.wikipedia.org/wiki/Alan_Cooper)在這本書中詳細介紹了交互設計的原則,流程,以及方法,然后通過各種范例(主要來自桌面系統)展示了如何應用這些原則。
需要注意的是這本書的[第4版](http://www.amazon.cn/gp/product/1118766571/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=1118766571&linkCode=as2&creative=3132)已經出版,它在第三版的基礎上增加了移動設計以及Web設計等內容。
**延伸閱讀:**
* [The Design of Everyday Things](http://www.amazon.cn/gp/product/0465050654/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0465050654&linkCode=as2&creative=3132):交互設計領域的另一本經典之作,它通過解讀人類行動背后的心理活動,展示了設計問題的根源,并給出了一系列方法用以解決設計問題(需要注意,盡管這本書有中譯版,但中譯版對應的是02年的舊版,而非13年的新版);
* [The Inmates Are Running the Asylum](http://www.amazon.cn/gp/product/0672326140/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0672326140&linkCode=as2&creative=3132):[Alan Cooper](http://en.wikipedia.org/wiki/Alan_Cooper)的另一本經典,這本書非常辛辣的指出讓不具備人機交互知識的程序員直接編寫面向用戶的軟件就像讓精神病人管理瘋人院(The Inmates Are Running the Asylum),然后給出了一套交互設計流程以挽救這個局面;
* [簡約至上:交互式設計四策略](http://www.amazon.cn/gp/product/B004I91HCY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004I91HCY&linkCode=as2&creative=3132):專注于把產品變的更加簡單易用。作者通過刪除,組織,隱藏,和轉移這四個策略,展示了如何創造出簡約優質的用戶體驗。