新聞中心
代碼找不到、硬件已過(guò)時(shí)、文檔也缺失…… 幾十年前的代碼復(fù)現(xiàn)起來(lái)沒(méi)那么容易。

成都創(chuàng)新互聯(lián)是專業(yè)的尖扎網(wǎng)站建設(shè)公司,尖扎接單;提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行尖扎網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
「敢不敢把你十年前寫(xiě)的代碼翻出來(lái)看看還能不能運(yùn)行?」在最近的一篇社論文章中,《Nature》介紹了兩位法國(guó)科學(xué)家發(fā)起的一項(xiàng)挑戰(zhàn)。
這項(xiàng)挑戰(zhàn)名為「Ten Years Reproducibility Challenge」,由法國(guó)國(guó)家數(shù)字科學(xué)技術(shù)研究所的計(jì)算機(jī)神經(jīng)科學(xué)家 Nicolas Rougier 與法國(guó)國(guó)家科學(xué)研究中心的理論生物物理學(xué)家 Konrad Hinsen 共同發(fā)起,旨在鼓勵(lì)各個(gè)領(lǐng)域的研究者翻出自己十年前(或更早)的代碼,看看這些代碼到底還能不能運(yùn)行,研究能否復(fù)現(xiàn)。
Rougier 認(rèn)為,盡管計(jì)算在科學(xué)研究中占有越來(lái)越重要的比重,但研究者很少披露自己的底層代碼。即使他們給出了代碼,別人也很難去執(zhí)行,就連作者本人有時(shí)也會(huì)遇到麻煩。而且,隨著編程語(yǔ)言、計(jì)算環(huán)境的演化,現(xiàn)在還能運(yùn)行的代碼過(guò)段時(shí)間可能就不行了。
因此,「『十年代碼復(fù)現(xiàn)挑戰(zhàn)』的宗旨是找出那些十年之后仍然能夠 work 的代碼編寫(xiě)和發(fā)布技術(shù),」Hinsen 表示。
這項(xiàng)比賽共吸引了 35 名參賽者。他們提出要復(fù)現(xiàn) 43 篇論文,其中 28 篇形成了可復(fù)現(xiàn)報(bào)告。這些論文涉及的語(yǔ)言包括 C、R、Mathematica 和 Pascal 等等,還有一位參賽者復(fù)現(xiàn)的不是代碼,而是一個(gè)用 SBML(系統(tǒng)生物學(xué)標(biāo)記語(yǔ)言)編寫(xiě)的分子模型。
當(dāng)然,這條復(fù)現(xiàn)之路并沒(méi)有想象中那么簡(jiǎn)單,有人代碼找不到了,有人找到代碼也不知道怎么運(yùn)行。最后,他們通過(guò)這項(xiàng)比賽總結(jié)出了一些提高代碼可復(fù)現(xiàn)性的技巧,可以為現(xiàn)在的工作提供借鑒。
老代碼沒(méi)那么容易 work
你的代碼還在嗎?
要完成這個(gè)挑戰(zhàn),首先你得找到自己當(dāng)年的代碼,有人在這一步就被卡住了。
Roberto DiCosmo 是法國(guó)國(guó)家信息與自動(dòng)化研究所的一位計(jì)算機(jī)科學(xué)家,他在 1998 年的一篇論文中提到了一個(gè)名為「OcamlP3l」的并行編程系統(tǒng)。但在找遍自己和合著者的硬盤(pán)、備份之后,他也沒(méi)能找到 OcamlP3l 系統(tǒng)的代碼。
不過(guò)幸運(yùn)的是,一個(gè)名為「Software Heritage」的源代碼歸檔網(wǎng)站為他提供了一份備份。
Software Heritage 會(huì)定期抓取 GitHub 等開(kāi)源代碼網(wǎng)站,有點(diǎn)像定期抓取網(wǎng)頁(yè)的互聯(lián)網(wǎng)檔案館(Internet Archive)。開(kāi)發(fā)者也可以請(qǐng)求 Software Heritage 抓取自己的庫(kù)留作存檔。
起初,DiCosmo 并沒(méi)有考慮去 Software Heritage 找自己的代碼,因?yàn)樵谒_(kāi)發(fā) OcamlP3l 的時(shí)候,Software Heritage 還沒(méi)出現(xiàn)。他猜測(cè),一定是有人將他的代碼傳到了 Gitorious 托管平臺(tái),而 Software Heritage 又在該平臺(tái)關(guān)停之前抓取了上述代碼。
你的文檔還在嗎?
「在一個(gè)組織良好的項(xiàng)目里,文檔的行數(shù)超過(guò)代碼行數(shù)不是什么稀罕事兒,」加州大學(xué)伯克利分校的一位計(jì)算可復(fù)現(xiàn)性倡導(dǎo)者表示,「你要保留盡可能多的信息,對(duì)分析的結(jié)構(gòu)有更廣泛的描述,比如數(shù)據(jù)從哪兒來(lái),數(shù)據(jù)、代碼的一些元信息等,這些是復(fù)現(xiàn)的關(guān)鍵?!?/p>
Melanie Stefan 是愛(ài)丁堡大學(xué)的一位神經(jīng)科學(xué)家,她想復(fù)現(xiàn)一個(gè)用 SBML 寫(xiě)的計(jì)算模型。盡管模型都在,但她卻找不到自己當(dāng)年用的參數(shù)值(如分子濃度),也沒(méi)有很好地記錄數(shù)據(jù)標(biāo)準(zhǔn)化的關(guān)鍵細(xì)節(jié)。
因此,Stefen 無(wú)法復(fù)現(xiàn)她的部分研究?!讣词箤?duì)于同一個(gè)人來(lái)說(shuō),很多十幾年前再明顯不過(guò)的模型細(xì)節(jié)現(xiàn)在也不明顯了,真是令人始料未及!」她面無(wú)表情地說(shuō)道。
你有運(yùn)行代碼的硬件嗎?
作為比賽的組織者,Rougier 也參加了這次挑戰(zhàn)。他重現(xiàn)的代碼是 Apple II 中的一個(gè)圖像放大器,這是整個(gè)挑戰(zhàn)賽中最古老的代碼。這段代碼寫(xiě)于 32 年前,當(dāng)時(shí)寫(xiě)的時(shí)候 Rougier 才 16 歲,還發(fā)表在了一本名為《Tremplin Micro》的雜志上(已倒閉)。
如今,即使拿著神秘的 AppleSoft BASIC 語(yǔ)言說(shuō)明,他也不記得代碼是怎么運(yùn)行的了?!刚媸且?jiàn)了鬼了,這可是我自己寫(xiě)的,」Rougier 惆悵地說(shuō)道。
但是,他可以在網(wǎng)上找到這段代碼并使其在一個(gè)網(wǎng)頁(yè)版 Apple II 模擬器上運(yùn)行。要做到這點(diǎn)并不難,Rougier 表示,最難的部分是讓它在一個(gè)真正的 Apple II 上運(yùn)行。
對(duì)于 Rougier 來(lái)說(shuō),硬件不是問(wèn)題,因?yàn)樗k公室就有一臺(tái) Apple II,是一位同事在清理辦公室時(shí)搶救出來(lái)的。但由于這款 Apple II 的年齡比 USB 線和互聯(lián)網(wǎng)都大,而且當(dāng)前的計(jì)算機(jī)無(wú)法與它的老式磁盤(pán)驅(qū)動(dòng)相連。因此,在運(yùn)行代碼之前,Rougier 需要某種定制的硬件以及一盒老式磁盤(pán)。
他在亞馬遜上找到了一些帶有「New」字樣的磁盤(pán),但日期是 1993 年的。在對(duì)他的數(shù)據(jù)進(jìn)行三次寫(xiě)入以確保比特穩(wěn)定之后,磁盤(pán)開(kāi)始運(yùn)行了。
活動(dòng)的發(fā)起者 Hinsen 也遇到了硬件方面的麻煩。他把自己 90 年代寫(xiě)的代碼有條不紊地存到了磁帶里,但現(xiàn)在,他已經(jīng)沒(méi)有能讀取磁帶的工具了。
你的計(jì)算環(huán)境過(guò)時(shí)了嗎?
過(guò)時(shí)的計(jì)算環(huán)境也是壓死參賽者的一根稻草。Sabino Maggi 是意大利的一名計(jì)算機(jī)物理學(xué)家,1996 年,他用 Fortran 語(yǔ)言建模了一個(gè)超導(dǎo)裝置,并用 Microsoft Visual Basic 來(lái)處理結(jié)果。二十多年過(guò)去了,F(xiàn)ortran 并沒(méi)有發(fā)生太大變化,因此 Maggi 只做了些微的調(diào)整就實(shí)現(xiàn)了代碼的順利編譯。但始料未及的是,Visual Basic 給他出了一個(gè)難題。
Maggi 在報(bào)告中寫(xiě)道,「Visual Basic 是一門(mén)死掉的語(yǔ)言,早就被 Visual Basic.NET 取代了?!顾裕瑸榱诉\(yùn)行二十多年前的 Visual Basic 代碼,Maggi 不得不使用從網(wǎng)上找到的安裝盤(pán)在自己的 Mac 電腦上重建了一個(gè)十年前的 Windows 虛擬機(jī)。
在安裝之前,Maggi 遇到了一個(gè)問(wèn)題:他根本不記得自己 96 年用的是哪個(gè)版本。這些年,微軟發(fā)布了該語(yǔ)言的多個(gè)版本,而且并不總是向后兼容的。
模擬 1994 年的 Windows 計(jì)算機(jī)運(yùn)行 Microsoft Visual Basic 的 Mac。
同樣受到計(jì)算環(huán)境問(wèn)題困擾的還有 Ludovic Courtès,他是法國(guó)國(guó)家信息與自動(dòng)化研究所的一名研究工程師。在這次挑戰(zhàn)賽中,他復(fù)現(xiàn)了 2006 年一篇比較數(shù)據(jù)壓縮策略的論文,代碼是用 C 語(yǔ)言寫(xiě)的。由于 API 發(fā)生了變化,他的代碼無(wú)法用現(xiàn)有軟件庫(kù)進(jìn)行編譯。為了解決這一問(wèn)題,他不得不將 6 個(gè)計(jì)算組件回滾到很老的版本。
如今,研究者們可以用 Docker 和 Conda 虛擬環(huán)境來(lái)打包計(jì)算環(huán)境,以備不時(shí)之需。但有幾位參賽者選擇了其他方法,比如 Guix(一個(gè) Linux 包管理器)。它可以保證環(huán)境直到最后一位都是可復(fù)現(xiàn)的,并且構(gòu)建環(huán)境的代碼版本是透明的。
「環(huán)境和整篇論文都可以檢查,可以從源代碼構(gòu)建,」Courtès 表示。Hinsen 認(rèn)為,Guix 可能是這個(gè)比賽「目前最好的可復(fù)現(xiàn)研究工具」。
違反直覺(jué)的是,很多參賽者發(fā)現(xiàn),用一些比較古老的語(yǔ)言寫(xiě)的代碼反而是最容易復(fù)現(xiàn)的。新語(yǔ)言快速變化的 API 和對(duì)第三方庫(kù)的依賴使得它們很難復(fù)現(xiàn)。從這個(gè)意義上來(lái)說(shuō),今年剛剛停止支持的 Python 2.7 倒是一個(gè)不錯(cuò)的機(jī)會(huì),它既是一門(mén)高級(jí)編程語(yǔ)言,又不會(huì)再進(jìn)行更新。
如何提高代碼可復(fù)現(xiàn)性?
在經(jīng)歷了復(fù)現(xiàn)代碼的艱辛之后,相信每位參賽者都意識(shí)到了自己當(dāng)年寫(xiě)代碼時(shí)埋下的一些「隱患」,比如存儲(chǔ)介質(zhì)、所選語(yǔ)言、備份平臺(tái)等。
那么,如何提高論文代碼的可復(fù)現(xiàn)性呢?《Nature》文章的作者在文中給出了一個(gè) checklist:
1. 代碼?;诩袋c(diǎn)即擊(point-and-click)界面的工作流(如 Excel)是不可復(fù)現(xiàn)的。你要將計(jì)算和數(shù)據(jù)操作保存在代碼中;
2. 文件。使用注釋、計(jì)算筆記本、README 文件等解釋你的代碼如何運(yùn)行,定義期望的參數(shù)和所需的計(jì)算環(huán)境;
3. 記錄。記下關(guān)鍵參數(shù),如用于啟動(dòng)隨機(jī)數(shù)生成器的「seed」值。這樣的記錄可以幫你重新運(yùn)行代碼、跟蹤 bug 以及意外的結(jié)果;
4. 測(cè)試。創(chuàng)建一套測(cè)試函數(shù)。使用 positive 和 negative 控制數(shù)據(jù)集來(lái)確保你得到預(yù)期的結(jié)果,并在開(kāi)發(fā)過(guò)程中運(yùn)行這些測(cè)試,在 bug 出現(xiàn)時(shí)及時(shí)清除;
5. 保存。GitHub 是一個(gè)流行但并不永久的在線存儲(chǔ)庫(kù)。長(zhǎng)期來(lái)看,Zenodo、Figshare 和 Software Heritage 等歸檔服務(wù)可能更加穩(wěn)定;
6. 跟蹤。使用 Git 等版本控制工具來(lái)記錄你的項(xiàng)目歷史,記下產(chǎn)生每個(gè)結(jié)果所用到的版本;
7. 打包。利用容器化工具(Docker、Singularity 等)、網(wǎng)頁(yè)服務(wù)(Code Ocean、Gigantum、Binder)、虛擬環(huán)境管理器(Conda)等創(chuàng)建隨時(shí)可用的計(jì)算環(huán)境;
8. 自動(dòng)化。使用 Travis CI 等持續(xù)集成服務(wù)在不同的計(jì)算環(huán)境中定期自動(dòng)測(cè)試你的代碼;
9. 簡(jiǎn)化。避免使用會(huì)使后續(xù)利用復(fù)雜化的小眾或難以安裝的第三方代碼庫(kù);
10. 檢查。通過(guò)在一系列計(jì)算環(huán)境中運(yùn)行代碼來(lái)檢查代碼的可移植性。
此外,曼徹斯特大學(xué)的計(jì)算機(jī)科學(xué)家 Carole Goble 指出,將自己的代碼開(kāi)源也是一種提高可復(fù)現(xiàn)性的方式,這樣別人就有機(jī)會(huì)在你的代碼基礎(chǔ)上進(jìn)行修改,以保持其活力。
如果你也有十幾、二十幾年前寫(xiě)的代碼,可以拿出來(lái)試試還能不能運(yùn)行。
文章名稱:你上世紀(jì)寫(xiě)的代碼現(xiàn)在還work嗎?挑戰(zhàn)者:我需要讀磁帶的機(jī)器
當(dāng)前鏈接:http://www.5511xx.com/article/dhohoic.html


咨詢
建站咨詢
