我的问题是:我应该在多大程度上尝试将这些工具合并到我的研究代码中?
无论您尝试做什么,只要您觉得付出多少,就会得到回报。如果您主要使用 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 为中心,因此您可能会对此持保留态度,但版本控制部分值得一看。