代码能跑,只是故事的开始

LLM 写代码,已经快写到“满分”了。

隐藏测试一跑,绿点全亮,功能正确,仿佛万事大吉。但一位来自 Earendil 的研究者最近泼了盆冷水:代码能跑,和代码能看、能维护,完全是两码事。

AI配图

“vibe coding” 的人越来越多——对着 AI 说需求,看它哗哗出代码。问题是,每加一个功能,代码量可能爆炸式增长。几百万行代码按月堆进去,人类根本追不上。更糟的是,你指望 AI 自己收拾这堆烂摊子?抱歉,它自己也搞不定。

这就是今天的故事:我们怎么衡量代码的“油腻感”。

AI当裁判,基本等于掷骰子

行业里最常见的做法,是让 AI 给代码打分。

最偷懒的版本:让模型在 1 到 10 之间评个分。作者的评价很直接——这基本等同于随机数生成器。

高级一点,拿 A、B 两个方案让模型选。结果换个文件名、改个变量名,模型的偏好就可能跟着变。作者半开玩笑地说,大模型在这方面稍微稳点,但核心问题没变:让 LLM 评判自己写的代码,替代不了真正的评估。

“Asking LLMs to judge the code they write is not a substitute for a proper evaluation.”

Rubrics、模型自己写测试,这些方向有趣,但离真正去掉“油腻”还远。

人类当裁判,又慢到没边

那让人来评?

如果不考虑工程师水平参差不齐,人工判断确实是保证代码可读性的最佳方案。但代价也很真实:不可扩展。

你要训练 AI、要横向对比 GPT/Claude/Gemini,要跑大规模基准,不可能每次抓一群人逐行品鉴。评论区有人补充得更狠:真正要命的“技术债”往往不是局部代码丑,而是全局结构烂。人类和 AI 一样,注意力有限,局部问题可以顺手修,全局问题却能拖垮整个项目。

所以问题变成:有没有一种又快、又准、还不太主观的尺子?

最简单的指标,反而最扎眼

作者的实验里,有一个指标出奇地好用——代码行数(LOC)的净增量。

代码越写越臃肿,往往就是 sloppy 的信号。但作者也提醒:这指标有个讽刺的 bug——一旦你开始优化它,它立刻失效。

更靠谱的工具来自 SlopCodeBench 论文,它提出两个概念:

  • Verbosity(冗余度):衡量重复、啰嗦的代码有多少。
  • Erosion(侵蚀度):衡量代码质量是否集中在少数几个巨大复杂的函数里。

数据一摆出来,差距触目惊心:

指标 成熟仓库 AI 生成代码
Verbosity 0.15 ± 0.06 0.33 ± 0.10
Erosion 0.31 ± 0.17 0.68 ± 0.20

AI 代码的平均冗余度和侵蚀度,几乎是人类代码的两倍。 作者还检查了自己 vibe coding 的项目,冗余度最高到 0.4,侵蚀度高达 0.75。这不是偶然。

0%通过率的警告

SlopCodeBench 的测试方式也很“狠”。

别的基准通常一次性给完指令,再跑隐藏测试。它反过来:多轮指令、多轮测试,每次检查点之间清空模型上下文,模拟真实开发里的迭代过程。

结果呢?即使是最先进的模型,严格通过率也是 0%。

为什么?因为糟糕的代码决策会一轮一轮累积。你今天让 AI 加功能,它可能顺手复制一段、多包一层、再埋个坑;下一轮失忆的 AI 继续往上叠,直到代码变成一座摇摇欲坠的塔。

“Which should be a warning sign to everyone who happily adds tens of thousands or even hundreds of thousands of LOC a day.”

每天开开心心追加几万、几十万行代码的人,真的该警醒了。

评论区没有放过这个问题

Hacker News 上的讨论,把问题又撕深了一层。

有人说,成本才是真相:用 frontier model 无限制 token 时确实爽,一旦按 token 付费,“人力的性价比突然就回来了”。也有人指出,代码不只是跑在内存里的程序,它是团队共同心智模型的载体。如果人类被挤出编码过程,谁来持有这个模型?提示词天然是条“有损信道”。

还有人走了一条更务实的路:自己做“架构审查 Agent”,把圈复杂度、LCOM、代码 churn 这些老指标重新捡起来。甚至有人开源了 Valknut,想用信息论原则约束 Agent 的代码结构。

最一针见血的评论大概是:AI 实验室死磕“正确性”,只因为正确性最容易验证、最容易做 RLHF。 加一个几乎重复的函数不会导致测试失败,但会让项目慢慢窒息。

那么,谁来收拾这摊子?

作者最后说,评估代码油腻感很难,人类直觉和品味仍然或明或暗地嵌在评价体系里。

但这条路不能停。耦合度、代码 churn、内聚性……这些老派指标,可能都需要在 AI 时代重新被定义、被量化。

“Measuring programming progress by lines of code is like measuring aircraft building progress by weight.”

代码能跑,只是最低门槛。当 AI 把写代码变成流水线,人类真正的价值,也许不再是写更多代码,而是守住那座不塌的城。

问题是,我们准备好当那个“守城人”了吗?

【锐评】:AI 把代码正确率卷到天花板,却把“油腻”留给了明天的人类买单。

参考链接:
https://earendil.com/posts/measuring-code-sloppiness/