工程哲学:玛格丽特·汉密尔顿

核心要点
- 她提出”软件工程”一词,为这门学科赢得正当地位。 在麻省理工学院仪器实验室领导阿波罗飞行软件工作期间,玛格丽特·汉密尔顿开始把这项工作称为”软件工程”——这是有意为之,意在主张:在软件还被视为可有可无的附属品的年代,编写把人送上月球的代码,理应获得与硬件工程、系统工程同等的严谨与尊重。12
- 当制导计算机抛出1202和1201警报时,是她的软件挽救了阿波罗11号的着陆。 在最后下降阶段,一个设置错误的交会雷达开关把本不该交给阿波罗制导计算机的多余任务塞了进来,执行程序耗尽了用于调度它的内存——这就是著名的1202(”无核心集”)和1201(”无VAC区”)警报。正因为汉密尔顿的团队为软件构建了优先级调度与重启保护,计算机得以丢弃低优先级的雷达任务,让关乎着陆成败的制导继续运行,着陆最终成功。345
- 她最根本的信念是防御式设计:为失败情形而设计,因为没有第二次机会。 谈起阿波罗,她说:”没有第二次机会,这一点我们心里清楚。”2 错误检测、错误恢复、异步优先级调度,以及人在回路中的显示——这些都不是在顺利路径跑通之后才加装上去的功能,而是设计的核心,是软件能够优雅降级而非崩溃的原因所在。6
- 她从一开始就把正确性构建进系统——“事前开发”。 阿波罗之后,她创立了高阶软件公司(1976年)和汉密尔顿技术公司(1986年),研发出通用系统语言(USL),以及一套系统设计方法论:让整类错误在构造上就不可能发生,而不是靠测试去捕捉。她获得了NASA杰出空间法案奖(2003年)和总统自由勋章(2016年)。16
原则
“没有第二次机会,这一点我们心里清楚。我们认真对待自己的工作,我们中许多人在二十多岁时就踏上了这段旅程。” —— 玛格丽特·汉密尔顿,谈阿波罗飞行软件2
大多数工程都是为一切顺利的情形而优化。你搭好顺利路径,处理几个想得到的错误,然后发布——一旦生产环境出问题,就打个补丁再重新部署。几乎所有软件都活在这个循环带来的安逸里:失败是可挽回的,因为总有下一次机会。汉密尔顿的工作从相反的前提出发。她所领导的软件要把三个人送到离地球四十万公里之外,再让其中两人降落月球,而没有补丁,没有重新部署,没有下一次机会。 它必须一次成功,在无人能够完全演练的条件下,运行在一台内存还不如会奏乐的贺卡的计算机上。2 当单个未被捕获的错误所付出的代价就是机组人员的生命,”为失败情形而设计”便不再是一句好建议,而成了工作的全部。
由此推出的原则是:把防御式设计当作设计的核心,而非事后的善后。 如果软件必须挺过意外,那么检测错误、从错误中恢复、优雅降级就不能是顺利路径完工后再添加的功能——它们必须是顺利路径所依附的骨架。汉密尔顿的团队这样构建阿波罗软件:让计算机能够察觉自己被要求做超出能力范围的事,抛弃那些无关紧要的任务,干净利落地重启回到已知良好的状态,并坚持做那件一旦停下就会害死机组人员的事。 这个系统不是为了规避一切失败而构建——在如此微小的机器上、面对如此不容差错的任务,你做不到。它的构建目标是:当失败到来时,失败是可以挺过去的。36
这条原则还有后半段,正是它让前半段成真:从一开始就把正确性构建进去,而不是在最后把缺陷测出来。 在运行时检测并从错误中恢复,是最后一道防线;更深层的功夫,是把系统设计成让整类错误从根本上不可能出现。汉密尔顿的后半段职业生涯所做的正是这件事——她称之为”事前开发”的方法论,以及一门旨在让接口错误在结构上不可能发生的语言。6 这两半其实是同一个想法在两种距离上的样子:当没有第二次机会时,你既在运行时防御,也在设计时让失败根本无法被表达,因为你唯一能完全信任的错误,是系统压根没机会犯下的那个。
背景
玛格丽特·汉密尔顿于1936年8月17日出生于印第安纳州保利,原名玛格丽特·希菲尔德(Margaret Heafield)。1 她在厄勒姆学院主修数学,1958年获得学位,辅修哲学——这一组合日后体现在她对系统而非仅仅对代码的思考方式上。1 她并非通过计算机科学的培养路径走进阿波罗,因为在20世纪50年代末根本没有这样的路径;她是通过数学,也通过工作本身走进来的。
她最早的编程从一开始就关乎现实、关乎高风险。1959年她进入麻省理工学院气象系,与混沌理论的创始人爱德华·洛伦兹共事,在LGP-30和PDP-1上编写天气预测软件。1 大约从1961年到1963年,她在麻省理工学院林肯实验室参与SAGE项目,为美国空军用于探测来袭飞机的AN/FSQ-7计算机编写软件。1 SAGE是有史以来最早的大型实时、对故障敏感的软件系统之一,她在那里赢得的声誉——专门承接最棘手、最容易出错的代码——正是把她带到阿波罗的原因。
1965年她加入麻省理工学院仪器实验室(后来的德雷珀实验室),该实验室承接了为NASA阿波罗计划构建机载飞行软件的合同。她一路晋升到领导软件工程部,带领团队负责运行在指令舱与登月舱阿波罗制导计算机上的机载飞行软件。1 正是在这里,在这项工作的中途,她开始使用”软件工程”这一术语——不是把它当作时髦词,而是当作一种主张。用她自己的话说,她使用这个术语是”为了把它与硬件及其他类型的工程区分开来,同时把每一类工程都视为整体系统工程过程的一部分”。1 她坚持认为,软件是一门学科,理应拥有一个名字,以及随之而来的严谨。阿波罗之后,她于1976年创立高阶软件公司,又于1986年创立汉密尔顿技术公司,在那里研发出通用系统语言和”事前开发”方法论。16
工作
阿波罗11号的1202警报:优先级调度与重启保护
从这里讲起,因为它正是这条原则在最严酷的压力下化作机制的样子。阿波罗制导计算机是一台极小的机器——内存只有几十千字节,没有现代意义上的操作系统——运行着汉密尔顿团队设计的实时执行程序。要运行一个任务,执行程序必须找到空闲内存:一个“核心集”(存放任务状态的小块内存),对于做浮点运算的任务,还需要一个“VAC区”。4 如果一个任务被调度时没有空闲的核心集,执行程序就跳转到它的警报例程并发出1202警报;如果没有空闲的VAC区,就发出1201警报。4 这些都不是崩溃代码。它们是执行程序在宣告自己被要求做超出容量的事——然后采取行动应对。
在阿波罗11号下降的最后几分钟里,发生的正是这件事。宇航员检查清单让机组把交会雷达开关留在了错误的位置,导致雷达窃取处理器周期,使执行程序反复调度那些本不该运行的数据处理任务。34 这些多余任务耗尽了全部空闲内存,于是1202警报触发——接着再次触发,1201警报也来了,在着陆前的几秒钟内一共响了四次。一台幼稚的计算机若被要求做所有事,就会试图做所有事,在那件唯一要紧的任务上落后,然后僵死。汉密尔顿的计算机没有。
两个设计决策挽救了着陆。第一个是优先级调度:执行程序按优先级运行任务,可以舍弃优先级最低的工作,因此关乎着陆成败的制导与机组显示器(DSKY)始终运行,而垃圾雷达任务被饿死。35 第二个是重启保护:每次警报都触发一次软件重启,清空过载的任务队列,重新引导回到已知良好的状态,重启”重要的部分,比如操纵下降发动机和运行DSKY”,但不重启那些被错误调度的雷达任务。45 计算机实际上把噪音丢掉,继续驾驶飞船,并告知机组它正在处理——正因如此,地面任务控制中心才能在一个换作较差设计就意味着中止的警报面前喊出”继续”。
它作为工程为何重要:警报本身不是失败——它是失败处理按设计正常运转。团队构建执行程序时就预期了过载,准备好在过载下分诊,并从过载中恢复,而且他们如此彻底地测试了这种恢复,以至于控制人员在软件所承受过的最大压力下依然信任它。这就是整套信条在一个瞬间的体现:失败被预设为前提,失败情形就是设计的核心,系统降级为”只做那件让机组活下去的事”,而不是轰然倒下。同样的本能如今活在每一个会卸载负载的优先级队列里,活在每一个会把崩溃的工作进程重启回干净状态的监督者里,活在每一个被构建来挺过被压垮的系统里。
提出”软件工程”,以及为正当性而战
1202的故事广为人知;而命名,可以说意义更为深远。在20世纪60年代,软件被普遍当作”真正”工程那个软弱、不正经的弟弟——是硬件设计好之后才去琢磨的东西,而不是一门有自身严谨的学科。汉密尔顿拒绝这种框定。在阿波罗内部,她开始有意地把这项工作称为”软件工程”,并且对原因直言不讳:为了”把它与硬件及其他类型的工程区分开来,同时把每一类工程都视为整体系统工程过程的一部分”。1 重点不在措辞,重点在地位。如果驾驭这次任务的代码是工程,那它就理应拥有工程的严谨:规格说明、评审、测试、可追溯性,以及对它被做正确而非仅仅被做到能运行的期待。
她说过,这个术语起初遭到一笑置之——软件竟能是”工程”,在人们看来有些牵强。1 但她为之奋斗的那份正当性是承重的。如果一项工作被看作随手写写、日后总有人来收拾的脚本,你就无法要求团队为失败情形而设计、把错误恢复构建进系统的骨子里、把正确性当作不可妥协的底线。为这门学科命名,是要求它达到某个标准的前提。到那个十年结束时,这个术语已经走出麻省理工,成了一个领域的名字;如今”软件工程”平常得几乎隐形,而这正是那场争论已经胜出的最确凿标志。12

防御式设计:”劳伦bug”与针对人的工程
如果你想找一扇最清晰的窗口去看汉密尔顿如何思考,那就是“劳伦bug”。她年幼的女儿劳伦有时来实验室,在指令舱模拟器上扮演宇航员,有一天她把它弄崩溃了——办法是在模拟飞船已经处于飞往月球的途中时,选择了发射前程序P01。7 在中途加载发射前初始化,抹掉了导航数据,让计算机迷失了方向。汉密尔顿的本能不是”任何宇航员都绝不会那样做”。而是:如果模拟器允许一个孩子那样做,软件就允许了它,而软件允许的任何事,终究都会发生。 她提议添加错误检测代码,以防在飞行中选择P01。7
她被否决了——理由是宇航员都是训练有素的专业人员,绝不会犯这种错误——只被允许在文档里加一条注记。7 然后,就在紧接着的下一次任务阿波罗8号上,吉姆·洛弗尔做了劳伦做过的一模一样的事,在飞行中选择了P01,在人类首次环月之旅中抹掉了导航数据。7 那之后,修复才被加了进去。汉密尔顿从中得出并反复强调的教训,正是防御式设计的核心:你不能断定某个失败”不可能发生”,然后按它不会发生的样子去设计。宇航员、雷达开关、凌晨三点的操作员——系统必须对回路中的人保持稳健,而不是靠假定人不会出错来免受指责。她的优先级显示器从另一个方向体现了同样的想法:让人始终知情、始终掌控,这样当计算机在过载下分诊时,机组明白它在做什么,并且能够做出决定。6

高阶软件公司、USL与”事前开发”
阿波罗教会了汉密尔顿错误从何而来,而她用余下的职业生涯从根源上攻击它们。研究阿波罗的错误时,她发现其中很大一部分并不存在于单个模块内部,而是存在于模块之间的接口上——一段软件把数据交给另一段、而双方假设并不完全吻合的地方。在高阶软件公司(1976年),以及后来的汉密尔顿技术公司(1986年),她围绕着在构造上消除这些错误、而非靠测试去捕捉,建立起一整套工作体系。16
这套方法论叫做“事前开发”。这个名字就是论点本身:不是先构建一个系统、再去事后追猎缺陷,而是用一套形式化系统——通用系统语言(USL)——如此严谨地定义它,以至于整类错误,尤其是接口与集成错误,在结构上就不可能发生。这个模型可被证明是一致的,正确的代码可以从中生成,于是缺陷在设计时就被预防,而不是在运行时才被发现。6 这与阿波罗执行程序是同一份信念,只是又推进了一层:运行时恢复是安全网,但真正的胜利,是一个从一开始就没机会犯下错误的系统。业界大多数人仍在运行相反的循环——发布、找bug、打补丁——而这正是汉密尔顿用三十年时间论证、在正确性真正要紧时是本末倒置的那个循环。
方法
通读阿波罗执行程序、”软件工程”一词的提出、劳伦bug,以及事前开发,同样的信念反复出现。汉密尔顿的方法与其说是一句口号,不如说是一组长期养成的习惯。
先为失败情形而设计——没有第二次机会。 阿波罗执行程序不是一个事后加装了过载处理的调度器;挺过过载本身就是它的设计,因为一台僵死在月球上空的计算机会害死机组。34 这条教训远远适用于航天之外:在写下系统正常工作的那条路径之前,先把它如何失败一一列举,让正常工作的路径从一个已经能挺过失败的结构中自然落出。这就是证据门槛在可靠性上的应用——“它在模拟器里能跑”不是证据,”当雷达把它淹没时它卸载负载并继续飞行”才是——这与几十年后沃纳·福格尔斯奉为云计算立身前提的优雅降级,是同一个标准。
假定人会做那件不可能的事。 劳伦bug是这条法则的微缩:如果系统允许一个危险动作,那么某个人——一个孩子、一名宇航员、一个疲惫的操作员——终究会做出它,所以”没人会那样做”不是辩护。7 长期养成的习惯,是在边界处防范那个你被保证绝不会到来的输入,因为伤害最重的失败,正是你事先断定不可能发生的那些。这与拉迪亚·珀尔曼构建进路由、让其在节点说谎时仍保持正确的那种对抗式稳健本能,如出一辙。
在负载下分诊——舍弃不重要的,守护关键的。 当执行程序耗尽内存,它没有试图服务每一个请求;它运行最高优先级的任务,把其余的饿死,然后干净利落地重启。35 这门功夫,是事先决定那件绝不能停下的事是什么,并把系统构建成在压力下牺牲其他一切来让那件事继续运行。一个没有优先级的系统,会在最糟糕的时刻失败,因为它把机组显示器和垃圾雷达任务当成了同等的东西。
把正确性构建进去,不要测进去。 事前开发是对”先发布再调试”循环的拒绝:把系统定义得让错误无法被表达,而不是先构建它、之后再追猎错误。6 这条教训是:最便宜、最值得信赖的缺陷,是被设计变得不可能的那个——这与芭芭拉·利斯科夫化为类型纪律与抽象的信念、与莱斯利·兰伯特化为在写代码之前精确指定正确性的信念,是同一份。这是质量是唯一的变量化作工作流:正确性不是末尾的一个阶段,它从一开始就是事物的形状。
为这门学科命名,好让你能以标准要求它。 把这项工作称为”软件工程”,是那个为其他一切——规格说明、评审、对严谨的期待——发放许可的行为。1 长期养成的习惯,是坚持这项工作拥有一个名字和一套标准,因为你无法向一个组织视为可弃之物的东西索要匠心。这是最小可敬产品的精神:这件事值得做好,所以你把它做好,并且大声说明:把它做好是唯一可接受的方式。
影响链
谁塑造了她
麻省理工的数学与实时传统。 汉密尔顿是通过数学、通过SAGE——最早的大型实时、对故障敏感的软件系统之一——以及通过与混沌理论创始人爱德华·洛伦兹一起做天气建模成长起来的。1 这份根基显而易见:早在走进阿波罗之前,她就把软件看作一个必须在无人能完全预测的条件下保持正确的系统。(奠基性影响)
航天本身那不容差错的纪律。 阿波罗任务和任何人一样是她的老师。一个单个错误就要赔上机组、没有补丁、没有第二次机会的领域,会逼出一种工作方式——防御失败情形、在运行时恢复、在设计时预防错误——这是普通软件从不要求的。约束塑造了哲学。(直接影响)
阿波罗计划的系统工程文化。 在一个她的软件必须与硬件、任务控制和人工操作流程相集成的计划中工作,促使她把软件看作若干工程学科中的一门——这恰恰是她把”软件工程”提为”整体系统工程过程”一部分这一框定背后的思路。1(奠基性影响)
她塑造了谁
软件工程这门学科本身。 通过为这个领域命名,并从那个时代风险最高的软件项目内部为它的严谨辩护,汉密尔顿帮助把编程从一件可有可无的事,变成一门拥有规格说明、评审,以及对正确性之期待的工程学科。12
每一个容错的实时系统。 优先级调度、负载卸载、重启回已知良好状态,以及人在回路中的显示器——阿波罗执行程序用来挺过1202警报的那些模式——如今已是有韧性的系统的标准词汇,从飞行控制到让Web服务在过载下存活的监督者,无不如此。36
形式化的、构造即正确的方法。 事前开发与通用系统语言,是这样一脉论证的一部分:正确性应当被设计进去、可被证明,而不是事后测出来——这一论证至今贯穿于形式化方法与模型驱动开发之中。6
贯穿主线
汉密尔顿是本系列中可靠性这一脉络的起点——在这里,”为失败情形而设计”不再是一种偏好,而成了不可妥协的底线,因为有生命系于其上,而这比这个领域其余部分赶上来要早几十年。沃纳·福格尔斯在”一切随时都会失败”之上构建了云,并为行星级规模的优雅降级而设计;汉密尔顿则在一台公文包大小的计算机上为优雅降级而设计,上面还坐着机组人员,并证明了当真正没有第二次机会时,这套信条管用。3 拉迪亚·珀尔曼构建了能够自愈、即便节点说谎也保持正确的网络;汉密尔顿的执行程序则在月球上空实时自愈,干净利落地重启,甩掉损坏的雷达喂给它的谎言。4 而莱斯利·兰伯特把正确性变成你在构建之前精确定义并证明的东西——这恰恰是事前开发所追求的,只是早了一代人,且瞄准的是同一个目标。6 福格尔斯说一切都会失败,所以要在失败中保持可用,珀尔曼说把它构建得能够自愈,而汉密尔顿说得最早、也最坚决:没有第二次机会,所以要在失败发生之前就为它而设计,在失败发生时从中恢复,并把系统构建成让最严重的错误从一开始就根本不可能存在。(系列衔接)
我从中获得的
我从汉密尔顿身上留下的教训,是要把每件事都当作没有第二次机会那样去构建,哪怕明明有第二次机会。我发布的几乎一切,都活在她不曾拥有的那份安逸里:要是坏了,我推个修复就是。那张安全网是真实的,而它悄悄地拉低了标准——它让我先发布顺利路径,再告诉自己日后再处理失败情形,因为日后是存在的。阿波罗是对此的反诘。当你真的无法打补丁时,你会发现”日后再处理失败”从来就不是工程;失败情形才是工程,而顺利路径,不过是系统已经能挺过被破坏之后剩下来的那点东西。所以如今当我构建某样东西时——一个可能被淹没的任务,一个可能被错误调用的API,一条可能在错误时机被走上的路径——我会试着先问”这里那个处在错误位置的雷达开关是什么,这套东西能不能甩掉它并继续飞行?”,再去问顺利路径行不行。一个只能挺过正确输入的系统,是一个我还没做完的系统。
第二条教训是:最值得信赖的错误,是被设计变得不可能的那个。劳伦bug一直留在我心里,因为汉密尔顿是对的,却被”没人会那样做”否决——而宇宙立刻就做了那件事,就在下一次任务上。我的本能是在运行时捕获错误,把危险的调用包在一个守卫里然后继续往前。汉密尔顿更深的一步、她为之付出三十年的那一步,是把系统设计成那个危险的调用根本无法被发起——让坏状态无法被表达,而不仅仅是被检测到。运行时恢复是网;把正确性构建进去,是你脚下站立的地板,让你不需要那张网。我并不总能够到那条标准,但它重构了目标:问题不只是”出错时我会捕获到它吗?”,而是”我能不能把它塑造得从一开始就不会出错?”——而后一个问题,当我能回答它时,永远是更好的那个。
常见问题
“软件工程”一词是玛格丽特·汉密尔顿提出的吗?
玛格丽特·汉密尔顿被广泛认为提出了——或至少推广了——“软件工程”一词,她在20世纪60年代于麻省理工学院仪器实验室领导阿波罗飞行软件工作期间开始使用这个词。12 她有意用它来主张:编写软件理应获得与硬件及其他工程学科同等的正当性与严谨,她解释说自己想”把它与硬件及其他类型的工程区分开来,同时把每一类工程都视为整体系统工程过程的一部分”。1 在当时,软件竟能是”工程”这一想法曾遭到一些一笑置之;如今这个术语标准得几乎隐形,而这正衡量出那场争论被赢得有多彻底。1
阿波罗11号期间的1202和1201警报是什么?
它们是阿波罗制导计算机的执行程序在登月下降的最后几分钟里发出的程序警报。一个设置错误的交会雷达开关导致雷达窃取处理器周期,使执行程序反复调度那些本不该运行的数据处理任务,从而耗尽了全部空闲内存。34 当没有空闲的内存”核心集”时,执行程序发出1202警报;当没有空闲的”VAC区”时,发出1201警报。4 这些警报不是崩溃——它们是执行程序在报告自己被要求做超出能力的事,然后进行分诊。正因为软件采用了优先级调度与重启保护,它舍弃了多余的雷达任务,重启回已知良好的状态,让关乎着陆成败的制导和机组显示器继续运行,着陆最终成功。35
玛格丽特·汉密尔顿为阿波罗计划做了什么?
汉密尔顿于1965年加入麻省理工学院仪器实验室,一路晋升到领导软件工程部,负责运行在指令舱与登月舱阿波罗制导计算机上的机载飞行软件。1 她的团队设计了那套实时执行程序,具备异步优先级调度、重启保护、错误检测与恢复,以及让宇航员始终知情、始终掌控的优先级显示器——正是这套架构,让阿波罗11号的计算机得以挺过1202警报并完成着陆。36 她的总统自由勋章颁奖词称赞她贡献了”异步软件、优先级调度与优先级显示,以及人在回路中的决策能力等概念,为现代超高可靠性的软件设计与工程奠定了基础”。6
什么是”事前开发”?
“事前开发”是汉密尔顿在阿波罗之后于高阶软件公司和汉密尔顿技术公司发展出的系统方法论,围绕着她的通用系统语言(USL)构建。16 它的论点是:不是先构建一个系统、再通过测试去”事后”追猎缺陷,而是把系统定义得如此严谨、如此形式化,以至于整类错误——尤其是她发现主导着阿波罗缺陷的那些接口与集成错误——在构造上就不可能发生。6 这个模型可被证明是一致的,正确的代码可以从中生成,于是缺陷在设计时就被预防,而不是在运行时才被发现。这是她阿波罗信念的形式化方法表达:最值得信赖的错误,是系统压根没机会犯下的那个。
来源
-
“Margaret Hamilton (software engineer),” Wikipedia. Born Margaret Heafield, August 17, 1936, in Paoli, Indiana; BA in mathematics (minor in philosophy) from Earlham College, 1958. Began programming in 1959 in MIT’s meteorology department with Edward Lorenz (LGP-30, PDP-1); worked on the SAGE project at MIT Lincoln Laboratory (~1961-1963) writing software for the AN/FSQ-7. Joined the MIT Instrumentation Laboratory in 1965; directed the Software Engineering Division developing the on-board flight software for NASA’s Apollo program (Apollo Guidance Computer, command and lunar modules). Credited with coining/popularizing the term “software engineering,” which she used “to distinguish it from hardware and other kinds of engineering, yet treat each type of engineering as part of the overall systems engineering process.” Founded Higher Order Software (1976) and Hamilton Technologies (1986); developed the Universal Systems Language (USL) and the “Development Before the Fact” methodology. Received the NASA Exceptional Space Act Award (2003) and the Presidential Medal of Freedom (2016). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
“Scene at MIT: Margaret Hamilton’s Apollo code,” MIT News, August 17, 2016. Discusses the iconic 1969 photograph of Hamilton standing beside the stack of Apollo flight-software listings (taken by an Instrumentation Laboratory staff photographer; the listings were the LM and CM on-board flight software her team produced), and notes she “has been credited with popularizing the concept of software engineering.” Quotes Hamilton on the stakes of the work: “There was no second chance. We knew that. We took our work seriously, many of us beginning this journey while still in our 20s.” ↩↩↩↩↩↩↩
-
“Margaret Hamilton,” NASA Science. Describes Hamilton’s leadership of the Apollo on-board flight software at the MIT Instrumentation Laboratory and the Apollo 11 landing: during final descent the guidance computer became overloaded and threw the 1202 (and 1201) alarms because a misconfigured rendezvous-radar switch fed it spurious work; because the software was designed with priority scheduling that could identify the most important tasks and let them run uninterrupted while shedding lower-priority work, the computer recovered and the landing succeeded. ↩↩↩↩↩↩↩↩↩↩↩
-
“Apollo 11 Lunar Surface Journal: Program Alarms,” NASA Apollo Lunar Surface Journal. Technical account of the 1201/1202 alarms during the Apollo 11 descent. The Apollo Guidance Computer executive scheduled jobs by finding free “core sets” (12-word blocks) and “VAC areas” (44-word blocks); “if there were no VAC areas available, the program would branch to the Alarm/Abort routine and set Alarm 1201. Similarly, if no core sets were available, the program would branch to Alarm/Abort and set Alarm 1202.” A misconfigured rendezvous-radar switch caused spurious radar jobs to be scheduled repeatedly, exhausting the available scheduling memory. Rather than crash, the computer rebooted and “restarted the important stuff, like steering the descent engine and running the DSKY to let the crew know what was going on, but did not restart all the erroneously-scheduled rendezvous radar jobs.” ↩↩↩↩↩↩↩↩↩
-
“Margaret H. Hamilton: Apollo Computer Programmer,” Space.com. Account of Hamilton’s Apollo work and the 1202/1201 alarms: the rendezvous-radar switch left in the wrong position overloaded the CPU during the landing, but the software, intentionally designed with priority scheduling and restart capability, cleared its job queue and restarted, running only the highest-priority tasks (guidance, descent-engine steering, crew display) until the landing completed. ↩↩↩↩↩
-
“President Obama Names Recipients of the Presidential Medal of Freedom,” The White House (Office of the Press Secretary), November 16, 2016. Margaret Hamilton’s citation: “Margaret H. Hamilton led the team that created the on-board flight software for NASA’s Apollo command modules and lunar modules.” It credits her contributions to “concepts of asynchronous software, priority scheduling and priority displays, and human-in-the-loop decision capability, which set the foundation for modern, ultra-reliable software design and engineering.” (Her post-Apollo work – Higher Order Software, Hamilton Technologies, the Universal Systems Language, and the “Development Before the Fact” methodology of building correctness in by construction – is documented in the Margaret Hamilton Wikipedia article cited above.) ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
“In Their Own Words: Margaret Hamilton on Her Daughter’s Simulation,” Hack the Moon (MIT / Draper). Hamilton’s account of the “Lauren bug”: her young daughter Lauren, playing on the command-module simulator, crashed it by selecting P01 (the prelaunch program) during a simulated mid-course flight to the Moon, which wiped the navigation data. Hamilton proposed adding error-detection code to prevent selecting P01 in flight but was overruled on the grounds that trained astronauts would never make such an error; she was permitted only to add a note to the documentation. On the next mission, Apollo 8, Jim Lovell selected P01 in flight and wiped the navigation data, after which the fix was incorporated. Hamilton called it “the Lauren bug.” ↩↩↩↩↩