Categories
程式開發

為什麼NASA能開發出軟件成功登月,而程序員卻搞不定一場選舉?


為什麼NASA能開發出軟件成功登月,而程序員卻搞不定一場選舉? 1

先說一件事:

最近,美國愛荷華州召開民主黨總統候選人初選大會。以前,選舉都是使用紙質投票的方式進行,這次要使用一款名為“IowaReporterApp”的電子計票應用程序。與紙質投票的人工計票方式不同,這款App最初有望投票2小時後快速公佈投票結果。然而,讓人大跌眼鏡的是,這款App在使用時發生故障,導致大規模混亂,一直到第二天還未能公佈結果。

最後,人們將數據導出,重新進行紙質計票審核。目前,該App的整個後端已經關閉,無法通過它或公司服務器訪問任何信息。 (更多信息,參見InfoQ報導《花 40 多萬開發的 App 擾亂了一場大選,幾乎毀了一家公司》)

InfoWorld的編輯Peter Wayner撰文寫道,對程序員而言,愛荷華州召開民主黨總統候選人初選大會計票軟件的失敗是一個殘酷提醒,告訴他們事情會變得有多糟糕。

為什麼NASA能開發出軟件成功登月,而程序員卻搞不定一場選舉? 2

簡單的投票計數並不像有些事情那麼複雜,比如製造一輛自動駕駛汽車、訓練人工智能推薦電影,甚至安全更新銀行數據庫,但是程序員們沒有成功。有一條帶有惡意的推文寫道,“很難相信,我們把人類送上了月球。”

問題在於將這件事與登月相比是不公平的

儘管引導阿波羅著陸器登上月球似乎比製表統計幾千張選票要更困難,但是,所有與現代選票統計相關的額外工作讓它變得更複雜。

有些部分變得更容易。新興的“無服務器”讓我們只需編寫最基本的邏輯就行,但我們還未做到這一點。

當然,編寫函數更簡單,而其餘時間我們都在處理配置選項。

我們花數小時編寫幾百行YAML代碼,詳細說明一個又一個的決策,但由於某些原因,這並不被認為是“編碼”。

不管是不是編碼,所有這些想法都有一定的道理。不是程序員就不會理解這一點。這裡有一些可以解釋的因素,而不是當作藉口的理由。

當今,開發軟件是非常困難和復雜的

一、以前的代碼更簡單

想了解NASA的工作是怎麼做的,最好的方法是閱讀一些代碼,這些代碼被保存在GitHub存儲庫中。

隨機選擇一個文件,例如GROUND_TRACKING_DETERMINATION_PROGRAM.agc,該文件有204行,其中超過85行是註釋。與現代語言不同,每一行只包含一個操作,而現代語言可以將幾十個具有多個選項的操作打包到一行中。

當你瀏覽這些文件時,明顯感覺到它很簡單。儘管代碼在打印出來並放入活頁夾時看起來令人印象深刻,但它只有幾百個文件,大多數都很小,而且有非常詳細的註釋。

要知道,他們必須如此,阿波羅制導計算機只有36K的ROM來存放編譯好的版本。

這意味著程序員可以很容易地忽略一些特性請求,只專注於最重要的步驟。

對大多數現代程序員來說,代碼本身看起來難以理解,因為現在很少有開發人員學習閱讀彙編語言或機器碼。而學習編寫的人就更少了。

雖然它看起來很神秘,但語義要簡單得多。畢竟,機器只有一些寄存器、少量RAM和幾個用於分支的IF-THEN選項。

將這些規則與現代程序員處理closures或recursive object data等抽象時必須掌握的規則進行下比較。 Java團隊現在正推出第14版,一路走來,每個新版本都提供了新機制。

即使是旨在簡化編程的思想,比如JavaScript中的回調函數,也需要相當的抽象思維。

一旦你弄明白彙編程序的神秘指令名,它實際上就比較容易編寫了。

二、那時的安全更簡單

對於發射,NASA的安全措施很嚴格,但程序員們不必為連到互聯網的機器編寫代碼而操心。

阿波羅制導計算機只與休斯敦通信,而且頻率很低。而現在,每一部智能手機都在後台不斷地與數十個可能背地裡存在惡意的網站和服務進行交互。

這讓如今的代碼發布成為一個安全噩夢。

為什麼NASA能開發出軟件成功登月,而程序員卻搞不定一場選舉? 3

為保證一切安全,部署一個基本的容器需要處理一個特殊的文件,其中包含所有的密碼和“secrets”。

Android和iOS應用程序開發人員必須管理多個密鑰來為他們的應用程序簽名,然後才能上傳至應用商店。如果這些secrets 中的任何一個洩露出去,那任何一個連到互聯網的人都有可能強行進入並按自己的方式使用它。

現代的互聯網顯然更複雜,裡面有很多“壞人”,而垃圾郵件發送者、劫持者和網絡釣魚分子還算“好的”。

三、那時功能是重點

當時,還沒有設計委員會考慮按鈕是否應該移動一兩個像素。

沒有啟動畫面、沒有移動圖標、沒有背景陰影,也沒有數百萬種字體。直到1961年,IBM才推出​​可更改的字體Selectric

雖然現代程序員能利用優秀的標準,如HTML、CSS和SVG,以及不計其數的庫,如React或Vue,但同樣的程序員也必須遵循這些標準。

只要這些小真空管還在發光,宇航員們就很高興。

四、那時的移動部件更少

機械工程師往往會計算移動部件的數量,並將其作為衡量複雜性的指標。

月球著陸器的導航計算機有一項非常重要的工作,就是跟踪位置,僅此而已。

智能手機在同一時間做了無數事情,其中​​很多都被不加思考、漠不關心的大眾認為是理所當然的,但是,如果應用程序在幾毫秒內沒有響應,他們就會卸載它。

所有這些都增加了複雜性。自動化構建代碼、定義良好的API和無窮無盡的庫意味著程序員可以讓持續集成pipeline中的“精靈”來做大部分工作,但複雜性仍然存在。

一個僅打印“Hello World”的Go應用程序使用1.7版本編譯只有1.6MB,而Go 社區對這個消息感到很興奮,因為它之前有2.3MB。

五、那時可免於和律師打交道

根據我的計算,在亞馬遜雲服務上租用一台機器的基本服務條款有2.2萬字。為使用網站租用機器,還有一個完全不同的服務條款

然後,每個單獨的產品通常都有自己的TOS,比如Activate。它們加起來比月球著陸器電腦ROM裡36000個指令字還要長得多。

阿波羅程序員不知道電影《外星人》會有這樣的廣告語:“在太空中,沒有人能聽到你的尖叫”,但他們理解這個想法,也知道這意味著趁人之危的律師聽不到你的聲音。

英文原文:

5 reasons we don’t write code like we used to