本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读。旨在成为最好最全面的程序员必读书单。
前言
reading makes a full man; conference a ready man; and writing an exact man.
francis bacon?
优秀的程序员应该具备两方面能力:
良好的 程序设计 能力:
掌握常用的数据结构和算法(例如链表,栈,堆,队列,排序和散列);
理解计算机科学的核心概念(例如计算机系统结构、操作系统、编译原理和计算机网络);
熟悉至少两门以上编程语言(例如 c++,java,c#,和 python);
专业的 软件开发 素养:
具备良好的编程实践,能够编写可测试(testable),可扩展(extensible),可维护(maintainable)的代码;
把握客户需求,按时交付客户所需要的软件产品;
理解现代软件开发过程中的核心概念(例如面向对象程序设计,测试驱动开发,持续集成,和持续交付等等)。
和其它能力一样, 程序设计 能力和 软件开发 素养源自项目经验和书本知识。项目经验因人而异(来自不同领域的程序员,项目差异会很大);但书本知识是相通的——尤其是经典图书,它们都能够拓宽程序员的视野,提高程序员的成长速度。
在过去几年的学习和工作中,我阅读了大量的程序设计/软件开发书籍。随着阅读量的增长,我意识到:
经典书籍需要不断被重读——每一次重读都会有新的体会;
书籍并非读的越多越好——大多数书籍只是经典书籍中的概念延伸(有时甚至是照搬);
意识到这两点之后,我开始思考一个很 功利 的问题:如何从尽可能少的书中,获取尽可能多的关键知识?换句话说:
优秀的程序员应该掌握哪些关键概念?
哪些书籍来可以帮助程序员掌握这些关键概念?
这即是这篇文章的出发点——我试图通过 程序员必读书单 这篇文章来回答上面两个问题。
标准
进入必读书单之前,我先介绍下书单里的书籍选择标准和领域选择标准。当然你也 点击这里 直接跳转到书单开始阅读。
书籍选择标准
必读:什么是必读书籍呢?如果学习某项技术有一本书无论如何都不能错过,那么这本书就是必读书籍——例如 effective java 于java, clr via c# 于c#;
注意我没有使用“经典”这个词,因为经典计算机书籍往往和计算机科学联系在一起,而且经典往往需要10年甚至更长的时间进行考验;
注重实践,而非理论:所以这个书单不会包含过于原理性的书籍;
入门—必读—延伸:必读书籍的问题在于:1. 大多不适合入门;2. 不够全面。考虑到没有入门阅读和延伸阅读的阅读列表是不完整的——所以书单中每个关键概念都会由一本入门书籍,一本必读书籍(有时入门书籍和必读书籍是同一本),和若干延伸阅读书籍所构成。
概念选择标准
全面:全面覆盖软件开发中重要的概念;
通用:适用于每一个程序员,和领域特定方向无关;
注重基础,但不过于深入:优秀的程序员需要良好的计算机科学基础,但程序员并没必要掌握过于深入的计算机科学知识。以算法为例,每个程序员都应该掌握排序、链表、栈以及队列这些基本数据结构和算法,但计算几何、线性规划和网络流这些算法可能就不是每个程序员都需要掌握的了;
通过这几个标准,我把程序员应掌握的关键概念分为程序设计,软件开发,以及个人成长三大类,每一大类均由若干关键概念组成。
快速通道
自从开博以来,经常会有朋友在论坛,微博,和qq上提问学习x技术读什么书合适(例如:学习java读什么书合适?如何学习程序设计?)所以我在这里列出了一个“快速通道”——把常见的问题集中在一起,点击问题,即可直接进入答案。(当然,如果你把本文从头读到尾帮助会更大 :-))
如何学习计算机基础知识?
如何学习 c 语言?
如何学习 c++?
如何学习 java?
如何学习 c#?
如何学习 javascript?
如何学习 python?
如何加深对编程语言的理解?
如何学习程序设计技巧?
如何学习算法?
如何高效的调试程序?
如何掌握良好的编程实践?
如何学习面向对象程序设计?
如何对代码进行重构?
如何更好的进行软件测试?
如何管理软件团队/软件项目?
如何成为一名更专业的程序员?
程序员如何学习设计?
程序员如何进行职业规划?
如何提高自己的思维能力?
如何进行高效求职面试?
如何提高自己的英语写作能力?
程序员必读书单
入门书籍
程序设计:
基础理论 : 编码:隐匿在计算机软硬件背后的语言
编程语言 :
c : c 和指针
c++ : c++ 程序设计原理与实践
java : java 核心技术(第9版)
c# : 精通 c#(第6版)
javascript : javascript dom编程艺术(第2版)
python : python 基础教程(第二版)
编程语言理论 : 编程语言实现模式
程序设计 : 程序设计方法
算法与数据结构 : 算法(第4版)
程序调试 : 调试九法——软硬件错误的排查之道
软件开发:
编程实践 : 程序设计实践
面向对象程序设计 : head first设计模式
重构 : 重构
软件测试 : how to break software
项目管理 : 极客与团队
专业开发 : 程序员修炼之道:从小工到专家
大师之言 : 奇思妙想:15 位计算机天才及其重大发现
界面设计 : 写给大家看的设计书
交互设计 : 通用设计法则
个人成长:
职业规划 : 软件开发者路线图
思维方式 : 程序员的思维修炼:开发认知潜能的九堂课
求职面试 : 金领简历:敲开苹果微软谷歌的大门
英语写作 : the only grammar book you’ll ever need
必读书籍
基础理论 : 深入理解计算机系统(第 2 版)
c : c 程序设计语言(第 2 版)
c++ : c++程序设计语言(第 4 版)
java : effective java(第 2 版)
c# : clr via c#(第 4 版)
javascript : javascript 语言精粹
python : python参考手册(第 4 版)
编程语言理论 : 程序设计语言——实践之路(第 3 版)
程序设计 : 计算机程序的构造与解释(第 2 版)
算法与数据结构 : 编程珠玑(第 2 版)
编程实践 : 代码大全(第 2 版)
面向对象程序设计 : 设计模式
重构 : 修改代码的艺术
软件测试 : xunit test patterns
项目管理 : 人月神话
专业开发 : 程序员职业素养
大师之言 : 编程人生:15 位软件先驱访谈录
界面设计 : 认知与设计:理解ui设计准则(第 2 版)
交互设计 : 交互设计精髓(第 3 版)
思维方式 : 如何把事情做到最好
求职面试 : 程序员面试金典(第 5 版)
英语写作 : 风格的要素
这个阅读列表覆盖了软件开发各个关键领域的入门书籍和必读书籍,我相信它可以满足绝大多数程序员的需求,无论你是初学者,还是进阶者,都可以从中获益:
基础理论 包括了程序员应该掌握的计算机基础知识;
编程语言 对软件开发至关重要,我选择了 c , c++ , java , c# , python ,和 javascript 这六门 主流编程语言 进行介绍,如果想进一步理解编程语言,可以阅读 编程语言理论 里的书目;
在理解编程语言的基础上,优秀的程序员还应该了解各种 程序设计 技巧,熟悉基本的 算法数据结构 ,并且能够高效的进行 程序调试 。
良好的程序设计能力是成为优秀程序员的前提,但软件开发知识也是必不可少的:优秀的程序员应具备良好的 编程实践 ,知道如何利用 面向对象 , 重构 ,和 软件测试 编写可复用,可扩展,可维护的代码,并具备软件 项目管理 知识和 专业开发 素养;
就像我们可以从名人传记里学习名人的成功经验,程序员也可以通过追随优秀程序员的足迹使自己少走弯路。 大师之言 包含一系列对大师程序员/计算机科学家的访谈,任何程序员都可以从中获益良多;
为了打造用户满意的软件产品,程序员应当掌握一定的 界面设计 知识和 交互设计 知识(是的,这些工作应该交给ui和ux,但如果你想独自打造一个产品呢?);
专业程序员应当对自己进行 职业规划 ,并熟悉程序员 求职面试 的流程,以便在职业道路上越走越远;
软件开发是一项需要不断学习的技能,学习 思维方式 可以有效的提升学习能力和学习效率;
软件开发是一项国际化的工作,为了让更多的人了解你的代码(工作),良好的 英语写作 能力必不可少。
尽管我尽可能的去完善这个书单,但受限于我的个人经历,这个书单难免会有所偏颇。所以如果你有不同的意见,或者认为这个书单漏掉了某些重要书籍,请在评论中指出,我会及时更新。:-)
程序设计
1. 基础理论
编码:隐匿在计算机软硬件背后的语言
编码:隐匿在计算机软硬件背后的语言 这本书其实不应该叫编码——它更应该叫“petzold教你造计算机”——作者 charles petzold 创造性的以编码为主题,从电报机和手电筒讲到数字电路,然后利用 数字电路 中的逻辑门构造出 加法器 和 触发器 ,最后构造出一个完整的 存储程序计算机 。不要被这些电路概念吓到—— 编码 使用大量形象贴切的类比简化了这些概念,使其成为最精彩最通俗易懂的计算机入门读物。
深入理解计算机系统(第2版)
深入理解计算机系统(第2版) 这本书的全名是:computer systems:a programmer’s perspective(所以它又被称为 csapp),我个人习惯把它翻译为程序员所需了解的计算机系统知识,尽管土了些,但更名副其实。
深入理解计算机系统 是我读过的最优秀的计算机系统导论型作品,它创造性的把操作系统,计算机组成结构,数字电路,以及编译原理这些计算机基础学科中的核心概念汇集在一起,从而覆盖了指令集体系架构,汇编语言,代码优化,计算机存储体系架构,链接,装载,进程,以及虚拟内存这些程序员所需了解的关键计算机系统知识。如果想打下扎实的计算机基础又不想把操作系统计算机结构编译原理这些书统统读一遍,阅读 深入理解计算机系统 是最有效率的方式。
延伸阅读:
世界是数字的 : k&r 中的 k( brian kernighan )的近作,这本书源自 brian 在普林斯顿大学所教授的计算机基础课程,以通俗易懂的方式讲述了现代人所应了解的计算机知识和网络知识;
图灵的秘密:他的生平、思想及论文解读 : charles petzold 的另一部作品,这本书以图灵的论文论可计算数及其在判定问题上的应用( on computable numbers, with an application to the entscheidungsproblem )为主题,阐述了图灵机(现代计算机的始祖)的构造,原理,以及应用。
计算机系统概论(第2版) :另一部优秀的计算机系统导论型作品,和 深入理解计算机系统 不同,这本书采用自下而上的方式,从二进制,和数字逻辑这些底层知识一步步过渡到高级编程语言(c),从而以另一种方式理解计算机系统。
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程序设计语言(第2版)
尽管 c程序设计语言 是二十多年前的书籍,但它仍然是c语言——以及计算机科学中最重要的书籍之一,它的重要性不仅仅在于它用清晰的语言和简练的代码描述了 c 语言全貌,而且在于它为之后的计算机书籍——尤其是编程语言书籍树立了新的标杆。以至于在很多计算机书籍的扉页,都会有“感谢 kernighan 教会我写作”这样的字样。
c 专家编程 :不要被标题中的“专家”吓到,这实际是一本很轻松的书籍,它既包含了大量 c 语言技术细节和编程技巧,也包含了很多有趣的编程轶事;
c 陷阱与缺陷 :书如其名,这本书介绍了 c 语言中常见的坑和一些稀奇古怪的编程“技巧”,不少刁钻的c语言面试题都源自这本小册子;
c 语言参考手册 :全面且权威的 c 语言参考手册,而且覆盖 c99,如果你打算成为 c 语言专家,那么这本书不可错过;
c 标准库 :给出了15个c标准库的设计思路,实现代码,以及测试代码,配合 c 程序设计语言 阅读效果更佳;
c 语言接口与实现 :这本书...