1961 年末,一群年轻的麻省理工学院教员、学生及助理人员(其中不少人是当时 Tech Model Railraod 俱乐部的成员)夜以继日地围坐在一台捐赠而来的 DEC PDP-1 计算机面前。PDP-1 计算机代表着非军事计算技术的最高水平,单台售价高达 12 万美元(换算成目前的金额超过 100 万美元),能够支持 18 位字长并使用纸带存储程序。在五个月时间中,这些程序员开发出一款游戏,允许两名玩家控制飞船(其实就是屏幕上的简陋线图)一边躲避屏幕中央恒星的引力干扰,一边展开激烈的太空炮战。
5元初电子邮件
年份: 1965
来吧,这可是电子邮件。
(CTSS Programmer’s Manual Page for MAIL )
1961 年,麻省理工学院的黑客们创建一套系统,允许多位用户登录至同一台计算机,并相互传递非常有限的消息。1965 年,一群编程人员决定开发一套正式的命令系统,用于发阔达、接收以及显示这些短小的数字消息。虽然当时的“高端人士”拒绝使用 MAIL 这条看似草率的命令,但其用法却大行其道。到 1971 年,麻省理工学院甚至收到历史上第一条垃圾邮件:一段反越战信息。—Clive Thompson
6警察执法算法
年份: 1968
标志着现代警务预测与种族特征计算机化的开端
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! 是一种伟大的教学方法。这是一项能够轻松完成的小任务,同时也代表着一种标准,体现出不同编程语言之间的重要差异。此外,这也是高级程序员在安装新环境测试一切是否正常的快速简便方法。(有时候,程序员们也会使用「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
第一个基于数据包交换机制的公共数据 络,当今互联 的主干
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
一场噩梦,让人们意识到互联 已经发展得如此庞大
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!