跳转至

简介

SpexCode 把代码应当做什么的记录,保存在代码旁边,并检查两者是否已经脱节。

这份记录是一棵由 spec 节点 组成的树。一个节点就是一个包含 spec.md 的目录:其中有一段简短的意图陈述,以及它所治理的源文件列表。因为一个决策与实现它的代码之间的关联被明确写下来了,所以它是可以被检查的——而不是留在维护者的记忆里,或某份没人持续更新的设计文档里。

它要解决的问题是常见的 drift(漂移)。代码被改动了,而当初支撑它的理由却没有跟着改,久而久之,谁也无法确定某个文件是否还在做它原本该做的事。spex lint 读取 spec 到代码的图谱,并报告它在哪里已经脱节:一个节点指向了不再存在的文件、一个被治理的文件比它的 spec 改动得更晚——这是 spec 可能已经过时的信号、或者一个源文件没有被任何节点认领。覆盖度由此变成一件可以度量的事,而不是想当然。

这一切背后并没有一个单独的数据库。一个节点的版本就是它的内容提交数量;它的历史与作者信息在展示时从 git 读回。spec 正文描述的是节点当前的意图,并且是就地重写的——而不是当作变更日志来累积——节点的状态也是从 git 推导出来,而非手工填写,因此页面不会声称某件事已经完成、而它其实并没有。

在实践中,使用 SpexCode 意味着在改动被治理代码的同时改动它的 spec,并让 spex lint 在本地和 CI 中把整个图谱维系在一起。spex 命令行和仪表盘会渲染出这棵树、它的各个版本,以及任何代码已经跑到 spec 前面的地方。

接下来的页面将介绍核心概念、安装,以及如何在既有项目上采用 SpexCode。