写点什么

程序员视角:50 年前的阿波罗登月是一场计算机的胜利

  • 2019-07-20
  • 本文字数:5594 字

    阅读完需:约 18 分钟

程序员视角:50年前的阿波罗登月是一场计算机的胜利

继此前发表惊心动魄的阿波罗登月:软件和程序员才是幕后的英雄一文后,今天再从那群支持登月计划的程序员视角,呈现 50 年前的惊心动魄时刻。阿波罗 11 号制导计算机(AGC)中指令模块(Comanche055)和登月模块(Luminary099)原始代码被电子化以后发布在 Github 上,点击这里可以查看。


阿波罗 11 号着陆器载首次载着人类即将登录月球,此时燃料只够支撑几分钟。情况紧急之际,着陆器的功率计突然出现故障,通讯信号时强时弱,紧接着警示灯开始闪烁:程序警告!程序警告!


机载计算机发出五次紧急信号,这样的情况对于尼尔·阿姆斯特朗和巴兹·奥尔德林这两位宇航员来说,还从没经历过。


在那一刻,这两个人的生命,超过 30 万名技术人员的努力,八年间耗资 250 亿美元的付出,以及一个国家的骄傲完全取决于几行计算机代码。



Don Eyles 的阁楼上放置了一张 18 英寸厚的打印纸,上面显示了部分控制阿波罗月球着陆器降落到月球的代码。照片来源:华尔街日报 Tony Luong。


在此前,人类很少在计算机上冒这么大的风险,然而这次他们决定相信计算机和二进制代码。最终,阿姆斯特朗和奥尔德林成功成为第一批登上月球的人,并获得了一生的荣耀。


“软件挽救了这项任务。”85 岁的 Fred Martin 说道,他当时负责管理阿波罗软件开发的大部分事务。


50 年来,我们一直认为从地球飞跃到另一个世界只是一场人类的胜利,但其实按照几乎任何标准来看,这也是一场计算机的胜利,它成就了计算机历史上最重要的 15 分钟。


“他们将计算机置于阿波罗这个雄心勃勃项目的中心。”计算机历史博物馆软件历史中心主任 David C. Brock 说: “这是对计算机技术、每个人的信念以及愿望的真正考验。”



阿波罗 11 号的登月舱 “Eagle” 分离成功后开始按照计算机指引降落到月球表面,图摄于指令舱。照片来源:NASA。


在大部分计算机都要占据一整间房间的 1960 年代,阿波罗导航计算机这样一台体积小、功耗低的机载电脑的出现,真的堪称奇迹。尽管今天人们可能无法相信能用如此“原始”的电脑来控制宇宙飞船,但它的确有即使以今天的标准来看都是高级的功能。

让年轻的工程师施展才能

今年早些时候,在 Don Eyles 位于波士顿海滨的阁楼内,他在桌子上打开了一叠有半世纪之久的 18 英寸厚打印纸。


“他们不得不赌上一把,让自己相信这些年轻的工程师会站出来解决问题。”Eyles 说: “我们当时处于一种松散的管理局面,也正因如此我们可以天马行空。”



Don Eyles 在他的阁楼内。大学毕业后,他就去了麻省理工学院的仪器实验室工作,并帮助编写了引导人类登月的代码。照片来源:华尔街日报 Tony Luong。


1966 年夏天,Don Eyles23 岁,喜欢歌剧和飙车,身为数学专业学生的他当时正在找工作。刚刚走出校园,关于生活他有很多要学习的地方。计算机代码是其中一个,太空旅行也是。


他申请了在麻省理工学院仪器实验室的工作,这家实验室的任务是将阿波罗宇航员送到月球并帮助他们返程。负责面试的人告诉他,把人类送上月球需要的不仅仅是大型火箭,还需要代码。令他惊讶的是,自己被聘用了。


I-Lab 位于一个能够俯瞰查尔斯河的旧内衣工厂,当然,原址在很久之前就已经被拆除了。阿波罗工程师和程序员在小隔间里几张有磨损的金属桌上工作,黑板上写满了代码,桌子上摆着计算尺,烟头散落在油毡地板上,打印纸摞了高达 6 英尺,就像白蚁丘。


这间实验室率先开发了冷战期间搭载核弹头导弹的惯性制导系统,例如 Polaris 潜射洲际弹道导弹。在美国空军的资助下,它还在 20 世纪 50 年代后期计划将计算机化的探测器送往火星并使其安全返回。


这是麻省理工学院获得的第一个大型合同,也是阿波罗项目唯一一个授予大学的合同,同时也是唯一一个没有经过竞标的合同。


在一个计算机使用易碎管、在穿孔卡片运行,体积能够占据整个房间的时代,I-Lab 工程师发明了一种公文包大小的电脑,其中安装了尖端的集成电路和内存,性能强悍,甚至可以承受电击,据称,这是今天几乎所有计算机的祖先。




Ralph Ragan(左)和 Eldon Hall 负责领导麻省理工学院实验室的阿波罗项目工作,照片中他们正在阿波罗模拟控制器前检查导航计算机的元件。照片来源:DRAPER。


与同时代的其它机器不同,这台小型计算机不但可以同时处理许多任务,还能选择在多任务出现时选择优先处理哪些任务。


阿波罗计划中配备了两台这样的计算机,一台在指挥舱,一台在月球着陆器上,两台机器运行着几乎相同的软件。但是,为了能安全着陆,月球着陆器还部署了额外的代码。


现年 86 岁的 Dan Lickly 当时负责计算机软件开发工作,他说,很难找到像 Eyles 这样可以将工程方程转化为代码,从而帮助人类到达另一个世界的人。



20 世纪 60 年代的 Dan Lickly,他曾表示:找到能够将工程方程转化为代码、从而帮助人类到达另一个世界的人是令人敬佩的。照片来源:DRAPER。


“在‘如何飞向月球’这个问题上你是没有什么学位可以拿的。”Dana Densmore 说道,他于 1965 年加入实验室负责月球着陆器软件的监管工作: “你必须找到那些知道如何思考,有创造力也机警的人,因为一切都是临场想办法处理的。”


现年 79 岁的物理学家 Saydean Zeldin 曾在通用电气公司的导弹与太空部门负责弹头载入工作。1966 年她在休完产假后,就应聘了麻省理工学院的月球项目。



曾在通用电气导弹部门工作的物理学家 Saydean Zeldin 应聘了麻省理工学院实验室的工作,负责管理十几名导航工程师。


“当时我有点担心自己到底能不能胜任这份工作。”她回忆道。但很快她就开始负责管理十几名导航工程师,并且负责了阿波罗计划的多个事项。


1966 年,当 Eyles 被聘用时,程序员的人数只有 130 人,到阿波罗 11 号项目时,这个数字已经变成了 600 人,增加了四倍以上。

代码中的奇思妙想

代码的力量令人陶醉。 负责太空飞行的工程师们发现:可以用代码来执行任何需要操作杆、电缆和促动器的任务。代码更便宜,适应性更强,最重要的是,它没有重量。


“我们开始使用软件来解决所有的问题。”84 岁的 James Kernan 说道,当时他负责监督阿波罗 9 号月球着陆器软件的组装工作。


如果计算机可以绘制出一条路线,为什么不让它来做呢? 1964 年,出于减轻重量的考虑,NASA 决定去除用于操作火箭发动机和推进器的机电飞行控制装置。



阿波罗导航电脑的早期版本 AGC-3, 之后实验室又将其压缩成了一个可用模型。照片来源:DRAPER。


对小型计算机的需求增加了三分之一,要求飞到月球及返程所用的内存不多于一封普通电子邮件中的文本的内存体量。 于是工程师们又重新设计了计算机程序,将内存增加了一倍 ,但仍然容纳不了所用的软件。


78 岁的 Don Fraser 曾负责自动驾驶仪的工作,他说:“NASA 当时确实陷入了困境。” 他回忆道,在一系列“黑色星期五”般的会议中,NASA 的管理人员命令压缩软件以适应需求,清除不太重要的任务,每做出一次改变都会进行争论。


阿波罗计划的计算机最终共需要约 145,000 行代码,而今天运行 Facebook 需要大约 6200 万行代码,谷歌运行需要的代码更是超过 20 亿行。


在月球着陆器的许多例行程序中,Eyles 参与编写了一个主点火序列,可以通过一系列相关的月球着陆程序来计算并控制降落。 Eyles 加了一些注释,让自己和同事记住要完成的一系列命令。


他突发奇想,将点火序列标记为“BURN_BABY_BURN”。



一台早期月球着陆器中的阿波罗导航电脑。照片来源:Jesse Rieser。


当计算机想要重新定位着陆雷达天线时,代码指出:“请宇航员转动一下这个‘傻东西’(the silly thing)。” 接着计算机会通过程序计算来确定宇航员是否进行了正确操作,并提示: “请确定宇航员是不是在说谎。”当天线瞄准且着陆可以继续时,代码会提示:“OFF TO SEE THE WIZARD!”


译注:《OFF TO SEE THE WIZARD》是由米高梅公司制作的一部动画+真人秀节目,代码这样提示有可能是工程师们在玩儿梗或者有意设置的“代码彩蛋”。


“我没想到未来会有谁从历史角度看我们的代码。”Eyles 说。


然而,当阿波罗 11 号着陆器开始降落,阿姆斯特朗报告了某个计算机问题时,数十名工程师的奇思妙想消失了。


“程序警告。”阿姆斯特朗向休斯顿无线电呼叫中心报告,他那一向简洁的话语中透露出一丝紧迫感: “屏幕显示 1202,发生了什么事?”

震惊和警报

当 Margaret Hamilton 听到宇航员喊出 1202 时,她的血压都飙升了。她太清楚这是什么意思了,因为就是她编写了警报代码。


她回忆说:“这行数字应该永远都不出现。我感到十分震惊,就在降落之前怎么可能发生警报?我努力安慰自己:天哪,这不是真的。”


Hamilton 和她的同事立即在扬声器和遥测继电器周围聚集起来,这些设备将实验室的开关、会议和监测安排室连接到休斯顿的飞行控制员和近 25 万英里外的月球着陆器上的宇航员那里。



Hamilton 知道 1202 警报的含义是什么,就是她编写了这个警报代码。


她知道,这些警报表明计算机过载,为了保证飞行安全,计算机正按照之前的设计去除不重要的任务,它可以在不中断着陆或任何其它重要操作的情况下被关闭和重新开启。登月前大约一年,NASA 已经要求 I-Lab 的工程师在这个软件中加入这种重启保护机制。


随着宇航员接近月球表面,出现了一些状况导致计算机过载。房间里没有人知道原因是什么、它可能变得多么严重,或者如何在计算机超出其恢复余量之前修复它。


“人人提心吊胆。”任务研发小组的高级经理 Martin 说。在过往的数千次测试中,没有人见过这些警报: “记得当时我看了一眼 Margaret,我们都十分肯定这次登录任务就要被终止了。”


Hamilton 在 20 世纪 60 年代初加入麻省理工学院的阿波罗计划项目,她是当时招聘的人员中少见的经验丰富的程序员,她对程序错误有一种本能的厌恶。


作为一名数学家,Hamilton 为麻省理工大学一位名叫 Edward Lorenz 的气象学家通过运行计算来编程,从而帮助他发现了一种做“混沌理论”的新研究领域。



Hamilton 在麻省理工学院仪器实验室工作时的员工卡。


后来她为有史以来最大的计算机编写代码,这台计算机重 250 吨,高四层,它是价值 270 亿美元的国家防空系统的大脑。


在这场月球竞赛中,她的第一个任务是编写终止程序的代码。接下来很快她就负责了宇宙飞船系统的软件事务。在阿波罗 11 项目中,Lickly 博士让她负责所有的太空舱和月球着陆器的软件工作。


随着登月事项临近,Hamilton 一直在为最坏情况焦虑: “我一直在设想,如果有错误怎么办?如果真实情境里宇航员发生紧急情况,但没有办法告诉其它人他们到底遇到什么样的麻烦,该怎么办?”幸运的是: “我找到了一种让他们通过软件处理紧急情况的方法。”


在着陆期间可能触发的程序警报有 29 个,1202 只是其中一个。当它在月球着陆器的数字计算机显示屏上闪现时,阿姆斯特朗只知道他们遇到了麻烦。


“请告诉我们 1202 程序警报是什么意思!”阿姆斯特朗尖锐的声音通过无线电传来。这些宇航员当时正从距月球上方 30,000 英尺处下降。


二十七秒钟过去了,他们还没有收到答复。

“任务继续”

当时正处在紧急时刻,只有休斯敦任务控制中心的飞行总监 Gene Kranz 有权停止登月。他紧张地听着各种声音,与着陆器的联系异常困难,只有静电的滋滋声充斥在通讯器里。


现年 86 岁的 Kranz 回忆说,当时他耳边响起多个声音,分别来自六个通信线路及空对地通信渠道。


“我们可以无视这个警报,继续任务吗?”Kranz 询问他的团队是否可以让着陆继续进行。



Kranz 要求宇航员在练习中了解计算机警报。在阿波罗 11 号着陆期间,这确实发挥了作用。


在执行任务之前的最后一次练习中,Kranz 和他的团队已经对这些警报进行了测试,但却失败了。他们当时措手不及,错误地命令宇航员终止着陆。那次的经验也告诉团队成员一个道理——即便出现警报,计算机仍然可以信赖。


在宇航员们等待指令时,当时 25 岁的 NASA 工程师 Jack Garman 查看了麻省理工学院的笔记,然后告诉当时 26 岁负责导航控制台人员配备的 Steve Bales:“继续任务。” 随后,Steve 对 Kranz 说了同样的话。


“不用理会警报。”Kranz 命令道。警报一次次出现,Kranz 都命令无视,警报总共出现了五次,计算机进行了重置并继续飞行。 Eyles 的代码表现完美,阿姆斯特朗经过熟练的操作在一个安全的地方进行了着陆。


阿波罗宇航员 Charlie Duke 回忆说:“当时我们距离终止任务只有 17 秒钟”,他是控制中心通信员中唯一一个被允许在飞行中直接与机组航天人员交谈的人。


宇航员将他们称为鹰号(Eagle)的着陆器成功落到了月球这片”宁静之海“上。 “在经历了所有紧张情况之后,阿姆斯特朗镇定地回复:'休斯敦,这里是静海基地。鹰号已着陆’ ” Duke 说。


直到第二天,工作人员才知道是什么引发了程序警报:一个雷达装置的电源不匹配,错误地触发了一系列程序,导致计算机过载。一年前添加到软件中的重启保护功能挽救了登月任务。




Kranz 要求宇航员在练习中了解计算机警报。在阿波罗 11 号着陆期间,这确实发挥了作用从左起分别是 Norman Sears、Margaret Hamilton、Phyllis Rye 和 Ain Laats。黑板上是一个用于指令舱导航程序。


然而 7 月份登月成功的喜悦并未阻止 11 月的一场抗议活动,当时由于 I-Lab 的军事武器的研究工作,学生和警察在实验室外发生冲突。到 1973 年,麻省理工学院切断了与实验室的联系,之后更是将其更名为查尔斯·斯塔克·德拉普尔实验室( Charles Stark Draper Laboratory),并将所有机密军事研究移到了校外。


大约在同一时间,美国宇航局取消了其最后三次阿波罗任务,结束人类近地轨道以外太空的探索活动,但没有说明何时会重启。


之后大部分电脑被废弃,NASA 也从未公布过阿波罗计划的代码,但这些代码可以在剑桥和华盛顿的博物馆中找到,一些计算机爱好者也发布了在线版本。


50 年前,当着陆器成功落地,一切尘埃落定,上面的机载计算机按既定指令在其 P68 登月确认程序中进行了勾选。 软件中嵌入的最后一行没有任何外人可以看到,它说:“宇航员:现在你已经成功着陆月球。”


原文链接:


https://www.wsj.com/articles/apollo-11-had-a-hidden-hero-software-11563153001?mod=rsswn


2019-07-20 08:065292

评论

发布
暂无评论
发现更多内容

CCF C³-04@百度丨“AI+开源”的昨天今天和明天

百度大脑

百度 AI

GitHub上标星75k+超牛的《Java面试突击版》,分享PDF离线版

Java 程序员 架构 面试

一个月吃透这份阿里高级专家的《Java500道面试手册》成功拿下了腾讯offer!

Java架构之路

Java 程序员 架构 面试 编程语言

阿里人是如何设计系统抵挡亿级流量冲击的?(全彩版小册开源)

Java架构师迁哥

C++ 协程的近况、设计与实现中的细节和决策

Linux服务器开发

c++ 线程 后端 协程 Linux服务器开发

一周信创舆情观察(5.17~5.23)

统小信uos

GitHub连夜封杀!这份阿里 10W 字内部 Java 字面试手册到底有多强?

Java 程序员 架构 面试

外包CRUD3年,被导师一句话点醒,直接涨薪9K(Java岗)

Java架构师迁哥

学到了,用138个案例讲明白了Spring全家桶+Docker+MQ

Java架构师迁哥

吐血总结 | Java并发编程 72 变

Java架构师迁哥

微服务注册中心:Consul——服务注册

程序员架构进阶

微服务 Consul API网关 28天写作 5月日更

关于echarts使用geo制作地图tooltip不显示问题

孤独的西北疯

Dubbo 服务治理简介

青年IT男

dubbo

阿里开源:历年亿级活动高并发系统设计场景总结

Java架构师迁哥

大厂面试内幕:阿里内部整理出的5000页Java面试复盘指南,起飞

Java架构追梦

Java 架构 面试

爱了! Alibaba技术官甩出的“阿里内部Java成长笔记”,技术人成长的标杆!

Java架构之路

Java 程序员 架构 面试 编程语言

备战 60 天,成功上岸滴滴后,我特地把金三银四备战资源库整理出来了

Java 程序员 架构 面试

CompletableFuture 简单与链式的区别?

码农架构

Alibaba面试官:“这该死的程序员,技术竟如此深厚!”

Java架构之路

Java 程序员 架构 面试 编程语言

人生算法:做好自己这家公司的CEO

石云升

读书笔记 思维模型 5月日更

DWF低代码开发技术及其在数字化运营和运维平台建设中的应用

云智慧AIOps社区

低代码 智能运维

ThingJS粒子特效一键实现雨雪效果

ThingJS数字孪生引擎

可视化 场景应用 3D可视化 数字孪生

扫盲篇-什么是分布式任务调度

敏捷调度TASKCTL

大数据 分布式 分布式锁 分布式任务调度 zookeeper分布式锁

国家工业信息安全发展研究中心与华为联合发布《数据安全白皮书》

DT极客

高德地图只显示一个省的地图

孤独的西北疯

中国数字人民币官方宣传片来袭!DCEP:开启“无现金新时代”!

CECBC

阿里P7简历上都有哪些可以拿得出手的项目?

Java架构师迁哥

助力秋招第三弹:Java集合框架体系详细梳理

北游学Java

Java 面试 框架 秋招

发布引发的curator报错:instance must be started before calling this method

林一

dubbo zk 优雅停机

Spring Boot Devtools Restarter 原理

sN0wpeak

Java spring

区块链如何赋能企业数字化转型?

CECBC

程序员视角:50年前的阿波罗登月是一场计算机的胜利_文化 & 方法_Robert Lee Hotz_InfoQ精选文章