找不到代碼,硬件過時,文檔丟失……幾十年前的代碼不容易重現(xiàn)。
“你敢拿十年前寫的代碼,看看還能不能用?” 在最近的一篇社論中,《》介紹了兩位法國科學家發(fā)起的一項挑戰(zhàn)。
這項名為“十年”的挑戰(zhàn)賽由法國國家數(shù)字科學技術研究所的計算機神經科學家和法國國家科學研究中心的理論生物物理學家發(fā)起,旨在鼓勵各個領域的研究人員翻出自己的十年。之前的(或更早的)代碼,看代碼是否還能用,研究是否可以復現(xiàn)。
他們認為,盡管計算在科學研究中的重要性日益增加,但研究人員很少披露他們的底層代碼。即使給出代碼,別人也很難執(zhí)行,甚至作者本人有時也會遇到麻煩。而且,隨著編程語言和計算環(huán)境的演進,現(xiàn)在可以運行的代碼,過段時間可能就不行了。
因此,“‘十年代碼再現(xiàn)性挑戰(zhàn)’的目的是確定那些十年后仍然有效的代碼編寫和發(fā)布技術,”他說。
本次比賽共吸引了35名參賽者。他們提議復制 43 篇論文,其中 28 篇產生了可復制的報告。論文涵蓋的語言包括C、R等,一位參賽者復制的不是代碼,而是用SBML( )編寫的分子模型。
當然,這條繁衍之路并不像想象的那么簡單。有些人找不到代碼,有些人找到代碼卻不知道如何運行。最后,他們總結了通過本次比賽提高代碼復現(xiàn)性的一些技巧,可以為目前的工作提供參考。
舊代碼不是那么容易工作
你的代碼還在嗎?
要完成這個挑戰(zhàn),首先你必須找到你的舊代碼,有人在這一步卡住了。
是法國國家信息與自動化研究所的計算機科學家,他在 1998 年的一篇論文中提到了一個名為“”的并行編程系統(tǒng)。但在搜索了他和他的合著者的硬盤驅動器和備份后,他找不到該系統(tǒng)的代碼。
幸運的是,一個名為“”的源代碼存檔站點為他提供了備份。
會定期爬取其他開源代碼站點,有點像定期爬取網(wǎng)頁的 ( )。開發(fā)人員還可以請求爬取自己的庫進行歸檔。
一開始我并沒有想過要自己找代碼,因為他開發(fā)的時候還沒有出現(xiàn)。他猜想一定是有人把他的代碼上傳到了托管平臺,在平臺關閉前搶到了。
你的文件還在嗎?
“在一個組織良好的項目中,文檔行數(shù)超過代碼行數(shù)的情況并不少見,”加州大學伯克利分校的計算再現(xiàn)性倡導者說?!澳阆氡M可能多地保留信息,對分析的結構有更廣泛的描述,比如數(shù)據(jù)來自哪里、關于數(shù)據(jù)的一些元信息、代碼等,是再現(xiàn)的關鍵?!?/p>
是愛丁堡大學的一位神經科學家,他想重現(xiàn)一個用 SBML 編寫的計算模型。雖然模型在那里,但她找不到她正在使用的參數(shù)值(例如分子濃度),也沒有很好地記錄數(shù)據(jù)歸一化的關鍵細節(jié)。
因此,她的部分研究無法復制?!凹词箤τ谕粋€人來說,十年前顯而易見的模型的許多細節(jié)都不再明顯了,這令人驚訝!” 她茫然地說。
你有運行代碼的硬件嗎?
作為比賽的組織者,也參加了本次挑戰(zhàn)賽。他復制的代碼是 Apple II 中的圖像放大鏡,是整個挑戰(zhàn)賽中最古老的代碼。這段代碼寫于 32 年前,當時我 16 歲mac生物學軟件,并發(fā)表在(已停刊的)名為 Micro 的雜志上。
今天,即使有神秘的 BASIC 語言指令,他也記不起代碼是如何工作的?!霸撍溃@是我自己寫的,”若有所思地說。
然而,他能夠在網(wǎng)上找到代碼并讓它在 Apple II 模擬器的 Web 版本上運行。做到這一點并不難,最難的部分是讓它在真正的 Apple II 上運行。
硬件不是問題,因為他的辦公室里有一臺 Apple II,一位同事在打掃辦公室時救了出來。但是由于這款 Apple II 比 USB 電纜和 更老,并且當前的計算機無法連接到其老式磁盤驅動器。因此,在運行代碼之前,您需要某種定制硬件和一盒老式磁盤。
他在亞馬遜上找到了一些帶有“新”字樣的磁盤,但它們的日期是 1993 年。在對他的數(shù)據(jù)進行了 3 次寫入以確保位穩(wěn)定后mac生物學軟件,磁盤已啟動并運行。
該活動的發(fā)起人也遇到了硬件問題。他有條不紊地將他在 1990 年代編寫的代碼存儲在磁帶上,但現(xiàn)在他沒有讀取磁帶的工具。
您的計算環(huán)境過時了嗎?
過時的計算環(huán)境也是壓死參賽者的一根稻草。Maggi 是一位意大利計算機物理學家,他在 1996 年用語言模擬了一個超導設備,并使用 Basic 來處理結果。二十多年過去了,并沒有太大的變化,所以 Maggi 只做了一些小的調整來讓代碼順利編譯。沒想到,Basic 給他提出了一個問題。
“Basic 是一種死語言,早已被 Basic.NET 取代,”Maggi 在報告中寫道。所以,為了運行二十多年前的 Basic 代碼,Maggi 不得不使用在 上找到的安裝盤在我的 mac 計算機上重建了一個使用了十年的虛擬機。
在安裝之前,Maggi 遇到了一個問題:他不記得自己在 96 年使用的是哪個版本。多年來,微軟已經發(fā)布了該語言的多個版本,但并不總是向后兼容。
模擬運行 Basic 的 mac 的 1994 年計算機。
同樣受到計算環(huán)境困擾的還有法國國家信息與自動化研究所的研究工程師 Courtès。對于這個挑戰(zhàn),他復制了一篇 2006 年用 C 語言編寫的比較數(shù)據(jù)壓縮策略的論文。由于 API 更改,他的代碼無法與現(xiàn)有的 軟件 庫編譯。為了解決這個問題,他不得不將六個計算組件回滾到非常舊的版本。
今天,研究人員可以使用和 Conda 虛擬環(huán)境來打包計算環(huán)境以應對緊急情況。但是一些參賽者選擇了其他方法,例如 Guix(Linux 包管理器)。它保證了環(huán)境可重現(xiàn)到最后一點,并且構建環(huán)境的代碼版本是透明的。
“可以從源頭檢查和構建環(huán)境和整篇論文,”Courtès 說。相信 Guix 可能是本次比賽的“目前最好的可重復研究工具”。
與直覺相反,許多參賽者發(fā)現(xiàn)用舊語言編寫的代碼最容易重現(xiàn)。新語言快速變化的 API 和對第三方庫的依賴使它們難以復制。從這個意義上說,今年剛剛停止支持的2.7是一個很好的機會。它是一種高級編程語言,不會再次更新。
如何提高代碼的可重復性?
在經歷了代碼復現(xiàn)的艱辛之后,相信每一位參賽者在編寫代碼的過程中都意識到了代碼中埋藏的一些“隱患”,比如存儲介質、選擇的語言、備份平臺等。
那么,如何提高論文代碼的重現(xiàn)性呢?“”文章的作者在文章中給出了一個:
1. 代碼?;谥T如 Excel 等點擊式界面的工作流是不可重現(xiàn)的。您希望在代碼中保留計算和數(shù)據(jù)操作;
2. 文件。使用注釋、計算筆記本、文件等來解釋你的代碼是如何工作的,定義預期的參數(shù)和所需的計算環(huán)境;
3. 記錄。記下關鍵參數(shù),例如用于啟動隨機數(shù)生成器的“種子”值。此類日志記錄可以幫助您重新運行代碼、跟蹤錯誤和意外結果;
4. 測試。創(chuàng)建一套測試功能。使用和控制數(shù)據(jù)集以確保您獲得預期的結果,并在開發(fā)期間運行這些測試以清除出現(xiàn)的錯誤;
5. 保存。是一個流行但不是永久的在線存儲庫。從長遠來看, 和 等歸檔服務可能會更加穩(wěn)定;
6. 跟蹤。使用 Git 之類的版本控制工具來記錄您的項目歷史記錄,記下用于生成每個結果的版本;
7. 包裝。使用容器化工具(、等)、Web 服務(Code Ocean、、)、虛擬環(huán)境管理器(Conda)等創(chuàng)建即用型計算環(huán)境;
8. 自動化。使用 CI 等持續(xù)集成服務,在不同的計算環(huán)境中定期自動測試你的代碼;
9. 已簡化。避免使用利基或難以安裝的第三方代碼庫,這會使后續(xù)利用變得復雜;
10. 檢查。通過在一系列計算環(huán)境中運行代碼來檢查代碼的可移植性。
此外,曼徹斯特大學的計算機科學家 Goble 指出,讓自己的代碼開源也是一種提高可重復性的方法,這樣其他人就有機會修改你的代碼庫以使其保持活力。
如果你也有十幾二十年前寫的代碼,你可以把它拿出來看看是否還能用。