增加代码的归档寿命

计算科学 软件 出版物 再现性
2021-12-18 03:38:56

是否有已发布的最佳实践列表来确保代码的寿命,并着眼于可重复的科学结果?(例如开源、文档实践、选择依赖项、选择语言、虚拟机等)。

知道任何试图估计典型科学代码或其他软件的半衰期的研究(或缺乏例子/轶事)(如果这甚至是一个合理的问题?)

4个回答

想到了 TeX 的计划寿命:

“从 1977 年开始,我着手的 TeX 研究项目就受到两个主要目标的驱动。第一个目标是质量:我们想要制作的文档不仅漂亮,而且实际上是最好的。(...) 第二个主要目标是归档:创建尽可能独立于印刷技术变化的系统。当下一代打印设备出现时,我希望能够保持已经达到的相同质量,而不是重新解决所有问题。我想设计一些在 100 年后仍然可以使用的东西。” – Donald E. Knuth:数字印刷术,p。559(引自http://de.wikipedia.org/wiki/TeX

根据 Knuth 关于数字排版的书籍,甚至完全重新实现 TeX 和 METAFONT 应该是可能的。它们包括所有代码的注释和解释。

通过要求你的结果应该在几十年内保持稳定,你会陷入一种冰冷的困境。一方面,您希望轻松 100% 地重现您的结果,因此您冻结了您的软件/环境。另一方面,有兴趣在未来重现您的结果的人肯定会希望以此为基础。这个人会被非常旧的软件困住,很难改变任何东西。对于建立在几个外部包上的任何东西,几年就足以使事情几乎无法改变。

对于 TeX,冻结是在 1990 年的文章中宣布的

TEX 和 METAFONT 的未来 http://www.ntg.nl/maps/05/34.pdf

“我坚信一个不变的系统具有巨大的价值,尽管任何复杂系统都可以改进是不言而喻的。因此,我认为对称为 TEX 和 METAFONT 的系统进行进一步的“改进”是不明智的。让我们看看这些系统作为固定点,应该在 100 年后产生与今天相同的结果。”

理想的系统将可重复性与可变性结合起来。尽量做到自给自足、简单且经过充分测试当然会有所帮助。

如果我离题太多,请原谅我。[来自“可重复研究的科学家”的交叉发布,reproducible-research@googlegroups.com]

有许多技术挑战使得计算结果的精确逐位再现性极难实现。

在软件级别,对代码或代码使用的任何库的更改显然会导致产生不同的结果。您会对最终链接到典型科学代码的支持库的数量感到惊讶。

在较低级别,使用新编译器或打开不同的编译器优化重新编译任何代码或代码使用的任何库也会导致问题。一个原因是当重新编译代码时,代码中的各种操作可能会以不同的顺序执行。由于浮点加法不是关联的 (a+b)+c <> a+(b+c),因此会产生不同的结果。

好的,那么,如果我们通过(例如)将整个软件环境(操作系统、库和编译代码)刻录到可运行代码的可引导 CD-Rom 上来保留整个软件环境(操作系统、库和编译代码)会怎样。现在,如果我们在不同的计算机上运行这段代码,我们是否可以确定我们会得到相同的结果?

令人惊讶的是,一些代码实际上会根据它们运行的​​特定处理器模型的各个方面来改变计算顺序。例如,优化的线性代数库通常会分解矩阵乘法以处理适合缓存的块。当英特尔发布具有更大缓存的新微处理器时,代码可能会动态调整块大小,从而导致以不同顺序执行的算术运算并给出不同的结果。其他代码根据可用内存量动态调整计算顺序 - 如果您在具有更多内存的计算机上运行代码,很可能会导致算法以不同的顺序完成,从而给出不同的结果。

当你加入多线程代码时,事情会变得非常复杂,因为不同线程的确切执行历史通常是不确定的,这可能再次导致算术运算从一次运行到下一次以不同的顺序执行。

在实践中,您真正希望的最大结果是从一台机器到另一台机器的相似结果,直至所使用算法的精度容差。例如,如果我有一个求根问题并使用二分法在 +-1.0e-10 内得到一个根,那么只要不同的机器产生的答案在该公差范围内一致,我就会很高兴。

在实现可重复性方面已经进行了许多尝试,并且有关于这个主题的完整文献。我从 15 年的科学软件中得出的个人观点是,这是不现实的,就像我找到的答案一样不令人满意。问题是(i)复杂的软件有错误,因此不能被冻结;(ii) 软件永远不会功能完整,因此开发仍在继续;(iii) 用一篇论文交付数十万行代码有什么价值?

正如我所说,我觉得这个答案不能令人满意。我相信,作为一个领域,计算科学在产生让人相信我们发表的结果是正确且可重复的文献方面并不是很成功。同时,我真的想不出办法把事情做得更好。当然,随论文一起发布源代码很有用。同时,每个诚实的人都会同意,论文中的结果通常是由不同版本的代码产生的,在大多数情况下,这些代码包含描述不同边界条件、不同右手边等的黑客攻击。然后,一篇论文将带有相同代码的不同版本。这对读者来说很尴尬,但是如果代码像今天经常发生的那样大,那是完全没有生产力的——我最近的两篇论文使用的代码大约有 20,000 行代码,并且基于 deal.II(600,000 行代码)和 Trilinos(150 万行代码)代码)。这为潜在读者提供了哪些信息?(我应该说我的代码仍然可用。)

有关此问题的可能解决方案,请参阅我的ActivePapers项目。总之,它描述了如何将数据和代码打包在一起,并明确依赖于每个软件组件的特定版本。这使得精确再现计算成为可能,同时还允许在相同数据上运行更新的软件。

我应该补充一点,ActivePapers 只是一个概念证明,在不久的将来不太可能有任何实际用途。原因是它基于所有可执行代码必须作为JVM字节码存在的原则。目前,这排除了太多流行的科学图书馆。然而,一旦可重复性被认为很重要,编程工具的优先级也可能发生变化。