Bug 引發的 18 次重大事故
無論工程師做了多少枯燥的測試工作,無論他們熬了多少不眠之夜在程式設計,但最終他們得到的是:會導致軟體徹底出問題的 bug。你知道嗎,由於軟體故障(bug),美國經濟每年在浪費生產力、返工和實際毀壞上損失了數十億美元。
軟體故障背後的常見原因有:
- 錯誤的結構定義和底層設計;
- 脫離大量可靠資料和分析的強制性計劃或里程碑日期;
- 沒有考慮和調整需求增長;
- 整合過量員工去實現不現實的進度壓縮;
- 利益相關者基於直覺或情感的談判;
- 溝通不暢、自負以及消極的態度;
本文列舉了一些由軟體 Bug 引發重大事故,其結果是大量金錢損失,甚至人員死亡。如果你有任何建議或者其他案例,歡迎提出。
12.英國護照系統(1999年)

英國護照辦事處啟用了一種新的計算機系統,而這種新系統無法及時向超過 50 萬公民發放護照。後來辦事處賠償了數百萬,員工也加班為在雨中排隊等候護照的人們提供雨傘。
損失:1400 萬美元
故障原因:辦事處沒有經過適當的測試,沒有對員工進行有關新系統的培訓,就推出他們的軟體。另外,(與新系統同時釋出的)新法律要求所有 16 歲以下的兒童在出國旅行時都要擁有一個護照密碼。這就導致了護照需求瞬間激增,從而致使新軟體系統負載過重。
11.水手一號探測器(1962年)

1962年,發射往金星的水手一號探測器在發射 293 秒後偏離了預定軌道。它的任務在 5 個星期後由成功發射的水手二號完成。
損失:1900 萬美元
故障原因:兩個故障:探測器制導天線的硬體故障,還有板載制導系統的軟體故障。制導天線並沒有達到應有的標準。因此,探測器不得不依靠一個有 Bug 的制導系統。
一個程式設計師將某個公式轉換成了計算機程式碼轉錯了,漏了一個下標。這個下標原本是半徑 R 的第 N 次平滑時間導數值。由於缺少資料光滑化處理功能,制導系統把正常速度當成錯誤處理,並造成了修正不精確,最終探測器偏離航向的。
10.Mydoom 病毒(2004年)
Mydoom 是一種計算機病毒,於 2004 年 1 月 26 日首次出現。病毒出現第二天,SCO 組織懸賞 25 萬美元,以獎勵提供病毒作者資訊的人。據 MessageLabs 稱,當時每十二封電子郵件中就有一封攜帶這種病毒。
損失:380 億美元
故障原因:該病毒能夠在作業系統中建立一個後門,讓未經授權的使用者訪問您的個人資料。同時,它可以欺騙郵件,使其源頭很難被跟蹤。和其他病毒一樣,Mydoom 可以搜尋電子郵件裡的聯絡人,並將請求傳送給所有的搜尋引擎。
9.哈特福德體育館倒塌

1978 年 1 月 18 日,(美國康涅狄格州的)哈特福德市中心體育館在近 5000 名觀眾離開後的幾個小時內轟然倒塌。其鋼網殼組成的屋頂在雪的重壓下崩塌。
損失:7000 萬美元 + 當地經濟的 2000 萬美元損失
故障原因:有很多相互衝突的失敗原因,包括設計流程、結構以及程式設計錯誤。CAD 程式設計師假設屋頂支撐結構僅需要面臨純壓縮,從而做出錯誤的設計。
此外,計算機模型假設所有的頂部弦杆進行了橫向支撐,但實際上只有內部框架符合標準。固定荷載被低估了超過 20%。當頂部其中一個支架被大雪意外壓彎時,便引發了屋頂其他部分的連鎖反應。
8.火星氣候探測者號

火星氣候探測者號是由美國宇航局於 1998 年發射的一個空間探測器,用於研究火星的大氣層、氣候以及表層變化。發射後第 286 天,進入火星軌道時失去了通訊。導航故障讓火箭過於靠近火星大氣層,從而導致燃燒並解體。
損失:1.25 億美元
故障原因:任務失敗的主要原因是人為失誤。火星氣候探測者號上的飛行系統軟體使用公制單位牛頓計算推進器動力,而地面人員輸入的方向校正量和推進器引數則使用英制單位磅力。這個因計量單位混淆的錯誤在此後的所有任務中被 NASA 小心地避免。
7. IRS:缺少欺詐檢測系統

2006 年,美國國內稅收系統(IRS)缺少自動還款欺詐檢測系統,無法監測返還申報資金時的潛在欺詐案件,損失了數百萬。
損失:3 億美元的損失,21 美元修復
故障原因:在 2005 年 1 月,電腦科學公司本應交付電子欺詐系統(EFDS)。然而在 2004 年 10 月,IRS 擔心他們的 2100 萬個系統將無法按時準備好,這也是為什麼他們決定在 2005 年的歸檔階段使用舊系統。
據 IRS 局長 Mark Everson 稱,IRS 及其承包商在提高自動還款欺詐檢測系統方面管理不足,不可接受。
6.阿麗亞娜 5 型運載火箭

1996 年,阿麗亞娜 5 型運載火箭首次飛行,搭載發射星群航天器(歐洲航天局的四大航天器之一的星座)。然而由於運載火箭無法到達指定軌道,任務以失敗告終。
損失:3.7 億美元
故障原因:阿麗亞娜5型運載火箭基於前一代4型火箭開發。在4型火箭系統中,對一個水平速率的測量值使用了16位的變數及記憶體,因為在4型火箭系統中反覆驗證過,這一值不會超過16位的變數,而5型火箭的開發人員簡單複製了這部分程式,而沒有對新火箭進行數值的驗證,結果發生了致命的數值溢位。因此,飛行器在發射後 37 秒便從原始路徑偏移。最終不得不啟動了火箭自毀程式。
5.奔騰的長除法

1994 年,英特爾的奔騰微處理器晶片的浮點計算單元出現了一個 Bug。對於精確計算,處理器將返回不正確的十進位制值。當時有大概 500 萬個缺陷晶片在流通,英特爾最終決定為所有投訴的人更換晶片。這之後,英特爾把他們的故障處理器做成了鑰匙鏈。
損失:4.75 億美元 + 品牌名譽受損
故障原因:在奔騰浮點單元的分頻器中有一個有缺陷的除法表,在約一千個條目中丟失了五條紀錄。然而,這個錯誤在 90 億隨機浮點小數的除法中僅可能出現一次。例如,將 4195835.0 除以 3145727.0 得出 1.333739068902037589,而不是 1.333820449136241002,有 0.006% 的誤差。
4. 1987 年的華爾街崩盤

1987 年 10 月 19 日(也被稱為黑色星期一),道瓊斯工業平均指數(DJIA)下跌了 508 個點,損失了總價值的 22.61%,且標準普爾 500 指數下跌了 20.4%。這是華爾街一天之內見過的最大損失。
損失:一天 5000 億美元
故障原因:問題出在交易程式和估價程式。在交易程式中,計算機基於外部輸入執行快速股票交易,如相關證券的價格。該交易程式理應實施投資組合保險策略,並試圖從事套利。
1987 年初,美國證券交易委員會針對內幕交易開始了一系列的調查。直到 10 月,投資者決定搬出華爾街。隨著人們開始大規模外流,計算機交易程式出現了大量的銷售訂單至 DOT(訂單轉送及成交回報系統),於是系統超出負載、市場崩潰以及所有的投資者懵逼了。
3.千禧危機

千年蟲(千年問題)是計算機系統的編碼問題,在從 1999年 12 月 31 號過渡到 2000 年 1 月 1 號時,這個錯誤將在計算機網路和軟體中引發一場浩劫。
損失:5000 億美元
故障原因:為了節省計算機儲存空間,大多數傳統軟體使用兩位數字來儲存日期中的年份,例如,用“97”來代表 1997 年。這導致了 2000 年 1 月之後日期相關程式的錯誤操作。
此外,有些程式沒有考慮到 2000 年是閏年。甚至在 2000 年到來之前,人們都在擔心一些軟體可能在 1999 年 9 月 9 號(表示為 9/9/99)無法工作,因為早期的開發人員常使用一系列的 9 來表示一段程式程式碼的結束。
2.癌症治療與致死性放射治療

1985 年到 1987 年期間,Therac-25 醫療放射治療裝置讓成百上千的患者暴露在大量過量的輻射之中,少數患者接受了高達預期 100 倍的放射劑量。2000 年,巴拿馬城也發生了同樣的輻射劑量誤差。
損失:10 餘人死亡,20 人重傷
故障原因:基於輸入資料的順序,治療計劃軟體計算出並提供雙倍劑量的輻射。
1.愛國者導彈

1991 年 2 月第一次海灣戰爭期間,部署在沙特宰赫蘭的美國愛國者導彈系統未能成功追蹤和攔截來襲的伊拉克飛毛腿導彈。結果飛毛腿導彈擊中美國軍營。
損失:28 名士兵死亡,100 多人受傷
故障原因:時間計算不精確以及計算機算術錯誤導致了系統故障。從技術角度來講,這是一個小的截斷誤差。當時,負責防衛該基地的愛國者反導彈系統已經連續工作了100個小時,每工作一個小時,系統內的時鐘會有一個微小的毫秒級延遲,這就是這個失效悲劇的根源。愛國者反導彈系統的時鐘暫存器設計為24位,因而時間的精度也只限於24位的精度。在長時間的工作後,這個微小的精度誤差被漸漸放大。在工作了100小時後,系統時間的延遲是三分之一秒。
0.33 秒對常人來說微不足道。但是對一個需要跟蹤並摧毀一枚空中飛彈的雷達系統來說,這是災難性的。飛毛腿導彈空速達4.2馬赫(每秒1.5公里),這個”微不足道的”0.33秒相當於大約 600 米的誤差。在宰赫蘭導彈事件中,雷達在空中發現了導彈,但由於時鐘誤差沒能精確跟蹤,反導導彈因而沒有發射攔截。
災難仍在繼續
13. 微軟客戶被控訴盜版:
Windows 團隊的有個成員不小心在所有的 Windows 伺服器上安裝了有 Bug 的非成品的軟體。在接下來的 19 個小時內,所有正版 XP 使用者都被告知他們在執行盜版軟體。
14. 被假釋的罪犯
2011 年,由於計算機程式程式碼中的一個小錯誤,約有 450 名暴力罪犯從加利福尼亞州監獄被釋放。
15. 一觸即發的第三次世界大戰
1983 年 9 月 26 日,蘇聯的核早期預警系統報告了來自美國發射的導彈。蘇聯的系統錯誤地接收到太陽光的反射並將其解讀為導彈發射。
後來,導彈襲擊警告被一名蘇聯防空部隊的軍官認定為假警報。這一決定阻止了一場核戰爭以及數以百萬計人們的潛在死亡。
16. 黑暗降臨(大面積停電事故)
2003 年,黑暗在美國的八個州蔓延開來,影響了 5000 萬人。該問題的源頭是一個競爭條件,這是一個單一操作中的兩個獨立執行緒使用同一個程式碼中元素的結果。
17. 洛杉磯國際機場的航班停飛
2007 年,美國邊境和海關控制網路傳送了大量錯誤資料。這導致洛杉磯整個機場關閉了 8 個小時,在問題解決之前,超過 17000 架飛機不能起飛。這件事的罪魁禍首是一段有 Bug 的嵌入式軟體。
18. Bug 葬送了日本 18 億元的最新衛星

2016年2月17日,被日本寄予厚望的 X 射線天文衛星“瞳”成功發射升空,但僅僅一個月後,“瞳”與地面的通訊出現嚴重故障,經地面光學望遠鏡測控發現其執行軌跡出現多塊太空碎片。4月28日,日本宇宙航空研究開發機構(JAXA)正式宣佈,無法恢復對X射線衛星“瞳”的操控,事故原因經初步調查源自底層軟體錯誤。衛星的控制系統在發現飛行姿態失控時,採取了錯誤的調整,推進器點火時朝向了錯誤的反方向,導致自身旋轉更加嚴重,最終徹底失控。
