查看原文
其他

这个美女程序员写的代码,带人类成功登月

2017-01-22 程序员的那些事

(点击上方公众号,可快速关注)

来源:伯乐在线专栏作者 - 辛文鹏

http://blog.jobbole.com/97936/

如有好文章投稿,请点击 → 这里了解详情



玛格丽特·汉密尔顿在 MIT 博物馆


玛格丽特·汉密尔顿(Margaret Hamilton)没有想着要发明现代软件的概念,并且还让人类登陆月球。那是1960 年,还是一个不鼓励女性从事高技术工作的年代。汉密尔顿是一个24岁的数学学士,她在 MIT 找到一份程序员的工作,本来的计划是支持她丈夫哈佛法学院 3 年学业,然后就轮到她去读一个数学研究生学位。


但是阿波罗空间项目开始了。汉密尔顿在实验室开创了工程技术方面的史诗壮举,帮助改变了人类 —— 和数字技术 —— 能力所及的未来。


玛格丽特·汉密尔顿在阿波罗指令舱实体模型内


1960年代,作为一个有工作的妈妈,汉密尔顿是不寻常的;但是作为一个太空船程序员,汉密尔顿极其激进。汉密尔顿周末和晚上会把女儿劳伦带到实验室。4岁的劳伦睡在查尔斯河畔的办公室地板上时,她妈妈在一边编程,创造着最终将会装入阿波罗指令舱计算机中的程序。


玛格丽特·汉密尔顿站在阿波罗导航计算机 (AGC) 源码清单旁,代码届的「著作等身」


“人们过去经常和我说,‘你怎么能撇下你的女儿?你怎么能这么做?’” 汉密尔顿回忆说。但她喜爱这份工作的神秘新奇。她喜欢同志情谊——下班后在 MIT 职员俱乐部的小酌;极客开的玩笑,比如说她走廊周边“左负转移”。局外人摸不着头脑。但在实验室,她说,“我是小伙子们的一份子。”


1962年4月19日,玛格丽特·汉密尔顿跟一位前同事一起。汉密尔顿当时在林肯实验室在第一台 AN/FSQ-7 计算机上开发软件。她的软件是个雷达定位监控程序,用来侦查潜在的敌机。


然后,现在看,“小伙子们”主导了技术和工程领域。像今天充满多样性挑战的技术产业中的女程序员一样,汉密尔顿是个特例。这会令今天的软件从业者惊诧,他们男孩俱乐部的创立者之一实际是个母亲——这应该让他们停下来思考为什么《广告狂人》时代的性别不平等持续到今天。


“当我最初从事这个,没有人知道我们在干什么。这里就像是蛮荒西部。”——玛格丽特·汉密尔顿


汉密尔顿和她的女儿劳伦


当汉密尔顿的职业生涯开始起航,软件世界由于约翰·肯尼迪 1961年启动阿波罗项目而处在大爆发的边缘。在汉密尔顿工作的 MIT 仪器实验室,当她和同事们为世界上第一个便携式计算机编写代码时,他们实际上在发明计算机程序编程的核心理念。她成为系统编程的专家,并且在重要的技术争论中胜利。“当我最初从事这个,没有人知道我们在干什么。这里就像是蛮荒西部。没有现成的课程,他们没有讲授过这个。” 汉密尔顿说。


汉密尔顿(左一),在支援阿波罗八号任务时,在综合分析室与部分同事在一起


这一切距离微软公司成立有十年,距离马克·安德森发现软件事实上“在吞噬着世界”近半个世纪。在阿波罗时代,这个世界根本没有对软件思考那么多。原始文档列出阿波罗计划的工程需求,甚至没有提到软件一词,MIT 航空学教授戴维·闵代尔在他的《数字化阿波罗》一书中写道,“软件没有在计划之列,甚至没有包含在预算内。”至少起初没有。


但当阿波罗计划展开,在完成任务中软件的中心性开始变得清晰。1965 年,汉密尔顿开始负责阿波罗计算机的机载飞行软件。这是一个令人兴奋的时刻,整个美国依赖着她所做的工作。但有时压力使汉密尔顿彻夜难眠。一次午夜聚会后,她冲回计算机实验室,校正一段她突然意识到的缺陷代码。“我总是想象报纸的头条新闻,他们会倒查问题是怎么发生的,最终会倒查到我。”


到1968 年中期,400 多人在从事阿波罗的软件开发工作,因为软件将是美国赢得登月竞赛的手段。当然,实际情况表明软件将帮助世界做的更多。汉密尔顿和同事们在为阿波罗宇宙飞船编程的时候,他们也在孵化一个价值4000亿美元的产业。


一个雷神的工人在把铜线穿到电磁环上


对汉密尔顿而言,编程就是要在一堆堆穿孔卡片上打眼,卡片在巨大的霍尼韦尔大型机上做整晚的批处理计算,模拟阿波罗着陆器的工作。“我们必须在阿波罗起飞前模拟所有的一切,” 汉密尔顿回忆。一旦代码固定下来,就会被载往附近的雷神(Raytheon)工厂,那里有一群妇女,阿波罗计划称为“小老太太”的专业女缝工,把铜线穿过电磁环(穿芯的线是1;绕芯的线是0)。忘记 RAM 或硬驱;在阿波罗上,内存是实打实地硬线联接,几乎牢不可破。


雷神工厂的“小老太太”们


阿波罗载有两个近乎一样的机器:一个在登月舱——着月的老鹰号——另一个载着宇航员往返地球的指令舱。这些70磅的阿波罗号计算机是有别于其他的便携式计算机。由 MIT工程师哈尔·莱宁和汉密尔顿的老板狄克·巴顿设计,这是最早使用集成电路而非晶体管的重要计算机之一。就像闵代尔讲的,它是第一个计算机机载导航系统,设计为由人来控制,但是具备“电传操纵系统”自动驾驶技术——当今喷气客机标配的计算机导航系统前身。



这个系统在永久存储器里存储12,000 多个“字”——雷神工人穿的那些铜“缆”——在可擦写存储器中有 1,024 个字。“这是第一次,在宇宙飞船内设置重要计算机,并为任务赋予许多职责,”曾在 MIT的仪器实验室为登月舱写代码的唐·埃尔斯说。“我们证明了这是能够做到的。我们以在今天看来异常小的内存而且非常慢的计算速度完成了。”没有它,内尔·阿姆斯特朗到不了月球。并且,没有汉密尔顿、埃尔斯和MIT工程师团队写的软件,计算机就是一废品。


这一点在1969年7月20日变得显而易见,就在阿波罗11号在月球“静海”着陆前的几分钟。由于阿波罗软件工程师唐·埃尔斯所说的“文档错误”,阿波罗的计算机在这个任务的关键阶段开始报出令人担心的错误信息。但这正是汉密尔顿和同事们赢得的技术争论拯救了那一天。错误信息弹出来,因为计算机负载过重,进行了一系列不必要的运算,实际上,最需要做的是将登月舱着陆月面。而休斯顿这边的工程师们知道,依靠阿波罗独特的异步能力,计算机会集中处理手头的任务——将老鹰号降落在静海。当软件认识到没有足够的空间处理所有的它要做的功能,它通过错误检测处理,专注于优先级最高的工作,汉密尔顿说。


「这是永远不会发生的」


一天,劳伦在玩 MIT 指令舱模拟器的显示器键盘单元,昵称 DSKY (读dis-key)。当她摆弄键盘时,一条错误信息弹出来。当模拟器处于飞行中,劳伦启动了一个叫 P01的发射前程序,使模拟器崩溃。宇航员无论如何都不会这么做,但是,汉密尔顿想增加代码来预防崩溃。这个想法被 NASA 否决。“我们被多次告知,宇航员不能犯任何错误,”她说。“他们训练得完美无缺。”于是,汉密尔顿转而建立了一条程序标注 —— NASA的工程师和宇航员都能看到的一个程序文档附言,上面写着:“飞行中不要选择P01”。汉密尔顿想把错误检查代码添加到阿波罗系统,防止系统混乱。但这在她的上司看来是多余的。“所有人说,‘这是永远不会发生的’” 汉密尔顿回忆道。


但这的确发生了。刚好就在1968 年圣诞节前后——阿波罗8号第一次载着宇航员到月球有人轨道飞行的历史时刻的第五天——宇航员吉姆·拉威尔在飞行中无意中选择了P01。当休斯顿的电话打进来,汉密尔顿正在仪器实验室的二楼会议室。启动 P01 程序擦掉了拉威尔收集的所有的导航数据。这可是个问题。没有这些数据,阿波罗计算机没法把宇航员带回家。花了九个小时钻研桌子上厚达8英寸的程序清单后,他们想出了一个方案。休斯顿只要上传新的导航数据,一切就会恢复正常。感谢汉密尔顿——还有劳伦——阿波罗号宇航员回家了。


也感谢汉密尔顿和她开创的工作,关于人类能够做什么、成为什么这个问题,不仅在外太空被改写,更给地球带来深刻变革。软件工程学,这个汉密尔顿开创的概念,从登月到所有人类活动,都找到了用武之地。到了20世纪70年代,汉密尔顿离开了NASA和阿波罗计划,之后创建和领导过多个软件公司。今天,距离她的公司汉密尔顿科技几条街就是麻省理工,那个她的事业开始的地方——那个代码革命的中心,仍然在仰望着星空。


看完本文有意思?请分享给更多人

关注「程序员的那些事」,编程更有趣

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存