50年前的程序员女神,用代码把人类送上月球

时间:2021-02-25 00:55:25

1969年7月20日,经过4天飞行的阿波罗11号终于来到了最关键的时刻:降落到月球表面。

50年前的程序员女神,用代码把人类送上月球

就在这个时候,飞船计算机突然开始闪烁报警。

全球6亿人在观看电视直播,NASA飞行控制中心的气氛让人窒息。

人类的首次登月计划面临着艰难的抉择:降落还是放弃。

幸运的是,控制中心的人对飞行控制软件有着高度的信心,指示阿波罗11号继续降落。

50年前的程序员女神,用代码把人类送上月球

飞行控制软件不负众望,它忽略了那些低优先级的情况,专注于最高优先级的任务,引导着阿姆斯特朗和奥尔德林穿过坑坑洼洼的月球表面,成功着陆。

事后分析发现,是因为一个开关被放置到了错误的位置,导致计算机进入了过载的状态。 

那个只有2K内存的计算机既得执行降落所需的计算,又得处理开关错误引起的额外数据。

但是这个程序居然实现了抢占式任务:用高优先级的着陆任务打断了低优先级的,实在太厉害了。

这个飞行控制软件是玛格丽特·汉密尔顿和她的团队编写的。

50年前的程序员女神,用代码把人类送上月球

(代码等身)

这无疑是玛格丽特人生的最高光时刻。

后来乐高公司根据那张著名的照片开发了乐高玩具套装:NASA中的女性,玛格丽特成为其中的一员。

50年前的程序员女神,用代码把人类送上月球

1

2K内存的计算机

玛格丽特1936年出生于美国印第安纳州,后来全家搬到了密歇根,1958年她获得了密歇根大学的数学学士学位,随后她在MIT找了一份工作,成为了一名程序员,开发气象预测软件。

这是软件开发的蛮荒岁月,计算机科学和软件工程还没有建立,一切全靠程序员在工作的实践中学习。

1961年,玛格丽特开始参与国防项目SAGE,协助开发了美国第一个空中防御系统,通过雷达来搜索飞机。

玛格丽特在这个项目上展示自己的天赋:“当一个新人进入项目时,总是会被分配一些没有人能搞清楚的程序,我也被分了一个非常怪异的程序,最早写程序的人甚至用希腊语和拉丁语来写注释!不过我还是成为了第一个让这个程序跑起来的人!”

正是在SAGE项目上的成就让玛格丽特的人生发生了转折。

1965年,她的丈夫在当地报纸上看到了一则消息:NASA正在寻找程序员,开发程序,把人类送上月球。 

50年前的程序员女神,用代码把人类送上月球

玛格丽特非常兴奋:“哇,那我一定得去!”。 

这一年玛格丽特28岁,加入了阿波罗项目,成为了项目的第一个程序员。

阿波罗项目需要开发一个精简的计算机AGC(Appollo Guidance Computer),用来控制登月飞船。

这是一件艰难的任务,因为当时的计算机通常要占据一间屋子,但是AGC被限制到只有一立方英尺那么大。

50年前的程序员女神,用代码把人类送上月球

项目组被分为两拨人,一拨设计硬件,另外一拨开发软件。 

玛格丽特自然成为了软件组的负责人。

AGC只有可怜巴巴的2K内存,36K的ROM,更匪夷所思的是那个ROM是Core rope memory(芯绳存储器?),也就是说,0和1是通过电线和微小的环形磁芯表示。

电线穿过磁芯表示1,没有穿过表示0。

50年前的程序员女神,用代码把人类送上月球

我们现在想把程序存盘,只需要按一个Ctrl + S就可以,但是想把阿波罗飞行软件存盘,只有一种办法:像纺织工那样细心地把电线和磁芯给编织起来。

这个工作不能出一点儿差错,要不然,无论代码写得多么正确,最终都会功亏一篑。

事实上,这个工作的确是由新英格兰纺织厂的女工们完成的,绳索存储器被一些程序员戏称为Little Old Lady memory。

2

软件工程

在NASA工作的大多数软件工程师都是男性,有人在家里照顾孩子,但是玛格丽特没有办法,在周末和晚上她会带女儿劳拉来到办公室。

劳拉经常看到她的妈妈在飞船中扮演宇航员来测试软件,好奇心大起,也想试一试,结果突然间整个系统崩溃了,原来劳拉在飞船“飞行”期间,选择了一个叫做P01的功能。

50年前的程序员女神,用代码把人类送上月球

玛格丽特意识宇航员也有可能犯类似错误,希望修改软件防止它。 

但是NASA的人说,宇航员都是训练过的,绝对不会犯类似错误。当然,修改软件也非常难,想想芯绳存储器!

但是,在阿波罗8号绕月飞行的时候,宇航员恰恰犯了和她女儿一样同样的错误,飞船在太空“迷路”,无法将宇航员送回地球。得知消息的玛格丽特带领团队,突击9个小时,终于让阿波罗8号回到正常轨道。

50年前的程序员女神,用代码把人类送上月球

(支援阿波罗8号)

此后,软件都内置了保护功能,防止类似事件的发生。 

玛格丽特开始将整个阿波罗任务视为一个系统,这个系统由3部分组成:软件,硬件,人。

在开发飞行控制软件的过程中,玛格丽特创造了“软件工程”这一术语,她要赋予“软件”的合法性,就像硬件以及其他类型的工程一样,构建软件的人也应该得到应用的尊重。

在刚开始的时候,大家认为这是一个笑话:软件开发是工程吗? 

随着时间的推移,NASA逐渐意识到,软件工程会成为它们的重要工具,能够抢先苏联一步完成登月。

50年前的程序员女神,用代码把人类送上月球

3

除了成为先行者别无选择

“回想起来,我们是世界上最幸运的人,除了成为先行者别无选择” ---玛格丽特·汉密尔顿

玛格丽特就是软件工程领域的先行者,开发阿波罗飞行软件这种对正确性、可靠性要求极高的软件,没人任何经验可以遵循,没有任何学校可以学习,软件不仅要工作,而且必须第一次就正确工作。软件不仅要可靠,而且必须能进行实时的错误检测和恢复。

玛格丽特带领团队出色地完成了这个软件,在关键时刻把人类送上了月球。

2016年11月22日,玛格丽特获得了奥巴马总统颁发的总统*勋章,以表彰她在阿波罗登月任务开发机载飞行软件所做的工作,以及对软件工程的基础性贡献。

50年前的程序员女神,用代码把人类送上月球

玛格丽特说:当我想了解新事物或者做新东西的时候,一定不要让恐惧成为障碍。

一个人不应该害怕说“我不知道”,“我不理解”,或者问“愚蠢的问题”。

即使事情看起来不可能,即使所谓专家说这不可能,也要继续下去。

不要害怕犯错,只有敢于失败的人才能取得更大的成就。

(完)

后记:今天三八节,按照惯例,我会我会写一篇女性程序员的故事,前两年的引起了很大的反响,没看过的同学点击下方图片就可以查看。

最后,向了不起的程序媛们致敬!女神节快乐!

50年前的程序员女神,用代码把人类送上月球

50年前的程序员女神,用代码把人类送上月球