優秀的程序員應該具有兩方面能力:程序員
良好的程序設計能力:算法
掌握經常使用的數據結構和算法(例如鏈表,棧,堆,隊列,排序和散列);編程
理解計算機科學的核心概念(例如計算機系統結構、操做系統、編譯原理和計算機網絡);服務器
熟悉至少兩門以上編程語言(例如C++,Java,C#,和Python);網絡
專業的軟件開發素養:數據結構
具有良好的編程實踐,可以編寫可測試(Testable),可擴展(Extensible),可維護(Maintainable)的代碼;數據結構和算法
把握客戶需求,按時交付客戶所須要的軟件產品;編程語言
理解現代軟件開發過程當中的核心概念(例如面向對象程序設計,測試驅動開發,持續集成,和持續交付等等)。學習
和其它能力同樣,程序設計能力和軟件開發素養源自項目經驗和書本知識。項目經驗因人而異(來自不一樣領域的程序員,項目差別會很大);但書本知識是相通的——尤爲是經典圖書,它們都可以拓寬程序員的視野,提升程序員的成長速度。測試
在過去幾年的學習和工做中,我閱讀了大量的程序設計/軟件開發書籍。隨着閱讀量的增加,我意識到:
經典書籍須要不斷被重讀——每一次重讀都會有新的體會;
書籍並不是讀的越多越好——大多數書籍只是經典書籍中的概念延伸(有時甚至是照搬);
意識到這兩點以後,我開始思考一個很功利的問題:如何從儘量少的書中,獲取儘量多的關鍵知識?換句話說:
優秀的程序員應該掌握哪些關鍵概念?
哪些書籍來能夠幫助程序員掌握這些關鍵概念?
這便是這篇文章的出發點——我試圖經過程序員必讀書單這篇文章來回答上面兩個問題。
標準
進入必讀書單以前,我先介紹下書單裏的書籍選擇標準和領域選擇標準。固然你也點擊這裏直接跳轉到書單開始閱讀。
書籍選擇標準
必讀:什麼是必讀書籍呢?若是學習某項技術有一本書不管如何都不能錯過,那麼這本書就是必讀書籍——例如Effective Java於Java,CLR via C#於C#;
注意我沒有使用「經典」這個詞,由於經典計算機書籍每每和計算機科學聯繫在一塊兒,並且經典每每須要10年甚至更長的時間進行考驗;
注重實踐,而非理論:因此這個書單不會包含過於原理性的書籍;
入門—必讀—延伸:必讀書籍的問題在於:1. 大多不適合入門;2. 不夠全面。考慮到沒有入門閱讀和延伸閱讀的閱讀列表是不完整的——因此書單中每一個關鍵概念都會由一本入門書籍,一本必讀書籍(有時入門書籍和必讀書籍是同一本),和若干延伸閱讀書籍所構成。
概念選擇標準
全面:全面覆蓋軟件開發中重要的概念;
通用:適用於每個程序員,和領域特定方向無關;
注重基礎,但不過於深刻:優秀的程序員須要良好的計算機科學基礎,但程序員並不必掌握過於深刻的計算機科學知識。以算法爲例,每一個程序員都應該掌握排序、鏈表、棧以及隊列這些基本數據結構和算法,但計算幾何、線性規劃和網絡流這些算法可能就不是每一個程序員都須要掌握的了;
經過這幾個標準,我把程序員應掌握的關鍵概念分爲程序設計,軟件開發,以及我的成長三大類,每一大類均由若干關鍵概念組成。
點個關注不迷路~C語言/C++/Linux服務器開發等技術點 持續爲你們分享~私信我回復「資料」有驚喜小彩蛋~