被行业低估40年,Ada 才是现代编程语言的“隐形总设计师”

一门“没人聊”,却几乎人人都在继承的语言
技术圈有一种很熟悉的叙事:新语言总在“纠正前辈的错误”,像 Rust 在修补 C/C++ 的内存安全,Go 在收拾并发编程的复杂度,TypeScript 在给 JavaScript 补类型,Kotlin 和 Swift 在重写移动时代的语言体验。可如果把时间线拉长一点,你会发现一个略带讽刺的事实——这些被包装成“新时代答案”的设计,Ada 早就做过,而且做得相当彻底。
这篇题为《The Quiet Colossus》的文章,讲的是 Ada 这门语言如何在沉默中影响了整个软件工业。它的身世很特殊:不是车库创业的浪漫故事,不是某位明星程序员的个人哲学,也不是靠社区热情滚雪球长大的开源项目。Ada 是美国国防部在上世纪 70 年代“被逼出来”的产物。听起来有点官僚,但正因为它诞生于真实、昂贵且不能出错的工程危机,它解决的问题,恰恰是今天软件世界依然头疼的问题。
这也是我读完这篇文章最大的感受:Ada 不像一门语言,更像一份来自工业文明深处的备忘录。它提醒我们,软件设计里真正难的,从来不是“语法够不够酷”,而是系统能不能被维护、能不能被验证、能不能在十年后二十年后仍然让别人看懂。很多语言后来都在补这门课,而 Ada 当年几乎是带着完整教材入场的。
Ada 为什么会出现:一场由“语言碎片化”引发的国防危机
今天开发者常常抱怨前端生态碎片化,隔几个月就冒出新框架。但和 1970 年代美国国防部面对的局面相比,这点混乱几乎算是温柔。按照文章描述,当时美国国防部内部的武器系统、物流系统、通信系统、指挥控制系统,活跃使用中的编程语言和方言超过 450 种。每个承包商有自己的做法,每个历史阶段留下自己的遗产,代码彼此不兼容,维护者也常常早已离场。
想象一下,一套导弹控制软件没人敢动,一套舰船导航代码只有当年的外包团队看得懂,后勤系统和通信系统之间连基本的软件复用都做不到。这不是“程序员审美不同”的问题,而是国家级基础设施在软件层面变成了一片拼接起来的废墟。今天企业常说“技术债”,国防部当年面对的是一整座技术债山脉。
更有意思的是,美国国防部当时并没有简单粗暴地指定 COBOL、Fortran 或 PL/I 这种现成语言,而是花了五年时间梳理需求,从 Strawman 一路推进到 Steelman,最终形成了一份非常“工程思维”的语言需求说明。它不预设语法,不预设阵营,只问一件事:一门适合关键系统的软件语言,到底必须具备什么特征?
答案放到今天看,依然像一份现代语言设计清单:强静态类型、接口与实现分离、内建并发、统一异常处理、机器无关性、可读性、可验证性。别忘了,这是 1978 年。那时个人计算机时代还没真正展开,互联网更谈不上普及。换句话说,在很多人还把编程理解为“让机器跑起来”时,Ada 的设计者已经在追问“怎样让系统几十年后还能安全地被人接手”。
真正超前的,不是语法,而是它对“边界”的执念
Ada 最让我佩服的地方,不是它发明了多少概念,而是它对边界有一种近乎苛刻的坚持。文章里反复强调 Ada 的 package(包)机制:规范和实现是分开的,编译器强制执行。外部代码只能看到规范,内部实现从结构上被隐藏。不是“约定俗成地别乱访问”,而是压根看不见、碰不到、绕不过。
今天我们已经习惯了模块化、封装、信息隐藏这些词,甚至觉得这是程序设计常识。但如果认真比较,就会发现很多主流语言的“封装”其实都不够彻底。Java 有访问修饰符,但反射、继承和同包访问会让边界变得松动;Python 更依赖文化共识,“以下划线开头表示别碰”本质上还是君子协议;C 的头文件和实现文件看似分离,但预处理器和各种宏又经常把边界撕开一道口子。
Ada 不太信任程序员的自觉,它更信任编译器的拒绝。它不是在鼓励你写规范,而是在逼你写规范。这种“语言先替你设一道门槛”的思路,过去长期被嫌弃为笨重、死板、啰嗦。可今天我们再看 Rust、Swift、甚至各种企业级开发规范,大家绕来绕去,其实都在重新拥抱同一个现实:边界不清晰的系统,迟早会用事故来补课。
这背后还有一层更深的转变。过去的软件行业追求的是“让程序员尽快写出功能”,如今越来越多团队在乎的是“如何降低错误的自由”。这听上去有点反直觉,却是工程成熟的标志。年轻的行业总把限制视作束缚,成熟的行业才会明白,好的约束其实是对未来的保护。Ada 恰恰是一门把这种哲学写进语法里的语言。
当 Rust、Go、TypeScript 们成为主角,Ada 却像一位幕后编剧
文章最精彩的部分,是把 Ada 和今天这些热门语言放在一条演化线上。比如并发。Go 因为 goroutine 和 channel 被很多人视作“重新发明并发体验”的代表,但 Ada 很早就把任务和任务间通信纳入语言规范,而不是扔给库和开发者自己拼装。你可以说两者不完全一样,但那种“并发是语言一级公民”的意识,Ada 早就写进了设计基因里。
再看类型系统。Ada 允许你定义带语义约束的类型,比如人的年龄不再只是一个 int,而是 0 到 150 的范围类型。这个动作看上去很朴素,实际上非常接近今天“把业务规则前移到类型系统”的潮流。我们现在夸 Rust 擅长用类型减少错误,夸 TypeScript 在复杂前端工程里提供静态保护,夸 Haskell 能把约束表达成类型。Ada 的回答则更老派,也更直接:既然某个值天然有边界,为什么不让编译器知道?
还有今天被功能语言和现代语言反复讨论的代数数据类型、判别联合、泛型、契约式设计,在 Ada 身上都能找到清晰而成熟的前身。某种意义上,Ada 就像一个被主流市场忽视的早熟样板:它太早把未来做出来了,结果反而失去了“新鲜感红利”。
这也是技术史里经常发生的事。行业奖励的往往不是最早想明白的人,而是最会踩中时代节奏的人。Smalltalk 影响了图形界面和面向对象,但商业上并不算主流;Xerox PARC 发明了许多现代计算范式,却常常给别人做嫁衣。Ada 也有点像这样:它赢了思想史,却输了流行文化。开发者世界更偏爱轻盈、自由、快速起步的体验,而 Ada 的气质太像一个严格的总工程师,进门先问你:你确定这段代码十年后还安全可维护吗?这话是对的,但不讨喜。
今天重新看 Ada,真正刺痛行业的是一件事:我们是不是把“现代”理解错了
为什么 2026 年再谈 Ada 还有意义?因为当下的软件行业,正在经历一种很微妙的反转。过去二十年,互联网公司把“快速迭代”推到极致,容忍试错、拥抱热修复、线上打补丁。可随着软件开始更深地进入汽车、航空、金融、医疗、工业控制和 AI 基础设施,失误的代价越来越高。一个 Bug 不再只是网页白屏,可能是自动驾驶误判、供应链中断、模型越权访问,甚至是安全事故。
在这个节点上,Ada 像一面镜子。它让人不舒服,因为它暴露了一个真相:所谓现代语言演进,很多时候不是线性进步,而是在“重新发现那些曾被嫌麻烦的原则”。今天大家追逐 memory safety、formal verification、secure by default、software assurance,这些词听着很新,但精神内核并不陌生。Ada 早就站在那儿,只是当年整个行业更迷恋效率神话,不愿认真听。
当然,Ada 也不是完美答案。它的语法负担、学习曲线、生态贫瘠、文化影响力薄弱,都是真问题。语言再正确,如果没有足够开发者、工具链和社区承接,也很难成为广泛意义上的“平台”。这是 Ada 的遗憾,也是一个残酷现实:技术优雅不自动等于产业成功。软件世界最终比拼的,往往是语言设计、教育体系、商业支持、开发者情绪和时代需求的综合函数。
但我依然认为,Ada 值得被重新评价。不是因为它会突然翻红,取代 Rust 或 Go;这几乎不现实。真正重要的是,Ada 帮我们澄清了一件事:现代性不等于新,真正的现代,往往是那些经得起长期维护、复杂协作和高风险场景考验的设计。一个语言能不能火,和它是不是深刻,常常是两回事。
如果非要从 Ada 身上提一个今天仍悬而未决的问题,那就是:软件行业究竟想培养什么样的程序员?是能迅速把功能堆出来的人,还是能设计出十年后仍可信系统的人?这不是怀旧问题,而是 AI 时代会越来越尖锐的现实问题。当代码生成越来越便宜,真正稀缺的能力,可能恰恰是给系统设定正确边界、正确约束、正确失败方式的能力。而这,正是 Ada 当年最在乎的东西。