1936年,瑪格麗特出生于美國一個普通的家庭。大學時,她主修數(shù)學。讀書期間,她嫁給了詹姆斯·漢密爾頓。畢業(yè)后,瑪格麗特找了一份教師的工作。那時,她的丈夫還在哈佛法學院讀書,她因而承擔起了家庭的重任。
正當兩人的的小日子過得緊緊巴巴時,一個工作機會擺在了瑪格麗特面前,當時計算機科學的先鋒MIT里有一個實驗室在招臨時編碼工,瑪格麗特抱著試試看的態(tài)度,就這樣踏進了程序員的殿堂。
一邊看孩子一邊寫程序
一開始,她為天體學系寫天氣預報系統(tǒng)的代碼,后來又去了大名鼎鼎的林肯實驗室,為美國軍方SAGE項目寫代碼——用電腦程序幫助偵查危險的“不友好的飛行物”。
這些毫無頭緒的程序有多難處理呢?對此,當時有人用希臘語和拉丁語寫評論來取樂。而瑪格麗特是全實驗室第一個解決問題的人,她還把調(diào)試方法翻譯成希臘語和拉丁語,漂漂亮亮地回敬了一發(fā)。
瑪格麗特的女兒勞倫也在這時出生了,繁忙的媽媽不得不將小勞倫帶去工作,讓她睡在實驗室的地板上,醒來后則獨自玩耍。
當時,人們對這樣一個“工作狂媽媽”十分不理解,但瑪格麗特并不在意,她熱愛著這份雖然枯燥卻充滿挑戰(zhàn)和“神秘感”的工作。
挽救飛船的“不重要”程序
由于出色的表現(xiàn),瑪格麗特獲得了另外一個機會:加入MIT的Charles Stark Draper實驗室,帶領(lǐng)一個小團隊為NASA的阿波羅計劃寫軟件。
在阿波羅最初的預算報告中,根本就沒有“軟件”二字。不過后來,NASA意識到了軟件的重要,逐漸把軟件相關(guān)的團隊擴大到了400多人。但瑪格麗特依然是一個無名小卒,她負責的是整個計劃中最不受重視的部分:“萬一”任務(wù)失敗之后的后備方案,連這個部分的名字,都被稱作“Forget it”。
“我想為整個系統(tǒng)中加入一旦人工出錯之后的備用糾錯方案,”瑪格麗特說,“但是他們不同意。他們說,宇航員們都經(jīng)過了嚴格的、完美的訓練,‘絕對不可能出錯。”
那時,計算機的存儲空間和計算能力都十分有限,決策者不希望有任何“累贅”的部分。瑪格麗特無奈,只好在操作系統(tǒng)里做了一個備注:“不要在飛行時選擇P01模式”。
但壞事兒還是發(fā)生了。在阿波羅8號環(huán)繞月球任務(wù)中,宇航員羅威爾一時疏忽,按下了P01模式,所有巡航數(shù)據(jù)都被清空了,飛船分分鐘迷路。休斯頓緊急打來電話,瑪格麗特領(lǐng)著一群程序員,連夜奮戰(zhàn)了9個小時,才修復了這個問題,使阿波羅8號得以成功返航。
而真正的考驗還在后面。隨著登月計劃緊鑼密鼓的進行,美國政府和NASA都繃緊了弦。瑪格麗特的加班也越來越多。而成就總是伴隨著錯誤和風險——就在阿波羅11號歷史性著陸月面的3分鐘前,忽然警報大作,軌交雷達發(fā)來的大量數(shù)據(jù)涌入電腦存儲區(qū),快把電腦弄崩潰了。而若是系統(tǒng)崩潰,飛船將毫無懸念地墜毀在月球上。
但是,瑪格麗特設(shè)計的系統(tǒng)頂住了這個壓力。在大量數(shù)據(jù)涌入電腦時,最寶貴的計算資源被用于最關(guān)鍵的部分,比如安全登陸,而處理不重要的雷達交互數(shù)據(jù)的任務(wù)被砍掉。
這次事件,促使她提出了后來的“異步程序”概念,即程序可以不用等待當前任務(wù)響應,先處理其他任務(wù),待到任務(wù)處理完成之后再接受任務(wù)完成的通知。這可以提高計算效率,防止程序被卡死。
瑪格麗特拯救了人類的登月計劃,不僅是因為她的聰明,更是因為她的努力和心思縝密,她的團隊在每次程序確定之后,都會一遍遍嚴格地測試,使用模擬器來模擬登陸狀況。許多問題她早就考慮到了,畢竟“不出錯”永遠都是一個理想狀態(tài)。
“軟件工程”的誕生
在那個年代,程序員工作系統(tǒng)化程度很低,如果出現(xiàn)了錯誤,大多數(shù)都是潦草地在“出錯理由”里面填一個“有bug”來解決。但瑪格麗特認為這遠遠不夠,她認為程序員需要理解錯誤,梳理錯誤的原因,并防止下一次程序出錯。
此時,寫程序更像是一門手藝,完全沒有“軟件工程”的概念,而瑪格麗特用自己的實踐,賦予了這個詞現(xiàn)實的意義。她開始用“軟件工程師”來稱呼她在內(nèi)的程序員,在她的推動下,“軟件工程”成了一門更規(guī)范、更系統(tǒng)的科學——瑪格麗特將軟件工程這份事業(yè)提升了一個高度。
離開NASA的瑪格麗特自立門戶,她在自己所涉及到的許多領(lǐng)域,都有創(chuàng)見——比如系統(tǒng)設(shè)計、軟件開發(fā)、過程模型、開發(fā)范式、軟件可靠性、周期自動化等。
是的,人們不應該忘記,那個在層疊的代碼背后時常沉默的女孩,也不應忘記那些為早期計算機事業(yè)付出辛勞的前輩們——請記住他們,然后在他們鋪下的道路上繼續(xù)前進。(編輯/夏冬)