1. 课程导入与复现危机
计算生物学最令人沮丧的场景之一,不是程序报错,而是程序没有报错,结果却和上次不一样。同一份 RNA-seq 数据、同一套差异表达流程,三个月后重新运行,差异基因从 1832 个变成 1794 个;同一份系统发育树脚本,换一台服务器后拓扑结构出现两处不一致;同一份分子对接结果,合作者按论文方法部分复现,结合能排序完全不同。这类问题通常不会在论文投稿时暴露,却会在审稿人索要代码、实验室新人接手项目、或自己半年后返工时集中爆发。
本课程的核心对象不是某一个具体工具,而是计算生物结果从产生到被重建的完整链路。这条链路上有四个关键对象:输入数据(原始测序文件、参考基因组、注释文件、结构文件)、计算过程(脚本、参数、软件版本、运行环境)、输出结果(表格、图、模型、中间文件)以及记录与追踪机制(日志、版本控制、元数据、容器镜像)。复现危机之所以普遍,往往不是因为科学家不严谨,而是因为这条链路上存在大量“隐性状态”:软件默认参数、随机种子、线程数、浮点运算顺序、参考基因组版本、甚至文件读取顺序,都可能改变最终结果。
要理解复现危机的根源,可以把一次典型的计算生物分析拆成信号链来看。下图展示了一个 RNA-seq 差异表达分析从原始数据到最终结论的追踪链路,以及每个环节最容易丢失的信息。
这张图想说明一个关键判断:复现危机很少由单一错误造成,而是链路上多个“未记录状态”叠加的结果。比如,你用了 HISAT2 2.2.1 比对,但没记录;你用了 DESeq2 的默认参数,但没写;你设置了 set.seed(42),但只在一个脚本里设了,另一个脚本忘了。单独看每个问题都不致命,但叠加起来,别人复现时就会得到“差不多但不一样”的结果,而这种“差不多”往往足以改变生物学结论。
因此,本课程的学习路径不是逐个工具教学,而是围绕“追踪与复现”建立一套工程习惯。具体来说,我们会依次掌握:如何用 Git 和 DVC 管理代码与数据、如何用 Conda 和容器固化运行环境、如何用 Snakemake 或 Nextflow 编排可重跑流程、如何记录参数、随机种子和中间结果、如何设计复现测试与差异排查。每一章都会落到可执行的操作上,而不是停留在概念层面。
README.md、envs/、scripts/、data/、results/ 五个目录,并强制自己每次运行前先 git commit。这个简单习惯能消除大部分“找不到上次怎么跑的”问题。
最后需要明确:复现不是额外负担,而是计算生物研究的质量基础设施。当你能稳定重建自己的结果时,你才真正拥有对结论的信心;当别人能按你的记录重建结果时,你的工作才具备可积累、可验证的科学价值。本课程接下来的 29 章,就是围绕这条链路,逐层建立可操作的追踪与复现能力。