盘点那些改变过世界的代码

盘点那些改变过世界的代码

(Steve Russell via Bitsavers.org)

1961 年末,一群年轻的麻省理工学院教员、学生及助理人员(其中不少人是当时 Tech Model Railraod 俱乐部的成员)夜以继日地围坐在一台捐赠而来的 DEC PDP-1 计算机面前。PDP-1 计算机代表着非军事计算技术的最高水平,单台售价高达 12 万美元(换算成目前的金额超过 100 万美元),能够支持 18 位字长并使用纸带存储程序。在五个月时间中,这些程序员开发出一款游戏,允许两名玩家控制飞船(其实就是屏幕上的简陋线图)一边躲避屏幕中央恒星的引力干扰,一边展开激烈的太空炮战。

《Spacewar!》在早期“黑客”社区当中迅速传播开来,随后以 DEC PDP-1 计算机上内置程序的身份预加载至核心内存当中,以供演示之用。该项目极大鼓舞了上世纪六十年代的编码社区,并启发了一代又一代电子游戏创作者。时至今日,这款游戏仍然以模拟的形式在计算机历史博物馆中定期展览。这款游戏的首席开发者 Steve Russell 在 2018 年史密森尼学会的小组会议上表示,“这款游戏已经有 50 多年历史了。从来没有用户投诉,也从来没有崩溃报告,且时至今日仍在正常运行。”——Arthur Daemmrich,勒梅尔森发明与创新研究中心主任

5元初电子邮件

年份: 1965

来吧,这可是电子邮件。

(CTSS Programmer’s Manual Page for MAIL )

1961 年,麻省理工学院的黑客们创建一套系统,允许多位用户登录至同一台计算机,并相互传递非常有限的消息。1965 年,一群编程人员决定开发一套正式的命令系统,用于发阔达、接收以及显示这些短小的数字消息。虽然当时的“高端人士”拒绝使用 MAIL 这条看似草率的命令,但其用法却大行其道。到 1971 年,麻省理工学院甚至收到历史上第一条垃圾邮件:一段反越战信息。—Clive Thompson

6警察执法算法

年份: 1968

标志着现代警务预测与种族特征计算机化的开端

1965 年,时任美国总统的 Lyndon Johnson 组建总统执法与司法委员会,并要求该委员会研究如何利用计算机解决美国国内的“犯罪问题”。他和该委员会为这个问题设定了两个关键词,其一是“都市”、其二是“黑人”,计算机给出的答案即为“警察执法算法”。该算法旨在解决规划问题,例如在城市特定区域内应部署多少名巡逻警员。通过将该算法与犯罪数据库相结合,警务人员即可根据种族人口统计数据自动生成嫌疑人档案,并在发生犯罪活动之前部署对应资源(包括警员、武器以及其他装备)。时至今日,预测性警务方案仍然将黑人及棕色人种定为重点监控对象与犯罪高发群体。从执法算法的故事来看,这并不是什么不可预见的技术偏见,而是计算机技术 50 年来完美设计的直接体现。——Charlton Mcllwain,《黑色软件:互联网与种族正义对非洲及非裔群体的重要意义(Black Software: The Internet & Racial Justice, From the Afronet to Black Lives Matter)》一书作者

7阿波罗 11 号登月计划 BAILOUT 代码

年份: 1969

这段代码用于防止登月舱计算机耗尽自身资源

阿波罗制导计算机(AGC)堪称人类科技发展史上的奇迹。根据阿波罗计划返回地球轨道规划负责人 Poppy Northcutt 的介绍,这台古老计算机的计算能力甚至不及一张能够记录祝福消息的电子贺卡。然而,它还是成功完成了任务。

有限的计算容量与存储空间,要求其必须认真管理每一项任务,因此 AGC 必须始终专注于最重要的工作内容。一旦计算量超出承载能力,整个登月计划都将因此失败。为此,项目成员开发出 BAILOUT。当计算机遭遇空间耗尽(或者说「溢出」)风险时,AGC 会触发 BAILOUT 以丢弃重要度相对较低的数据与运算,从而确保核心数据与运算保持正常运行。

当鹰号着陆器接近月球表面时,AGC 在距离月面 3 万英尺处发出了“1202”警报,遗憾的是阿姆斯特朗以及身处休斯顿宇航中心的控制员们并没有马上察觉。不到 30 秒之后,控制中心的计算机专家们得出结论:AGC 软件仍在按预期方式运行,即放弃低优先级工作并集中资源处理核心负载(整个切换过程很快,因此机组人员无法察觉)。阿姆斯特朗与奥尔德林继续使用由 AGC 提供的宝贵数据,引导登月舱一步步完成着陆。

在阿姆斯特朗上报“鹰号成功着陆”之前,溢出警报总共响了三次,但一切仍然按照预期方式运行。“Bailout”一词原本是指任务未能完成,可在阿波罗 11 项目中却成了人类最高成就的代名词。—Ellen Stofan,史密森尼国家航空航天博物馆主任

8Hello, World!

年份: 1972 或更早

这句短语首次出现在代码当中

当我们集中注意力学习一种新的编程语言时,教程上的第一个案例就是如何在计算机屏幕上显示短语“Hello,world!”也许这条短语最知名的来源是贝尔实验室的备忘录《C 语言编程——一份教程》。这份材料编写于 1974 年。不过在编写于 1972 年的 B 语言教程中,我们同样看到了这条短语的身影。

Hello, World! 是一种伟大的教学方法。这是一项能够轻松完成的小任务,同时也代表着一种标准,体现出不同编程语言之间的重要差异。此外,这也是高级程序员在安装新环境测试一切是否正常的快速简便方法。(有时候,程序员们也会使用「hello world」运行时间来比较不同语言与环境的速度水平。)也许更重要的是,“Hello, world!”具有一种温暖而柔和的力量,对编程新人有着一种莫名的亲和力。代码拥有无穷威力,而新的世界已经向你张开怀抱。—Chris Noessel,IBM 公司 AI 设计负责人

9空终止字符串

年份:1972

计算技术发展史上最严重的设计错误

(The GNU C reference manual)

1972 年,Dennis Ritchie 做出一个重大决定:在新语言中用一种名为“空终止字符串”表示文本。这个概念早已出现,但他决定将其引入自己的新成果 C 语言当中——而这个决定,给无数编程后继者带来了深远的影响。

编程语言表示一段文本的主要方式有两种:其一是提供固定的显式长度,相当于声明“我只包含 10 个字符,且无法容纳更多字符”;其二是采用空终止结尾——“我包含很多字符,直到出现零字节结尾。”

C 代码中的一类常见错误,就是把一条长字符串复制到某个较短字符串内并导致结尾处溢出,如此一来其邻近数据就会受到破坏。打个比方,这就像是本应在白板上作画,却把颜料涂到了板后的墙面上。

除了导致程序故障之外,攻击者还能够主动通过这类 bug 诱导程序利用经过精心设计的特定数据覆盖某些内容,进而改变程序行为。而这,就是经典的缓冲区溢出攻击。大家听说过的几乎所有安全漏洞,都有着一位共同的“老祖宗”——1988 年的 Morris 蠕虫。

虽然可以在 C 语言中通过认真编码避免此类 bug,但这种语言的设计特性使得此类 bug 极易出现且难以检测。从路由器到“智能”灯泡,虽然几乎每一种现代语言都会刻意避免空终止字符串问题,但 C 与 C++ 仍然统治着整个世界。因此,直到近 30 年之后,我们仍然无法彻底摆脱这个 bug。—Jamie Zawinski,Netscape 开发人者、Mozilla.org 创始人、DNA Lounge 负责人。

10Telenet

年份:1975

第一个基于数据包交换机制的公共数据网络,当今互联网的主干

在互联网诞生之前,ARPANET 首先出现。这是一套计算机网络,主要供高级研究计划局(DARPA)的研究人员在机器之间进行数据交换。随着 ARPANET 在政府内部的快速扩张,其创造者意识到这项技术可能对普通大众也拥有重要价值,甚至有望带来巨大的财富收入。1975 年 8 月,ARPANET 的商业版本 Telenet 在七座城市首批上线,允许早期客户(主要是计算机或数据库企业)利用电话拨号实现数据上传与下载——相关用例包括原始电子邮件服务,以及远程访问存储在中央计算机上的代码。尽管 ARPANET 被普遍视为现代互联网的最早版本,但更准确地讲,为公众消费而设计的 Telenet 才是真正的互联网鼻祖。上世纪八十年代,Telenet 最大的客户之一正是 Quantum Link,也就是后来的 AOL 美国在线。——Jane C. Hu,Future Tense 贡献者

11温哥华证券交易所的四舍五入错误

年份:1982

由小数点后取舍引发的“一场血案”

温哥华证券交易所当初本应使用以上代码求取近似值。

1982 年初,温哥华证券交易所发布一项电子股票指数,基准定为 1000 点。在两年之内,其跌到了原始值的一半,但当时股票市场的涨幅相当强劲,因此人们感到大惑不解。一项调查显示,相关代码使用了 floor() 而非 round(),并导致命令中的指数计算存在错误。这条命令执行的是四舍五入运算,而没有按设计预期原样保留三位小数。(当时的数字计算机处理能力有限,因此必须使用四舍五入或者直接舍去等方法。)这意味着如果指数计算结果为 532.7528,那么正确的舍去结果应该是 532.752,而非四舍五入后的 532.753。虽然这种差异看似微小,但经过每天成千上万次计算之后,股指开始出现急剧下跌。最终,这一 bug 在 1983 年 11 月得到解决:在上周末收盘于 500 点左右之后,周一重新开放时公布的指数终于正确超过 1000 点。——Lav Varshney,伊利诺伊大学香槟分校副教授

12Therac-25

年份:1985–1987

事实证明,过度自信是会死人的

头条新闻第一次发布由技术发展导致的事故。《洛杉矶时报》宣称,“过于复杂的现代软件正引发故障率的急剧提升。”一种被多家医疗机构中用于治疗癌症的机器在运行过程中发生爆炸,共波及六名患者,其中至少三人死亡。

调查人员事后发现,这台 Therac-25 设备在编程中存在致命错误。该机器提供低功率与高功率两种照射模式,而高功率模式需要利用金属设备过滤光束。但由于存在软件 bug,在未匹配适当金属设备时,操作人员同样可能意外触发高功率模式。

Therac-25 机型实际上是 Therac-20 的“改进”版本,当时人们认为其软件万无一失,因此不需要额外的安全检查。结果就是,工程师的过度自信引发了惨痛的伤亡事故。—Molly Olmstead

13互联网中继聊天

年份:1988

最早的网络续聊技术

互联网中继聊天(简称 IRC)甚至在大多数人听说“互联网”这个字眼之前就已经存在。这是一种通过小组频道与他人进行实时聊天的流行技术方案。早期用户能够通过登录共享新闻内容——包括 1991 年媒体集体噤声时,用户借此传播苏联解体的爆炸性消息。当然,这种聊天方式本身也以代码的形式实现:要加入频道,需要输入“/join #[频道名称]”。(如今的 Slack 达人对此应该比较熟悉。)如果用户希望表达一些与自己相关的消息,也可以输入“/ 我太累了”,或者用 * 加“太累了”直接显示自己的名称与“太累了”字段。总而言之,虽然功能非常基础,但对大多数人来说,在线聊天成为他们接触互联网的第一站,也成为后世无数在线会话应用的基础雏形。—April Glaser

14Morris 蠕虫

年份:1988

一场噩梦,让人们意识到互联网已经发展得如此庞大

来源:公众号:Java后端

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年2月5日
下一篇 2020年2月5日

相关推荐