【干货】程序员必读书单(上)

很是全面,Mark。太长了,居然超过SFG的字数限制 = = 分两次发吧javascript


做者:Lucida
微博:@peng_gong
豆瓣:@figure9
原文连接:http://lucida.me/blog/developer-reading-list/php

关于

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

前言

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

Francis Baconjava

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

  • 良好的程序设计能力:jquery

    *   掌握经常使用的数据结构和算法(例如链表,栈,堆,队列,排序和散列);
    
    *   理解计算机科学的核心概念(例如计算机系统结构、操做系统、编译原理和计算机网络);
    
    *   熟悉至少两门以上编程语言(例如C++,Java,C#,和Python);
  • 专业的软件开发素养:git

    *   具有良好的编程实践,可以编写可测试(Testable),可扩展(Extensible),可维护(Maintainable)的代码;
    
    *   把握客户需求,按时交付客户所须要的软件产品;
    
    *   理解现代软件开发过程当中的核心概念(例如面向对象程序设计,测试驱动开发,持续集成,和持续交付等等)。

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

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

  • 经典书籍须要不断被重读——每一次重读都会有新的体会;

  • 书籍并不是读的越多越好——大多数书籍只是经典书籍中的概念延伸(有时甚至是照搬);

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

  • 优秀的程序员应该掌握哪些关键概念?

  • 哪些书籍来能够帮助程序员掌握这些关键概念?

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

标准

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

书籍选择标准

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

    *   注意我没有使用“经典”这个词,由于**经典**计算机书籍每每和**计算机科学**联系在一块儿,并且经典每每须要10年甚至更长的时间进行考验;
  2. 注重实践,而非理论:因此这个书单不会包含过于原理性的书籍;

  3. 入门—必读—延伸:必读书籍的问题在于:1. 大多不适合入门;2. 不够全面。考虑到没有入门阅读和延伸阅读的阅读列表是不完整的——因此书单中每一个关键概念都会由一本入门书籍,一本必读书籍(有时入门书籍和必读书籍是同一本),和若干延伸阅读书籍所构成。

概念选择标准

  1. 全面:全面覆盖软件开发中重要的概念;

  2. 通用:适用于每个程序员,和领域特定方向无关;

  3. 注重基础,但不过于深刻:优秀的程序员须要良好的计算机科学基础,但程序员并不必掌握过于深刻的计算机科学知识。以算法为例,每一个程序员都应该掌握排序、链表、栈以及队列这些基本数据结构和算法,但计算几何、线性规划和网络流这些算法可能就不是每一个程序员都须要掌握的了;

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

快速通道

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

程序员必读书单

入门书籍

程序设计:

  1. 基础理论编码:隐匿在计算机软硬件背后的语言

  2. 编程语言

    *   [C](#c):[C和指针](#pointers_on_c)
    
    *   [C++](#cpp):[C++程序设计原理与实践](#pppcpp)
    
    *   [Java](#java):[Java核心技术(第9版)](#core_java)
    
    *   [C#](#csharp):[精通C#(第6版)](#pro_csharp)
    
    *   [JavaScript](#javascript):[JavaScript DOM编程艺术(第2版)](#js_dom_scripting)
    
    *   [Python](#python):[Python基础教程(第二版)](#beginning_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):[C程序设计语言(第2版)](#tcpl)
    
    *   [C++](#cpp):[C++程序设计语言(第4版)](#tcpppl)
    
    *   [Java](#java):[Effective Java(第2版)](#effective_java)
    
    *   [C#](#csharp):[CLR via C#(第4版)](#clr_via_csharp)
    
    *   [JavaScript](#javascript):[JavaScript语言精粹](#js_good_parts)
    
    *   [Python](#python):[Python参考手册(第4版)](#python_essential_reference)
  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. 英语写做风格的要素

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

  • 基础理论包括了程序员应该掌握的计算机基础知识;

  • 编程语言对软件开发相当重要,我选择了CC++JavaC#Python,和JavaScript这六门主流编程语言进行介绍,若是想进一步理解编程语言,能够阅读编程语言理论里的书目;

  • 在理解编程语言的基础上,优秀的程序员还应该了解各类程序设计技巧,熟悉基本的算法数据结构,而且可以高效的进行程序调试

  • 良好的程序设计能力是成为优秀程序员的前提,但软件开发知识也是必不可少的:优秀的程序员应具有良好的编程实践,知道如何利用面向对象重构,和软件测试编写可复用,可扩展,可维护的代码,并具有软件项目管理知识和专业开发素养;

  • 就像咱们能够从名人传记里学习名人的成功经验,程序员也能够经过追随优秀程序员的足迹使本身少走弯路。大师之言包含一系列对大师程序员/计算机科学家的访谈,任何程序员均可以从中获益良多;

  • 为了打造用户满意的软件产品,程序员应当掌握必定的界面设计知识和交互设计知识(是的,这些工做应该交给UI和UX,但若是你想独自打造一个产品呢?);

  • 专业程序员应当对本身进行职业规划,并熟悉程序员求职面试的流程,以便在职业道路上越走越远;

  • 软件开发是一项须要不断学习的技能,学习思惟方式能够有效的提高学习能力和学习效率;

  • 软件开发是一项国际化的工做,为了让更多的人了解你的代码(工做),良好的英语写做能力必不可少。

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

程序设计

1. 基础理论

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

深刻理解计算机系统(第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语言——以及计算机科学中最重要的书籍之一,它的重要性不只仅在于它用清晰的语言和简练的代码描述了C语言全貌,并且在于它为以后的计算机书籍——尤为是编程语言书籍树立了新的标杆。以致于在不少计算机书籍的扉页,都会有“感谢Kernighan教会我写做”这样的字样。

延伸阅读:

  • C专家编程:不要被标题中的“专家”吓到,这实际是一本很轻松的书籍,它既包含了大量C语言技术细节和编程技巧,也包含了不少有趣的编程轶事;

  • C陷阱与缺陷:书如其名,这本书介绍了C语言中常见的坑和一些稀奇古怪的编程“技巧”,很多刁钻的C语言面试题都源自这本小册子;

  • C语言参考手册:全面且权威的C语言参考手册,并且覆盖C99,若是你打算成为C语言专家,那么这本书不可错过;

  • C标准库:给出了15个C标准库的设计思路,实现代码,以及测试代码,配合C程序设计语言阅读效果更佳;

  • C语言接口与实现:这本书展现了如何使用C语言实现可复用的数据结构,其中包含大量C语言高级技巧,以致于Amazon上排行第一的评论是“Probably the best advanced C book in existance”,而排行第二的评论则是“By far the most advanced C book I read”。

C++

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

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

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

延伸阅读:

  • A Tour of C++:若是你以为C++程序设计语言过于庞大,但你又想快速的浏览一遍新版C++的语言特点,那么能够试试这本小红书;

  • C++语言的设计与演化:C++的“历史书”,讲述了C++是如何一步一步从C with Classes走到现在这一步,以及C++语言特性背后的故事;

  • C++标准库(第2版):相对于其它语言的标准库,C++标准库虽然强大,但学习曲线十分陡峭,这本书是学习C++标准库有力的补充;

  • 深度探索C++对象模型:这本书系统的讲解了C++是如何以最小的性能代价实现对象模型,不少C++面试题(包括被问烂的虚函数指针)均可以在这本书里找到答案;

  • Effective C++和More Effective C++:因为C++的特性实在繁杂,所以很容易就掉到坑里。Effective系列既讲述了C++的良好编程实践,也包含C++的使用误区,从而帮你绕过这些坑。

Java

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

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

延伸阅读:

  • 深刻理解Java虚拟机(第2版):很是优秀且可贵的国产佳做,系统的介绍了Java虚拟机和相关工具,并给出了一些调优建议;

  • Java程序员修炼之道:在这本书以前,并无一本Java书籍系统详细的介绍Java 7的新特性(例如新的垃圾收集器,try using结构和invokedynamic指令),这本书填补了这个空白;

  • Java并发编程实践:系统全面的介绍了Java的并发,如何设计支持并发的数据结构,以及如何编写正确的并发程序;

  • Java Puzzlers:包含了大量的Java陷阱——以致于读这本书时我说的最多的一个词就是WTF,这本书的意义在于它是一个反模式大全,Effective Java告诉你如何写好的Java程序,而Java Puzzlers则告诉你糟糕的Java程序是什么样子。更有意思的是,这两本书的做者都是Joshua Bloch

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#为工做内容的程序员都应该阅读此书。

延伸阅读:

  • 深刻理解C#(第3版):C#进阶必读,这本书偏重于C#的语言特性,它系统的介绍了C#从1.0到C# 4.0的语言特性演化,并展现了如何利用C#的语言特性编写优雅的程序;

  • .NET设计规范(第2版):C#专业程序员必读,从变量命名规范讲到类型系统设计原则,这本书提供了一套完整的.Net编程规范,使得程序员能够编写出一致,严谨的代码,

  • C# 5.0权威指南:来自O'Reilly的C#参考手册,严谨的介绍了C#语法,使用,以及核心类库,C#程序员案头必备;

  • LINQ to Objects Using C# 4.0和Async in C# 5.0:LINQ和async分别是.Net 3.5和.Net 4.5中所引入的最重要的语言特性,因此我认为有必要在它们上面花点功夫——这两本书是介绍LINQ和async编程的最佳读物。

JavaScript

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

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

延伸阅读:

  • JavaScript高级程序设计(第3版):详尽且深刻的介绍了Javascript语言,DOM,以及Ajax,并针对HTML5作了对应更新;

  • JavaScript权威指南(第6版):这本书的第5版曾被前端专家Douglas Crockford称之为“惟一靠谱的JavaScript书”。相对于JavaScript高级程序设计,JavaScript权威指南更像是一本案头参考书,固然若是你感兴趣也能够从头读到尾;

  • 编写可维护的JavaScript:书如其名,这本书给出了大量的优秀JavaScript编程实践,使得程序员编写出健壮且易于维护的JavaScript代码;

  • JavaScript异步编程:和常见的支持并发的编程语言(例如Java和C#)不一样,JavaScript自己是单线程的,所以不能把其它语言处理并发的方式照搬到JavaScript。JavaScript异步编程系统的介绍了JavaScript中的并发原理,并阐述了如何使用PromiseDeferred以及Async.js编写出简洁高效的异步程序。

Python

Python的入门书籍不少,并且听说质量大多不错,我推荐Python基础教程的缘由是由于它是个人Python入门读物——简洁,全面,代码质量很不错,并且有几个颇有趣的课后做业,使得我能够快速上手。

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

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

延伸阅读:

  • Python袖珍指南(第5版):实用且便携的Python参考手册,我会说我在飞机上写程序时用的就是它么 -_-#;

  • Python Cookbook(第3版):很是好的Python进阶读物,包含各类经常使用场景下的Python代码,使得读者能够写出更加Pythonic的代码;

  • Python编程实战:运用设计模式、并发和程序库建立高质量程序:Python高级读物,针对Python 3,2014年的Jolt大奖图书,不可错过;

  • Python源码剖析:少见的国产精品,这本书以Python 2.5为例,从源代码出发,一步步分析了CPython是如何实现类型,控制流,函数/方法的声明与调用,类型以及装饰器等Python核心概念,读过以后会大大加深对Python的理解。尽管这本书有些过期,但咱们仍然能够按照它分析源代码的方式来分析新版Python。

3. 编程语言理论

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

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

延伸阅读:

  • 七周七语言:理解多种编程范型:尽管咱们在平常工做中可能只使用两三门编程语言,可是了解其它编程语言范式是很重要的。七周七语言一书用精简的篇幅介绍了Ruby,Io,Prolog,Scala,Erlang,Clojure,和Haskell这七种具备不一样编程范式的语言——是的,你无法经过这本书变成这七种语言的专家,但你的视野会获得极大的拓宽;

  • 自制编程语言:另外一本优秀的编译原理做品,自制编程语言经过从零开始制做一门无类型语言Crowbar和一门静态类型语言Diksam,把类型系统,垃圾回收,和代码生成等编程语言的关键概念讲的清清楚楚;

  • 计算的本质:深刻剖析程序和计算机:披着Ruby外衣的计算理论入门书籍,使你对编程语言的理解更上一层楼。

4. 程序设计

程序设计方法

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

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

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

延伸阅读:

  • 编程本来:STL做者的关于程序设计方法佳做——他把关系代数和群论引入编程之中,试图为程序设计提供一个坚实的理论基础,从而构建出更加稳固的软件。这本书是程序设计方法和计算机程序的构造与解释的绝好补充——前者使用函数式语言(Scheme)讲授程序设计,而编程本来则使用命令式语言(C++);

  • 元素模式:设计模式总结了面向对象程序设计中的模式,而元素模式这本书分析了程序设计中的常见模式的本质,阅读这本书会让你对程序设计有更深的理解;

  • The Science of Programming:会编程的人不少,但可以编写正确程序的人就少多了。The Science of Programming经过前条件——不变式——后条件以及逻辑谓词演算,为编写正确程序提供了强有力的理论基础,而后这本书经过实例阐述了如何应用这些理论到具体程序上。任何一个想大幅提升开发效率的程序员都应阅读此书。

5. 算法与数据结构

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

  • 使用更为容易的Java语言做为教学语言;

  • 覆盖全部经常使用的数据结构和算法,并均给出其完整实现;

  • 包含大量的图示用于可视化算法——事实上这是我读过的图示最为丰富形象的书籍,这也是我称其为最好的算法入门书籍的缘由。

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

延伸阅读:

  • 编程珠玑(续):严格来讲这本书并不是编程珠玑的续做,而是一本相似于番外篇的编程技巧/实践手册;它不像编程珠玑那般重视算法的应用,而是全面覆盖了程序员所需的能力;

  • 算法导论(第3版):尽管我在这边文章开头提到会尽可能避免理论性的书籍,但没有算法导论的算法阅读列表是不完整的,我想这本书就不须要我多介绍了; :-)

  • 算法设计与分析基础(第3版):侧重于算法设计,这本书创新的把常见算法分为分治,减治,变治三大类,并覆盖了动态规划,回溯,以及分支定界等高级算法设计方法,属于算法设计的入门佳做;

6. 程序调试

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

相关文章
相关标签/搜索