图书前言

技术领袖力荐 

Uncle Bob所著的这本书的内容暗合了这两年我脑海中一直在思考的几个问题。在 AI爆发式发展的当下,各种言论甚嚣尘上、纷纷扰扰。要在迷雾中看清方向,需要回顾历史、重读经典,同时要抓住事物的第一性原理。本书就像一本软件技术发展的编年史,从计算机和软件的诞生谈到软件开发方法和技术发展的一波波浪潮,直到AI时代的软件开发及未来展望。阅读本书,可以让我们更清晰地理解和把握软件技术发展的脉络,在喧嚣之中坚守内心的信念,明确前行的方向。 

——彭鑫

复旦大学计算与智能创新学院副院长、教授

中国计算机学会软件工程专委会副主任

《我们程序员:从代码诞生到AI兴起》不是冰冷的技术手册,而是一部记录程序员群体发展的技术纪实。Uncle Bob以深刻的洞察力,带我们穿越一行行代码,看清支撑数字世界运行的是怎样一群人。他们的智慧与执着、协作与分歧、传承与革新,共同推动了技术的前行。在键盘敲击声背后,是程序员与复杂系统长期搏斗的痕迹。这本书邀你一起回望这段技术史,也理解在AI时代,程序员为何依然不可替代。 

——陶建辉

涛思数据创始人&CEO

程序员会不会被AI替代?所有热爱编程、从事软件开发的同学可能都会关心这个问题。由茹炳晟、柳飞老师翻译的Uncle Bob的新作《我们程序员:从代码诞生到AI兴起》,看起来是在讲述软件编程半个多世纪的历史,实则在探讨程序员的核心价值是什么,程序员不可被替代的地方是什么。透过这些故事,你可能会同意作者的观点,又或者像我一样形成自己的看法:人们关于美、价值、幸福的定义永远不会交给AI去完成,而软件编程的过程和结果恰恰是关于美、价值和幸福的定义。 

——李智慧

同程旅行公司资深架构师

在历史的回响中,洞见 AI变革软件开发

众所周知,AI正以摧枯拉朽之势重塑软件开发格局,这场变革不是简单的技术迭代,而是对整个计算机软件生态的深度重构。此时,若想穿透AI变革软件开发的表象,抓住核心本质,回溯历史、从计算机、软件与编程发展的长河中探寻规律,便成为一条必由之路。这正是我对Uncle Bob最新出版的《我们程序员:从代码诞生到AI兴起》一书的兴趣所在。本书不只是罗列史实,而是深入挖掘技术迭代背后的动因,这些历史轨迹,本质是人类需求、技术创新与人类智慧相互作用的缩影,也是我们深入理解这场AI变革软件开发的底层脉络。

本书以宏大的历史视野,为读者勾勒出计算机与人工智能从萌芽到繁荣的完整脉络。从巴贝奇等先驱,到图灵、冯・诺伊曼奠定第一代计算机,再到编程语言从机器码演进至高级语言、面向对象、敏捷开发、互联网、神经网络……,这是一部人类认知如何驾驭计算复杂性的奋斗史。每一步都承载着技术突破与范式革新,都是人类思维在更高层次上对计算本质的“抽象”。

AI的“非编程”革命,是抽象层次的终极跃升。本书敏锐捕捉到这场变革的核心特质:大语言模型的构建本质,已迥异于传统意义上的“编程”。冯・诺伊曼架构下的传统编程,是程序员将人类意图精确分解为机器可执行的确定性指令,是迪杰斯特拉结构化编程严谨逻辑的体现。而AI则通过海量数据驱动下的神经网络,让机器“学习”并“涌现”出完成任务的能力。这标志着人机交互接口的根本性反转:开发者从指令的“编织者”,转变为目标的“定义者”、数据的“策展者”和模型行为的“引导者”。开发者的核心能力,从“如何写代码”转向“如何定义问题、评估方案与确保价值”。这比从汇编到高级语言、从过程式到面向对象的抽象跃迁更为激进,也打开了人类智慧与机器协同创新的大门。

对广大开发者而言,本书更是一场思维启蒙。在AI重塑一切的当下,本书为我们搭建了一座连接历史与未来的桥梁,每一次技术变革都不是孤立的“颠覆”,而是历史逻辑的延续。AI 时代的程序员,既要掌握新技术工具,更要理解技术演进的底层规律。回溯过往,编程语言从晦涩的机器码到易用的高级语言,是“让编程更贴近人类思维”的持续探索;而今,AI 辅助编程、自动生成代码,实则延续这一脉络,进一步缩短 “人机交互边界”。AI 变革软件开发的核心,是对计算范式、编程逻辑与开发者角色的重构。

理解了编程语言百年进化的规律,才能深刻理解软件如何设计、抽象、演进的历史逻辑,才能真正洞察AI所带来的范式转变之剧烈与深远,才能更好地推动“人、代码、机器”交互协同的迭代创新,才能在变革中把握机遇,激发人类在数字世界永不枯竭的创造力。我向所有关心AI时代软件未来走向的朋友们推荐《我们程序员:从代码诞生到AI兴起》一书,它不仅是历史的记录,更是通往未来的罗盘。

——李建忠

CSDN高级副总裁

全球机器学习技术大会主席

ISO-C++国际标准委员会委员

在时代浪潮中,写下属于程序员的注脚

在这个AI正重塑一切的时代,程序员这个角色,似乎也正在从幕后走向台前。从为业务写逻辑,到为人类设计智能,我们正在经历一场技术职业身份的重构。而《我们程序员:从代码诞生到AI兴起》正是在这个关键的转折点上,为所有代码工作者写下了一部兼具温度与深度的编年史。

作为极客邦科技有限公司的创始人,我很荣幸向中文读者推荐这本书。极客邦长期致力于推动技术知识的传播与工程文化的建设,无论是InfoQ这座技术社区的灯塔,还是“极客时间”这个为开发者提供持续成长的学习平台,以及“TGO鲲鹏会”这个链接全球科技领导者的组织,我们始终关注一个核心命题:技术如何塑造人,技术人又如何影响这个世界。

而这本书的作者,Robert C. Martin——程序员们亲切称他为Uncle Bob,正是将这个命题写成故事的人。他从阿达·洛芙莱斯的计算幻想谈起,跨越 COBOL、UNIX、开源、Web,到今天的 AI 编程,每一段历史不仅映射着计算技术的发展轨迹,更折射着程序员这个群体不断进化的价值观、工具观和世界观。

这本书不只是历史,也是一面镜子。我们在其中看到自己当年写下第一行代码的初心,也看到曾经热血沸腾投身某个技术浪潮的执念;我们看到软件工程从“工匠精神”到“自动化智能”的演变,也看到如今面对 AI 编程、Agent 生态的焦虑与希望并存。

在极客邦,我们今年把“AI 应用落地”设为公司的年度主题。原因很简单:AI已不再是技术先锋的玩具,而是每个程序员都必须理解并使用的新型“工具箱”。但在这一轮工具变革中,我们更需要的是一种对编程本质的重新理解:写代码的终极目标,不是追赶潮流,而是创造价值。

Uncle Bob写这本书,显然也不是为了“回顾历史”,而是提醒我们:“我们是谁”比“我们做了什么”更重要。我们是程序员,是系统的架构师,是工具的缔造者,更是价值的搬运工和文明的记录者。AI 可以写代码,但只有人类程序员知道代码为什么存在。

今天,中国的程序员群体正处在全球视野、AI范式与社会价值的三重夹角中。越是在这样的时代,我们越需要这样一本书,来帮我们厘清职业的过去、当下与未来。这是一本写给“技术人”的精神读本,也是每一个写过代码、热爱过系统、为世界构建规则的人值得阅读和传承的故事集。

感谢清华大学出版社引进这本作品,也很开心看到好友茹炳晟领衔翻译,让它的内容质量得以保证。它不是一本关于“怎么写好代码”的书,而是一本关于“为什么要当程序员”的书。在AI时代,它值得每一个思考未来的技术人认真读完。

——霍太稳

极客邦科技创始人 & CEO

凡人英雄史:一部程序员的五十年跋涉与时代镜像

我是从《敏捷软件开发:原则、模式与实践》开始认识Uncle Bob的,这是一本为我打开新世界的书,可你是否知道,这是Uncle Bob的公司业务因为 9·11 事件发展受阻之后利用闲暇时间完成的。《代码整洁之道》是后来很多程序员的编程必读书,可你是否知道,这本书写完之后,Uncle Bob的公司因为2008年金融危机就彻底倒闭了。

Uncle Bob是很多人心目中的代码英雄,但他也有凡人的一面。《我们程序员:从代码诞生到 AI兴起》是Uncle Bob写就的一本代码英雄的编年史。这本书前一半写了Uncle Bob自己心中的代码英雄:从巴贝奇、图灵、冯·诺伊曼,到肯·汤普森、丹尼斯·里奇、布莱恩·克尼汉。

如果从一部编年史的角度看,后面还有很多值得记录的人,但站在Uncle Bob的角度,这之后就是自己的故事了。

他从20世纪60年代开始接触编程,1969年开始了自己的第一份程序员工作,然后,就是他和计算机行业一起发展的故事了。相对于那些影响了计算发展历史的人,Uncle Bob在这本书里更像一个普通程序员,他有学到新知的兴奋,也有丢掉工作的落寞。从他的身上,我们依稀可看到自己的影子。

Uncle Bob其他的书更多的是传道授业,而《我们程序员:从代码诞生到 AI兴起》更像一部以编年史名义写就的个人传记。这本书让我们看到了热爱的力量,看到了计算机的变迁,看到了各个时代的机遇。Uncle Bob的职业生涯足够长,让我们看到一个人坚守在一个领域遇到的诸多变迁。这也是这本书对我来说最大的价值,给予我在程序员的道路上继续前行的力量。

如果说本书有什么遗憾,那就是这本书的写作稍微早了一点,大模型驱动的 AI 编程工具在这本书出版之后得到了极大的发展,这就让这本书关于未来的部分显得有些单薄。不过,反过来想,我们总是羡慕前行者有着各种机会,但实际上,新机会总是在涌现,现在的我们何尝不是站在AI时代的风口上。

——郑晔

开源项目 Moco的作者

从潦草笔记到通天塔:程序员穿越AI危机的生存智慧

第一次翻开这本书时,我惊讶地发现:那些塑造我们行业的方法论——敏捷开发、代码整洁之道——竟以如此“草根”的形式诞生。

Uncle Bob在书中坦言,当年写《代码整洁之道》时,自己也怀疑“凭什么由我定规则?”但正是“如果不是我,那还有谁呢?”的念头,最终催生了这本经典。更震撼的是,我第一次从亲历者视角看到“敏捷宣言”的诞生——它并非精心设计的理论,起初不过是想在五花八门的“轻量级”开发流程里梳理出共同点。本书揭开了改变软件开发史的思想,是如何从实践中淬炼出来的。

如今AI浪潮席卷,总有人说“程序员要失业”。但读完这部编年史,我反而定了心:过去五十年,软件行业从打孔卡走到云计算,穿越了大型机时代的落幕、互联网泡沫的破灭、开源革命的浪潮,甚至经济危机的战壕——每一次灾难都像淬火的铁,越锤打越迸出火花。正如Uncle Bob在公司倒闭后的低谷里,反而沉淀出影响千万人的原则。AI或许能生成代码,但它永远学不会程序员骨子里的能耐:把混沌的需求变成清晰的逻辑,在试错中迸发出创造的火花。

如果你也在深夜盯着屏幕问“这行还能干多久?”,本书就像一剂解药。与其焦虑自己被取代,不如学学前辈们的生存智慧:把时代砸来的新问题,当成催生敏捷宣言的契机——用代码直面矛盾,在混乱中提炼答案。毕竟你看,那些定义行业的经典,最初也不过是几张为解决眼前麻烦而写的潦草笔记。而整部程序员史,正是由无数个这样的“眼前麻烦”垒成的通天塔。

那些改变世界的灵感,或许就藏在你我刚修改好的bug里。而这座通天塔,正等着你我添砖加瓦。

——谢昌明

前喜马拉雅电商中台负责人

数字文明的创世纪与牧羊人

当你在清晨的薄雾中窥见屏幕像素的真相时,人类文明的某个隐秘维度正在被悄然揭示。这不是关于未来的寓言,而是一部献给数字创世者的史诗——那些在0与1的荒原上开垦文明绿洲的现代游吟诗人,正是本书所书写的“我们程序员”。

这部横跨两个世纪的技术史诗,以战争催生的机电火花为序章,在晶体管与光纤的矩阵中铺展开来。作者Uncle Bob以亲历者的饱含热诚的手掌,触摸着从ENIAC到ChatGPT的每一道年轮。当我们凝视书中图4-2的那条发黄的穿孔纸带时,看到的不仅是二进制代码的原始胎动,更是一个新兴文明物种的进化图谱。从霍珀的编译器之梦,到汤普森的UNIX圣殿,从迪杰斯特拉的结构化启示,到敏捷宣言的群体觉醒,程序员群体完成了从“机器祭司”到“数字先知”的身份嬗变。

在数字文明的三重门扉前,我们看到了惊人的历史韵律:冯·诺伊曼架构与神经网络竟共享着相似的拓扑结构,巴贝奇的差分机遗稿里闪烁着区块链的原始基因。当Uncle Bob带领我们重走这条布满电子荆棘的朝圣之路,每个转折处都暗藏着对当下的启示——人工智能的崛起不是程序的终结,恰是“人原生”编程的进化;量子计算的曙光不是硅基的黄昏,而是计算本质的再探索与再发现。

书中那些被岁月尘封的细节,在今天折射出惊人的现实意义:图灵测试的原始提案预言了人机协作的伦理困境,Lisp语言的“括号森林”里生长着函数式编程的翠绿幼苗。当我们惊觉ChatGPT的“思考”轨迹与早期编译器有着惊人的同构性,方才理解Uncle Bob将程序员称为“细节管理者”的深意——我们不仅是代码的书写者,更是数字世界底层逻辑的构建者,是维系现实与虚拟的卡巴拉祭司。

在这个被算法重构的星球上,程序员群体的存在本身已成为文明的新器官。从《终结者》的系统叛变到《机械姬》的机械女仆,好莱坞的叙事嬗变恰是程序员地位升维的镜像:当新时代的年轻人像追星一样找Uncle Bob索要签名,意味着编程已从技术工种升华为文化基因。正如Uncle Bob暗示的,现代程序员正在书写新的创世神话——在数字世界的像素沙盒里,在GitHub的协作星空中,在开源社区的分布式智慧里。

但本书的深刻之处,在于始终保持着技术乐观主义者的清醒。当Uncle Bob指出“对程序员的需求随着机器能力的提升而增长”时,他揭示的不仅是职业发展的悖论,更是人类认知边界的永恒命题。人工智能不是程序员的掘墓人,而是认知增强的外骨骼;量子计算不是古典算法的丧钟,而是高层次算力的新跃迁。正如编译器挣脱了汇编语言的桎梏,GPT类工具正在创造人机协作的新范式——这非但不是程序员的黄昏,恰是“自然语言编程”时代的黎明。

译罢掩卷,窗外的城市正被数据洪流冲刷重塑。那些在咖啡厅敲击键盘的身影,那些在深夜调试算法的开发者的瞳孔,那些在开源社区碰撞思想的灵魂,正在编织数字文明的新经纬。本书的价值,不仅在于记录了我们如何走到今天,更在于启发我们如何走向未来——当AI开始编写代码,程序员的真正使命才刚刚显现:从代码工匠进化为数字生态的架构师,从功能实现者蜕变为技术伦理的守门人,在数字比特的海洋中守护真善美的灯塔。

这或许就是数字文明给予“我们程序员”的终极命题:当机器学会思考,人类要如何为自己的未来“编程”?答案,或许就藏在这部代码史诗的字里行间,等待每个数字时代的创世者,也就是我们程序员,去续写新的篇章。

——茹炳晟

世上为什么要有程序员?

AI编程

最近编程领域最热门的话题肯定是“AI编程”了。我使用AI编程工具大概有两年。起初,由于公司资源有限,项目无法安排到开发排期,我只好自己动手,结果极其迅速地完成整个项目。后来编程工作就彻底离不开AI了。

以前见客户时,要么在PPT上画饼,要么基于现有系统配置数据演示,很难在一开始就用贴合客户需求的方式演示。然而现在完全变了,我用AI,在两天内从头搭建好一个搜索、转写视频的脚本。完备的流程,加上一整套成熟的用户界面,令客户备感满意。

这一切看起来像魔法,就像巴贝奇在维多利亚沙龙上展现差分机时,给人们带来的震撼一样,那时一定有人面对叮叮当当运行的机械巨兽惊呼:“机器能思考!”(巴贝奇的故事详细见本书第2章)。

兴趣

兴趣是引领我们前行的巨大动力。10 岁时,艾伦•图灵被《每个孩子都应该知道的自然奇观》(Natural Wonders Every Child Should Know)这本书所吸引,从此对科学有了新的认识。

在翻译过程中,我在B站发现了一位Up主,他喜欢在视频中分享机械计算机运行原理。原以为他是一名机械专业的大学生,后来发现他发布第一条原理视频时,还只是一名初中生,而大部分视频是在他读高中时发布的。在AI时代,很多专长会被无情地替代,大概只有好奇心和兴趣,才能指引我们。

Uncle Bob说,他在12岁时就立志成为程序员,起因就是妈妈送给他的一份生日礼物。他已经保存了60多年的这个玩具,现在看来很简单,就是用一些金属棒和机械装置搭建起来的装置,可以计数,还可执行加法运算等。那时候的他非常痴迷,完成了很多程序。他说:“那种拥有无限能力的纯粹喜悦感让我确定了自己的人生方向。我是一名程序员,而且我将永远是一名程序员。”(有关Uncle Bob是如何走上程序员道路的,详见第11章)。

希望这本书中某些故事,也能在某个时刻激起大家的兴趣。

细节

曾经给客户开发过一套Oracle考试模拟环境的软件。项目负责人是一位大学数学系教授,其中有项工作是要整理每个Oracle语句的状态转换数组。他带领几位数学系的研究生,在纸上画DFA,再提取状态值,最终形成数组。算下来处理一条语句需要几天时间,要完成整个Oracle语句集的构建需要几个月,还不能确保正确无误。我写了个程序,从bison的输出文本中自动提炼这些数据生成数组,整个过程不需要人工干预,准确率达100%,可快速测试正确性。写这个程序要处理很多细节,因为bison的输出文本并没有规范的语法,需要自己一点点依据字符个数和字符位置进行推演,有时差一个字符就跑不起来。

处理细节的重要性,在计算机发展的早期就已经体现出来。本书中讲到格蕾丝•霍珀时,她和同事们曾经要在布满数千个发热真空管和104°F水银罐的房间里操作 UNIVAC 计算机。这台计算机每次加法运算的结果都比实际值大3,因此必须设计电路在每次操作后自动减去3。对于操作指令,有时纯粹为了对齐,就必须引入一些特殊的跳过操作(霍珀如何应对那么多恼人的细节,详见本书第 4 章)。这些看似没道理的细节,都必须做对,才能有正确结果。

世上为什么要有程序员?

Uncle Bob对此的回答是:“因为程序员是细节掌控者”。

我认为,虽然有了AI编程后,许多产品经理也能开发程序,但在复杂场景下(如架构设计、错误调试等),有非常多的细节,仍然离不开真正懂程序运行原理和软件工程的人。

只有充满好奇,掌控足够多的细节,才能开拓新领域,达到足够高的成就。

翻译的几点说明

我很荣幸参与Uncle Bob这本新书的翻译工作。这本书回顾了编程发展史,讲述了许多重要的人物和事件,还包括了作者自身的很多经历。阅读本书,能让我们更好地理解编程的发展脉络,汲取先驱们的智慧与力量,在新的时代浪潮中找准自己的方向。

除了原脚注外,对于不易理解之处我添加了译者注,以帮助大家了解背景,大约有 3000 多字。原书脚注或参考文献有很多视频,但大都没有给链接,为方便读者,已将链接补充在电子脚注中。

——柳飞

对本书的赞誉

“我像Uncle Bob一样,职业生涯的大部分时间都在从事咨询、教学和参加计算机会议中度过。重要的是,本书中提及的许多人物我都遇到过,也曾和他们共进晚餐。所以这本书写的其实就是我职业生涯中的那些朋友,我可以告诉你,这些都是真实的故事。事实上,本书的文字表达非常精妙,研究得也很深入。”

——摘自Tom Gilb为本书撰写的“后记”1

“纵观各类相关书籍,除本书之外,我难以想象还有哪本书能如此全面、清晰地讲述计算机编程的早期发展历史。”

——Mark Seeman2

“这是一部引人入胜的计算机与编程历史书。精彩呈现众多伟大人物的生活片段,也生动描绘了Uncle Bob作为程序员的职业生涯历程。”

——Jon Kern,《敏捷宣言》的合著者3

“在本书中,Bob成功地将多位程序大师的工作经历编织成一个个引人入胜的故事,为我们提供了丰富的历史背景、人性化的事迹以及行业开创者们令人耳目一新的灵感之光,披露了诸多细节。身为这段波澜壮阔的历史的亲历者,Bob巧妙地将自己新颖的观察和见解融入其中。这一次,我们不仅完整欣赏Bob的故事,还了解了他对未来的思考。这是一本饶有趣味的书,读来如春风拂面,轻松惬意。”

——Jeff Langr4

1.Tom Gilb,软件工程方法学先驱,软件度量领域权威,“进化项目管理(又称Evo)”方法的提出者。他首次系统阐述迭代式开发理念,被视作敏捷方法的先驱。国际系统工程协会(INCOSE)终身成就奖得主。——译者注

2.Mark Seemann,软件架构师、技术作家,合著有多本技术书籍。精通函数式编程(尤其F#)、测试驱动开发(TDD)和领域驱动设计(DDD)。其博客ploeh blog是软件设计领域的知名技术资源。——译者注

3.Jon Kern,实时系统专家,敏捷联盟创始成员。自适应软件开发(Adaptive Software Development)方法的共同创立者。——译者注

4.Jeff Langr,软件工程顾问。专注于测试驱动开发(TDD)实践,维护着开源测试框架Hamcrest。——译者注

谨将本书献给蒂莫西 ·迈克尔 ·康拉德 (Timothy Michael Conrad)

序   言

简单敲入五个字符“vim .”,就能启动我最喜欢的编辑器。这可不是普通的编辑器,而是NeoVim。如今的NeoVim具备键绑定、语言服务器协议(LSP)、语法高亮、内置错误诊断等多种功能。经过全面定制后,NeoVim仅需数毫秒即可启动,实现近乎即时的文件编辑。即使项目有数千个文件,LSP也能迅速反馈项目的状态,将错误信息即时加载到快速修复菜单中,以便快速定位。只需要几个按键,我就能构建、启动、运行或测试项目。我的计算机甚至能通过AI将自然语言直接转换为代码!更神奇的是,这个AI还能在我编码时实时协作,瞬间生成大量(虽然质量存疑的)代码。这一切听起来令人惊叹。NeoVim的体验堪称美妙流畅、疾如闪电。然而,NeoVim却被某些开发者视为古董。“老顽固!”1他们用这样的称呼嘲讽使用NeoVim并花时间配置的人。毕竟,像IntelliJ那样全功能的集成环境唾手可得,甚至它所支持的功能之丰富已经远超我这个NeoVim用户的想象边界!

我之所以讲述这些,是因为我们正身处技术奇迹之中而不自知。遭此非议,不是因为我坚守“过时”的工具,也不是因为开发者间的理念之争——这些早已司空见惯。真正震撼的是:文本编辑这项人类智慧的结晶,当前在我们眼中竟如此稀松平常。自动补全、语法高亮、动态文档,这些曾经是具有石破天惊效果的功能,如今却成了开发者的空气与水。回溯历史,人类用了30年才从机器码跃升至高级编程语言,又等待半个世纪迎来语法高亮,直到20世纪70年代后期才出现跨语言的智能支持。编辑器的进化史,本就是一部浓缩的人类计算文明史。

比起使用古董编辑器,我更痴迷于聆听往昔的故事。那些“真正的程序员”能根据磁鼓存储器的旋转节奏来优化代码,以达到最佳的读取速度。多希望能亲眼见证大师们在打孔卡片上施展魔法!或许这只是一种浪漫的怀旧,但那个时代的每个突破都重塑了世界。在本书中,我有机会与计算历史中那些缔造过重大飞跃的创造者们并肩走过那段时光。我看到查尔斯•巴贝奇(Charles Babbage)用差分机震撼了维多利亚时代的沙龙,机械巨兽发出的叮叮当当的运转声,所产生的东西在当时看来一定是魔法。那种感受恰似今天我们初见大语言模型或Copilot自动生成代码时的震撼。我敢打赌,在那个时候你一定会在晚宴上听到客人惊呼:“机器真的能思考?”我感受到那时的团队昼夜不停工作的压力,以及在二战关键计算中对更强计算能力的迫切需求,这些计算使得原子弹成为可能。他们没有Herman Miller人体工程办公椅,也没有时尚的站立式办公桌;见鬼,他们甚至都没有显示器或键盘!然而,他们取得了不可思议的成果,改变了人类发展的进程。本书是这段计算历史表述中最引人入胜的讲述之一。

如果一个程序员没听说过Uncle Bob的名号,我会非常惊讶。他在我们行业中绝对是多产的。多年来,我只是通过Twitter以及他在整洁代码和敏捷开发方面的重要贡献才知道Uncle Bob。在我心中,他一直是一种抽象的存在2,直到某天在Twitter上我与他互动后我的心态才发生了变化。通过电子邮件、电话,甚至播客的交流,我看到一个远比教科书更立体的罗伯特•C.马丁:他务实,在需要时愿意做出让步。在播客节目中,最一致的评论是“他温文尔雅,笑容满面!”这反映了他豁达的性格和丰富充实的生活经历。他是一个真正的软件工程师,也是我们学习的榜样。

我个人已经厌倦了无数关于空格键、编辑器以及面向对象编程与函数式编程的争论,这些争论在X上激烈地展开着。我感兴趣的是,到底是谁创造了这些引发争论的技术。本书连接起过去的岁月和未来的希望,将更有意义的东西呈现给我们,而Uncle Bob就是讲述这个故事的完美人选。

——ThePrimeagen3

1  原文是“ Luddite!”。 Luddite,即卢德主义者,是 19世纪英国的一个激进主义团体,反对工业革命,主张手工劳动和传统手工艺。——译者注

2  原文是“Avatar of AbstractBuilderFactory”。这个表述是对Uncle Bob的幽默化隐喻,结合了软件工程中的两个经典设计模式:Abstract Factory(抽象工厂模式)和Builder(建造者模式)。前者是创建相关对象家族的接口,隐藏具体实现。后者是分步骤构建复杂对象的模式。将两者合成为“AbstractBuilderFactory”这个虚构概念,其隐喻意义在于:强调Uncle Bob作为软件架构大师的形象,暗示其著作中强调抽象设计和模式应用的特点。——译者注

3  ThePrimeagen是YouTube频道号,主持人Michael Paulson是科技界颇具影响力的人物,以快速使用vim编辑器、编程直播、技术视频等内容而在Twitch和YouTube上闻名。——译者注

自   序

我即将为你讲述这一切是如何开始的。这是一个曲折的故事,讲述了那些非凡人物的生活与挑战,他们所处的非凡时代,以及他们所掌握的非凡机器。

但在我们深入探索这些曲折的历程之前,或许先来一个小小的预览是合适的——只是为了激发你的兴趣。

需要可能是发明之母,但没有什么比战争更能激发需求。我们这个行业的推动力正是由战争的剧变——尤其是第二次世界大战——所创造的。

在20世纪40年代,战争技术已经超越了我们的计算能力。仅靠人类操作的台式计算器根本无法满足来自战争各领域的计算需求。

问题在于,为了近似计算从火炮发射的炮弹到目标的路径,需要进行大量的加减乘除运算。这类问题并不能通过d=rt或s=½at2这样的简单公式来解决。这些问题要求将时间和距离分解成成千上万个小段,并逐段模拟和近似弹道。这种模拟需要大量计算。

在过去几个世纪里,所有这些计算都是由成群的人用笔和纸完成的。直到20世纪,他们才得到了加法机来协助这项任务。完成这些计算以及组织执行计算的团队是一项艰巨的任务。1计算本身可能需要这些团队花费数周甚至数月的时间。

在19世纪,人们曾梦想过得到能够完成这些壮举的机器。甚至创造过一些功能比较简单的原型机。但它们只是玩具和奇观,是精英们在晚宴上展示的花哨装置。很少有人认为它们是值得使用的工具;考虑到它们不菲的成本使一切变得更遥远。

但第二次世界大战改变了这一切。需求迫切,成本变得无关紧要。于是,那些早期的梦想变成了现实,庞大的计算机器被建造出来。

那些编写代码和操作机器的人是计算领域的先驱。起初,他们被迫在最原始的条件下工作。编程指令实际上是通过在长长的纸带上逐一打孔来完成的,机器会读取并执行这些纸带。这种编程方式极其烦琐,且完全不容错。此外,这种程序的执行可能需要数周时间,其间需要详细监控和持续干预。例如,执行程序中的循环时,需要通过手动重新定位纸带以进行每次迭代,并手动检查机器状态以确定循环是否应终止。

随着时间的推移,机电机器被电子真空管机器所取代,后者将数据存储在通过长长的水银管传播的声波中。打孔卡片最终被存储程序取代。这些新技术由早期的先驱们推动,并促进了进一步的创新。

20世纪50年代初的第一个编译器不过是带有特殊关键字的汇编器,用于加载和调用预先编写的子程序——有时来自纸带或磁带。后来的编译器尝试了表达式和数据类型,但仍然原始且缓慢。到了20世纪50年代末,约翰·巴克斯(John Backus)的FORTRAN和格蕾丝·霍珀(Grace Hopper)的COBOL引入一种全新的思维方式。程序员之前手工编写的二进制代码从此可由能够读取和解析抽象文本的计算机程序生成。

在20世纪60年代初,迪杰斯特拉(Dijkstra)的ALGOL提升了抽象层次。几年后,达尔(Dahl)和尼加德(Nygaard)的SIMULA 67再次将抽象层次提升到新高度。

结构化编程和面向对象编程就是从这些起点中诞生的。

同时,约翰·凯梅尼(John Kemeny)和他的团队在1964年通过创建BASIC和分时系统将计算带给了普通人。BASIC是一种几乎任何人都能理解和使用的语言。分时系统允许许多人方便地同时使用一台昂贵的计算机。

此后,肯·汤普森(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)在60年代末和70年代初,通过创建C语言和UNIX,开辟了软件开发的世界。从那以后,软件开发领域开始了飞速发展。

20世纪60年代的大型机革命之后是70年代的小型机革命和80年代的微型计算机革命。个人电脑在80年代席卷了整个行业,随后迅速迎来了面向对象革命、互联网革命和敏捷革命。软件开始主导一切。

9·11事件和互联网泡沫破裂使我们停滞了几年,但随后迎来了Ruby/Rails革命和移动革命。然后,互联网变得无处不在。社交网络蓬勃发展,然后衰落,而人工智能则崛起,雷霆万钧般涌来。

这让我们来到了现在,思考未来。所有这些,以及更多,都将在本书的页面上进行讨论。所以,如果你准备好了,那就系好安全带——因为这将是一次穿梭于时空的绮丽又狂野的旅程。 

1 要亲眼目睹这样的任务是如何进行的,推荐参加2024年圆周率日庆祝活动。在一周内,一个由数百人组成的非常协调的团队手工计算了100多位数字。“一个世纪以来最大的手工计算![圆周率日2024]”由Stand-up Maths于2024年3月13日发布在YouTube上。

故事时间线

本书故事所描述的人物和事件都展示在这条时间线上。当你阅读故事中的相关事件时,可从这里定位,了解它们发生的背景。例如,你可能会发现一件有趣的事,如FORTRAN1和Sputnik2在时间上是巧合的,两者在无意中邂逅;或者肯·汤普森(Ken Thompson)在迪杰斯特拉(Dijkstra)提出GOTO语句有害之前就加入了贝尔实验室(Bell Labs)。 

1 世界上第一门高级编程语言,IBM首次发布于1957年。详见书中章节。——译者注

2 世界上第一颗人造卫星,于1957年10月4日成功发射。详见书中章节。——译者注

前   言

在开始之前,我想先介绍一些关于本书及作者的信息,以便你更好地理解接下来的内容。

(1) 在撰写本书时,我做程序员已经60年了。虽然从12岁到18岁那段时间或许不应完全计入其中,但不管怎样,从1964年至今,我几乎全程参与了“计算机时代”的发展,亲身经历了这个领域中许多重要的(甚至是奠基性的)事件。因此,你即将阅读的这本书,实际上出自一位计算机领域早期探索者之手——如今这个群体的人越来越少了。尽管我们算不上是最早的开拓者,但确实从先行者手中接过了接力棒,继续前行。

(2) 本书所述内容的时间跨度长达两个世纪。许多人会发现,故事中提到的一些名字和思想有些陌生——仿佛被时间所遗忘。为此,在本书的结尾,我特意准备了术语表和其他重要人物名录,以帮助你更好地理解相关内容。

(3) 术语表中包含了本书中提到的大多数硬件设备的描述。如果你在阅读过程中遇到不熟悉的计算机或设备名称,可以查阅术语表,或许能找到相关信息。

(4) 其他重要人物名录列出了本书提及的其他重要人物。这份名单很长,但还远远不够。它仅仅列举了一些对计算机编程行业产生直接或间接影响的人物。书中提到的一些人物已经消逝在笼罩历史长河的时间迷雾中,在互联网搜索引擎里也难觅其踪影。当你浏览这些名字时,会惊讶于你在其中发现的人物。再仔细看看,你会意识到这份名单只是浮光掠影。再进一步看看这些人的离世时间,你会发现他们中的大多数都是最近才离开我们的。

电子脚注 

本书提供脚注的电子版本。读者可扫描封底二维码,下载“电子脚注”文件。与纸质书中的脚注相比,“电子脚注”文件中增加了大量的参考网址。读者可直接单击网址浏览相关内容。

致 谢

再次感谢培生(Pearson)团队为本书出版所付出的辛勤努力,特别是Julie Phifer、Harry Misthos、Julie Nahil、Menka Mehta和Sandra Schroeder。同时,感谢制作团队对内容的深度淬炼与完善,包括Maureen Forys、Audrey Doyle、Chris Cleveland等成员。与他们合作总是令人愉快。

感谢Andy Koenig和Brian Kernighan帮助我建立了联系渠道。

特别感谢Bill和John Ritchie,他们为我提供了许多关于他们兄弟“Dear old DMR”的宝贵资料。

感谢Michael Paulson(即ThePrimeagen)撰写了精彩的序言。

感谢Tom Gilb的盛情款待,感谢他的真知灼见,以及他写的后记,那是我读过的最有趣的后记之一。

感谢Grady Booch、Martin Fowler、Tim Ottinger、Jeff Langr、Tracy Brown、John Kern、Mark Seeman和Heather Kanser在书稿还非常粗糙的时候审阅了书稿,他们的帮助让书稿变得好多了。

一如既往,我要感谢我美丽可爱的妻子——我一生的挚爱——以及我四个出色的孩子和十个同样出色的孙子孙女。他们是我生活的全部。写软件只是为了好玩。

最后,我必须感谢上苍,我的生活如此完美——我生活在天堂。 

1 DMR是指Dennis MacAlistair Ritchie,美国计算机科学家,在黑客圈子中通常被称为DMR。他是C语言的创造者,对计算机科学领域做出了重大贡献。详见第10章。——译者注

关 于 作 者

罗伯特·C. 马丁(在业内被尊称为Uncle Bob,即Bob大叔)自1970年起就开始从事程序员工作。他是Uncle Bob咨询公司的创始人,并与他的儿子Micah Martin共同创立了Clean Coders公司。马丁在各种行业期刊上发表了数十篇文章,并且经常在国际会议和行业展览上发表演讲。他撰写和编辑了多部书籍,包括《使用Booch方法设计面向对象的C++应用程序》(Designing Object-Oriented C++ Applications Using the Booch Method)、《程序设计模式语言3》(Pattern Languages of Program Design 3)、《更多C++精华》(More C++ Gems)、《极限编程实践》(Extreme Programming in Practice)、《敏捷软件开发:原则、模式和实践》(Agile Software Development: Principles, Patterns, and Practices)、《UML:Java程序员指南》(UML for Java Programmers)、《代码整洁之道》(Clean Code)、《程序员的职业素养》(The Clean Coder)及《函数式设计:原则、模式和实践》(Functional Design: Principles, Patterns, and Practices)。作为软件开发行业的领导人物,马丁曾担任《C++报告》(C++ Report)的总编辑三年,并担任敏捷联盟(Agile Alliance)的首任主席。

译 者 简 介

茹炳晟,腾讯Tech Lead,腾讯研究院特约研究员,腾讯集团技术委员会委员,腾讯云架构师技术同盟入会主席,中国计算机学会(CCF)TF研发效能SIG主席,“软件研发效能度量规范”团体标准核心编写专家,中国商业联合会互联网应用技术委员会智库专家,中国通信标准化协会TC608云计算标准和开源推进委员会云上软件工程工作组副组长,国内外各大技术峰会的联席主席,出品人和Keynote演讲嘉宾,公众号“茹炳晟聊软件研发”主理人。著有技术畅销书《测试工程师全栈技术进阶与实践》《现代软件测试技术之美》《软件研发效能权威指南》《现代软件测试技术权威指南》《软件研发效能提升之美》《软件研发效能提升实践》《多模态大模型技术原理与实战》《高质效交付:软件集成、测试与发布精进之道》等,译有《软件设计的哲学(第2版)》《整洁架构之道》《现代软件工程》和《DevOps实践指南(第2版)》《精益DevOps》《持续架构实践:敏捷和DevOps时代下的软件架构》等。 

柳飞,自在哪吒智能科技(nezha-ai.cn)创始人、首席服务官,程序员。《Java 性能优化权威指南》《Java 性能优化指南》和《整洁架构之道》等书籍的译者之一,疏于打理的公众号——“进化中的程序员”的主理人。马拉松业余凑热闹选手。