事情是这样的。
前两天刷 Hacker News,看到一篇帖子被顶到 162 个赞。标题很扎眼。
「Does Code Cleanliness Affect Coding Agents?」
我点进去看了。坦率的讲,这个问题的潜台词我太熟了。
过去一年半,AI 编程工具从玩具变成生产力,Claude Code、Codex、Cursor 这些玩意已经成了很多程序员的第二大脑。然后一个特别自然的问题就浮出来了。
既然 AI 能帮我读代码、改代码、甚至直接替我写代码,那我还有必要把代码写那么干净吗?
我见过不少人在 X 上聊这个话题。有人说代码整洁是旧时代的规矩,AI 不在乎。有人说 AI 反正都能读懂,写得乱一点也没事。还有人说得更直白,这就像有了计算器就不用练心算,有了自动驾驶就不用学倒库。
听着好像挺有道理。
但我总觉得哪里不对。
正好,这篇论文给了答案。
论文是 SonarSource 的研究团队发的,发在 ArXiv 上,编号 2605.20049。实验设计很漂亮,叫 minimal-pair 研究。简单说就是,他们造了六对代码仓库,每对仓库在架构、依赖、外部行为上完全一样,唯一的区别就是整洁度。 |
|---|
一对代码,一个干净,一个脏。
干净的那个函数小、命名清晰、没有死代码。脏的那个函数动辄几百行、嵌套四五层、一堆注释掉的代码块、重复逻辑散落各处。
然后他们让 Claude Code 在这十二个仓库里跑了 33 个任务,每个任务重复 10 遍。
660次实验 |
|---|
结果很有意思。
先说你们最关心的。
整洁代码不影响任务完成率。
是的。不管是干净的还是脏的,AI 都能把活干完。通过率只差了不到 1 个百分点,在统计上基本没区别。也就是说,你代码写得再乱,AI 确实还是能看懂,还是能把 bug 修了,还是能把功能加上。
那些说「AI 不在乎代码质量」的人,在「能不能干完」这个维度上,他们是对的。
但如果只看这一层,就太可惜了。
因为第二个发现才是真正扎心的。
在干净代码上跑任务,AI 消耗的 Token 少了 7% 到 8%。
-7.1%输入 Token | -8.5%输出 Token | -7%对话轮次 |
|---|
这些是什么?这些全是钱。说真的,不是开玩笑。
你用 Claude Code 是按 Token 付费的。用 Codex 也是。用 Cursor 说到底也是模型在背后烧 Token。每次 AI 多读一段代码、多绕一圈、多确认一遍,账单上就多一笔。
还有一个更炸的数据。
-34%文件重访次数 |
|---|
你知道文件重访是什么意思吗?就是 AI 打开一个文件,编辑完,走了,过了一会儿又回来,再看一遍,再确认一下。
你想象一下这个画面。一个智能体在脏代码里干活,它打开一个 300 行的函数,读了一半觉得不对,跳去另一个文件,再跳回来,再读一遍。它在迷宫里反复走回头路,消耗的不是体力,是 Token,是钱。
而在干净代码里,它打开文件,改完,走人。干净利落。
这就是 34% 的差距。
···
多模块任务:差距的真正重头戏
论文还做了一件特别漂亮的事,他们把任务分成了两类。
一类叫认知热点任务,就是那种修改集中在单一模块、单一函数内部的。这种任务在脏代码里确实更费劲,但差距没那么大。
另一类叫多模块任务,就是那种需要跨好几个文件、好几个模块协调修改的。
这类任务的差距才是真正的重头戏。
-10.7%Token 消耗 | -50.8%文件重访次数 |
|---|
这个数字太大了。太离谱了。
你想想,现实中程序员改一个功能,有多少是只改一个文件的?至少在我的经验里,大部分需要改好几个文件,要理解好几个模块之间的关系。
···
论文里有一个特别具体的例子我印象很深。他们在 commons-bcel 这个开源项目上做了一个任务,要给字节码反汇编的输出里加上栈效应注解。在干净的版本里,原来一个几百行的 switch 语句被拆分成了十几个命名清晰的小函数,AI 用 grep 一搜就能精准定位。Token 消耗减少了 35%。 |
|---|
这就像你在一个收拾得很整齐的房间里找东西,和在一个堆满杂物的房间里找东西。
都能找到。但一个花三分钟,一个花半小时。
···
传统软件工程的可维护性原则——小函数、清晰命名、低认知复杂度——在 AI 驱动的开发时代不仅没有过时,反而直接影响了开发成本。 |
|---|
我特别想聊一下这句话。
过去我们说要写干净的代码,主要理由是对人好。你同事要维护你的代码,你要维护三个月前的自己的代码,代码干净一点,大家都好过。这是一个关于协作和同理心的道理。
现在不一样了。
现在多了一个更硬的逻辑。
代码不干净,你每次让 AI 帮你干活,都在多花钱。
不是一次两次,是每次。
你写一个 500 行的函数,AI 读一次多烧几百 Token,读十次就是几千。你同事让 AI 改这个函数,AI 又得多读几遍。你三个月后回来,让 AI 重构,AI 又得在那个迷宫里再走一遍。
···
被忽略的杀手:方差
论文里提到了一个非常关键的视角,但他们没有展开。
同一任务在同一个代码库上跑 10 次,最贵的那次和便宜的那次,Token 消耗能差 2.5 倍。在某些极端案例里,从 140 万 Token 飙到 1060 万 Token。
场景 | 最低消耗 | 最高消耗 | 倍率 |
|---|---|---|---|
常规波动 | — | — | 2.5× |
极端案例 | 140万 Token | 1060万 Token | 7.6× |
那这代表了什么呢?
脏代码不只是让你多花 7% 的钱。它让你踩到天价账单的概率大大增加了。因为你不知道 AI 这次会不会在那个 500 行的函数里迷路。它可能这次运气好,十分钟就定位到了。下次运气差,绕了半小时。
清洁代码的一个隐性收益,就是压缩了这个方差。让 AI 的表现更稳定、更可预测。
我觉得这个视角特别重要,因为它是从概率和风险管理的角度在看代码整洁,而不是从审美和规范的角度。
我是真的觉得,这个论文最厉害的地方不在于它证明了什么新东西,而是它把一个我们隐约感觉到但说不清楚的事,变成了可量化的数据。
代码整洁,过去是美德,现在是预算。 |
|---|
···
AI 不是混乱的救世主,是秩序的放大器
说到这,我想聊一点跟数据无关的事。
我有时候觉得,AI 时代的到来,让很多人产生了一种错觉,就是「既然 AI 能帮我处理混乱,那我就可以心安理得地制造混乱」。
你想想看,是不是这样?
邮件有 AI 帮你写,你就懒得把话说清楚。代码有 AI 帮你读,你就懒得把结构理清楚。文档有 AI 帮你生成,你就懒得把逻辑想清楚。
但论文的数据告诉我们一个反直觉的事。
AI 不是混乱的救世主,AI 是秩序的放大器。
你把代码写干净,AI 效率提高 7%、34%、50%。你把代码写乱,AI 效率就降回去,而且方差变大,不可预测。AI 不会替你抹平质量的差距,它会原样反映,甚至放大。
就像水流过一块平整的石头和一块凹凸不平的石头,速度是不一样的。石头是你写的,水是 AI。你不能指望水流过去的时候自动把石头磨平,你只能在一开始就把石头铺好。 |
|---|
···
算一笔账
假设你一个项目每月通过 AI 编程工具消耗 1000 美元的 Token。如果你的代码是干净的,你省了 7%。一年省 840 美元。一个五人团队,一年省 4200 美元。
这还不是最关键的。
最关键的还是那个 34% 的文件重访减少。
文件重访不只是一个 Token 消耗的问题,它是一个认知负荷的问题。每次 AI 回头重读一个文件,它在「确认」上花的每一秒,都是你没有得到即时反馈的等待时间。你等 AI 改代码,AI 在等自己确认,你等得越久,心流断得越彻底。
代码整洁省下来的,不只是 Token 钱,还有你的注意力和心流。
这是最贵的东西。
···
更深一层:代码整洁是为了不被「平均化」
写到这里,我突然想起前段时间在 HN 上看到的另一个帖子,也在热榜上。不知道怎么的,这两个帖子就在我脑子里连上了。
标题叫「Regression to the Mean」,讲的是 LLM 说到底就是一台均值回归机器。它不会创造真正的新东西,它只会返回最可能、最典型、最平均的答案。
We were handed a machine that could think alongside us, and told it would set off an explosion of new ideas. It may do the opposite. |
|---|
我们拿到了一台能跟我们一起思考的机器,被告知它会引爆一场新思想的爆发。但它可能正好相反——它可能正在温和地消灭新思想。
因为它永远把你往平均的方向拉。你给它一个创新的想法,它纠正你,说「你是不是想说那个更常见的」。你给它一个不标准的命名,它纠正你,说「大多数来源认为是这样的」。
你想想看,如果你写的代码也是脏的,乱糟糟的,那 AI 在理解你的代码的时候,它在干什么?
它在把那些混乱的、非标准的、你可能想表达但表达得不够好的意图,往平均的方向修正。它猜你可能想表达的是最常见的那种模式,而不是你真正想写的那种创新的、独特的结构。
你的代码越脏,AI 就越需要「猜」你的意图。而它猜的方式,就是回归均值。
代码整洁的意义,在这个维度上又深了一层。
不只是让 AI 少花 Token,不只是让你少等几秒。
是让你想表达的东西,更准确地被 AI 理解,而不是在理解的过程中被「平均化」了。
···
代码整洁,从来不是为了取悦机器。从来都是为了表达你自己。 |
|---|
你把函数拆小,是因为你想让别人、让三个月后的自己、让 AI 一眼就看出你的意图。你把变量命名清晰,是因为你想让读你代码的人知道「这玩意是干啥的」,而不是「我猜大概是那个意思吧」。
你写的代码是你思想的投影。
投影清晰一点,AI 才能接得住你的想法。投影模糊了,AI 就只能接住一个平均值。
写这篇文章的过程中,我自己也在想,我是不是该去把公司那几个老项目重构一下了。
那些为了赶工期写得特别糙的代码,那些「先这样后面再改」的注释,那些五百行的函数。不是哥们,光想想就觉得头疼。
以前我想的是,等有空了再说。真的就是那种「先欠着,以后还」的心态。
现在我想的是,每次 AI 在那五百行里迷路,烧的都是我的 Token 钱。说实话,每次看到账单我都肉疼。
这个理由,比任何代码规范都管用。
···
所以,如果你问我 AI 时代还要不要写干净代码。
我的答案是,比任何时候都更需要。
只不过理由变了。
以前是为了同事,为了六个月后的自己。
现在是为了每一次你按下回车,让 AI 干活的那几秒钟。为了你的 Token 账单。为了你的心流。为了你的意图不被平均化。