这一栏是公开的工程笔记本。它不是发版通告博客,也不是打磨过的专栏。它是工作里某个取舍还烫手时记下来的地方——好让后来的读者(包括我自己)能看见当时主张了什么,以及什么会证伪它。
先放最影响判断的证据,再让它的边界也容易找到。这篇更早:当初只是说「会有这么一栏」。那已经不够。下面是这本笔记本实际在执行的编辑契约。
为什么要公开写
还在成形的想法,先留在私人笔记里就够。公开笔记要应付另一种读者:没看着你干活、冷着脸进来的人。
所以它不是「今天学到了什么」的心情记录,而是一小段可核对的论证:一个关于软件的判断,能拿去对照代码、发版决定、门禁或测量。讲常量时间说法的那篇其实是反过来的范本:难点不在解释常量时间是什么,而在把对这段代码的可信度交出去。笔记本写的就是这类判断——可以更短,标准一样。
什么值得写成一篇
至少凑齐三样:
- 一个有用的判断——读者能同意或反对,不是情绪。
- 一个具体的工程决定——门禁阈值、跳过的版本号、trait 边界、披露怎么写。
- 外人跟得上的证据——仓库路径、公开标签(tag)、测量出处、链到案例页。
站上已经有的例子:
- 一条常量时间说法怎么把可信度交出去——常量时间的说法,是信任问题,不是理解问题。
- 为什么没改任何输出字节的一轮工作不配单独版本号——什么都没变的版本,就不发,并挂到 gm-crypto-rs 版本线。
- 常量时间 CI 门禁怎么接线、每个 PR 要付什么代价——在 CI 里拦住常量时间回归。
- 共用代码还不构成单独拆包的理由——「共用代码」和「共用一个包」,是两个决定。
- 何时把
unsafe挡在默认构建之外——把 unsafe 挡在默认构建之外。
三样还没齐,就先别公开,等齐了再写。
什么不该出现
- 只有状态的更新——「发了 X」「还在做 Y」,没有决定,也没有证据。
- 放之四海的教训——不点名任何约束、换个项目也能贴的句子。
- 已有归宿的发版说明——版本表和 crate 历史在项目页;只有跳过发版或门禁背后的规则需要单独论证时,才进笔记本。
- 再解释「为什么有笔记本」——这一篇之后,栏目本身不必反复自我介绍;第一次来的人看笔记索引的导语即可。
一个落地的例子
gm-crypto-rs 在 crates.io 上跳过若干版本号,很容易被读成「发版偷懒」。真正的规矩更窄:若这一轮没改任何运行时输出字节,只加固测试、工具或流程,就合进主干、不单独发版。这条规矩写在案例页的「证据」里,也在发版笔记里展开成论证——包括读者能在 crates.io 上核对的缺口。笔记本要填的是中间那一层:不是单张版本表,也不是空泛的「发版纪律」散文,而是判断 + 规则 + 能去核对的地方。
对读者的承诺
笔记可以是暂定的。数字会过时,门禁会改,私有快照可能变成公开标签(tag)。不该暂定的是框架是否诚实:若那是检测事件而不是证明,就写清楚;若源码未公开,就不假装访客打得开;若某版跳过了,就不把「未发布」写成好像还在排队即将上线。
趁还觉得烦的时候写下来——那时候细节最清楚;以后再冷静改稿,也仍能让判断保持可查。