­

寫程式碼也是一份人命關天的工作:盤點改變世界的那些程式碼

  • 2019 年 12 月 5 日
  • 筆記

選自slate

機器之心編譯

參與:高璇、張倩

讓人焦慮的「點贊」按鈕、失聯的火星氣候軌道飛行器、死難數百人的波音 737 Max 空難……原來都與程式碼有關。

2009 年,Facebook 推出了一份改變世界的程式碼——點「贊」按鈕。「贊」是包括 Leah Pearlman 和 Justin Rosenstein 在內的數名程式設計師和設計師的創意。他們認為 Facebook 用戶經常太忙而無法在朋友的帖子上發表評論,但是如果有一個簡單的按鈕可以使用,那一定會大受歡迎。「朋友們可以更頻繁、更輕鬆地相互點贊互動」,Pearlman 說。

這個按鈕奏效了,甚至有點超乎想像。到 2012 年,「贊」這個按鈕已經有了超過 1 萬億次的點擊。但它也產生了副作用。我們發布一張照片後,會坐立不安地刷新頁面,等待更多的「贊」。我們想知道為什麼別人的贊越來越多。因此,我們開始在社交網路中「暗暗發力」:變得更有趣、更犀利、更迷人、更極端。

程式碼重構了我們的生活。正如風險資本家 Marc Andreessen 寫的那樣,「軟體正在吞噬整個世界」,不過說軟體正在消化這個世界可能更準確。

因此,美國 Slate 雜誌做了這樣一個調查。為了釐清改變世界的那些軟體,編輯們對電腦科學家、軟體開發人員、歷史學家、政界人士和新聞工作者進行了民意調查。他們需要選擇:哪些程式碼有巨大影響力?哪些改變了我們的生活?有 75 位人士提出了自己的想法,Slate 選擇了其中 36 位(譯文有刪減)。這並不是一個完整的清單,因為有影響力的程式碼太多。該清單旨在激發思想——幫助我們重新思考程式碼如何影響我們的生活以及程式設計師的決策如何影響未來。

二進位穿孔卡片(1975 年)

第一種程式碼

二進位編程出現時間比電腦都早。Basile Bouchon 是第一個在紙上打孔並用它來控制機器的人:1725 年,他發明了一種織機,該織機根據所送入的穿孔紙編織出不同圖案。打孔是「1」,沒有打孔是「0」。此後機器發生了很多變化,但基本的程式碼組成並沒有改變。——Elena Botella, Slate

執行的第一個現代程式碼(1948 年)

引領了電腦程式碼的使用和核災難電腦模型的出現,為冷戰時期的軍備競賽打下了基礎

電子數字積分電腦是第一台可編程電子電腦。它於 1945 年完成,通過在許多組件之間進行連接來為每個新問題進行配置。當一項任務(例如加法)完成時,一個脈衝會觸發下一項任務。但是幾年後,馮·諾依曼(Von Neumann)和 Los Alamos 的科學家 Nicholas Metropolis 改進了 ENIAC,運行了在電腦上執行的第一條現代程式碼:從可定址的只讀存儲器(ENIAC 的功能表開關)執行數百條數字指令。他們使用蒙特卡洛技術模擬了在新墨西哥州的洛斯阿拉莫斯國家實驗室提出的幾種原子彈設計的爆炸過程,通過這種方法逐步模擬了複雜系統,繪製了可能結果的概率分布。馮·諾依曼和梅特羅波利斯向洛斯阿拉莫斯的核科學家發送了 20,000 多張卡片,通過引爆彈頭追蹤了模擬中子的過程。如今,此程式碼的後續版本仍在洛斯阿拉莫斯使用。——Thomas Haigh,《ENIAC in Action: Making and Remaking the Modern Computer》合著者

GRACE HOPPER 的編譯器(1952 年)

使電腦處理單詞成為可能

Grace Hopper 在對一台早期電腦編程時,為了簡化整個過程決定將程式語言植根於人類語言。霍珀(Hopper)在第二次世界大戰期間加入了美國海軍預備役。她知道,像她的軍事上司一樣,人們都在努力理解二進位程式碼。如果程式語言可以是基於英語的,那麼這項工作就不會那麼容易出錯,並且對於那些不是數學博士的人來說也更容易理解。

一些人對此想法不以為然,但到了 1950 年代初,她設計了一個編譯器,即一組指令,將一種更易懂的程式碼轉換為機器直接處理的低級程式碼。她和她的實驗室使用該工具開發了 FLOW-MATIC,這是第一種將英文單詞融入該過程的程式語言。——Molly Olmstead, Slate

太空戰爭!(1961 年)

第一個分散式影片遊戲(Spacewar)

電子郵件的起源(1965 年)

Come on,電子郵件來了!

阿波羅 11 號登月艙救援程式碼(1969 年)

防止登月艙電腦在太空中空間耗盡的程式碼

Hello, World!(1972 年或更早)

引領一代又一代人打開編程大門的程式碼

當你坐下來學習一種新的程式語言時,教程要求你做的第一件事就是讓電腦顯示「Hello,world!」。也許最著名的早期示例來自貝爾實驗室的「C—A 編程教程」。該教程寫於 1974 年,儘管在 1972 年的手冊中也發現了另一種更早的語言 B。

「Hello,world!」這是極好的教學方法。這是一項小的、可實現的任務,能夠使學生有成就感。這是一個標準,有助於說明不同程式語言之間的差異。這也是高級程式設計師確保安裝新環境後一切正常的一種快速簡便的方法。(有時程式設計師使用「到'hello world'的時間」比較語言和環境的速度。)也許最重要的是,「Hello,world!」能幫你打開編程的大門,它告訴你這就是新世界。——Chris Noessel,IBM AI 設計主管。

以空字元結尾的字元串(1972 年)

計算史上最大的災難性設計錯誤

1972 年,Dennis Ritchie 做出了一個重大決定:用一種名為「空字元結尾字元串」(null-terminated string)的新語言來表示文本。這個概念早就出現了,但是他把其寫進了他稱為 C 的新語言中,這個決定就一直影響我們到現在。

程式語言代表一段文本的主要方式有兩種:一是具有固定、顯式長度——「只包含 10 個字元,不能再多了」或者可以以空值結尾——「這裡有一串字元,繼續努力,直到看到零位元組為止!」

C 程式碼中有一個非常常見的錯誤,在將一個長字元串複製到一個較短的字元串中時,會出現結尾溢出,即你破壞了剛好在附近的其他數據。就像在白板的邊緣上亂塗亂畫一樣。

除了僅使程式出現故障外,還可以利用此類錯誤來改變程式行為,方法是使用經過精心設計的特定數據覆蓋某些內容。這些就是緩衝區溢出攻擊。你聽說過的幾乎所有安全漏洞都從 1988 年的 Morris Worm 開始。

你必須在 C 語言中仔細編碼以避免此類錯誤,但是此類錯誤仍然容易發生。從路由器到「智慧」燈泡,幾乎每種現代語言都避開了空字元結尾字元串,但是 C 和 C++仍然在語言界有支配地位。因此,近 50 年後的現在,我們還在「飽受折磨」。——Jamie Zawinski,Netscape 開發人員、Mozilla.org 創始人

溫哥華股票交易所的交易錯誤(1982 年)

不起眼的小數誤差造成極大損失

1982 年初,溫哥華證券交易所推出了一種電子股票指數,該指數最初定為 1000 點。在兩年內,它跌了一半,這在 1980 年代初期的牛市中似乎匪夷所思。一項調查顯示,使用 floor() 而非 round(),會造成對索引的計算錯誤。該命令意味著該值會被直接截止而不是四舍五 入到小數點後三位。(數字電腦必須具有有限的解析度,因此需要四捨五入或直接截止。)因此,如果索引計算為 532.7528,則會被存儲為 532.752,而不是四捨五入為 532.753。在每天數千次計算的過程中,這種看似很小的差異——每次必須四捨五入時未進行四捨五入——導致了巨大損失。這個編程錯誤最終在 1983 年 11 月得到解決,當時周五的收盤指數在 500 點左右。問題解決後,該股票於周一重新開盤,指數就超過了 1,000 美元,損失的價值得以恢復。——Lav Varshney,伊利諾伊大學香檳分校助理教授

THERAC-25(1985-1987 年)

過度自信是致命的

當真相浮出水面時,各大媒體的頭版頭條就對機器現代化發出了警告。《洛杉磯時報》宣稱:「在這個複雜時代,軟體漏洞變得致命。」一台用於治療癌症的機器在幾家醫療機構中對六名患者進行了大劑量過量輻射,造成至少三人死亡。

研究人員發現,Therac-25 的程式碼可能帶來致命的錯誤。該機器提供低功率和高功率治療,後者需要一個金屬設備來過濾光束。但是由於軟體中的錯誤,操作員可能會在沒有金屬設備的情況下意外觸發高功率模式。

Therac-25 被設計為 Therac-20 的「改進」,設計時被認為是萬無一失的,不需要外部安全檢查。結果:幾起死亡歸咎於過度自信的工程師,他們沒有考慮到失誤的可能性。——Molly Olmstead

互聯網中繼聊天(1988 年)

最初的在線掛機

莫里斯蠕蟲病毒(1988 年)

驚覺互聯網已經如此龐大

羅伯特·莫里斯(Robert Morris)和互聯網本身都還年輕。當時 23 歲的康奈爾大學研究生 Morris 發布了「莫里斯蠕蟲病毒(Morris Worm)」,這是所謂的「互聯網上的首次重大攻擊」。近 60,000 台連接到互聯網的電腦中有 10%遭到破壞,造成數百萬美元的損失,該事件導致《紐約時報》首次刊登了「互聯網」一詞。即使是精通技術的人也會吃驚於蠕蟲病毒的影響範圍之廣。Morris 說,他從未想過有如此大的損失,他成為根據《電腦欺詐和濫用法》被起訴的第一人。在被判處三年緩刑後,他成為著名的創業孵化器 Y Combinator 的共同創始人和麻省理工學院的電腦科學助理教授。——Elena Botella

只有一行程式碼的病毒(日期:90 年代)

單行程式碼的功能以及電腦驚人的脆弱

上圖展示的是一種名為「fork 炸彈」的單行病毒。它需要一些特定的條件才能被觸發(包括較舊、易受影響的 Unix 作業系統副本)。如果在 Bash 中鍵入此命令,它將一遍又一遍地複製自己,直到耗盡電腦中的所有可用記憶體並導致崩潰。

它之所以有名不是因為它相對於其大小所表現的危險性,而是它使用冒號作為函數名稱。大多數函數(可重複使用的程式碼行)都以描述性方式命名,例如「Print」或「isThisEmailValid」,但並沒有規定必須如此。在大多數計算語言中,不能使用冒號作為函數名稱,但在 Bash 中可以。

2002 年,我在德國法蘭克福的 Angewandte Kunst 博物館第一次看到作為展品的這行程式碼。博物館中沒有展示多少程式碼。——Chris Noessel

HTML 超鏈接(1990 年)

連接一切的工具

JPEG(1992 年)

改變了我們與攝影的關係

Mosaic 瀏覽器(1993 年)

第一個獲普遍使用且能夠顯示圖片的網頁瀏覽器

跟蹤像素(1993 年)

現代數據收集始於這些看不見的影像。

通過跟蹤像素下載,他們會了解了你的身份和位置,並觸發一個 cookie 下載到你的瀏覽器中。該 cookie 使廣告商可以在多個網站上跟蹤你。

像素跟蹤的成功直接導致了 Facebook 的點「贊」按鈕出現,該按鈕可在每個嵌入的網站上進行跟蹤。大量的數據收集實現了高度定向,也使 Facebook 廣告大獲成功,最終 Facebook 從媒體公司口袋裡賺到數十億美元。

Robots.txt(1994 年)

一個對搜索及其他應用均具有重大意義的小工具

維基(1994 年)

為維基百科鋪平了道路

第一個彈出廣告(90 年代中期)

互聯網的「害群之馬」

Google 的 PageRank 演算法(1996 年)

革新我們組織知識的方式

在 PageRank 之前,搜索引擎根據我們的查詢詞是否與文檔中的詞匹配來查找資訊。但是對於 PageRank,拉里·佩奇和謝爾蓋·布林提出了一個絕妙的主意:知識是社會性的,搜索也應該是。他們創建了一種演算法,通過網路浩瀚的超鏈接關係來確定一個頁面的等級。一個頁面的 PageRank 是由所有鏈向它的頁面的重要性經過遞歸演算法得到的,一個有較多鏈入的頁面會有較高的等級。正是兩位這種獨具慧眼的洞察力造就了 Google 的當今地位。——Clive Thompson

失聯的火星氣候軌道飛行器(1999 年)

因數學錯誤而失敗的任務

1999 年 9 月 23 日,NASA 的科學家與耗資 1.25 億美元的「火星氣候軌道飛行器」失聯。後來的調查確定了原因:承包商使用英制單位為軌道飛行器編寫了程式,這在美國是標準的,但是 NASA 的軟體使用了公制。兩段程式碼之間一次簡單的通訊錯誤使軌道飛行器飛向了未知的地方。

人們很容易把這種度量錯誤看做偶然,但這表明當下這個互聯軟體的世界多麼脆弱。所有互聯的技術(電話、航天器、機器人榨汁機等等)都依賴於定義與他人進行通訊的方式的介面。極小的差異也會導致混亂。——Charles Duan

比特幣(2008 年)

激發人們對某種貨幣的信心的程式碼

點贊按鈕(2009 年)

它催化了監視經濟。

Facebook 設計的點「贊」按鈕,使我們可以向世界展示我們的喜歡《辛普森一家》或炸薯條。但實際上,它利用了我們的認知偏見和設計的力量,誘使我們分享更多的資訊。它們利用上面提到的跟蹤像素在互聯網上跟蹤我們,收集有關我們瀏覽習慣的數據。然後,Facebook 利用該資訊,並將其行為定位演算法賣給廣告商。如果一家戶外用品公司想要做廣告,那麼 Facebook 可以鎖定那些「點贊」遠足資訊、訪問露營網站以及有戶外朋友的人。當這些用戶給公司的廣告點贊時,該資訊就會回饋到定位演算法中。因此,監視和商業操縱會形成循環。都是因為一個小小的藍色豎起大拇指。——Ari Ezra Waldman,紐約法學院教授

波音 737 Max(2017 年)

軟體錯誤加上公司貪婪,導致數百人喪生,大批飛機停飛

2018 年 10 月,獅航 610 航班起飛後不久就墜入海中。波音向公眾保證飛機是安全的,並表示需要更多的飛行員訓練和「軟體升級」。但是僅僅四個月後,衣索比亞航空又有一架飛機失事。飛行員努力將機頭抬起 20 次,但飛機的自動系統卻將機頭往下拉。起飛後幾分鐘內,就機毀人亡。全球航空當局當即將飛機停飛。調查顯示,墜機事故是由 737 Max 的設計引起的,尤其是那些鮮為人知的軟體,可能迫使飛機不斷俯衝。——Mar Hicks,技術史學家,《Programmed Inequality (http://www.amazon.com/dp/0262535181/?tag=slatmaga-20)》作者。

原文鏈接:https://slate.com/technology/2019/10/consequential-computer-code-software-history.html