第三部分 — 信任层的九项原则
原则一 — 规格入,证据出
受监管临床工作中最深层的一项习惯,是意图先于行动,并且留下 记录。方案在分析执行之前就写明分析要做什么。空壳表在表格 存在之前就写明表格要长什么样。统计分析计划在第一个模型拟合 之前就已签署。监管机构这样要求,并非因为他们偏爱文件,而是 因为一个事先规定好的结果,不可能悄悄变成数据让它变成的任何 样子。
现代软件实践独立地重新发现了同一个思想:规格驱动开发、基础 设施即代码、"一切皆代码"。对临床报告而言,两者的综合是一条 带有严格语法的流水线:规格入,证据出。一份机器可读的 规格进入系统。出来的不只是交付物——数据集、表格、图形、 报告——而是焊接着证据的交付物:它所满足的规格的哈希、 它所消费的数据的谱系、对它进行核验的比对、以及让整个包裹 可以重放的清单。
规格是一等公民工件
要像对待输出一样严肃地对待规格。具体地说,这意味着规格是 版本化的、按哈希寻址的、与结果存放在一起的——不是发在邮件 里,不是嵌在带修订标记的 Word 文件里,也不是只活在工单系统 里。一份无法凭身份被引用的规格,只是关于意图的传言。
实际收益微妙却巨大:可追溯性变成一次查询,而不是一项研究。 当审计员问"这次分析人群的变更影响了哪些输出?"时,答案是对 图谱的一次查询——谱系中包含这份变更规格的每一个工件——而 不是花一周时间通读程序头。
对设计的影响
规格先行施加了一些自律要求,而这些要求物有所值:
- 先有壳,再谈义。 一张表壳——版式、列、表头、脚注,但没 有数字——是一份两个利益相关方可以低成本争论的规格,而且 争论发生在一个分析工时都没花掉之前。临床报告中最昂贵的 缺陷,是一张计算完全正确却没有人想要的表。
- 改参数,不改代码。 研究发生变化时,变的是规格,系统随之 重新执行。程序员为了响应数据变化而改代码,正是漂移的开端; 而漂移,正是规格不再描述现实的方式。
- 歧义必须响亮地失败。 如果规格不能完全确定输出,正确的 行为是把问题路由给人,绝不静默地采用默认值——绝不允许 系统自行猜测。一个会猜的系统,已经把歧义转化成了一项未被 记录的决策——而这正是整套机制存在所要防的那种错误。
实际感受如何
采用"规格入/证据出"的团队报告说,他们经历了一次相变。起初, 写规格感觉像官僚主义——我直接做表就行了,为什么要先描述它? 然后第一次重新执行发生了:一个新的数据切点到达,一条命令 重渲染四十份输出,每一项比对自动运行,过去要开一周的会 现在一小时就开完了。从那一刻起,规格不再是开销。规格就是 产品;输出只是印出来的副本。
检验。 任选一份已交付的输出,问:"是哪一份确切的规格、 在哪个版本,产生了这份输出——那份规格此刻在哪里?" 如果 回答这个问题需要超过一次查询,说明意图与行动已经漂移开来, 而这种漂移已经在复利式地累积。