代码历史上最昂贵的 7 个错误
算法或程序中的一个小技术错误就可能造成数百万美元的损失。本文带大家看看迄今为止历史上因程序错误而带来后果最为昂贵的 7 个错误。
美国宇航局火星气候轨道器:1.93 亿美元
1999 年,美国宇航局的火星气候轨道飞行器进入了一个过低的轨道,导致航天器在大气层中燃烧。这一失败最终追溯至一次换算错误——英制磅秒单位没有转换成标准公制牛顿秒。
美国宇航局的火星轨道器是其火星勘测者计划中的第二个探测器,其中还包括 1996 年 11 月发射的火星全球勘测者和 1999 年 1 月发射的火星极地着陆器。 它们被设计成大致同时到达,对火星的表面、气候和大气进行实验。它原定于 1999 年 9 月 23 日到达轨道。美国宇航局的科学家们希望,一旦航天器到达火星,它将帮助他们重建气候历史,并在地表找到水的迹象。本次任务结束后,它还将作为未来火星任务的通信中继。
1999 年 9 月 23 日,火星气候轨道器按计划开始入轨燃烧。飞船原定在经过火星后重新建立联系,然后发送信号,但不幸的是,飞船没有收到任何信号。 在 TCM-4 及进入轨道的一个礼拜间,导航团队认为探测器的高度有可能比预期的还要低得多,大约位于 150 至 170 公里。
火星气候探测者号任务失败的主要原因是人为因素,因为火星气候探测者号上的飞行系统软件使用英制单位磅力计算推进器动力,而地面人员输入的方向校正量和推进器参数则使用公制单位牛顿,导致探测器进入大气层的高度有误,最终瓦解碎裂。
水手 1 号:1850 万美元
水手 1 号事件,也被称为人类历史上最昂贵的连字符,是美国宇航局的另一个失误,虽然很小,但导致公司损失了数百万美元。
水手号的计划中发射了一系列为探索火星、金星、水星等而设计的无人太空船。这个计划夺得多项第一,包括:第一次跨星系星际飞越、第一个行星探测器以及第一个以重力加速航行的太空船。
水手 1 号于 1962 年 7 月 22 日上午 9 点 21 分发射,距离发射不到 5 分钟,任务被迫中止;人类历史上最具历史意义的一次飞行坠毁于地面,而这只是因为数学代码中的一个小错误。
美国宇航局在其网站上引述道:“靶场安全官检测到计划外的偏航提升动作之前,助推器的表现都是让人满意。但引导命令的错误应用导致无法转向,并将导致航天器坠毁,可能坠毁于北大西洋航道或有人居住的区域,因而‘一名靶场安全官随后下令进行破坏性中止’。”
事故发生几天后,《纽约时报》发表了一篇文章,解释了坠机的原因。它说这个错误是“在一些数学数据中遗漏了一个连字符”的结果。据称,美国宇航局的一名程序员在将“大量编码信息”输入计算机系统时遗漏了这个符号。
几天后,美国宇航局官员理查德·莫里森向国会提交了销毁火箭的案例,并强调了微小遗漏的重要性:“连字符提示航天器在恢复雷达联系前,需忽略计算机提供的数据。当该连字符被省略时,虚假信息被输入航天器控制系统。在这种情况下,计算机将火箭向左转,机头朝下,火箭服从该命令并坠毁。”
阿丽亚娜 5 号航班 501:800 万美元
1996 年 6 月 4 日,欧洲航天局发射的无人驾驶的阿丽亚娜 5 号火箭在从法属圭亚那库鲁升空仅 40 秒后爆炸。这枚火箭在耗资数百万美元的开发十年后开始了它的第一次航行。
调查委员会调查了爆炸的原因,并在两周内发布了一份报告。原来,失败的原因是惯性参考系统中的软件错误。阿丽亚娜 5 上安装的软件最初是为 阿丽亚娜 4 开发的。阿丽亚娜 5 有一个更强大的引擎,这导致了以前版本不可能出现的错误。
与火箭相对于平台的水平速度相关的 64 位浮点数被转换为 16 位有符号整数。该数字大于这是可存储在 16 位有符号整数中的最大整数 32767,因此转换失败。因此,在第 39 秒,火箭在空气动力的作用下开始崩溃和自毁。
奔腾处理器漏洞:4.75 亿美元
Pentium FDIV 漏洞是最著名、或者说是最臭名昭著的英特尔微处理器漏洞。它旨在变得更快、更准确,但结果却被窃听并导致作为英特尔 SRT 算法一部分的查找表出现错误。
为了将浮点标量代码的执行速度提高 3 倍,向量代码的执行速度提高 5 倍,与 486DX 芯片相比,英特尔决定使用 SRT 算法,该算法可以在每个时钟周期生成两个商位,而传统的 486 移位和减法算法每个周期仅生成一个商位。此 SRT 算法使用查找表来计算浮点除法所需的中间商。Intel 的查找表由 1066 个表条目组成,其中由于编程错误,有五个没有下载到可编程逻辑阵列 (PLA) 中。当浮点单元 (FPU) 访问这五个单元中的任何一个时,它 (FPU) 取零而不是 +2,这应该包含在“缺失”单元中。
在最坏的情况下,此错误的发生率可能高达十进制数的第四位有效数字,但发生这种情况的可能性为 3600 亿分之一。错误出现在第 9 位或第 10 位十进制数字中是最常见的,这种情况发生的几率为 90 亿分之一。然而,心怀不满的客户认为每个用户都应该得到正常工作的硬件并要求更换。
莫里斯蠕虫:1 亿美元
如果说一个试图解决问题的学生不小心创建了恶意软件,导致价值 1 亿美元的损失来弥补损失,你会相信吗?可确实如此,这正是 1988 年 11 月 2 日发生的事情。康奈尔大学的研究生罗伯特·泰潘·莫里斯不小心创建了一个恶意软件程序。起初,它是程序中的一个无害实验,但代码中有一个小错误。该恶意软件开始迅速传播,随后摧毁了数千台计算机。
罗伯特莫里斯被指控犯有网络犯罪,并因此被罚款 10000 美元。然而,恶意软件总共导致了 1 亿美元的花费来修复受影响的计算机。
莫里斯的律师声称,该蠕虫有助于提高网络安全,因为它有助于开发防病毒软件,并在未来让用户意识到此类恶意软件。后来,莫里斯成为了 Y Combinator 的联合创始人。他是麻省理工学院的副教授。带有恶意软件源代码的软盘存储在波士顿大学。让我们只希望它不会变异。
而比事件影响更大、更深远的是:黑客从此真正变黑,黑客伦理失去约束,黑客传统开始中断。大众对黑客的印象永远不可能回复。而且,计算机病毒从此步入主流。
Knight 破产:4.4 亿美元
如果美国股票市场的一个关键利益相关者开始以高价买入,以低价卖出,会怎么样?听起来不是一个好的贸易策略,对吧?这正是发生在奈特身上的事情,差点导致他们破产。
2012 年 8 月 1 日上午,发生了一件任何一位 CEO 都会做的噩梦。花了 17 年时间才建成的建筑在几个小时内几乎倒塌。一些新的交易软件中有一个 bug,只有在纽约证券交易所当天开市时才被激活。这个错误的软件让 Knight 掀起了一场收购狂潮,很快,该公司就在交易的第一个小时内购买了约 150 家不同公司的股票,价值约 70 亿美元。
2012 年 8 月 1 日上午,发生了对任何一位 CEO 都是噩梦的事情:花了 17 年的时间建造的东西几乎在几个小时内就崩溃了。一些新的交易软件有一个 bug,该 bug 在当天纽约证券交易所开盘时才被激活。这个错误的软件让 Knight 掀起了一场收购狂潮,很快,该公司就在交易的第一个小时内购买了约 150 家不同公司的股票,价值约 70 亿美元。
Knight 试图取消交易,但美国证券交易委员会 (SEC) 主席 Mary Schapiro 拒绝了。除六支股票的交易被撤销,Knight 的其他购买狂潮并未达到取消门槛——使所购股票的价格上涨超过 30%。在其他情况下,交易成立。
这对 Knight 来说是个坏消息,一旦明确交易会成立,Knight 别无选择,只能抛售它购买的股票。就像早上的疯狂购买推高了这些股票的价格一样,大规模的市场抛售很可能会迫使价格下跌,可能会跌至 Knight 无法弥补损失的地步。
高盛(Goldman Sachs)介入,以花费 Knight4.4 亿美元的价格收购了 Knight 不想要的全部头寸。
千年虫:5000 亿美元
一位数能带来什么危害?早在 1999 年,它就耗资 5000 亿美元。Y2K 错误,也称为千禧年错误,是一种计算机缺陷。由于其中的年份只使用两位十进制数来表示,因此当系统进行跨世纪的日期处理运算时(如 1999 年 12 月 31 日之后的日期),就会出现错误的结果,进而引发各种各样的系统功能紊乱甚至崩溃。
在 1960 年代到 1980 年代编写复杂的计算机程序时,计算机工程师使用两位数的代码来表示年份。“19”被排除在外。日期不是 1970 年,而是 70。计算机工程师缩短了日期,因为在那个时代,计算机中的数据存储成本高昂并且占用大量空间。
随着 2000 年的临近,计算机程序员意识到计算机可能不会将 00 解释为 2000,而是将其解释为 1900。每天或每年编程的所有活动都会受到损坏或有缺陷。当 1999 年 12 月 31 日变成 2000 年 1 月 1 日时,计算机会将 1999 年 12 月 31 日解释为变成 1900 年 1 月 1 日。
每天计算利率的银行和其他金融机构面临着实际问题。计算机将计算负 100 年的利率,而不是一天的利率。发电厂、交通运输和许多其他部门也将受到这一变化的影响。
美国政府通过了《2000 年信息和准备披露法》为此次活动做准备,并成立了一个由政府高级官员和联邦应急管理局(FEMA)等机构官员组成的总统委员会,监督私营公司为活动准备系统的工作。研究公司 Gartner 估计,避免千年虫的全球成本可能高达 6000 亿美元。
吸取了上述七个教训,要记得务必在初始阶段测试软件,以避免损坏和修复的高成本。
版权声明: 本文为 InfoQ 作者【禅道项目管理】的原创文章。
原文链接:【http://xie.infoq.cn/article/8f07849b1c52812677f1e9623】。文章转载请联系作者。
评论