软件开发之路

程序员必读书单 1.0

原文链接: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)的代码;
    • 把握客户需求,按时交付客户所需要的软件产品;
    • 理解现代软件开发过程中的核心概念(例如面向对象程序设计,测试驱动开发,持续集成,和持续交付等等)。

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

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

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

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

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

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

标准

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

书籍选择标准

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

概念选择标准

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

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

快速通道

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

  • 如何学习计算机基础知识/li>
  • 如何学习C语言/li>
  • 如何学习C++/li>
  • 如何学习Java/li>
  • 如何学习C#/li>
  • 如何学习JavaScript/li>
  • 如何学习Python/li>
  • 如何加深对编程语言的理解/li>
  • 如何学习程序设计技巧/li>
  • 如何学习算法/li>
  • 如何高效的调试程序/li>
  • 如何掌握良好的编程实践/li>
  • 如何学习面向对象程序设计/li>
  • 如何对代码进行重构/li>
  • 如何更好的进行软件测试/li>
  • 如何管理软件团队/软件项目/li>
  • 如何成为一名更专业的程序员/li>
  • 程序员如何学习设计/li>
  • 程序员如何进行职业规划/li>
  • 如何提高自己的思维能力/li>
  • 如何进行高效求职面试/li>
  • 如何提高自己的英语写作能力/li>

程序员必读书单

入门书籍

程序设计:

  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. 基础理论

深入理解计算机系统(第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这六种来源:陌途i

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年6月9日
下一篇 2019年6月10日

相关推荐