世界上完美的兩個軟件,太厲害了!
今天給大家介紹兩個軟件,一個體現(xiàn)了人類在軟件開發(fā)流程上的極致,另外一個則體現(xiàn)了程序員個體能力的巔峰。
1、航天飛機(jī)飛控軟件
先來說第一個,航天飛機(jī)飛行控制軟件,就是下圖這個大家伙。
航天飛機(jī)重達(dá)120噸,還攜帶著2000噸的燃料。
它有四臺硬件相同,軟件也相同的計算機(jī)對發(fā)射過程進(jìn)行精準(zhǔn)控制,從幾千個傳感器中提取信息,每秒做出幾百個決定,并且對每個決定進(jìn)行投票。
第五臺計算機(jī),則運行著不同的軟件,隨時待命,準(zhǔn)備替換其他發(fā)生故障的計算機(jī)。
這些計算機(jī)要確定什么時候?qū)χ靼l(fā)動機(jī)點火,什么時候下令固體火箭助推器點火,火箭姿態(tài)控制....
每次發(fā)射,軟件都控制著價值40億美元的設(shè)備,六名航天員的生命,以及國家的夢想。
這個軟件不能崩潰,不能重啟,最小的誤差都不允許:一個三分之二秒的計時錯誤就會使航天飛機(jī)偏離航線近5公里。
洛克希德馬丁公司的航天飛機(jī)小組實現(xiàn)了目標(biāo):軟件幾乎沒有錯誤,接近完美。
軟件的最后三個版本,每個版本(42萬行代碼)只有一個Bug。
最后的11個版本一共有17個錯誤,同等復(fù)雜度的商業(yè)程序有5000個。
這樣的軟件是如何煉成的呢?
答案是極為苛刻軟件流程。
洛克希德馬丁公司的航天飛機(jī)軟件小組有260名員工,這些人創(chuàng)造了一種完全不同的開發(fā)文化。
沒有超級明星程序員,開發(fā)軟件的整個流程都是有意設(shè)計的,不依賴任何特定的人。
這個流程使得他們過上正常的生活,滿足最后期限,交付完全符合其承諾的軟件。
這個流程包含幾個要點:
1. 軟件的質(zhì)量取決于軟件的計劃
在航天飛機(jī)軟件開發(fā)小組,軟件開發(fā)周期中有三分之一的時間不寫代碼,而是和NASA一起用來討論需求:軟件應(yīng)該做什么事情。
即使是最微小的細(xì)節(jié)也要達(dá)成一致。不是口頭達(dá)成一致,而是寫下來,文檔化,形成規(guī)范,非常專業(yè)和精確。
未經(jīng)雙方的同意,規(guī)范中的任何內(nèi)容都不會更改。
沒有良好定義的規(guī)范,程序員不會改任何一行代碼。
例如讓航天飛機(jī)使用GPS導(dǎo)航,這一變化僅涉及6366行代碼,占程序總量的1.5%, 但是相關(guān)的文檔長達(dá)2500頁,涵蓋了各種各樣的條件,分支,幾乎就是偽代碼了。
而航天飛機(jī)系統(tǒng)的軟件,總文檔足足有30卷,40000頁!
2. 兩個百科全書式的數(shù)據(jù)庫
一個是代碼歷史的數(shù)據(jù)庫,每一行代碼都有注釋,顯示每次的更改時間,更改原因,更改目的,有哪些文檔詳細(xì)說明了更改。
對于代碼發(fā)生的一切都記錄在這里,每一行代碼的“祖譜”都可以立刻提供給每個人。
第二個是錯誤數(shù)據(jù)庫,記錄了軟件在編寫和運行時發(fā)生的每一個錯誤,可以追溯到近20年前。
每個錯誤都會記錄下它被發(fā)現(xiàn)的時間,是誰發(fā)現(xiàn)了它,當(dāng)時正在發(fā)生什么活動(測試,訓(xùn)練,飛行),錯誤是如何引入的,為什么逃過了設(shè)計階段,開發(fā)階段,測試階段的嚴(yán)格審查.....
由于積累了如此多的數(shù)據(jù),以至于他們開發(fā)了一個代碼模型,能預(yù)測某個版本中可能有多少錯誤。
如果開發(fā)人員和測試人員發(fā)現(xiàn)的Bug太少,大家會重復(fù)流程,努力使得現(xiàn)實和預(yù)測相匹配。
3.不止要修復(fù)錯誤,要修復(fù)任何引入錯誤的東西
如果軟件存在缺陷,那么編寫它的方式一定存在問題。
在計劃階段沒有發(fā)現(xiàn)的Bug,是如何逃過檢查的?檢查流程是否出了問題,是不是要在checklist上增加一項檢查?
重要的是,不要將錯誤歸咎于個人。流程要承擔(dān)責(zé)任---啟動一個分析的流程來發(fā)現(xiàn)Bug的原因。
航天飛機(jī)軟件開發(fā)小組的流程是如此強(qiáng)大,不僅僅通過了SEI CMM5的認(rèn)證,而且SEI的不少標(biāo)準(zhǔn)就來自于這個小組的各種實踐。
洛克希德馬丁開發(fā)了近乎完美的軟件,大家肯定會想到一個問題:這種開發(fā)方式會不會扼殺創(chuàng)造力?
他們的回答是:會,因為大家必須按照手冊上規(guī)定的流程去做,并且時時刻刻都有人在背后監(jiān)督。
人們必須將創(chuàng)造力用于改變流程,而不是改變軟件。
2、排版軟件TEX
經(jīng)典巨著《計算機(jī)程序設(shè)計的藝術(shù)》在程序員界可謂是無人不知,無人不曉了。
1973年,這部剛出到第三卷的書(計劃寫七卷)已被計算機(jī)界視為“神作”, 1974年美國計算機(jī)學(xué)會就“迫不及待”的把計算機(jī)界的最高獎圖靈獎授予高德納。
此時高德納僅僅36歲 !只靠一套還沒有完成的書就獲得ACM圖靈獎,不但是前無古人,估計也后無來者了。
然而令人大跌眼鏡的是, 拿到圖靈獎以后, 高德納宣布暫停寫作, 理由竟然是現(xiàn)有的計算機(jī)排版系統(tǒng)太差,破壞了書的美感 !然后單槍匹馬開發(fā)出了革命性的排版系統(tǒng)TEX , TEX至今仍是全球?qū)W術(shù)排版的不二之選。
TEX功能強(qiáng)大,幾乎無懈可擊,其版本號也很有意思,不是數(shù)字(3.0, 3.1, 3.2....) 也不是年份(Windows 95, 98, 2000...),而是不斷逼近的圓周率 (3.1415926...) ,這從側(cè)面反映了軟件幾近完美,不需要做改進(jìn)了。
高德納曾表示“最后一次升級是(于我過世后)將版本數(shù)改為 π,那時任何余下的漏洞將被看作程序的功能!
有趣的是高納德為此還設(shè)置了獎金,誰能從TEX 發(fā)現(xiàn)第一個Bug ,獎勵2.56美元,然后每年翻一倍,5.12,10.24......
作為算法的大師,不可能不知道指數(shù)增長的可怕性,但高德納對自己的代碼質(zhì)量非常有信心,事實上,當(dāng)獎金達(dá)到327.68美元以后,基本上就沒什么Bug報出來了。
那些找到Bug 的人收到高德納簽名的支票以后也不去兌換, 而是作為珍品收藏了 :-)
高德納編程能力之強(qiáng)可以說是碾壓硅谷的所有程序員,面向?qū)ο蟮陌l(fā)明人Alan Kay(2003年圖靈獎)這么說過:
60年代末,當(dāng)我在斯坦福從事AI項目時,每個感恩節(jié)我們都會和硅谷的編程高手們舉行編程競賽,McCarthy(人工智能之父,1971年獲圖靈獎)出題, 獎品是好像是一只火雞。
高德納參與的那一年,把我們都給虐了, 他的代碼無論是程序執(zhí)行和算法執(zhí)行都是最快的,并且他用的是一臺最慢的批處理機(jī)器!
我們問高德納:“你是怎么做到的?”
他說:“當(dāng)我學(xué)習(xí)編程時,如果每天有五分鐘的時間使用機(jī)器,就高興得不得了, 所以必須要讓程序一次運行成功,沒有錯誤,算法設(shè)計達(dá)到最佳?!?/p>