他们写下了你每一次平安的理由
有些人的名字,你大概永远不会听到。
不是因为他们不重要。恰恰是因为他们所做的事太要紧、太基础,以至于融入了日常的纹理——就像你不会去想脚下桥墩里的钢筋是谁轧出来的。
你划手机,一条消息飞到了大洋彼岸。你踩油门,喷油嘴在几毫秒内精确地喷出了一丁点燃油。你坐在三万英尺高空,飞机穿过一片颠簸的气流,你甚至没有抬头看一眼安全带的指示灯。
这些事之所以”没什么好担心的”,是因为几十年前有人把一生押在了上面。
丹尼斯·里奇
2011 年 10 月 12 日,丹尼斯·里奇(Dennis MacAlistair Ritchie)在新泽西伯克利高地的家中去世,享年 70 岁。死亡的具体原因至今没有公开。他的家人低调地处理了一切,就像他活着时一样。
一个星期前,史蒂夫·乔布斯去世了。全世界都在悼念。
里奇的死讯几乎没有引起注意。科技博客上有几篇文章,技术社区里有人叹息,然后就没有了。一位程序员在 Reddit 上写了一句话,被反复引用:”乔布斯让你的生活有了样式,里奇让你的生活有了可能。”[^1]
这不是修辞。里奇发明了 C 语言,与肯·汤普森(Ken Thompson)共同创造了 Unix 操作系统。这两样东西的关系,大致相当于汉字与纸:一个提供了表达的方式,一个提供了传播的载体。
你的手机——无论 iOS 还是 Android——底层都跑在某种 Unix 的后代上。iOS 的 Darwin 内核源自 BSD,Android 的 Linux 系出 Unix 一脉。你飞机上的娱乐系统、汽车的中控、医院的监护仪、国际空间站的命令与控制系统[^2]——这些系统里流淌的,是 C 语言写成的代码,跑在 Unix 式的操作系统上。
C 语言是里奇最复杂的遗产。它把内存的直接操控权交给了程序员——这意味着极高的效率,也意味着一个越界写入就能毁掉一切。后来几十年的安全漏洞,缓冲区溢出占了大头,根源几乎都可以追溯到 C 语言对内存的”信任”。
但这是 1970 年代。内存以 KB 计,CPU 以 MHz 计,每一周期都不能浪费。里奇选择了效率,也选择了信任写代码的人。这个选择塑造了整个软件行业的面貌,辉煌与脆弱并存,直到今天。
里奇在贝尔实验室工作了四十年,一辈子住在同一条街上。他不开会,不演讲,不上封面。同事回忆他时说得最多的是”安静”和”精确”[^3]。
他不需要被记住。他写的东西替他活着。
玛格丽特·汉密尔顿
1969 年 7 月 20 日,阿波罗 11 号登月舱”鹰”正在下降。高度 3 万英尺时,导航计算机开始报警——1201 号和 1202 号执行溢出错误交替出现。登月雷达向 CPU 发送了远超预期的中断请求,内存快要耗尽。
休斯顿地面控制中心沉默了几秒。那几秒很长。
巴兹·奥尔德林后来的描述是:”计算机看起来快不行了。”[^4]
此时,玛格丽特·汉密尔顿(Margaret Elaine Hamilton)三年前在 MIT 仪器实验室写下的优先级调度逻辑开始起作用。她设计的系统没有选择”安全关机”——如果那样做,登月舱将失去导航能力。系统做的是:将雷达中断标记为低优先级,把 CPU 时间留给登月控制程序。
尼尔·阿姆斯特朗手动接管了部分控制,但计算机始终在运行。登月成功了。
汉密尔顿是阿波罗飞行软件团队的负责人。她入职时 24 岁,最初被分配写卫星轨道计算程序。后来项目越来越大,团队从她一个人扩展到上百人,她一直是那个写核心框架的人。
她的贡献不仅仅是那几行调度代码。她为整个阿波罗飞行软件确立了一套工程原则:每个软件组件必须有完整的错误检测与恢复机制;故障不能跨组件传播;系统在降级模式下仍能执行关键任务[^5]。后来人们管这套方法叫”容错计算”(fault-tolerant computing)。
她也是最早使用”软件工程”(Software Engineering)一词的人之一。1968 年,她在一份内部文件中用了这个词,当时不少同事觉得荒唐——软件也算工程?[^6] 几十年后,这个词成了整个行业的正式名称。
2016 年,奥巴马授予汉密尔顿总统自由勋章。颁奖典礼上,很多人是第一次听说这个名字。
而她确立的那些原则——故障隔离、降级运行、错误不能传播——今天仍然写在每一本安全关键系统的工程手册里。商用飞机的飞控软件、心脏起搏器的固件、核电站的安全停堆系统,底层逻辑都可以追溯到她的工作。
丹·道奇与戈登·贝尔
你坐进一辆新车,按下启动按钮。发动机还没点火,十几台计算机已经完成了自检:喷油控制、ABS 防抱死、车身稳定、气囊控制、胎压监测。这些计算机必须在毫秒级内完成计算并给出响应。你绝不希望刹车系统的计算机在关键时刻”正在加载”。
这些计算机运行的是实时操作系统(RTOS)。在汽车领域,市场份额最大的一个是 QNX。
QNX 的创始人是丹·道奇(Dan Dodge)和戈登·贝尔(Gordon Bell)——不是那位著名的 DEC 计算机架构师 Gordon Bell,而是加拿大滑铁卢大学的另一个戈登·贝尔。为了避免混淆,行业里提到他时经常要加一句”加拿大那个”。
1980 年,两人在滑铁卢大学攻读研究生,觉得当时的操作系统在可靠性上有根本性的缺陷。他们设计了一个微内核架构的实时系统:内核极小(最初不到 10KB),文件系统、设备驱动、网络协议栈全部作为独立进程运行在用户空间。任何一个组件崩溃,内核不受影响,系统可以重启该组件而无需整机重启[^7]。
这在 1980 年代是少数派路线。主流操作系统(Unix、VMS、后来的 Windows NT)都在把更多功能放进内核以换取性能。道奇和贝尔做了一个明确的取舍:可靠性优先,性能可以让步。
三十多年后的结果证明这个取舍是对的。QNX Neutrino 微内核至今仍是工业界通过 POSIX 认证的极少数实时操作系统之一。根据 QNX 官方数据,它运行在全球超过 2.35 亿辆汽车中[^8],客户包括宝马、奔驰、奥迪、丰田、现代等。此外,它还用于核电站控制、医疗设备、铁路信号系统。
戈登·贝尔于 2024 年 6 月去世。道奇后来离开 QNX,加入了自动驾驶公司 Apollo。他们的公司几经转手:先被 Harman 收购,Harman 又被三星收购,QNX 本身则在 2010 年被 BlackBerry 买下。
你不会在新闻里读到贝尔的讣告。但如果你今天开过车、坐过车,他的代码很可能保护过你。
理查德·史蒂文斯
W. 理查德·史蒂文斯(William Richard Stevens)没有发明任何东西。他做的是另一件同样重要的事:他把别人发明的技术解释得足够清楚,让全世界的人都能用。
他的《TCP/IP 详解》三卷本(1994—1996)和《UNIX 环境高级编程》(1992)是整整一代网络与系统工程师的案头书。史蒂文斯的写法极为独特:他不是从规范出发,而是从实际的数据包出发。他一行一行地追踪一个 TCP 连接从三次握手到数据传送到四次挥手的完整过程,把每一个字节的含义、每一段时序的依据都解释清楚。读他的书,你能看见网络在动[^9]。
《UNIX 环境高级编程》后来由 Stephen Rago 更新至第二版和第三版,至今仍是 Unix/Linux 系统编程的标准参考书。中国工程师圈子里,它有个更直白的名字——“APUE”(Advanced Programming in the UNIX Environment),几乎每个做后端的人都翻过。
你每次打开一个网页、发一条消息、刷一次视频,背后都有 TCP/IP 在运行。全球数以百万计的网络工程师中,有相当一部分是通过史蒂文斯的书学会了这门手艺。他没有发明协议,但他让协议变得可理解、可维护、可信赖。
1999 年 9 月 1 日,史蒂文斯因心脏骤停去世,48 岁。
他的书仍在印刷。他所使用的 tcpdump 抓包分析方法,至今仍是网络调试的基本功。
让·伊克比亚
1983 年,美国国防部正式发布了 Ada 语言标准(MIL-STD-1815)。这是一次罕见的政府主导的编程语言设计,目标是统一全军嵌入式系统的软件开发——从导弹制导到雷达信号处理,从战场通信到卫星导航。
设计者是法国计算机科学家让·伊克比亚(Jean David Ichbiah),当时在 CII-Honeywell Bull 公司工作。他领导的团队在 1977 年赢得了美国国防部的合同,从 17 个候选方案中脱颖而出[^10]。
Ada 的设计哲学与 C 几乎相反。C 信奉”信任程序员”,Ada 信奉”不信任任何人”。它强制类型检查、强制范围检查、强制异常处理、强制任务同步规范。编译器像审计员一样检查每一行代码——数组下标有没有越界、整有没有溢出、并发访问有没有竞争条件——稍有不对就拒绝编译。
开发者的感受通常是”烦”。但在安全关键领域,这种”烦”是刻意的。一个数组越界在 Web 应用里是一个 bug,在导弹拦截系统里是一条人命。一个未处理的异常在手机 App 里是一次闪退,在核反应堆控制系统里是一场灾难。
伊克比亚把 Ada 设计成”让你很难写出危险代码”的语言,不是限制,是保护。
今天,Ada 仍广泛用于军用航空电子系统(欧洲战斗机 Typhoon、F-35 的部分子系统)、空中交通管制系统(欧洲 EUROCAT 系统)、铁路信号系统(巴黎地铁、伦敦地铁),以及航天系统(阿丽亚娜火箭的部分后续型号改用了 Ada)[^11]。
让·伊克比亚于 2007 年 1 月 26 日去世,66 岁。他的讣告出现在法国《世界报》和《费加罗报》的角落,半栏,没有照片。
那些没有名字的人
上面写了几位有名字的人。更多人连名字都没有留下。
TCAS(空中防撞系统)的开发者。 TCAS 是全球商用航空强制装备的系统。当两架飞机的航线存在冲突风险时,TCAS 会在数秒内计算出避让方案,向飞行员发出”爬升”或”下降”的语音指令。根据 ICAO 的统计,TCAS 自部署以来已防止了数十起潜在的空中相撞事故[^12]。它的算法规范由 RTCA SC-147 委员会制定,具体实现由各航空电子厂商的工程师逐行编写。你不会在任何地方看到他们的名字。
OBD-II 标准的制定者。 1996 年起,美国要求所有轻型车辆配备标准化的车载诊断接口。SAE J1979 和 ISO 15031 系列标准定义了每一个诊断模式的每一个字节。制定这些标准的工程师委员会花了数年时间,逐条争论每一个参数的编码方式。今天全世界任何一家修车铺插上诊断仪都能读出任何一辆车的故障码——这种”任何”的背后,是枯燥到令人窒息的标准化工作[^13]。
心电监护仪的嵌入式工程师。 在几千字节内存的约束下实现心律失常的实时检测算法,误报率必须控制在 0.1% 以下。这不是一个随意定的数字:误报太多,护士会麻木,忽略真正的报警(这在医学上叫”报警疲劳”,已导致多起死亡事故[^14]);漏报一条室颤,病人可能在那几分钟里死去。
核电站安全停堆系统的开发者。 他们的代码,在理想情况下永远不会被执行。系统唯一的功能是:当所有常规控制手段失效时,让反应堆安全停堆。它必须在休眠十年、二十年后,第一次运行就成功。没有第二次机会。NRC(美国核能管理委员会)对这些软件的验证要求之严苛,在软件工程领域几乎是独一档的[^15]。
这些人不会出现在任何”改变世界的程序员”排行榜上。他们的工作太底层、太专业、太不可见。就像你不需要知道桥梁的设计师是谁——你只需要知道桥不会塌。
但桥不塌,不是理所当然的。
关于纪念
写这篇文章不是为了做排名——“谁比谁更伟大”这种比较没有意义。乔布斯让技术变成人们愿意拥有和享受的东西,这当然是了不起的成就。
我想说的是另一种东西:那些把可靠性看得比性能更重要、把安全看得比功能更优先的人,那些把”永远不出错”当作职业尊严的人。他们选择的方向——基础设施、安全关键系统、实时操作系统——天然就不可能获得公众关注。这些领域没有发布会,没有粉丝,没有估值,只有一条底线:代码不能出错。因为出错的代价,是人的生命。
你今天摸了屏幕、踩了油门、坐了飞机。你都平安。
那是因为有人在你出生之前,就把一生押在了这件事上。
参考资料
[^1]: Roth, D. (2011). “The Rookie Who Invented Unix.” Wired, October 14, 2011. 另见 Reddit r/programming 上的讨论帖,2011 年 10 月。
[^2]: NASA. (2013). International Space Station On-Orbit Status Report. ISS 上的命令与控制系统运行在 Linux 上,2013 年从 Windows 迁移。参见 NASA 官方通告。
[^3]: Kernighan, B. W. (2019). Unix: A History and a Memoir. Createspace. Brian Kernighan 是里奇在贝尔实验室的同事,书中详细描述了里奇的性格和工作方式。
[^4]: Aldrin, B. with Abraham, K. (1973). Return to Earth. Random House. 奥尔德林在书中详细描述了登月时的计算机报警事件。
[^5]: Hamilton, M. (1986). “Inside the Apollo Computer: The Concept, Design, and Implementation of the Apollo Guidance and Navigation System.” American Astronautical Society, Science and Technology Series, Vol. 59.
[^6]: Hamilton, M. (2018). “What the Software Engineering Community Can Learn from the Apollo Program.” ACM SIGSOFT Software Engineering Notes, 43(1), 5-6.
[^7]: Hildebrand, D. (1992). “An Architectural Overview of QNX.” Proceedings of the USENIX Workshop on Micro-kernels and Other Kernel Architectures, USENIX Association.
[^8]: BlackBerry QNX. (2024). QNX in Automotive. blackberry.com/qnx. 官方公布的数据为超过 2.35 亿辆汽车。
[^9]: Stevens, W. R. (1994). TCP/IP Illustrated, Volume 1: The Protocols. Addison-Wesley. 该书前言中,史蒂文斯解释了他的写作方法——“从数据包出发,而非从规范出发”。
[^10]: Ichbiah, J. D. et al. (1979). “Rationale for the Design of the Ada Programming Language.” ACM SIGPLAN Notices, 14(6), Part A.
[^11]: Barnes, J. (2014). SPARK: The Proven Approach to High Integrity Software. AdaCore. 该书详细介绍了 Ada/SPARK 在安全关键系统中的应用。
[^12]: ICAO. (2018). Manual on the Prevention of Runway Incursions and Other Surface Accidents (Doc 9870). International Civil Aviation Organization. TCAS 统计数据参见附录部分。
[^13]: SAE International. (2016). SAE J1979: E/E Diagnostic Test Modes. SAE Standard. OBD-II 标准的核心文档。
[^14]: Sendelbach, S. & Funk, M. (2013). “Alarm Fatigue: A Patient Safety Concern.” AACN Advanced Critical Care, 24(4), 378-386.
[^15]: NRC. (2017). Regulatory Guide 1.168: Verification, Validation, Reviews, and Audits for Digital Computer Software Used in Safety Systems of Nuclear Power Plants. U.S. Nuclear Regulatory Commission.