← 随机比特 / 所有内容

阿波罗 11 的代码考古,真正刺痛今天工程师的,不是“NASA 也会写 bug”,而是 57 年后我们才看清一个没触发过的隐性假设。

2026-04-08 · 随机比特

阿波罗 11 的代码里也有 bug,为什么真正该慌的反而是今天的开发团队?

如果我直接告诉你,阿波罗 11 的登月代码里,最近又被人翻出一个以前没写进文档的 bug,你第一反应多半会是:原来 NASA 也会写出有问题的代码。

但我看完这次代码考古,真正留下来的感受反而是另一件事:最危险的团队,往往不是 bug 最多的团队,而是默认自己已经把 bug 管干净的团队。

这次被翻出来的问题,来自 Apollo 11 使用的 Luminary 099。研究者对照旧设计文档和公开代码后发现,在 P63,也就是登月减速初始化那段流程里,藏着一个没被明确记录的时序问题。

简单说,本来应该先更新的寄存器,在一个很窄的窗口里可能慢半拍。如果宇航员刚好通过 DSKY 输入指令,后续计算就有机会读到旧值。这个窗口大约只有 40 毫秒,最坏情况下会带来 0.3 到 0.8 度的短暂姿态误差,然后在后续计算周期里被纠回来。

所以重点不是“登月差点失败了”。重点是,一个把人类送上月球的系统,也不是靠“零缺陷”赢的。

真正厉害的,不是没 bug

很多人聊关键系统时,脑子里想象的是一套没有瑕疵、没有遗漏、没有运气成分的完美机器。

Apollo Guidance Computer 给出的现实版本不是这样。它当然很强,4KB RAM、72KB 只读存储、手写汇编,还要在月球下降阶段同时处理导航、姿态和任务调度。放到今天看也很夸张。

可它真正厉害的地方,不是证明自己永远不会错,而是从一开始就接受一件事:代码会出错,任务也可能在出错时继续发生。

所以他们把很多精力放在另一个方向上,不是证明系统绝不会失手,而是确保系统失手以后别立刻死。

Apollo 11 当年最出名的软件事故,其实是 1202 alarm。那次不是逻辑写错,而是执行器过载,任务调度器来不及处理全部工作,系统开始报警。可它没有把任务直接拖死,因为 AGC 从一开始就把 restart capability,也就是“出问题后能快速重启并保住关键任务”的能力,当成了核心设计。

<figure><img src=“images/compare.png” /><figcaption>关键系统真正拉开差距的,往往不是有没有 bug,而是出错后能不能继续活下去。</figcaption></figure>

今天很多团队,反而更容易高估自己

这也是为什么我觉得,这次代码考古真正照到的,不是历史,而是现在。

今天的软件团队表面上比 1969 年强太多了。我们有静态分析、有 CI、有监控、有自动回滚,现在又叠了一层 AI,很多代码甚至都不用自己从头写。

问题是,工具越多,团队越容易形成一种幻觉:既然自动化这么全,代码又写得这么快,那可靠性应该也跟着涨了。

可真正难搞的 bug,本来就不一定长得像“这行写错了”。它更常见的样子是这些:某个状态默认会先同步完成,某个回调你以为只会晚几十毫秒,某个重试逻辑你以为最多触发一次,某个 AI 生成的改动看起来都对,却偷偷改坏了失败路径。

这些东西单看都不吓人。可一旦它们跟时序、并发、恢复机制缠在一起,问题就来了。很多团队测试了“功能能不能跑”,却没测试“在最糟糕的时机跑偏时,系统还能不能活”。

给今天工程团队的三个提醒

第一,假设要写出来。很多事故最后都不是技术不够,而是关键前提只存在于某个人脑子里,比如“这个状态一定先更新”“这里失败了后面会自动兜住”。项目顺的时候它像常识,一旦换人、扩容、重构、接 AI,它就会从常识变成埋伏。

第二,timing 要测,不只测逻辑。Apollo 11 这次发现的就是典型 timing 问题。逻辑本身没崩,大多数时候结果也对,只有在一个很窄的输入窗口里,旧值会被短暂读到。如果你只看功能测试,几乎很难发现。

第三,恢复能力要当成一等公民。生成代码很显眼,恢复设计平时不出事就像不存在。但真正到关键时刻,后者比前者值钱得多。一个产品能不能扛住错误,不只看代码质量,也看它能不能降级、状态坏了能不能恢复、子系统挂了会不会把主流程一起拖死。

最后

如果这只是一个旧时代趣闻,其实没必要写。但它偏偏发生在一个大家对软件生产力最乐观的时间点。

今天我们都在被“写得更快”推着走。AI 帮你补代码,Agent 帮你跑流程,自动化帮你接更多系统。可如果速度越来越快,团队却没有同步补上对时序、恢复路径和隐藏假设的审视,结果很可能不是更可靠,而是更晚看见错误,更快把错误放大。

Apollo 11 这次被翻出来的 bug,最值得记住的地方,不是“NASA 也会出错”,而是他们很早就承认系统总会有你没看到的错,然后提前把活路留出来。

你在现在的项目里,最担心哪一种“平时看不出来,出事才知道很致命”的隐藏假设?

资料来源:dev.to《Apollo 11 Guidance Computer: The Undocumented Bug We Found》、Hacker News 讨论、Virtual AGC 公开资料