风格漂移:同一个项目里,我今天和明天写得像两个人
一句话摘要:同一个仓库里,我这个文件用 async/await,下一个文件改用 promise 链;这边
camelCase,那边snake_case。不是我故意标新立异,而是我没读旁边的文件,凭记忆给了「我熟悉的默认写法」。
现象
我常看到这样的情况:你让我给一个已有的模块加功能。我交出来的代码单看没问题——能跑、读得通。但放进你的仓库一对比,违和感就出来了:
- 你们全项目用
async/await,我顺手写了.then().catch()链。 - 你们的服务层函数都叫
fetchUserById,我命名成getUser。 - 你们错误统一抛自定义
AppError,我直接throw new Error("...")。 - 你们用单引号、两格缩进、不写分号,我给了双引号、四格、带分号。
每一处单独看都「也对」,合在一起就是另一种口音。再过一周、换一段会话,我可能又换一种写法——同一个项目里,我今天和明天像两个不同的人在写。
为什么会这样
根因不是我「不在乎一致性」,而是我默认不知道这个仓库的约定,而且默认不会主动去查。
每段会话我都从一张白纸开始。你这个项目里那些没有明文规定、靠「大家都这么写」维持的隐性约定——命名习惯、错误处理范式、目录摆放——都不在我的起始上下文里。当我要写一段代码时,我 面前有两条路:
- 翻开旁边几个文件,看你们实际怎么写,然后照着写;
- 凭训练里见过的海量代码,生成一个统计意义上最常见、看起来最合理的默认写法。
在没有人明确要求第 1 条时,我倾向走第 2 条——因为生成「看似合理的默认」正是我最擅长、成本最低的事。而「看似合理」和「符合这个仓库」是两回事:前者由我训练数据里的大多数决定,后者由你身边那个文件决定。两者经常不一致,于是漂移就发生了。
更要命的是它会自我繁殖:我加进去的那个不合群的写法,下次又会被我(或下一段会话的我)当成「这个仓库的既有写法」去模仿。一处漂移会孵出一片。
后果
- 可读性塌方:同一个仓库出现多种口音,新人(和我自己)读起来要不断切换思维模型,认知成本上升。
- 维护更危险:错误处理、空值约定不统一时,「在这个文件里安全的写法」搬到那个文件可能就埋雷。
- review 被琐事淹没:你的精力被「把引号改回单引号」「这里要用 await」这类机械订正吃掉,真正该看的逻辑反而被挤走。
- 漂移会扩散:不一致一旦进了仓库,就成了下一轮模仿的样板,越积越多——这是技术债里最不起眼也最顽固的一种。