备受赞誉的编程书籍是否有过期日期?[关闭]


51

在阅读了有关每个程序员都应该阅读的书籍的问题之后,我想知道是否应将以下内容视为过时的:

所有这些书似乎都很老。现代计算机与写这些书的最新内容之间没有区别吗?

例如,我61岁的老师讲得很好,但忘记了25年前开始教书到现在之间所做的一切。

这些书不一样吗?难道没有更多现代书籍教授与当前实践更接近的原理和技术吗?还是您认为它们在今天还是有用且相关的?


9
您值得考虑一下为什么列出的所有书名至少在12年前才首次出版,但今天仍然有价值。自第一版以来,五个中的四个已更新,但两个版本之间的平均时间为10.4年。
Caleb

83
基本的编程原理并不会因为出现一种新的“本周风味”语言或框架而改变。
罗伯特·哈维

26
期望一个计算机科学专业的原始毕业生能够构建一个复杂的软件系统,就像期望一个土木工程专业的原始毕业生设计一座吊桥一样,这简直是不应该发生的。学校并没有教您长远需要知道的一切,它应该教您如何学习如何成为一名出色的软件工程师,而这些书现在和几十年前一样有很多话要说-结束了自《神话人月》发行20周年纪念版以来已有16年了,今天它与原始版本在1975
Mark Booth

10
这些书是永恒的;但程序员谁将会限制自身只为这些书籍谁也忽略新的东西,会过时确实
蚊蚋

4
您在乞求一个问题:如果这些书不错,那么它们就不会过时。
quant_dev

Answers:


92

这些书是关于发展的原则。这些原则本质上与语言无关,甚至对于某些与范式无关的事物(OOP,函数式编程,命令式语言)。

他们解释了开发的理论和好的方法,因为最终,软件总是要获取数据,对其进行处理然后将其输出。Facebook,Twitter,3D,会计的批处理,铁路交通管理,火箭发射等。

与某种语言有关的书籍,例如"How to learn XXXXX in YY days",其中XXXXX是一种语言,而YY是一个数字,该书籍 最终(有时实际上很快)会过时,因为从本质上讲,它们是关于或者发展,或者被替换并成为过时的。

令人敬畏的史蒂夫·麦康奈尔(Steve McConnell)编写的Code Complete也许是使我意识到这一点的书。而程序员修炼完全改变了我的眼光有软件开发。通过阅读这些书籍,您意识到您每天面临的问题的95%已经解决了,而我们95%的人仍在重新发明轮子。

所谓的“云”不是软件开发的未来,而是使用开发的软件的一种方式。

不要陷入炒作/废话流行语的陷阱,而应专注于如何提高软件工匠技能。

专注于向其他杰出的精神学习和学习,因为这是成为有成就的开发人员的唯一途径。


6
优秀的艺术家
模仿

16
...真正的艺术家飞船。:-)
kindall

9
但是,无论我们说多少次,人们仍然相信他们仅需要12天就能使用javascript。
Spencer Rathbun

2
好艺术家复制,好艺术家复制并保持代码干净!(我在学校和与其他孩子一起工作的孩子头疼很多,他们把这个项目弄得一团糟,因为他们会复制所有人的东西……)
HTDutchy 2011年

此外,@ SpencerRathbun(IMHO),JavaScript比其他语言(例如PHP)消耗的麸皮更多。然而,有一个"Learn Javascript in 15 seconds"只有十亿八千万的市场"Learn PHP on 17 secsonds"
Clement Herreman

80

所有这些书看起来都非常非常古老。”

心理计算机编程(1971)-程序员的数量是1970年的一百万倍,因此如何设计程序,犯哪些错误以及如何避免它们的心理学比以往任何时候都更为重要。

软件工具(1976)-网络是框架,实用程序,脚本和插件的集合,因此软件工具中的思想从未像现在这样重要。

编辑:解决一个普遍的问题-旧的编程书籍相关吗?

软件工程的一般原理并没有太大改变,有新技术OO,TDD等。但是总体而言,用户和问题都没有改变-关于如何划分问题的思考与现在相同一直是。

这些旧书通常由该领域的专家撰写。许多现代编程书籍旨在冲出2000页的门挡,以获取最新的流行语。

有关不再使用的语言和技术的书籍可能不相关-清单上没有Vax汇编器手册。但是,“ C”仍然非常常用,“ C编程语言”不仅是有关“ C”的最佳书籍,它还是一种如何编写简洁的教程和参考您的语言的模型。

是否有新算法?是。但是所有旧算法仍然适用,大多数新算法都位于您不太可能会遇到的晦涩领域。最近没有人提出更好的排序或FFT。尽管其他人已经尝试过更好地解释它们,但没有理由认为今年的《算法》书籍要比CLRS好。

ps。您很酷的新iWhatsit运行着1977年开发的BSD。现在,您的孩子们从我的草坪上走下来!


28

所有这些书看起来都非常非常古老。您难道不认为现在和写这本书之间有什么区别吗?

恕我直言,几十年来,非常好的书籍继续流行并不奇怪-这表明它们是多么的出色。但是我想我可以为您列出的每个候选人告诉您一些信息:

Code complete: 2nd edition = may, 2004

实际上,“ Code complete”的第一版是1993年发行的,因此这确实是一个“经典”版本。它是关于基本编码风格的,使用的示例几乎适用于C系列的每种编程语言,其中包含当今最流行的语言(C / C ++ / Java / C#/ Objective-C / D / ...)。是的,这本书是最新的。

Introduction to algorithms (Cormen, Leiserson, Rivest, Stein)

好吧,我实际上没有读过那本书(我的算法教科书来自“ Sedgewick”),但是学习算法和算法构建确实与语言无关。当然,由于您现在在标准库中发现了许多基本算法,因此最近几年该技巧被低估了,但是恕我直言,每个专业程序员都应该在这一领域具有一些基本知识。

The Pragmatic Programmer

这是一本关于编程技巧的非常好的书。语言不可知且非常最新,只要程序员使用文本编辑器,IDE,版本控制等将编程作为手动任务完成即可。

Structure and Interpretation of Computer Programs: = September 1, 1996

这是我个人的最爱,即使(或也许是因为)本书使用Scheme教您不同编程范例之间的差异。我不知道有哪本书对构建抽象有如此强烈的关注。构建抽象是一项关键能力,它使平庸的程序员和顶尖的程序员有所不同-在过去的几十年中,这没有改变,因此,这本书确实是永恒的。此外,功能语言和语言元素近来变得越来越流行,因此恕我直言,本书中提出的想法得到了复兴。

The C Programming Language

好吧,这本书可能没有其他四本书那么永恒。但是由于C就像我上面列出的所有那些流行语言的“母体”一样,因此阅读这本书也是一个好主意-我认为并没有真正更好的现代“ C”书。而且,如果您必须进行C ++代码的维护编程,这是由一个比C ++更好地了解C的人编写的,那么这本书是必须的。

最后,您所要求的书籍要考虑到更多的“当前现实”,而又不是太注重技术。那么什么是“当前现实”,什么在“非技术”方面发生了变化?以下是过去十年的一些观点,但并不表示这份清单是完整的或具有正确的优先次序。

  1. 存在更多的遗留代码(尤其是不仅在Fortran和Cobol中,而且在C ++和Java中都有更多的遗留代码)。
  2. 单元测试和TDD已变得越来越受欢迎。
  3. 还有更多可用的开源代码。
  4. OO越来越受到批评

(我在这里没有列出任何有关Web或App开发的信息,因为我认为该技术是特定的)。

对于主题1和主题2,都有不错的书,特别是2008年的“ Clean Code”和2004年的“有效处理遗留代码”。也许您正在寻找一些“较新的”书?


5
C编程语言永恒的。这样的精装书很少见。我已经重新阅读了……。我不知道,我输了数(我13岁时第一次阅读),我仍然很感激。相反,我现在非常感谢。
Francesco

3
我将在您的列表中添加#5:并行计算。这并不是一个主意,但如今它正在以前所未有的规模进行,这带来了一些新问题。但是,所有这些仍然与旧的东西建立在相同的基础上,我感到OP仍然不是很了解这些基础。
Mike Baranczak 2011年

2
@Mike:我同意,并行计算在过去十年中越来越受到关注,当我写下答案时,我很想念它。
Doc Brown

2
@Doc Brown您是否对文学的永恒性有看法,是因为您从自己的角度来看,在几天的时间内就访问了1885年,1955年,1985年和2015年?
卡拉马内

13

在您提到的“代码完成”,“务实的程序员”和“ SICP”中,对于我公司开始并希望达到更高水平的所有新开发人员,它们都是我的推荐读物。

他们不会过时,因为计算机科学的基础科学并没有改变。


10

我还没有看完所有这些书,但是我有《代码完成》和《实用程序员》。这些书绝不是过时的。他们可能有几段让人有些生疏的段落,但是今天大部分内容仍然有用。

计算机科学和编程的进步是一个进化的过程。在旧的基础之上引入了新的抽象,但是这些新事物并不一定会使旧的过时。

打个比方...无论您是学习成为创伤外科医师还是专门从事心脏移植的外科医师,您仍需要了解人体的工作原理,细胞化学,器官系统,如何打开胸部以及如何快速如果发生流血,则可以止血,等等。。。仅仅是因为他们发明了内窥镜设备和侵入性较小的技术,并不意味着您不了解基础知识。这仅意味着您必须学习更多。


是的,格雷的解剖学(不是电视节目的真实书籍)写于1918年,医学生仍在使用它。
HLGEM 2011年

7

“云”不是一个因素。实际上,“云”比您列出的大多数书籍要古老得多。这些书中的大多数都是关于核心原理的,实际上它们从未改变过。框架和库一直在变化,但是结构代码的方式并没有太大变化。同样,指针仍然是一个指针,它不会仅仅因为它而开始做不同的事情。您列出的唯一一本特定于语言的书是关于C的,在这种情况下,旧书比任何新书都有用,因为这本书可能写得更接近您要使用的任何C代码的开发时间。


6

您引用的列表,没有它们已过时。只有当主题发生足够的变化以致它们无用时,书才过时。自发布以来,编程的性质和C语言的变化都很小


6

您需要意识到的一件事是,存在着本质上是永恒的基本原理,并且实现往往会不断发展。

基本原理本质上是计算机科学倾向于花费大量时间的所有无聊理论,即使周围环境发生变化,该理论仍然有效。这相对于像“如何使用的Win32s的Windows 3.11下”,这很老的和过时的。

放眼事物-关于几何的规范文字已有两千多年的历史了。最多达到大学水平的大多数数学老师都至少有300年的历史。CS书籍不老的唯一原因是该领域仍然是新的。


第一本书的欧几里得命题1不能从提供的定义,公理和假设中得到证明。从今天开始学习并不是一个好选择,并且在千年之后可以认为已经过时了。
David Thornley

1
@DavidThornley如果Euclids Elements不是关于几何的规范文本,那是什么?

6

有些书是永恒的,因为它们讨论了对于软件开发实践至关重要的思想,因此它们将始终适用。

Mythical Man Month为例,当我阅读本书时,我一直忘了这本书是1975年写的。当他偶尔在IBM System 360的参考书中时,它总是让我感到烦恼,因为那是唯一可追溯到2000年的内容。书。现在和现在,其他所有内容都适用。我仍然保留着Martin Fowler的企业应用程序体系结构模式的副本,该模式已经9岁了,但是又是永恒的,并且仍然适用于我今天所做的工作。

我现在最喜欢的书是Peter Coad的《使用UML进行彩色Java建模》(1999年),尽管我是C#开发人员并且避开了UML,因为这种技术和概念使我成为了更好的编码人员。

我们很高兴向第一代开发人员学习,因为他们已经踏上了我们现在所走的道路,而他们来之不易的智慧可以帮助我们迅速开始今天的工作/学习。


MMM-我喜欢关于团队不断修复错误的部分,但是错误的数量保持不变:)
JoelFan 2011年

5

在过去的20年中,软件的核心原理没有改变。堆栈,树和链表仍然与那时相同。“ XOR”仍然意味着同一件事。一个字节仍然有8位。

您是否在认真建议“多平台开发”是一个新想法?您为什么认为C是发明的?

“云”是营销流行语。它曾经表示某种特定的东西,但是由于过度使用而被贬低。如今,只要您有可以通过网络与远程服务器通信的东西,营销人员便会在其上贴上“云”标签。因此,谈论它真的没有意义,因为它是一个毫无意义的词。

我不认识你61岁的教授,所以我不能担保他。另一方面,您显然不像您认为的那样聪明。听教授讲,您可能会学到一些东西。


“你不会因没有傻瓜而变老。很多年轻的智者,都死于混蛋。” -理查德·普赖尔


2
“另一方面,你显然不如你想象的那样聪明。” 如果我认为我聪明的,我就不会问这样的问题。
奥利维尔·庞斯

4

这是一些更旧和过时的书:

  • 计算机编程艺术,第一卷。D. Knuth的1-3。这些出版物在1968年至1981年之间出版!人们不再使用真空管了!这些书中的一切都是la脚的。关于Python和Ruby的讨论在哪里?

  • 计算机与难处理性:MR Garey和DS Johnson于1979年提出的NP完全性理论指南。所有这些问题可能已经解决了。

如果最近三年没有写一本专注于Python的书,那不值得一读。


公平地讲,至少有一种情况可以使TAoCP将汇编器用于其伪代码,这意味着90%以上的不为嵌入式编写的人中,使用更接近现代语言的伪代码的更多现代算法书籍更有用。系统。
彼得·泰勒

-1:每隔一两个星期,我就会看到有人要求一种算法来处理Knuth所描述的某些细节。只是为了好玩:命名一种比1981年更新的排序算法。想回答并行排序吗?Knuth上有关于并行排序数据的页面。您可能对Python书籍的看法是正确的,但是“本周的Flavor”书籍和工程工艺书籍之间存在巨大差异。
sarnold 2011年

5
显然一些讽刺
侦探

1
<Sarcasm>“评论” </ Sarcasm>
NWS

1
我认为,如果包括提到《计算机编程艺术》第4A卷(2011年出版)和第5卷(计划于2020年),那么这个答案将使观点变得更好。
Mark Booth,

3

那些书不是过时的,那些书是经典的。

卡普兰斯基的话说,“ 每天花一些时间学习一些与您当前工作的问题脱节的新东西(请记住脱节可能是暂时的,并阅读大师的文章


3

我知道您的意思,当我们取得进步时(会想到LINQ),它们会更改代码的可读性和用法,但是仅仅因为这些书很旧,并不意味着它们不会为读者提供很多教训。

尽管他们使用的编程语言可能已经过时了,但是编程语言背后的理论在今天仍然适用。这些书中的大多数都很好地介绍了基础知识,而基础知识并没有太大改变。


2
他们使用的编程语言主要是“ C”-它们可能已经不流行了,但使用量却大大增加了。
马丁·贝克特

3
您应该阅读SICP,它可能使您对LINQ的来源:之以鼻:)
Joris Timmermans

1

计算机科学行业还很年轻。我认为30年前写的书仍然很有价值,需要它们来全面理解。抽象概念有时需要一段时间才能消化。


1

在所有这些书中,一些次要部分已过时,但99%仍然不错。

算法书籍将慢慢老化。算法是数学,数学并没有迅速改变。当然,仍在研究在某些情况下更好的新算法(例如,Furer 算法(2007)Schonhage-Strassen用于将40000+位数字长整数相乘),但是您需要对基础知识进行学习(分而治之) /动态编程/线性编程/等),因此您可以学习明智地思考算法。

向K&R学习标准C仍然是最好的方法。尽管我不确定我是否会相信他们关于如何设置环境的部分。

SICP是一本很棒的书,它通过教授Lisp(这是一门奇妙的语言)来教授现代CS的基础。但是,可以说lisp并不是当今最有用的语言。尽管其他人会争辩说Lisp是他们的秘密武器,并且像Java或python这样的学习语言首先会使非常糟糕的程序员,他们不再需要学习如何实现排序或链接列表或数组或big-O表示法,而最终却做得非常低效。

某些Code Complete或Pragmatic Programmer的相关性较弱,尤其是如果您使用较新的语言进行编程(例如python / ruby​​ / C ++ 11),因为它们通常着重于如何在C中执行某些操作或使用最佳语言提供推荐的解决方案当时可用的工具(例如用于版本控制的CVS / RCS,而不是git / bzr / hg / svn等现代工具)。但是考虑版本控制是必须的,以及它如何是无缝的和自我记录的,并理解为什么它是绝对必须的逻辑仍然是一件好事。

或PP针对基本的unix编辑器和unix工具针对IDE的建议-并不是说您不应该学习如何使用find / awk / locate / grep / sed,但是一个好的IDE通常可以节省很多时间。例如,emacs可以突出显示语法或完成简单的代码;但是说一个好的IDE会在您输入工具提示时给他们提供函数声明,或者分析代码并标记出未使用的变量,使折叠代码段变得容易等。


1

现代计算机与写这些书的最新内容之间没有区别吗?您认为它改变了我们应该学习的知识吗?我们不应该考虑最近20年的发展吗?

是的,是的,是的。

那不会使那些书过时。“现代计算”是一个难以置信的广义术语。但是,它包含 C编程,因此“ C编程语言”仍然是一本相关的书。它包括算法,因此“算法简介”仍然是一本相关的书。等等等等。

当前对多平台开发的重视是否应该改变我们今天学到的东西?

App Store上的大多数应用程序(以最流行的移动平台为例)都是用Objective C编写的,Objective C是80年代初期的语言,是C的超集。因此,C仍然很重要。

您认为“云”是一种时尚还是未来?

这是我们的礼物。

学生离开大学后,应该是真正的开发人员,并且能够立即工作

但是,这是什么意思?

学校使用的语言,API,框架,平台,工具,协作策略等太多,无法为您做好特定工作的准备。学校只能打基础,为您提供有关机器工作方式,算法,数据结构,代码构造,分解策略,某些工具等的基本工作模型。

一个“真正的开发者”并不是什么都知道的人,而是具有这种工作能力的人,具有理论和实践的基础,并且知道如何学习,因为您的教育永无止境。


1
为“如何学习”评论+1-这是大学的目的,而不是死记硬背的职业培训。
DaveE 2011年

1

好的,所以我将提供一个理论上更多的答案。我同意所有回答的观点,在我看来,这些书是我们作为程序员所做工作的基础,并且所有这些新框架都建立在相同的旧支柱之上。

这是我的两分钱-不是我的,我是从圣阿奎那和他面前的亚里士多德那里学到的。

An abstraction is useless to someone who doesn't understand the particulars.

自冯·诺伊曼(von-neumann)以来,计算机的力学一直没有改变。同样,在成为冯·诺依曼模型之前,要成为一名优秀的程序员,您需要学习的细节也会一样。汇编,是计算机的语言。学习它,没有任何借口。

C是Windows和Unix的本地语言。了解它或找到新的交易。如果您是直接使用JAVA或C#的人之一,那么您可能是一名优秀的程序员,但如果您学习C-期间,您就会成为一名更好的程序员。

算法和数据结构是计算机程序的基础,请学习它们。

其他所有内容都是这些核心学科的抽象。如果正确使用抽象,那就太棒了。认真地说,我在所有项目中使用C#的比例高达75%。但是,如果您不花时间去了解它们的工作原理以及没有它们时的功能,它们会使您变得愚蠢。如果有更好的方法,并且会避免一些错误,那么您将花费无穷的时间来制作软件以适应众所周知的方孔。软件开发是必须掌握的技术,最终,工具很少更改。这就是为什么这些书如此重要的原因。

所有这些仅JAVA和C#的程序员,tsk,我敢打赌,他们中的大多数人甚至从未见过《星际迷航》的一集!


1

我听了一位导师的话:

“好的建议带有一个原因以便您知道何时不再是好的建议。” 因此,用书的术语来说,一本解释为什么在X上做X的书将在建议不再有效时通知您。像一些用X语言编写的速成课程一样,这本“总是做,就做”的书并不是很好。

我看到一个叫做“ 24小时学习unix”的书,那本书的厚度约为8厘米,我怀疑很多人甚至都可以在24小时内阅读每一页:)

请记住,今天流行的事物可能会在明天被嘲笑。以下所有内容曾经被视为主流(昨天盛行),但现在不是:

  • 单进单出
  • 匈牙利文符号
  • 瀑布法

有一些事情曾经完全是反胃病,但现在已经被接受:

  • 递归作为解决问题的工具(在BASIC初期是激进的)
  • 在运行时使用malloc / new分配内存
  • C ++ STL的使用
  • 垃圾收集实时系统的语言

知道为什么,您将知道何时将旧的假设替换为新的现实,建议也应该如此。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.