人類歷史上最重要的36個代碼片段(一) [復制鏈接]

2019-11-5 11:47
techlearn 閱讀:152 評論:0 贊:0
Tag:  代碼片段

編者按:Marc Andreessen十年前說的“軟件蠶食世界”不僅完全正確,而且似乎不僅如此:軟件正在重塑世界。人類世界的運轉已經無法離開軟件。在浩如煙海的軟件代碼當中,哪些對我們起到了關鍵作用呢?Slate網站邀請了各方人士對那些改變了一切的代碼進行評選,這里篩選出36個代碼片段。如果你有更好的選項,不妨在評論區留下你的意見。原文作者是Future Tense,標題是:The Lines of Code That Changed Everything。鑒于篇幅太長,我們將分三部分刊出,此為第一部分。

人類歷史上最重要的36個代碼片段(二)

http://www.rhpqoj.live/blog-986555-82048.html

人類歷史上最重要的36個代碼片段(三)

http://www.rhpqoj.live/blog-986555-82049.html


早在2009年,Facebook推出了改變世界的代碼段——點“贊”按鈕。“贊”是幾名程序員和設計師的創意,其中包括Leah Pearlman和Justin Rosenstein在內。他們推測,Facebook用戶常常因為太忙而沒時間到朋友的帖子上發表評論,所以想如果有一個簡單的按鈕可以按一下的話,也許互動就會爆發:這可以釋放出大量令人興奮的肯定。就像Pearlman 后來所說那樣:“朋友們可以通過這種頻繁的多、容易得多的互動手段來相互驗證。”

這個點子奏效了,也許有點太好了。通過把“贊”做成一個零阻力的手勢,到了2012年,大家的點贊次數已經超過1萬億次,并且的確釋放出了大量的驗證。但是它的副作用也令人不安。我們發布了一張照之后片,就會坐在那里焦急地不斷刷新頁面,等待點贊數的增加。我們想知道為什么別人拿到的點贊數會比自己的多。于是我們開始給自己日常的在線行為放大功率:想變得更有趣、更刻薄、更迷人、更極端。

代碼塑造了我們的生活。就像風投家Marc Andreessen所寫那樣:“ 軟件蠶食整個世界”,盡管此刻說軟件正在消化世界可能會更準確些。

從文化角度上來講,代碼是比較下層的存在。我們可以感覺到它對我們日常現實的神秘影響,但是卻很少能看到它,而且對于非初學者來說有點高深莫測。(硅谷的人喜歡這樣這有助于他們自我神話為巫師。)我們給電影、游戲和電視都立了十大排行榜,讓那些塑造了我們靈魂的作品揚名立萬。但是,即便代碼跟這些類型的作品一樣反映了時代思潮,我們卻未曾坐下來匯編過世界上最重要的代碼清單。

所以Slate雜志決定自己來做這件事。為了弄清楚有哪些讓世界為之傾斜的軟件,雜志編輯對計算機科學家、軟件開發人員、歷史學家、政策制定者以及新聞工作者進行了民意調查。這些人需要做出以下選擇:哪些代碼段影響巨大?哪些代碼改變了我們的生活?約有75位受訪者提出了各種各樣的想法,Slate從中選擇了36位。鑒于寫成的有影響的代碼如汗牛充棟,這里的清單并不完整,也不可能完整。(我很喜歡的一個并沒有人選:快速排序算法!或者Ada Lovelace的伯努利算法也許也算一個。)就像所有的榜單一樣,它的目的是啟發,去幫助我們重新思考代碼是如何影響我們的生活,以及程序員所做的決策是如何影響未來的。

里面的有些代碼你可能已經聽說過,比如HTML什么的。有的代碼功能強大(比如用來對概率建模的蒙特卡洛模擬),但一般人完全不知道是什么。有的則包含了致命錯誤,比方說波音737 Max的缺陷。還有一些令人毛骨悚然,比方說讓營銷人員知道你是否已打開電子郵件的像素跟蹤。

有一個趨勢是很明顯的:最重要的代碼往往會通過消除阻力來塑造新行為。當軟件讓做某件事情變得更容易時,這種事情我們就會做得更多。1988年編寫的代碼第一次建立起“Internet Relay Chat(IRC,多人在線交談系統)”,這使得早期的網民彼此可以實時進行文字聊天。現在,實時文字聊天已經無處不在,從令人應接不暇的Slack職場閑聊吹水,到Twitch直播的釣魚和反釣魚之戰,不一而足。

某些代碼什么時候具備了劃時代意義未必總是很清晰。一開始它只是個怪異的嘗試,一個實驗氣球。《Spacewar !》是第一個獲得病毒式流行的視頻游戲。可是在1961年的時候,用價值12萬美元(相當于2019年的100萬美元)的機柜式計算機萬游戲被視為一種相當無聊的使用方式。但是它獨創了很多幫助計算機進入主流的概念:用圖標表示數據,讓用戶用手持控制器操作這些圖標。

代碼的影響可能會讓所有人感到驚訝,包括寫代碼的人在內。—Clive Thompson,《程序員: 新部落的形成和世界的重塑(Coders: The Making of a New Tribe and the Remaking of the World)》作者

1、二進制穿孔卡片

年代:1725

第一段代碼

二進制編程早在計算機誕生之前就有了。大家認為Basile Bouchon 是第一個給紙片打孔并用來控制機器的人:1725年,他發明了一種織布機,這種機器可以根據送入的穿孔卡片的指令編織圖案。打孔的是“1”,沒有打孔是“0”。盡管此后東西發生了很大的變化,但代碼的基本構建塊并沒有改變。— Elena Botella ,Slate

2、執行的第一段現代代碼

年代:1948

既開辟了計算機代碼的使用,也引領了塑造冷戰軍備競賽的核毀滅計算機模型的使用

ENIAC(電子數字積分計算機)是第一臺可編程的電子計算機。機器于1945年建成,每解決一個新問題都要靠重新連線許多部件來完成。當一項任務(比如加法)完成時,會用一個脈沖來觸發下一項任務。但是幾年后,克拉拉· 丹·馮·諾依曼和洛斯阿拉莫斯的科學家Nicholas Metropolis對ENIAC重新進行了接線,讓這臺機器跑出來有史以來在任何計算機上執行的第一段現代代碼:從可尋址只讀存儲器(ENIAC的函數表開關)執行數百條數字指令。他們模擬了新墨西哥州洛斯阿拉莫斯國家實驗室正在評估的幾種原子彈設計的爆炸情況,用蒙特卡洛技術來模擬一個復雜系統,幾乎是一步步地把可能結果的概率分布呈現出來。馮·諾依曼和Metropolis)向洛斯阿拉莫斯的核科學家發送了20000多張卡片,跟蹤彈頭引爆后模擬中子的變化情況。知道今天,這段代碼的子孫后代還在洛斯阿拉莫斯那里發揮作用。—Thomas Haigh ,《ENIAC in Action: Making and Remaking the Modern Computer(ENIAC實戰:現代計算機的制造和改造)》合著者

3、Grace Hopper的編譯器

年代:1952

令計算機處理文字成為可能

IF END OF DATA GO TO OPERATION 14 .

來自維基百科

當Grace Hopper決定通過以人類語言為基礎來簡化整個過程時,她正在對一臺早期計算機進行編程。二戰期間,Hopper加入了美國海軍預備隊,她知道,像她在部隊的上司一樣,大家都在努力去理解二進制代碼。而如果編程語言是基于英語的話,那么這項工作就不會那么容易出錯,并且對于那些沒有數學博士學位的人來說也更加平易近人了。

一些人對這種想法嗤之以鼻,但1950年代初時,她設計出了一種編譯器,也就是一組可以將更容易理解的代碼轉化為由機器處理的較低級代碼的指令。通過這一工具,她和她的實驗室開發出了FLOW-MATIC,這是第一種將英語納入該過程的編程語言。——Molly Olmstead,Slate

4、星際飛行(Spacewar)!

年代:1961年

發行的第一款視頻游戲

/ this routine handles a non-colliding ship invisibly

/ in hyperspace

hp1, dap hp2

count i ma1, hp2

law hp3 / next step

dac i ml1

law 7

dac i mb1

random

scr 9s

sir 9s

xct hr1

add i mx1

dac i mx1

swap

add i my1

dac i my1

random

scr 9s

sir 9s

xct hr2

dac i mdy

dio i mdx

setup .hpt,3

lac ran

dac i mth

hp4, lac i mth

sma

sub (311040

spa

add (311040

dac i mth

count .hpt,hp4

xct hd2

dac i ma1

hp2, jmp .

Steve Russell,收集自Bitsavers.org

1961年末,一群年輕的MIT雇員、學生和同事(其中很多是Tech Model Railroad俱樂部的成員)拿到了最近別人捐贈的DEC PDP-1計算機的深夜使用權。屬于非軍事計算前沿技術的PDP-1售價為12萬美元(按今天計算將超過100萬美元),字長達18位,程序存儲用的是紙帶。這幫程序員用五個月的時間開發了一個游戲,里面是兩名玩家控制著飛船(針和楔形物)進行一對一的太空戰,同時還要避開位于屏幕中心的恒星的引力。

很快,星際飛行!就在早期的“黑客”社區中傳播開來。后來DEC把它預裝進了每一臺PDP-1里面,并預裝到核心內存里面,準備在安裝時進行演示。這個程序對1960年代規模還很小的編碼社區產生了重大影響,并啟發了后面數代的視頻游戲創作者。現在它還從模擬者那里找到自己的存在,并且在計算機歷史博物館的最后一臺可操作PDP-1上還在定期演示。2018年,游戲的首席開發者Steve Russell在史密森尼學會上說:“它已有50多年的歷史。沒有未解決的用戶投訴。沒有崩潰報告。而且支持依舊提供。”——Arthur Daemmrich ,導演,勒梅森發明與創新研究中心

5、電子郵件的起源

年代:1965

拜托,這是電子郵件。

WHENEVER A(1).E.FENCE.OR.A(2).E.FENCE.OR.A(3).E.FENCE

PRFULL.($'R'1INSTRUCTIONS:$)

PRFULL.($ '4MAIL NAME1 NAME2 PROB1 PROG1 PROB2 PROG2 ...$)

PRFULL.($ WHERE '=NAME1 NAME2'= IS THE FILE TO BE MAILED,$)

PRFULL.($ AND '=PROBN PROGN'= ARE DIRECTORIES TO WHICH '8$,

1 $IT IS TO BE SENT.'B$)

CHNCOM.(0)

END OF CONDITIONAL

CTSS 程序員MAIL手冊頁

1961年,麻省理工學院的黑客開發了一個系統,這個可以讓多個用戶登錄到同一臺計算機上,然后他們開始互相給對方簡短留言。1965年,一群編碼人員決定開發一個正式的命令系統來發送、接收和顯示這些數字化的信函。對于“MAIL”這個命令一開始上級是拒絕的,覺得有點輕率,但它的使用卻大行其道,以至于到1971年,麻省理工學院甚至出現了第一條垃圾郵件:一條反越戰的信息。——Clive Thompson

6、警察巡邏算法

年代:1968

現代預測警務和種族定性計算機化的開始

1965年,當林登·約翰遜總統組建總統執法與司法委員會時,他下令該委員會研究如何利用計算機來幫助解決美國的的“犯罪問題”,他和該委員會對這個問題的定性是“城市問題”和“黑人問題”。這個問題的答案是“警察巡邏算法(Police Beat Algorithm,PBA)”,該算法旨在解決規劃問題,比方說在城市的特定區域需要安排多少名警察巡邏之類的問題。通過將PBA與犯罪數據庫相結合,警方可以在犯罪實施之前根據種族人口統計數據自動生成嫌犯檔案,并相應部署資源(警察,武器和其他裝備)。今天的預測警務對黑人和棕色人種監視并定罪的情況相對不成比例。就像PBA的故事提醒我們那樣,這種情況并不是不可預見的技術故障的結果:相反,這是這項技術50年設計的完美體現。——Charlton McIlwain,《黑人軟件(Black Software: The Internet & Racial Justice, From the Afronet to Black Lives Matter)》作者

7、阿波羅11號登月艙的緊急救助代碼

年代:1969

防止登月艙的計算機在太空中耗盡空間的代碼

POODOO INHINT

CA Q

TS ALMCADR

TC BANKCALL

CADR VAC5STOR # STORE ERASABLES FOR DEBUGGING PURPOSES.

INDEX ALMCADR

CAF 0

ABORT2 TC BORTENT

OCT77770 OCT 77770 # DONT MOVE

CA V37FLBIT # IS AVERAGE G ON

MASK FLAGWRD7

CCS A

TC WHIMPER -1 # YES. DONT DO POODOO. DO BAILOUT.

TC DOWNFLAG

ADRES STATEFLG

TC DOWNFLAG

ADRES REINTFLG

TC DOWNFLAG

ADRES NODOFLAG

TC BANKCALL

CADR MR.KLEAN

TC WHIMPER

數字化:Virtual AGC與MIT Museum

阿波羅制導系統計算機(AGC)是一個奇跡:就像計算阿波羅重返地球軌跡的Poppy Northcutt告訴我那樣,AGC的計算能力還比不上今天記錄個人信息的賀卡。但是,它卻做到了該做的。

有限的計算能力和存儲空間意味著必須細致地管理好任務,因此AGC始終聚焦在最重要的工作上。如果它沒有足夠的空間來執行任務,那就不可能完成任務。AGC軟件團隊知道,總有些事情是自己計劃不到的。因此,他們開發了BAILOUT。當計算機有空間用完(或“溢出”)的風險時,AGC會觸發BAILOUT把不太重要的數據和操作調走,從而讓重要的數據和操作保持正常運行。

當Eagle著陸器準備降落到月球表面時,大概在30000英尺高空處,AGC 發出了“1202”的警報,尼爾·阿姆斯特朗和休斯敦的飛控都沒有馬上意識到這一點。但是在不到30秒的時間內,指揮中心的計算機專家表示,AGC軟件正在按預期的方式運行:放棄了低優先級的工作并重新開始重要的工作(這個過程很快,以至于大家都無法察覺)。阿姆斯特朗和Buzz Aldrin可以繼續從AGC那里得到他們絕對需要的東西,好繼續安全著陸。

在阿姆斯特朗說出“鷹已降落”之前,溢出警報還會再響三聲,但永遠是因為事情按預期進行才會響。“救助”一詞通常表示任務以失敗結束,但在這里卻讓人類的最高成就成為現實。— 史密森尼國家航空航天博物館主任Ellen Stofan

8、Hello, World!程序

日期:1972年或更早

把世代引入代碼的一句話

main{ printf (“ hello,world \ n”); }

當你坐下來學習一門新的編程語言時,教程要你做的第一件事就是讓計算機顯示出 “Hello,world!”這句話。也許早期最著名的例子來自貝爾實驗室備忘錄,《C語言編程教程》。 這本書寫于1974年,盡管有人發現在1972年的B語言手冊里面也發現了它,而且可能時間比這還要早。

Hello, World!是一個很美麗的教材。這是一項很小的、可完成的任務,可以讓人早早獲得成就感。這已成為了標準,有助于說明不同編程語言之間的差異。對于高級程序員來說,這也是一個快速簡便的方法,可確保在安裝新環境后一切正常。(有時候程序員會用“實現'hello world'的時間'作為比較語言和環境的速度測試。)也許最重要的是,“Hello,world!”天真、友善,而且有助于說明新程序員的代碼可產生的影響范圍。那就是全世界。——IBM AI設計主管Chris Noessel 。

9、空終止串——Null

年代:1972

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

char yellow[26] = {'y', 'e', 'l', 'l', 'o', 'w', '\0'};

GNU C參考手冊

1972年,丹尼斯·里奇(Dennis Ritchie)做出了一個重大決定:自己的新語言要用一種所謂的“空終止串”來表示文本。這個概念其實早就出現了,但是他在自己的新語言,C語言里面把它奉若神明,而這一決定的遺產從此就一直纏住了我們。

編程語言表示一段文本的主要有兩種方式:它可以是內在的固定長度的——“我就包含10個字符,就這么多。”也可以用過空值(null)結尾——這里有一堆的字符,你盡管看下下去,直到最后到達零字節為止,祝你好運!”

C代碼中一個極其常見的錯誤是把一個長字符串復制到一個較短的字符串,造成結尾處溢出,這意味著你破壞了剛好在附近的其他數據。就像在白板邊上寫東西一樣。

除了只是導致程序發生故障外,此類錯誤還可以用來說服程序用經過精心設計的特定數據去覆蓋某些內容,從而改變程序的行為。這就是緩沖區溢出攻擊。但凡你聽說過的安全漏洞幾乎都是從這里開始的,其始作俑者就是1988年的莫里斯蠕蟲病毒(Morris Worm)。

仔細寫代碼可以避免在C語言中出現此類錯誤,但是這種語言的特點導致此類錯誤產生容易檢測難。幾乎所有的現代語言都避開了以null終止的字符串,但是從路由器到“智能”燈泡,C和C ++仍然在世界的基礎處運行著。因此,在將近50年后,我們仍跟這類bug在玩打地鼠的游戲。——Jamie Zawinski,Netscape開發者,Mozilla.org創始人,DNA Lounge老板

10、Telenet遠程網

年代:1975

第一個基于數據包交換的公共數據網絡,是當今互聯網的骨干

互聯網的前身是ARPANET,這是一個供高級研究計劃局(現為DARPA)研究人員機器之間交換數據的計算機網絡。隨著ARPANET在政府內部的擴張,網絡搭建者意識到這項技術可能對普通大眾也很有價值,以及參與到其中可以催生多少的商機。1975年8月,ARPANET的商業版本Telenet 在七個城市上線,該網絡可讓最早期的客戶(主要是計算機或數據庫公司)用電話撥號方式上傳下載(如電子郵件原型消息)或遠程訪問存儲在中央計算機上的代碼。雖然ARPANET通常被認為是現代Internet的鼻祖,但實際上為公眾消費而設計的Telenet才是Web的前身。實際上,1980年代Telenet的最大客戶之一就是Quantum Link,后者后來成為AOL。——Jane C. Hu,Future Tense contributor

11、溫哥華證券交易所的舍入誤差

年代:1982

一個小小的小數點之別付出的巨大代價

- return floor(value)+ return round(value)

溫哥華證券交易所使用的代碼大概是這樣的。

1982年初,溫哥華證券交易所推出了一種一開始錨定基點為1000點的電子股票指數。但是推出后在兩年的時間之內,它就跌到了原始價值的一半,這種走勢在牛氣沖天的1980年代初期是一個令人困惑的反例。一項調查顯示,對指數的計算在一個地方出了問題,那就是用floor而不是round。用floor意味著指數被舍入而不是取整到小數點后三位。(數字計算機必須要有有限的精度,因此需要四舍五入或截斷。)因此,如果指數計算值為532.7528的話,計算機保存下來的值是532.752,而不是四舍五入為532.753。這一點點的差異本來關系不大,但由于每天都要對指數進行數千次計算,這種看似很小的差異(基本上每次都進行不進位舍入)導致指數值出現急劇下降。這個編程錯誤最后在1983年11月被修正,當時的某個周五收盤時指數已經降到500左右了。到了下周一指數以超過1000點開盤,損失掉的價值被恢復回來了。——伊利諾伊大學香檳分校助理教授Lav Varshney

12、Therac-25代碼

年代:1985–1987年

事實證明,過分自信會殺死人

當真相顯現時,頭條新聞就現代化發出了警告。《洛杉磯時報》宣稱:“復雜時代的軟件故障會死人。” 一種本來用于治療癌癥的機器由于在幾家醫療機構對六名患者進行了過大劑量的放射,造成了至少三人死亡。

研究人員經過調查發現,Therac-25的程序允許致命錯誤的出現。本來這臺機器提供的是低功率和高功率兩種類型的治療,而后者需要金屬設備來過濾光束。但是由于軟件存在的錯誤,操作員可以在沒有合適的金屬設備就緒的情況下意外觸發高功率模式。

在設計上,Therac-25是Therac-20的“改進”版,而且這種軟件被認為已經萬無一失,因此不需要外部的安全檢查。結果:重大死亡的責任要歸咎于過度自信的工程師,因為他們沒有對錯誤發生的可能性做出解釋。——Molly Olmstead


我來說兩句
您需要登錄后才可以評論 登錄 | 立即注冊
facelist
所有評論(0)
領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

安卓版28杠游戏