对科学家的挑战:您十年前的代码还在运行吗?

2020-08-24 22:29:58

尼古拉斯·鲁吉尔需要的是一张光盘。不是口袋大小的TB硬盘,也不是光盘,而是真正的软盘。

对于那些错过了20世纪80年代的人来说,最初的软盘是一个软盘,装在一个方形的套筒里,中间有一个洞,角落有一个凹槽,还有几百千字节的存储空间。在1983年的冷战题材电影《战争游戏》中,高中黑客大卫·莱特曼用一台破解了学校的电脑,并给他的女朋友生物打了最高分;他后来侵入了一个军事网络,勉强避免了一场全球热核战争。鲁吉尔的需要更加平淡无奇。他只是想把一个文本文件从他的台式Mac电脑转移到计算旧石器时代的遗迹上:1977年推出的苹果公司第一款消费产品--老式Apple II。

Rougier是位于波尔多的法国国家数字科学和技术研究所INRIA的计算神经学家和程序员。那次文件传输标志着他接受了他自己抛出的计算挑战的最后阶段:十年可再生性挑战。这项挑战与法国国家科学研究中心(CNRS)位于奥尔良的理论生物物理学家康拉德·辛森(Konrad Hinsen)于2019年共同构思,挑战科学家敢于找到并重新执行旧代码,以重现他们十年或更多年前发表的计算驱动的论文。参与者本应在6月份波尔多的一个研讨会上讨论他们所学到的东西,但新冠肺炎破坏了这些计划。(活动时间暂定为2021年6月。)。

鲁吉尔说,尽管计算在科学中扮演着越来越重要的角色,但科学文章很少包括它们的底层代码。即使他们这样做了,其他人也很难执行它,即使是原始作者也可能在一段时间后遇到问题。编程语言不断发展,它们运行的计算环境也是如此,今天完美无缺的代码可能第二天就会失败。

2015年,Rougier和Hinsen推出了ReScience C,这是一份期刊,记录了研究人员试图复制其他作者发表的计算方法的尝试,只基于原始文章和他们自己新编写的开放源代码。审查者然后检查代码以确保其正常工作。但是,即使在那些理想化的情况下-有具有重现性意识的作者、精通计算的审查员和新鲜的代码-这一过程也可能被证明是困难的。

Hinsen说,十年可复制性挑战赛的目标是“找出哪些十年前的编写和发布代码的技术足够好,可以在十年后让它发挥作用”。经过20年的支持,它被安排在2020年1月1日“日落”的日期,Python2是科学界的一种流行语言。(在2008年发布的Python3中,开发仍在继续,但这两个版本差别很大,用其中一个版本编写的代码可能无法在另一个版本中运行。)。

在伊利诺伊大学香槟分校(University of Illinois at Urbana-Champaign)研究计算再现性的维多利亚·斯托登(Victoria Stodden)说:“在软件界,10年是非常、非常长的一段时间。”她表示,在建立这一基准时,挑战有效地鼓励研究人员在“在软件世界中大致相当于无穷大”的一段时间内探索代码可重复性的局限性。

这次挑战赛有35名参赛者。在他们建议转载的43篇文章中,有28篇得出了可再现性报告。ReScience C今年早些时候开始发表他们的研究成果。使用的编程语言从C和R到MATHEMICA和PASCAL;一个参与者复制的不是代码,而是用系统生物学标记语言(SBML)编码的分子模型。

类似于数字时代的考古挖掘,参与者的经历也为未来最大限度地提高代码可重用性提供了策略。一个共同的主线是,注重重现性的科学家需要提高他们的文档游戏。威斯康星大学麦迪逊分校的生物统计学家卡尔·布罗曼(Karl Broman)说:“在2002年,我觉得我会永远记住所有的事情。”“直到后来才发现,你会在一个月内开始忘记一些事情。”

鲁吉尔的参赛作品复制了挑战赛1中最古老的代码,这是他16岁时为Apple II编写的一个图像放大镜,并发表在一本现已停刊的法国业余爱好者杂志上,名为tremplin Micro。(这项挑战中最古老的科学代码,在提交给ReScience C的一篇尚未发表的论文中进行了描述,这是一个有28年历史的程序,用Pascal编写,用于可视化水质数据。)。32年后,鲁吉尔不再确切地记得代码是如何工作的,它的AppleSoft基本指令令人费解--“这很奇怪,因为它是我写的。”但他能够在网上找到它,并让它在基于网络的Apple II仿真器上运行。他说,这是一件容易的事,而最难的是在一台真正的Apple II上运行。

硬件不是问题--鲁吉尔的办公室里有一台苹果II,是一位同事在清理办公室时抢救出来的。“对年轻人来说,‘哦,这是什么?’”他说。“所以你解释说,‘这是一台电脑’。而对于老年人来说,就是‘哦,是的,我记得这台机器’。“。但由于Apple II早于USB电缆和互联网-而且现代电脑不能直接与旧磁盘驱动器对话-鲁吉尔需要一些定制硬件,更不用说一盒老式软盘了,才能让电脑加载代码。他在亚马逊上找到的那些,标有“新的”,但可以追溯到1993年。在三次写入他的数据以确保位稳定之后,磁盘工作了。

布鲁诺·利维(Bruno Levy)是一名计算机科学家,也是南希INRIA研究中心的主任,他审阅了鲁吉尔的文章。Levy也有一台Apple II,并在Twitter上发布了一段结果的短视频。他在老式键盘上发出结实的“咔哒”声,调出代码并运行,这是一种风格化的“我们重做科学!”屏幕以单色绿色缓慢渲染。

当巴黎CNRS的生物物理化学家查尔斯·罗伯特(Charles Robert)了解到这一挑战时,他决定利用这一挑战来重新审视一个他多年没有关注的研究课题。“这给了我一种额外的动力,让我再次朝那个方向前进,”他说。

1995年,罗伯特在运行商业软件包MATHEMATICA的计算笔记本中对真核细胞染色体的三维结构进行建模。罗伯特在他的MacBook上安装了MATHEMATICA,但为了好玩,他花了100欧元(110美元)买了一台Raspberry Pi,这是一台运行Linux的单板业余电脑,预装了MATHEMATICA 12。

Robert的代码在很大程度上没有问题,但暴露了计算笔记本可能出现的困难2,例如代码组织上的缺陷和运行顺序混乱的代码片段。今天,Robert通过将代码拆分成模块并实现代码测试来绕过这些问题。他还使用版本控制来跟踪对代码的更改,并记下他的软件的哪个版本产生了每组结果。“当我看着我的一些旧代码时,我有时会畏缩,想着我现在怎么做得更好,”他说。“但我也认为,这个过程帮助锁定了我从那以后学到的一些教训。”

罗伯特在挑战中的成功是典型的:到目前为止发表的13篇可重现性文章中,只有两篇记录了失败的尝试。其中一个来自Hinsen,他在20世纪90年代初被有条不紊地存储代码的磁带阻碍了3。他说:“这就是实际备份的问题,而不是检查十年后您是否仍然可以读取您的备份。”“在某种程度上,你有一盘很棒的带备份的磁带,再也没有读卡器了。”(欣森还发表了一次成功的尝试4。)。其他未能完成挑战的研究人员指责缺乏时间,特别是在大流行的情况下。

参与者面临的另一个常见问题是过时的计算环境。1996年,萨比诺·马吉(Sabino Maggi),现在是位于巴里的意大利国家研究委员会大气污染研究所的计算物理学家,使用计算机语言Fortran对一个名为约瑟夫森结的超导装置进行建模,并用Microsoft Visual Basic对结果进行处理。Fortran在其间几乎没有什么变化,所以经过几次调整之后,Maggi的代码编译就没有问题了。Visual Basic带来了更大的问题。

“Visual Basic,”Maggi在他的报告5中写道,“是一种废弃的语言,很久以前就被Visual Basic.NET取代了,而Visual Basic.NET只与它的祖先共享这个名字。”要运行它,他必须在他的Mac上重新创建一台有几十年历史的Windows虚拟计算机。他用他在网上找到的安装盘把它装上了Microsoft DOS 6.22和Windows 3.11(都是1994年左右的产品)以及Visual Basic。“即使在这么多年之后,在仿真器中安装专有软件的合法性也可能是值得怀疑的,”Maggi承认。但他说,由于他在最初研究时拥有这些工具的有效许可证,他觉得“至少在道义上有权”使用它们。

但是要尝试哪个版本的Visual Basic呢?多年来,微软发布了该语言的多个版本,这些版本并不总是向后兼容的。Maggi已经记不起1996年他使用的是哪个版本了,地下室的一次漏水摧毁了他记录这些细节的旧笔记本。“我不得不从头开始,”他说。

波尔多INRIA的研究工程师Ludovic Courtès复制了2006年的一项研究,该研究比较了不同的数据压缩策略,其代码是用C6编写的。但程序员所依赖的应用程序编程接口(API)的变化阻止了他的代码使用当前的软件库进行编译。“一切都在发展--当然,除了报纸上使用的一些软件,”他说。他最终不得不将六个计算组件回滚到较旧的版本-这是一个“降级级联”。“这有点像个兔子洞,”他说。

今天,研究人员可以使用Docker容器(另见参考文献1)。7)和Conda虚拟环境(另请参阅参考文献。8)将计算环境打包以供重用。但有几位与会者选择了另一种选择,Courtès认为,该选择“非常可能代表可重现科学文章的‘黄金标准’”:名为Guix的Linux包管理器。它承诺环境可以复制到最后一位,并且在构建它们的代码版本方面是透明的。他说:“可以检查环境,甚至可以检查整篇论文,并且可以从源代码开始构建。”Hinsen称它“可能是我们目前拥有的最好的可重复研究的东西”。

INRIA和巴黎大学(University Of Paris)的计算机科学家罗伯托·迪科斯莫(Roberto DiCosmo)在他的重复性尝试9中强调了挑战参与者的另一个常见困难:首先定位他们的代码。DiCosmo研究了1998年的一篇论文,该论文描述了一种名为OcamlP3l的并行编程系统。他搜索了他的硬盘和备份,并要求他1998年的合作者也这样做,但一无所获。然后他搜索了软件遗产(Software Heritage),这是迪科斯莫自己在2015年创立的一项服务。“就是这样,难以置信,”他说。

Software Heritage定期爬行GitHub等代码共享网站,为源代码做互联网档案馆为网页做的事情。开发人员还可以请求服务存档他们的存储库,而质询规则要求参与者这样做。DiCosmo没有开始他在Software Heritage的搜索,因为当他开发OcamlP3l时,这项服务还不存在。一定有人把他的代码发布到了现已灭绝的Gitous存储库;软件遗产公司在网站关闭前对其进行了存档,并带着OcamlP3l一同前往。

当然,找到代码并不意味着如何使用它是显而易见的。例如,Broman报告说,缺少文档和“古怪”的文件组织意味着他很难准确地计算出需要运行哪些代码才能重现他2003年的研究10。“所以我不得不实际阅读原文,”他写道。