彩神网

為民族工業造"芯"
賬號密碼快捷輸入工具
發布日期:2024-01-07
一群科學家發起了代碼的心酸“十年可重復性挑戰”,有人悲催地發現自己十多年前用來存代碼的不得不磁盤已經沒有可以讀取的設備,還有人不得不給自己的電腦Mac電腦裝上了DOS和Win3.11……



心酸,他不得不在Mac電腦上運行DOS和Win3.11

存在可重復性問題的不僅是實驗數據,還有十多年前為了研究寫的上運程序。

心酸,他不得不在Mac電腦上運行DOS和Win3.11


心酸,他不得不在Mac電腦上運行DOS和Win3.11

圖片來源:unsplash.com


編譯 王千玥

編輯 魏瀟


盡管計算(computing)在科學領域越來越重要,心酸研究論文卻很少提供作者的不得不基礎代碼。即便提供了,電腦同行們也很難順利運行,上運一些人甚至在發了論文以后發現想重復自己曾經用過的心酸代碼都會遇到問題。畢竟,不得不計算機運行環境發展迅速,電腦編程語言也在不斷更新,上運如何讓多年前的心酸古董代碼重新順利運行成了令許多程序員及科研人員頭疼的難題。


十年可重復性挑戰


為了攻克這個難關,不得不法國國家信息與自動化研究所(French National Institute for Research in Digital Science and Technology,電腦INRIA)的計算神經科學家兼程序員Nicolas Rougier和法國國家科學研究中心(French National Centre for Scientific Research,CNRS)的理論生物物理學家 Konrad Hinsen 在 2019 年共同構想了一個解決方案:“十年可重復性挑戰”(Ten years reproducibility challenge)項目。這個挑戰項目鼓勵科學家們重現至少十年前他們發表的文章中的代碼。參與者還需在 2021 年 6 月舉行的研討會上討論他們的收獲。成功的案例會刊登在 ReScienceC 雜志上。ReScienceC 是 Rougier 和 Hinsen 在 2015 年創辦的雜志,用來記錄研究人員重復已發表論文的代碼的情況,以此統計研究的可重復性。


Hinsen 表示,這項挑戰旨在“尋找有效的編寫和發表代碼的技巧,讓代碼十年后還能運行”。項目的啟動恰巧與著名的 Python 2 退出歷史舞臺在同一天—— 2020 年1月1日。Python 2 曾是科學界流行的高級編程語言,被系統支持使用超過 20 年。(Python 3 于 2008 年發行,現在還在發展中,但這兩個版本的差異很大,用一個版本寫的代碼可能無法在另一個版本中正常運行。)畢竟,“十年在軟件世界中是一段很長很長的時間”,伊利諾伊大學厄巴納-香檳分校研究計算重復性的 Victoria Stodden 表示,這項挑戰通過設立 10 年的標準,有效激發了研究人員去突破代碼可重復性的時間局限。


盡管項目任重道遠,還是有 35 個人接受了這項挑戰。他們共提出了 43 篇等待檢測重復性的論文,其中 28 篇產生了重復性報告。ReScienceC 雜志今年開始發表他們的工作。參與者使用了包括 C、R、Mathematica 以及 Pascal 在內的多種編程語言,還有一位參與者甚至重新運行了用 SBML(Systems Biology Markup Language)編碼的分子模型。


挑戰重重


挑戰的發起人 Rougier 也參與到了項目中,他重復運行了這項挑戰中最古老的代碼:自己 16 歲時在蘋果電腦上寫的用于圖片放大的程序。這個代碼當時被刊登在了已不復存在的法國 Tremplin Micro 雜志上。32 年后,Rougier 已經不記得代碼和它晦澀的 AppleSoft BASIC 指令是如何運行的了。不過他還是在網上找到了當年的代碼并在網頁版的蘋果 II 模擬器上跑了一遍。


然而,難點在于讓它在真正的蘋果 II 電腦上順利運行。硬件不是問題,Rougier 辦公室有一臺蘋果II電腦。但由于蘋果 II 電腦誕生的年代還沒有 USB 數據線和互聯網,現代電腦又無法連接老式磁盤驅動器,Rougier 不得不用定制硬件(custom hardware)和老式軟盤(vintage floppies)來幫助電腦加載代碼。如同考古挖掘一樣,雖然過程曲折,但 Rougier 還是讓 30 多年前的代碼得以重見天日。


然而,另一位發起人 Hinsen 就沒那么幸運了。在上個世紀 90 年代,Hinsen 習慣于把自己的代碼儲存在磁帶上。然而現在,雖然磁帶還在,它的閱讀器卻已經絕版了,Hinsen 的代碼只能被封在磁帶中了。


跟不上時代的運行環境


除了硬件,過時的電腦運行環境也給參與者帶來了不少困擾。意大利的計算物理學家 Sabino Maggi 在 1996 年曾用 Fortran 語言來為一個被稱為約瑟夫結的超導裝置建模,并用微軟的 Visual Basic 語言處理結果。Fortran 語言這么多年倒是沒什么變化,可 Visual Basic 已經絕版了,無法在現有的 Windows 系統上運行(現在替代它的是 Visual Basic.NET,二者只有名字看起來還有點聯系)。為了運行代碼,他不得不在 Mac 電腦上安裝了十多年前 Windows 系統的模擬機,再在模擬機上安裝 1994 年左右發行的微軟 DOS 6.22 和Windows 3.11,以及他在網上找的 Visual Basic 安裝盤。


二十世紀九十年代初期的 Win3.11 操作系統界面


Maggi 承認在模擬機上安裝這些在使用、修改上有限制的專有軟件存在合法性問題。不過他最早在進行研究時曾有這些工具的有效使用許可證,這使他覺得自己“至少從道義上”有權使用軟件。


然而,問題還沒有解決。Maggi 不知道自己該使用哪個版本的 Visual Basic 語言。微軟發行的多個版本的語言往往與前一個版本不兼容。Maggi 已經記不清自己 1996 年用的是哪個版本的編程語言了。更糟糕的是,他當年記錄這些細節的筆記本也由于一次地下室漏水被銷毀了。因此,Maggi 不得不耗費巨大的精力重寫當年的代碼。


圖片來源:Sabino Maggi | Nature


無獨有偶,INRIA 的研發工程師 Ludovic Courtès 在重新運行 2006 年用 C 語言寫的對比不同數據安裝策略的代碼時遇到了麻煩。受程序員青睞的應用程序編程接口(Application Programming Interface,API)可以將兩個不同的軟件對接,方便程序員調用其它軟件的功能、打通軟件間的數據;而操作系統等運行環境的改變會導致 API 的變動。API 的變動使他的代碼無法用當前的軟件庫壓縮。他只好將多個電腦組件改回到舊版本。Courtès 表示電腦系統的發展如同《愛麗絲漫游奇境記》中的兔子洞,里面會發生什么都是未知的。


解決策略


現在,為應對變化未知的運行環境,研究人員可以用 Docker 容器和 Conda 虛擬環境來對電腦運算環境進行打包備用。Conda 是一個開源通用包管理系統兼環境管理系統,可以安裝多版本的軟件包及其依賴軟件,并在它們之間輕松切換。不過,有好幾位參與者都選擇了另一個辦法:Linux 通用包管理系統 Guix。Guix 的好處在于,它具備了科研論文可重復性的黃金準則:環境的全面可重復性,以及透明的代碼版本。


此外,為了提高長期可重復性,為代碼存檔尤為重要。INRIA 的計算機科學家 Roberto DiCosmo 曾試圖在自己和合作者的多個備份硬盤里尋找 1998 年平行編程系統 OcamlP3l 的代碼,卻怎么也找不到。毫無辦法的他只好在他 2015 年建立的 Software Heritage 網站上進行搜索。考慮到 Software Heritage 在他開發OcamlP3l時還不存在,DiCosmo 并沒有抱太大的希望。然而神奇的是,他居然搜到了 OcamlP3l 的源代碼!原來,Software Heritage 通過定期抓取 GitHub 等代碼共享站點的信息,收集存放了大量計算機程序的源代碼。就像因特網為網頁存檔那樣,Software Heritage 為軟件源代碼進行存檔。


雖然不少參與者發現,當年能順利運行的代碼現在頻頻報錯;但也有輕松化解問題的大佬。CNRS 的生物物理化學家 Charles Robert 就是其中一位。1995 年,他曾在筆記本軟件上運行 Mathematica 來為真核生物染色體的 3D 結構建模。當年在運行時,Robert 的代碼出現了結構缺陷以及代碼片段順序混亂等來自筆記本軟件的問題。如今,再次面對當年的代碼,他通過將代碼分解成模塊進行測試避開了這些問題。他還利用版本控制(是指對軟件開發過程中各種程序代碼、配置文件及說明文檔等文件變更的管理,是軟件配置管理的核心思想之一)的方法來追蹤代碼的變更,記錄每個版本的軟件運行的結果。


DiCosmo 和 Robert 的例子或許可以給致力于提高代碼長期可重復性的研究者們一些啟示。雖然難以保證多年前的古董代碼一定能再次運行,但還是可以在平時編寫代碼時采取有效的策略來增加成功的可能性。具體策略如下:


編碼(Code):將計算和數據處理包含在代碼中。不要使用基于Excel等點擊界面的流程圖。

存檔(Document):利用記事本等軟件詳細解釋代碼運行過程,定義預期的參數和需要的運算環境。

記錄(Record):記錄重要參數,例如遞歸程序開始時使用的種子值(seed value)。

測試(Test):創建一套測試功能。利用陽性陰性對照數據集來確保你得到想要的結果。邊開發代碼邊進行測試,及時處理bug.

建立指南(Guide):創建一個主腳本(如“ run.sh”文件)用來下載所需的數據集和變量,執行工作流程并提供明顯的代碼入口點(entry point to code)。

建檔案(Archive):GitHub是流行的非永久性代碼線上存放處。Zenodo, Figshare 和 Software Heritage可以長期穩定存放代碼。

追蹤(Track):利用Git等版本控制工具記錄你的項目歷程。標注每個結果對應的版本。

打包(Package):利用容器工具(Docker,Singularity)、網頁服務器(Code Ocean, Gigantum, Binder)或虛擬環境管理器(Conda)創建隨時可用的運行環境。

自動化(Automate):利用持續集成服務(Travis CI等)將項目進行持續性自動化測試以控制代碼質量。

簡化(Simplify):避免使用難安裝的第三方代碼庫。

核對(Verify):檢查代碼在不同運行環境的可移植性。


無論選擇哪種方法,“十年可重復性挑戰”的參與者們想實現代碼的重新運行仍有較大的難度。不過,他們將會為論文代碼長期可重復性的提高帶來許多啟示。正如英國曼徹斯特大學計算機科學家 Carole Goble 所說,可重復性有一定范圍,“軟件是個不斷更新的活物,它終將凋亡;人們需要修復它或者替換掉它”。


編譯來源:

//www.nature.com/articles/d41586-020-02462-7


查詢關鍵詞
彩88_彩88「官网彩神网」 江苏五分-手机版下载 胜游亚洲|网址 中心购彩-通用app 彩名堂-ios 5分排列3-通用app 彩天下|Welcome