如何计划和将项目管理工具整合到研究代码中

计算科学 开源的
2021-12-09 11:02:59

我正在进入我的博士课程的第三年,到目前为止,我的研究代码(数值逆问题/医学成像/图像处理/等)主要由杂乱无章的 MATLAB 脚本和函数组成,还有一些 MEX'd C++ 和 CUDA在这里和那里加入一些例程以增加速度。使用 MATLAB 一直(大部分)令人愉快,但是我可能不会完全放弃它:

今年夏天,我一直在国家实验室研究一个“大”代码,我开始看到一个很好用的、面向对象的、版本控制的代码的美妙之处,它很好地使用了 gmake 和其他计算机科学玩具.

我的问题是:我应该在多大程度上尝试将这些工具合并到我的研究代码中?我应该花多少时间“计划”我的代码的结构和实现,或者我应该停止思考它而只写好的例程?我觉得我应该开发一个精心策划的开源代码库作为我的论文的产品,以获得经验和 CV 信誉,但我不知道如何驾驭这个过程。任何提示、书籍/文章/网站推荐等?

2个回答

我会考虑这些问题:

  1. 您是否希望您的代码成为您以后可以重用的相当通用的代码,或者这只是您用于一个研究项目或您不打算重用的论文的一小段代码?如果您没有重用代码的计划,那么可能不值得花时间和精力来改进代码。

  2. 您是否对正在使用的算法和数据结构有足够的了解,并且有信心继续使用这些算法和数据结构?如果没有,那么将您的研究冻结为稳定的代码可能还为时过早。

  3. 你想分享代码,让其他人使用代码,并最终让其他人帮助进一步开发代码吗?作为研究人员,您应该了解这是确保您的代码对您的研究领域产生影响的最有效方法之一。但是,要开始这项工作,您必须提供相当健壮的代码,并且您需要在开源许可下发布它,以便其他人可以在他们自己的项目中使用该代码。

我的问题是:我应该在多大程度上尝试将这些工具合并到我的研究代码中?

无论您尝试做什么,只要您觉得付出多少,就会得到回报。如果您主要使用 MATLAB 脚本,那么版本控制和单元测试可能就是您所需要的。如果您有 MEX 文件,最好有一个编译它们的 Makefile,如果只是为了您自己的理智,因为每次您想要构建 MEX 文件时输入编译命令序列是脆弱的。

这些工作流工具被使用并整合到大型项目中的部分原因是对这些工具的投资为他们的目标带来了回报。例如,对于支持您的论文的一次性研究代码,可能不值得使用像 CMake 这样的跨平台构建系统。对于一个既定目的是跨平台兼容的库,比如 Elemental,花时间使用跨平台构建系统更有意义。

我应该花多少时间“计划”我的代码的结构和实现,或者我应该停止思考它而只写好的例程?

这取决于您对尝试解决的问题、适当的算法、数据结构、编程实践等的熟悉程度。就像大纲和预写有助于期刊文章一样,一定程度的头脑风暴和伪编码有助于编写结构良好的代码。我喜欢 Steve McConnell 的 Code Complete 中的 Pseudocode Programming Process;他还提供了一些参考资料和指南,说明在设计阶段应花费多少时间,具体取决于项目的类型。

编写一次性版本的例程和试验一小段代码也很有帮助。软件开发中的一句常见格言是,您总是会丢弃至少一个版本的代码。

根据 Greg Wilson 在 Software Carpentry 的工作,我倾向于相信“敏捷”开发实践往往最适合大多数科学软件开发(免责声明:我过去曾自愿参与过他们的工作)。从广义上讲,“敏捷”意味着你应该设定你认为你会在短时间内达到的目标(比如,几天、一周,最多一个月),计划如何通过一些伪编码来实现这些目标和设计,然后编写代码,然后重复。短周期将帮助您对变化做出反应,例如当您的顾问决定他希望您以您未预料到的方式扩展您的工作时。

我觉得我应该开发一个精心策划的开源代码库作为我论文的一个产品,以获得经验和 CV 信誉,但我不知道如何驾驭这个过程。任何提示、书籍/文章/网站推荐等?

这一切都取决于你想做什么。对于涉及软件开发的职位,开发开源代码库很有帮助,因为您可以在 GitHub 上发布并指向它。也就是说,如果你想让它成为人们会使用的软件包,你将不得不花一些时间来维护它。你可能不想这样做。将您的研究代码贡献给相关的现有项目也是一个非常好的选择。公司似乎想要两者兼而有之。如果您可以为其他人的代码做出贡献,这表明您是一个团队合作者,并且您可以阅读其他人的代码并且仍然可以用它做一些有用的事情。

在参考文献方面,Software Carpentry 的参考阅读清单非常适合科学家,如果您想更深入地研究软件工程实践,Code Complete(请参阅上一个链接中的清单)有更多参考文献开始变得有点过时了,但查找起来很有用。他们发表的关于科学计算最佳实践的论文也很有帮助

Software Carpentry 的课程也很有帮助。在编程方面,它们以 Python 为中心,因此您可能会对此持保留态度,但版本控制部分值得一看。