今天,奥巴马颁发了他任内最后一批美国自由奖章(美国授予公民的最高奖)。在迈克尔.乔丹、比尔.盖茨等人之中,有位特别的获奖者,她叫做玛格丽特.汉密尔顿。她是一个女程序员,一个曾经挽救了阿波罗登月计划的程序员。虽然现在程序员看似是个男女数量极其不平均的岗位,但就在不远的过去,在计算机拓荒的年代,却是有不少女性程序员为此贡献了智慧与青春。
玛格丽特·希菲尔德·汉密尔顿(Margaret Heafield Hamilton)就是其中一个。
玛格丽特本姓希菲尔德。她1936年生于美国一个普通家庭,普通地读完了高中和大学,主修数学。在读书的时候,她嫁给了詹姆斯·汉密尔顿(James Cox Hamilton),成了汉密尔顿太太。她毕业之后找了一份教师的工作,教数学和法语。那时候,她的丈夫还在哈佛法学院读书,她勇敢地承担起了家庭的责任。
不过,她读书深造的愿望并没有因此熄灭。待丈夫安定下来,两人一起搬去了波士顿,玛格丽特准备去再读一个抽象数学的学位。然而,两人的小日子还是太紧张了。此时一个工作机会摆在了她面前。当时计算机科学的先锋MIT里一个实验室在招临时编码工。玛格丽特抱着试试看的态度,就这样踏进了程序员的殿堂。
一开始,她为天体学系写天气预报系统的代码。
因为工作出色,转为正式工,后来又去了大名鼎鼎的林肯实验室,为美国军方SAGE项目写代码——在冷战之弦拉得最紧的1960年代,用电脑程序帮助侦查危险的“不友好的飞行物”。那时候还没有“软件工程”这个学科,更没有“软件工程师”这种高洋上的名头,没人像今天的“计算概论”一样教,辛苦在计算机硬件上直接编写程序的程序员们,就像从前的手工业工人一样,靠的大多是一点点摸索出来的经验。
而一张白纸的玛格丽特,面前的都是前人扔给她的棘手程序。这些毫无头绪的程序有多难处理呢?前人不得不用希腊语和拉丁语写评论来取乐。而玛格丽特是全实验室第一个解决问题的人,还把调试方法翻译成希腊语和拉丁语,漂漂亮亮地回敬了一发。
玛格丽特的女儿劳伦(Lauren),也在这时候出生了。繁忙的妈妈玛格丽特不得不将小劳伦带去工作,让她睡在查尔斯河畔实验室的地板上,醒来的时候兀自玩耍。
当时的人们对于这样一个“工作狂妈妈”十分不理解。“你怎么这么不顾你的小孩?”玛格丽特并不在意。她热爱着她这份虽然不时枯燥,但却充满挑战和“神秘感”的工作。她也喜欢着实验室,喜欢每个人开的极客冷笑话,工作结束之后和每个人去喝酒。“就跟实验室里其他男孩子一模一样。”而勤奋的玛格丽特,还会在喝完酒之后,忽然想起程序里的一个小错误,连夜飞奔回实验室修改。
由于出色的表现,玛格丽特获得了另外一个机会:加入MIT的Charles Stark Draper实验室,带领一个小团队,为NASA的阿波罗计划写软件。在阿波罗的最初的预算报告中,根本就没有“软件”二字。不过后来,NASA意识到了软件的重要,逐渐把软件相关的团队扩大到了400多人。但玛格丽特依然是一个无名小卒。她负责的,大概是整个计划当中最不受重视的部分:“万一”任务失败之后的后备方案。
但所有人都不重视,觉得这不可能发生。连这个部分的名字,都被称作“Forget it”。“我想为整个系统中加入一旦人工出错之后的备用纠错方案,”玛格丽特说,“但是他们不同意。他们说,宇航员们都经过了严格的、完美的训练,‘绝对不可能出错’。”也的确,那时候计算机的存储空间和计算能力都十分有限,决策者不希望有任何“累赘”的部分。
玛格丽特无奈,只好在操作系统里做了一个备注,“不要在飞行的时候选择P01模式”。
但是,坏事儿还是发生了。阿波罗8号环绕月球的任务中,宇航员罗威尔(Jim Lovell)一时疏忽,按下了P01模式,所有的巡航数据都被清空了,飞船分分钟迷路。接到休斯顿紧急打来的电话之后,玛格丽特领着一群程序员,连夜奋战了9个小时,过了每一行代码,修复了这个问题,数据被重新上传上去。阿波罗8号得以成功返航。
而真正的考验还在后面。随着登月计划紧锣密鼓的进行,美国政府和NASA都绷紧了弦,苏联就在背后,一刻也不能停止。玛格丽特加班工作的时候也越来越多了。而成就总是伴随着错误和风险——就在阿波罗11号历史性着陆月面的3分钟之前,忽然警报大作,轨交雷达发来了大量的数据涌入电脑存储区,快把电脑弄崩溃了。若是系统崩溃,飞船将毫无悬念地坠毁在月面,“人类的一小步”可能是一个大坑和两条生命。
但是,玛格丽特设计的系统顶住了这个压力。在大量的数据涌入电脑的时候,最宝贵的计算资源,被用于最关键的部分,比如安全登陆本身,而处理不重要的雷达交互数据的任务被砍掉,让程序可以随时中止低优先级任务,专注于高优先级任务。
这次的事件,也让她提出了后来的“异步程序”的概念。即程序可以不用等待当前任务响应,先处理其它任务,待到任务处理完成之后再接受任务完成的通知。这也提高计算效率,防止程序被卡死。
用开发术语来说,玛格丽特的程序“鲁棒性”(Robust)非常高,在出错的时候更稳定、更可靠。玛格丽特拯救了人类的登月计划。她不仅努力、聪明,而且心思缜密,她的团队在每次程序确定之后,都会一遍遍严格地测试,使用模拟器(尽管还非常初级、简陋)来模拟登陆状况。许多问题她早就考虑到了,毕竟“不出错”永远都是一个理想状态。
当时的程序员们工作系统化程度很低,如果出现了错误,程序员们就潦草地往“出错理由”里面填一个“有bug”完事儿。玛格丽特认为这远远不够。她认为程序员们需要理解错误,梳理错误的原因,并防止下一次程序出错。这种我们现在看来完全是常识的东西,在计算机的“蛮荒年代”,需要一颗清醒而负责的头脑来制定最初的规范。
玛格丽特打趣说,自己如此努力,是因为“不想在报纸头版头条上看到‘阿波罗计划失败,玛格丽特团队难辞其咎’”。“责任感”三个字,或许在她身上,比什么都清晰。这就是她写的代码,反复修改的版本,几乎快要超过她娇小的身躯了。就是这些代码,写好之后打印出来,然后被送到另外一个小工作室,在那儿有一帮精于针线活儿的女士,用铜圈“写”到硬件上……(也不要再想当然地说计算机是男人的事业了。
)“软件工程师”一个程序员的自我修养勤奋,充满责任感,又一直对自己的事业抱有热爱。这就是一个软件工程师的自我修养。
前面不是说到,那个年代不是还没有“软件工程”的概念么?在玛格丽特之前,写程序是一门手艺,仿佛变法术或者凭经验拼凑一般,而且没有实体的东西产出——感觉就像在写文章,没人称呼一个作者为“文字工程师”吧。而玛格丽特用自己的实践,赋予了这个词全新的现实意义。
她说,“希望给予给做软件的人们以尊重,与做硬件和其它的人一样,在这个宏大的工程里各司其责”。她开始用“软件工程师”来称呼她在内的程序员。一开始,大家都带着一点开玩笑的态度在用这个词,然而,在她的推动下,“软件工程”成了一门科学,更规范、更系统,玛格丽特将程序员这份事业提升了一个高度。玛格丽特团队写的程序框架,也用在了许许多多其它的太空计划、乃至后来的客机系统上,就连你坐的飞机,也该感谢她的代码呢。
而她在自己所涉及到的许多领域,都有创见——比如系统设计、软件开发、过程模型、开发范式、软件可靠性、周期自动化等等等等。当时400人团队所做的事,已经转化为规模超过4000亿美元的巨大产业。然后我们现在的程序员们,就有了“软件工程师”这个真正的工程师头衔。
离开NASA的玛格丽特自立门户,继续在软件工程领域发光发热,2003年,她因技术和科学贡献获NASA杰出太空行动奖(Exceptional Space Act Award。该奖奖金37,200美元,是美国宇航局史上对个人的最大奖赏)。今天,她由赢得了总统颁发的美国自由勋章。——是的,人们都不应该忘记,在层叠的代码背后,那个时常沉默的女孩,也不要忘记为早期的计算机事业付出辛劳的女性们。
即使现在也一样。记住你的前人,然后在她/他们铺下的道路上前进。