比尔·盖茨曾说:“读完这套书的人,可以直接给我递简历!”
有人坦言:“我可能一辈子都看不懂它。”
也有人戏称:“只要这书砸下去,Bug 都不敢响一声。”
有人把它供在案头,当作珍宝;有人把它压在枕下,伴梦入眠。
别被这套“神书”的名声吓退,它背后藏着一位传奇大佬的故事——
写书写了近 60 年,拿过图灵奖,还亲手设计了最牛的排版系统 TeX。
这部被誉为“算法圣经”的巨著——《计算机程序设计艺术》,终于迎来了卷 4B 中文版!
今天,就让我们一探这位用半个世纪书写算法传奇的大佬,到底有多牛!
#1少年的字典大作战
在上世纪中叶,计算机编程刚刚兴起的年代,一家糖果公司举办了一场比赛,题目是:用“Ziegler’s Giant Bar”这几个字母能尽量多地拼出英文单词。
“我从小就有点强迫症,特别喜欢那种数字化的、离散型的问题。而且我还特别爱钻研海量的信息。”高德纳回忆说。
于是,他跑回家里地下室,翻起那本厚达 2000 页的《Funk & Wagnalls 未删节词典》,一页页地找。为了完成比赛,他还骗过爸妈请了病假,整整在家待了两周,全心投入地解题。
他用卡片整理词汇,把可能开头的字母组合,比如“Aa”、“Ab”、“Ba”等做成标签,然后一列列浏览词典,找到能用糖果名字字母拼出的词。他很快发现,有些页完全可以跳过,比如所有以 C 开头的词,或以 “Bu” 开头的词,根本凑不出。
比赛主办方原本估计会有约 2000 个有效词,但高德纳竟找出了 4700 多个!最后他不仅上了电视,还为全班赢得了巧克力奖品。
#2卷4B中文版终上线
高德纳被誉为“现代计算机科学的鼻祖”,是计算机界的传奇人物。他 36 岁便荣获图灵奖,成为当时最年轻的获奖者。
他将对离散数学的热爱与对信息结构的执着,倾注于一生的代表作——《计算机程序设计艺术》。这套书自他 1962 年攻读研究生时动笔,至今仍在持续创作中。
尽管尚未完结,《计算机程序设计艺术》已被 Scientific American 选入“塑造科学世纪的 100 本书”之一,并与爱因斯坦的《相对论》、狄拉克的《量子力学》、费曼的《量子电动力学》等物理经典齐名。
这部巨著的第一卷 1968 年出版,到现在已经印刷了 42 次。第二卷是 1969 年,第三卷是 1973 年出版,那时他已是斯坦福的计算机教授了,但他担心教学工作会让他写不完这套书。于是 1990 年他请了长假,专心写作。1993 年他干脆退休,打算把余生都用来完成这套计划中的七卷书。
2025 年,87 岁的高德纳为这部程序员圣经再添新作,《计算机程序设计艺术卷 4B 》中文版,终于出版了!英文版也同步上市!
#3一种理想的教学方式
对高德纳来说,这不仅是一部巨著,更像是一份宣言。书中展现了他理想中的数学思维,也体现了他少年时代对知识的渴望——希望能被那样启发和教导。
当时,大多数教材只会告诉学生“这是化学公式”“这是物理定律”,很少有人讲清这些结论是怎么一步步得出的。高德纳不想写这种书。他希望笔下的技术知识带着过程和情境,有“戏剧性”。他常写:“你看,这样不行,那该怎么办?”他关心的不只是答案,更在乎问题是怎么被解开的。
他说自己不是开创者,更像技术记者。他想写那种读者愿意一路跟随、愿意一起思考的书。
他还有个程序员界流传多年的梗:只要有人在书里发现错误,就能收到他亲手签发的支票一张。这张支票虽然只有几美元,却被全球程序员视作荣誉勋章,很多人宁愿装裱收藏也不去兑现。
#4算法分析概念的诞生
那么,《计算机程序设计艺术》这套书的真正核心是什么呢?
高德纳曾说:“写到第二年,我才意识到,我的真正突破,是用量化的方法分析程序优劣。我不想只说这个程序更好,我要说它比另一个快 13.8%,并说明为什么。”
当时,不同作者各写各的算法,几乎没人横向比较,更没有统一评价标准。高德纳则尝试以“中立记者”的视角,把不同算法放在一个框架下比较。他觉得这太有意思了:“到底什么算法更好?”这也自然引出了他后来的方向——算法分析。
1967 年,一次 SIAM 会议上,有人问他:你是做什么的?当时计算机科学只有数值分析、人工智能和编程语言三个分支,他突然意识到,自己做的事似乎都不属于其中任何一类。
于是,他给自己研究的方向起了个新名字——算法分析。这命名很高德纳式“只要是我感兴趣的,都叫算法分析。”不过后来他也说,这个定义可能不太严谨。
他认为,算法分析就是研究“一个算法到底有多好”。它既包括找出所有可能的算法解法,也包括深入分析某个具体算法的效率。
他甚至一度想把书名从《计算机程序设计艺术》改为《算法分析》。但出版社坚决否决了,说这个名字肯定卖不出去。
现在回头看,高德纳承认对方判断得对。但他也欣慰地看到,几十年后“算法分析”已成为业界共识,还有五六本书干脆直接用了这个名字。对他来说,那也是一种迟来的认可。**
#5一次设计,永久复现
1980 年,高德纳 和字体设计师 Herman Zapf 一起在斯坦福的办公室中,那时正值他发布排版程序 TeX 的几年之后。
1970 年代,他在给第二卷修订版做审稿时,出版社寄来了清样。但他一看就犯难了,页面上数字、符号和文字的排版怎么看都别扭,完全无法忍。为此他专门飞了一趟洛杉矶,去考察一台能做出高质量杂志排版效果的数字印刷机,想找点排版美学的灵感。结果一问价格,贵得那叫一个离谱。
虽然这趟考察没解决排版问题,却点燃了他一个大胆的想法——自己动手,写个排版系统。
对高德纳来说,编程从来不只是技术活。比如在设计 TeX 时,他提出要找出“最令人愉悦的曲线”——程序要连接一些点,而这条路径,得能还原优秀书法家的手感。
像“S”这个字母,曲率从正到负,要平滑过渡。每个字母背后,都有一套设计逻辑。他的目标不是还原线条,而是还原“那只看不见的手”。
为此,他请教了许多字体设计师,试图把他们脑中的视觉感受转化成数学公式——字母在哪变弯、厚度怎么变、角度、曲线、衬线,全都能精确控制。
他并不是要替代设计师,而是想为后人保留当时的美学逻辑。一旦设计完成,就能永久复现——这就是 TeX。
起初,TeX 只是他和秘书 Phyllis 使用的排版工具。但当时印刷业已走下坡路,1970 年代出版的数学书排版尤其惨不忍睹。高德纳意识到,TeX,可以让书重新变得美观。
1978 年 4 月,TeX 的试用版调试成功。5 月,10 个用户;6 月,100 个;7 月,1,000 个。用户不断提出建议。五年后,TeX 变成了今天我们熟悉的样子。后来随着欧洲用户加入,他又开发了多语言版本。
#6你永远骗不过代码
如今,他仍然坚持每周写 5 个新程序。他说,诗人要写诗,自己就必须写程序。
他有一个判断自己是否理解某事的标准:是否能把这件事讲清楚给一台电脑听。“人可以点头表示理解,但他并不确定对方是否真正明白,而电脑不会点头,它只会照人说的去执行。如果人表达不清楚,程序就会直接报错。”
在生活里,人们有时可以蒙混过关,但在写程序这件事上,电脑根本不会给你面子。
#7未知的事,更值得去做
高德纳的生活里从不只有计算机。他甚至围绕一台两层楼高的管风琴设计了自己的房子。他创作音乐《末世幻想曲 Fantasia Apocalyptica》,也写宗教随笔《一个计算机科学家不常谈论的事》——那些“无法证明”的事物。数学世界让他知道什么是确定的,但不可知的东西却让他保持谦卑。
“生活不会只追求能完成的事情,那样太单调。正是那些神秘和无法完成的东西,让我的人生不落俗套。”
#8一直写到不能写为止
那《计算机程序设计艺术》会不会最终完成?
高德纳也给出了自己的说法:“计算机科学终将继续发展下去,也许未来大家都去研究量子计算了,而我刚好可以把非量子时代的程序故事写到句号。”
但他也坦言,不会给自己设定 deadline,他想写自己觉得重要、值得讲的内容,一直到不能写为止。
他还说自己这辈子的梦想,除了《计算机程序设计艺术》这套书,其余的全都都实现了。他将会继续写下去,继续讲那些值得留下的故事。
《计算机程序设计艺术》全系列图书
《计算机程序设计艺术 卷4B:组合算法(二)》
高德纳 | 著
杨熊鑫,胡光,李锡涵,柳飞 | 译
《计算机程序设计艺术》系列被公认为计算机科学领域的权威之作,深入阐述了程序设计理论,对计算机领域的发展有着极为深远的影响。本书是该系列的卷 4B,以 7.2.2 节开篇,讨论回溯编程,内容包括舞蹈链、精确覆盖问题、算法谜题、可满足性问题等。
《计算机程序设计艺术 卷1:基本算法(第3版)》
高德纳|著
李伯民,范明,蒋爱军|译
卷 1 讲解基本算法,其中包含了其他各卷都需用到的基本内容。本卷从基本概念开始,然后讲述信息结构,并辅以大量的习题及答案。《计算机程序设计艺术 卷2:半数值算法(第3版)》
高德纳|著
巫斌,范明|译
卷 2 全面讲解了半数值算法,分“随机数”和“算术”两章。书中总结了主要算法范例及这些算法的基本理论,广泛剖析了计算机程序设计与数值分析间的相互联系。《计算机程序设计艺术 卷3:排序与查找(第2版)》
高德纳|著
贾洪峰|译
卷 3 扩展了卷1 中信息结构的内容,主要讲排序和查找。书中对排序和查找算法进行了详细的介绍并对各种算法的效率做了大量的分析。
《计算机程序设计艺术 卷4A:组合算法(一)》
高德纳|著
李伯民 贾洪峰|译
4A卷(一)主要介绍了组合算法,内容涉及布尔函数、按位操作技巧、元组和排列、组合和分区以及所有的树等。《计算机程序设计艺术:MMIX增补》
高德纳 马丁·鲁克特|著
江志强 黄志斌|译
本书由两本小册子合并而成,第一部分描述了 MMIX 的内存、寄存器、指令、加载与存储等基础概念,并介绍了关于 MMIX 的一些基本编程技术;第二部分使用该语言重新实现了 TAOCP 前 3 卷中的所有算法。