程序员视角:50 年前的阿波罗登月是一场计算机的胜利
继此前发表惊心动魄的阿波罗登月:软件和程序员才是幕后的英雄一文后,今天再从那群支持登月计划的程序员视角,呈现 50 年前的惊心动魄时刻。阿波罗 11 号制导计算机(AGC)中指令模块(Comanche055)和登月模块(Luminary099)原始代码被电子化以后发布在 Github 上,点击这里可以查看。
阿波罗 11 号着陆器载首次载着人类即将登录月球,此时燃料只够支撑几分钟。情况紧急之际,着陆器的功率计突然出现故障,通讯信号时强时弱,紧接着警示灯开始闪烁:程序警告!程序警告!
机载计算机发出五次紧急信号,这样的情况对于尼尔·阿姆斯特朗和巴兹·奥尔德林这两位宇航员来说,还从没经历过。
在那一刻,这两个人的生命,超过 30 万名技术人员的努力,八年间耗资 250 亿美元的付出,以及一个国家的骄傲完全取决于几行计算机代码。
“软件挽救了这项任务。”85 岁的 Fred Martin 说道,他当时负责管理阿波罗软件开发的大部分事务。
50 年来,我们一直认为从地球飞跃到另一个世界只是一场人类的胜利,但其实按照几乎任何标准来看,这也是一场计算机的胜利,它成就了计算机历史上最重要的 15 分钟。
“他们将计算机置于阿波罗这个雄心勃勃项目的中心。”计算机历史博物馆软件历史中心主任 David C. Brock 说: “这是对计算机技术、每个人的信念以及愿望的真正考验。”
让年轻的工程师施展才能
今年早些时候,在 Don Eyles 位于波士顿海滨的阁楼内,他在桌子上打开了一叠有半世纪之久的 18 英寸厚打印纸。
“他们不得不赌上一把,让自己相信这些年轻的工程师会站出来解决问题。”Eyles 说: “我们当时处于一种松散的管理局面,也正因如此我们可以天马行空。”
他申请了在麻省理工学院仪器实验室的工作,这家实验室的任务是将阿波罗宇航员送到月球并帮助他们返程。负责面试的人告诉他,把人类送上月球需要的不仅仅是大型火箭,还需要代码。令他惊讶的是,自己被聘用了。
I-Lab 位于一个能够俯瞰查尔斯河的旧内衣工厂,当然,原址在很久之前就已经被拆除了。阿波罗工程师和程序员在小隔间里几张有磨损的金属桌上工作,黑板上写满了代码,桌子上摆着计算尺,烟头散落在油毡地板上,打印纸摞了高达 6 英尺,就像白蚁丘。
这间实验室率先开发了冷战期间搭载核弹头导弹的惯性制导系统,例如 Polaris 潜射洲际弹道导弹。在美国空军的资助下,它还在 20 世纪 50 年代后期计划将计算机化的探测器送往火星并使其安全返回。
这是麻省理工学院获得的第一个大型合同,也是阿波罗项目唯一一个授予大学的合同,同时也是唯一一个没有经过竞标的合同。
在一个计算机使用易碎管、在穿孔卡片运行,体积能够占据整个房间的时代,I-Lab 工程师发明了一种公文包大小的电脑,其中安装了尖端的集成电路和内存,性能强悍,甚至可以承受电击,据称,这是今天几乎所有计算机的祖先。
阿波罗计划中配备了两台这样的计算机,一台在指挥舱,一台在月球着陆器上,两台机器运行着几乎相同的软件。但是,为了能安全着陆,月球着陆器还部署了额外的代码。
现年 86 岁的 Dan Lickly 当时负责计算机软件开发工作,他说,很难找到像 Eyles 这样可以将工程方程转化为代码,从而帮助人类到达另一个世界的人。
现年 79 岁的物理学家 Saydean Zeldin 曾在通用电气公司的导弹与太空部门负责弹头载入工作。1966 年她在休完产假后,就应聘了麻省理工学院的月球项目。
1966 年,当 Eyles 被聘用时,程序员的人数只有 130 人,到阿波罗 11 号项目时,这个数字已经变成了 600 人,增加了四倍以上。
代码中的奇思妙想
代码的力量令人陶醉。 负责太空飞行的工程师们发现:可以用代码来执行任何需要操作杆、电缆和促动器的任务。代码更便宜,适应性更强,最重要的是,它没有重量。
“我们开始使用软件来解决所有的问题。”84 岁的 James Kernan 说道,当时他负责监督阿波罗 9 号月球着陆器软件的组装工作。
如果计算机可以绘制出一条路线,为什么不让它来做呢? 1964 年,出于减轻重量的考虑,NASA 决定去除用于操作火箭发动机和推进器的机电飞行控制装置。
78 岁的 Don Fraser 曾负责自动驾驶仪的工作,他说:“NASA 当时确实陷入了困境。” 他回忆道,在一系列“黑色星期五”般的会议中,NASA 的管理人员命令压缩软件以适应需求,清除不太重要的任务,每做出一次改变都会进行争论。
阿波罗计划的计算机最终共需要约 145,000 行代码,而今天运行 Facebook 需要大约 6200 万行代码,谷歌运行需要的代码更是超过 20 亿行。
在月球着陆器的许多例行程序中,Eyles 参与编写了一个主点火序列,可以通过一系列相关的月球着陆程序来计算并控制降落。 Eyles 加了一些注释,让自己和同事记住要完成的一系列命令。
他突发奇想,将点火序列标记为“BURN_BABY_BURN”。
译注:《OFF TO SEE THE WIZARD》是由米高梅公司制作的一部动画 + 真人秀节目,代码这样提示有可能是工程师们在玩儿梗或者有意设置的“代码彩蛋”。
“我没想到未来会有谁从历史角度看我们的代码。”Eyles 说。
然而,当阿波罗 11 号着陆器开始降落,阿姆斯特朗报告了某个计算机问题时,数十名工程师的奇思妙想消失了。
“程序警告。”阿姆斯特朗向休斯顿无线电呼叫中心报告,他那一向简洁的话语中透露出一丝紧迫感: “屏幕显示 1202,发生了什么事?”
震惊和警报
当 Margaret Hamilton 听到宇航员喊出 1202 时,她的血压都飙升了。她太清楚这是什么意思了,因为就是她编写了警报代码。
她回忆说:“这行数字应该永远都不出现。我感到十分震惊,就在降落之前怎么可能发生警报?我努力安慰自己:天哪,这不是真的。”
Hamilton 和她的同事立即在扬声器和遥测继电器周围聚集起来,这些设备将实验室的开关、会议和监测安排室连接到休斯顿的飞行控制员和近 25 万英里外的月球着陆器上的宇航员那里。
随着宇航员接近月球表面,出现了一些状况导致计算机过载。房间里没有人知道原因是什么、它可能变得多么严重,或者如何在计算机超出其恢复余量之前修复它。
“人人提心吊胆。”任务研发小组的高级经理 Martin 说。在过往的数千次测试中,没有人见过这些警报: “记得当时我看了一眼 Margaret,我们都十分肯定这次登录任务就要被终止了。”
Hamilton 在 20 世纪 60 年代初加入麻省理工学院的阿波罗计划项目,她是当时招聘的人员中少见的经验丰富的程序员,她对程序错误有一种本能的厌恶。
作为一名数学家,Hamilton 为麻省理工大学一位名叫 Edward Lorenz 的气象学家通过运行计算来编程,从而帮助他发现了一种做“混沌理论”的新研究领域。
在这场月球竞赛中,她的第一个任务是编写终止程序的代码。接下来很快她就负责了宇宙飞船系统的软件事务。在阿波罗 11 项目中,Lickly 博士让她负责所有的太空舱和月球着陆器的软件工作。
随着登月事项临近,Hamilton 一直在为最坏情况焦虑: “我一直在设想,如果有错误怎么办?如果真实情境里宇航员发生紧急情况,但没有办法告诉其它人他们到底遇到什么样的麻烦,该怎么办?”幸运的是: “我找到了一种让他们通过软件处理紧急情况的方法。”
在着陆期间可能触发的程序警报有 29 个,1202 只是其中一个。当它在月球着陆器的数字计算机显示屏上闪现时,阿姆斯特朗只知道他们遇到了麻烦。
“请告诉我们 1202 程序警报是什么意思!”阿姆斯特朗尖锐的声音通过无线电传来。这些宇航员当时正从距月球上方 30,000 英尺处下降。
二十七秒钟过去了,他们还没有收到答复。
“任务继续”
当时正处在紧急时刻,只有休斯敦任务控制中心的飞行总监 Gene Kranz 有权停止登月。他紧张地听着各种声音,与着陆器的联系异常困难,只有静电的滋滋声充斥在通讯器里。
现年 86 岁的 Kranz 回忆说,当时他耳边响起多个声音,分别来自六个通信线路及空对地通信渠道。
“我们可以无视这个警报,继续任务吗?”Kranz 询问他的团队是否可以让着陆继续进行。
在宇航员们等待指令时,当时 25 岁的 NASA 工程师 Jack Garman 查看了麻省理工学院的笔记,然后告诉当时 26 岁负责导航控制台人员配备的 Steve Bales:“继续任务。” 随后,Steve 对 Kranz 说了同样的话。
“不用理会警报。”Kranz 命令道。警报一次次出现,Kranz 都命令无视,警报总共出现了五次,计算机进行了重置并继续飞行。 Eyles 的代码表现完美,阿姆斯特朗经过熟练的操作在一个安全的地方进行了着陆。
阿波罗宇航员 Charlie Duke 回忆说:“当时我们距离终止任务只有 17 秒钟”,他是控制中心通信员中唯一一个被允许在飞行中直接与机组航天人员交谈的人。
宇航员将他们称为鹰号(Eagle)的着陆器成功落到了月球这片”宁静之海“上。 “在经历了所有紧张情况之后,阿姆斯特朗镇定地回复:’休斯敦,这里是静海基地。鹰号已着陆’ ” Duke 说。
直到第二天,工作人员才知道是什么引发了程序警报:一个雷达装置的电源不匹配,错误地触发了一系列程序,导致计算机过载。一年前添加到软件中的重启保护功能挽救了登月任务。
大约在同一时间,美国宇航局取消了其最后三次阿波罗任务,结束人类近地轨道以外太空的探索活动,但没有说明何时会重启。
之后大部分电脑被废弃,NASA 也从未公布过阿波罗计划的代码,但这些代码可以在剑桥和华盛顿的博物馆中找到,一些计算机爱好者也发布了在线版本。
50 年前,当着陆器成功落地,一切尘埃落定,上面的机载计算机按既定指令在其 P68 登月确认程序中进行了勾选。 软件中嵌入的最后一行没有任何外人可以看到,它说:“宇航员:现在你已经成功着陆月球。”
你也许感兴趣的:
- 阿波罗 8 号宇航员 William Anders 在坠机事故中丧生
- 阿波罗登月:软件和程序员才是幕后的英雄
- 【外评】电脑从哪里获取时间?
- 【外评】为什么 Stack Overflow 正在消失?
- Android 全力押注 Rust,Linux 却在原地踏步?谷歌:用 Rust 重写固件太简单了!
- 【外评】哪些开源项目被广泛使用,但仅由少数人维护?
- 【外评】好的重构与不好的重构
- C 语言老将从中作梗,Rust for Linux 项目内讧升级!核心维护者愤然离职:不受尊重、热情被消耗光
- 【外评】代码审查反模式
- 我受够了维护 AI 生成的代码
你对本文的反应是: