关于代码质量:代码历史上最昂贵的-7-个错误

3次阅读

共计 3684 个字符,预计需要花费 10 分钟才能阅读完成。

算法或程序中的一个小技术谬误就可能造成数百万美元的损失。本文带大家看看迄今为止历史上因程序谬误而带来结果最为低廉的 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 亿美元。

汲取了上述七个教训,要记得务必在初始阶段测试软件,以防止损坏和修复的高老本。

正文完
 0