你上世纪写的代码现在还work吗?挑战者:我需要读磁带的机器

2024-05-31 01:01:00
jkadmin
原创
429

「敢不敢把你十年前写的代码翻出来看看还能不行运转?」正在迩来的一篇社论著作中,《Nature》先容了两位法邦科学家建议的一项挑拨。

这项挑拨名为「Ten Years Reproducibility Challenge」,由法邦邦度数字科学本领探索所的计划机神经科学家 Nicolas Rougier 与法邦邦度科学探索核心的外面生物物理学家 Konrad Hinsen 配合建议,旨正在激发各个界限的探索者翻出本人十年前(或更早)的代码,看看这些代码究竟还能不行运转,探索能否复现。

Rougier 以为,纵然计划正在科学探索中占领越来越要紧的比重,但探索者很少披露本人的底层代码。假使他们给出了代码,别人也很难去推行,就连作家自己有时也会碰到艰难。况且,跟着编程言语、计划情况的演化,现正在还能运转的代码过段时分能够就不可了。

于是,「『十年代码复现挑拨』的主睹是寻得那些十年之后还是不妨 work 的代码编写和揭晓本领,」Hinsen 外现。

这项竞争共吸引了 35 名参赛者。他们提出要复现 43 篇论文,个中 28 篇酿成了可复现陈诉。这些论文涉及的言语包罗 C、R、Mathematica 和 Pascal 等等,尚有一位参赛者复现的不是代码,而是一个用 SBML(编制生物学标志言语)编写的分子模子。

当然,这条复现之道并没有遐念中那么浅易,有人代码找不到了,有人找到代码也不分明如何运转。结果,他们通过这项竞争总结出了少许抬高代码可复现性的本事,可认为现正在的职责供应模仿。

Roberto DiCosmo 是法邦邦度新闻与自愿化探索所的一位计划机科学家,他正在 1998 年的一篇论文中提到了一个名为「OcamlP3l」的并行编程编制。但正在找遍本人和合著者的硬盘、备份之后,他也没能找到 OcamlP3l 编制的代码。

但是侥幸的是,一个名为「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 代码,Maggi 不得不运用从网上找到的装配盘正在本人的 Mac 电脑上重修了一个十年前的 Windows 虚拟机。

正在装配之前,Maggi 碰到了一个题目:他底子不记得本人 96 年用的是哪个版本。这些年,微软揭晓了该言语的众个版本,况且并不老是向后兼容的。

同样受到计划情况题目困扰的尚有 Ludovic Courts,他是法邦邦度新闻与自愿化探索所的一名探索工程师。正在此次挑拨赛中,他复现了 2006 年一篇对比数据压缩战术的论文,代码是用 C 言语写的。因为 API 爆发了转变,他的代码无法用现有软件库举办编译。为明晰决这一题目,他不得不将 6 个计划组件回滚到很老的版本。

目前,探索者们可能用 Docker 和 Conda 虚拟情况来打包计划情况,以备时时之需。但有几位参赛者选拔了其他手腕,譬喻 Guix(一个 Linux 包统治器)。它可能保障情况直到结果一位都是可复现的,而且构修情况的代码版本是透后的。

「情况和整篇论文都可能反省,可能从源代码构修,」Courts 外现。Hinsen 以为,Guix 能够是这个竞争「目前最好的可复现探索器械」。

违反直觉的是,许众参赛者察觉,用少许对比陈腐的言语写的代码反而是最容易复现的。新言语急迅转变的 API 和对第三方库的依赖使得它们很难复现。从这个旨趣上来说,本年方才阻止赞成的 Python 2.7 倒是一个不错的机遇,它既是一门高级编程言语,又不会再举办更新。

正在通过了复当代码的艰苦之后,信托每位参赛者都认识到了本人当年写代码时埋下的少许「隐患」,譬喻存储介质、所选言语、备份平台等。

那么,何如抬高论文代码的可复现性呢?《Nature》著作的作家正在文中给出了一个 checklist:

1. 代码。基于即点即击(point-and-click)界面的职责流(如 Excel)是不成复现的。你要将计划和数据操作存储正在代码中;

2. 文献。运用说明、计划札记本、README 文献等外明你的代码何如运转,界说愿望的参数和所需的计划情况;

3. 记实。记下合头参数,如用于启动随机数天生器的「seed」值。云云的记实可能助你从头运转代码、跟踪 bug 以及不料的结果;

4. 测试。创修一套测试函数。运用 positive 和 negative 负责数据集来确保你取得预期的结果,并正在开荒流程中运转这些测试,正在 bug 显现时实时废除;

8. 自愿化。运用 Travis CI 等延续集成任职正在差别的计划情况中按期自愿测试你的代码;

其它,曼彻斯特大学的计划机科学家 Carole Goble 指出,将本人的代码开源也是一种抬高可复现性的体例,云云别人就有机遇正在你的代码本原进步行改正,以坚持其生气。