這幾天適逢人類登月50周年,1969年的今天美國阿波羅11號飛船成功在月球著陸,正如首個登月的宇航員阿姆斯特朗所說——這是個人的一小步,但是人類的一大步。面對阿波羅11號登月50周年這個大熱點,不少公司、組織、個人也從多個角度來紀(jì)念這一偉大的日子,NVIDIA發(fā)布了一段使用光線追蹤技術(shù)渲染的登月Demo,不僅效果出色,還從光線渲染的角度證明了登月不是騙局。
1969 年 7 月 20 日,“阿波羅 11 號”飛船登月,宇航員尼爾·阿姆斯特朗(Neil Armstrong)成功踏上月球表面,標(biāo)志著人類第一次踏上月球,完成重要的一步:“這對個人來說是一小步,對人類來說卻是一大步。
2019 年 7 月 20 日的今天,正是人類登月 50 周年。
這兩天,Apollo-11的源碼項目一直占據(jù) GitHub 熱榜第一,目前已獲得 37,000+ 個Star。
其實 Apollo-11 并非是沖著在這 50 周年才開源,早在 2014 年便有第一次的代碼 commit,并在 2016 年開源。目前已累計超過 300 次commit,有近5000 個 Fork。??
?
這些代碼是阿波羅11號制導(dǎo)計算機(AGC)中指令模塊(Comanche055)和登月模塊(Luminary099)原始代碼,這個項目的目的是存儲阿波羅 11 號原始代碼。
此外,虛擬AGC和麻省理工科學(xué)博物館將阿波羅導(dǎo)航計算機(AGC)中的指令模塊Comanche055、登月模塊Luminary099的原始代碼公布在了GitHub上,任何人均可自由查閱、編譯。
考慮到阿波羅工程的龐大及復(fù)雜,阿波羅11號的源代碼開源更多地是象征意義,其他人或者組織也不可能根據(jù)這個源碼搞自己的登月飛船。
也許正是因為這樣,阿波羅11號開源之后很快就有了許多issue(可以看做對源碼的提問或者評論,雖然本質(zhì)上不是這個作用),而且中文占了絕大多數(shù),中文程序員們把阿波利11號源碼issue當(dāng)作了一個評論區(qū)。
這些評論大多不是惡意的,主要是調(diào)侃、跟風(fēng)、吐槽、灌水,但總的來說這些評論更多地是國內(nèi)微博、貼吧的風(fēng)格,完全看不出與阿波羅11號源碼有什么關(guān)系。
Github作為全球最主要的代碼托管平臺,一直被程序員自嘲為最大同性交友社區(qū),如今里面不嚴(yán)肅不正經(jīng)的東西越來越多,這也是很多人對Github不滿的地方。
前兩天還有國外的程序員發(fā)文表示Github上有太多中文項目,GitHub Trending幾乎被被思中國人霸榜了,這些項目有的連注釋都是中文的,國外程序員大部分看不懂,所以這事導(dǎo)致一些國外程序員很無奈。
當(dāng)然,這位小哥的文章態(tài)度OK,不是為了噴中文程序員,而是提出了Github上的一個管理問題,確實值得官方思考和改進。
除了代碼還有笑料和吐槽
上世紀(jì)60年代中期,麻省理工學(xué)院(MIT)儀器實驗室的程序員們?yōu)榘⒉_11號登月計劃開發(fā)飛行控制軟件,由于當(dāng)時還沒有開發(fā)軟件所需要的技術(shù)積累,所以他們必須自己打造一套體系出來。
他們提出了一種存儲計算機程序的新方法,名為“線存儲器”,并創(chuàng)造了一種特殊版本的匯編語言。對于現(xiàn)今的很多程序員來說,匯編語言晦澀難懂,其目的是方便計算機理解,而不是便于人類理解。MIT的程序員們?yōu)榘⒉_制導(dǎo)計算機(AGC)編寫了成千上萬行的那種深奧代碼。
從下圖中,可以直觀地感受到他們到底寫了多少代碼。圖為阿波羅登月計劃軟件工程主管瑪格麗特·漢密爾頓(Margaret Hamilton),她旁邊是一大堆的AGC代碼文件。
AGC代碼其實早已公之于眾,最初是由技術(shù)研究員羅恩·伯基(Ron Burkey)在2003年上傳到網(wǎng)絡(luò)。他根據(jù)MIT在網(wǎng)上發(fā)布的原始硬拷貝的掃描件進行了轉(zhuǎn)錄,也就是一行一行地手動打出來。
“掃描的人是一名叫做加里·內(nèi)夫(Gary Neff)的飛行員,”伯基在電子郵件中寫道,“MIT得到了掃描件,把它們以網(wǎng)頁圖片的形式放上網(wǎng)。但不幸的是,在此過程中,那些圖片遭到損壞,有些地方無法看清。”伯基利用其工程知識查漏補缺,恢復(fù)了無法看清的部分。
“一段時間過后,我從加里·內(nèi)夫那里拿到了備用掃描件,對無法看清的部分進行了核實,幸運地發(fā)現(xiàn)我恢復(fù)的部分完全正確!”他說。
這使那些想要探究AGC代碼的研究員和愛好者如獲至寶。伯基本人甚至利用AGC代碼創(chuàng)造了一個模仿品。
盡管伯基付出了巨大的努力,成功地重現(xiàn)了無法看清的部分,但對于當(dāng)今的很多軟件開發(fā)者來說,AGC代碼本身仍然有點晦澀難懂,直到7月7日那天,曾在NASA實習(xí)的克里斯·加里(Chris Garry)將AGC代碼完整地上傳到代碼共享網(wǎng)站GitHub。如今,光顧該網(wǎng)站的程序員數(shù)不勝數(shù)。
幾小時內(nèi),程序員們開始研究AGC代碼,尤其是AGC原始編程者撰寫的代碼注釋。代碼注釋是用簡單直白的語言描述某個特定時刻執(zhí)行的任務(wù)。Reddit網(wǎng)站程序員吐槽欄目的讀者們在找樂子方面一向敏銳,他們發(fā)現(xiàn)AGC代碼的很多注釋并不是對代碼本身的枯燥解釋,其中充滿了有趣的笑料和訊息,以及上世紀(jì)60年代的很多人和事。
例如,一份源代碼文件名為“BURN_BABY_BURN--MASTER_IGNITION_ROUTINE”(燃燒吧,寶貝,燃燒吧——控制點火程序),開頭的注釋(下圖)這樣寫到:“燃燒吧,寶貝,燃燒吧”可追溯到1965年的洛杉磯騷亂,當(dāng)時著名DJ、電臺所有者“偉大的蒙塔古”(Magnificent Montague)在打碟時使用了這句話。偉大的蒙塔古是上世紀(jì)50年代中期至60年代中期,在芝加哥、紐約和洛杉磯極富感召力的靈歌代表人物。
以下這段代碼也出自控制點火程序,第一行寫著“你好啊”,最后一行寫著“拜拜,歡迎再來哦”。從中可以體會到AGC原始編程團隊有多愛玩。
在名為“LUNAR_LANDING_GUIDANCE_EQUATIONS.s”(月球著陸制導(dǎo)等式)的文件中,程序員希望其中的兩行代碼是暫時的,結(jié)果卻成了永久的。
也是在那份文件中,出現(xiàn)了讓宇航員“轉(zhuǎn)動那個蠢東西”的注釋。
“那是指轉(zhuǎn)動著陸雷達的天線,”伯基解釋說,“我覺得那是在提醒宇航員調(diào)整天線。”
在被描述為“AGC和計算機操作員之間的鍵盤和顯示系統(tǒng)交互程序”的“PINBALL_GAME_BUTTONS_AND_LIGHTS.s”(彈珠游戲按鈕和顯示)文件中,甚至出現(xiàn)了莎士比亞名著《亨利六世》中的一段話:“我要徑直向你指出,你任用了許多人,讓他們大談什么名詞呀,什么動詞呀,以及這一類的可惡字眼兒,這都是任何基督徒的耳朵所不能忍受的。”
Reddit網(wǎng)站的一位用戶指出,這可能是在吐槽AGC的編程語言。這種編程語言利用預(yù)先確定的“名詞”和“動詞”來執(zhí)行操作。例如,動詞37代表“運行程序”,名詞33代表“點火時間”。
既然AGC代碼已經(jīng)在GitHub網(wǎng)站上公布,程序員們現(xiàn)在能夠提出問題和修改建議了。他們當(dāng)然不會錯過機會。一位程序員提出了一個問題,說“低溫貯罐發(fā)生了非常嚴(yán)重的電路故障”,并列出了再現(xiàn)這個問題的步驟。他補充道,“要小心,這可能對測試者造成危險?!被貜?fù)非常熱烈。
一位用戶說,問題可能不在于代碼,而在于其他方面:
“是不是只發(fā)生在月球轉(zhuǎn)移軌道(sol-3-a)上?還是在所有的月球軌道上都會發(fā)生?問題可能出在月球。試著縮小問題的范圍?!?/span>
另一位用戶談到了基本操作:
“你有沒有試過關(guān)閉后重啟?”
一位程序員認(rèn)為可能只是軟件需要更新:
“阿波羅14號解決了這個問題。”
不重要的登月代碼才開源?
可能會有人認(rèn)為,能開源的登月代碼應(yīng)該不算是重要的代碼。實際上并不是的。那么 AGC 究竟是什么?
阿波羅制導(dǎo)計算機(AGC)于上世紀(jì) 60 年代由美國國家航空航天局(NASA )開發(fā),主要用來控制阿波羅宇宙飛船上的導(dǎo)航與制導(dǎo)系統(tǒng)。
阿波羅號太空船實際上是兩種不同的航天器,分為指揮艙(CM)和登月艙(LM)。指揮艙是用來讓三名宇航員登上月球,然后再接回來。登月艙是用于承載兩名在月球行走的宇航員,而第三名宇航員則留在指揮艙中,繞月球軌道運行。
所以說在人類第一次登月的三位宇航員里,只有前兩位宇航員阿姆斯特朗和巴茲·奧爾德林(Buzz Aldrin) 真正地在月球行走,第三位邁克爾·科林斯(Michael Collins)則是坐在飛船里執(zhí)行任務(wù)。
無論是否有宇航員的協(xié)助,每個航天器都需要能夠在太空中航行,因此需要有一個“制導(dǎo)系統(tǒng)”。該指導(dǎo)系統(tǒng)由麻省理工學(xué)院的儀器實驗室開發(fā),這個制導(dǎo)系統(tǒng)的一個重要部分是阿波羅制導(dǎo)計算機——“AGC”。
在阿波羅任務(wù)中,有兩個 AGC,一個用于指導(dǎo)艙,一個用于登月艙。這兩個AGC 是相同且可互換的,但它們運行不同的軟件,因為航天器執(zhí)行的任務(wù)是不同的。
此外,由 AGC 運行的軟件隨著時間的推移而發(fā)展,所以在后來的任務(wù)中使用的AGC 軟件(如 Apollo 17)與早期的任務(wù)(如 Apollo 8)略有不同。
所以說,這份源碼還是很重要的。
在該項目里,還列出當(dāng)時參與編寫這些代碼的程序員:??
正因為有了這些程序員,我們才完成在科學(xué)上重要的“一大步”!
驚心動魄的登月時刻,這位女程序員拯救了所有!
阿波羅 11 號登月的過程并不如阿姆斯特朗登月時那“輕松”的一步,而是驚險萬分!如果沒有這位女程序員,可能就阿波羅就無法成功登月了。
她就是瑪格麗特·希菲爾德·漢密爾頓(Margaret Heafield Hamilton),在美國媒體 IT World 評選“在世的世界上最偉大程序員”中,瑪格麗特排名第一。
一開始為了貼補家用,瑪格麗特成為實驗室臨時編碼員,后因工作出色,被推薦去了 NASA。
當(dāng)時她帶領(lǐng)團隊為阿波羅登月計劃做后備方案,由于大家是奔著成功去的,所以她負(fù)責(zé)是最不受重視的部分:萬一任務(wù)失敗之后的后備方案。
但瑪格麗特依然認(rèn)真地用模擬器模擬飛行狀態(tài),檢查系統(tǒng)漏洞。
可沒想到阿波羅 11 號飛船準(zhǔn)備正式登陸月球前幾分鐘,雷達發(fā)來的大量的數(shù)據(jù)涌入計算機存儲區(qū),讓系統(tǒng)近乎崩潰,飛船將在月球墜毀,宇航員已做好犧牲的準(zhǔn)備。
幸好有瑪格麗特編寫的后背方案軟件抗住了壓力:在大量錯誤數(shù)據(jù)突然涌入,計算機不堪重負(fù)是因為進行了一系列不必要的計算,事實上最重要的資源應(yīng)該用在安全登錄上,其他不重要的任務(wù)將終止。
這就是她后來提出的“異步處理”概念。
正因為有了這樣優(yōu)秀嚴(yán)謹(jǐn)?shù)某绦騿T,人類才能完成第一次登月。后為了表彰她在登月計劃中的貢獻,奧巴馬授予她“自由獎?wù)隆薄?br />
-END-