你知道程序的bug後果有多嚴重嗎?NASA爲此付出1.5億美元的代價

簡單的故障從一開始就困擾著太空飛行。毫無疑問,用可控的爆炸將物體送入太空是一件危險的事情,許多火箭發射都因簡單的問題而失敗。聯盟十一號的三名機組成員成為第一,也是唯一死於太空的人,因為爆炸的螺栓把伺服模塊和下降模塊放在一起點火,這是一個常規的程序,但是這些螺栓是按順序點火的,一個接一個。這一次,他們同時點火,爆發力過大,把隔離宇航員和真空的密封圈給鬆動了,很快他們就死了。

你知道程序的bug後果有多嚴重嗎?NASA為此付出1.5億美元的代價

兩年前,Space X的第一次發射失敗了,僅僅是因為他們把火箭暴露在海面的時間太長了,讓一個鋁製螺母生鏽了,這個螺母的作用是確保燃料泵入口壓力傳感器的安全。當它失效時,燃料開始從發動機和推力室的外部洩漏,並起火。火災造成氣壓損失,迫使閥門關閉,從而切斷推力。Space X的第一枚火箭由於簡單的疏忽導致鋁的腐蝕而從空中墜落。在這次飛行後,Space X換上了防鏽的不鏽鋼緊固件,這實際上更便宜,但重了2.5倍。在太空飛行中幾乎沒有誤差。

你知道程序的bug後果有多嚴重嗎?NASA為此付出1.5億美元的代價

像這樣的微小的疏忽導致了災難性的失敗,在水手1號的身上就發生過,這本來應該成為人類歷史上第一次成功的行星飛行。1962年7月22日,水手1號從卡納維拉爾角發射任務是飛越金星並收集其溫度和大氣數據。

你知道程序的bug後果有多嚴重嗎?NASA為此付出1.5億美元的代價

但在飛行後的293秒,靶場安全官員發出命令,要求在大西洋的一個無人居住的區域對火箭進行自毀,因為火箭的軌跡可能會在繁忙的航線或陸地上著陸。儘管助推器名義上執行,但火箭採取了一個無程序的偏航,因為升降機轉彎和轉向命令沒有反應。在水手1號探測器計劃分離和地面控制之前僅剩6秒的時間,該官員做出了發送自毀命令的決定。

為了弄清楚哪裡出了問題,我們首先需要了解一下阿特拉斯·阿杰納(Atlas Agena) 火箭是如何工作的。阿特拉斯助推火箭使用了兩種雷達系統來維持其軌跡。一種是速率系統,利用地面信標的多普勒頻移測量它的速度。另一種是軌道系統,它測量它相對於發射地點附近的天線的距離和角度。很快就出現了第一個問題,速率系統失敗了。軌道系統應該能夠獨立地處理導航,兩個系統一起工作形成了一些測量冗餘,以允許一個小的誤差範圍。這就是為什麼之前使用阿特拉斯火箭的發射沒有發生故障,但是這次速率系統失敗了。

你知道程序的bug後果有多嚴重嗎?NASA為此付出1.5億美元的代價

用來解釋距離和角度測量的代碼中有一個簡單的錯誤(bug),導致飛行的不穩定。這就是靶場指揮官發現有問題並啟動自毀命令的點。這是一個非常簡單的錯誤,應該被發現,但這是早期的編程。當時沒有花哨的計算機接口,用編譯軟件和錯誤檢測編寫代碼。

你知道程序的bug後果有多嚴重嗎?NASA為此付出1.5億美元的代價

制導計算機的代碼大部分是用早期的編程語言Fortran編寫的。Fortran代碼,代表“公式翻譯”,用於將數學公式翻譯成代碼,手寫或打印在打字機上。這就是打孔卡開始發揮作用的地方。穿孔卡片是一種厚的矩形紙,上面有一長串重複的數字,從0到9,它們的長度有80列。每張卡片都有一行代碼,每一列代表一行代碼中的一個字符。要表示一個數字,只需在表中鍵入相應的數字。要表示字母和符號,就需要打孔。這是在卡片穿孔機上完成的,必須再次手動輸入每一行代碼。一旦將所有代碼轉換為穿孔卡片,這些卡片將通過編譯器發送,在那裡它們將被轉換為二進制。如果存在一個孔,一個電路將通過一組特定的觸點來完成,從而產生一個二進制信號。然後編譯器生成一套新的卡片,計算機實際上可以理解這些卡片。顯然,與現在的用戶界面相比,這種編碼方法要繁瑣得多,而且很難進行實際檢查。

你知道程序的bug後果有多嚴重嗎?NASA為此付出1.5億美元的代價

這不是藉口,但顯然錯誤更容易犯,這個特別的錯誤最終導致NASA在1962年花費了1850萬美元,相當於現在的1.5億美元。

代碼被修正了,僅僅一個月後,水手2號就發射了,到金星用了3個半月的時間。“水手2號”在途中首次探測到了太陽風,這是太陽釋放出的持續的帶電粒子流。它測量了行星間的塵埃含量,在飛越金星的過程中揭示了關於行星溫度和大氣的信息。水手2號現在漂浮在繞太陽公轉的軌道上。

你知道程序的bug後果有多嚴重嗎?NASA為此付出1.5億美元的代價


分享到:


相關文章: