10

我编写科学研究代码,特别是在生物信息学方面。当然,在科学中,结果应该是可重复的。不定期参与项目并且不详细了解基础架构的人可能会合法地希望查看我的代码以重现结果。问题在于,使代码自包含足以轻松地向这样的人提供/解释似乎严重限制了可能的重用量。

  • 将多个相关项目中使用的功能分解到个人库中通常很方便,但是将所述库与 5,000 行(诚然记录不佳,因为它不打算成为生产/发布质量)代码转储是不方便的与想要快速重现结果的人手头的问题有关。

  • 在您的系统上安装一组关键库并且无需三思而后即可使用通常很方便,但是向主要是科学家而不是程序员的人解释您如何设置所有这些东西并不方便。如果您自己不记得某些细节,则尤其如此。(请注意,尽管所讨论的细节是与科学无关的技术细节。)

  • 将研究项目的几个相关方面的所有代码保存在一个有大量选项的大程序中通常很方便,而不是为您尝试的每个细微变化/事物编写完全独立的代码,但同样,转储所有代码并不方便这个,或者向那些只想重现结果的人解释这一切。

有哪些方法可以处理这些问题,以便我可以重用代码,但仍然允许想要重现我的结果的人通过合理的努力来启动和运行我的代码?请注意,我的问题的核心是创建不太成熟的可重用代码库的可能性。

4

2 回答 2

4

我认为回答这个问题的一种方法是考虑科学编程世界中的其他工具是如何做到的。我将把这个答案变成一个社区维基,人们可以用他们知道的代码添加到它;那么也许我们可以最终得到一个想法和例子的列表,我们都可以用于这些事情。

  1. “无数选项”方法

    1. 具有大量菜单和子菜单的 GUI:
    2. 带有许多参数的命令行工具,希望其中许多是可选的
      • 许许多多!使用PETSc的工具使用它来控制他们的线性代数
    3. 工具、命令行或其他方式,具有带有许多参数的配置文件,这些参数希望是可选的
  2. UNIX 小工具方法 - 构建许多小工具,这些小工具可以串在一起制作复杂的工具。如果您的工具可以以这种方式分解,则效果很好。

    • 分子动力学包Gromacs
    • NEMO恒星动力学工具箱
    • 许多可视化包也以这种方式工作。在 GUI 中,定义了一系列小工具。 视窗, OpenDX ,访问
    • 对于一般的 Python 计算,Ruffus可用于将小工具组织成更大的工作流
  3. 从例程中构建一个工具:这里的程序作为一个工具包分发,该工具包附带一个脚本(和一些示例),该脚本从零碎中构建了一个特定于问题的应用程序。

    • FLASH代码就是这样做的。
  4. 将功能公开为一个或多个可以链接的库:
    • 工具,通常是数学性质的,例如FFTWPETScGSL ...
  5. 与 3+4 相关:一种插件类型的方法,其中工具(通常但不总是 GUI)公开插件功能,可以轻松合并到更大的工作流程中
  6. 与 2 相关:不是在命令行调用工具,而是工具有自己的命令行,可以在其中调用许多单独的例程;拥有自己的命令行允许您对环境进行更多的控制,而不仅仅是将其留给 shell(但当然,需要更多的工作)。
于 2011-03-02T03:50:10.043 回答
2

这应该是评论,但我不能把它们全部放在那个小盒子里......

我编写科学研究代码,特别是在生物信息学方面。当然,在科学中,结果应该是可重复的。不定期参与项目且不了解基础设施的人

您在这里谈论的是基础架构,编程方面,对吧?

详细可能合法地希望查看我的代码以重现结果。问题在于,使代码自包含足以轻松地向这样的人提供/解释似乎严重限制了可能的重用量。

我不明白。为什么他们不能重现结果?还是您的意思是说他们希望重用您的程序?

将多个相关项目中使用的功能分解到个人库中通常很方便,但是将所述库与 5,000 行(诚然文档记录不佳,因为它不打算成为生产/发布质量)代码转储是不方便的与想要快速重现结果的人手头的问题有关。

(除了“结果复制”,但这可能是我这边的语言问题);问问自己有多少人会真正使用你的图书馆。如果像在许多情况下一样,只有一两个,那么我认为为了他们而改变它是不合理的。

我通常以适合我思维方式的方式制作图书馆供我私人使用。为他们调整它,纯粹是为了他们的方便(即没有专门为此获得报酬,我假设你不是)实际上是他们说“我不想写自己的,并且我不想思考你是如何组成的,所以去重构它,这样我就可以不假思索地轻松使用它”。

在您的系统上安装一组关键库并且无需三思而后即可使用通常很方便,但是向主要是科学家而不是程序员的人解释您如何设置所有这些东西并不方便。如果您自己不记得某些细节,则尤其如此。(请注意,尽管所讨论的细节是与科学无关的技术细节。)

将研究项目的几个相关方面的所有代码保存在一个有大量选项的大程序中通常很方便,而不是为您尝试的每个细微变化/事物编写完全独立的代码,但同样,转储所有代码并不方便这个,或者向那些只想重现结果的人解释这一切。

当然。“科学编码”的问题(我多么不喜欢这个表达方式)是程序只是处理其他事情的过程中的一个工具,这意味着你正在制作它而不真正希望自我包含它,因为它是预期的随着工作的进行进行修改。

有哪些方法可以处理这些问题,以便我可以重用代码,但仍然允许想要重现我的结果的人通过合理的努力来启动和运行我的代码?

针对特定情况在 VCS 中分支代码,然后为某人提供最接近他们需要的版本总是对我有用。

于 2011-03-02T14:29:54.483 回答