> 作者:[Lucida](http://lucida.me/about)
> * 微博:[@peng_gong](http://www.weibo.com/pegong/)
> * 豆瓣:[@figure9](http://www.douban.com/people/figure9/)
> 原文鏈接:[http://lucida.me/blog/developer-reading-list/](http://lucida.me/blog/developer-reading-list/)
本文把程序員所需掌握的關鍵知識總結為三大類19個關鍵概念,然后給出了掌握每個關鍵概念所需的入門書籍,必讀書籍,以及延伸閱讀。旨在成為最好最全面的程序員必讀書單。
## 前言
> Reading makes a full man; conference a ready man; and writing an exact man.
>
> Francis Bacon
優秀的程序員應該具備兩方面能力:
* **良好的[程序設計](http://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1)能力**:
* 掌握常用的數據結構和算法(例如鏈表,棧,堆,隊列,排序和散列);
* 理解計算機科學的核心概念(例如計算機系統結構、操作系統、編譯原理和計算機網絡);
* 熟悉至少兩門以上編程語言(例如C++,Java,C#,和Python);
* **專業的[軟件開發](http://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91)素養**:
* 具備良好的編程實踐,能夠編寫可測試(Testable),可擴展(Extensible),可維護(Maintainable)的代碼;
* 把握客戶需求,按時交付客戶所需要的軟件產品;
* 理解現代軟件開發過程中的核心概念(例如面向對象程序設計,測試驅動開發,持續集成,和持續交付等等)。
和其它能力一樣,[程序設計](http://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1)能力和[軟件開發](http://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91)素養源自項目經驗和書本知識。項目經驗因人而異(來自不同領域的程序員,項目差異會很大);但書本知識是相通的——尤其是經典圖書,它們都能夠拓寬程序員的視野,提高程序員的成長速度。
在過去幾年的學習和工作中,我閱讀了大量的程序設計/軟件開發書籍。隨著閱讀量的增長,我意識到:
>[info] * 經典書籍需要不斷被重讀——每一次重讀都會有新的體會;
> * 書籍并非讀的越多越好——大多數書籍只是經典書籍中的概念延伸(有時甚至是照搬);
意識到這兩點之后,我開始思考一個很[功利](http://zh.wikipedia.org/wiki/%E6%95%88%E7%9B%8A%E4%B8%BB%E7%BE%A9)的問題:**如何從盡可能少的書中,獲取盡可能多的關鍵知識?**換句話說:
* 優秀的程序員應該掌握哪些關鍵概念?
* 哪些書籍來可以幫助程序員掌握這些關鍵概念?
這即是這篇文章的出發點——我試圖通過[程序員必讀書單](http://lucida.me/blog/developer-reading-list/)這篇文章來回答上面兩個問題。