代码传奇 | 明明可以靠颜值 却用代码把人类送上了月球的女人——Margaret Hamilton


据说「软件工程师」这个名词就是她发明的


玛格丽特站在阿波罗计算机指导手册 (AGC) 的源代码程序列表旁边,这些材料摞起来比她的人还要高。图片来源:Margaret Hamilton


缔造传奇的人似乎有个共性:本来没想干一票大的,甚至她的打算都只是相夫教子,却“一不小心”把人类送上了月球——在 1960 年代做职场妈妈已经是件很不寻常的事,而玛格丽特竟然还是个给太空飞船写代码的程序员。可以说,没有Margaret Hamilton,就没有阿姆斯特朗的一小步和人类的一大步。


  • 那时的周末或者平常夜晚,玛格丽特会把女儿劳伦带来实验室。在俯瞰查尔斯河的办公室里,四岁的劳伦在地板上熟睡,而玛格丽特忙着编写代码——这些代码,最终都会添加到阿波罗控制舱的计算机里

  • 那时阿波罗登月计划启动了,玛格丽特在实验室带领一次史诗般的工程壮举,这项工程将改变人类和科技的未来

  • 那时离微软的出现还有 10 年,离马克·安德森 (Marc Andreessen,这家伙是世界上最早开发浏览器的人) 发现软件正在「吞噬世界」也还有将近 50 年。


玛格丽特躺在阿波罗控制舱的模拟器内,图片来源:Margaret Hamilton


玛格丽特和她的女儿劳伦,图片来源:Margaret Hamilton


舞会皇后 Margaret Hamilton


1954 年,她从汉考克高中毕业,随后入读厄勒姆学院,并于四年后取得学士学位,专业是数学,辅修哲学


在这段黄金岁月里,风华正茂的美丽姑娘玛格丽特在厄勒姆学院认识了詹姆士·考克斯·汉密尔顿。在很多人眼里,他只是个不起眼的男孩。而玛格丽特早就在校园里声名远播,已享有「舞会皇后」的美名。爱神丘比特射中了这对璧人,他们不久后便结婚了。


毕业后,玛格丽特·汉密尔顿一边在高中教数学和法语,一边等着丈夫拿到学士学位。之后,他们搬到波士顿,玛格丽特在布兰代斯大学做抽象数学方面的研究。


然而,两个人的小日子还是太紧张了,此时一个工作机会摆在了她面前,当时计算机科学的先锋MIT里一个实验室在招临时编码工。玛格丽特抱着试试看的态度,就这样踏进了程序员的殿堂。


一开始,她为天体学系写天气预报系统的代码,因为工作出色,转为正式工。后来又去了大名鼎鼎的林肯实验室,在这里,玛格丽特给北美防空司令部的半自动地面防空系统项目工作。期间为第一台 AN/FSQ-7 作战指挥中央系统编写探测敌方飞行的软件。


阿波罗飞行控制软件背后的大脑


玛格丽特的事业发展渐渐上了轨道,而此刻的软件世界——由于肯尼迪在 1961 年发起的阿波罗登月项目——也身处巨变的边缘。玛格丽特就职于 MIT 的仪器实验室,在那里,她和同事一起为世界上第一部便携式计算机写代码,同时也创造了计算机编程的核心理念。玛格丽特成了系统编程的专家,也在多场重要的技术争论中得到认可。「我最开始研究编程的时候,没人知道我们在干嘛。我们就像身处美国荒凉的大西部,没有这样的课程,也没有任何一个教授教这个」,玛格丽特说。


左下角的是玛格丽特,她和其他同事正在MIT为阿波罗8号提供后方支持。图片来源:Margaret Hamilton


1965年,玛格丽特开始负责“阿波罗”号计算机的飞行软件。对玛格丽特而言,这是一段激动人心的日子,整个美国都指望着她的工作成果。但是有时候压力也会让她夜里睡不着。


有一次,在参加过一个深夜派对之后,玛格丽特又冲回实验室去修改一段突然想起来出错了的代码。「我总是在幻想报纸的新闻标题,它们会追问错误是如何发生的,而最终原因会指向我」。


软件成了美国要赢登月竞赛的重要筹码。在 1968 年,已经有超过 400 人参与研发阿波罗号的软件。当然,最终人们发现软件为世界带来的远超于此。当玛格丽特和同事在为阿波罗飞船编程的时候,他们也在孵化这个未来估值 4000 亿美元的产业。


获总统自由勋章


一天,劳伦在摆弄 MIT 控制舱模拟器的显示器键盘一体机 DSKY。当她在键盘上乱按的时候,一条错误信息突然出现。劳伦不知怎地启动了一个叫做 P01 的预运行程序,原本正在飞行状态的模拟器一下子崩溃了。


虽然一般来说宇航员不会犯这样的错,但玛格丽特还是想加一段代码防止这种状况的发生。这一提议被 NASA 否决,「他们一遍又一遍地跟我说宇航员不会犯任何错误,他们被训练得近乎完美,」玛格丽特说。她转而加了一句程序说明,所有 NASA 工程师和宇航员都能看到:「不要在飞行过程中按下 P01」。她回忆说,「所有人都说,『那样的事情永远都不会发生』。」


但事情的的确确发生了。时间大约在 1968 年的圣诞节,进入阿波罗 8 号飞船的第五天飞行,宇航员吉姆·洛威尔 (Jim Lovell) 不小心在飞行中启动了 P01 程序。当电话从休斯顿打来的时候,玛格丽特正在仪器实验室的 2 层会议室。启动 P01 程序导致此的导航数据全部清空,阿波罗计算机无法计算出如何返回地球。


玛格丽特和 MIT 的程序员们需要想出一个补救的办法,必须是无错漏的完美办法。在花费 9 小时钻研过面前 8 英寸厚的程序列表后,他们有了一个计划。休斯顿方面需要上传一份新的导航数据,而后一切都会顺利进行。多亏了玛格丽特,还有调皮的劳伦,阿波罗号上的宇航员才得以重返地球。


她做了一个最美的人生选择


时至今日,当你看到玛格丽特的照片,她的美丽跨越了时代和国籍,你仍然会惊叹于她出众的外貌。


她甚至在 1969 年就已经引领了黑丝连衣裙的流行女神装扮,中年之后的她依然美丽知性。



到 1970 年代,玛格丽特已经超越了之前在 NASA 和阿波罗计划中的研究。她后来成立并领导了多家软件公司。如今她的公司汉米尔顿科技距离她开始职业生涯的地方只有几个街区远——MIT,那个至今仍引领代码革命、仍然仰望星辰的地方。


在当今「网红」遍布的喧嚣时代,颜值似乎是你通向康庄大道的捷径。然而,那个时代的她选择用才华征服这个世界,走了一条特立独行的人生之路。她不为自己的美貌所累,而选择了一条苦逼程序员的职业生涯,而且她还领导了堪称为人类历史上最伟大的软件工程项目


明明可以靠颜值,她却偏偏拼代码。玛格丽特·汉密尔顿,这个集智慧、美貌于一身的女子,告诉我们,最美的一条人生之路是用你的智慧为这个世界带来一点点改变。


转自:程序人生

素材整理自:新浪科技、网易数码、百度百科。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 ASP.Net Core 中使用 NCache

虽然 ASP.Net Core 中缺少 Cache 对象,但它引入了三种不同的cache方式。内存缓存分布式缓存Response缓存Alachisoft 公司提供了一个开源项目 NCache,它是一个高性能的,分布式的,可扩展的缓存框架,NCache不仅比 Redis 快…

oracle 动态游标行数,oracle动态游标的简单实现方法

下面就是例子程序--明细表打印予处理 通用报表:procedure mx_print_common(pd_id in mx_pd_syn.pd_id%type,p_pd_mxb_id IN mx_pd_mxb_syn.p_mxb_id%type,p_dept_no IN sc_mxk.dept_code%type,p1 sc_bz_syn.bz_code%type,p2 sc_cjjc_syn.cjjc_code%type,p3 sc_mxk.…

每扇区2048字节的U盘乱码的数据恢复

每扇区2048字节的U盘乱码的数据恢复一个U盘,FAT32分区,显示的是乱码,远程看对方的U盘参数,发现一个比较怪的现象:每扇区字节数是2048字节(U盘量产时可能是以光盘形式形成的),对方传的…

为什么有些大公司的效率弱爆了?

阅读本文大概需要5分钟。上周写了篇文章:为什么有些大公司的技术弱爆了?不少朋友读完后表示有同感,还有一些朋友在读者群探讨大公司效率问题。有几个朋友谈到自己的公司效率低下,做一件事需要层层审批,并且遇到各种阻力…

2018年最有前景的十大行业

我们想和大家分享的是围绕十个行业、数十个细分领域,在2018年发展趋势展望:01 消费新零售——平台级近半年,新零售已被多次提及。但在年终盘点我们再次提到这个“热词”,是因为该领域未来还将出现超级平台级的公司。新零售未来更多…

oracle 监听 无法连接,解决ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务...

你还有可能是遇到了定时的问题。如果监听器被重新启动,那么数据库实例就必须向它重新注册。通常情况下,每60秒就会出现这样的问题。如果你迫不及待,那么就以数据库管理员的身份登录到数据库服务器,并且运行“更改系统注册器”&…

下列选项中 采用边界值平滑_数据挖掘期末考题(答案).doc

华南理工大学计算机科学与工程学院2012—2013学年度第二学期期末考试《数据仓库与数据挖掘技术》试 卷(假的)专业:计算机科学与技术 年级:2010 姓名: 学号:注意事项:1. 本试卷共四大题,满分100分&#xff0…

昨日搬至办公室的书籍

由于家里地方小,总有一部分书籍需要跟着我辗转至各公司。其中一些公司只能让我放抽屉(地方小)甚至地板上,而有一些公司就能让我把书都摞桌子上。昨天下午我特地来了一次办公室,只为搬运书籍。灭霍霍,可真是…

如何在 ASP.Net Core 中对接 WCF

在 REST API 出现之前,SOAP (Simple Object Access Protocol) 一直都是基于 web 的标准协议,虽然现在 REST 大行其道,但在平时开发中总会遇到对接第三方服务采用的是基于SOAP协议的场景,在这篇文章中,我们将会讨论如何…

什么是区块链? 区块链的入门教程~

区块链(blockchain)是眼下的大热门,新闻媒体大量报道,宣称它将创造未来。可是,简单易懂的入门文章却很少。区块链到底是什么,有何特别之处,很少有解释。下面,我就来尝试,…

linux提升权限命令提示符,win10如何直接使用命令提示符提高管理员权限?

原标题:win10如何直接使用命令提示符提高管理员权限?在使用普通的命令提示符时,如果遇到需要管理员权限的操作,往往需要重新打开一个具有管理员权限的命令提示符页面进行操作。而在Linux操作系统中,可以通过输入su来获取系统最高…

require引入js vue_请教 关于使用require 引入vue 和公共js的问题

移动端布局 计算font-size的1、引入公共样式失败。没有去计算2、aa 是vue 引入成功。 但是 我以后一个文件需要一个vue 文件 应该怎么引入好点啊。 怎么分解开进行引入?3、在vue的情况下。 引入Mint UI我理解是在main的文件里面加载vue Mint ui 和一些公共样式。 在页面引入ma…

探索 .NET Core 依赖注入的 IServiceProvider

在上一篇文章中,我们学习了Microsoft.Extensions.DependencyInjection中的IServiceCollection,包括服务注册转换为ServiceDescriptors,然后添加到集合中。探索 .NET Core 依赖注入的 IServiceCollection[1]在本文中,我们会学习 IS…

《WinForm开发系列之控件篇》Item1 BackgroungWorker

cranejuan的专栏 BackgroundWorker实现原理 winfom組件---BackgroundWorker转载于:https://www.cnblogs.com/Sue_/articles/1657254.html

如何快速高效地学习互联网新技术

我们生活在一个振奋人心的时代,区块链、人工智能、大数据,现在各种新技术层出不穷,那么如何快速高效地学习互联网新技术呢?我认为首先思想要主动求变,敢于跳出自己的舒适区,对任何技术都抱有开放的心态。贪…

linux上用的端口转发工具,linux下最简单好用的的端口转发工具

linux下最简单好用的的端口转发工具解压安装tar zxvf rinetd.tar.gzmakemake install编辑配置vi /etc/rinetd.conf0.0.0.0 8080 172.19.94.3 80800.0.0.0 2222 192.168.0.103 33891.2.3.4 80 192.168.0.10 80说明一下(0.0.0.0表示本机绑定所有可用地址)将所有发往本机8080端口的…

.NET Core用数据库做配置中心加载Configuration

本文介绍了一个在.NET中用数据库做配置中心服务器的方式,介绍了读取配置的开源自定义ConfigurationProvider,并且讲解了主要实现原理。1、 为什么用数据库做配置中心在开发youzack.com这个学英语网站的时候,需要保存第三方接口AppKey、JWT等配…

abaqus质量缩放系数取值_ABAQUS/Explicit质量缩放(MASS SCALING)使用心得  [转simwe]...

概要准静态分析或某些动态分析中,少数尺寸较小的单元控制稳态时间增量,为提高计算效率,ABAQUS/Explicit常采用质量缩放的方法。质量缩放可用于:1、缩放整个模型,单个单元或单元组的质量2、多步分析中,缩放每…

linux 修改默认脚本,linux环境初始脚本

#//把下面内容,做成init.sh文件,放到liunx任意目录下,用bash ./init.sh#//执行,或用chmod -R 777 init.sh#//赋权后,再用./init.sh#//执行#!/bin/bash## 初始centOS系统环境# 1. 在线安装一些编译环境# 2. 关闭防火墙#…

python lock_python lock一步步教你理解Python装饰器

请仔细看我们的decorator实例。我们定义了一个接受单个参数some_func的名为outer的函数。在outer内部我们定义了一个名为inner的嵌套函数。inner函数打印一个字符串然后调用some_func,在#1处缓存它的返回值。some_func的值可能在每次outer被调用时不同,但…