你上个世纪写的代码现在还能用吗?挑战者:我需要一台读带机

而且,随着编程语言、计算环境的演化,现在还能运行的代码过段时间可能就不行了。年代写的代码有条不紊地存到了磁带里,但现在,他已经没有能读取磁带的工具了。违反直觉的是,很多参赛者发现,用一些比较古老的语言写的代码反而是最容易复现的。...

找不到代码,硬件过时,文档丢失……几十年前的代码不容易重现。

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

“你敢拿十年前写的代码,看看还能不能用?” 在最近的一篇社论中,《》介绍了两位法国科学家发起的一项挑战。

这项名为“十年”的挑战赛由法国国家数字科学技术研究所的计算机神经科学家和法国国家科学研究中心的理论生物物理学家发起,旨在鼓励各个领域的研究人员翻出自己的十年。之前的(或更早的)代码,看代码是否还能用,研究是否可以复现。

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

他们认为,尽管计算在科学研究中的重要性日益增加,但研究人员很少披露他们的底层代码。即使给出代码,别人也很难执行,甚至作者本人有时也会遇到麻烦。而且,随着编程语言和计算环境的演进,现在可以运行的代码,过段时间可能就不行了。

因此,“‘十年代码再现性挑战’的目的是确定那些十年后仍然有效的代码编写和发布技术,”他说。

本次比赛共吸引了35名参赛者。他们提议复制 43 篇论文,其中 28 篇产生了可复制的报告。论文涵盖的语言包括C、R等,一位参赛者复制的不是代码,而是用SBML( )编写的分子模型。

当然,这条繁衍之路并不像想象的那么简单。有些人找不到代码,有些人找到代码却不知道如何运行。最后,他们总结了通过本次比赛提高代码复现性的一些技巧,可以为目前的工作提供参考。

旧代码不是那么容易工作

你的代码还在吗?

要完成这个挑战,首先你必须找到你的旧代码,有人在这一步卡住了。

是法国国家信息与自动化研究所的计算机科学家,他在 1998 年的一篇论文中提到了一个名为“”的并行编程系统。但在搜索了他和他的合著者的硬盘驱动器和备份后,他找不到该系统的代码。

幸运的是,一个名为“”的源代码存档站点为他提供了备份。

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

会定期爬取其他开源代码站点,有点像定期爬取网页的 ( )。开发人员还可以请求爬取自己的库进行归档。

一开始我并没有想过要自己找代码,因为他开发的时候还没有出现。他猜想一定是有人把他的代码上传到了托管平台,在平台关闭前抢到了。

你的文件还在吗?

“在一个组织良好的项目中,文档行数超过代码行数的情况并不少见,”加州大学伯克利分校的计算再现性倡导者说。“你想尽可能多地保留信息,对分析的结构有更广泛的描述,比如数据来自哪里、关于数据的一些元信息、代码等,是再现的关键。”

是爱丁堡大学的一位神经科学家,他想重现一个用 SBML 编写的计算模型。虽然模型在那里,但她找不到她正在使用的参数值(例如分子浓度),也没有很好地记录数据归一化的关键细节。

因此,她的部分研究无法复制。“即使对于同一个人来说,十年前显而易见的模型的许多细节都不再明显了,这令人惊讶!” 她茫然地说。

你有运行代码的硬件吗?

作为比赛的组织者,也参加了本次挑战赛。他复制的代码是 Apple II 中的图像放大镜,是整个挑战赛中最古老的代码。这段代码写于 32 年前,当时我 16 岁mac生物学软件,并发表在(已停刊的)名为 Micro 的杂志上。

今天,即使有神秘的 BASIC 语言指令,他也记不起代码是如何工作的。“该死,这是我自己写的,”若有所思地说。

然而,他能够在网上找到代码并让它在 Apple II 模拟器的 Web 版本上运行。做到这一点并不难,最难的部分是让它在真正的 Apple II 上运行。

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

硬件不是问题,因为他的办公室里有一台 Apple II,一位同事在打扫办公室时救了出来。但是由于这款 Apple II 比 USB 电缆和 更老,并且当前的计算机无法连接到其老式磁盘驱动器。因此,在运行代码之前,您需要某种定制硬件和一盒老式磁盘。

他在亚马逊上找到了一些带有“新”字样的磁盘,但它们的日期是 1993 年。在对他的数据进行了 3 次写入以确保位稳定后mac生物学软件,磁盘已启动并运行。

该活动的发起人也遇到了硬件问题。他有条不紊地将他在 1990 年代编写的代码存储在磁带上,但现在他没有读取磁带的工具。

您的计算环境过时了吗?

过时的计算环境也是压死参赛者的一根稻草。Maggi 是一位意大利计算机物理学家,他在 1996 年用语言模拟了一个超导设备,并使用 Basic 来处理结果。二十多年过去了,并没有太大的变化,所以 Maggi 只做了一些小的调整来让代码顺利编译。没想到,Basic 给他提出了一个问题。

“Basic 是一种死语言,早已被 Basic.NET 取代,”Maggi 在报告中写道。所以,为了运行二十多年前的 Basic 代码,Maggi 不得不使用在 上找到的安装盘在我的 mac 计算机上重建了一个使用了十年的虚拟机。

在安装之前,Maggi 遇到了一个问题:他不记得自己在 96 年使用的是哪个版本。多年来,微软已经发布了该语言的多个版本,但并不总是向后兼容。

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

模拟运行 Basic 的 mac 的 1994 年计算机。

同样受到计算环境困扰的还有法国国家信息与自动化研究所的研究工程师 Courtès。对于这个挑战,他复制了一篇 2006 年用 C 语言编写的比较数据压缩策略的论文。由于 API 更改,他的代码无法与现有的 软件 库编译。为了解决这个问题,他不得不将六个计算组件回滚到非常旧的版本。

今天,研究人员可以使用和 Conda 虚拟环境来打包计算环境以应对紧急情况。但是一些参赛者选择了其他方法,例如 Guix(Linux 包管理器)。它保证了环境可重现到最后一点,并且构建环境的代码版本是透明的。

“可以从源头检查和构建环境和整篇论文,”Courtès 说。相信 Guix 可能是本次比赛的“目前最好的可重复研究工具”。

与直觉相反,许多参赛者发现用旧语言编写的代码最容易重现。新语言快速变化的 API 和对第三方库的依赖使它们难以复制。从这个意义上说,今年刚刚停止支持的2.7是一个很好的机会。它是一种高级编程语言,不会再次更新。

如何提高代码的可重复性?

在经历了代码复现的艰辛之后,相信每一位参赛者在编写代码的过程中都意识到了代码中埋藏的一些“隐患”,比如存储介质、选择的语言、备份平台等。

那么,如何提高论文代码的重现性呢?“”文章的作者在文章中给出了一个:

1. 代码。基于诸如 Excel 等点击式界面的工作流是不可重现的。您希望在代码中保留计算和数据操作;

2. 文件。使用注释、计算笔记本、文件等来解释你的代码是如何工作的,定义预期的参数和所需的计算环境;

3. 记录。记下关键参数,例如用于启动随机数生成器的“种子”值。此类日志记录可以帮助您重新运行代码、跟踪错误和意外结果;

学车宝驾驶模拟学车软件 v15.1.26 免费版_mac生物学软件_学普联考试卷生物2016

4. 测试。创建一套测试功能。使用和控制数据集以确保您获得预期的结果,并在开发期间运行这些测试以清除出现的错误;

5. 保存。是一个流行但不是永久的在线存储库。从长远来看, 和 等归档服务可能会更加稳定;

6. 跟踪。使用 Git 之类的版本控制工具来记录您的项目历史记录,记下用于生成每个结果的版本;

7. 包装。使用容器化工具(、等)、Web 服务(Code Ocean、、)、虚拟环境管理器(Conda)等创建即用型计算环境;

8. 自动化。使用 CI 等持续集成服务,在不同的计算环境中定期自动测试你的代码;

9. 已简化。避免使用利基或难以安装的第三方代码库,这会使后续利用变得复杂;

10. 检查。通过在一系列计算环境中运行代码来检查代码的可移植性。

此外,曼彻斯特大学的计算机科学家 Goble 指出,让自己的代码开源也是一种提高可重复性的方法,这样其他人就有机会修改你的代码库以使其保持活力。

如果你也有十几二十年前写的代码,你可以把它拿出来看看是否还能用。

相关文章

发表评论