自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

你上世紀(jì)寫的代碼現(xiàn)在還work嗎?挑戰(zhàn)者:我需要讀磁帶的機(jī)器

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

 代碼找不到、硬件已過時(shí)、文檔也缺失…… 幾十年前的代碼復(fù)現(xiàn)起來沒那么容易。

你上世紀(jì)寫的代碼現(xiàn)在還work嗎?挑戰(zhàn)者:我需要讀磁帶的機(jī)器

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

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

你上世紀(jì)寫的代碼現(xiàn)在還work嗎?挑戰(zhàn)者:我需要讀磁帶的機(jī)器

Rougier 認(rèn)為,盡管計(jì)算在科學(xué)研究中占有越來越重要的比重,但研究者很少披露自己的底層代碼。即使他們給出了代碼,別人也很難去執(zhí)行,就連作者本人有時(shí)也會遇到麻煩。而且,隨著編程語言、計(jì)算環(huán)境的演化,現(xiàn)在還能運(yùn)行的代碼過段時(shí)間可能就不行了。

因此,「『十年代碼復(fù)現(xiàn)挑戰(zhàn)』的宗旨是找出那些十年之后仍然能夠 work 的代碼編寫和發(fā)布技術(shù),」Hinsen 表示。

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

當(dāng)然,這條復(fù)現(xiàn)之路并沒有想象中那么簡單,有人代碼找不到了,有人找到代碼也不知道怎么運(yùn)行。最后,他們通過這項(xiàng)比賽總結(jié)出了一些提高代碼可復(fù)現(xiàn)性的技巧,可以為現(xiàn)在的工作提供借鑒。

老代碼沒那么容易 work

你的代碼還在嗎?

要完成這個(gè)挑戰(zhàn),首先你得找到自己當(dāng)年的代碼,有人在這一步就被卡住了。

Roberto DiCosmo 是法國國家信息與自動化研究所的一位計(jì)算機(jī)科學(xué)家,他在 1998 年的一篇論文中提到了一個(gè)名為「OcamlP3l」的并行編程系統(tǒng)。但在找遍自己和合著者的硬盤、備份之后,他也沒能找到 OcamlP3l 系統(tǒng)的代碼。

不過幸運(yùn)的是,一個(gè)名為「Software Heritage」的源代碼歸檔網(wǎng)站為他提供了一份備份。

你上世紀(jì)寫的代碼現(xiàn)在還work嗎?挑戰(zhàn)者:我需要讀磁帶的機(jī)器

Software Heritage 會定期抓取 GitHub 等開源代碼網(wǎng)站,有點(diǎn)像定期抓取網(wǎng)頁的互聯(lián)網(wǎng)檔案館(Internet Archive)。開發(fā)者也可以請求 Software Heritage 抓取自己的庫留作存檔。

起初,DiCosmo 并沒有考慮去 Software Heritage 找自己的代碼,因?yàn)樵谒_發(fā) OcamlP3l 的時(shí)候,Software Heritage 還沒出現(xiàn)。他猜測,一定是有人將他的代碼傳到了 Gitorious 托管平臺,而 Software Heritage 又在該平臺關(guān)停之前抓取了上述代碼。

你的文檔還在嗎?

「在一個(gè)組織良好的項(xiàng)目里,文檔的行數(shù)超過代碼行數(shù)不是什么稀罕事兒,」加州大學(xué)伯克利分校的一位計(jì)算可復(fù)現(xiàn)性倡導(dǎo)者表示,「你要保留盡可能多的信息,對分析的結(jié)構(gòu)有更廣泛的描述,比如數(shù)據(jù)從哪兒來,數(shù)據(jù)、代碼的一些元信息等,這些是復(fù)現(xiàn)的關(guān)鍵?!?/p>

Melanie Stefan 是愛丁堡大學(xué)的一位神經(jīng)科學(xué)家,她想復(fù)現(xiàn)一個(gè)用 SBML 寫的計(jì)算模型。盡管模型都在,但她卻找不到自己當(dāng)年用的參數(shù)值(如分子濃度),也沒有很好地記錄數(shù)據(jù)標(biāo)準(zhǔn)化的關(guān)鍵細(xì)節(jié)。

因此,Stefen 無法復(fù)現(xiàn)她的部分研究。「即使對于同一個(gè)人來說,很多十幾年前再明顯不過的模型細(xì)節(jié)現(xiàn)在也不明顯了,真是令人始料未及!」她面無表情地說道。

你有運(yùn)行代碼的硬件嗎?

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

如今,即使拿著神秘的 AppleSoft BASIC 語言說明,他也不記得代碼是怎么運(yùn)行的了?!刚媸且娏斯砹耍@可是我自己寫的,」Rougier 惆悵地說道。

但是,他可以在網(wǎng)上找到這段代碼并使其在一個(gè)網(wǎng)頁版 Apple II 模擬器上運(yùn)行。要做到這點(diǎn)并不難,Rougier 表示,最難的部分是讓它在一個(gè)真正的 Apple II 上運(yùn)行。

[[340458]]

對于 Rougier 來說,硬件不是問題,因?yàn)樗k公室就有一臺 Apple II,是一位同事在清理辦公室時(shí)搶救出來的。但由于這款 Apple II 的年齡比 USB 線和互聯(lián)網(wǎng)都大,而且當(dāng)前的計(jì)算機(jī)無法與它的老式磁盤驅(qū)動相連。因此,在運(yùn)行代碼之前,Rougier 需要某種定制的硬件以及一盒老式磁盤。

他在亞馬遜上找到了一些帶有「New」字樣的磁盤,但日期是 1993 年的。在對他的數(shù)據(jù)進(jìn)行三次寫入以確保比特穩(wěn)定之后,磁盤開始運(yùn)行了。

活動的發(fā)起者 Hinsen 也遇到了硬件方面的麻煩。他把自己 90 年代寫的代碼有條不紊地存到了磁帶里,但現(xiàn)在,他已經(jīng)沒有能讀取磁帶的工具了。

你的計(jì)算環(huán)境過時(shí)了嗎?

過時(shí)的計(jì)算環(huán)境也是壓死參賽者的一根稻草。Sabino Maggi 是意大利的一名計(jì)算機(jī)物理學(xué)家,1996 年,他用 Fortran 語言建模了一個(gè)超導(dǎo)裝置,并用 Microsoft Visual Basic 來處理結(jié)果。二十多年過去了,F(xiàn)ortran 并沒有發(fā)生太大變化,因此 Maggi 只做了些微的調(diào)整就實(shí)現(xiàn)了代碼的順利編譯。但始料未及的是,Visual Basic 給他出了一個(gè)難題。

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

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

你上世紀(jì)寫的代碼現(xiàn)在還work嗎?挑戰(zhàn)者:我需要讀磁帶的機(jī)器

模擬 1994 年的 Windows 計(jì)算機(jī)運(yùn)行 Microsoft Visual Basic 的 Mac。

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

如今,研究者們可以用 Docker 和 Conda 虛擬環(huán)境來打包計(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)研究工具」。

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

如何提高代碼可復(fù)現(xiàn)性?

在經(jīng)歷了復(fù)現(xiàn)代碼的艱辛之后,相信每位參賽者都意識到了自己當(dāng)年寫代碼時(shí)埋下的一些「隱患」,比如存儲介質(zhì)、所選語言、備份平臺等。

那么,如何提高論文代碼的可復(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ù),如用于啟動隨機(jī)數(shù)生成器的「seed」值。這樣的記錄可以幫你重新運(yùn)行代碼、跟蹤 bug 以及意外的結(jié)果;

4. 測試。創(chuàng)建一套測試函數(shù)。使用 positive 和 negative 控制數(shù)據(jù)集來確保你得到預(yù)期的結(jié)果,并在開發(fā)過程中運(yùn)行這些測試,在 bug 出現(xiàn)時(shí)及時(shí)清除;

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

6. 跟蹤。使用 Git 等版本控制工具來記錄你的項(xiàng)目歷史,記下產(chǎn)生每個(gè)結(jié)果所用到的版本;

7. 打包。利用容器化工具(Docker、Singularity 等)、網(wǎng)頁服務(wù)(Code Ocean、Gigantum、Binder)、虛擬環(huán)境管理器(Conda)等創(chuàng)建隨時(shí)可用的計(jì)算環(huán)境;

8. 自動化。使用 Travis CI 等持續(xù)集成服務(wù)在不同的計(jì)算環(huán)境中定期自動測試你的代碼;

9. 簡化。避免使用會使后續(xù)利用復(fù)雜化的小眾或難以安裝的第三方代碼庫;

10. 檢查。通過在一系列計(jì)算環(huán)境中運(yùn)行代碼來檢查代碼的可移植性。

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

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

責(zé)任編輯:張燕妮 來源: 機(jī)器之心
相關(guān)推薦

2018-04-04 17:08:18

CIO

2011-02-23 09:35:58

Mozilla火狐瀏覽器

2015-07-17 10:02:48

寫代碼

2015-04-27 15:05:28

2013-03-25 12:37:56

2013Android競爭對手

2012-04-16 13:21:00

2015-02-02 11:31:33

聯(lián)想摩托羅拉

2016-08-18 00:44:38

Python編程語言

2011-11-07 09:02:52

諾基亞Windows Pho

2018-07-23 13:48:47

京東云

2022-10-19 11:17:35

2013-08-30 09:06:17

公有云AWSIBM

2018-10-31 09:43:22

2012-03-29 09:13:52

Windows Pho挑戰(zhàn)賽

2022-05-18 10:33:10

首席信息官CIOIT領(lǐng)域

2017-12-19 15:20:47

代碼應(yīng)用架構(gòu)

2024-08-28 11:57:25

2015-09-02 15:26:13

環(huán)信

2012-12-11 09:45:39

JustinTV實(shí)時(shí)視頻網(wǎng)站

2020-12-09 14:28:09

PON網(wǎng)絡(luò)通信服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號