专栏名称: InfoQ
有内容的技术社区媒体。
目录
相关文章推荐
新浪科技  ·  【#折叠iPhone研发新动态曝光#】一份新 ... ·  昨天  
新浪科技  ·  #蔚来2024年交付量创历史新高# ... ·  昨天  
腾讯研究院  ·  腾讯研究院AI速递 20250320 ·  2 天前  
51好读  ›  专栏  ›  InfoQ

每个程序员书柜必备的编程书籍

InfoQ  · 公众号  · 科技媒体  · 2016-11-04 07:59

正文

一提到有关编程方面的书籍,你就会想起江湖中传说的“每个程序员必读的12本计算机科学书籍”,然而,这份清单并没有什么实用性。因为……

原文参考了Dan Luu的博客,经作者授权,由InfoQ编译、整理并分享。

http://danluu.com/programming-books/

一提到有关编程方面的书籍,你就会想起江湖中传说的“每个程序员必读的12本计算机科学书籍”,然而,这份清单并没有什么实用性。因为,计算机科学领域非常宽泛,几乎所有程序员都可以阅读任何主题,就算某个主题很重要,但由于读者的学习偏好天悬地隔,因此对所有读者而言,某个主题并不存在所谓“最好的”书籍。

本文是我已经阅读过的主题和书籍的清单。这些都是我很熟悉的主题,也许你可以在此文中,了解关于该主题更多的情况,并阅读其他相关书籍。换而言之,就是说你为什么需要阅读另一本书。

算法、数据结构、复杂性

为什么要关心算法、数据结构和复杂性? 好吧,有一个实用的结论:在工作中,即使你从来没有用到这些东西,但是,大多数一流的支付公司在面试中会测试这些内容。我决不瞎扯,算法真的很有用,就像我发现数学很有用一样。任何特定算法适用于任何特定问题的概率很低,但从总体上说明什么类型的问题如何解决,什么样的问题难以处理,通常当近似有效时就有用了。

《Cracking the Coding Interview》

作者:McDowell

出版社:CareerCup; 6th edition (July 1, 2015)

中文版:《程序员面试金典》

译者:李琳骁、漆犇

出版社:人民邮电出版社,第五版

《程序员面试金典》的作者McDowell,是原Google资深面试官的经验之作,层层紧扣了程序员面试的每一个环节,全面详尽介绍了程序员应当如何应对面试才能脱颖而出。

该书涉及到面试流程解析、面试官的幕后决策及可能提出的问题、面试前的准备工作、对面试结果的处理等内容,还涵盖了数据结构、概念与算法、知识类问题和附加面试题四个方面,为读者提供了来自Google、Facebook、Microsoft等多家知名公司的编程面试题,并为每一道面试题分别给出了详细的解决方案。

我会向那些并没有真正掌握算法、但又想通过面试的程序员推荐这本书。这本书读起来尚可,不过并不能真正教会你知识,如果想真正掌握算法和数据结构,那么继续往下看。

《Algorithms》

作者:Dasgupta、Papadimitriou、Vazirani

出版社:McGraw-Hill Education

中文版:《算法概论》

译者: 王沛、唐扬斌、刘齐军

出版社:清华大学出版社

《算法概论》是一本适合入门的读物,但却不失深度以及广度,读来让人兴趣盎然。我认为,认真读完这本书,并且思考每章后面的习题,会对算法有一个很好的大局观。当然要掌握算法,只靠这一本书是不够的,不过算作最佳入门是当之无愧的。

该书全面介绍了算法的基本知识,将算法分成类(例如分治法、,或贪婪算法),在表达每一种技术时,强调每个算法背后的数学思想,让你掌握如何判断应该使用什么样的算法来解决特定的问题。

该书合理挑选主题,厘清了一条算法这门学问的线索,对结构的精心安排,对问题的数学结构的剖析,从而推出一个算法的过程的讲解。长度适宜,仅有三百多页,可以利用几个周末进行阅读。

不过,我知道有些读者不会喜欢这本书,因为它包括了太多的数学思想。如果是你,我猜你可能喜欢Skiena著的那本书。

《The Algorithm Design Manual》

作者:Skiena

出版社:Springer; 2nd edition (July 26, 2008)

《The Algorithm Design Manual》要比Dasgupta所著的那本《Algorithms》更长,更全面,也更实用,而且涉及到的数学也更少。它差不多就是试图教你如何识别问题并使用正确的算法来解决问题、以及给出一个清晰的算法解释的那本书。

该书内容丰富,各个主题几乎无不涉及,从常见的各种数据结构到算法策略、可计算性。如果想当做教科书,该书每章结尾都有很多练习,值得推荐。这本书充满了激情的“战争故事”,显示了算法在现实世界编程的影响。

《Introduction to Algorithms》

作者:Cormen、Leiserson、Rivest、Stein(CLRS)

出版社:The MIT Press; 3rd edition (July 31, 2009)

中文版:《算法导论》

译者:殷建平、徐云、王刚、刘晓光、苏明、邹恒明、王宏志

出版社:机械工业出版社; 第1版 (2013年1月1日)

在江湖中流传的各种版本“所有程序员必读之书”的清单中,《算法导论》就占据了半壁江山。这本书将严谨性和全面性融为一体,深入讨论了各种算法。实际上,几乎没有读者会读完整本书。不过,全书各章自成体系,可以作为独立的学习单元。它是全球读者最多的算法圣经。

该书的特点是选材经典、内容翔实、结构合理、逻辑清晰。每章前半部分介绍了讲授和学习算法的有效方法,后半部分为更专业的读者和求知欲强的学生提供了更引人入胜的资料来讨论这个迷人领域的各种可能性和挑战,对本科生的数据结构课程和研究生的算法课程而言是非常棒的教科书。

比如说,有整整一章是关于Van Emde Boas树,写得很工整,这有点奇怪,像的平衡树结构的插入、删除、就像查找、继承一样好,也许以前的书籍可能如此,但它是第一个没有包含Van Emde Boas树的算法导论。

《Algorithm Design》

作者:Kleinberg、Tardos

出版社:PEARSON EDUCATION; 1 edition (2013)

《Algorithm Design》广受好评,堪比CLRS所著《Introduction to Algorithms》,被推荐为关于算法设计和分析的一本不可多得的优秀入门书。我发现,这本书与CLRS所著的书相比,该书将直观性与严谨性完美结合起来。覆盖面比较宽广,凡属串行算法的经典论题,都有所涉猎。

《Advanced Data Structures》

作者:Demaine

《Advanced Data Structures》是一套讲稿和笔记,而非一本书。如果你想要一套条理清楚但不难综合的数据结构的学习资料,在大多本科课程中,你不大可能看到,因此这套讲课和笔记,功德无量。

这些笔记没有出单行本的计划,所以如果您尚未看过这些资料,就必须观看教学视频。

《Purely Functional Data Structures》

作者:Okasaki

Cambridge University Press (June 13, 1999)

出版社: Cambridge University Press

《Purely Functional Data Structures》读起来很有趣,但不同于其他算法和数据结构的读物的是,我从这本书中,还没能得到真正解决实际问题的重要能力。

在我读完这本书后过了几年,有人告诉我,推理出纯函数冗余数据结构的性能并不难。我就向他们请教这本书中把我难倒的证明部分,我并不是在讨论那些晦涩难懂的超难习题,而是说这本书的主要内容,作者有太多过于明显的解释性的东西。但是并没有人解释。这种东西的推理比大家说的还要难。

《Higher Order Perl》

作者:Dominus

出版社: Morgan Kaufmann Publishers

中文版:《华章程序员书库:高阶Perl》

译者:滕家海

出版社:机械工业出版社

《高阶Perl》在Perl领域深入探讨了各种最新的主题,如递归、迭代器、过滤器、划分、数值方法、高阶函数、惰性求值等内容,并将这些转换成现实变成工作中强有力的实用工具:HTML处理、数据库访问、网页抓取、家庭理财等等。

该书恰当地介绍了使用Perl的函数式编程。通过这本书的学习,你可能像Python或Ruby那样很容易进行工作。

不过,如果你跟得上潮流,你会发现这本书可能有点过时,因为讲解的是2005年的Perl 5,而现在是2015年12月25日发行的Perl 6。不过,这本书提到的思想,目前已成主流。

《Algorithms》

作者:Levitin

出版社:Pearson; 3 edition (October 9, 2011)

“强化学习的其他特点,包括:章节摘要,习题提示。这是一本详细的解决方案手册。”、“学生通过习题提示和章节摘要进一步支持学习。”其中一个广告甚至印在书上。

当我看到这两个广告后,就在亚马逊下了订单购买《Algorithms》。但在我拿到这本书后,我唯一的自学资源却是在雅虎问答(Yahoo Answers)里的一些帖子,在那里你能找到提示或者解答。

最后,我拿起了Dasgupta的著作来取代了这本书,因为他的网站资源可以免费使用。

《Probability and Computing: Randomized Algorithms and Probabilistic Analysis》

作者:Mitzenmacher、Upfal

出版社: Cambridge University Press (January 31, 2005)

我获得的算法知识可能比其他任何算法书籍讲述的都多。许多随机算法移植到其他应用程序虽然很琐碎,但却可以简化很多事情。

《Probability and Computing: Randomized Algorithms and Probabilistic Analysis》有关概率学的介绍部分很翔实,就算读者不具备任何概率学的背景也能轻松入门。此外,的内容(例如,)对许多计算机科学理论的证明很有用,这些在我所阅读到的概率学介绍内容中都没有提到。

《Introduction to the Theory of Computation》


作者:Sipser

出版社:Cengage Learning; 3 edition (June 27, 2012)

中文版:《计算理论导引》

译者:段磊、唐常杰

出版社:机械工业出版社,第一版

《计算理论导引》以独特的视角,系统介绍了计算理论的三大板块:自动机与语言、可计算性理论、计算复杂性理论。讲述了宽泛的数学原理,没有拘泥于某些低层次的细节。

在证明之前,都有直观的“证明思路”,帮助读者理解数学形式下蕴涵的概念。很多重要的结果,如定理,都被作为练习题。所以你真的需要做这些关键练习题。但是,大多数关键练习题没有提供答案,因此你也无法知道你解答是否正确。

如果想选择更为现代的主题,也许可以阅读Aurora和Barak的著作。

《Computation》

作者:Bernhardt

《Computation》这部教学影片涵盖了一些计算机理论的重点部分。影片讲解令人愉悦,为了观看Bernhardt讲解的内容,这个影片我已经观看不止一次了。该影片的受众是那些没有计算机科学背景的一般程序员。

《An Introduction to Computational Learning Theory》

作者:Kearns & Vazirani

出版社:The MIT Press (August 15, 1994)

《An Introduction to Computational Learning Theory》是一本非常经典的读物。但是这本书已经过时(InfoQ注:该书1994年出版,距今已经22年了),而且漏洞百出,没有勘误。我最终从几门课程拼凑了一些笔记,一个是Klivans的著作,另一个是Blum的著作。

操作系统

为什么要关心操作系统?因为,掌握一些关于操作系统的知识,可以让你节省几天或一周的调试时间。 这是Julia Evans博客上经常提到的话题,我发现,就我个人经验来说,确实如此。

那些建立可行的系统并了解一些操作系统知识的人,却没有发觉如果有操作系统知识的话会很节省时间,这点我很难想象。

可是,读过操作系统书籍的人往往有偏见——正是做这方面的相关人士,如果你是骨灰级玩家,除非阅读这些,你可能得不到同样的结果。

《Operating System Concepts》

作者:Silberchatz、Galvin、Gagne

出版社:Wiley; 9 edition (December 17, 2012)

中文版:《操作系统概念》(第七版)(翻译版)

译者:郑扣根

出版社:高等教育出版社; 第1版 (2010年1月1日)

好吧,这是Comet Book成为标准之前,我们在Wisconsin就用过的一本书。

《操作系统概念》涵盖了高阶概念并击中要点,但是在技术层次的深度稍显不足,没有详细阐述事情是如何工作的,也没有清晰列出更高级的主题。

顺便说一下,我听说了关于Comet书籍的好消息,但是我不敢妄言,毕竟我还没有阅读过。

《xv6》

作者:Cox、Kasshoek、Morris

这本《xv6》真的太棒了!它解释了你如何能够在真实系统上有效运作,你可以设想自己实现一个可执行的操作系统。按照本书写作的设计,作者倾向于简单的实现而非优化的实现,因此,书中使用的算法、数据结构和平常的生产系统完全不同。

这本书与介绍现代操作系统如何工作的书籍配合阅读,比如Love著的《Linux Kernel Development》或者Russinovich著的《Windows Internals》,学习效果会更好。

《Linux Kernel Development》

作者:Love

出版社:Addison-Wesley Professional; 3 edition (July 2, 2010)

《Linux Kernel Development》的书名可能有误导之嫌,这不是关于Linux内核开发的读物,基本上是一本阐述Linux内核如何工作的书籍:事物是如何契合的,使用了什么算法和数据结构等等。我阅读的是第二版,现在已经完全过时了。

第三版内容有所更新,但是也引进了一些错误和矛盾之处。而且,这一版本仍然过时,这本书2010年出版,讲的是内核2.6.34。虽然如此,该书仍然不啻一本优秀的介绍现代操作系统原理的读物。

该书还有一个缺点,在作者拿Linux和Windows进行比较时,有失客观,基本上就是每次比较的时候,就宣扬Linux是明确无疑的正确选择,Windows总是干蠢事。总体来说,Linux和Windows我都喜欢,在有些领域,Windows做得更好。而且在有些地区,Windows已经领先很多年了。但在这本书中,你甭想看到类似这些评价。

《Windows Internals》

作者:Russinovich、Solomon、Ionescu

出版社:Microsoft Press; 6 edition (March 25, 2012)

中文版:《深入解析Windows操作系统:第6版(上册)》

译者:潘爱民、范德成

出版社:出版社: 电子工业出版社; 第1版 (2014年4月1日)

《深入解析Windows操作系统》是阐述现代操作系统如何工作最全面的一本书,只不过碰巧这本书是关于微软Windows。作为从*nix走过来的人,看到Windows和*nix不同的差异,这样的阅读非常有趣。

然而,该书并非简单的入门书,在阅读本书之前你必须掌握一些操作系统知识。

如果想买这本书,你要等到2017年初发行的第七版。

《The Little Book of Semaphores》

作者:Downey

《The Little Book of Semaphores》是一本这样的读物:列出一个主题,通常从操作系统的教科书中抽取一两个章节,然后拼凑成为自己长达300页的书。

这本书是一系列的习题,有点像小型提纲,但更多的是阐述。它首先解释了什么是信号量,然后给出构建高并发原语知识的一系列习题。

在我开始编写并发线程代码时,这本书提供了很大的帮助。我订阅了Butler Lampson学院关于并发的资料,我喜欢把并发相关代码塞到别人写的黑盒。但是有时候你坚持自己写黑盒的话,如果是这样,这本书有很好的导论,要求思考方式才可能写出不是完全错误的并发代码。

我希望有朝一日,能有这样的一本书问世:既照顾低水平的读者,又兼顾高水平读者,我很喜欢这样的写作设计。从几个指令集原语不同的内存模型的体系结构(如x86和Alpha),而不是从信号量开始讲起。如果今天我写低劣的低级线程代码,我会更喜欢用C++ 11的线程原语,所以我想用这些东西而非信号量。如果由我来写线程代码的话,我可能会用Win32 API来编写。但到目前为止,还不存在这样的一本书。以后如果有这样一本书问世,那将是最好不过的了。

我听说Doug Lee的Java并发编程非常不错,但我只泛泛而读没有深入研读。

计算机体系架构

为什么要关心计算机体系架构?当你进行底层性能优化的时候,你所学到的具体事实和细节,将会非常有用。但是,真正的价值就是学习如何在性能和其他因素进行权衡,无论是功耗、成本、体积、重量,亦或者其他因素。

从理论上讲,这种推理应该不分专业进行教授,但我的经验是,那些学习计算机体系结构的人更可能会“得出”那种推理和粗略的计算:才能让他们抛开一个没有理由在性能上2倍或10倍(或100倍)的因素。听上去很显然,但是我想到大公司的多个生产系统放弃10到100倍的性能,而以一个标准来运行,甚至2倍的性能差异,都足以支付VP的薪水。全是因为人们没有意识到他们的设计带来的性能影响。

《Computer Architecture: A Quantitative Approach》

作者:Hennessy、Patterson

《Computer Architecture: A Quantitative Approach》教你如何用多约束(如性能、TCO(总开销)、功率等)进行系统设计,以及如何推论权衡。它主要以微处理器和超级计算机为例。

该书的新版增加了实质性的补充,这个版本才是你真正想要的读物。比如,新版增加了一个关于数据中心设计的章节,回答了以下问题:用于电力、功率分布、制冷的运营开支OPEX/资本支出CAPEX,以及支持团队和机器的支付费用,使用低功耗机器对tail larency的结果质量及影响(以必应搜索的结果为例),在设计数据中心时应该考虑哪些其他因素。

假设读者具备一些背景,但背景已在附录中提供,并且可免费在线获取。

《Modern Processor Design》

作者:Shen、Lipasti

出版社:Waveland Press, Inc.; 1 edition (July 30, 2013)

《Modern Processor Design》展示了设计Pentium Pro(1995年)时代高性能微处理器所需要了解的大部分内容。因为这种处理器的复杂性,阐述清楚绝非易事。另外,还介绍了一些更为先进的想法和从各种工作负荷可以运行的平行计算的范围(以及你可能会如何进行如此计算)。该书有一个很长的章节,是关于值预测,因为作者发明了这个概念,当第一版发行的时候,还很热门。

对于纯CPU架构,这本可得到的读物大概是最好的。

《Readings in Computer Architecture》

作者:Hill、Jouppi、Sohi

出版社:Morgan Kaufmann; 1 edition (September 23, 1999)

因为历史原因而阅读,看看我们所理解的解释有多好。比如,比较Amdal关于定律的论文(没有公式,只有一幅并非显而易见的图表的两张纸),相对与现代教科书的表述(一个段落,一个公式,或者一幅图表来阐明,虽然通常来说足够清晰,不需要额外的图表)。

糟糕的是,《Readings in Computer Architecture]》看上去让你后退得更远。因为计算机架构真的是很年轻的领域,这里没有什么真正难以理解的东西。如果你想看到一个动人心魄的例子,例如我们怎样更好解释这一些,像比较Maxwell在方程组的最初论文与现代对同一事物的解释。如果你喜欢历史的话,这本书很有趣。但是如果你只是想学习的话,它勉为其难。

博弈算法理论、拍卖理论、机制设计

为什么要关注这些知识(博弈算法理论、拍卖理论、机制设计)?因为这些知识介绍了世界上最大的科技公司在广告收入的运作方式,而这些广告是通过拍卖来销售的。该领域介绍了它们运作的方法和理由。另外,当你尝试弄明白如何设计有效分配资源的系统,这些知识就派上用场了。此外,如果你玩桌游,拍卖理论解释了为什么通过拍卖机制来固化博弈失衡是重要的,往往使游戏更糟。

尤其对设计公司内部激励相容制度(粗略的说,就是如何创建能提供人们出于私心而追求最佳利益的全局最优结果的系统)的人员而言,这些书应为必读书籍。如果你曾在两家大公司供职过,其中一家建立了有效的内部激励相容制度,而另一家没有建立相应制度。你就会发现,没有建立内部激励相容制度的那家大公司烧了大把大把的钱,因为这些人建立了超级没用的激励系统。

这个领域展现了这么一幅画卷,让你了解什么样的机制会带来什么样的结果。通过阅读案例研究,你会得到一个耗资数百万甚至数十亿美元的错误列表,洋洋洒洒,也很有趣。

《Auction Theory》

作者:Krishna

出版社:Academic Press; 2 edition (August 26, 2009)

中文版:《拍卖理论》

译者:罗德明、奚锡灿

出版社:中国人民大学出版社

上一次我阅读《拍卖理论》的时候,它是当时唯一对拍卖理论进行全面且最近介绍的一本书。在第一章中,涵盖了经典的第二价格拍卖的结论,然后涵盖了风险规避、竞标操纵、多个拍卖、非对称信息和其他现实世界的问题。

该书涵盖了拍卖的大部分理论,对深入理解拍卖理论的主要脉络非常必要。但这本书相当枯燥无趣,不大可能激起阅读欲望。除非你对这个主题感兴趣。需要了解基本的概率学和微积分学的知识。该书对致力拍卖研究的研究生是不可或缺的读物。

《Snipers, Shills, and Sharks: eBay and Human Behavior》







请到「今天看啥」查看全文