你上世紀寫的代碼現在還work嗎?挑戰者:我需要讀磁帶的機器

2020-09-05 機器之心Pro

機器之心報導

編輯:張倩、杜偉

代碼找不到、硬體已過時、文檔也缺失…… 幾十年前的代碼復現起來沒那麼容易。

「敢不敢把你十年前寫的代碼翻出來看看還能不能運行?」在最近的一篇社論文章中,《Nature》介紹了兩位法國科學家發起的一項挑戰。

這項挑戰名為「Ten Years Reproducibility Challenge」,由法國國家數字科學技術研究所的計算機神經科學家 Nicolas Rougier 與法國國家科學研究中心的理論生物物理學家 Konrad Hinsen 共同發起,旨在鼓勵各個領域的研究者翻出自己十年前(或更早)的代碼,看看這些代碼到底還能不能運行,研究能否復現。

Rougier 認為,儘管計算在科學研究中佔有越來越重要的比重,但研究者很少披露自己的底層代碼。即使他們給出了代碼,別人也很難去執行,就連作者本人有時也會遇到麻煩。而且,隨著程式語言、計算環境的演化,現在還能運行的代碼過段時間可能就不行了。

因此,「『十年代碼復現挑戰』的宗旨是找出那些十年之後仍然能夠 work 的代碼編寫和發布技術,」Hinsen 表示。

這項比賽共吸引了 35 名參賽者。他們提出要復現 43 篇論文,其中 28 篇形成了可復現報告。這些論文涉及的語言包括 C、R、Mathematica 和 Pascal 等等,還有一位參賽者復現的不是代碼,而是一個用 SBML(系統生物學標記語言)編寫的分子模型。

當然,這條復現之路並沒有想像中那麼簡單,有人代碼找不到了,有人找到代碼也不知道怎麼運行。最後,他們通過這項比賽總結出了一些提高代碼可復現性的技巧,可以為現在的工作提供借鑑。

老代碼沒那麼容易 work

你的代碼還在嗎?

要完成這個挑戰,首先你得找到自己當年的代碼,有人在這一步就被卡住了。

Roberto DiCosmo 是法國國家信息與自動化研究所的一位計算機科學家,他在 1998 年的一篇論文中提到了一個名為「OcamlP3l」的並行編程系統。但在找遍自己和合著者的硬碟、備份之後,他也沒能找到 OcamlP3l 系統的代碼。

不過幸運的是,一個名為「Software Heritage」的原始碼歸檔網站為他提供了一份備份。

Software Heritage 會定期抓取 GitHub 等開原始碼網站,有點像定期抓取網頁的網際網路檔案館(Internet Archive)。開發者也可以請求 Software Heritage 抓取自己的庫留作存檔。

起初,DiCosmo 並沒有考慮去 Software Heritage 找自己的代碼,因為在他開發 OcamlP3l 的時候,Software Heritage 還沒出現。他猜測,一定是有人將他的代碼傳到了 Gitorious 託管平臺,而 Software Heritage 又在該平臺關停之前抓取了上述代碼。

你的文檔還在嗎?

「在一個組織良好的項目裡,文檔的行數超過代碼行數不是什麼稀罕事兒,」加州大學伯克利分校的一位計算可復現性倡導者表示,「你要保留儘可能多的信息,對分析的結構有更廣泛的描述,比如數據從哪兒來,數據、代碼的一些元信息等,這些是復現的關鍵。」

Melanie Stefan 是愛丁堡大學的一位神經科學家,她想復現一個用 SBML 寫的計算模型。儘管模型都在,但她卻找不到自己當年用的參數值(如分子濃度),也沒有很好地記錄數據標準化的關鍵細節。

因此,Stefen 無法復現她的部分研究。「即使對於同一個人來說,很多十幾年前再明顯不過的模型細節現在也不明顯了,真是令人始料未及!」她面無表情地說道。

你有運行代碼的硬體嗎?

作為比賽的組織者,Rougier 也參加了這次挑戰。他重現的代碼是 Apple II 中的一個圖像放大器,這是整個挑戰賽中最古老的代碼。這段代碼寫於 32 年前,當時寫的時候 Rougier 才 16 歲,還發表在了一本名為《Tremplin Micro》的雜誌上(已倒閉)。

如今,即使拿著神秘的 AppleSoft BASIC 語言說明,他也不記得代碼是怎麼運行的了。「真是見了鬼了,這可是我自己寫的,」Rougier 惆悵地說道。

但是,他可以在網上找到這段代碼並使其在一個網頁版 Apple II 模擬器上運行。要做到這點並不難,Rougier 表示,最難的部分是讓它在一個真正的 Apple II 上運行。

對於 Rougier 來說,硬體不是問題,因為他辦公室就有一臺 Apple II,是一位同事在清理辦公室時搶救出來的。但由於這款 Apple II 的年齡比 USB 線和網際網路都大,而且當前的計算機無法與它的老式磁碟驅動相連。因此,在運行代碼之前,Rougier 需要某種定製的硬體以及一盒老式磁碟。

他在亞馬遜上找到了一些帶有「New」字樣的磁碟,但日期是 1993 年的。在對他的數據進行三次寫入以確保比特穩定之後,磁碟開始運行了。

活動的發起者 Hinsen 也遇到了硬體方面的麻煩。他把自己 90 年代寫的代碼有條不紊地存到了磁帶裡,但現在,他已經沒有能讀取磁帶的工具了。

你的計算環境過時了嗎?

過時的計算環境也是壓死參賽者的一根稻草。Sabino Maggi 是義大利的一名計算機物理學家,1996 年,他用 Fortran 語言建模了一個超導裝置,並用 Microsoft Visual Basic 來處理結果。二十多年過去了,Fortran 並沒有發生太大變化,因此 Maggi 只做了些微的調整就實現了代碼的順利編譯。但始料未及的是,Visual Basic 給他出了一個難題。

Maggi 在報告中寫道,「Visual Basic 是一門死掉的語言,早就被 Visual Basic.NET 取代了。」所以,為了運行二十多年前的 Visual Basic 代碼,Maggi 不得不使用從網上找到的安裝盤在自己的 Mac 電腦上重建了一個十年前的 Windows 虛擬機。

在安裝之前,Maggi 遇到了一個問題:他根本不記得自己 96 年用的是哪個版本。這些年,微軟發布了該語言的多個版本,而且並不總是向後兼容的。

模擬 1994 年的 Windows 計算機運行 Microsoft Visual Basic 的 Mac。

同樣受到計算環境問題困擾的還有 Ludovic Courtès,他是法國國家信息與自動化研究所的一名研究工程師。在這次挑戰賽中,他復現了 2006 年一篇比較數據壓縮策略的論文,代碼是用 C 語言寫的。由於 API 發生了變化,他的代碼無法用現有軟體庫進行編譯。為了解決這一問題,他不得不將 6 個計算組件回滾到很老的版本。

如今,研究者們可以用 Docker 和 Conda 虛擬環境來打包計算環境,以備不時之需。但有幾位參賽者選擇了其他方法,比如 Guix(一個 Linux 包管理器)。它可以保證環境直到最後一位都是可復現的,並且構建環境的代碼版本是透明的。

「環境和整篇論文都可以檢查,可以從原始碼構建,」Courtès 表示。Hinsen 認為,Guix 可能是這個比賽「目前最好的可復現研究工具」。

違反直覺的是,很多參賽者發現,用一些比較古老的語言寫的代碼反而是最容易復現的。新語言快速變化的 API 和對第三方庫的依賴使得它們很難復現。從這個意義上來說,今年剛剛停止支持的 Python 2.7 倒是一個不錯的機會,它既是一門高級程式語言,又不會再進行更新。

如何提高代碼可復現性?

在經歷了復現代碼的艱辛之後,相信每位參賽者都意識到了自己當年寫代碼時埋下的一些「隱患」,比如存儲介質、所選語言、備份平臺等。

那麼,如何提高論文代碼的可復現性呢?《Nature》文章的作者在文中給出了一個 checklist:

1. 代碼。基於即點即擊(point-and-click)界面的工作流(如 Excel)是不可復現的。你要將計算和數據操作保存在代碼中;

2. 文件。使用注釋、計算筆記本、README 文件等解釋你的代碼如何運行,定義期望的參數和所需的計算環境;

3. 記錄。記下關鍵參數,如用於啟動隨機數生成器的「seed」值。這樣的記錄可以幫你重新運行代碼、跟蹤 bug 以及意外的結果;

4. 測試。創建一套測試函數。使用 positive 和 negative 控制數據集來確保你得到預期的結果,並在開發過程中運行這些測試,在 bug 出現時及時清除;

5. 保存。GitHub 是一個流行但並不永久的在線存儲庫。長期來看,Zenodo、Figshare 和 Software Heritage 等歸檔服務可能更加穩定;

6. 跟蹤。使用 Git 等版本控制工具來記錄你的項目歷史,記下產生每個結果所用到的版本;

7. 打包。利用容器化工具(Docker、Singularity 等)、網頁服務(Code Ocean、Gigantum、Binder)、虛擬環境管理器(Conda)等創建隨時可用的計算環境;

8. 自動化。使用 Travis CI 等持續集成服務在不同的計算環境中定期自動測試你的代碼;

9. 簡化。避免使用會使後續利用複雜化的小眾或難以安裝的第三方代碼庫;

10. 檢查。通過在一系列計算環境中運行代碼來檢查代碼的可移植性。

此外,曼徹斯特大學的計算機科學家 Carole Goble 指出,將自己的代碼開源也是一種提高可復現性的方式,這樣別人就有機會在你的代碼基礎上進行修改,以保持其活力。

如果你也有十幾、二十幾年前寫的代碼,可以拿出來試試還能不能運行。

相關焦點

  • 見人說人話,見鬼說鬼話,現在的機器翻譯怎麼比我還油膩?
    你打了它一下,「說人話!」「女神讓你滾…」當然效果略有誇張。科學家們正在努力讓機器翻譯軟體學會的這個技能,學術上叫做文風轉換。改寫過程中,AI首先需要完整讀取源語言,並創建一個代表它的相應矢量。接下來,靠這個矢量一次擠一個單詞出來,每個單詞都與上一個風格相仿。這個「擠牙膏」的過程或許只有AI自己才明白個中邏輯,外人根本無法推測。讀不懂的大部頭?
  • 模擬磁帶錄製基礎(關於混音你應該了解的歷史)
    如果你正在尋找Toffler在Future Shock中所寫的一個典型例子,那麼模擬磁帶可能就是最好的。在短短十多年的時間裡,這臺2英寸多軌磁帶機已經從工作室主要勞動力變成了稀世珍寶。雖然許多音頻老工作者都對這種溫暖的模擬聲音懷舊,但很少有人會為它而放棄了如今的聲音。
  • 有沒有發現,現在的一些英語教材仍然使用磁帶?
    家裡有小孩的朋友可能會深有感觸,在初中或者小學的一些教材中,會包含一盒磁帶作為聽力教學輔助,這讓很多人不禁起來疑惑:磁帶還沒過時嗎?好久沒見過複讀機了!上世紀九十年代末,隨著國家教育部對學生的英語口語,聽力水品越來越重視,複讀機這一划時代的產品出現了,它可以錄播,也可以播放磁帶,體力小,功能多,成為當時學生的一個新寵!隨著科技的發現,複讀機逐漸的被更先進的mp3所代替,它體積更小,方便隨身攜帶,而且可以播放高清語音,逐漸的成為了時尚的代名詞,而一些教材也開始附帶mp3格式的音頻資料!
  • 三十年磁帶往事
    1980年代末90年代初,我們對這個世界剛剛有記憶的時候,有線電視還沒有普及。電視要想出現畫面,需要接一根天線來接收模擬信號,能收到的臺少得可憐,基本就是中央臺,省臺,當地臺。臺少不說,往往到了晚上才有信號。上世紀80年代的電視廣告,天線是標配。
  • 代碼你打算寫到幾歲?雷軍、張一鳴都曾寫過...
    這也代表,他們已經通過寫代碼創造出市場最需要的產品,實現巨大商業價值。而他們曾經寫出的代碼,即便放到今天,也會被很多開發者交口稱讚。當然,也有人在功成名就之後,把寫代碼當做新的生活,從頭學起——潘石屹在56歲生日當天,宣布開始學習 Python。現在就來盤點一下,中國的商業大佬們曾經用代碼寫的故事。
  • 還有你不知道的磁帶未來主義
    當時的顯示器都是基於顯像管技術產生畫面,顯示的色彩極少,刷新率感人( 因而很少顯示動態畫面 ),開著的機器往往顯示黑底綠字( 這一點並不絕對 ),最關鍵的是:它們都很厚!當時的作業系統還不能做到面面俱到,許多人機互動靠成噸的按鈕,旋鈕等物理操作實現,開燈要按鈕,關燈要按鈕,收發無線電要按鈕,調整頻道要旋鈕,甭管大小用不用得著的,都得有個按鈕。你想想,當時的人們在這樣的科技背景下,對未來科技的幻想是怎麼樣的?
  • 數學公式太晦澀,不如用代碼寫出來:這是程式設計師學數學的獨特方式
    ∑、∏、∈……如果你學習過數學,你一定知道這些符號的含義,而如果我們能用最喜歡的程式語言來理解它們,也許還能帶來更加透徹的領悟。近日,MindbuilderAI & nurio 創始人、機器學習專家 Ian Rowan 介紹了自己藉助代碼來理解數學計算過程的經驗。
  • 三行代碼,搞定教育孩子的所有問題?樊登教你怎樣陪孩子終身成長
    但事實上,你的很多行為,其實就是把孩子當成,可訓練的機器。 比如,你是否經常說:我教過你多少遍了,為什麼還做錯? 你知道誰不會犯錯嗎?機器永遠不會犯錯,只要你輸入正確的指令,他就會做你期望他做的事。
  • 9102年了,你還不知道怎麼做數據科學家嗎?
    不過,如果你去上大學,可能學的是物理學或運籌學專業?這很難講。據說,我曾遇到過的很多優秀的數據科學家都來自這些研究領域。你或許也能夠找到一個不錯的「數據科學」項目。這些我都無法預料,建議你去看看這位讀博期間中途輟學的作者 Jeremie Harris 所寫的文章(「Do you need a graduate degree for data science?」
  • 程式設計師喜歡在晚上敲代碼是有科學原因的
    文中解釋了為什麼大部分工程師,包括他本人,總是遵循著「吸血鬼的生活作息」來寫代碼。他作為一名自由職業者兼連續創業家,有超過17 年以上的軟體開發經驗,自稱 A Geek with a Hat。這篇文章最後還寫成了一本書,可以在Swizec Teller的網站上購買電子書或實體書籍。
  • 超過三十歲就不適合寫代碼了?看看國外程式設計師怎麼說
    在我看來,這不是關於你在工作之外有什麼樣的生活方式,但重要的是你有一個工作之外的生活。我想很多20多歲的人沒有意識到這一點。如果你實在是精疲力竭,而且頭腦完全不願意學習——你的標準年齡是30歲,那是「我們隨著年齡的增長會越來越慢」的標準——不是為了做你媽媽,而是(以我慈祥的的媽媽的聲音 ...)——你睡得足夠嗎? 你吃好了嗎 ?你看醫生了嗎 ?也許你的日常工作有點混亂。。。
  • 阿里魔法程式設計師:職業魔術師跨界寫代碼 桌上常年放著麻將和撲克
    "你相信讀心術嗎,你覺得這個世界上有沒有超能力?"亞風是天貓的一名開發,同時也是一名有10年經驗的魔術愛好者,初次見面,沒有任何寒暄,兩個問題先徑直拋了過來。1年後,亞風回歸了大學專業領域,進入一家軟體公司寫起了代碼,並在2年前跳槽進入阿里。圖:入職阿里後亞風創辦了魔術派,圖為他正在帶成員練習手法雖然簡歷沒有任何跟魔術有關的內容,但是,寫代碼的間隙都在練手法的他自然很快被發現。剛進阿里時,不少同事聞風特意跑到他的工位讓他露一手。
  • 聯繫讀博,怎麼寫郵件?
    因此,我希望能讀您的博士,請問您2021/2022年還有名額嗎?或者還需要我提供其他材料嗎?附件為我的個人簡歷。祝好,盼覆!***(你的名字)--首先,整個郵件的基調是平等客觀,不需要過分吹捧老師。其次,郵件要儘量簡潔且思路清晰,避免大段的言之無物。
  • 經驗之談:代碼該怎樣寫才能幹淨整潔
    能把代碼寫出來是一回事,但是寫出整潔、可讀的代碼又是另一回事。然而,什麼是「乾淨的代碼」呢?怎麼才能寫出「乾淨的代碼」?為了解答這些問題,本文作者寫了一份針對初級開發者的乾淨代碼指南。不妨想像一下,你正在閱讀一篇文章。文章開頭有一個段落簡要概述了文章的內容。文中還有一些標題,每個小標題會引出幾個段落。
  • 存儲介質:從磁帶到藍光
    ● 小結  磁帶與唱片統治了整個模擬音頻存儲時代,直到CD的出現。不過此後也有不同的命運,那就是磁帶幾乎消亡了,而唱片主要是黑膠唱片還存在著。這是因為很多燒友認為黑膠唱片在聽感上最為保真,而沒有數字音頻那種數碼味道。
  • 只讀存儲器真的只能讀嗎?原來如此
    問題2:ROM是英語read only memory的首字母,翻譯為「只讀存儲器」,那麼ROM真的只可以讀嗎?在回答這2個問題前,我們必須先了解ROM的有關知識。ROM的分類如下:掩膜ROM:不可編程ROM,屬於第一代ROM,只能讀,不能寫。PROM:可編程ROM,但是只能寫一次。之後只能讀,不能寫。EPROM:可編程ROM,紫外光可以多次擦除(可以寫),但是速度比較慢,操作複雜。
  • NA聲波官圖公布,集齊磁帶居然還得買音板?
    圖片轉自微博用戶@NA_NEWAGENA聲波所有內容物一覽圖,這次附帶了三個磁帶,分別是轟隆隆、機器狗、雷射鳥。這款NA小聲波人形高度為10.2公分,整體造型非常不錯,完全可以當做一款大比例的產品來看。塗裝方面,全身都上了金屬烤漆,腳板為整塊合金件,現在第三方小比例產品都做到這種素質了,孩之寶要反思了!
  • 中國上世紀的3位天才神童你們知道嗎,他們現在怎麼樣了呢?
    中國上世紀的3位天才神童你們知道嗎,他們現在怎麼樣了呢?提起神童這個詞,我腦海中湧現的第一個人是初中語文課本上出現的方仲永,五歲就能識得筆墨紙硯,文章詩句信手拈來,若是家裡長輩能有些見識的話,相信他不會只存活在王安石的文章中,而是會留名千古。
  • 軟體工程師除了寫代碼,還能做什麼工作?
    大家總會問到這幾個問題:「我接下來應該學哪種語言?」、「如何準備技術面試?」、「你們招人嗎?」 但是當時有一個問題我一直無法給出很好的答案,那就是,「如果我不想當個開發人員去編寫軟體,那麼該何去何從呢?」 最近,我一直在思考這個問題。
  • 英語聽力磁帶竟然還在 教育局:不強制買
    當然發了,但我根本沒拿回家,早在學校裡踩爆了。」為什麼這麼做呢?「這個英語磁帶太坑爹了,我幾年前用過,經常卡帶,弄得我很煩躁,後來每個學期再領磁帶時,我看見那玩意兒就有踩爆它的衝動。」遙遙說著說著,自己忍不住樂了。「現在都信息化時代了,還用磁帶教學,太落伍了。」遙遙的爸爸孫先生看著兒子活靈活現的表演,又好氣又好笑。