4. 用户需求规格(URS)

说到用户需求规格,很多人第一反应是「写一堆文档给甲方看」。其实不完全是。URS 是整个验证流程的起点,也是你后续所有测试、验证、变更管理的基础。我个人习惯,在项目启动前就搭好 URS 框架,哪怕细节后面再填。

什么是 URS?说白了就是一份正式文档,用来定义「你希望生信流程能干什么、不能干什么、在什么环境下跑、跑成什么样算合格」。受监管环境下,URS 不是可选项,它是监管核查时翻出来的第一份材料。

核心原则:用户需求必须 可测试、可验证、可追溯。写出一堆「系统应高效处理数据」这种空话,核查员一眼就能看出来。

4.1 URS 的定位与结构

URS 不是技术设计文档,也不是操作手册。它回答的是「为什么做」和「做到什么程度」,而不是「具体怎么实现」。你想想看,如果需求写得太细,反而限制了后续的设计空间。

我自己的 URS 模板一般长这样:

  • 文档控制信息:编号、版本、作者、审批人、生效日期
  • 项目背景与范围:这个流程用来解决什么问题
  • 功能需求:输入、处理、输出、参数、异常处理
  • 非功能需求:性能、安全、可用性、兼容性、数据完整性
  • 监管合规需求:GDP、GLP、GCP、21 CFR Part 11 等
  • 环境与接口需求:OS、硬件、依赖软件、上下游系统
  • 可测性声明:每一条需求如何验证

我在项目中遇到过好几次,URS 写得像个研发方案,满篇都是「用 Python 3.9、调用 BWA、输出 BAM 文件」。这是误解。URS 应该写「给定 FASTQ 输入,流程应准确比对到参考基因组,输出比对结果文件」,具体用什么工具,那是设计规格的事。

一个小技巧:写 URS 时,每条需求前面加个唯一标识符,比如 URS-FUNC-001、URS-NFUNC-005。后面写测试用例时直接引用这个编号,可追溯性一下就上来了。

4.2 功能需求怎么写

功能需求是 URS 里最见真功夫的部分。生信流程说白了就是一条数据流水线:输入数据 → 处理 → 输出结果。每一条功能需求都应该能映射到流水线上的某个环节。

举个例子,一个变异检测流程的 URS 功能需求可能长这样:

URS-FUNC-001:流程应支持双末端 FASTQ 格式输入。
URS-FUNC-002:流程应提供参考基因组索引配置接口。
URS-FUNC-003:流程应执行序列比对,输出 SAM/BAM 文件。
URS-FUNC-004:流程应完成碱基质量分数重校准(BQSR)。
URS-FUNC-005:流程应输出 VCF 格式的变异列表。
URS-FUNC-006:流程应支持用户指定的最小测序深度过滤参数。

如果你觉得这些太基本,那我加一条避坑经验:千万别忘了写异常处理需求。我曾经遇到一个流程,输入文件格式不规范就悄悄跳过不报错,导致下游分析全用了错误数据。那以后我每条 URS 都会加这两条:

URS-FUNC-007:流程在输入数据格式不正确时应终止运行并输出明确错误信息。
URS-FUNC-008:流程应在关键步骤失败时保留中间结果,以便调试。

注意:不要写「系统应自动处理常见错误」。什么叫常见?什么叫自动?这些词无法测试。改成「流程在 BWA 比对返回非零退出码时应以非零状态退出,并将错误日志写入指定目录」。

4.3 非功能需求,被低估的成本

说实话,很多生信项目翻车都翻在非功能需求上。性能不够、内存溢出、磁盘写满、同一份数据不同批次跑出不同结果。这些在 URS 阶段不写清,后面全是坑。

我建议非功能需求至少覆盖以下几个方面:

类别 示例需求 验证方法示例
性能 处理 50× WGS 样本应在 48 小时内完成 基准测试 + 时间戳日志
可重复性 同一输入数据三次运行应输出完全一致的 VCF MD5 校验或 diff 比较
数据完整性 传输过程中无数据损坏 校验和验证(md5sum)
并发 支持同时运行最多 10 个独立分析任务 压力测试 + 资源监控
审计追踪 所有参数变更和执行日志应被记录 审查日志文件完整性

我遇到过最典型的一个案例:团队花半年搭了一个肿瘤变异检测流程,URS 里性能需求写的「合理时间内完成」。结果验证时才发现,一个样本要跑 72 小时,根本赶不上临床报告周期。最后改需求、换工具、重验证,又拖了三个月。你想想看,如果当初 URS 里写清楚「48 小时内完成」,这些事在选工具阶段就能发现。

# 非功能需求示例:性能指标
URS-NFUNC-001:对于常规 WES(100×,FASTQ 共 20 GB),
               流程从原始数据到 VCF 输出的总运行时间不超过 24 小时。
URS-NFUNC-002:流程最大内存占用不超过 64 GB。
URS-NFUNC-003:临时存储需求不超过 500 GB,超过应提示用户。

4.4 监管合规需求的落地

受监管环境下,URS 里必须明确引用适用的法规条款。我这里列几个最常见的场景:

  • 21 CFR Part 11:如果你要管理电子记录和电子签名,URS 里就要写清楚哪些步骤需要签名、哪些日志不可更改。
  • GxP 数据完整性:ALCOA+ 原则,需求里要体现归属性、可读性、同步性、原始性、准确性。
  • GDPR 或本地隐私法规:如果流程涉及患者数据,需要写匿名化、访问控制、数据保留期等需求。

写合规需求时,不要直接把法规条文复制粘贴。而是翻译成具体的系统行为。

URS-COMP-001:流程运行完成后应生成不可篡改的审计日志,
              日志内容包含启动时间、输入文件哈希、每一步的执行命令及退出状态。
URS-COMP-002:所有用户操作(启动、停止、修改参数)应记录
              操作者身份、操作时间、操作内容。
URS-COMP-003:VCF 结果文件应包含创建者的用户 ID 和时间戳元数据。

经验之谈:URS 写完之后,我一般会让 QA 和验证工程师先走读一遍。他们最擅长发现「这条需求没法测」。早点改,比验证阶段返工划算得多。

4.5 可测性——URS 的生命线

一条好的 URS 需求,标准很简单:一个测试人员看了,知道怎么设计测试用例来验证它。如果做不到,那就是需求写得太模糊。

我有个习惯,写完每条需求,心里默默过一遍「我怎么证明它是对的?」。比如:

  • URS:「流程应正确识别变异。」 → 怎么定义「正确」?没法测。
  • URS:「流程在 NA12878 基准样本上,SNP F1-score ≥ 0.99。」 → 能测,用已知突变的参考数据集。

这里强烈推荐在 URS 里单独开辟一节,叫「可测性声明」,把每一条需求的验证策略写出来。不用太详细,一句话就行。

URS-FUNC-005:流程应输出 VCF 格式的变异列表。
  → 验证方式:输入已知结果的参考样本,比对输出 VCF 的变异位点是否与预期一致。

4.6 URS 的版本管理与变更

URS 不是写一次就封存的。项目过程中需求会变,URS 就必须跟着变。但受监管环境下,改 URS 要走正式变更流程。

我建议在 URS 里设一个变更记录表:

版本 日期 变更内容 原因 变更人 审批人
1.0 2024-01-15 初始版本 项目启动 张三 李四
1.1 2024-02-10 URS-NFUNC-001 运行时间从 48h 改为 24h 临床报告周期需求变更 张三 李四
1.2 2024-03-01 新增 URS-COMP-004 关于数据匿名化 合规审计发现 王五 李四

每一版变更,都要重新走审批流程。这听起来繁琐,但审计时这是你证明「系统在受控状态下演进」的硬证据。

4.7 URS 的文档结构图

下面这张图展示了 URS 文档的核心组成和它们之间的关系。先定范围,再拆功能与非功能,再加合规约束,最后用可测性兜底。每一步都有输入输出,缺一不可。

URS 文档结构图 URS 文档核心结构 项目背景与范围 功能需求 (FUNC) 非功能需求 (NFUNC) 监管合规需求 (COMP) 可测性声明 文档控制与版本管理 核心原则:每一条需求都要能追溯到测试用例, 每一版变更都要有审批记录,每一份文档都要受控。

4.8 常见避坑清单

最后,我把这些年踩过的坑浓缩成一张清单。写 URS 前过一遍,能省很多返工成本。

  • 需求太多太细:把设计与需求混在一起。记住,URS 管「做什么」,设计文档管「怎么做」。
  • 忽视边界条件:流程遇到空文件、非法字符、网络中断怎么办?这些必须写进 URS。
  • 用「最好」「尽量」这类词:核查员直接打回。「应」「必须」「支持」才是 URS 该用的动词。
  • 忽略输入输出规格:只说「支持 FASTQ」,不写「文件名后缀是什么、质量分格式是什么」,后面联调时一定会扯皮。
  • 没写不可变需求:比如流程的参考基因组版本是固定的,不允许用户随意改。这种「锁死」的需求也要明确写出来。
  • 版本控制流于形式:URS 改了但变更记录不更新,或者审批人写了但实际没审批。审计时这属于发现项。

嗯,大概就是这些。URS 的质量直接决定了验证流程的质量,花多少时间在上面都不为过。我一般写完 URS 会让业务方、开发、QA 三方坐下来过一遍,有时就过出意想不到的问题。早发现,都是赚的。