本文把程序員所需掌握的關(guān)鍵知識(shí)總結(jié)為三大類19個(gè)關(guān)鍵概念,然后給出了掌握每個(gè)關(guān)鍵概念所需的入門書籍,必讀書籍伐憾,以及延伸閱讀背亥。旨在成為最好最全面的程序員必讀書單秒际。
前言
Reading makes a full man; conference a ready man; and writing an exact man.
Francis Bacon
優(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ò));
熟悉至少兩門以上編程語言(例如 C++橄仆,Java剩膘,C#,和 Python)盆顾;
專業(yè)的 軟件開發(fā) 素養(yǎng):
具備良好的編程實(shí)踐援雇,能夠編寫可測(cè)試(Testable),可擴(kuò)展(Extensible)椎扬,可維護(hù)(Maintainable)的代碼惫搏;
把握客戶需求,按時(shí)交付客戶所需要的軟件產(chǎn)品蚕涤;
理解現(xiàn)代軟件開發(fā)過程中的核心概念(例如面向?qū)ο蟪绦蛟O(shè)計(jì)筐赔,測(cè)試驅(qū)動(dòng)開發(fā),持續(xù)集成揖铜,和持續(xù)交付等等)茴丰。
和其它能力一樣, 程序設(shè)計(jì) 能力和 軟件開發(fā) 素養(yǎng)源自項(xiàng)目經(jīng)驗(yàn)和書本知識(shí)天吓。項(xiàng)目經(jīng)驗(yàn)因人而異(來自不同領(lǐng)域的程序員贿肩,項(xiàng)目差異會(huì)很大);但書本知識(shí)是相通的——尤其是經(jīng)典圖書龄寞,它們都能夠拓寬程序員的視野汰规,提高程序員的成長(zhǎng)速度。
在過去幾年的學(xué)習(xí)和工作中物邑,我閱讀了大量的程序設(shè)計(jì)/軟件開發(fā)書籍溜哮。隨著閱讀量的增長(zhǎng),我意識(shí)到:
經(jīng)典書籍需要不斷被重讀——每一次重讀都會(huì)有新的體會(huì)色解;
書籍并非讀的越多越好——大多數(shù)書籍只是經(jīng)典書籍中的概念延伸(有時(shí)甚至是照搬)茂嗓;
意識(shí)到這兩點(diǎn)之后,我開始思考一個(gè)很 功利 的問題:如何從盡可能少的書中科阎,獲取盡可能多的關(guān)鍵知識(shí)述吸?換句話說:
優(yōu)秀的程序員應(yīng)該掌握哪些關(guān)鍵概念?
哪些書籍來可以幫助程序員掌握這些關(guān)鍵概念锣笨?
這即是這篇文章的出發(fā)點(diǎn)——我試圖通過 程序員必讀書單 這篇文章來回答上面兩個(gè)問題蝌矛。
標(biāo)準(zhǔn)
進(jìn)入必讀書單之前道批,我先介紹下書單里的書籍選擇標(biāo)準(zhǔn)和領(lǐng)域選擇標(biāo)準(zhǔn)。當(dāng)然你也 點(diǎn)擊這里 直接跳轉(zhuǎn)到書單開始閱讀朴读。
書籍選擇標(biāo)準(zhǔn)
必讀:什么是必讀書籍呢屹徘?如果學(xué)習(xí)某項(xiàng)技術(shù)有一本書無論如何都不能錯(cuò)過走趋,那么這本書就是必讀書籍——例如 Effective Java 于Java衅金, CLR via C# 于C#;
注意我沒有使用“經(jīng)典”這個(gè)詞簿煌,因?yàn)榻?jīng)典計(jì)算機(jī)書籍往往和計(jì)算機(jī)科學(xué)聯(lián)系在一起氮唯,而且經(jīng)典往往需要10年甚至更長(zhǎng)的時(shí)間進(jìn)行考驗(yàn);
注重實(shí)踐姨伟,而非理論:所以這個(gè)書單不會(huì)包含過于原理性的書籍惩琉;
入門—必讀—延伸:必讀書籍的問題在于:1. 大多不適合入門;2. 不夠全面夺荒÷髑考慮到?jīng)]有入門閱讀和延伸閱讀的閱讀列表是不完整的——所以書單中每個(gè)關(guān)鍵概念都會(huì)由一本入門書籍,一本必讀書籍(有時(shí)入門書籍和必讀書籍是同一本)技扼,和若干延伸閱讀書籍所構(gòu)成伍玖。
概念選擇標(biāo)準(zhǔn)
全面:全面覆蓋軟件開發(fā)中重要的概念;
通用:適用于每一個(gè)程序員剿吻,和領(lǐng)域特定方向無關(guān)窍箍;
注重基礎(chǔ),但不過于深入:優(yōu)秀的程序員需要良好的計(jì)算機(jī)科學(xué)基礎(chǔ)丽旅,但程序員并沒必要掌握過于深入的計(jì)算機(jī)科學(xué)知識(shí)椰棘。以算法為例,每個(gè)程序員都應(yīng)該掌握排序榄笙、鏈表邪狞、棧以及隊(duì)列這些基本數(shù)據(jù)結(jié)構(gòu)和算法,但計(jì)算幾何茅撞、線性規(guī)劃和網(wǎng)絡(luò)流這些算法可能就不是每個(gè)程序員都需要掌握的了赃绊;
通過這幾個(gè)標(biāo)準(zhǔn),我把程序員應(yīng)掌握的關(guān)鍵概念分為程序設(shè)計(jì)磅摹,軟件開發(fā)秧骑,以及個(gè)人成長(zhǎng)三大類,每一大類均由若干關(guān)鍵概念組成蠕蚜。
快速通道
自從開博以來尚洽,經(jīng)常會(huì)有朋友在論壇,微博靶累,和QQ上提問學(xué)習(xí)X技術(shù)讀什么書合適(例如:學(xué)習(xí)Java讀什么書合適腺毫?如何學(xué)習(xí)程序設(shè)計(jì)癣疟?)所以我在這里列出了一個(gè)“快速通道”——把常見的問題集中在一起,點(diǎn)擊問題潮酒,即可直接進(jìn)入答案睛挚。(當(dāng)然,如果你把本文從頭讀到尾幫助會(huì)更大 :-))
如何學(xué)習(xí)計(jì)算機(jī)基礎(chǔ)知識(shí)急黎?
如何學(xué)習(xí) C 語言扎狱?
如何學(xué)習(xí) C++?
如何學(xué)習(xí) Java勃教?
如何學(xué)習(xí) C#淤击?
如何學(xué)習(xí) JavaScript?
如何學(xué)習(xí) Python故源?
如何加深對(duì)編程語言的理解污抬?
如何學(xué)習(xí)程序設(shè)計(jì)技巧?
如何學(xué)習(xí)算法绳军?
如何高效的調(diào)試程序印机?
如何掌握良好的編程實(shí)踐?
如何學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計(jì)门驾?
如何對(duì)代碼進(jìn)行重構(gòu)射赛?
如何更好的進(jìn)行軟件測(cè)試?
如何管理軟件團(tuán)隊(duì)/軟件項(xiàng)目猎唁?
如何成為一名更專業(yè)的程序員咒劲?
程序員如何學(xué)習(xí)設(shè)計(jì)?
程序員如何進(jìn)行職業(yè)規(guī)劃诫隅?
如何提高自己的思維能力腐魂?
如何進(jìn)行高效求職面試?
如何提高自己的英語寫作能力逐纬?
程序員必讀書單
入門書籍
程序設(shè)計(jì):
基礎(chǔ)理論 : 編碼:隱匿在計(jì)算機(jī)軟硬件背后的語言
編程語言 :
C : C 和指針
C++ : C++ 程序設(shè)計(jì)原理與實(shí)踐
Java : Java 核心技術(shù)(第9版)
C# : 精通 C#(第6版)
JavaScript : JavaScript DOM編程藝術(shù)(第2版)
Python : Python 基礎(chǔ)教程(第二版)
編程語言理論 : 編程語言實(shí)現(xiàn)模式
程序設(shè)計(jì) : 程序設(shè)計(jì)方法
算法與數(shù)據(jù)結(jié)構(gòu) : 算法(第4版)
程序調(diào)試 : 調(diào)試九法——軟硬件錯(cuò)誤的排查之道
軟件開發(fā):
編程實(shí)踐 : 程序設(shè)計(jì)實(shí)踐
面向?qū)ο蟪绦蛟O(shè)計(jì) : Head First設(shè)計(jì)模式
重構(gòu) : 重構(gòu)
軟件測(cè)試 : How to Break Software
項(xiàng)目管理 : 極客與團(tuán)隊(duì)
專業(yè)開發(fā) : 程序員修煉之道:從小工到專家
大師之言 : 奇思妙想:15 位計(jì)算機(jī)天才及其重大發(fā)現(xiàn)
界面設(shè)計(jì) : 寫給大家看的設(shè)計(jì)書
交互設(shè)計(jì) : 通用設(shè)計(jì)法則
個(gè)人成長(zhǎng):
職業(yè)規(guī)劃 : 軟件開發(fā)者路線圖
思維方式 : 程序員的思維修煉:開發(fā)認(rèn)知潛能的九堂課
求職面試 : 金領(lǐng)簡(jiǎn)歷:敲開蘋果微軟谷歌的大門
英語寫作 : The Only Grammar Book You’ll Ever Need
必讀書籍
程序設(shè)計(jì):
基礎(chǔ)理論 : 深入理解計(jì)算機(jī)系統(tǒng)(第 2 版)
編程語言 :
C : C 程序設(shè)計(jì)語言(第 2 版)
C++ : C++程序設(shè)計(jì)語言(第 4 版)
Java : Effective Java(第 2 版)
C# : CLR via C#(第 4 版)
JavaScript : JavaScript 語言精粹
Python : Python參考手冊(cè)(第 4 版)
編程語言理論 : 程序設(shè)計(jì)語言——實(shí)踐之路(第 3 版)
程序設(shè)計(jì) : 計(jì)算機(jī)程序的構(gòu)造與解釋(第 2 版)
算法與數(shù)據(jù)結(jié)構(gòu) : 編程珠璣(第 2 版)
程序調(diào)試 : 調(diào)試九法——軟硬件錯(cuò)誤的排查之道
軟件開發(fā):
編程實(shí)踐 : 代碼大全(第 2 版)
面向?qū)ο蟪绦蛟O(shè)計(jì) : 設(shè)計(jì)模式
重構(gòu) : 修改代碼的藝術(shù)
軟件測(cè)試 : xUnit Test Patterns
項(xiàng)目管理 : 人月神話
專業(yè)開發(fā) : 程序員職業(yè)素養(yǎng)
大師之言 : 編程人生:15 位軟件先驅(qū)訪談錄
界面設(shè)計(jì) : 認(rèn)知與設(shè)計(jì):理解UI設(shè)計(jì)準(zhǔn)則(第 2 版)
交互設(shè)計(jì) : 交互設(shè)計(jì)精髓(第 3 版)
個(gè)人成長(zhǎng):
職業(yè)規(guī)劃 : 軟件開發(fā)者路線圖
思維方式 : 如何把事情做到最好
求職面試 : 程序員面試金典(第 5 版)
英語寫作 : 風(fēng)格的要素
這個(gè)閱讀列表覆蓋了軟件開發(fā)各個(gè)關(guān)鍵領(lǐng)域的入門書籍和必讀書籍蛔屹,我相信它可以滿足絕大多數(shù)程序員的需求,無論你是初學(xué)者豁生,還是進(jìn)階者兔毒,都可以從中獲益:
基礎(chǔ)理論 包括了程序員應(yīng)該掌握的計(jì)算機(jī)基礎(chǔ)知識(shí);
編程語言 對(duì)軟件開發(fā)至關(guān)重要甸箱,我選擇了 C 育叁, C++ , Java 芍殖, C# 豪嗽, Python ,和 JavaScript 這六門 主流編程語言 進(jìn)行介紹,如果想進(jìn)一步理解編程語言龟梦,可以閱讀 編程語言理論 里的書目隐锭;
在理解編程語言的基礎(chǔ)上,優(yōu)秀的程序員還應(yīng)該了解各種 程序設(shè)計(jì) 技巧计贰,熟悉基本的 算法數(shù)據(jù)結(jié)構(gòu) 钦睡,并且能夠高效的進(jìn)行 程序調(diào)試 。
良好的程序設(shè)計(jì)能力是成為優(yōu)秀程序員的前提躁倒,但軟件開發(fā)知識(shí)也是必不可少的:優(yōu)秀的程序員應(yīng)具備良好的 編程實(shí)踐 荞怒,知道如何利用 面向?qū)ο?, 重構(gòu) 樱溉,和 軟件測(cè)試 編寫可復(fù)用挣输,可擴(kuò)展纬凤,可維護(hù)的代碼福贞,并具備軟件 項(xiàng)目管理 知識(shí)和 專業(yè)開發(fā) 素養(yǎng);
就像我們可以從名人傳記里學(xué)習(xí)名人的成功經(jīng)驗(yàn)停士,程序員也可以通過追隨優(yōu)秀程序員的足跡使自己少走彎路挖帘。 大師之言 包含一系列對(duì)大師程序員/計(jì)算機(jī)科學(xué)家的訪談,任何程序員都可以從中獲益良多恋技;
為了打造用戶滿意的軟件產(chǎn)品拇舀,程序員應(yīng)當(dāng)掌握一定的 界面設(shè)計(jì) 知識(shí)和 交互設(shè)計(jì) 知識(shí)(是的,這些工作應(yīng)該交給UI和UX蜻底,但如果你想獨(dú)自打造一個(gè)產(chǎn)品呢骄崩?);
專業(yè)程序員應(yīng)當(dāng)對(duì)自己進(jìn)行 職業(yè)規(guī)劃 薄辅,并熟悉程序員 求職面試 的流程要拂,以便在職業(yè)道路上越走越遠(yuǎn);
軟件開發(fā)是一項(xiàng)需要不斷學(xué)習(xí)的技能站楚,學(xué)習(xí) 思維方式 可以有效的提升學(xué)習(xí)能力和學(xué)習(xí)效率脱惰;
軟件開發(fā)是一項(xiàng)國(guó)際化的工作,為了讓更多的人了解你的代碼(工作)窿春,良好的 英語寫作 能力必不可少拉一。
盡管我盡可能的去完善這個(gè)書單,但受限于我的個(gè)人經(jīng)歷旧乞,這個(gè)書單難免會(huì)有所偏頗蔚润。所以如果你有不同的意見,或者認(rèn)為這個(gè)書單漏掉了某些重要書籍尺栖,請(qǐng)?jiān)谠u(píng)論中指出嫡纠,我會(huì)及時(shí)更新。:-)
程序設(shè)計(jì)
1. 基礎(chǔ)理論
編碼:隱匿在計(jì)算機(jī)軟硬件背后的語言
編碼:隱匿在計(jì)算機(jī)軟硬件背后的語言 這本書其實(shí)不應(yīng)該叫編碼——它更應(yīng)該叫“Petzold教你造計(jì)算機(jī)”——作者 Charles Petzold 創(chuàng)造性的以編碼為主題,從電報(bào)機(jī)和手電筒講到數(shù)字電路货徙,然后利用 數(shù)字電路 中的邏輯門構(gòu)造出 加法器 和 觸發(fā)器 左权,最后構(gòu)造出一個(gè)完整的 存儲(chǔ)程序計(jì)算機(jī) 。不要被這些電路概念嚇到—— 編碼 使用大量形象貼切的類比簡(jiǎn)化了這些概念痴颊,使其成為最精彩最通俗易懂的計(jì)算機(jī)入門讀物赏迟。
深入理解計(jì)算機(jī)系統(tǒng)(第2版)
深入理解計(jì)算機(jī)系統(tǒng)(第2版) 這本書的全名是:Computer Systems:A Programmer’s Perspective(所以它又被稱為 CSAPP),我個(gè)人習(xí)慣把它翻譯為程序員所需了解的計(jì)算機(jī)系統(tǒng)知識(shí)蠢棱,盡管土了些锌杀,但更名副其實(shí)。
深入理解計(jì)算機(jī)系統(tǒng) 是我讀過的最優(yōu)秀的計(jì)算機(jī)系統(tǒng)導(dǎo)論型作品泻仙,它創(chuàng)造性的把操作系統(tǒng)糕再,計(jì)算機(jī)組成結(jié)構(gòu),數(shù)字電路玉转,以及編譯原理這些計(jì)算機(jī)基礎(chǔ)學(xué)科中的核心概念匯集在一起突想,從而覆蓋了指令集體系架構(gòu),匯編語言究抓,代碼優(yōu)化猾担,計(jì)算機(jī)存儲(chǔ)體系架構(gòu),鏈接刺下,裝載绑嘹,進(jìn)程,以及虛擬內(nèi)存這些程序員所需了解的關(guān)鍵計(jì)算機(jī)系統(tǒng)知識(shí)橘茉。如果想打下扎實(shí)的計(jì)算機(jī)基礎(chǔ)又不想把操作系統(tǒng)計(jì)算機(jī)結(jié)構(gòu)編譯原理這些書統(tǒng)統(tǒng)讀一遍工腋,閱讀 深入理解計(jì)算機(jī)系統(tǒng) 是最有效率的方式。
延伸閱讀:
世界是數(shù)字的 : K&R 中的 K( Brian Kernighan )的近作畅卓,這本書源自 Brian 在普林斯頓大學(xué)所教授的計(jì)算機(jī)基礎(chǔ)課程擅腰,以通俗易懂的方式講述了現(xiàn)代人所應(yīng)了解的計(jì)算機(jī)知識(shí)和網(wǎng)絡(luò)知識(shí);
圖靈的秘密:他的生平髓介、思想及論文解讀 : Charles Petzold 的另一部作品惕鼓,這本書以圖靈的論文論可計(jì)算數(shù)及其在判定問題上的應(yīng)用( On Computable Numbers, with an Application to the Entscheidungsproblem )為主題,闡述了圖靈機(jī)(現(xiàn)代計(jì)算機(jī)的始祖)的構(gòu)造唐础,原理箱歧,以及應(yīng)用。
計(jì)算機(jī)系統(tǒng)概論(第2版) :另一部?jī)?yōu)秀的計(jì)算機(jī)系統(tǒng)導(dǎo)論型作品一膨,和 深入理解計(jì)算機(jī)系統(tǒng) 不同呀邢,這本書采用自下而上的方式,從二進(jìn)制豹绪,和數(shù)字邏輯這些底層知識(shí)一步步過渡到高級(jí)編程語言(C)价淌,從而以另一種方式理解計(jì)算機(jī)系統(tǒng)申眼。
2. 編程語言
編程語言是程序員必不可少的日常工具。工欲善其事蝉衣,必先利其器括尸。我在這里給出了 C,C++病毡,Java濒翻,C#,JavaScript啦膜,和Python 這六種 常用編程語言 的書單(我個(gè)人不熟悉 Objective-C 和 PHP有送,因此它們不在其中)。
需要注意的是:我在這里給出的是編程語言(Programming Language)書籍僧家,而非編程平臺(tái)(Programming Platform)書籍雀摘。以 Java 為例, Effective Java 屬于編程語言書籍八拱,而 Android編程權(quán)威指南 就屬于編程平臺(tái)書籍阵赠。
C
C和指針
忘記譚浩強(qiáng)那本糟糕不堪的 C 程序設(shè)計(jì), C和指針 才是 C 語言的最佳入門書籍乘粒。它詳細(xì)但又不失簡(jiǎn)練的介紹了 C 語言以及 C 標(biāo)準(zhǔn)庫的方方面面豌注。
對(duì)于C語言初學(xué)者伤塌,最難的概念不僅僅是指針和數(shù)組灯萍,還有指向數(shù)組的指針和指向指針的指針。 C和指針 花了大量的篇幅和圖示來把這些難懂但重要的概念講的清清楚楚每聪,這也是我推薦它作為C語言入門讀物的原因旦棉。
C程序設(shè)計(jì)語言(第2版)
盡管 C程序設(shè)計(jì)語言 是二十多年前的書籍,但它仍然是C語言——以及計(jì)算機(jī)科學(xué)中最重要的書籍之一药薯,它的重要性不僅僅在于它用清晰的語言和簡(jiǎn)練的代碼描述了 C 語言全貌绑洛,而且在于它為之后的計(jì)算機(jī)書籍——尤其是編程語言書籍樹立了新的標(biāo)桿。以至于在很多計(jì)算機(jī)書籍的扉頁童本,都會(huì)有“感謝 Kernighan 教會(huì)我寫作”這樣的字樣真屯。
延伸閱讀:
C 專家編程 :不要被標(biāo)題中的“專家”嚇到,這實(shí)際是一本很輕松的書籍穷娱,它既包含了大量 C 語言技術(shù)細(xì)節(jié)和編程技巧绑蔫,也包含了很多有趣的編程軼事;
C 陷阱與缺陷 :書如其名泵额,這本書介紹了 C 語言中常見的坑和一些稀奇古怪的編程“技巧”配深,不少刁鉆的C語言面試題都源自這本小冊(cè)子;
C 語言參考手冊(cè) :全面且權(quán)威的 C 語言參考手冊(cè)嫁盲,而且覆蓋 C99篓叶,如果你打算成為 C 語言專家,那么這本書不可錯(cuò)過;
C 標(biāo)準(zhǔn)庫 :給出了15個(gè)C標(biāo)準(zhǔn)庫的設(shè)計(jì)思路缸托,實(shí)現(xiàn)代碼左敌,以及測(cè)試代碼,配合 C 程序設(shè)計(jì)語言 閱讀效果更佳俐镐;
C 語言接口與實(shí)現(xiàn) :這本書展示了如何使用C語言實(shí)現(xiàn)可復(fù)用的數(shù)據(jù)結(jié)構(gòu)母谎,其中包含大量 C 語言高級(jí)技巧,以至于 Amazon 上排行第一的評(píng)論是 “Probably the best advanced C book in existance”京革,而排行第二的評(píng)論則是 “By far the most advanced C book I read”奇唤。
C++
C++ 程序設(shè)計(jì)原理與實(shí)踐
作為C++的發(fā)明者,沒有人能比 Bjarne Stroustrup 更理解C++匹摇。Bjarne在Texas A&M大學(xué)任教時(shí)使用C++為大學(xué)新生講授編程咬扇,從而就有了 C++ 程序設(shè)計(jì)原理與實(shí)踐 這本書——它面向編程初學(xué)者,既包含 C++ 教程廊勃,也包含大量程序設(shè)計(jì)原則懈贺。它不但是我讀過最好的C++入門書,也是我讀過最好的編程入門書坡垫。
比較有趣的是梭灿, C++ 程序設(shè)計(jì)原理與實(shí)踐 直到全書過半都沒有出現(xiàn)指針,我想這可能是Bjarne為了證明不學(xué)C也可以學(xué)好C++吧冰悠。
C++ 程序設(shè)計(jì)語言(第4版)
同樣是 Bjarne Stroustrup 的作品堡妒, C++ 程序設(shè)計(jì)語言 是 C++ 最權(quán)威且最全面 的書籍。第4版相對(duì)于之前的版本進(jìn)行了全面的更新溉卓,覆蓋了第二新的C++ 11標(biāo)準(zhǔn)皮迟,并砍掉了部分過時(shí)的內(nèi)容。
延伸閱讀:
A Tour of C++ :如果你覺得 C++程序設(shè)計(jì)語言 過于龐大桑寨,但你又想快速的瀏覽一遍新版 C++ 的語言特色伏尼,那么可以試試這本小紅書;
C++ 語言的設(shè)計(jì)與演化 :C++ 的“歷史書”尉尾,講述了 C++ 是如何一步一步從 C with Classes 走到如今這一步爆阶,以及 C++ 語言特性背后的故事;
C++ 標(biāo)準(zhǔn)庫(第2版) :相對(duì)于其它語言的標(biāo)準(zhǔn)庫沙咏,C++ 標(biāo)準(zhǔn)庫雖然強(qiáng)大辨图,但學(xué)習(xí)曲線十分陡峭,這本書是學(xué)習(xí) C++ 標(biāo)準(zhǔn)庫有力的補(bǔ)充芭碍;
深度探索 C++ 對(duì)象模型 :這本書系統(tǒng)的講解了 C++ 是如何以最小的性能代價(jià)實(shí)現(xiàn)對(duì)象模型徒役,很多C++面試題(包括被問爛的虛函數(shù)指針)都可以在這本書里找到答案;
Effective C++ 和 More Effective C++ :由于 C++ 的特性實(shí)在繁雜窖壕,因此很容易就掉到坑里忧勿。Effective 系列既講述了 C++ 的良好編程實(shí)踐杉女,也包含C++的使用誤區(qū),從而幫你繞過這些坑鸳吸。
Java
Java 核心技術(shù)(第9版)
平心而論 Java 核心技術(shù) (即Core Java)并不算是一本特別出色的書籍:示例代碼不夠嚴(yán)謹(jǐn)熏挎,充斥著很多與C/C++的比較,語言也不夠簡(jiǎn)潔——問題在于Java并沒有一本很出色的入門書籍晌砾,與同類型的 Java 編程思想 相比坎拐, Java 核心技術(shù) 至少做到了廢話不多,與時(shí)俱進(jìn)( Java 編程思想 還停留在 Java 6之前)养匈,矮子里面選將軍哼勇, Java 核心技術(shù) 算不錯(cuò)了。
Effective Java(第 2 版)
盡管 Java 沒有什么出色的入門書籍呕乎,但這不代表 Java 沒有出色的必讀書籍积担。 Effective Java 是我讀過的最好的編程書籍之一,它包含大量的優(yōu)秀Java編程實(shí)踐猬仁,并對(duì)泛型和并發(fā)這兩個(gè)充滿陷阱的 Java 特性給出了充滿洞察力的建議帝璧,以至于 Java 之父 James Gosling 為這本書作序:“我很希望 10 年前就擁有這本書∈簦可能有人認(rèn)為我不需要任何 Java 方面的書籍的烁,但是我需要這本書≌┕耄”
延伸閱讀:
深入理解 Java 虛擬機(jī)(第2版) :非常優(yōu)秀且難得的國(guó)產(chǎn)佳作渴庆,系統(tǒng)的介紹了 Java 虛擬機(jī)和相關(guān)工具,并給出了一些調(diào)優(yōu)建議买雾;
Java 程序員修煉之道 :在這本書之前把曼,并沒有一本 Java 書籍系統(tǒng)詳細(xì)的介紹 Java 7 的新特性(例如新的垃圾收集器,try using 結(jié)構(gòu)和 invokedynamic 指令)漓穿,這本書填補(bǔ)了這個(gè)空白;
Java 并發(fā)編程實(shí)踐 :系統(tǒng)全面的介紹了 Java 的并發(fā)注盈,如何設(shè)計(jì)支持并發(fā)的數(shù)據(jù)結(jié)構(gòu)晃危,以及如何編寫正確的并發(fā)程序;
Java Puzzlers :包含了大量的 Java 陷阱——以至于讀這本書時(shí)我說的最多的一個(gè)詞就是 WTF老客,這本書的意義在于它是一個(gè) 反模式 大全僚饭, Effective Java 告訴你如何寫好的 Java 程序,而 Java Puzzlers 則告訴你糟糕的 Java 程序是什么樣子胧砰。更有意思的是鳍鸵,這兩本書的作者都是 Joshua Bloch 。
C#
精通 C#(第6版)
可能你會(huì)疑問我為什么會(huì)推薦這本接近 1200 頁的“巨著”用作 C# 入門尉间,這是我的答案:
C# 的語言特性非常豐富偿乖,很難用簡(jiǎn)短的篇幅概括這些特性击罪;
精通 C# 之所以有近 1200 頁的篇幅,是因?yàn)樗坏娼榻B了 C# 語言贪薪,而且還覆蓋了 ADO.NET媳禁,WCF,WF画切,WPF竣稽,以及 ASP.NET 這些 .Net 框架。你可以把這本書視為兩本書——一本 500 多頁的 C# 語言教程和一本 600 多頁的 .Net 平臺(tái)框架快速上手手冊(cè)霍弹。
盡管標(biāo)題帶有“精通”兩字毫别, 精通 C# 實(shí)際上是一本面向初學(xué)者的C#書籍,你甚至不需要太多編程知識(shí)典格,就可以讀懂它拧烦。
CLR via C#(第 4 版)
CLR via C# 是C#/.Net最重要的書籍,沒有之一钝计。它全面介紹了 .Net 的基石—— CLR 的運(yùn)行原理恋博,以及構(gòu)建于 CLR 之上的 C# 類型系統(tǒng),運(yùn)行時(shí)關(guān)系私恬,泛型债沮,以及線程/并行等高級(jí)內(nèi)容。任何一個(gè)以 C# 為工作內(nèi)容的程序員都應(yīng)該閱讀此書本鸣。
延伸閱讀:
深入理解 C#(第 3 版) :C# 進(jìn)階必讀疫衩,這本書偏重于C#的語言特性,它系統(tǒng)的介紹了C#從1.0到C# 4.0的語言特性演化荣德,并展示了如何利用C#的語言特性編寫優(yōu)雅的程序;
.NET設(shè)計(jì)規(guī)范(第 2 版) :C# 專業(yè) 程序員必讀闷煤,從變量命名規(guī)范講到類型系統(tǒng)設(shè)計(jì)原則,這本書提供了一套完整的.Net編程規(guī)范涮瞻,使得程序員可以編寫出一致鲤拿,嚴(yán)謹(jǐn)?shù)拇a,
C# 5.0 權(quán)威指南 :來自 O’Reilly 的 C# 參考手冊(cè)署咽,嚴(yán)謹(jǐn)?shù)慕榻B了 C# 語法近顷,使用,以及核心類庫宁否,C#程序員案頭必備窒升;
LINQ to Objects Using C# 4.0 和 Async in C# 5.0 :LINQ 和 async 分別是 .Net 3.5 和 .Net 4.5 中所引入的最重要的語言特性,所以我認(rèn)為有必要在它們上面花點(diǎn)功夫——這兩本書是介紹 LINQ 和 async 編程的最佳讀物慕匠。
JavaScript
JavaScript DOM 編程藝術(shù)(第 2 版)
盡管JavaScript現(xiàn)在可以做到客戶端服務(wù)器端通吃饱须,盡管 JQuery 之類的前端框架使得一些人可以不懂JavaScript也可以編程,但我還是認(rèn)為學(xué)習(xí)JavaScript從HTML DOM開始最為適合台谊,因?yàn)檫@是JavaScript設(shè)計(jì)的初衷蓉媳。 JavaScript DOM編程藝術(shù) 系統(tǒng)的介紹了如何使用JavaScript譬挚,HTML,以及 CSS 創(chuàng)建可用的 Web 頁面督怜,是一本前端入門佳作殴瘦。
JavaScript 語言精粹
JavaScript語言包含大量的陷阱和誤區(qū),但它卻又有一些相當(dāng)不錯(cuò)的特性号杠,這也是為什么 Douglas Crockford 稱JavaScript為 世界上最被誤解的語言 蚪腋,并編寫了 JavaScript 語言精粹 一書來幫助前端開發(fā)者繞開JavaScript中的陷阱。和同類書籍不同姨蟋, JavaScript 語言精粹 用精煉的語言講解了JavaScript語言中好的那部分(例如閉包屉凯,函數(shù)是頭等對(duì)象,以及對(duì)象字面量)眼溶,并建議讀者 不要 使用其它不好的部分(例如混亂的類型轉(zhuǎn)換悠砚,默認(rèn)全局命名空間,以及 奇葩的相等判斷符 )堂飞,畢竟灌旧,用糟糕的特性編寫出來的程序往往也是糟糕的。
延伸閱讀:
JavaScript 高級(jí)程序設(shè)計(jì)(第 3 版) :詳盡且深入的介紹了Javascript語言绰筛,DOM枢泰,以及Ajax,并針對(duì)HTML5做了對(duì)應(yīng)更新铝噩;
JavaScript 權(quán)威指南(第 6 版) :這本書的第5版曾被前端專家 Douglas Crockford 稱之為“唯一靠譜的 JavaScript 書”衡蚂。相對(duì)于 JavaScript高級(jí)程序設(shè)計(jì) , JavaScript 權(quán)威指南 更像是一本案頭參考書骏庸,當(dāng)然如果你感興趣也可以從頭讀到尾毛甲;
編寫可維護(hù)的 JavaScript :書如其名,這本書給出了大量的優(yōu)秀 JavaScript 編程實(shí)踐具被,使得程序員編寫出健壯且易于維護(hù)的 JavaScript 代碼玻募;
JavaScript 異步編程 :和常見的支持并發(fā)的編程語言(例如 Java 和 C#)不同,JavaScript 本身是 單線程 的硬猫,因此不能把其它語言處理并發(fā)的方式照搬到 JavaScript补箍。 JavaScript 異步編程 系統(tǒng)的介紹了JavaScript 中的并發(fā)原理,并闡述了如何使用 Promise啸蜜、Deferred 以及 Async.js 編寫出簡(jiǎn)潔高效的異步程序。
Python
Python 基礎(chǔ)教程(第二版)
Python 的入門書籍很多辈挂,而且據(jù)說質(zhì)量大多不錯(cuò)衬横,我推薦 Python 基礎(chǔ)教程 的原因是因?yàn)樗俏业腜ython入門讀物——簡(jiǎn)潔,全面终蒂,代碼質(zhì)量很不錯(cuò)蜂林,而且有幾個(gè)很有趣的課后作業(yè)遥诉,使得我可以快速上手。
這里順便多說一句噪叙,不要用 Python 學(xué)習(xí)手冊(cè) 作為Python入門——它的廢話實(shí)在太多矮锈,你能想象它用了15頁的篇幅去講解if語句嗎?盡管 O’Reilly 出了很多經(jīng)典編程書睁蕾,但這本 Python 學(xué)習(xí)手冊(cè) 絕對(duì)不在其中苞笨。
Python 參考手冊(cè)(第 4 版)
權(quán)威且實(shí)用 Python 書籍,覆蓋 Python 2和 Python 3子眶。盡管它名為參考手冊(cè)瀑凝,但 Python 參考手冊(cè) 在 Python 語法和標(biāo)準(zhǔn)庫基礎(chǔ)之上對(duì)其實(shí)現(xiàn)機(jī)制也給出了深入的講解,不容錯(cuò)過臭杰。
延伸閱讀:
Python 袖珍指南(第 5 版) :實(shí)用且便攜的 Python 參考手冊(cè)粤咪,我會(huì)說我在飛機(jī)上寫程序時(shí)用的就是它么 -_-#;
Python Cookbook(第 3 版) :非常好的 Python 進(jìn)階讀物渴杆,包含各種常用場(chǎng)景下的 Python 代碼寥枝,使得讀者可以寫出更加 Pythonic 的代碼;
Python 編程實(shí)戰(zhàn):運(yùn)用設(shè)計(jì)模式磁奖、并發(fā)和程序庫創(chuàng)建高質(zhì)量程序 :Python 高級(jí)讀物囊拜,針對(duì) Python 3,2014 年的 Jolt 大獎(jiǎng)圖書 点寥,不可錯(cuò)過艾疟;
Python 源碼剖析 :少見的國(guó)產(chǎn)精品,這本書以 Python 2.5 為例敢辩,從源代碼出發(fā)蔽莱,一步步分析了 CPython 是如何實(shí)現(xiàn)類型,控制流戚长,函數(shù)/方法的聲明與調(diào)用盗冷,類型以及裝飾器等 Python 核心概念,讀過之后會(huì)大大加深對(duì) Python 的理解同廉。盡管這本書有些過時(shí)仪糖,但我們?nèi)匀豢梢园凑账治鲈创a的方式來分析新版Python。
3. 編程語言理論
編程語言實(shí)現(xiàn)模式
大多數(shù)程序員并不需要從頭編寫一個(gè)編譯器或解釋器迫肖,因此 龍書(編譯原理) 就顯得過于重量級(jí)锅劝;然而多數(shù)程序員還是需要解析文本,處理配置文件蟆湖,或者寫一個(gè)小語言故爵, 編程語言實(shí)現(xiàn)模式 很好的滿足了這個(gè)需求。它把常用的文本解析/代碼生成方法組織成一個(gè)個(gè)模式隅津,并為每個(gè)模式給出了實(shí)例和應(yīng)用場(chǎng)景。這本書既會(huì)提高你的動(dòng)手能力,也會(huì)加深你對(duì)編程語言的理解侮繁。Python 發(fā)明者 Guido van Rossum 甚至為這本書給出了 “Throw away your compiler theory book!” 這樣的超高評(píng)價(jià)。
程序設(shè)計(jì)語言——實(shí)踐之路(第 3 版)
程序員每天都要和編程語言打交道很洋,但是思考編程語言為什么會(huì)被設(shè)計(jì)成這個(gè)樣子的程序員并不多, 程序設(shè)計(jì)語言——實(shí)踐之路 完美的回答了這個(gè)問題隧枫。這本書從編程語言的解析和運(yùn)行開始講起喉磁,系統(tǒng)了介紹了命名空間,作用域悠垛,控制流线定,數(shù)據(jù)類型以及方法(控制抽象)這些程序設(shè)計(jì)語言的核心概念,然后展示了這些概念是如何被應(yīng)用到過程式語言确买,面向?qū)ο笳Z言斤讥,函數(shù)式語言,腳本式湾趾,邏輯編程語言以及并發(fā)編程語言這些具有不同編程范式的編程語言之上芭商。這本書或極大的拓寬你的視野——無論你使用什么編程語言,都會(huì)從這本書中獲益良多搀缠。理解這一本書铛楣,勝過學(xué)習(xí)十門新的編程語言。
延伸閱讀:
七周七語言:理解多種編程范型 :盡管我們?cè)谌粘9ぷ髦锌赡苤皇褂脙扇T編程語言艺普,但是了解其它編程語言范式是很重要的簸州。 七周七語言 一書用精簡(jiǎn)的篇幅介紹了 Ruby,Io歧譬,Prolog岸浑,Scala,Erlang瑰步,Clojure矢洲,和 Haskell 這七種具有不同編程范式的語言——是的,你沒法通過這本書變成這七種語言的專家缩焦,但你的視野會(huì)得到極大的拓寬读虏;
自制編程語言 :另一本優(yōu)秀的編譯原理作品, 自制編程語言 通過從零開始制作一門無類型語言 Crowbar 和一門靜態(tài)類型語言 Diksam袁滥,把類型系統(tǒng)盖桥,垃圾回收,和代碼生成等編程語言的關(guān)鍵概念講的清清楚楚题翻;
計(jì)算的本質(zhì):深入剖析程序和計(jì)算機(jī) :披著 Ruby 外衣的 計(jì)算理論 入門書籍葱轩,使你對(duì)編程語言的理解更上一層樓。
4. 程序設(shè)計(jì)
程序設(shè)計(jì)方法
現(xiàn)代編程語言的語法大多很繁雜藐握,初學(xué)者使用這些語言學(xué)習(xí)編程會(huì)導(dǎo)致花大量的時(shí)間在編程語言語法(諸如指針靴拱,引用和類型定義)而不是程序設(shè)計(jì)方法(諸如數(shù)據(jù)抽象和過程抽象)之上。 程序設(shè)計(jì)方法 解決了這個(gè)問題——它專注于程序設(shè)計(jì)方法猾普,使得讀者無需把大量時(shí)間花在編程語言上袜炕。這本書還有一個(gè)與之配套的教學(xué)開發(fā)環(huán)境 DrScheme ,這個(gè)環(huán)境會(huì)根據(jù)讀者的程度變換編程語言的深度初家,使得讀者可以始終把注意力集中在程序設(shè)計(jì)方法上偎窘。
我個(gè)人很奇怪 程序設(shè)計(jì)方法 這樣的佳作為什么會(huì)絕版,而譚浩強(qiáng)C語言這樣的垃圾卻大行其道——好在是程序設(shè)計(jì)方法 第二版 已經(jīng)被免費(fèi)發(fā)布在網(wǎng)上溜在。
計(jì)算機(jī)程序的構(gòu)造與解釋(第 2 版)
計(jì)算機(jī)程序的構(gòu)造與解釋 是另一本被國(guó)內(nèi)大學(xué)忽視(至少在我本科時(shí)很少有人知道這本書)的教材陌知,這本書和 程序設(shè)計(jì)方法 有很多共同點(diǎn)——都使用 Scheme )作為教學(xué)語言;都專注于程序設(shè)計(jì)方法而非編程語言本身掖肋;都擁有相當(dāng)出色的課后題仆葡。相對(duì)于 程序設(shè)計(jì)方法 , 計(jì)算機(jī)程序的構(gòu)造與解釋 要更加深入程序設(shè)計(jì)的本質(zhì)(過程抽象志笼,數(shù)據(jù)抽象沿盅,以及元語言抽象),以至于 Google 技術(shù)總監(jiān) Peter Norvig 給了這本書 超高的評(píng)價(jià) 纫溃。
延伸閱讀:
編程原本 : STL 作者的關(guān)于程序設(shè)計(jì)方法佳作——他把關(guān)系代數(shù)和群論引入編程之中腰涧,試圖為程序設(shè)計(jì)提供一個(gè)堅(jiān)實(shí)的理論基礎(chǔ),從而構(gòu)建出更加穩(wěn)固的軟件紊浩。這本書是 程序設(shè)計(jì)方法 和 計(jì)算機(jī)程序的構(gòu)造與解釋 的絕好補(bǔ)充——前者使用函數(shù)式語言(Scheme)講授程序設(shè)計(jì)窖铡,而 編程原本 則使用命令式語言(C++);
元素模式 : 設(shè)計(jì)模式 總結(jié)了 面向?qū)ο蟪绦蛟O(shè)計(jì) 中的模式,而 元素模式 這本書分析了 程序設(shè)計(jì) 中的常見模式的本質(zhì)坊谁,閱讀這本書會(huì)讓你對(duì)程序設(shè)計(jì)有更深的理解费彼;
The Science of Programming :會(huì)編程的人很多,但能夠編寫正確程序的人就少多了呜袁。 The Science of Programming 通過 前條件——不變式——后條件 以及邏輯謂詞演算敌买,為編寫正確程序提供了強(qiáng)有力的理論基礎(chǔ),然后這本書通過實(shí)例闡述了如何應(yīng)用這些理論到具體程序上阶界。任何一個(gè)想大幅提高開發(fā)效率的程序員都應(yīng)閱讀此書虹钮。
5. 算法與數(shù)據(jù)結(jié)構(gòu)
算法(第 4 版)
我在 算法學(xué)習(xí)之路 一文中提到我的算法入門教材是 數(shù)據(jù)結(jié)構(gòu)與算法分析:C語言描述 ,我曾經(jīng)認(rèn)為它是最好的算法入門教材膘融,但自從我讀到 Sedgewick 的 算法 之后我就改變了觀點(diǎn)——這本 算法 才是最好的算法入門教材:
使用更為容易的Java語言作為教學(xué)語言芙粱;
覆蓋所有常用的數(shù)據(jù)結(jié)構(gòu)和算法,并均給出其完整實(shí)現(xiàn)氧映;
包含大量的圖示用于可視化算法——事實(shí)上這是我讀過的圖示最為豐富形象的書籍春畔,這也是我稱其為最好的算法入門書籍的原因。
編程珠璣(第 2 版)
編程珠璣(第 2 版) 是一本少見的實(shí)踐型算法書籍——它并非一一介紹數(shù)據(jù)結(jié)構(gòu)/算法的教材,而是實(shí)踐性極強(qiáng)的算法應(yīng)用手冊(cè)律姨。作者( Jon Bentley )從他多年的實(shí)際經(jīng)驗(yàn)精選出一些有趣而又實(shí)用的問題振峻,然后展示了他解決這些問題的過程(分析問題,選擇合適的算法择份,解決問題扣孟,以及驗(yàn)證答案)。任何程序員都可以從中獲益荣赶。
延伸閱讀:
編程珠璣(續(xù)) :嚴(yán)格來說這本書并非 編程珠璣 的續(xù)作凤价,而是一本類似于番外篇的編程技巧/實(shí)踐手冊(cè);它不像 編程珠璣 那般重視算法的應(yīng)用拔创,而是全面覆蓋了程序員所需的能力利诺;
算法導(dǎo)論(第 3 版) :盡管我在這邊文章開頭提到會(huì)盡量避免理論性的書籍,但沒有 算法導(dǎo)論 的算法閱讀列表是不完整的剩燥,我想這本書就不需要我多介紹了慢逾; :-)
算法設(shè)計(jì)與分析基礎(chǔ)(第 3 版) :側(cè)重于算法設(shè)計(jì),這本書創(chuàng)新的把常見算法分為分治躏吊,減治氛改,變治三大類,并覆蓋了動(dòng)態(tài)規(guī)劃比伏,回溯胜卤,以及分支定界等高級(jí)算法設(shè)計(jì)方法,屬于算法設(shè)計(jì)的入門佳作赁项。
6. 程序調(diào)試
調(diào)試九法——軟硬件錯(cuò)誤的排查之道
一個(gè)讓非編程從業(yè)人員驚訝的事實(shí)是程序員的絕大多時(shí)間都花在調(diào)試上葛躏,而不是寫程序上,以至于 Bob 大叔 把 調(diào)試時(shí)間占工作時(shí)間的比例 作為衡量程序員開發(fā)能力的標(biāo)準(zhǔn)悠菜。 調(diào)試九法——軟硬件錯(cuò)誤的排查之道 既是調(diào)試領(lǐng)域的入門作品舰攒,也是必讀經(jīng)典之作。 調(diào)試九法 的作者是一個(gè)具有豐富實(shí)戰(zhàn)經(jīng)驗(yàn)的硬件工程師悔醋,他把他多年的調(diào)試經(jīng)驗(yàn)總結(jié)成九條調(diào)試法則摩窃,并對(duì)每一條法則都給對(duì)應(yīng)的實(shí)際案例。任何程序員都應(yīng)通過閱讀這本書改善調(diào)試效率芬骄,即便是非程序員猾愿,也可以從這本書中學(xué)到系統(tǒng)解決問題的方法。
延伸閱讀:
Writing Solid Code :最好的調(diào)試是不調(diào)試—— Writing Solid Code 介紹了斷言账阻,設(shè)計(jì)清晰的 API蒂秘,以及單步代碼等技巧,用于編寫健壯的代碼淘太,減少調(diào)試的時(shí)間姻僧;
軟件調(diào)試的藝術(shù) :調(diào)試工具書——這本書詳細(xì)的介紹了常見的調(diào)試器工具规丽,并通過具體案例展示了它們的使用技巧;
軟件開發(fā)
1. 編程實(shí)踐
程序設(shè)計(jì)實(shí)踐
Brian Kernighan 是這個(gè)星球上最好的計(jì)算機(jī)書籍作者:從上古時(shí)期的 Software Tools 撇贺,到早期的 Unix編程環(huán)境 和 C 程序設(shè)計(jì)語言 赌莺,再到這本 程序設(shè)計(jì)實(shí)踐 ,每本書都是必讀之作显熏。
盡管程序設(shè)計(jì)實(shí)踐只有短短 200 余頁雄嚣,但它使用精煉的代碼和簡(jiǎn)要的原則覆蓋了程序設(shè)計(jì)的所有關(guān)鍵概念(包括編程風(fēng)格,算法與數(shù)據(jù)結(jié)構(gòu)喘蟆,API 設(shè)計(jì),調(diào)試鼓鲁,測(cè)試蕴轨,優(yōu)化,移植骇吭,以及領(lǐng)域特定語言等概念)橙弱。如果你想快速掌握良好的編程實(shí)踐,或者你覺著900多頁的 代碼大全 過于沉重燥狰,那么程序設(shè)計(jì)實(shí)踐是你的不二之選棘脐。我第一次讀這本書就被它簡(jiǎn)潔的語言和優(yōu)雅的代碼所吸引,以至于讀研時(shí)我買了三本程序設(shè)計(jì)實(shí)踐——一本放在學(xué)校實(shí)驗(yàn)室龙致,一本放在宿舍蛀缝,一本隨身攜帶閱讀。我想我至少把它讀了十遍以上——每一次都有新的收獲目代。
代碼大全(第2版)
無論在哪個(gè)版本的程序員必讀書單屈梁, 代碼大全 都會(huì)高居首位。和其它程序設(shè)計(jì)書籍不同榛了, 代碼大全 用通俗清晰的語言覆蓋了軟件構(gòu)建(Software Construction)中各個(gè)層次上 所有 的重要概念——從變量命名到類型設(shè)計(jì)在讶,從控制循環(huán)到代碼結(jié)構(gòu),從測(cè)試和調(diào)試到構(gòu)建和集成霜大, 代碼大全 可謂無所不包构哺,你可以把這本書看作為程序員的一站式(Once and for all)閱讀手冊(cè)。更珍貴的是战坤, 代碼大全 在每一章末尾都給出了價(jià)值很高的參考書目(參考我之前的 如何閱讀書籍 一文)曙强,如果你是一個(gè)初出茅廬的程序員, 代碼大全 是絕好的閱讀起點(diǎn)湖笨。
延伸閱讀:
編寫可讀代碼的藝術(shù) :專注于代碼可讀性(Code Readability)旗扑,這本書來自 Google 的兩位工程師對(duì) Google Code Readability 的總結(jié)。它給出了大量命名慈省,注釋臀防,代碼結(jié)構(gòu)眠菇,以及 API 設(shè)計(jì)等日常編碼的最佳實(shí)踐,并包含了很多看似細(xì)微但卻可以顯著提升代碼可讀性的編程技巧袱衷。這本書的翻譯還不錯(cuò)捎废,但如果你想體會(huì)書中的英語幽默(例如Tyrannosaurus——Stegosaurus——Thesaurus),建議閱讀它的 英文影印版 致燥;
卓有成效的程序員 :專注于生產(chǎn)效率(Productivity)登疗,它既包含源自作者多年經(jīng)驗(yàn)的高生產(chǎn)率原則,也包含大量的提高生產(chǎn)率的小工具嫌蚤,每個(gè)追求高生產(chǎn)率的程序員都應(yīng)該閱讀這本書辐益;
UNIX編程藝術(shù) :專注于程序設(shè)計(jì)哲學(xué),這本書首先總結(jié)出包括模塊化脱吱,清晰化智政,可組合,可分離等17個(gè)Unix程序設(shè)計(jì)哲學(xué)箱蝠,接下來通過 Unix 歷史以及各種 Unix 編程工具展示了這些原則的應(yīng)用续捂。盡管個(gè)人覺的這本書有些過度拔高 Unix 且過度貶低 Windows 和 M$,但書中的 Unix 設(shè)計(jì)哲學(xué)非常值得借鑒宦搬。
2. 面向?qū)ο蟪绦蛟O(shè)計(jì)
Head First 設(shè)計(jì)模式
無論是在 Amazon 還是在 Google 上搜索設(shè)計(jì)模式相關(guān)書籍牙瓢, Head First 設(shè)計(jì)模式 都會(huì)排在首位——它使用風(fēng)趣的語言和詼諧的圖示講述了觀察者,裝飾者间校,抽象工廠矾克,和單例等關(guān)鍵設(shè)計(jì)模式,使得初學(xué)者可以迅速的理解并掌握設(shè)計(jì)模式撇簿。 Head First 設(shè)計(jì)模式 在Amazon上 好評(píng)如潮 聂渊,就連設(shè)計(jì)模式原書作者 Erich Gamma 都對(duì)它給出了很高的評(píng)價(jià)。
需要注意四瘫, Head First設(shè)計(jì)模式 是非常好的設(shè)計(jì)模式入門書汉嗽,但 千萬不要 把這本書作為學(xué)習(xí)設(shè)計(jì)模式的唯一的書——是的,Head First 設(shè)計(jì)模式擁有風(fēng)趣的語言和詼諧的例子找蜜,但它既缺乏 實(shí)際 的工程范例饼暑,也沒有給出設(shè)計(jì)模式的應(yīng)用/適用場(chǎng)景。我個(gè)人建議是在讀過這本書之后立即閱讀 “四人幫” )的 設(shè)計(jì)模式 或 Bob 大叔 的 敏捷軟件開發(fā) 洗做,以便理解設(shè)計(jì)模式在實(shí)際中的應(yīng)用弓叛。
設(shè)計(jì)模式
設(shè)計(jì)模式 作為設(shè)計(jì)模式領(lǐng)域的開山之作,Erich Gamma诚纸,Richard Helm撰筷,Ralph Johnson等四位作者將各個(gè)領(lǐng)域面向?qū)ο蟪绦蜷_發(fā)的經(jīng)驗(yàn)總結(jié)成三大類23種模式,并給出了每個(gè)模式的使用場(chǎng)景畦徘,變體毕籽,不足抬闯,以及如何克服這些不足。這本書行文嚴(yán)謹(jǐn)緊湊(四位作者都是PhD)关筒,并且代碼源自實(shí)際項(xiàng)目溶握,屬于設(shè)計(jì)模式領(lǐng)域的必讀之作。
需要注意: 設(shè)計(jì)模式 不適合 初學(xué)者閱讀——它更像是一篇博士論文而非技術(shù)書籍蒸播,加上它的范例都具有很強(qiáng)的領(lǐng)域背景(諸如 GUI 窗口系統(tǒng)和富文本編輯器)睡榆,缺乏實(shí)際經(jīng)驗(yàn)的程序員很難理解這本書。
延伸閱讀:
敏捷軟件開發(fā)(原則模式與實(shí)踐) :盡管標(biāo)題帶有“敏捷”袍榆,但這本書實(shí)際是一本面向?qū)ο蟪绦蛟O(shè)計(jì)讀物—— Bob 大叔 通過豐富的例子講解設(shè)計(jì)模式的應(yīng)用和 SOLID 面向?qū)ο笤O(shè)計(jì)原則 )胀屿,如果你覺著 設(shè)計(jì)模式 過于晦澀,那么你完全可以從這本書開始學(xué)習(xí)蜡塌。這本書使用Java作為講解語言碉纳,它也有對(duì)應(yīng)的 C# 版本 ;
代碼整潔之道 :同樣是 Bob 大叔 的作品馏艾,這本書教導(dǎo)讀者使用面向?qū)ο?敏捷開發(fā)原則編寫清晰可維護(hù)的代碼;
企業(yè)應(yīng)用架構(gòu)模式 :這本書專注于架構(gòu)奴愉,作者 Martin Fowler 針對(duì)企業(yè)應(yīng)用的特點(diǎn)(諸如持久化數(shù)據(jù)琅摩,多人訪問,操作數(shù)據(jù)的界面以及復(fù)雜的業(yè)務(wù)邏輯)锭硼,總結(jié)出若干企業(yè)架構(gòu)模式房资,以便程序員構(gòu)建強(qiáng)大且可擴(kuò)展的企業(yè)應(yīng)用。
3. 重構(gòu)
重構(gòu)
任何產(chǎn)品代碼都不是一蹴而就檀头,而是在反復(fù)不斷的修改中進(jìn)化而來轰异。 重構(gòu) 正是這樣一本介紹如何改進(jìn)代碼的書籍——如何在保持代碼行為的基礎(chǔ)上,提升代碼的質(zhì)量(這也是重構(gòu)的定義)暑始。
我見過很多程序員搭独,他們經(jīng)常聲稱自己在重構(gòu)代碼,但他們實(shí)際只做了第二步(提升代碼的質(zhì)量)廊镜,卻沒有保證第一步(保持代碼行為)牙肝,因此他們所謂的重構(gòu)往往會(huì)適得其反——破壞現(xiàn)有代碼或是引入新 bug。這也是我推薦 重構(gòu) 這本書的原因——它既介紹糟糕代碼的特征(Bad smell)和改進(jìn)代碼的方法嗤朴,也給出了重構(gòu)的完整流程——1. 編寫單元測(cè)試保持(Preserve)程序行為配椭;2. 重構(gòu)代碼;3. 保證單元測(cè)試通過雹姊。 重構(gòu) 還引入了一套重構(gòu)術(shù)語(諸如封裝字段股缸,內(nèi)聯(lián)方法,和字段上移)吱雏,以便程序員之間交流敦姻。只有理解了這三個(gè)方面瘾境,才能算是理解重構(gòu)。
修改代碼的藝術(shù)
這里再重復(fù)一遍重構(gòu)的定義——在保持代碼行為的基礎(chǔ)上替劈,提升代碼的質(zhì)量寄雀。 重構(gòu) 專注于第二步,即如何提升代碼的質(zhì)量陨献,而 修改代碼的藝術(shù) 專注于第一步盒犹,即如何保持代碼的行為。
提升代碼質(zhì)量并不困難眨业,但保持代碼行為就難多了急膀,尤其是對(duì)沒有測(cè)試的遺留代碼(Legacy Code)而言——你需要首先引入測(cè)試,但遺留代碼往往可測(cè)試性(Testability)很差龄捡,這時(shí)你就需要把代碼變的可測(cè)試卓嫂。 修改代碼的藝術(shù) 包含大量的實(shí)用建議,用來把代碼變的可測(cè)試(Testable)聘殖,從而使重構(gòu)變?yōu)榭赡艹况ǎ固岣叽a質(zhì)量變?yōu)榭赡堋?/p>
延伸閱讀:
重構(gòu)與模式 :這本書的中文書名存在誤導(dǎo),它的原書書名是 Refactoring to Patterns——通過重構(gòu)奸腺,把模式引入代碼餐禁。這本書闡述了重構(gòu)和設(shè)計(jì)模式之間的關(guān)系,使得程序員可以在更高的層次上思考重構(gòu)突照,進(jìn)行重構(gòu)帮非。
4. 軟件測(cè)試
How to Break Software
關(guān)于軟件測(cè)試的書籍很多,但很少有一本測(cè)試書籍能像 How to Break Software 這般既有趣又實(shí)用讹蘑。不同于傳統(tǒng)的軟件測(cè)試書籍(往往空話連篇末盔,無法直接應(yīng)用), How to Break Software 非常實(shí)際——它從程序員的心理出發(fā)座慰,分析軟件錯(cuò)誤/Bug最可能產(chǎn)生的路徑陨舱,然后針對(duì)這些路徑進(jìn)行 殘酷 的測(cè)試,以保證軟件質(zhì)量角骤。
我在第一次閱讀這本書時(shí)大呼作者太過“殘忍”——連這些刁鉆詭異的測(cè)試招數(shù)都能想出來隅忿。但這種毫不留情(Relentless)的測(cè)試風(fēng)格正是每個(gè)專業(yè)程序員所應(yīng)具備的心態(tài)。
注意:如果你是一個(gè)測(cè)試工程師邦尊,那么在閱讀這本書前請(qǐng)三思——因?yàn)殚喿x它之后你會(huì)讓你身邊的程序員苦不堪言背桐,甚至連掐死你的心都有 :-D。
xUnit Test Patterns
How to Break Software 注重黑盒測(cè)試蝉揍,而這本 xUnit Test Patterns 則注重白盒測(cè)試链峭。正如書名所示, xUnit Test Patterns 覆蓋了單元測(cè)試的每個(gè)方面:從如何編寫良好的單元測(cè)試又沾,到如何設(shè)計(jì)可測(cè)試(Testable)的軟件弊仪,再到如何重構(gòu)測(cè)試——可以把它看作為單元測(cè)試的百科全書熙卡。
延伸閱讀:
Practical Unit Testing with JUnit and Mockito :盡管 xUnit Test Patterns 覆蓋了單元測(cè)試的方方面面,但它的問題在于不夠與時(shí)俱進(jìn)(07 年出版)励饵。 Practical Unit Testing 彌補(bǔ)了這個(gè)缺陷——它詳細(xì)介紹了如何通過測(cè)試框架 JUnit 和 Mock 框架 Mockito 編寫良好的單元測(cè)試驳癌,并給出了大量?jī)?yōu)秀單元測(cè)試的原則;
單元測(cè)試的藝術(shù)(第 2 版) :可以把這本書看作為前一本書的.Net版役听,適合.Net程序員颓鲜;
Google 軟件測(cè)試之道 :這本書詳細(xì)介紹了 Google 如何測(cè)試軟件——包括Google的軟件測(cè)試流程以及Google軟件測(cè)試工程師的日常工作/職業(yè)發(fā)展。需要注意的是:這本書中的測(cè)試流程在國(guó)內(nèi)很可能行不通(國(guó)內(nèi)企業(yè)缺乏像Google那般強(qiáng)大的基礎(chǔ)設(shè)施(Infrastructure))典予,但它至少可以讓國(guó)內(nèi)企業(yè)有一個(gè)可以效仿的目標(biāo)甜滨;
探索式軟件測(cè)試 : James Whittaker 的另一本測(cè)試著作,不同于傳統(tǒng)的黑盒/白盒測(cè)試瘤袖,這本書創(chuàng)造性的把測(cè)試比喻為“探索”(Exploration)衣摩,然后把不同的探索方式對(duì)應(yīng)到不同的測(cè)試方式上,以便盡早發(fā)現(xiàn)更多的軟件錯(cuò)誤/Bug捂敌。
5. 項(xiàng)目管理
極客與團(tuán)隊(duì)
很多程序員都向往成為橫掃千軍(One-man Army)式的“編程英雄”艾扮,但卓越的軟件并非一人之力,而是由團(tuán)隊(duì)合力而成占婉。 極客與團(tuán)隊(duì) 就是這樣一本寫給程序員的如何在團(tuán)隊(duì)中工作的絕好書籍栏渺,它圍繞著 HRT 三大原則(Humility 謙遜,Respect 尊重锐涯,和 Trust 信任),系統(tǒng)的介紹了如何融入團(tuán)隊(duì)填物,如何打造優(yōu)秀的團(tuán)隊(duì)纹腌,如何領(lǐng)導(dǎo)團(tuán)隊(duì),以及如何應(yīng)對(duì)團(tuán)隊(duì)中的害群之馬(Poisonous People)滞磺。這本書實(shí)用性極強(qiáng)升薯,以至于 Python 之父 Guido van Rossum 都盛贊這本書 “說出了我一直在做但總結(jié)不出來的東西”。
人月神話
盡管 人月神話 成書于 40 年前击困,但它仍是軟件項(xiàng)目管理最重要的書籍涎劈。 人月神話 源自作者 Fred Brooks 領(lǐng)導(dǎo)并完成 System/360 和 OS/360 這兩個(gè)即是放到現(xiàn)在也是巨型軟件項(xiàng)目的里程碑項(xiàng)目的經(jīng)驗(yàn)總結(jié)。它覆蓋了軟件項(xiàng)目各個(gè)方面的關(guān)鍵概念:從工期管理( Brooks定律 )到團(tuán)隊(duì)建設(shè)( 外科團(tuán)隊(duì) )阅茶,從程序設(shè)計(jì)(編程的本質(zhì)是使用正確的數(shù)據(jù)結(jié)構(gòu))到架構(gòu)設(shè)計(jì)( 概念完整性 )蛛枚,從原型設(shè)計(jì)(Plan to Throw one away)到團(tuán)隊(duì)交流(形式化文檔+會(huì)議)。令人驚訝的是脸哀,即便40年之后蹦浦, 人月神話 中的關(guān)鍵概念(包括焦油坑, Brooks定律 撞蜂, 概念完整性 盲镶, 外科團(tuán)隊(duì) 侥袜, 第二版效應(yīng) 等等)依然適用,而軟件開發(fā)的 核心復(fù)雜度 仍然沒有得到解決( 沒有銀彈 )溉贿。
延伸閱讀:
人件(原書第3版) :從人的角度分析軟件項(xiàng)目枫吧。 人件 從雇傭正確的人,創(chuàng)建健康的工作環(huán)境宇色,以及打造高效的開發(fā)團(tuán)隊(duì)等角度闡述了如何改善人九杂,從而改善軟件項(xiàng)目;
門后的秘密:卓越管理的故事 :這本書生動(dòng)的再現(xiàn)了軟件項(xiàng)目管理工作的場(chǎng)景代兵,并給出了各種實(shí)用管理技巧尼酿,如果你有意轉(zhuǎn)向管理崗位,這本書不容錯(cuò)過植影;
大教堂與集市 :這本書從黑客的歷史說起裳擎,系統(tǒng)而又風(fēng)趣的講述了開源運(yùn)動(dòng)的理論和實(shí)踐,以及開源軟件項(xiàng)目是如何運(yùn)作并發(fā)展的思币。了解開源鹿响,從這本書開始。
6. 專業(yè)開發(fā)
程序員修煉之道:從小工到專家
不要被庸俗的譯名迷惑谷饿, 程序員修煉之道 是一本價(jià)值極高的程序員成長(zhǎng)手冊(cè)惶我。這本書并不局限于特定的編程語言或框架,而是提出了一套切實(shí)可行的實(shí)效(Pragmatic)開發(fā)哲學(xué)博投,并通過程序設(shè)計(jì)绸贡,測(cè)試,編程工具毅哗,以及項(xiàng)目管理等方面的實(shí)例展示了如何應(yīng)用這套開發(fā)哲學(xué)听怕,從而使得程序員更加高效專業(yè)。有人把這本書稱之為迷你版 代碼大全 —— 代碼大全 給出了大量的優(yōu)秀程序設(shè)計(jì)實(shí)踐虑绵,偏向術(shù)尿瞭;而 程序員修煉之道 給出了程序設(shè)計(jì)實(shí)踐背后的思想,注重道翅睛。
程序員職業(yè)素養(yǎng)
程序員修煉之道 指出了如何成為專業(yè)程序員声搁,這本 程序員職業(yè)素養(yǎng) 則指出了專業(yè)程序員應(yīng)該是什么樣子——承擔(dān)責(zé)任;知道自己在做什么捕发;知道何時(shí)說不/何時(shí)說是疏旨;在正確的時(shí)間編寫正確的代碼;懂得自我時(shí)間管理和工期預(yù)估爬骤;知道如何應(yīng)對(duì)壓力充石。如果你想成為專業(yè)程序員(Professional Developer)(而不是碼農(nóng)(Code Monkey)),這本書會(huì)為你指明前進(jìn)的方向。
延伸閱讀:
高效程序員的 45 個(gè)習(xí)慣 :“敏捷”版的 程序員修煉之道 骤铃,可以把這本書作為 程序員修煉之道 的補(bǔ)充拉岁;
精益創(chuàng)業(yè) :盡管這是一本講如何創(chuàng)業(yè)的書,但其中的精益生產(chǎn)惰爬,最小價(jià)值產(chǎn)品喊暖,以及構(gòu)建-度量-學(xué)習(xí)循環(huán)都值得程序員借鑒。
7. 大師之言
奇思妙想:15 位計(jì)算機(jī)天才及其重大發(fā)現(xiàn)
奇思妙想:15 位計(jì)算機(jī)天才及其重大發(fā)現(xiàn) 是一本極具眼光的技術(shù)訪談書籍——在這本書訪談的 15 位計(jì)算機(jī)科學(xué)家中撕瞧,竟出現(xiàn)了 12 位 圖靈獎(jiǎng) 獲得者——要知道圖靈獎(jiǎng)從 1966 年設(shè)獎(jiǎng)到現(xiàn)在也只有六十幾位獲獎(jiǎng)?wù)叨选?/p>
奇思妙想 把計(jì)算機(jī)科學(xué)分為四大領(lǐng)域:編程語言陵叽;算法;架構(gòu)丛版;人工智能巩掺。并選取了每個(gè)領(lǐng)域下最具代表性的計(jì)算機(jī)科學(xué)家進(jìn)行訪談。因?yàn)檫@些計(jì)算機(jī)科學(xué)家都是其所在領(lǐng)域的開拓者页畦,因此他們能給出常人無法給出的深刻見解胖替。通過這本書,你可以了解前三十年的計(jì)算機(jī)科學(xué)的發(fā)展歷程——計(jì)算機(jī)科學(xué)家做了什么豫缨,而計(jì)算機(jī)又能做到/做不到什么独令。從而避免把時(shí)間浪費(fèi)在前人已經(jīng)解決的問題(或者根本無法解決的問題)上面。
編程人生:15位軟件先驅(qū)訪談錄
同樣是訪談錄好芭,同樣訪談 15 個(gè)人燃箭, 編程人生 把重點(diǎn)放在程序員(Coders at work)上。它從各個(gè)領(lǐng)域選取了15位頂尖的程序員舍败,這些程序員既包括 Ken Thompson 和 Jamie Zawinski 這些老牌Unix黑客招狸,也包括 Brad Fitzpatrick 這樣的80后新生代,還包括 Frances Allen 和 Donald Knuth 這樣的計(jì)算機(jī)科學(xué)家邻薯。這種多樣性(Diversity)使得 編程人生 兼具嚴(yán)謹(jǐn)性和趣味性瓢颅,無論你是什么類型的程序員,都能從中受益良多弛说。
延伸閱讀:
圖靈和 ACM 圖靈獎(jiǎng)(1966-2011) :通過圖靈獎(jiǎng)介紹整個(gè)計(jì)算機(jī)科學(xué)發(fā)展史,非常難得的國(guó)產(chǎn)精品圖書翰意;
編程大師訪談錄 :可以把這本書看作為二十年前的 編程人生 木人,被訪談?wù)叨际钱?dāng)時(shí)叱咤風(fēng)云的人物(例如微軟的創(chuàng)造者 Bill Gates ,Macintosh 的發(fā)明者 Jeff Raskin 冀偶,以及 Adobe 的創(chuàng)始人 John Warnock 等等)醒第。有趣的是這本書中大量的經(jīng)驗(yàn)和建議到如今依然適用;
編程大師智慧 :類似于 編程人生 进鸠,不同的是被訪談?wù)叨际蔷幊陶Z言的設(shè)計(jì)者——這本書覆蓋了除C語言以外的幾乎所有主流編程語言稠曼。通過這本書,你可以從中學(xué)到編程語言背后的設(shè)計(jì)思想——編程語言為什么要被設(shè)計(jì)成這樣客年,是什么促使設(shè)計(jì)者要在語言中加入這個(gè)特性(或拒絕那個(gè)特性)霞幅。從而提升對(duì)編程語言的理解漠吻。
8. 界面設(shè)計(jì)
寫給大家看的設(shè)計(jì)書
書如其名, 寫給大家看的設(shè)計(jì)書 是一本面向初學(xué)者的快速設(shè)計(jì)入門司恳。它覆蓋了版式途乃,色彩,和字體這三個(gè)設(shè)計(jì)中的關(guān)鍵元素扔傅,并創(chuàng)造性的為版式設(shè)計(jì)總結(jié)出CRAP四大原則(Contrast 對(duì)比耍共,Repetition 重復(fù),Alignment 對(duì)齊猎塞,Proximity 親密)试读。全書使用豐富生動(dòng)的范例告訴讀者什么是好的設(shè)計(jì),什么是不好的設(shè)計(jì)荠耽,使得即便是對(duì)設(shè)計(jì)一無所知的人钩骇,也可以從這本書快速入門。
認(rèn)知與設(shè)計(jì):理解UI設(shè)計(jì)準(zhǔn)則(第 2 版)
寫給大家看的設(shè)計(jì)書 強(qiáng)調(diào)實(shí)踐骇塘,即如何做出好的設(shè)計(jì)伊履; 認(rèn)知與設(shè)計(jì):理解 UI 設(shè)計(jì)準(zhǔn)則 強(qiáng)調(diào)理論,即為什么我們會(huì)接受這樣的設(shè)計(jì)而反感那樣的設(shè)計(jì)款违。如果你想要搞清楚設(shè)計(jì)背后的心理學(xué)知識(shí)策幼,但又不想閱讀大部頭的心理學(xué)著作聚假,那么 認(rèn)知與設(shè)計(jì) 是你的首選。
延伸閱讀:
GUI 設(shè)計(jì)禁忌 2.0 :這本書指出了 GUI 設(shè)計(jì)的原則和常見誤區(qū),然后通過具體范例指出了如何避免這些誤區(qū)处硬。如果你的工作涉及到用戶界面,那么這本書會(huì)為你減少很多麻煩厘肮;
界面設(shè)計(jì)模式(第 2 版) :這本書將用戶界面中的常見元素/行為組織成彼此關(guān)聯(lián)的模式拷橘,以便讀者理解并舉一反三,從而將其運(yùn)用到自己的應(yīng)用中气嫁;
移動(dòng)應(yīng)用 UI 設(shè)計(jì)模式 :類似于 界面設(shè)計(jì)模式 当窗,但面向移動(dòng)平臺(tái)。它給出了 iOS寸宵,Android崖面,以及Windows Phones 上常用的 90 余種界面設(shè)計(jì)模式,從而使得你不必把這些平臺(tái)的應(yīng)用挨個(gè)玩一遍也可以掌握各個(gè)平臺(tái)的設(shè)計(jì)精髓梯影。如果你主攻 Android 平臺(tái)巫员,那么 Android 應(yīng)用 UI 設(shè)計(jì)模式 會(huì)是更好的選擇;
配色設(shè)計(jì)原理 和 版式設(shè)計(jì)原理 :如果你讀過 寫給大家看的設(shè)計(jì)書 之后想繼續(xù)深入學(xué)習(xí)設(shè)計(jì)甲棍,這兩本書是不錯(cuò)的起點(diǎn)简识。
9. 交互設(shè)計(jì)
通用設(shè)計(jì)法則
書如其名, 通用設(shè)計(jì)法則 給出了重要的 125 個(gè)設(shè)計(jì)原則,并用簡(jiǎn)練的語言和范例展示了這些原則的實(shí)際應(yīng)用七扰。每個(gè)原則都有對(duì)應(yīng)的參考文獻(xiàn)奢赂,以便讀者進(jìn)一步學(xué)習(xí)。我之所以推薦這本書戳寸,是因?yàn)椋?. 程序員需要對(duì)設(shè)計(jì)有全面的認(rèn)識(shí)呈驶;2. 程序員并不需要知道這些設(shè)計(jì)原則是怎么來的,知道怎么用即可疫鹊。這本書很好的滿足了這兩個(gè)要求袖瞻。
交互設(shè)計(jì)精髓(第3版)
交互設(shè)計(jì)精髓 是交互設(shè)計(jì)領(lǐng)域的圣經(jīng)級(jí)著作。交互設(shè)計(jì)專家(以及 VB 之父) Alan Cooper 在這本書中詳細(xì)介紹了交互設(shè)計(jì)的原則拆吆,流程聋迎,以及方法,然后通過各種范例(主要來自桌面系統(tǒng))展示了如何應(yīng)用這些原則枣耀。
需要注意的是這本書的 第 4 版 已經(jīng)出版霉晕,它在第三版的基礎(chǔ)上增加了移動(dòng)設(shè)計(jì)以及 Web 設(shè)計(jì)等內(nèi)容。
延伸閱讀:
The Design of Everyday Things :交互設(shè)計(jì)領(lǐng)域的另一本經(jīng)典之作捞奕,它通過解讀人類行動(dòng)背后的心理活動(dòng)牺堰,展示了設(shè)計(jì)問題的根源,并給出了一系列方法用以解決設(shè)計(jì)問題(需要注意颅围,盡管這本書有中譯版伟葫,但中譯版對(duì)應(yīng)的是 02 年的舊版,而非13年的新版)院促;
The Inmates Are Running the Asylum : Alan Cooper 的另一本經(jīng)典筏养,這本書非常辛辣的指出讓不具備人機(jī)交互知識(shí)的程序員直接編寫面向用戶的軟件就像讓精神病人管理瘋?cè)嗽海═he Inmates Are Running the Asylum),然后給出了一套交互設(shè)計(jì)流程以挽救這個(gè)局面常拓;
簡(jiǎn)約至上:交互式設(shè)計(jì)四策略 :專注于把產(chǎn)品變的更加簡(jiǎn)單易用渐溶。作者通過刪除,組織弄抬,隱藏茎辐,和轉(zhuǎn)移這四個(gè)策略,展示了如何創(chuàng)造出簡(jiǎn)約優(yōu)質(zhì)的用戶體驗(yàn)掂恕。
個(gè)人成長(zhǎng)
1. 職業(yè)規(guī)劃
軟件開發(fā)者路線圖
軟件開發(fā)者路線圖 是一本優(yōu)秀且實(shí)用的程序員職業(yè)規(guī)劃手冊(cè)荔茬。這本書由若干個(gè)模式組成,每個(gè)模式都對(duì)應(yīng)于程序員職業(yè)生涯中的特定階段竹海。通過這本書,讀者可以很方便的找到自己目前所處的模式(階段)丐黄,應(yīng)該做什么斋配,目標(biāo)是什么,以及下一個(gè)模式(階段)會(huì)是什么。如果你時(shí)常感到迷茫艰争,那么請(qǐng)閱讀這本 路線圖 坏瞄,找到自己的位置,確定接下來的方向甩卓。
延伸閱讀:
卡耐基全集 :非常著名的為人處世書籍鸠匀。很多人把這本書歸類到成功學(xué),但我并不這么認(rèn)為——在我看來逾柿,這本書教的更多的是如何成為一個(gè)讓大家喜歡的人缀棍。作為天天和機(jī)器打交道的程序員,這套書會(huì)幫助我們與人打交道机错;
沃頓商學(xué)院最受歡迎的談判課 :這本書不是教你去談判爬范,而是教你通過談判(Negotiation)去得到更多(Getting more,這也是這本書的原書書名)弱匪。小到買菜砍價(jià)青瀑,大到爭(zhēng)取項(xiàng)目,這本書中的談判原則會(huì)讓你收益良多萧诫;
程序員健康指南 :作為長(zhǎng)期與計(jì)算機(jī)打交道的職業(yè)斥难,程序員往往會(huì)受到各式各樣疾病的困擾,這本書正是為了解決這個(gè)問題而出現(xiàn):它從改善工作環(huán)境帘饶,調(diào)整飲食結(jié)構(gòu)哑诊,預(yù)防頭痛眼痛,以及進(jìn)行室內(nèi)/室外鍛煉等方面出發(fā)尖奔,給出了一套全面且可行的程序員健康改善計(jì)劃搭儒,以幫助程序員打造健康的身體。
2. 思維方式
程序員的思維修煉:開發(fā)認(rèn)知潛能的九堂課
作為程序員提茁,我們需要不斷地學(xué)習(xí)——既要學(xué)習(xí)新技術(shù)淹禾,也要學(xué)習(xí)如何解決各種領(lǐng)域的問題。為了提升學(xué)習(xí)效率茴扁,我們需要學(xué)習(xí) 如何學(xué)習(xí)铃岔。 程序員的思維修煉 正是這樣一本講如何學(xué)習(xí)的書,它集合了認(rèn)知科學(xué)峭火,神經(jīng)學(xué)毁习,以及行為理論的最新研究成果,并系統(tǒng)的介紹了大腦的工作機(jī)制卖丸。通過這本書纺且,你將學(xué)會(huì)如何高效的使用自己的大腦,從而提高思考能力稍浆,改善學(xué)習(xí)效率载碌。
如何把事情做到最好
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.
為什么同樣資質(zhì)的人猜嘱,大多數(shù)人會(huì)碌碌無為,而只有極少數(shù)能做到登峰造極嫁艇?如何在領(lǐng)域內(nèi)做到頂尖朗伶?如何克服通往頂尖之路上的重重險(xiǎn)阻? 如何把事情做到最好 回答了這些問題步咪,并極具哲理的指出登峰造極并不是結(jié)果论皆,而是一段永不停止的旅程。閱讀這本書不會(huì)讓你立刻脫胎換骨猾漫,但它會(huì)指引你走向正確的道路——通往登峰造極之路点晴。
延伸閱讀:
怎樣解題:數(shù)學(xué)思維的新方法 :不要被標(biāo)題中的“數(shù)學(xué)思維”嚇到,它并不僅僅只是一本數(shù)學(xué)解題書静袖,它所提出的四步解題法(理解題目->擬定方案->執(zhí)行計(jì)劃->總結(jié)反思)適用于任何領(lǐng)域觉鼻;
暗時(shí)間 : 劉未鵬 所寫的關(guān)于學(xué)習(xí)思維方法的文章集,既包含了他對(duì)學(xué)習(xí)方法的思考队橙,也包含了大量進(jìn)一步閱讀的資源坠陈;
批判性思維:帶你走出思維的誤區(qū) :這本書系統(tǒng)的分析了人類思維的常見誤區(qū),并針對(duì)各個(gè)誤區(qū)給出了解決方案捐康,從而幫助程序員養(yǎng)成嚴(yán)謹(jǐn)正確的思考方式仇矾;
Conceptual Blockbusting: A Guide to Better Ideas :與批判性思維相反,這本書專注于創(chuàng)造性思維(Creative Thinking)解总,它分析了阻礙創(chuàng)造性思維的常見思維障礙(Blockbuster)以及這些思維障礙背后的成因贮匕,并給出了各種方法以破除這些障礙。
3. 求職面試
金領(lǐng)簡(jiǎn)歷:敲開蘋果微軟谷歌的大門
知己知彼花枫,百戰(zhàn)不殆刻盐。 金領(lǐng)簡(jiǎn)歷:敲開蘋果微軟谷歌的大門 是程序員求職的必讀書籍,它覆蓋了程序員求職的方方面面:從開始準(zhǔn)備到編寫簡(jiǎn)歷劳翰,從技術(shù)面試到薪酬談判敦锌。由于該書作者曾在 Google,微軟佳簸,和蘋果任職并進(jìn)行過技術(shù)招聘乙墙,因此這本書的內(nèi)容非常實(shí)用。
順便吐個(gè)槽:這本書翻譯的還不錯(cuò)生均,但我實(shí)在無法理解封面上的“進(jìn)入頂級(jí)科技公司的葵花寶典”這段文字——找個(gè)工作而已听想,用不著切JJ這么兇殘吧。-_-#
程序員面試金典(第 5 版)
同樣是來自 金領(lǐng)簡(jiǎn)歷 作者的作品马胧, 程序員面試金典(第 5 版) 專注于技術(shù)面試題汉买,它既包含了 IT 企業(yè)(諸如微軟,Google佩脊,和蘋果)的面試流程以及如何準(zhǔn)備技術(shù)面試蛙粘,也包含了大量(超過200道)常見技術(shù)面試題題目以及解題思路朽色。無論你打算進(jìn)入國(guó)內(nèi)企業(yè)還是外企,你都應(yīng)該把這本書的題目練一遍组题,以找到技術(shù)面試的感覺(我在求職時(shí)就曾經(jīng)專門搞了一塊白板,然后每二十分鐘一道題的練習(xí)抱冷,效果很不錯(cuò))崔列。
延伸閱讀:
編程之美:微軟技術(shù)面試心得 :恐怕是國(guó)內(nèi)技術(shù)面試第一書,這本書里面的多數(shù)題目都曾經(jīng)是國(guó)內(nèi)IT企業(yè)面試的必問題目旺遮。這本書的缺點(diǎn)是它太舊而且被用濫了(以至于一些企業(yè)開始避免使用這本書上的題目)——但你可以把它當(dāng)成一本算法趣題來讀赵讯;
劍指 Offer:名企面試官精講典型編程題 :相對(duì)于東拼西湊的XX面試寶典, 劍指Offer 是一本少見的國(guó)產(chǎn)精品技術(shù)面試書籍耿眉,盡管這本書的技術(shù)面試題目不多(60 余道)边翼,但作者為大多數(shù)題目都給出了不同方式的解法,并分析了這些解法之間的優(yōu)劣鸣剪,此外作者還以面試官的視角分析了技術(shù)面試的各個(gè)環(huán)節(jié)组底,從而幫助讀者把握技術(shù)面試;
人人都有好工作:IT 行業(yè)求職面試必讀 :可以把它看做 金領(lǐng)簡(jiǎn)歷 的補(bǔ)充閱讀——這本書的特點(diǎn)在于它給出了非常詳細(xì)的簡(jiǎn)歷/求職信/電子郵件編寫技巧筐骇,而這正是不少國(guó)內(nèi)程序員所缺乏的债鸡。
4. 英語寫作
The Only Grammar Book You'll Ever Need
詞匯量決定閱讀能力,語法決定寫作能力铛纬。計(jì)算機(jī)專業(yè)詞匯并不多厌均,但精確性非常重要,因此每個(gè)程序員都應(yīng)具備良好的英語語法告唆,但程序員并不需要過于專業(yè)的英語語法——掌握常用語法并把它用對(duì)就可以棺弊。 The Only Grammar Book You’ll Ever Need 正好可以滿足這個(gè)需求,盡管它篇幅不大(不足 200 頁)擒悬,卻覆蓋了英語中的關(guān)鍵語法以及常見錯(cuò)誤模她。把這本書讀兩遍,它會(huì)大幅度提高你的英語寫作能力茄螃。
風(fēng)格的要素
既是最暢銷的英語寫作書籍缝驳,也是計(jì)算機(jī)書籍中引用最多的非計(jì)算機(jī)書籍。 風(fēng)格的要素 用極其簡(jiǎn)練的語言講述了如何進(jìn)行 嚴(yán)肅归苍,精確用狱,清楚 的英語寫作。從這本書中拼弃,你不僅可以學(xué)到英語寫作夏伊,更可以學(xué)到一種嚴(yán)謹(jǐn)至簡(jiǎn)的處事態(tài)度,而這正是專業(yè)開發(fā)所必需的吻氧。
延伸閱讀:
牛津英語用法指南(第 3 版) :全面且權(quán)威的英語用法指南溺忧,它覆蓋語法咏连,詞匯,發(fā)音鲁森,以及修辭等方面祟滴,并兼顧口語和書面語,以幫助讀者掌握合理的英語用法(Proper English Usage)歌溉。不要被這本書的篇幅(1000 多頁)嚇到——原書并沒有這么厚垄懂,因?yàn)檫@本書被翻譯成中文但又得保留原有的英文內(nèi)容,所以它的篇幅幾乎翻了一倍痛垛〔莼郏考慮到這本書使用的詞匯都很基礎(chǔ),所以我認(rèn)為具有英語基礎(chǔ)的讀者直接閱讀原版( Practical English Usage )會(huì)更合適匙头;
寫作法寶:非虛構(gòu)寫作指南(30周年紀(jì)念版) :詳盡的非虛構(gòu)(Non-Fiction)寫作指南漫谷,無論你要寫地方,技術(shù)蹂析,商務(wù)舔示,運(yùn)動(dòng),藝術(shù)识窿,還是自傳斩郎,你都可以從這本書中找到珍貴的建議;
中式英語之鑒 :中國(guó)人使用英語最大的問題就是會(huì)把中式思維摻雜其中喻频,從而形成啰里啰嗦不倫不類的中式英語(Chinglish)缩宜。 中式英語之鑒 系統(tǒng)的探討了中式英語以及其成因,然后根據(jù)成因?qū)χ惺接⒄Z進(jìn)行歸類甥温,并對(duì)每個(gè)類別給出了大量的實(shí)際案例以及修改建議锻煌。如果你想擺脫中式英語,那么這本書是絕好的起點(diǎn)姻蚓。
如何使用這個(gè)書單
學(xué)而不思則罔宋梧,思而不學(xué)則殆。
不憤不啟狰挡,不悱不發(fā)捂龄。舉一隅不以三隅反,則不復(fù)也加叁。
不聞不若聞之倦沧,聞之不若見之,見之不若知之它匕,知之不若行之展融,學(xué)至于行之而止矣。
來自他人的書單
它山之石豫柬,可以攻玉告希。我在本文最后給出其他中外優(yōu)秀程序員的書單扑浸,以便參考&補(bǔ)充。
劉未鵬(暗時(shí)間作者)
以下同一條目下用“/”隔開的表示任選燕偶,當(dāng)然也可以都讀喝噪。
編碼:隱匿在計(jì)算機(jī)軟硬件背后的語言
深入理解計(jì)算機(jī)系統(tǒng) / Windows 核心編程 / 程序員的自我修養(yǎng)
代碼大全 / 程序員修煉之道
編程珠璣 / 算法概論 / 算法設(shè)計(jì) / 編程之美
C 程序設(shè)計(jì)語言
C++ 程序設(shè)計(jì)語言 / C++ 程序設(shè)計(jì)原理與實(shí)踐 / Accelerated C++
計(jì)算機(jī)程序的構(gòu)造與解釋
代碼整潔之道 / 實(shí)現(xiàn)模式
設(shè)計(jì)模式 / 敏捷軟件開發(fā)(原則模式與實(shí)踐)
重構(gòu)
云風(fēng)(中國(guó)游戲編程先行者,前網(wǎng)易游戲部門資深程序員指么,簡(jiǎn)悅創(chuàng)始人)
C++ 編程思想
Effective C++
深度探索 C++ 對(duì)象模型
C++ 語言的設(shè)計(jì)與演化
C 專家編程
C 陷阱與缺陷
C 語言接口與實(shí)現(xiàn)
Lua 程序設(shè)計(jì)
鏈接器和加載器
COM 本質(zhì)論
Windows 核心編程
深入解析 Windows 操作系統(tǒng)
程序員修煉之道
代碼大全
UNIX 編程藝術(shù)
設(shè)計(jì)模式
代碼優(yōu)化:有效使用內(nèi)存
深入理解計(jì)算機(jī)系統(tǒng)
深入理解 LINUX 內(nèi)核
TCP/IP 詳解
洪強(qiáng)寧(豆瓣技術(shù)總監(jiān))
代碼大全
人月神話
編碼:隱匿在計(jì)算機(jī)軟硬件背后的語言
計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)
程序員修煉之道
設(shè)計(jì)模式
計(jì)算機(jī)程序的構(gòu)造與解釋
重構(gòu)
C 程序設(shè)計(jì)語言
算法導(dǎo)論
陳皓(CoolShell博主)
點(diǎn)石成金:訪客至上的 Web 和移動(dòng)可用性設(shè)計(jì)秘笈
重來:更為簡(jiǎn)單有效的商業(yè)思維
黑客與畫家
清醒思考的藝術(shù)
TCP/IP 詳解
UNIX 環(huán)境高級(jí)編程
UNIX 網(wǎng)絡(luò)編程
張崢(微軟亞洲研究院副院長(zhǎng))
算法概論
Data Structure and Algorithms
C 程序設(shè)計(jì)語言
UNIX 操作系統(tǒng)設(shè)計(jì)
編譯原理
計(jì)算機(jī)體系結(jié)構(gòu):量化研究方法
當(dāng)下的幸福
異類:不一樣的成功啟示錄
Jeff Atwood(Stackoverflow聯(lián)合創(chuàng)始人)
代碼大全
人月神話
點(diǎn)石成金:訪客至上的Web和移動(dòng)可用性設(shè)計(jì)秘笈
快速軟件開發(fā)
人件
The Design of Everyday Things
交互設(shè)計(jì)精髓
The Inmates Are Running the Asylum
GUI設(shè)計(jì)禁忌 2.0
編程珠璣
程序員修煉之道
精通正則表達(dá)式
Joel Spolsky(Stackoverflow聯(lián)合創(chuàng)始人)
軟件項(xiàng)目管理
人件
人月神話
快速軟件開發(fā)
編程技藝
代碼大全
程序員修煉之道
編程哲學(xué)
禪與摩托車維修藝術(shù)
哥德爾仙逻、艾舍爾、巴赫:集異璧之大成
建筑模式語言
界面設(shè)計(jì)
點(diǎn)石成金:訪客至上的 Web 和移動(dòng)可用性設(shè)計(jì)秘笈
交互設(shè)計(jì)精髓
The Design of Everyday Things
資本運(yùn)作
漫步華爾街
圖形設(shè)計(jì)
寫給大家看的設(shè)計(jì)書
思維方式
影響力
Helplessness On Depression, Development and Death
編程入門
編碼:隱匿在計(jì)算機(jī)軟硬件背后的語言
C 程序設(shè)計(jì)語言
DHH(Ruby on Rails創(chuàng)始人)
Smalltalk Best Practice Patterns
重構(gòu)
企業(yè)應(yīng)用架構(gòu)模式
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)
你的燈亮著嗎涧尿?發(fā)現(xiàn)問題的真正所在
參考
怎樣花兩年時(shí)間去面試一個(gè)人
What is the single most influential book every programmer should read?
Recommended Reading for Developers
Book Reviews – Joel Spolsky
The five programming books that meant most to me
以上