GxP 统计计算环境 · Jaime Yan · English

第三部分 — 信任层的九项原则

原则三 — 每个工件都有地址

在一条可审计的流水线中,原子单位不是文件,而是工件: 工作所产生的任何不可变产物——数据集、图形、表格、报告、 日志、清单。这条原则陈述起来很简单:每个工件都有身份、有 谱系、有归宿。

身份意味着内容寻址。工件的名称派生自其内容的哈希,就像 指纹派生自一个人。相同的内容,相同的地址,在任何地方, 永远如此。不同的内容,不同的地址——自动如此,不需要任何 委员会来命名。

谱系意味着每个工件记录自己的父辈:输入数据快照、规格 版本、代码版本、运行环境、它所消费的父工件。这些边的集合 构成一张有向图——流水线的真实历史,由流水线自己书写。

归宿意味着工件存放在一个可寻址且持久的存储中,因此 "第 42 次运行的输出"不是某个人维护的文件夹,而是系统可以 回答的一次查询。

寻址带来了什么

从这一条原则中自然涌现的性质,与其成本完全不成比例。

完整性是结构性的。 两个声称同一地址的工件必须逐字节 相同;若不相同,其中之一必在撒谎,而哈希无需争辩便指出 这一点。损坏、截断、静默的部分写入——共享磁盘上的瘟疫—— 从依赖抽查才能发现,变成在构造上即可检测。

去重是免费的。 输入不变的重渲染产生不变的地址,这意味 着系统能认出"这个结果我们已经算过了",而不是重新计算。 缓存正确性——在分布式系统中通常是个难题——在这里变成了 同义反复。

溯源是一次遍历。 "这个数字是从哪里来的?"是沿谱系图 向上的一次行走;"这份快照影响了什么?"是向下的一次行走。 影响分析——每次数据更正的噩梦——变成了一次有确定答案的 查询。

重放是机械性的。 因为图谱精确记录了哪些父辈产生了哪个 子代,复现就不再是根据文档进行的重建,而是沿已记录的边 重新执行。这正是信任层的重放职责所立足的地基。

它施加的纪律

内容寻址有一种人类常常觉得不舒服的诚实。它无法被谈判。 一个工件要么是它声称的东西,要么不是,不存在"差不多就行" 的版本。因此,采用它的团队必须无例外地接受两条规则:

一个有用心智模型:工件图谱就是流水线的复式记账。每一笔 借项(被消费的父辈)和贷项(被创建的子代),都在发生的 那一刻,由行为者自己记录。账簿自己就能轧平,事后无法 作假——而且,与审计师的账簿不同,它们从不是凭记忆补写的。

检验。 任选你最新报告中的一张图,问:"有没有一个 我可以引用的字符串,能精确命名这个工件的内容?系统能否 从它出发,走到产生它的每一个输入?" 如果你能拿到的最好 标识符是一个带日期的文件名,那你的流水线没有记忆。它只有 纪念品。