1936年,玛格丽特出生于美国一个普通的家庭。大学时,她主修数学。读书期间,她嫁给了詹姆斯·汉密尔顿。毕业后,玛格丽特找了一份教师的工作。那时,她的丈夫还在哈佛法学院读书,她因而承担起了家庭的重任。
正当两人的的小日子过得紧紧巴巴时,一个工作机会摆在了玛格丽特面前,当时计算机科学的先锋MIT里有一个实验室在招临时编码工,玛格丽特抱着试试看的态度,就这样踏进了程序员的殿堂。
一边看孩子一边写程序
一开始,她为天体学系写天气预报系统的代码,后来又去了大名鼎鼎的林肯实验室,为美国军方SAGE项目写代码——用电脑程序帮助侦查危险的“不友好的飞行物”。
这些毫无头绪的程序有多难处理呢?对此,当时有人用希腊语和拉丁语写评论来取乐。而玛格丽特是全实验室第一个解决问题的人,她还把调试方法翻译成希腊语和拉丁语,漂漂亮亮地回敬了一发。
玛格丽特的女儿劳伦也在这时出生了,繁忙的妈妈不得不将小劳伦带去工作,让她睡在实验室的地板上,醒来后则独自玩耍。
当时,人们对这样一个“工作狂妈妈”十分不理解,但玛格丽特并不在意,她热爱着这份虽然枯燥却充满挑战和“神秘感”的工作。
挽救飞船的“不重要”程序
由于出色的表现,玛格丽特获得了另外一个机会:加入MIT的Charles Stark Draper实验室,带领一个小团队为NASA的阿波罗计划写软件。
在阿波罗最初的预算报告中,根本就没有“软件”二字。不过后来,NASA意识到了软件的重要,逐渐把软件相关的团队扩大到了400多人。但玛格丽特依然是一个无名小卒,她负责的是整个计划中最不受重视的部分:“万一”任务失败之后的后备方案,连这个部分的名字,都被称作“Forget it”。
“我想为整个系统中加入一旦人工出错之后的备用纠错方案,”玛格丽特说,“但是他们不同意。他们说,宇航员们都经过了严格的、完美的训练,‘绝对不可能出错。”
那时,计算机的存储空间和计算能力都十分有限,决策者不希望有任何“累赘”的部分。玛格丽特无奈,只好在操作系统里做了一个备注:“不要在飞行时选择P01模式”。
但坏事儿还是发生了。在阿波罗8号环绕月球任务中,宇航员罗威尔一时疏忽,按下了P01模式,所有巡航数据都被清空了,飞船分分钟迷路。休斯顿紧急打来电话,玛格丽特领着一群程序员,连夜奋战了9个小时,才修复了这个问题,使阿波罗8号得以成功返航。
而真正的考验还在后面。随着登月计划紧锣密鼓的进行,美国政府和NASA都绷紧了弦。玛格丽特的加班也越来越多。而成就总是伴随着错误和风险——就在阿波罗11号历史性着陆月面的3分钟前,忽然警报大作,轨交雷达发来的大量数据涌入电脑存储区,快把电脑弄崩溃了。而若是系统崩溃,飞船将毫无悬念地坠毁在月球上。
但是,玛格丽特设计的系统顶住了这个压力。在大量数据涌入电脑时,最宝贵的计算资源被用于最关键的部分,比如安全登陆,而处理不重要的雷达交互数据的任务被砍掉。
这次事件,促使她提出了后来的“异步程序”概念,即程序可以不用等待当前任务响应,先处理其他任务,待到任务处理完成之后再接受任务完成的通知。这可以提高计算效率,防止程序被卡死。
玛格丽特拯救了人类的登月计划,不仅是因为她的聪明,更是因为她的努力和心思缜密,她的团队在每次程序确定之后,都会一遍遍严格地测试,使用模拟器来模拟登陆状况。许多问题她早就考虑到了,毕竟“不出错”永远都是一个理想状态。
“软件工程”的诞生
在那个年代,程序员工作系统化程度很低,如果出现了错误,大多数都是潦草地在“出错理由”里面填一个“有bug”来解决。但玛格丽特认为这远远不够,她认为程序员需要理解错误,梳理错误的原因,并防止下一次程序出错。
此时,写程序更像是一门手艺,完全没有“软件工程”的概念,而玛格丽特用自己的实践,赋予了这个词现实的意义。她开始用“软件工程师”来称呼她在内的程序员,在她的推动下,“软件工程”成了一门更规范、更系统的科学——玛格丽特将软件工程这份事业提升了一个高度。
离开NASA的玛格丽特自立门户,她在自己所涉及到的许多领域,都有创见——比如系统设计、软件开发、过程模型、开发范式、软件可靠性、周期自动化等。
是的,人们不应该忘记,那个在层叠的代码背后时常沉默的女孩,也不应忘记那些为早期计算机事业付出辛劳的前辈们——请记住他们,然后在他们铺下的道路上继续前进。(编辑/夏冬)