1969年7月20日,人类第一次踏上月球。
很少有人知道的是,在登月最后阶段,负责导航的计算机其实已经接近过载,并连续发出了报警。
如果放在今天,很多系统可能已经直接崩溃。
但57年前,一支软件团队却让它坚持运行到了最后。
而这支团队的负责人,就是 Margaret Hamilton。
首先我们先从这个伟大的女程序员「Margaret Hamilton」,说的一句话开始:
If the computer hadn't recognized this problem and taken recovery action, I doubt if Apollo 11 would have been the successful Moon landing it was.
这句话来自:Margaret Hamilton的维基百科
中文翻译是:
如果计算机没有识别出这个问题并采取恢复措施,我怀疑阿波罗11号能否实现如此成功的登月。
那到底具体发生了什么事件呢? 如下:
在Apollo登月过程中,由于登月雷达(Rendezvous Radar)的开关配置,使它持续向 AGC(阿波罗「制导」计算机)发送数据。这些本不应该出现的数据,不断消耗计算机的处理能力,大约占用了 15% 左右的计算时间。
也就是说,AGC 一边要完成着陆过程中最关键的导航与控制计算,一边还要处理这些额外的数据输入,计算资源一度接近耗尽,并连续触发了著名的 1201、1202 报警。
但正是在这一刻,Margaret Hamilton团队设计的软件发挥了决定性的作用。AGC 采用了优先级调度机制,当计算资源不足时,它不会让整个系统崩溃,而是主动放弃低优先级任务,把有限的计算能力全部留给着陆所必需的「高优先级任务」,因此关键计算得以持续运行,最终帮助阿波罗 11 号成功完成了登月。
放到今天,代码要考虑异常、要具备容错能力,已经是软件开发的基本要求。
但在 1969 年,这种思想却非常超前。那个年代,软件还没有被普遍视为一门独立的工程学科。Margaret Hamilton 为了强调软件开发同样需要严谨的工程方法,开始使用**Software Engineering(软件工程)**这一术语。起初,很多人甚至觉得这个说法很好笑,把它当成一个玩笑。
而她和团队所开发的阿波罗飞行软件,不仅提前考虑了各种异常情况,还设计了任务优先级和故障恢复机制。这些理念,即使放到今天的软件工程实践中,依然不过时。
那个年代,大多数人关注的是程序能不能运行,而Hamilton团队思考的却已经是程序出错以后还能不能继续完成任务。
且,你知道当时的那台电脑的配置吗? 如下:
重约 32 公斤,时钟频率约 2 MHz,只有 2K words 的 RAM(约 4KB)、36K words 的 ROM(约 72KB)。
今天手机拍摄的一张照片,占用的存储空间,都可能超过它整个程序。就这样一台今天看来配置寒酸的机器,把人类送上了月球,并安全带了回来。
那这台嵌入式的电脑长什么样子? 如下图:
而当时的代码放在哪? 来,你看下图:
你没有看错,那就是源代码。
里面的代码是「阿波罗制导计算机自己的汇编语言」。
CA Q
TS L
INDEX A
TC BANKCALL
和今天的 x86 汇编、ARM 汇编不是一种语言。
因为 AGC 自己就是一颗完全不同架构的 CPU。
在那个年代,没有:
- VSCode
- IntelliJ IDEA
- GitHub
- Git
- SVN
- 也没有代码 Review 系统
那会:
纸,就是代码库。
今天我们在 Git 上提交一个 commit,当年的工程师可能需要重新打印几十页源码,再经过审核和签字流程。
而当时的程序员会:
- 打印完整源码
- 在纸上改
- 在纸上讨论
- 做 Code Review
- 做设计评审
且对软件要求极高。很多修改都需要:
- 工程师签字
- 审核
- 再录入计算机
所以保存大量纸质源码非常正常。那这些纸最后怎么变成计算机里的程序?
你可能是第一次听说:Core Rope Memory(磁芯绳索存储器)。
真的就是:用线一根一根穿出来的。
线穿过去 ========> 表示 1
线绕过去 --------> 表示 0
所以也有人戏称:
Apollo 的 ROM 不是编译出来的,是"织出来的"。
具体的你可以看一下下面这张图:
小结
今天,我们已经习惯了N核 的CPU、N个 GB 内存、云计算和自动化部署。
但 57 年前,人类第一次登上月球时,依靠的却是一台重约 32 公斤、只有几 KB 内存的计算机,以及一群把「程序出错后怎么办」提前想清楚的工程师。
真正让阿波罗 11 号伟大的,或许不仅是火箭和宇航员。
还有那套在资源极其有限的条件下,依然能够优雅地处理异常、保证关键任务继续执行的软件系统。
直到今天,它依然配得上「伟大的软件工程」这个名字。