
優(yōu)秀的程序員應(yīng)該具備兩方面能力:
良好的程序設(shè)計(jì)能力:
掌握常用的數(shù)據(jù)結(jié)構(gòu)和算法(例如鏈表,棧,堆,隊(duì)列,排序和散列);
理解計(jì)算機(jī)科學(xué)的核心概念(例如計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)、操作系統(tǒng)、編譯原理和計(jì)算機(jī)網(wǎng)絡(luò));
熟悉至少兩門(mén)以上編程語(yǔ)言(例如C++,Java,C#,和Python);
專業(yè)的軟件開(kāi)發(fā)素養(yǎng):
具備良好的編程實(shí)踐,能夠編寫(xiě)可測(cè)試(Testable),可擴(kuò)展(Extensible),可維護(hù)(Maintainable)的代碼;
把握客戶需求,按時(shí)交付客戶所需要的軟件產(chǎn)品;
理解現(xiàn)代軟件開(kāi)發(fā)過(guò)程中的核心概念(例如面向?qū)ο蟪绦蛟O(shè)計(jì),測(cè)試驅(qū)動(dòng)開(kāi)發(fā),持續(xù)集成,和持續(xù)交付等等)。
和其它能力一樣,程序設(shè)計(jì)能力和軟件開(kāi)發(fā)素養(yǎng)源自項(xiàng)目經(jīng)驗(yàn)和書(shū)本知識(shí)。項(xiàng)目經(jīng)驗(yàn)因人而異(來(lái)自不同領(lǐng)域的程序員,項(xiàng)目差異會(huì)很大);但書(shū)本知識(shí)是相通的——尤其是經(jīng)典圖書(shū),它們都能夠拓寬程序員的視野,提高程序員的成長(zhǎng)速度。
在過(guò)去幾年的學(xué)習(xí)和工作中,我閱讀了大量的程序設(shè)計(jì)/軟件開(kāi)發(fā)書(shū)籍。隨著閱讀量的增長(zhǎng),我意識(shí)到:
經(jīng)典書(shū)籍需要不斷被重讀——每一次重讀都會(huì)有新的體會(huì);
書(shū)籍并非讀的越多越好——大多數(shù)書(shū)籍只是經(jīng)典書(shū)籍中的概念延伸(有時(shí)甚至是照搬);
意識(shí)到這兩點(diǎn)之后,我開(kāi)始思考一個(gè)很功利的問(wèn)題:如何從盡可能少的書(shū)中,獲取盡可能多的關(guān)鍵知識(shí)?換句話說(shuō):
優(yōu)秀的程序員應(yīng)該掌握哪些關(guān)鍵概念?
哪些書(shū)籍來(lái)可以幫助程序員掌握這些關(guān)鍵概念?
這即是這篇文章的出發(fā)點(diǎn)——我試圖通過(guò)程序員必讀書(shū)單這篇文章來(lái)回答上面兩個(gè)問(wèn)題。
標(biāo)準(zhǔn)
進(jìn)入必讀書(shū)單之前,我先介紹下書(shū)單里的書(shū)籍選擇標(biāo)準(zhǔn)和領(lǐng)域選擇標(biāo)準(zhǔn)。當(dāng)然你也點(diǎn)擊這里直接跳轉(zhuǎn)到書(shū)單開(kāi)始閱讀。
書(shū)籍選擇標(biāo)準(zhǔn)
必讀:什么是必讀書(shū)籍呢?如果學(xué)習(xí)某項(xiàng)技術(shù)有一本書(shū)無(wú)論如何都不能錯(cuò)過(guò),那么這本書(shū)就是必讀書(shū)籍——例如Effective Java于Java,CLR via C#于C#;
注意我沒(méi)有使用“經(jīng)典”這個(gè)詞,因?yàn)?b>經(jīng)典計(jì)算機(jī)書(shū)籍往往和計(jì)算機(jī)科學(xué)聯(lián)系在一起,而且經(jīng)典往往需要10年甚至更長(zhǎng)的時(shí)間進(jìn)行考驗(yàn);
注重實(shí)踐,而非理論:所以這個(gè)書(shū)單不會(huì)包含過(guò)于原理性的書(shū)籍;
入門(mén)—必讀—延伸:必讀書(shū)籍的問(wèn)題在于:1. 大多不適合入門(mén);2. 不夠全面??紤]到?jīng)]有入門(mén)閱讀和延伸閱讀的閱讀列表是不完整的——所以書(shū)單中每個(gè)關(guān)鍵概念都會(huì)由一本入門(mén)書(shū)籍,一本必讀書(shū)籍(有時(shí)入門(mén)書(shū)籍和必讀書(shū)籍是同一本),和若干延伸閱讀書(shū)籍所構(gòu)成。
概念選擇標(biāo)準(zhǔn)
全面:全面覆蓋軟件開(kāi)發(fā)中重要的概念;
通用:適用于每一個(gè)程序員,和領(lǐng)域特定方向無(wú)關(guān);
注重基礎(chǔ),但不過(guò)于深入:優(yōu)秀的程序員需要良好的計(jì)算機(jī)科學(xué)基礎(chǔ),但程序員并沒(méi)必要掌握過(guò)于深入的計(jì)算機(jī)科學(xué)知識(shí)。以算法為例,每個(gè)程序員都應(yīng)該掌握排序、鏈表、棧以及隊(duì)列這些基本數(shù)據(jù)結(jié)構(gòu)和算法,但計(jì)算幾何、線性規(guī)劃和網(wǎng)絡(luò)流這些算法可能就不是每個(gè)程序員都需要掌握的了;
通過(guò)這幾個(gè)標(biāo)準(zhǔn),我把程序員應(yīng)掌握的關(guān)鍵概念分為程序設(shè)計(jì),軟件開(kāi)發(fā),以及個(gè)人成長(zhǎng)三大類(lèi),每一大類(lèi)均由若干關(guān)鍵概念組成。
點(diǎn)個(gè)關(guān)注不迷路~C語(yǔ)言/C++/Linux服務(wù)器開(kāi)發(fā)等技術(shù)點(diǎn) 持續(xù)為大家分享~私信我回復(fù)“資料”有驚喜小彩蛋~