什么是研究软件工程?
研究软件工程(RSE)是一门将专业软件工程实践——版本控制、测试、代码审查、持续集成、文档编写和长期维护——应用于支撑科学研究的代码的学科。如果你曾经花了三周时间调试一个只能在某位博士后的笔记本电脑上运行的分子动力学分析脚本,或者试图从一堆没有文档的 Python 压缩包中复现一篇已发表的结果,那么你已经遇到了研究软件工程旨在解决的问题。本文将解释什么是 RSE、它与相邻角色的区别、研究软件工程师日常实际做什么,以及如何判断你的团队是否需要一位。
简短定义,以及为何它存在争议
“研究软件工程师”这一术语大约于 2012 年在英国被创造出来,主要归功于软件可持续性研究所(Software Sustainability Institute)的工作,目的是为日益壮大的一群人命名——他们既不是传统的研究人员,也不是 IT 支持人员。他们编写的代码对研究至关重要,但他们的职业发展、职位名称和认可度却无法归入任何一类。
常被引用的工作定义是:研究软件工程师是兼具以下三点的人:
- 对软件工程的专业理解——设计、测试、版本控制、部署、维护。
- 在研究中的积极参与——对研究问题、论文发表和基金申请做出贡献,而不仅仅是实现别人下达的规格说明。
- 与至少一个研究领域的深度接触——足以理解科学、数据和约束条件。
有争议的部分在于边界。一位维护广泛使用的 R 包的生物信息学家是 RSE 吗?一位为自己的论文编写模拟代码的物理学家是 RSE 吗?一位编写大量 Python 的研究团队“数据管理员”是 RSE 吗?没有发证机构,也没有普遍认可的认证,因此这个标签是务实应用的。在实践中,区分特征是取向:RSE 将软件视为一等研究成果和长期存在的产物,而不是为单篇论文服务的一次性手段。
RSE 与相邻角色:对比
理解 RSE 最快的方式是看它与常被混淆的角色之间的相对位置。下表是一种启发式参考,而非分类法——现实中人们不断模糊这些界限。
| 维度 | 研究软件工程师 | 传统研究者(会写代码) | IT / 研究计算支持 | 数据科学家 / 分析师 |
|---|---|---|---|---|
| 主要产出 | 可维护、可复用的软件 | 论文和发现 | 可运行的基础设施和服务 | 模型、分析、决策 |
| 代码生命周期 | 数年到数十年;有版本发布 | 通常绑定于一个项目/论文 | 服务生命周期;常由供应商管理 | 通常绑定于项目 |
| 典型技能 | 软件设计、测试、CI/CD、HPC、领域科学 | 领域科学、方法、统计 | 系统管理、网络、调度器、安全 | 统计、机器学习、领域数据 |
| 与研究问题的关系 | 共同定义并塑造它 | 拥有它 | 间接服务于它 | 通常回答一个被提出的问题 |
| 成功指标 | 采用率、可复现性、软件引用量、可持续性 | 论文、基金、影响力 | 正常运行时间、用户满意度、成本 | 商业/研究洞察 |
| 职业路径 | 常为混合型;有时是永久职员科学家 | 教职 / 博士后阶梯 | IT 阶梯 | 工业界或学术界 |
关键洞察:RSE 不是“碰巧擅长写代码的研究者”,也不是“帮忙写 Python 的 IT 人员”。这个角色的定义是将软件作为研究成果来拥有,同时始终嵌入科学之中。
Related: — Project-based data-science paths with a guided terminal and real datasets.
研究软件工程师实际做什么
职位描述千差万别,但工作可归入几个可识别的类别。现实中的一周可能涉及其中四到五类。
1. 构建和维护研究软件
这是核心。它包括为模拟代码设计 API、将单体分析脚本重构为经过测试的库、打包工具以便在 PyPI 或 conda-forge 上分发,以及防止依赖项出问题。对于一个分子动力学团队来说,这可能意味着维护一个 GROMACS 或 LAMMPS 分析工具包,或者编写一个 NumPy/HDF5 流水线,在不将数 TB 数据加载到 RAM 的情况下流式处理轨迹数据。
2. 使研究可复现
RSE 往往是将 environment.yml、pyproject.toml、容器镜像(Docker、Singularity/Apptainer)和工作流管理器(Snakemake、Nextflow、Common Workflow Language)引入实验室的人。目标是:一个结果可以在两年后、由另一个人、在另一台机器上重新生成。这正是 RSE 与可复现性运动和 FAIR 数据原则高度重叠的地方。
Worth a look: — One subscription for university-backed Python and data-science certificates.
3. 性能与扩展
科学代码经常需要运行得更快或处理更大规模。RSE 会对代码进行性能分析、向量化 NumPy 操作、用 MPI 或 OpenMP 并行化、将热点循环移植到 C/C++/Fortran 或使用 Numba/Cython,并调优 I/O——例如,HDF5 的分块和压缩选择在轨迹分析中可能主导运行时间。他们还帮助团队有效使用 HPC 集群和 GPU。
4. 咨询与培训
许多 RSE 开设答疑时间、代码审查和研讨会(Software Carpentry、HPC Carpentry、领域特定培训)。他们影响力的很大一部分来自教会研究者自己写出更好的代码,而不是替他们全部完成。
5. 基金与论文贡献
RSE 越来越多地作为共同作者和基金申请中的具名人员出现,因为资助方现在期望有软件可持续性和管理计划。撰写该计划、估算工作量并承诺维护,都是 RSE 的活动。
RSE 在组织中的位置
有三种常见模式,各有取舍:
- 集中式 RSE 团队(全校或全研究所的团队)。优势:共享专业知识、为 RSE 提供职业路径、有能力为多个项目配备人员。劣势:可能远离任何单一研究问题;存在内部计费或优先级政治。
- 嵌入研究团队或实验室。优势:深厚的领域背景、快速迭代、牢固的关系。劣势:孤立、缺乏同行 RSE 社区、RSE 可能沦为通用的“帮我修电脑”资源。
- 混合 / 矩阵式。一个中心团队,人员借调到项目中。越来越常见;需要清晰的直线管理和时间分配协议。
英国拥有特别显眼的 RSE 社区,有年度 RSE 会议和区域网络。德国(de-RSE)、荷兰、美国和澳大利亚也有类似社区。研究软件工程学会(Society of RSE)在英国成立,作为专业机构。
RSE 与可复现性和开放科学的关系
计算科学中的可复现性危机在很大程度上是一个软件问题。分析依赖于特定的库版本、未记录的预处理步骤,以及从未发布的代码。RSE 实践直接解决这些问题:
- 版本控制和打标签的发布使得引用所使用的确切软件版本成为可能。
- 测试能捕捉那些产生看似合理但错误结果的隐蔽数值 bug。
- 持续集成确保代码在依赖更新后仍能正常工作。
- 归档代码到 Zenodo 或 Software Heritage,为其提供 DOI 和永久归宿。
- 文档让他人(包括未来的你)能够理解和复用。
由研究数据联盟(Research Data Alliance)制定的研究软件 FAIR 原则,将 FAIR 数据指南明确扩展到软件。期刊越来越多地要求代码可用性声明,有些还要求将代码审查作为发表的一部分。
如何判断你是否需要一位 RSE
并非每个团队都需要专职 RSE。用以下标准作为粗略筛选:
你很可能需要一位,如果:
- 软件是你研究成果的核心,并且被你团队之外的人使用。
- 你跨多个基金和年份维护代码,而它不断出问题。
- 你反复重建别人已经解决的相同基础设施(I/O、并行化、打包)。
- 审稿人、合作者或资助方询问软件可持续性,而你没有好的答案。
- 你的团队在软件维护上花费大量时间,而这在论文中不可见。
你可能(还)不需要一位,如果:
- 你的代码确实是丢弃型的——为单个图表做的一次性分析。
- 你的需求由维护良好的社区工具满足,你只写胶水脚本。
- 你有一位真正喜欢并擅长此事、且有时间的团队成员。
一个折中方案:聘请一位兼职 RSE、参与核心团队,或投资培训以帮助现有研究者采用最佳实践。最糟糕的结果是聘请了一位 RSE,然后把他当作临时 IT 支持使用。
职业路径以及如何成为 RSE
RSE 的职业确实多样。入门途径包括:
- 计算领域(物理、化学、生物信息学)的博士,逐渐转向软件方向。
- 来自工业界的软件工程师,想从事科学问题。
- 研究人员,将其软件角色正式化。
最重要的技能,大致按出现频率排序:
- Python 知识(以及常用于性能关键代码的 C++、Fortran 或 Julia)。
- 使用 Git 进行版本控制,包括分支和代码审查工作流。
- 测试框架(Pytest、GoogleTest)和 CI(GitHub Actions、GitLab CI)。
- 打包和环境管理(Conda、Pip、Container)。
- HPC 和并行编程(MPI、OpenMP、CUDA、Slurm 等作业调度器)。
- 该领域的科学能力:足以作为同行与研究者交流。
- 沟通和教学技能。
职业阶梯不如学术界或工业界那样标准化。一些 RSE 成为永久职员科学家;一些进入研究计算领导层;一些回到教职;一些去工业界。缺乏清晰的阶梯是社区中一个真实且常被讨论的问题,也是专业机构和中心团队重要的原因之一。
常见误解
- “RSE 就是为科学家提供 IT 支持。” 不——RSE 塑造研究问题并拥有软件产品。IT 支持维护基础设施。
- “任何优秀的程序员都能做 RSE。” 领域背景极其重要。一位出色的 Web 开发者可能不知道为何浮点求和顺序会改变结果。
- “RSE 只写代码。” 工作的很大一部分是咨询、培训和设计讨论。
- “RSE 是通往‘真正’学术工作的跳板。” 对一些人来说是的;对许多人来说,它是一个正当的、永久的职业。
- “你需要计算机科学学位。” 大多数 RSE 来自科学领域,而非计算机科学。
关键要点
- 研究软件工程将专业软件实践应用于研究代码,将软件视为一等、长期存在的研究成果。
- RSE 的定义在于结合软件工程技能、积极的研究参与和领域专业知识——而非特定的职位名称或认证。
- RSE 与 IT 支持、数据科学和“会写代码的研究者”的主要区别在于将软件作为产品来拥有及其多年生命周期。
- 核心活动包括构建和维护代码、实现可复现性、性能调优、咨询、培训,以及对基金和论文的贡献。
- RSE 可以是集中式、嵌入式或混合式;每种模式在背景、职业路径和优先级方面都有真实的取舍。
- 判断你是否需要一位 RSE,取决于软件是否核心、是否被复用、是否长期存在——而不仅仅取决于团队规模。
来源与延伸阅读
- 研究软件工程 — 维基百科:研究软件工程是将软件工程实践、方法和技术应用于研究软件,即为……而制作的软件。
- 软件工程 — 维基百科:软件工程是计算机科学和工程学的一个分支,专注于设计、开发、测试和维护软件应用。它涉及……
常见问题
用简单的话说,什么是研究软件工程?
研究软件工程是构建和维护科学家所依赖的软件的实践,采用与商业软件团队相同的专业标准——测试、版本控制、文档、维护。研究软件工程师工作在软件开发和科学领域的交叉点,因此他们既理解代码,也理解代码所服务的科学。目标是让软件正确、可复用,并在多年后仍然可用。
研究软件工程师与软件工程师有何不同?
传统的软件开发人员通常为用户或客户创建产品,而需求通常由产品团队确定。研究软件开发人员开发的软件的目的是生成或支持科学知识,其中的需求通常是探索性的,并且“正确”的结果可能是事先未知的。 RSE 通常还需要实际的领域知识,足以判断数值结果在物理上是否合理,而不仅仅是代码是否会执行。
我需要博士学位才能成为研究软件工程师吗?
不,但是领域知识是必不可少的,而博士学位是获得它的一种常见方式。许多 RSE 拥有物理、化学、生物信息学或相关领域的博士学位,并转向软件方面的工作。其他人来自行业软件工程并在工作中学习该领域。重要的是能够以同行的身份与研究人员就科学问题进行交流,而不是证书本身。
研究软件工程师使用哪些编程语言?
Python 占据主导地位,尤其是在分析、脚本编写和粘合代码方面,通常与 NumPy、pandas 和基于 HDF5 的 I/O 并驾齐驱。性能关键组件通常用 C++、Fortran 或 C 编写,其中 Julia 和 Rust 逐渐流行。 R 在统计学和生物信息学中仍然很重要,shell 脚本、Make 和工作流语言(如 Snakemake 和 Nextflow)也无处不在。实践比语言本身更重要。
研究软件工程是一份好职业吗?
对于既喜欢科学又喜欢软件的人来说,这可能是一个需求旺盛、问题多样、影响明显的优秀职业。主要需要注意的是,职业结构不如学术界或工业界标准化,因此发展在很大程度上取决于机构以及是否存在中央 RSE 小组。尽管缺乏统一的晋升路径是一个公认的问题,但许多 RSE 发现这份工作比博士后职位更稳定、报酬更高。
研究软件工程如何支持可重复性?
RSE 实践通过固定准确的软件版本、自动化构建和测试、记录依赖关系以及使用 DOI 归档代码以便引用和检索,使结果具有可重复性。如果没有这些实践,分析通常依赖于未记录的步骤和以后无法重建的特定库版本。 RSE 还引入了容器和工作流管理器,可以捕获整个计算环境,而不仅仅是代码。
进一步阅读和权威来源
- 关于研究软件工程的维基百科文章提供了该术语的广泛概述和历史。
- 软件可持续性研究所 (software.ac.uk) 广泛发表有关 RSE 定义、职业和社区调查的文章。
- 研究软件工程协会 (society-rse.org) 是英国该领域的专业机构。
- 研究数据联盟的研究软件 FAIR 原则将 FAIR 数据指南专门扩展到软件。
- 《开源软件杂志》(joss.theoj.org) 和《开放研究软件杂志》发布同行评审的研究软件。
Frequently asked questions
简单来说,什么是研究软件工程?
研究软件工程是使用商业软件团队使用的相同专业标准(测试、版本控制、文档、维护)构建和维护科学家所依赖的软件的实践。研究软件工程师在软件开发和科学领域的交叉领域工作,因此他们既了解代码又了解其所服务的科学。我们的目标是软件是正确的、可重用的,并且在多年后仍然可以工作。
研究软件工程师与软件工程师有何不同?
传统的软件开发人员通常为用户或客户创建产品,而需求通常由产品团队确定。研究软件开发人员开发的软件的目的是生成或支持科学知识,其中的需求通常是探索性的,并且“正确”的结果可能是事先未知的。 RSE 通常还需要实际的领域知识,足以判断数值结果在物理上是否合理,而不仅仅是代码是否会执行。
我需要博士学位才能成为研究软件工程师吗?
不,但是领域知识是必不可少的,而博士学位是获得它的一种常见方式。许多 RSE 拥有物理、化学、生物信息学或相关领域的博士学位,并转向软件方面的工作。其他人来自行业软件工程并在工作中学习该领域。重要的是能够以同行的身份与研究人员就科学问题进行交流,而不是证书本身。
研究软件工程师使用哪些编程语言?
Python 占据主导地位,尤其是在分析、脚本编写和粘合代码方面,通常与 NumPy、pandas 和基于 HDF5 的 I/O 并驾齐驱。性能关键组件通常用 C++、Fortran 或 C 编写,其中 Julia 和 Rust 逐渐流行。 R 在统计学和生物信息学中仍然很重要,shell 脚本、Make 和工作流语言(如 Snakemake 和 Nextflow)也无处不在。语言比周围的实践更重要。
研究软件工程是一个好职业吗?
对于既喜欢科学又喜欢软件的人来说,这可能是一个需求旺盛、问题多样、影响明显的优秀职业。主要需要注意的是,职业结构不如学术界或工业界标准化,因此发展在很大程度上取决于机构以及是否存在中央 RSE 小组。尽管缺乏通用的阶梯是一个公认的问题,但许多 RSE 发现这份工作比博士后职位更稳定、报酬更高。
研究软件工程如何支持可重复性?
RSE 实践通过固定准确的软件版本、自动化构建和测试、记录依赖关系以及使用 DOI 归档代码以便引用和检索,使结果具有可重复性。如果没有这些实践,分析通常依赖于未记录的步骤和以后无法重建的特定库版本。 RSE 还引入了容器和工作流管理器,可以捕获整个计算环境,而不仅仅是代码。进一步阅读和权威来源 - 维基百科关于研究软件工程的文章提供了广泛的概述和历史
Learn Python by coding in your browser
Interactive Python and data-science courses you code directly in the browser