本文转载自:http://lucida.me/blog/developer-reading-list/

本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读。旨在成为最好最全面的程序员必读书单。

前言

Reading makes a full man; conference a ready man; and writing an exact man.

Francis Bacon

优秀的程序员应该具备两方面能力:

  • 良好的 程序设计 能力:

    • 掌握常用的数据结构和算法(例如链表,栈,堆,队列,排序和散列);
    • 理解计算机科学的核心概念(例如计算机系统结构、操作系统、编译原理和计算机网络);
    • 熟悉至少两门以上编程语言(例如 C++,Java,C#,和 Python);
  • 专业的 软件开发 素养:
    • 具备良好的编程实践,能够编写可测试(Testable),可扩展(Extensible),可维护(Maintainable)的代码;
    • 把握客户需求,按时交付客户所需要的软件产品;
    • 理解现代软件开发过程中的核心概念(例如面向对象程序设计,测试驱动开发,持续集成,和持续交付等等)。

和其它能力一样, 程序设计 能力和 软件开发 素养源自项目经验和书本知识。项目经验因人而异(来自不同领域的程序员,项目差异会很大);但书本知识是相通的——尤其是经典图书,它们都能够拓宽程序员的视野,提高程序员的成长速度。

在过去几年的学习和工作中,我阅读了大量的程序设计/软件开发书籍。随着阅读量的增长,我意识到:

  • 经典书籍需要不断被重读——每一次重读都会有新的体会;
  • 书籍并非读的越多越好——大多数书籍只是经典书籍中的概念延伸(有时甚至是照搬);

意识到这两点之后,我开始思考一个很 功利 的问题:如何从尽可能少的书中,获取尽可能多的关键知识?换句话说:

  • 优秀的程序员应该掌握哪些关键概念?
  • 哪些书籍来可以帮助程序员掌握这些关键概念?

这即是这篇文章的出发点——我试图通过 程序员必读书单 这篇文章来回答上面两个问题。

标准

进入必读书单之前,我先介绍下书单里的书籍选择标准和领域选择标准。当然你也 点击这里 直接跳转到书单开始阅读。

书籍选择标准

  1. 必读:什么是必读书籍呢?如果学习某项技术有一本书无论如何都不能错过,那么这本书就是必读书籍——例如 Effective Java 于Java, CLR via C# 于C#;

    • 注意我没有使用“经典”这个词,因为经典计算机书籍往往和计算机科学联系在一起,而且经典往往需要10年甚至更长的时间进行考验;
  2. 注重实践,而非理论:所以这个书单不会包含过于原理性的书籍;
  3. 入门—必读—延伸:必读书籍的问题在于:1. 大多不适合入门;2. 不够全面。考虑到没有入门阅读和延伸阅读的阅读列表是不完整的——所以书单中每个关键概念都会由一本入门书籍,一本必读书籍(有时入门书籍和必读书籍是同一本),和若干延伸阅读书籍所构成。

概念选择标准

  1. 全面:全面覆盖软件开发中重要的概念;
  2. 通用:适用于每一个程序员,和领域特定方向无关;
  3. 注重基础,但不过于深入:优秀的程序员需要良好的计算机科学基础,但程序员并没必要掌握过于深入的计算机科学知识。以算法为例,每个程序员都应该掌握排序、链表、栈以及队列这些基本数据结构和算法,但计算几何、线性规划和网络流这些算法可能就不是每个程序员都需要掌握的了;

通过这几个标准,我把程序员应掌握的关键概念分为程序设计,软件开发,以及个人成长三大类,每一大类均由若干关键概念组成。

快速通道

自从开博以来,经常会有朋友在论坛,微博,和QQ上提问学习X技术读什么书合适(例如:学习Java读什么书合适?如何学习程序设计?)所以我在这里列出了一个“快速通道”——把常见的问题集中在一起,点击问题,即可直接进入答案。(当然,如果你把本文从头读到尾帮助会更大 :-))

程序员必读书单

入门书籍

程序设计:

  1. 基础理论 : 编码:隐匿在计算机软硬件背后的语言
  2. 编程语言 :
    • C : C 和指针
    • C++ : C++ 程序设计原理与实践
    • Java : Java 核心技术(第9版)
    • C# : 精通 C#(第6版)
    • JavaScript : JavaScript DOM编程艺术(第2版)
    • Python : Python 基础教程(第二版)
  3. 编程语言理论 : 编程语言实现模式
  4. 程序设计 : 程序设计方法
  5. 算法与数据结构 : 算法(第4版)
  6. 程序调试 : 调试九法——软硬件错误的排查之道

软件开发:

  1. 编程实践 : 程序设计实践
  2. 面向对象程序设计 : Head First设计模式
  3. 重构 : 重构
  4. 软件测试 : How to Break Software
  5. 项目管理 : 极客与团队
  6. 专业开发 : 程序员修炼之道:从小工到专家
  7. 大师之言 : 奇思妙想:15 位计算机天才及其重大发现
  8. 界面设计 : 写给大家看的设计书
  9. 交互设计 : 通用设计法则

个人成长:

  1. 职业规划 : 软件开发者路线图
  2. 思维方式 : 程序员的思维修炼:开发认知潜能的九堂课
  3. 求职面试 : 金领简历:敲开苹果微软谷歌的大门
  4. 英语写作 : The Only Grammar Book You’ll Ever Need

必读书籍

程序设计:

  1. 基础理论 : 深入理解计算机系统(第 2 版)
  2. 编程语言 :
    • C : C 程序设计语言(第 2 版)
    • C++ : C++程序设计语言(第 4 版)
    • Java : Effective Java(第 2 版)
    • C# : CLR via C#(第 4 版)
    • JavaScript : JavaScript 语言精粹
    • Python : Python参考手册(第 4 版)
  3. 编程语言理论 : 程序设计语言——实践之路(第 3 版)
  4. 程序设计 : 计算机程序的构造与解释(第 2 版)
  5. 算法与数据结构 : 编程珠玑(第 2 版)
  6. 程序调试 : 调试九法——软硬件错误的排查之道

软件开发:

  1. 编程实践 : 代码大全(第 2 版)
  2. 面向对象程序设计 : 设计模式
  3. 重构 : 修改代码的艺术
  4. 软件测试 : xUnit Test Patterns
  5. 项目管理 : 人月神话
  6. 专业开发 : 程序员职业素养
  7. 大师之言 : 编程人生:15 位软件先驱访谈录
  8. 界面设计 : 认知与设计:理解UI设计准则(第 2 版)
  9. 交互设计 : 交互设计精髓(第 3 版)

个人成长:

  1. 职业规划 : 软件开发者路线图
  2. 思维方式 : 如何把事情做到最好
  3. 求职面试 : 程序员面试金典(第 5 版)
  4. 英语写作 : 风格的要素

这个阅读列表覆盖了软件开发各个关键领域的入门书籍和必读书籍,我相信它可以满足绝大多数程序员的需求,无论你是初学者,还是进阶者,都可以从中获益:

  • 基础理论 包括了程序员应该掌握的计算机基础知识;
  • 编程语言 对软件开发至关重要,我选择了 C , C++ , Java , C# , Python ,和 JavaScript 这六门 主流编程语言 进行介绍,如果想进一步理解编程语言,可以阅读 编程语言理论 里的书目;
  • 在理解编程语言的基础上,优秀的程序员还应该了解各种 程序设计 技巧,熟悉基本的 算法数据结构 ,并且能够高效的进行 程序调试 。
  • 良好的程序设计能力是成为优秀程序员的前提,但软件开发知识也是必不可少的:优秀的程序员应具备良好的 编程实践 ,知道如何利用 面向对象 , 重构 ,和 软件测试 编写可复用,可扩展,可维护的代码,并具备软件 项目管理 知识和 专业开发 素养;
  • 就像我们可以从名人传记里学习名人的成功经验,程序员也可以通过追随优秀程序员的足迹使自己少走弯路。 大师之言 包含一系列对大师程序员/计算机科学家的访谈,任何程序员都可以从中获益良多;
  • 为了打造用户满意的软件产品,程序员应当掌握一定的 界面设计 知识和 交互设计 知识(是的,这些工作应该交给UI和UX,但如果你想独自打造一个产品呢?);
  • 专业程序员应当对自己进行 职业规划 ,并熟悉程序员 求职面试 的流程,以便在职业道路上越走越远;
  • 软件开发是一项需要不断学习的技能,学习 思维方式 可以有效的提升学习能力和学习效率;
  • 软件开发是一项国际化的工作,为了让更多的人了解你的代码(工作),良好的 英语写作 能力必不可少。

尽管我尽可能的去完善这个书单,但受限于我的个人经历,这个书单难免会有所偏颇。所以如果你有不同的意见,或者认为这个书单漏掉了某些重要书籍,请在评论中指出,我会及时更新。:-)

程序设计

1. 基础理论

编码:隐匿在计算机软硬件背后的语言 这本书其实不应该叫编码——它更应该叫“Petzold教你造计算机”——作者 Charles Petzold 创造性的以编码为主题,从电报机和手电筒讲到数字电路,然后利用 数字电路 中的逻辑门构造出 加法器 和 触发器 ,最后构造出一个完整的 存储程序计算机 。不要被这些电路概念吓到—— 编码 使用大量形象贴切的类比简化了这些概念,使其成为最精彩最通俗易懂的计算机入门读物。

深入理解计算机系统(第2版) 这本书的全名是:Computer Systems:A Programmer’s Perspective(所以它又被称为 CSAPP),我个人习惯把它翻译为程序员所需了解的计算机系统知识,尽管土了些,但更名副其实。

深入理解计算机系统 是我读过的最优秀的计算机系统导论型作品,它创造性的把操作系统,计算机组成结构,数字电路,以及编译原理这些计算机基础学科中的核心概念汇集在一起,从而覆盖了指令集体系架构,汇编语言,代码优化,计算机存储体系架构,链接,装载,进程,以及虚拟内存这些程序员所需了解的关键计算机系统知识。如果想打下扎实的计算机基础又不想把操作系统计算机结构编译原理这些书统统读一遍,阅读 深入理解计算机系统是最有效率的方式。

延伸阅读:

2. 编程语言

编程语言是程序员必不可少的日常工具。工欲善其事,必先利其器。我在这里给出了 C,C++,Java,C#,JavaScript,和Python 这六种 常用编程语言 的书单(我个人不熟悉 Objective-C 和 PHP,因此它们不在其中)。

需要注意的是:我在这里给出的是编程语言(Programming Language)书籍,而非编程平台(Programming Platform)书籍。以 Java 为例, Effective Java 属于编程语言书籍,而 Android编程权威指南 就属于编程平台书籍。

C

忘记谭浩强那本糟糕不堪的 C 程序设计, C和指针 才是 C 语言的最佳入门书籍。它详细但又不失简练的介绍了 C 语言以及 C 标准库的方方面面。

对于C语言初学者,最难的概念不仅仅是指针和数组,还有指向数组的指针和指向指针的指针。 C和指针 花了大量的篇幅和图示来把这些难懂但重要的概念讲的清清楚楚,这也是我推荐它作为C语言入门读物的原因。

尽管 C程序设计语言 是二十多年前的书籍,但它仍然是C语言——以及计算机科学中最重要的书籍之一,它的重要性不仅仅在于它用清晰的语言和简练的代码描述了 C 语言全貌,而且在于它为之后的计算机书籍——尤其是编程语言书籍树立了新的标杆。以至于在很多计算机书籍的扉页,都会有“感谢 Kernighan 教会我写作”这样的字样。

延伸阅读:

C++

作为C++的发明者,没有人能比 Bjarne Stroustrup 更理解C++。Bjarne在Texas A&M大学任教时使用C++为大学新生讲授编程,从而就有了 C++ 程序设计原理与实践 这本书——它面向编程初学者,既包含 C++ 教程,也包含大量程序设计原则。它不但是我读过最好的C++入门书,也是我读过最好的编程入门书。

比较有趣的是, C++ 程序设计原理与实践 直到全书过半都没有出现指针,我想这可能是Bjarne为了证明不学C也可以学好C++吧。

同样是 Bjarne Stroustrup 的作品, C++ 程序设计语言 是 C++ 最权威且最全面 的书籍。第4版相对于之前的版本进行了全面的更新,覆盖了第二新的C++ 11标准,并砍掉了部分过时的内容。

延伸阅读:

Java

平心而论 Java 核心技术 (即Core Java)并不算是一本特别出色的书籍:示例代码不够严谨,充斥着很多与C/C++的比较,语言也不够简洁——问题在于Java并没有一本很出色的入门书籍,与同类型的 Java 编程思想 相比, Java 核心技术 至少做到了废话不多,与时俱进( Java 编程思想 还停留在 Java 6之前),矮子里面选将军, Java 核心技术 算不错了。

尽管 Java 没有什么出色的入门书籍,但这不代表 Java 没有出色的必读书籍。 Effective Java 是我读过的最好的编程书籍之一,它包含大量的优秀Java编程实践,并对泛型和并发这两个充满陷阱的 Java 特性给出了充满洞察力的建议,以至于 Java 之父 James Gosling 为这本书作序:“我很希望 10 年前就拥有这本书。可能有人认为我不需要任何 Java 方面的书籍,但是我需要这本书。”

延伸阅读:

C#

可能你会疑问我为什么会推荐这本接近 1200 页的“巨著”用作 C# 入门,这是我的答案:

  1. C# 的语言特性非常丰富,很难用简短的篇幅概括这些特性;
  2. 精通 C# 之所以有近 1200 页的篇幅,是因为它不但全面介绍了 C# 语言,而且还覆盖了 ADO.NET,WCF,WF,WPF,以及 ASP.NET 这些 .Net 框架。你可以把这本书视为两本书——一本 500 多页的 C# 语言教程和一本 600 多页的 .Net 平台框架快速上手手册。
  3. 尽管标题带有“精通”两字, 精通 C# 实际上是一本面向初学者的C#书籍,你甚至不需要太多编程知识,就可以读懂它。

CLR via C# 是C#/.Net最重要的书籍,没有之一。它全面介绍了 .Net 的基石—— CLR 的运行原理,以及构建于 CLR 之上的 C# 类型系统,运行时关系,泛型,以及线程/并行等高级内容。任何一个以 C# 为工作内容的程序员都应该阅读此书。

延伸阅读:

JavaScript

尽管JavaScript现在可以做到客户端服务器端通吃,尽管 JQuery 之类的前端框架使得一些人可以不懂JavaScript也可以编程,但我还是认为学习JavaScript从HTML DOM开始最为适合,因为这是JavaScript设计的初衷。JavaScript DOM编程艺术 系统的介绍了如何使用JavaScript,HTML,以及 CSS 创建可用的 Web 页面,是一本前端入门佳作。

JavaScript语言包含大量的陷阱和误区,但它却又有一些相当不错的特性,这也是为什么 Douglas Crockford 称JavaScript为 世界上最被误解的语言 ,并编写了 JavaScript 语言精粹 一书来帮助前端开发者绕开JavaScript中的陷阱。和同类书籍不同, JavaScript 语言精粹 用精炼的语言讲解了JavaScript语言中好的那部分(例如闭包,函数是头等对象,以及对象字面量),并建议读者 不要 使用其它不好的部分(例如混乱的类型转换,默认全局命名空间,以及 奇葩的相等判断符 ),毕竟,用糟糕的特性编写出来的程序往往也是糟糕的。

延伸阅读:

Python

Python 的入门书籍很多,而且据说质量大多不错,我推荐 Python 基础教程 的原因是因为它是我的Python入门读物——简洁,全面,代码质量很不错,而且有几个很有趣的课后作业,使得我可以快速上手。

这里顺便多说一句,不要用 Python 学习手册 作为Python入门——它的废话实在太多,你能想象它用了15页的篇幅去讲解if语句吗?尽管 O’Reilly 出了很多经典编程书,但这本 Python 学习手册 绝对不在其中。

权威且实用 Python 书籍,覆盖 Python 2和 Python 3。尽管它名为参考手册,但 Python 参考手册 在 Python 语法和标准库基础之上对其实现机制也给出了深入的讲解,不容错过。

延伸阅读:

3. 编程语言理论

大多数程序员并不需要从头编写一个编译器或解释器,因此 龙书(编译原理) 就显得过于重量级;然而多数程序员还是需要解析文本,处理配置文件,或者写一个小语言, 编程语言实现模式 很好的满足了这个需求。它把常用的文本解析/代码生成方法组织成一个个模式,并为每个模式给出了实例和应用场景。这本书既会提高你的动手能力,也会加深你对编程语言的理解。Python 发明者 Guido van Rossum 甚至为这本书给出了 “Throw away your compiler theory book!” 这样的超高评价。

程序员每天都要和编程语言打交道,但是思考编程语言为什么会被设计成这个样子的程序员并不多, 程序设计语言——实践之路 完美的回答了这个问题。这本书从编程语言的解析和运行开始讲起,系统了介绍了命名空间,作用域,控制流,数据类型以及方法(控制抽象)这些程序设计语言的核心概念,然后展示了这些概念是如何被应用到过程式语言,面向对象语言,函数式语言,脚本式,逻辑编程语言以及并发编程语言这些具有不同编程范式的编程语言之上。这本书或极大的拓宽你的视野——无论你使用什么编程语言,都会从这本书中获益良多。理解这一本书,胜过学习十门新的编程语言。

延伸阅读:

4. 程序设计

现代编程语言的语法大多很繁杂,初学者使用这些语言学习编程会导致花大量的时间在编程语言语法(诸如指针,引用和类型定义)而不是程序设计方法(诸如数据抽象和过程抽象)之上。 程序设计方法 解决了这个问题——它专注于程序设计方法,使得读者无需把大量时间花在编程语言上。这本书还有一个与之配套的教学开发环境DrScheme ,这个环境会根据读者的程度变换编程语言的深度,使得读者可以始终把注意力集中在程序设计方法上。

我个人很奇怪 程序设计方法 这样的佳作为什么会绝版,而谭浩强C语言这样的垃圾却大行其道——好在是程序设计方法 第二版 已经被免费发布在网上。

计算机程序的构造与解释 是另一本被国内大学忽视(至少在我本科时很少有人知道这本书)的教材,这本书和 程序设计方法 有很多共同点——都使用 Scheme )作为教学语言;都专注于程序设计方法而非编程语言本身;都拥有相当出色的课后题。相对于 程序设计方法 , 计算机程序的构造与解释 要更加深入程序设计的本质(过程抽象,数据抽象,以及元语言抽象),以至于 Google 技术总监 Peter Norvig 给了这本书 超高的评价 。

延伸阅读:

5. 算法与数据结构

我在 算法学习之路 一文中提到我的算法入门教材是 数据结构与算法分析:C语言描述 ,我曾经认为它是最好的算法入门教材,但自从我读到 Sedgewick 的 算法 之后我就改变了观点——这本 算法 才是最好的算法入门教材:

编程珠玑(第 2 版) 是一本少见的实践型算法书籍——它并非一一介绍数据结构/算法的教材,而是实践性极强的算法应用手册。作者( Jon Bentley )从他多年的实际经验精选出一些有趣而又实用的问题,然后展示了他解决这些问题的过程(分析问题,选择合适的算法,解决问题,以及验证答案)。任何程序员都可以从中获益。

延伸阅读:

6. 程序调试

一个让非编程从业人员惊讶的事实是程序员的绝大多时间都花在调试上,而不是写程序上,以至于 Bob 大叔 把调试时间占工作时间的比例 作为衡量程序员开发能力的标准。 调试九法——软硬件错误的排查之道 既是调试领域的入门作品,也是必读经典之作。 调试九法 的作者是一个具有丰富实战经验的硬件工程师,他把他多年的调试经验总结成九条调试法则,并对每一条法则都给对应的实际案例。任何程序员都应通过阅读这本书改善调试效率,即便是非程序员,也可以从这本书中学到系统解决问题的方法。

延伸阅读:

软件开发

1. 编程实践

Brian Kernighan 是这个星球上最好的计算机书籍作者:从上古时期的 Software Tools ,到早期的 Unix编程环境 和 C 程序设计语言 ,再到这本 程序设计实践 ,每本书都是必读之作。

尽管程序设计实践只有短短 200 余页,但它使用精炼的代码和简要的原则覆盖了程序设计的所有关键概念(包括编程风格,算法与数据结构,API 设计,调试,测试,优化,移植,以及领域特定语言等概念)。如果你想快速掌握良好的编程实践,或者你觉着900多页的 代码大全 过于沉重,那么程序设计实践是你的不二之选。我第一次读这本书就被它简洁的语言和优雅的代码所吸引,以至于读研时我买了三本程序设计实践——一本放在学校实验室,一本放在宿舍,一本随身携带阅读。我想我至少把它读了十遍以上——每一次都有新的收获。

无论在哪个版本的程序员必读书单, 代码大全 都会高居首位。和其它程序设计书籍不同, 代码大全 用通俗清晰的语言覆盖了软件构建(Software Construction)中各个层次上 所有 的重要概念——从变量命名到类型设计,从控制循环到代码结构,从测试和调试到构建和集成, 代码大全 可谓无所不包,你可以把这本书看作为程序员的一站式(Once and for all)阅读手册。更珍贵的是, 代码大全 在每一章末尾都给出了价值很高的参考书目(参考我之前的 如何阅读书籍 一文),如果你是一个初出茅庐的程序员, 代码大全 是绝好的阅读起点。

延伸阅读:

2. 面向对象程序设计

无论是在 Amazon 还是在 Google 上搜索设计模式相关书籍, Head First 设计模式 都会排在首位——它使用风趣的语言和诙谐的图示讲述了观察者,装饰者,抽象工厂,和单例等关键设计模式,使得初学者可以迅速的理解并掌握设计模式。 Head First 设计模式 在Amazon上 好评如潮 ,就连设计模式原书作者 Erich Gamma 都对它给出了很高的评价。

需要注意, Head First设计模式 是非常好的设计模式入门书,但 千万不要 把这本书作为学习设计模式的唯一的书——是的,Head First 设计模式拥有风趣的语言和诙谐的例子,但它既缺乏 实际 的工程范例,也没有给出设计模式的应用/适用场景。我个人建议是在读过这本书之后立即阅读 “四人帮” )的 设计模式 或 Bob 大叔 的 敏捷软件开发 ,以便理解设计模式在实际中的应用。

设计模式 作为设计模式领域的开山之作,Erich Gamma,Richard Helm,Ralph Johnson等四位作者将各个领域面向对象程序开发的经验总结成三大类23种模式,并给出了每个模式的使用场景,变体,不足,以及如何克服这些不足。这本书行文严谨紧凑(四位作者都是PhD),并且代码源自实际项目,属于设计模式领域的必读之作。

需要注意: 设计模式 不适合 初学者阅读——它更像是一篇博士论文而非技术书籍,加上它的范例都具有很强的领域背景(诸如 GUI 窗口系统和富文本编辑器),缺乏实际经验的程序员很难理解这本书。

延伸阅读:

3. 重构

任何产品代码都不是一蹴而就,而是在反复不断的修改中进化而来。 重构 正是这样一本介绍如何改进代码的书籍——如何在保持代码行为的基础上,提升代码的质量(这也是重构的定义)。

我见过很多程序员,他们经常声称自己在重构代码,但他们实际只做了第二步(提升代码的质量),却没有保证第一步(保持代码行为),因此他们所谓的重构往往会适得其反——破坏现有代码或是引入新 bug。这也是我推荐重构 这本书的原因——它既介绍糟糕代码的特征(Bad smell)和改进代码的方法,也给出了重构的完整流程——1. 编写单元测试保持(Preserve)程序行为;2. 重构代码;3. 保证单元测试通过。 重构 还引入了一套重构术语(诸如封装字段,内联方法,和字段上移),以便程序员之间交流。只有理解了这三个方面,才能算是理解重构。

这里再重复一遍重构的定义——在保持代码行为的基础上,提升代码的质量。 重构 专注于第二步,即如何提升代码的质量,而 修改代码的艺术 专注于第一步,即如何保持代码的行为。

提升代码质量并不困难,但保持代码行为就难多了,尤其是对没有测试的遗留代码(Legacy Code)而言——你需要首先引入测试,但遗留代码往往可测试性(Testability)很差,这时你就需要把代码变的可测试。 修改代码的艺术 包含大量的实用建议,用来把代码变的可测试(Testable),从而使重构变为可能,使提高代码质量变为可能。

延伸阅读:

4. 软件测试

关于软件测试的书籍很多,但很少有一本测试书籍能像 How to Break Software 这般既有趣又实用。不同于传统的软件测试书籍(往往空话连篇,无法直接应用), How to Break Software 非常实际——它从程序员的心理出发,分析软件错误/Bug最可能产生的路径,然后针对这些路径进行 残酷 的测试,以保证软件质量。

我在第一次阅读这本书时大呼作者太过“残忍”——连这些刁钻诡异的测试招数都能想出来。但这种毫不留情(Relentless)的测试风格正是每个专业程序员所应具备的心态。

注意:如果你是一个测试工程师,那么在阅读这本书前请三思——因为阅读它之后你会让你身边的程序员苦不堪言,甚至连掐死你的心都有 :-D。

How to Break Software 注重黑盒测试,而这本 xUnit Test Patterns 则注重白盒测试。正如书名所示, xUnit Test Patterns 覆盖了单元测试的每个方面:从如何编写良好的单元测试,到如何设计可测试(Testable)的软件,再到如何重构测试——可以把它看作为单元测试的百科全书。

延伸阅读:

5. 项目管理

很多程序员都向往成为横扫千军(One-man Army)式的“编程英雄”,但卓越的软件并非一人之力,而是由团队合力而成。 极客与团队 就是这样一本写给程序员的如何在团队中工作的绝好书籍,它围绕着 HRT 三大原则(Humility 谦逊,Respect 尊重,和 Trust 信任),系统的介绍了如何融入团队,如何打造优秀的团队,如何领导团队,以及如何应对团队中的害群之马(Poisonous People)。这本书实用性极强,以至于 Python 之父Guido van Rossum 都盛赞这本书 “说出了我一直在做但总结不出来的东西”

尽管 人月神话 成书于 40 年前,但它仍是软件项目管理重要的书籍。 人月神话 源自作者 Fred Brooks 领导并完成 System/360 和 OS/360 这两个即是放到现在也是巨型软件项目的里程碑项目的经验总结。它覆盖了软件项目各个方面的关键概念:从工期管理( Brooks定律 )到团队建设( 外科团队 ),从程序设计(编程的本质是使用正确的数据结构)到架构设计( 概念完整性 ),从原型设计(Plan to Throw one away)到团队交流(形式化文档+会议)。令人惊讶的是,即便40年之后, 人月神话 中的关键概念(包括焦油坑, Brooks定律 , 概念完整性 , 外科团队 , 第二版效应 等等)依然适用,而软件开发的 核心复杂度 仍然没有得到解决( 没有银弹 )。

延伸阅读:

6. 专业开发

不要被庸俗的译名迷惑, 程序员修炼之道 是一本价值极高的程序员成长手册。这本书并不局限于特定的编程语言或框架,而是提出了一套切实可行的实效(Pragmatic)开发哲学,并通过程序设计,测试,编程工具,以及项目管理等方面的实例展示了如何应用这套开发哲学,从而使得程序员更加高效专业。有人把这本书称之为迷你版 代码大全 —— 代码大全 给出了大量的优秀程序设计实践,偏向术;而 程序员修炼之道 给出了程序设计实践背后的思想,注重道。

程序员修炼之道 指出了如何成为专业程序员,这本 程序员职业素养 则指出了专业程序员应该是什么样子——承担责任;知道自己在做什么;知道何时说不/何时说是;在正确的时间编写正确的代码;懂得自我时间管理和工期预估;知道如何应对压力。如果你想成为专业程序员(Professional Developer)(而不是码农(Code Monkey)),这本书会为你指明前进的方向。

延伸阅读:

7. 大师之言

奇思妙想:15 位计算机天才及其重大发现 是一本极具眼光的技术访谈书籍——在这本书访谈的 15 位计算机科学家中,竟出现了 12 位 图灵奖 获得者——要知道图灵奖从 1966 年设奖到现在也只有六十几位获奖者而已。

奇思妙想 把计算机科学分为四大领域:编程语言;算法;架构;人工智能。并选取了每个领域下最具代表性的计算机科学家进行访谈。因为这些计算机科学家都是其所在领域的开拓者,因此他们能给出常人无法给出的深刻见解。通过这本书,你可以了解前三十年的计算机科学的发展历程——计算机科学家做了什么,而计算机又能做到/做不到什么。从而避免把时间浪费在前人已经解决的问题(或者根本无法解决的问题)上面。

同样是访谈录,同样访谈 15 个人, 编程人生 把重点放在程序员(Coders at work)上。它从各个领域选取了15位顶尖的程序员,这些程序员既包括 Ken Thompson 和 Jamie Zawinski 这些老牌Unix黑客,也包括 Brad Fitzpatrick 这样的80后新生代,还包括 Frances Allen 和 Donald Knuth 这样的计算机科学家。这种多样性(Diversity)使得 编程人生 兼具严谨性和趣味性,无论你是什么类型的程序员,都能从中受益良多。

延伸阅读:

8. 界面设计

书如其名, 写给大家看的设计书 是一本面向初学者的快速设计入门。它覆盖了版式,色彩,和字体这三个设计中的关键元素,并创造性的为版式设计总结出CRAP四大原则(Contrast 对比,Repetition 重复,Alignment 对齐,Proximity 亲密)。全书使用丰富生动的范例告诉读者什么是好的设计,什么是不好的设计,使得即便是对设计一无所知的人,也可以从这本书快速入门。

写给大家看的设计书 强调实践,即如何做出好的设计; 认知与设计:理解 UI 设计准则 强调理论,即为什么我们会接受这样的设计而反感那样的设计。如果你想要搞清楚设计背后的心理学知识,但又不想阅读大部头的心理学著作,那么 认知与设计 是你的首选。

延伸阅读:

9. 交互设计

书如其名, 通用设计法则 给出了重要的 125 个设计原则,并用简练的语言和范例展示了这些原则的实际应用。每个原则都有对应的参考文献,以便读者进一步学习。我之所以推荐这本书,是因为:1. 程序员需要对设计有全面的认识;2. 程序员并不需要知道这些设计原则是怎么来的,知道怎么用即可。这本书很好的满足了这两个要求。

交互设计精髓 是交互设计领域的圣经级著作。交互设计专家(以及 VB 之父) Alan Cooper 在这本书中详细介绍了交互设计的原则,流程,以及方法,然后通过各种范例(主要来自桌面系统)展示了如何应用这些原则。

需要注意的是这本书的 第 4 版 已经出版,它在第三版的基础上增加了移动设计以及 Web 设计等内容。

延伸阅读:

个人成长

1. 职业规划

软件开发者路线图 是一本优秀且实用的程序员职业规划手册。这本书由若干个模式组成,每个模式都对应于程序员职业生涯中的特定阶段。通过这本书,读者可以很方便的找到自己目前所处的模式(阶段),应该做什么,目标是什么,以及下一个模式(阶段)会是什么。如果你时常感到迷茫,那么请阅读这本 路线图 ,找到自己的位置,确定接下来的方向。

延伸阅读:

2. 思维方式

作为程序员,我们需要不断地学习——既要学习新技术,也要学习如何解决各种领域的问题。为了提升学习效率,我们需要学习 如何学习。 程序员的思维修炼 正是这样一本讲如何学习的书,它集合了认知科学,神经学,以及行为理论的最新研究成果,并系统的介绍了大脑的工作机制。通过这本书,你将学会如何高效的使用自己的大脑,从而提高思考能力,改善学习效率。

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.

为什么同样资质的人,大多数人会碌碌无为,而只有极少数能做到登峰造极?如何在领域内做到顶尖?如何克服通往顶尖之路上的重重险阻? 如何把事情做到最好 回答了这些问题,并极具哲理的指出登峰造极并不是结果,而是一段永不停止的旅程。阅读这本书不会让你立刻脱胎换骨,但它会指引你走向正确的道路——通往登峰造极之路。

延伸阅读:

  • 怎样解题:数学思维的新方法 :不要被标题中的“数学思维”吓到,它并不仅仅只是一本数学解题书,它所提出的四步解题法(理解题目->拟定方案->执行计划->总结反思)适用于任何领域;
  • 暗时间 : 刘未鹏 所写的关于学习思维方法的文章集,既包含了他对学习方法的思考,也包含了大量进一步阅读的资源;
  • 批判性思维:带你走出思维的误区 :这本书系统的分析了人类思维的常见误区,并针对各个误区给出了解决方案,从而帮助程序员养成严谨正确的思考方式;
  • Conceptual Blockbusting: A Guide to Better Ideas :与批判性思维相反,这本书专注于创造性思维(Creative Thinking),它分析了阻碍创造性思维的常见思维障碍(Blockbuster)以及这些思维障碍背后的成因,并给出了各种方法以破除这些障碍。

3. 求职面试

知己知彼,百战不殆。 金领简历:敲开苹果微软谷歌的大门 是程序员求职的必读书籍,它覆盖了程序员求职的方方面面:从开始准备到编写简历,从技术面试到薪酬谈判。由于该书作者曾在 Google,微软,和苹果任职并进行过技术招聘,因此这本书的内容非常实用。

顺便吐个槽:这本书翻译的还不错,但我实在无法理解封面上的“进入顶级科技公司的葵花宝典”这段文字——找个工作而已,用不着切JJ这么凶残吧。-_-#

同样是来自 金领简历 作者的作品, 程序员面试金典(第 5 版) 专注于技术面试题,它既包含了 IT 企业(诸如微软,Google,和苹果)的面试流程以及如何准备技术面试,也包含了大量(超过200道)常见技术面试题题目以及解题思路。无论你打算进入国内企业还是外企,你都应该把这本书的题目练一遍,以找到技术面试的感觉(我在求职时就曾经专门搞了一块白板,然后每二十分钟一道题的练习,效果很不错)。

延伸阅读:

4. 英语写作

词汇量决定阅读能力,语法决定写作能力。计算机专业词汇并不多,但精确性非常重要,因此每个程序员都应具备良好的英语语法,但程序员并不需要过于专业的英语语法——掌握常用语法并把它用对就可以。 The Only Grammar Book You’ll Ever Need 正好可以满足这个需求,尽管它篇幅不大(不足 200 页),却覆盖了英语中的关键语法以及常见错误。把这本书读两遍,它会大幅度提高你的英语写作能力。

既是最畅销的英语写作书籍,也是计算机书籍中引用最多的非计算机书籍。 风格的要素 用极其简练的语言讲述了如何进行 严肃精确清楚 的英语写作。从这本书中,你不仅可以学到英语写作,更可以学到一种严谨至简的处事态度,而这正是专业开发所必需的。

延伸阅读:

如何使用这个书单

学而不思则罔,思而不学则殆。

不愤不启,不悱不发。举一隅不以三隅反,则不复也。

不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之,学至于行之而止矣。

来自他人的书单

它山之石,可以攻玉。我在本文最后给出其他中外优秀程序员的书单,以便参考&补充。

刘未鹏(暗时间作者)

以下同一条目下用“/”隔开的表示任选,当然也可以都读。

  1. 编码:隐匿在计算机软硬件背后的语言
  2. 深入理解计算机系统 / Windows 核心编程 / 程序员的自我修养
  3. 代码大全 / 程序员修炼之道
  4. 编程珠玑 / 算法概论 / 算法设计 / 编程之美
  5. C 程序设计语言
  6. C++ 程序设计语言 / C++ 程序设计原理与实践 / Accelerated C++
  7. 计算机程序的构造与解释
  8. 代码整洁之道 / 实现模式
  9. 设计模式 / 敏捷软件开发(原则模式与实践)
  10. 重构

云风(中国游戏编程先行者,前网易游戏部门资深程序员,简悦创始人)

  1. C++ 编程思想
  2. Effective C++
  3. 深度探索 C++ 对象模型
  4. C++ 语言的设计与演化
  5. C 专家编程
  6. C 陷阱与缺陷
  7. C 语言接口与实现
  8. Lua 程序设计
  9. 链接器和加载器
  10. COM 本质论
  11. Windows 核心编程
  12. 深入解析 Windows 操作系统
  13. 程序员修炼之道
  14. 代码大全
  15. UNIX 编程艺术
  16. 设计模式
  17. 代码优化:有效使用内存
  18. 深入理解计算机系统
  19. 深入理解 LINUX 内核
  20. TCP/IP 详解

洪强宁(豆瓣技术总监)

  1. 代码大全
  2. 人月神话
  3. 编码:隐匿在计算机软硬件背后的语言
  4. 计算机程序设计艺术
  5. 程序员修炼之道
  6. 设计模式
  7. 计算机程序的构造与解释
  8. 重构
  9. C 程序设计语言
  10. 算法导论

陈皓(CoolShell博主)

  1. 点石成金:访客至上的 Web 和移动可用性设计秘笈
  2. 重来:更为简单有效的商业思维
  3. 黑客与画家
  4. 清醒思考的艺术
  5. TCP/IP 详解
  6. UNIX 环境高级编程
  7. UNIX 网络编程

张峥(微软亚洲研究院副院长)

  1. 算法概论
  2. Data Structure and Algorithms
  3. C 程序设计语言
  4. UNIX 操作系统设计
  5. 编译原理
  6. 计算机体系结构:量化研究方法
  7. 当下的幸福
  8. 异类:不一样的成功启示录

Jeff Atwood(Stackoverflow联合创始人)

  1. 代码大全
  2. 人月神话
  3. 点石成金:访客至上的Web和移动可用性设计秘笈
  4. 快速软件开发
  5. 人件
  6. The Design of Everyday Things
  7. 交互设计精髓
  8. The Inmates Are Running the Asylum
  9. GUI设计禁忌 2.0
  10. 编程珠玑
  11. 程序员修炼之道
  12. 精通正则表达式

Joel Spolsky(Stackoverflow联合创始人)

软件项目管理

  1. 人件
  2. 人月神话
  3. 快速软件开发

编程技艺

  1. 代码大全
  2. 程序员修炼之道

编程哲学

  1. 禅与摩托车维修艺术
  2. 哥德尔、艾舍尔、巴赫:集异璧之大成
  3. 建筑模式语言

界面设计

  1. 点石成金:访客至上的 Web 和移动可用性设计秘笈
  2. 交互设计精髓
  3. The Design of Everyday Things

资本运作

  1. 漫步华尔街

图形设计

  1. 写给大家看的设计书

思维方式

  1. 影响力
  2. Helplessness On Depression, Development and Death

编程入门

  1. 编码:隐匿在计算机软硬件背后的语言
  2. C 程序设计语言

DHH(Ruby on Rails创始人)

  1. Smalltalk Best Practice Patterns
  2. 重构
  3. 企业应用架构模式
  4. 领域驱动设计
  5. 你的灯亮着吗?发现问题的真正所在

参考

  1. 怎样花两年时间去面试一个人
  2. What is the single most influential book every programmer should read?
  3. Recommended Reading for Developers
  4. Book Reviews – Joel Spolsky
  5. The five programming books that meant most to me

以上

程序员必读书单 1.0 ----转自Lucida相关推荐

  1. 转:程序员必读书单 1.0

    本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读.旨在成为最好最全面的程序员必读书单. 前言 Reading makes a ...

  2. 程序员必读书单 (仅供参考)

    转载:http://zh.lucida.me/blog/developer-reading-list/ 程序员必读书单 1.0 发表于 2015-02-25    |   分类于 阅读    |   ...

  3. 程序员必读书单(非常经典,强烈推荐)

    原文链接:http://lucida.me/blog/developer-reading-list/ 关于 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入 ...

  4. 程序员必读书单(转载)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://lucida.me/blog/developer-reading-list/ 关于 本文把程序员所需掌握 ...

  5. 2022 程序员必读书单合集,别炫砂糖橘了,快来趁着春节一起读读书~

    「读书」是个永不过时的好习惯 新年快乐!想必你已经提着大包小包奔赴到家,躺平在床上开炫砂糖橘了. 漫漫长假,没有压的人透不过气的需求,没有解不过来的bug,没有时不时的onCall.世界在一瞬间变得清 ...

  6. 整理 | 程序员必读书单1.0

    编程语言 C和C++开发 Java 开发 <Java核心技术> <Java编程思想> <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> 周志明 著 A ...

  7. 程序员必读书单1.0

    原文:http://lucida.me/blog/developer-reading-list/ 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必 ...

  8. 资深程序员的书单 - 转载自@Axb

    转载原因: 罕见的好东西,但作者网站被墙了,所以转载一下 出处: https://www.zhihu.com/questio... 最后附上我自己的书单,所有五星的都值得一读:Reading List ...

  9. 程序员养生书单,九本必读养生书籍,颈椎按摩,脊椎按摩,脱发植发

    都让开,让我来!程序员必看书籍,早看早好,程序员最终的归宿!!! 包括颈椎康复和按摩,脊椎康复和按摩, 颈椎病康复指南 <颈椎病康复指南>由陈选宁.程维主编,主要包括六部分内容.分别阐述了 ...

最新文章

  1. trident State应用指南
  2. 想做大牛,Java开发的必备技术点你了解了吗?
  3. asp.net mysql所有数据库_asp.net 如何获取sql数据库所有列名称
  4. 【codevs1116】四色问题,深搜入门题目
  5. 查看ORACLE的实际执行计划
  6. 使用Attribute简单地扩展WebForm
  7. 10-05 Java 内部类概述和讲解
  8. linux显卡驱动编译安装,联想Y470下CentOS 6.4 AMD显卡驱动编译安装与配置
  9. 两种方法解除网页复制限制
  10. 快捷键: Windows下利用微信快速截图
  11. 宽带拨号连接失败,代码651
  12. 如何关闭WPS文字的选项卡显示方式?如何实现多窗口显示?
  13. 流星蝴蝶剑服务器状态,流星蝴蝶剑什么是数据互通 哪些服务器会进行互通
  14. USB-C(TYPE-C)接口安卓手机直播方案/同时直播跟充电的方案
  15. Wired特写: 网络让她陷入「匿名虐待」的世界,这是一场关于数据和不信任的无休止暴力
  16. cudnn下载解压后的文件应该放到CUDA文件中的位置
  17. 安川工业机器人实训心得_MOTOMAN安川工业机器人基础解析
  18. oracle unable to open file,告警日志报“ORA-01565 Unable To open Spfile”
  19. Echarts实战案例代码(16):geomap地图散点图和label轮播的解决方案
  20. 不到20W纯电SUV提回家,到店实拍2022款奇瑞大蚂蚁

热门文章

  1. CUDA编程之CUDA流
  2. 简单两步解决Microsfot Edge浏览器打开PDF卡住的问题 - 【大鼓的电脑百科】
  3. Android-1-电话拨号器
  4. Unity SKFramework框架(二十一)、Texture Filter 贴图资源筛选工具
  5. android 权限作用说明书,AndroidAcp 一句话搞定,简化 Android 6.0 系统复杂的权限操作 @codeKK Android开源站...
  6. 单道批处理 多道批处理
  7. 菜鸡的折腾路程,情人节啊顺便记录一下啦,立个flag
  8. STM32之AD8403驱动
  9. 垃圾分类微信小程序——云开发+CMS+微应用+百度智能云图片识别
  10. 【爬虫进阶】Js逆向——有道批量翻译文本