2009 年,F(xiàn)acebook 推出了一份改變世界的代碼——點(diǎn)「贊」按鈕?!纲潯故前?Leah Pearlman 和 Justin Rosenstein 在內(nèi)的數(shù)名程序員和設(shè)計師的創(chuàng)意。他們認(rèn)為 Facebook 用戶經(jīng)常太忙而無法在朋友的帖子上發(fā)表評論,但是如果有一個簡單的按鈕可以使用,那一定會大受歡迎?!概笥褌兛梢愿l繁、更輕松地相互點(diǎn)贊互動」,Pearlman 說。 這個按鈕奏效了,甚至有點(diǎn)超乎想象。到 2012 年,「贊」這個按鈕已經(jīng)有了超過 1 萬億次的點(diǎn)擊。但它也產(chǎn)生了副作用。我們發(fā)布一張照片后,會坐立不安地刷新頁面,等待更多的「贊」。我們想知道為什么別人的贊越來越多。因此,我們開始在社交網(wǎng)絡(luò)中「暗暗發(fā)力」:變得更有趣、更犀利、更迷人、更極端。 代碼重構(gòu)了我們的生活。正如風(fēng)險資本家 Marc Andreessen 寫的那樣,「軟件正在吞噬整個世界」,不過說軟件正在消化這個世界可能更準(zhǔn)確。
因此,美國 Slate 雜志做了這樣一個調(diào)查。為了厘清改變世界的那些軟件,編輯們對計算機(jī)科學(xué)家、軟件開發(fā)人員、歷史學(xué)家、政界人士和新聞工作者進(jìn)行了民意調(diào)查。他們需要選擇:哪些代碼有巨大影響力?哪些改變了我們的生活?有 75 位人士提出了自己的想法,Slate 選擇了其中 36 位(譯文有刪減)。這并不是一個完整的清單,因?yàn)橛杏绊懥Φ拇a太多。該清單旨在激發(fā)思想——幫助我們重新思考代碼如何影響我們的生活以及程序員的決策如何影響未來。
二進(jìn)制穿孔卡片(1975 年) 第一種代碼 二進(jìn)制編程出現(xiàn)時間比計算機(jī)都早。Basile Bouchon 是第一個在紙上打孔并用它來控制機(jī)器的人:1725 年,他發(fā)明了一種織機(jī),該織機(jī)根據(jù)所送入的穿孔紙編織出不同圖案。打孔是「1」,沒有打孔是「0」。此后機(jī)器發(fā)生了很多變化,但基本的代碼組成并沒有改變?!狤lena Botella, Slate ? 執(zhí)行的第一個現(xiàn)代代碼(1948 年) 引領(lǐng)了計算機(jī)代碼的使用和核災(zāi)難計算機(jī)模型的出現(xiàn),為冷戰(zhàn)時期的軍備競賽打下了基礎(chǔ)
電子數(shù)字積分計算機(jī)是第一臺可編程電子計算機(jī)。它于 1945 年完成,通過在許多組件之間進(jìn)行連接來為每個新問題進(jìn)行配置。當(dāng)一項(xiàng)任務(wù)(例如加法)完成時,一個脈沖會觸發(fā)下一項(xiàng)任務(wù)。但是幾年后,馮·諾依曼(Von Neumann)和 Los Alamos 的科學(xué)家 Nicholas Metropolis 改進(jìn)了 ENIAC,運(yùn)行了在計算機(jī)上執(zhí)行的第一條現(xiàn)代代碼:從可尋址的只讀存儲器(ENIAC 的功能表開關(guān))執(zhí)行數(shù)百條數(shù)字指令。他們使用蒙特卡洛技術(shù)模擬了在新墨西哥州的洛斯阿拉莫斯國家實(shí)驗(yàn)室提出的幾種原子彈設(shè)計的爆炸過程,通過這種方法逐步模擬了復(fù)雜系統(tǒng),繪制了可能結(jié)果的概率分布。馮·諾依曼和梅特羅波利斯向洛斯阿拉莫斯的核科學(xué)家發(fā)送了 20,000 多張卡片,通過引爆彈頭追蹤了模擬中子的過程。如今,此代碼的后續(xù)版本仍在洛斯阿拉莫斯使用?!猅homas Haigh,《ENIAC in Action: Making and Remaking the Modern Computer》合著者
GRACE HOPPER 的編譯器(1952 年)
使計算機(jī)處理單詞成為可能
Grace Hopper 在對一臺早期計算機(jī)編程時,為了簡化整個過程決定將編程語言植根于人類語言?;翮辏℉opper)在第二次世界大戰(zhàn)期間加入了美國海軍預(yù)備役。她知道,像她的軍事上司一樣,人們都在努力理解二進(jìn)制代碼。如果編程語言可以是基于英語的,那么這項(xiàng)工作就不會那么容易出錯,并且對于那些不是數(shù)學(xué)博士的人來說也更容易理解。 一些人對此想法不以為然,但到了 1950 年代初,她設(shè)計了一個編譯器,即一組指令,將一種更易懂的代碼轉(zhuǎn)換為機(jī)器直接處理的低級代碼。她和她的實(shí)驗(yàn)室使用該工具開發(fā)了 FLOW-MATIC,這是第一種將英文單詞融入該過程的編程語言?!狹olly Olmstead, Slate
太空戰(zhàn)爭!(1961 年)
第一個分布式視頻游戲(Spacewar)
? 電子郵件的起源(1965 年) Come on,電子郵件來了!
阿波羅 11 號登月艙救援代碼(1969 年) 防止登月艙計算機(jī)在太空中空間耗盡的代碼
? Hello, World!(1972 年或更早) 引領(lǐng)一代又一代人打開編程大門的代碼
當(dāng)你坐下來學(xué)習(xí)一種新的編程語言時,教程要求你做的第一件事就是讓計算機(jī)顯示「Hello,world!」。也許最著名的早期示例來自貝爾實(shí)驗(yàn)室的「C—A 編程教程」。該教程寫于 1974 年,盡管在 1972 年的手冊中也發(fā)現(xiàn)了另一種更早的語言 B。
「Hello,world!」這是極好的教學(xué)方法。這是一項(xiàng)小的、可實(shí)現(xiàn)的任務(wù),能夠使學(xué)生有成就感。這是一個標(biāo)準(zhǔn),有助于說明不同編程語言之間的差異。這也是高級程序員確保安裝新環(huán)境后一切正常的一種快速簡便的方法。(有時程序員使用「到'hello world'的時間」比較語言和環(huán)境的速度。)也許最重要的是,「Hello,world!」能幫你打開編程的大門,它告訴你這就是新世界?!狢hris Noessel,IBM AI 設(shè)計主管。
以空字符結(jié)尾的字符串(1972 年)
計算史上最大的災(zāi)難性設(shè)計錯誤
1972 年,Dennis Ritchie 做出了一個重大決定:用一種名為「空字符結(jié)尾字符串」(null-terminated string)的新語言來表示文本。這個概念早就出現(xiàn)了,但是他把其寫進(jìn)了他稱為 C 的新語言中,這個決定就一直影響我們到現(xiàn)在。 編程語言代表一段文本的主要方式有兩種:一是具有固定、顯式長度——「只包含 10 個字符,不能再多了」或者可以以空值結(jié)尾——「這里有一串字符,繼續(xù)努力,直到看到零字節(jié)為止!」 C 代碼中有一個非常常見的錯誤,在將一個長字符串復(fù)制到一個較短的字符串中時,會出現(xiàn)結(jié)尾溢出,即你破壞了剛好在附近的其他數(shù)據(jù)。就像在白板的邊緣上亂涂亂畫一樣。 除了僅使程序出現(xiàn)故障外,還可以利用此類錯誤來改變程序行為,方法是使用經(jīng)過精心設(shè)計的特定數(shù)據(jù)覆蓋某些內(nèi)容。這些就是緩沖區(qū)溢出攻擊。你聽說過的幾乎所有安全漏洞都從 1988 年的 Morris Worm 開始。 你必須在 C 語言中仔細(xì)編碼以避免此類錯誤,但是此類錯誤仍然容易發(fā)生。從路由器到「智能」燈泡,幾乎每種現(xiàn)代語言都避開了空字符結(jié)尾字符串,但是 C 和 C++仍然在語言界有支配地位。因此,近 50 年后的現(xiàn)在,我們還在「飽受折磨」?!狫amie Zawinski,Netscape 開發(fā)人員、Mozilla.org 創(chuàng)始人
溫哥華股票交易所的交易錯誤(1982 年)
不起眼的小數(shù)誤差造成極大損失
1982 年初,溫哥華證券交易所推出了一種電子股票指數(shù),該指數(shù)最初定為 1000 點(diǎn)。在兩年內(nèi),它跌了一半,這在 1980 年代初期的牛市中似乎匪夷所思。一項(xiàng)調(diào)查顯示,使用 floor() 而非 round(),會造成對索引的計算錯誤。該命令意味著該值會被直接截止而不是四舍五 入到小數(shù)點(diǎn)后三位。(數(shù)字計算機(jī)必須具有有限的分辨率,因此需要四舍五入或直接截止。)因此,如果索引計算為 532.7528,則會被存儲為 532.752,而不是四舍五入為 532.753。在每天數(shù)千次計算的過程中,這種看似很小的差異——每次必須四舍五入時未進(jìn)行四舍五入——導(dǎo)致了巨大損失。這個編程錯誤最終在 1983 年 11 月得到解決,當(dāng)時周五的收盤指數(shù)在 500 點(diǎn)左右。問題解決后,該股票于周一重新開盤,指數(shù)就超過了 1,000 美元,損失的價值得以恢復(fù)。——Lav Varshney,伊利諾伊大學(xué)香檳分校助理教授 ? THERAC-25(1985-1987 年)
過度自信是致命的 當(dāng)真相浮出水面時,各大媒體的頭版頭條就對機(jī)器現(xiàn)代化發(fā)出了警告?!堵迳即墪r報》宣稱:「在這個復(fù)雜時代,軟件漏洞變得致命?!挂慌_用于治療癌癥的機(jī)器在幾家醫(yī)療機(jī)構(gòu)中對六名患者進(jìn)行了大劑量過量輻射,造成至少三人死亡。 研究人員發(fā)現(xiàn),Therac-25 的代碼可能帶來致命的錯誤。該機(jī)器提供低功率和高功率治療,后者需要一個金屬設(shè)備來過濾光束。但是由于軟件中的錯誤,操作員可能會在沒有金屬設(shè)備的情況下意外觸發(fā)高功率模式。 Therac-25 被設(shè)計為 Therac-20 的「改進(jìn)」,設(shè)計時被認(rèn)為是萬無一失的,不需要外部安全檢查。結(jié)果:幾起死亡歸咎于過度自信的工程師,他們沒有考慮到失誤的可能性?!狹olly Olmstead
互聯(lián)網(wǎng)中繼聊天(1988 年)
最初的在線掛機(jī)
? 莫里斯蠕蟲病毒(1988 年)
驚覺互聯(lián)網(wǎng)已經(jīng)如此龐大
羅伯特·莫里斯(Robert Morris)和互聯(lián)網(wǎng)本身都還年輕。當(dāng)時 23 歲的康奈爾大學(xué)研究生 Morris 發(fā)布了「莫里斯蠕蟲病毒(Morris Worm)」,這是所謂的「互聯(lián)網(wǎng)上的首次重大攻擊」。近 60,000 臺連接到互聯(lián)網(wǎng)的計算機(jī)中有 10%遭到破壞,造成數(shù)百萬美元的損失,該事件導(dǎo)致《紐約時報》首次刊登了「互聯(lián)網(wǎng)」一詞。即使是精通技術(shù)的人也會吃驚于蠕蟲病毒的影響范圍之廣。Morris 說,他從未想過有如此大的損失,他成為根據(jù)《計算機(jī)欺詐和濫用法》被起訴的第一人。在被判處三年緩刑后,他成為著名的創(chuàng)業(yè)孵化器 Y Combinator 的共同創(chuàng)始人和麻省理工學(xué)院的計算機(jī)科學(xué)助理教授?!狤lena Botella
只有一行代碼的病毒(日期:90 年代)
單行代碼的功能以及計算機(jī)驚人的脆弱
上圖展示的是一種名為「fork 炸彈」的單行病毒。它需要一些特定的條件才能被觸發(fā)(包括較舊、易受影響的 Unix 操作系統(tǒng)副本)。如果在 Bash 中鍵入此命令,它將一遍又一遍地復(fù)制自己,直到耗盡計算機(jī)中的所有可用內(nèi)存并導(dǎo)致崩潰。 它之所以有名不是因?yàn)樗鄬τ谄浯笮∷憩F(xiàn)的危險性,而是它使用冒號作為函數(shù)名稱。大多數(shù)函數(shù)(可重復(fù)使用的代碼行)都以描述性方式命名,例如「Print」或「isThisEmailValid」,但并沒有規(guī)定必須如此。在大多數(shù)計算語言中,不能使用冒號作為函數(shù)名稱,但在 Bash 中可以。 2002 年,我在德國法蘭克福的 Angewandte Kunst 博物館第一次看到作為展品的這行代碼。博物館中沒有展示多少代碼?!狢hris Noessel
HTML 超鏈接(1990 年)
連接一切的工具
JPEG(1992 年)
改變了我們與攝影的關(guān)系
Mosaic 瀏覽器(1993 年)
第一個獲普遍使用且能夠顯示圖片的網(wǎng)頁瀏覽器
跟蹤像素(1993 年)
現(xiàn)代數(shù)據(jù)收集始于這些看不見的圖像。
通過跟蹤像素下載,他們會了解了你的身份和位置,并觸發(fā)一個 cookie 下載到你的瀏覽器中。該 cookie 使廣告商可以在多個網(wǎng)站上跟蹤你。 像素跟蹤的成功直接導(dǎo)致了 Facebook 的點(diǎn)「贊」按鈕出現(xiàn),該按鈕可在每個嵌入的網(wǎng)站上進(jìn)行跟蹤。大量的數(shù)據(jù)收集實(shí)現(xiàn)了高度定向,也使 Facebook 廣告大獲成功,最終 Facebook 從媒體公司口袋里賺到數(shù)十億美元。
Robots.txt(1994 年)
一個對搜索及其他應(yīng)用均具有重大意義的小工具
? 維基(1994 年)
為維基百科鋪平了道路
第一個彈出廣告(90 年代中期)
互聯(lián)網(wǎng)的「害群之馬」
? Google 的 PageRank 算法(1996 年)
革新我們組織知識的方式
在 PageRank 之前,搜索引擎根據(jù)我們的查詢詞是否與文檔中的詞匹配來查找信息。但是對于 PageRank,拉里·佩奇和謝爾蓋·布林提出了一個絕妙的主意:知識是社會性的,搜索也應(yīng)該是。他們創(chuàng)建了一種算法,通過網(wǎng)絡(luò)浩瀚的超鏈接關(guān)系來確定一個頁面的等級。一個頁面的 PageRank 是由所有鏈向它的頁面的重要性經(jīng)過遞歸算法得到的,一個有較多鏈入的頁面會有較高的等級。正是兩位這種獨(dú)具慧眼的洞察力造就了 Google 的當(dāng)今地位?!狢live Thompson
失聯(lián)的火星氣候軌道飛行器(1999 年)
因數(shù)學(xué)錯誤而失敗的任務(wù) 1999 年 9 月 23 日,NASA 的科學(xué)家與耗資 1.25 億美元的「火星氣候軌道飛行器」失聯(lián)。后來的調(diào)查確定了原因:承包商使用英制單位為軌道飛行器編寫了程序,這在美國是標(biāo)準(zhǔn)的,但是 NASA 的軟件使用了公制。兩段代碼之間一次簡單的通訊錯誤使軌道飛行器飛向了未知的地方。 人們很容易把這種度量錯誤看做偶然,但這表明當(dāng)下這個互聯(lián)軟件的世界多么脆弱。所有互聯(lián)的技術(shù)(電話、航天器、機(jī)器人榨汁機(jī)等等)都依賴于定義與他人進(jìn)行通信的方式的接口。極小的差異也會導(dǎo)致混亂?!狢harles Duan
比特幣(2008 年)
激發(fā)人們對某種貨幣的信心的代碼
? 點(diǎn)贊按鈕(2009 年)
它催化了監(jiān)視經(jīng)濟(jì)。
Facebook 設(shè)計的點(diǎn)「贊」按鈕,使我們可以向世界展示我們的喜歡《辛普森一家》或炸薯?xiàng)l。但實(shí)際上,它利用了我們的認(rèn)知偏見和設(shè)計的力量,誘使我們分享更多的信息。它們利用上面提到的跟蹤像素在互聯(lián)網(wǎng)上跟蹤我們,收集有關(guān)我們?yōu)g覽習(xí)慣的數(shù)據(jù)。然后,F(xiàn)acebook 利用該信息,并將其行為定位算法賣給廣告商。如果一家戶外用品公司想要做廣告,那么 Facebook 可以鎖定那些「點(diǎn)贊」遠(yuǎn)足信息、訪問露營網(wǎng)站以及有戶外朋友的人。當(dāng)這些用戶給公司的廣告點(diǎn)贊時,該信息就會反饋到定位算法中。因此,監(jiān)視和商業(yè)操縱會形成循環(huán)。都是因?yàn)橐粋€小小的藍(lán)色豎起大拇指?!狝ri Ezra Waldman,紐約法學(xué)院教授
波音 737 Max(2017 年)
軟件錯誤加上公司貪婪,導(dǎo)致數(shù)百人喪生,大批飛機(jī)停飛 2018 年 10 月,獅航 610 航班起飛后不久就墜入海中。波音向公眾保證飛機(jī)是安全的,并表示需要更多的飛行員訓(xùn)練和「軟件升級」。但是僅僅四個月后,埃塞俄比亞航空又有一架飛機(jī)失事。飛行員努力將機(jī)頭抬起 20 次,但飛機(jī)的自動系統(tǒng)卻將機(jī)頭往下拉。起飛后幾分鐘內(nèi),就機(jī)毀人亡。全球航空當(dāng)局當(dāng)即將飛機(jī)停飛。調(diào)查顯示,墜機(jī)事故是由 737 Max 的設(shè)計引起的,尤其是那些鮮為人知的軟件,可能迫使飛機(jī)不斷俯沖?!狹ar Hicks,技術(shù)史學(xué)家,《Programmed Inequality (http://www.amazon.com/dp/0262535181/?tag=slatmaga-20)》作者。
編輯:黃飛
?
評論