盤點那些改變世界的代碼

轉自機器之心,參與高璇、張倩


讓人焦慮的「點贊」按鈕、失聯的火星氣候軌道飛行器、死難數百人的波音 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》作者。


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

---


分享到:


相關文章: