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

news2024/9/29 9:19:28

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

614fc8e308efedf86cb41b7c7bf8c4be.png

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

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

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

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

ef24349c5c74e62a6e41f09f3cfb9a5d.png

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

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

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

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

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

8d3187e15d64163a4a4ac8b4024f6a3b.png

(代码等身)

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

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

e044a8bfaf50d71ca485a73c2c6dd607.png

1

2K内存的计算机

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

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

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

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

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

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

b4c3165713643b4cf6cbb48876e5e9fb.png

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

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

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

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

0bba7658fa6b64d7e2eb5a873fbc6e7d.png

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

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

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

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

cbe7f2235ff181a3ec6936a8bf2cbc85.png

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

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

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

2

软件工程

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

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

5f65b261e14e481cca438f3c3796dd5b.png

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

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

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

9411f9c3039cc474d67907593a7496fa.jpeg

(支援阿波罗8号)

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

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

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

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

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

cc38746413002ab5bca48be07cd92f3b.png

3

除了成为先行者别无选择

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

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

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

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

d5268cc70bda229a6260df1416d472df.png

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

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

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

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

(完)

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

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

917e5cf291cb4e4cfb0ebc7bcbd53cf1.png

4f9e7e93438c054c3873c4d9e1af5d61.png

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

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

相关文章

d3绘图笔记

D3绘图笔记 安装与引用 npm install d3 --save-dev import * as d3 from d3; 选择器 d3.select() 可直接接元素名,也可以接属性与类 添加svg标签 this.d3 d3.select(.myd3) let svg this.d3.append("svg") // 添加svg并设置好高宽 .attr("wid…

<Linux>system v通信

前言😃😃😃进程间通信的方式管道 - Linux原生提供SystemV - 多线程单机通信posix - 多线程网络通信这里我们主要是介绍一下SystemV通信方式一、SystemV原理首先我们需要知道通信的本质:多个进程能看到同一个资源,即内存…

如何使用码匠连接 CouchDB

目录 在码匠中集成 CouchDB 在码匠中使用 CouchDB 关于码匠 CouchDB 是一种开源的 NoSQL 数据库服务,它使用基于文档的数据模型来存储数据。CouchDB 的数据源提供了高度可扩展性、高可用性和分布式性质。它支持跨多个节点的数据同步和复制,可以在多个…

mysql数据库之表级锁

表级锁,每次操作锁住整张表。锁定粒度大,发生所冲突的概率最高,并发度最低。应用在myisam、innodb、bdb等存储引擎中。 一、表级锁分类。 1、表锁 2、元数据锁(meta data lock,MDL) 3、意向锁 二、表锁…

yum保留安装包

一. 用downloadonly下载 1.1 处理依赖关系自动下载到/tmp/pages目录,pages这个目录会自动创建 yum install --downloadonly --downloaddir/tmp/pages ceph-deploy注意,如果下载的包包含了任何没有满足的依赖关系,yum将会把所有的依赖关系包下…

微信小程序的代码由哪些结构组成?

小程序官方建议把所有小程序的页面,都存放在pages 目录中,以单独的文件夹存在,如图所示: 其中,每个页面由4 个基本文件组成,它们分别是:js文件(页面的脚本文件,存放页面的数据、事件…

Bean三种实例化方式的底层原理

Bean实例化的三种方式 1,使用类构造器实例化(无参构造函数)2,使用静态工厂方法实例化(简单工厂模式)3,使用实例工厂方法实例化(工厂方法模式) 基于以上的三种方式&…

时间轮来优化定时器

在raft协议中, 会初始化三个计时器是和选举有关的: voteTimer:这个timer负责定期的检查,如果当前的state的状态是候选者(STATE_CANDIDATE),那么就会发起选举 electionTimer:在一定时…

Photoshop如何安装ZXP扩展插件?

Photoshop如何安装ZXP扩展插件呢?有一些小伙伴不会安装,今天介绍两种安装ZXP扩展的方法,希望对能帮助到大家。方法一:手动安装方式1)把下载好的.zxp扩展名改为.zip,然后解压。Windows系统:C:\Us…

参考文献去哪里查找,参考文献标准格式是什么

1、参考文献类型: 普通图书[M]、期刊文章[J]、报纸文章[N]、论文集[C]、学位论 文[D]、报告[R]、标准[s]、专利[P]、数据库[DB]、计算机程序[CP]、电 子公告[EB]、联机网络[OL]、网上期刊[J/OL]、网上电子公告[EB/OL]、其他未 说明文献[z]。…

I.MX6ULL_Linux_驱动篇(28) 字符设备驱动

字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设备,这…

蓝牙耳机品牌哪个质量好?2023质量好的蓝牙耳机推荐

相较于有线耳机,蓝牙耳机凭借更方便地使用而受到不少人的喜爱,蓝牙耳机各种性能的发展也越来越先进。哪个品牌的蓝牙耳机质量好?针对这个问题,我来给大家推荐几款质量好的蓝牙耳机,一起来看看吧。 一、南卡小音舱蓝牙耳…

接口请求参数异常之@RequestParam

问题 具体问题如下: 正确的如下: 如上两图所示:我们的请求参数是pageNo和pageSize,但是却没有正确显示,则说明我们的接口存在了问题。 分析问题 参数为什么没有正确的显示每页显示条数和当前页数,而是我…

jmeter-定时器

记录下业务中常用的定时器概念以及使用流程,仅供自己学习。 定时器的作用域 1、定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面); 2、当执行一个sa…

Apache HTTP Server <2.4.56 mod_proxy 模块存在请求走私漏洞(CVE-2023-25690)

漏洞描述 Apache HTTP Server是一款Web服务器。 该项目受影响版本存在请求走私漏洞。由于intro.xml中存在RewriteRule配置不当,当Apache启用mod_proxy且配置如 RewriteRule “^/here/(.*)” " http://example.com:8080/elsewhere?$1"; http://example.…

Elasticsearch 核心技术(七):IK 中文分词器的安装、使用、自定义字典

❤️ 博客主页:水滴技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 🌸 订阅专栏:大数据核心技术从入门到精通 文章目录一、安装 IK 分词器方式一:自行下载并解压安装包方式二:…

【前端学习】D3:CSS进阶

文章目录前言系列文章目录1 CSS的三大特性1.1 层叠性1.2 继承性1.3 优先级(*)2 盒子模型2.1 看透网页布局的本质2.2 盒子模型(Box Model)的组成2.3 边框(border)2.3.1 普通边框2.3.2 表格的细线边框2.3.3 边…

【Hello Linux】命令行解释器

作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:使用进程的基础知识和进程控制知识做出一个简单的shell程序 命令行解释器介绍搭架子缓冲区获取命令如何从标准输入中获取字符串解析命令…

Python3 爬虫实战教程 ,网页审查元素【Python学习连续,请关注】

在讲解爬虫内容之前,我们需要先学习一项写爬虫的必备技能:审查元素(如果已掌握,可跳过此部分内容)。1、审查元素在浏览器的地址栏输入URL地址,在网页处右键单击,找到检查。(不同浏览器的叫法不同…

爬虫(三)selenium

文章目录1. Selenium 安装2. Selenium 基本功能2.1 初始化浏览器2.2 其他功能3. 查找元素3.1 八大定位方法3.2 查找相对元素3.3 键盘事件4. 元素方法5. JS执行运行环境: selenium4.7.2 1. Selenium 安装 Selenium是一个用于Web应用程序测试的工具。Selenium测试直接…