增加代码的归档寿命


11

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

了解任何试图估计典型科学代码或其他软件的半衰期的研究(或缺乏示例/注释)(如果这是一个合理的问题?)


Answers:


8

TeX的计划寿命会浮现:

“从1977年开始以来,我从事的TeX研究项目就受到两个主要目标的推动。第一个目标是质量:我们希望制作的文档不仅好,而且实际上是最好的。(…)第二个主要目标是存档:创建尽可能不受印刷技术变化影响的系统。当下一代打印设备问世时,我希望能够保持已经获得的相同质量,而不必重新解决所有问题。我想设计一些在100年后仍然可以使用的东西。” –唐纳德·E·努斯:《数字印刷》,第9页。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]


感谢您将此问题带给Matthias。欢迎来到scicomp!
阿隆·艾玛迪亚

2
我认为TeX示例实际上不是一个很好的示例,尽管通常认为它是冻结系统的经典案例。我认为是因为没有人再直接使用TeX。人们使用乳胶及其无穷无尽的包装,而且它们几乎没有被冷冻。因此,我认为(La)TeX文档和其他所有文档一样容易受到更改。在我看来,TeX就像一台虚拟机-您可以将其保持冻结状态,但是只要在其之上构建的代码不断变化,就不会赢得任何收益。
Wolfgang Bangerth,2012年

谢谢,从软件开发的角度来看,我认为这是一个很好的案例研究,这可能与科学的观点截然不同。每个人都需要间接构建TeX的事实对于广泛使用的软件可能不理想,但可能是科学代码仍可以成功运行并在数十年后构建的理想证明。但是,毫无疑问,Knuth会更简单地避免更改和更新以追求100年的稳定性吗?
cboettig 2012年

4

存在许多技术挑战,使计算结果的精确逐位再现非常困难。

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

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

好的,如果我们通过(例如)将其刻录到可运行代码的可启动CD-ROM上来保留整个软件环境(操作系统,库和已编译的代码)怎么办?现在我们可以确定,如果在另一台计算机上运行此代码,我们将获得相同的结果?

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

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

在实践中,您真正希望得到的最大结果是一台机器到另一台机器的结果相似,直至所使用算法的精度公差为止。例如,如果我有求根问题,并使用二等分法求出+ -1.0e-10之内的根,那么只要其他机器产生的误差在该公差范围内,我就应该很高兴。


顺便说一下,不同编译器版本的问题解释了为什么实际上还不足以分发源代码的“冻结”版本-生成的编译代码可能会因使用哪个版本的编译器而异,导致不同的结果。
Brian Borchers 2012年

2

已经进行了许多尝试来实现可再现性,并且有关于该主题的完整文献。我从15年的科学软件中得出的个人看法是,它不切实际,并且不令人满意。问题在于:(i)复杂的软件存在错误,因此无法冻结;(ii)软件永远不会具有完整的功能,因此开发会继续进行;(iii)用纸交付数十万行代码的价值是什么?

就像我说的那样,我发现这个答案并不令人满意。我相信,作为一个领域,计算科学在产生文学作品方面并不是很成功,这使我们相信我们发表的结果是正确的和可再现的。同时,我真的无法提出更好的方法。可以肯定的是,发布论文随附的源代码很有用。同时,每个诚实的人都会同意,论文中的结果通常将由不同版本的代码产生,在大多数情况下,这些代码会包含描述不同边界条件,不同右侧等的内容。带有相同代码的不同版本。首先,这对于读者来说很尴尬,但是,如果代码如此之大(如今天经常发生的那样)绝对是徒劳的-我最近的两篇论文所使用的代码大约是20,000行代码并且是基于交易的.II(600,000行代码)和Trilinos(150万行)代码)。可以为潜在读者提供哪些信息?(我应该说我的代码仍然可用。)


2
我不太悲观,但仍然不满意。您可以轻松地在任何给定的论文中报告与产生结果的代码相关联的修订控制标签或修订号,并且完全谨慎的作者将使用一个代码库重新运行对给定文章重要的所有结果。如果修订控制系统到位,可公开访问且标签已发布,我认为您无需自己交付代码。
比尔·巴特

当然可以。问题很简单,读者将如何处理您向她抛出的大量代码。是的,您可以运行它并验证结果是否与显示的相同。但是,这说明了什么呢?任何人都将如何(实际上而不是理论上)验证结果是否正确?
Wolfgang Bangerth,2012年

不,那是我完全同意的部分。除非我认为您是一个不道德的人,否则我无需重新运行代码即可准确地再现答案。我认为,更大的问题是,您是否已经充分证明自己已经验证了实现,以及是否可以针对实验进行验证。
比尔·巴特

谢谢,但是我觉得这不能解决问题。当然是有足够的空间来讨论为什么可用15年后其代码是有用的,但在这个问题上我只是问,如果该代码仍然为大多数人跑,你做归档。我熟悉鼓励代码归档的文献,但是40年前没有人鼓励为打孔卡建立全球存档。技术是否增加或减少了软件的半衰期?如果归档的代码在5年内成为电报的方式,那么其他问题还是无济于事。
cboettig 2012年

我相当确定,如果工作量很大,您可以让15年前编写的代码可以运行到今天。我相信您可以从今天开始获得编写良好的代码,并且可以在15年内运行。
Wolfgang Bangerth 2012年

2

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

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


1

我认为,就语言选择而言,使用标准化语言(例如C / Fortran / C ++)将被视为“最佳实践”。如果一个软件包依赖于其他10个lib / package,尤其是那些用晦涩的语言编写的lib / package,那么这显然不利于长寿。一段时间后,许多项目最终被孤立。我不认为BLAS / LAPACK,PETSc,FFTW,MPI等主要库/ API会很快消失。BLAS已经很老了。

以下代码段(从http://www.math.utah.edu/software/c-with-fortran.html窃取)早于Fortran 77,使用Hollerith常数进行char操作,但在40至50年后可以正常编译GNU Fortran编译器:

stali@x61:~$ cat olde.f

       CALL S(12HHello, world, 12)
       END
       SUBROUTINE S(MSG,N)
       INTEGER K, N, M
       INTEGER MSG(1)
       M = (N + 3) / 4
       WRITE (6,'(20A4)') (MSG(K), K = 1,M)
       END

stali@x61:~$ gfortran -std=legacy olde.f; ./a.out
Hello, world

像googlecode这样的开放源代码/将其放在不太可能很快消失(尽管他们确实关闭了代码搜索)的地方是没有道理的。


谢谢你的例子!我很想看到其他语言(包括脚本语言)之间的比较-用perl,python或R编写的第一个代码是否仍能以相同的结果运行?与C或Fortran相比,他们这样做的可能性更大吗?
cboettig 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.