3. 计算协同需求建模

在生物实验数据与计算协同平台中,最容易被低估的工程问题不是算力,也不是存储,而是三类角色之间的任务依赖没有被显式建模。实验人员掌握样本与湿实验上下文,计算人员负责流程实现与资源调度,数据科学家负责统计建模与结果解释。三者若只靠口头沟通和共享文件夹协作,就会出现“样本元数据缺失导致流程中断”“分析参数与实验设计不匹配”“结果无法回溯到原始孔位”等典型问题。本节的目标是把协作流程、角色边界和任务依赖转化为可建模、可校验的结构。

一、角色划分:不是按人分,而是按“责任域”分

协同需求建模的第一步,是明确每个角色对哪些数据对象和决策点负责。建议用“责任域”而非“岗位”来划分,因为同一人可能在不同任务中承担不同角色。

角色核心责任域关键输入关键输出典型决策点
实验人员样本、试剂、孔位、批次、表型实验设计表、仪器原始文件带元数据的原始数据、质控备注样本是否合格、批次是否可合并
计算人员流程、参数、资源、版本、可复现性原始数据、流程配置、参考基因组标准化中间结果、运行日志、QC报告流程版本、阈值、是否重跑
数据科学家统计模型、特征、结果解释、可视化中间结果、分组变量、协变量差异结果、模型参数、图表模型选择、多重检验校正、异常剔除

责任域划分后,需要为每个责任域定义最小可交付对象。例如实验人员交付的不是“原始数据文件夹”,而是“带 sample_id、batch_id、group、timepoint 四列的样本清单 + 仪器原始文件 + 质控备注”。计算人员交付的不是“跑完了”,而是“流程版本号 + 参数快照 + 中间矩阵 + QC 指标表”。数据科学家交付的不是“图”,而是“模型公式 + 分组变量来源 + 校正方法 + 可复现脚本”。

二、协作流程:以“数据契约”为交接点

三类角色的协作不应建模为线性流水线,而应建模为以数据契约为交接点的有向依赖图。数据契约是上下游之间约定的字段、格式、取值域和校验规则。例如实验人员与计算人员之间的契约可以定义为:

sample_manifest.tsv 必填字段:
sample_id    string  唯一,形如 S001
batch_id     string  形如 B01
group        enum    control | treat_low | treat_high
timepoint    int     单位 h,取值 0/6/24
raw_path     string  相对路径,指向 fastq 或 csv
qc_flag      enum    pass | warn | fail

计算人员在流程入口处先执行契约校验:字段是否齐全、枚举值是否越界、raw_path 是否存在、sample_id 是否重复。校验失败则任务状态置为 blocked,并生成缺失字段清单回传实验人员。这一步把“口头催数据”变成了可追踪的任务依赖。

数据契约应版本化。当实验设计从 3 组变为 4 组时,契约版本从 v1.2 升到 v1.3,计算流程与数据科学脚本都需声明所依赖的契约版本,避免“旧脚本读新数据”导致分组错位。

三、任务依赖关系:用状态机表达“谁在等谁”

任务依赖的核心不是“先后顺序”,而是状态与阻塞条件。建议为每个任务定义五种状态:draft、ready、running、blocked、done。依赖关系体现为:下游任务只有在所有上游任务 done 且契约校验通过后才能进入 ready;任一上游 blocked,下游自动 blocked 并标注阻塞源。

下面这张图展示了三类角色围绕一次“处理组 vs 对照组差异分析”的协作依赖。图中实线箭头表示数据或交付物流向,虚线箭头表示校验或反馈回路,颜色区分角色责任域。

实验人员 计算人员 数据科学家 设计实验与分组 group / timepoint / 重复数 产出样本清单与原始数据 sample_manifest.tsv + raw 填写质控备注 qc_flag / 异常孔位说明 补充缺失字段 响应 blocked 反馈 契约校验 字段/枚举/路径/重复检查 运行标准化流程 版本号 + 参数快照 输出中间结果与QC 表达矩阵 + QC指标表 重跑或调整阈值 依据QC与模型反馈 确认分组与协变量 读取契约版本与元数据 统计建模与差异分析 模型公式 + 多重检验校正 结果解释与可视化 差异表 + 火山图 + 通路 提出数据需求 如缺失协变量或批次信息 manifest+raw 中间结果+QC 缺失清单 重跑请求 协变量/批次信息补充请求 状态:draft → ready → done 状态:ready → running → done 状态:ready → running → done

四、依赖建模的落地方式

把上述关系落到平台中,通常需要三张表:role(角色与责任域)、task(任务与状态)、dependency(任务间依赖与契约版本)。依赖表的关键字段包括 upstream_task_id、downstream_task_id、contract_version、blocking_condition。当实验人员更新样本清单时,系统根据 contract_version 判断哪些下游任务需要重新校验;当计算人员调整流程参数时,数据科学家的建模任务被标记为 stale,提示需要重新确认分组变量。

常见误区:把“任务依赖”简单实现为“文件夹监听”。文件夹出现新文件就触发下游,会导致半成品文件被误读、契约版本不匹配、重复触发。正确做法是依赖“任务状态 + 契约校验通过”双条件。

五、一个可执行的协作检查清单

在每次分析启动前,三类角色可按以下清单对齐,避免返工:

  • 实验人员:样本清单字段是否齐全?group 与 timepoint 是否与实验设计表一致?qc_flag 是否已标注异常孔位?
  • 计算人员:流程版本与契约版本是否匹配?参数快照是否已记录?QC 指标是否在预设阈值内?
  • 数据科学家:分组变量来源是否明确?协变量是否完整?多重检验校正方法是否与实验设计匹配?
  • 三方共同:本次分析对应的 contract_version 是否一致?阻塞任务是否有明确责任人和预计解决时间?

当这些依赖被显式建模后,协作就从“人找人”变成“状态驱动”。实验人员知道缺什么字段会阻塞哪一步,计算人员知道哪些参数变化会触发下游重算,数据科学家知道结果能否追溯到具体样本与批次。这正是计算协同需求建模要解决的核心问题:让角色边界清晰、让依赖可追踪、让每一次交接都有契约可依。