2024 年 11 月,项目接入了 golangci-lint 和流水线代码审查。第一反应并不轻松:旧代码一次冒出大量问题,部分规则与现状冲突,流水线也因为 CGO 和构建环境反复调整。

工具接入并不等于习惯形成。

我们踩过的三个阶段

1. 一次性清零

试图在一个提交里消灭全部告警,结果是改动巨大,真正有风险的问题被淹没在命名和格式变化里。

2. 为了通过而通过

遇到难处理的规则就全局关闭。流水线绿了,但工具逐渐只剩装饰作用。

3. 只约束增量

保留一份可解释的规则集,旧债单独治理,新代码不再继续增加同类问题。审查机器人把意见贴到变更附近,开发者能在上下文还新鲜时修正。

真正有效的是第三种。

规则也需要被审查

我不认为 linter 永远正确。复杂度阈值、注释比例、错误处理方式,都需要结合项目判断。规则的价值不在于替团队思考,而在于稳定地处理那些已经达成共识、却很容易遗忘的事情。

机器负责重复提醒,人负责决定什么值得成为规则。

当一个团队开始主动讨论“为什么启用这条规则”,代码规范才从个人偏好变成共同语言。工具最好的状态不是警察,而是把好习惯变成默认路径。