午夜咖啡午夜咖啡

jolestar 的文章与笔记。

Post

AI Coding 时代,好的编程习惯仍然重要

2026-04-27 21:32:11Post

人觉得简单的重构,对 Agent 不一定简单。清晰的代码结构不只是方便人读,也是在降低 Coding Agent 的任务复杂度。

最近做一个 Agent benchmark,发现不能简单地用开发者视角来评估一个编程任务对 AI 的复杂度。

比如一个重构任务:把一个几千行的大文件,按功能拆成十多个小模块。

这个任务对开发者来说其实不算难,主要工作就是移动代码、整理 imports、编译验证,新手也能搞定。

所以想着用一个简单的任务来做一下 benchmark,结果却出乎意料。

Claude Code 判断这个任务比较大,尝试拆了一部分,提了个 PR 写了 Future work 打算分步来。

我自己的 Agent 是“硬上”,往完整拆分的方向推进了更多,但代价也很明显:Token 消耗是 Claude 的几十倍,后面大量时间都花在反复读文件、修编译错误、再读文件、再修错误上。

这让我意识到,人觉得简单的任务,对 Agent 不一定简单。

对人来说,这类重构很多时候就是“把这一段挪过去”。但对 Agent 来说,它要先分批读大文件,记住哪些函数和哪些测试有关,再生成一堆跨文件修改,最后通过编译错误一点点补洞。看起来像机械活,实际变成了一个高 Token、高状态管理成本的任务。

前一段时间看到有人说,AI Coding 时代,拆分模块这些编程原则没那么重要了,反正人也不看代码。现在看,我不太同意。模块边界清楚、文件粒度合适、依赖关系简单,不只是方便人读,也是在帮 Agent 降低任务复杂度。

从另一个角度看,现在 Agent 的读文件和改文件工具,对这种重构也不太顺手。

Coding Agent 改文件,主要还是文本替换。比如 Claude Code 常见的是 old_string / new_string 模式:先给出一段旧文本,再替换成新文本。Codex 常用的是 apply_patch:生成一个类似 git diff 的 patch,表达把旧的内容替换成新的。它们都适合小范围修改,但如果要删除一大段旧代码,或者把一批函数挪到别的文件,模型往往还是要先把原始内容读进上下文,再生成一大段替换或 diff。

所以我后来给 Agent 一个提示,让它先用脚本、sed、perl 这类工具把大文件粗拆开,直接把旧内容删掉,写到新文件中,然后再逐个慢慢修,它的完成度确实高了许多。Agent 默认不会这样做,主要是因为系统提示词里会强烈要求 Agent 用内置工具修改文件,而不是命令行工具。

再往前想一步,Coding Agent 可能还需要更高级的编辑工具。不是只给它一个“替换文本”的接口,而是先通过 parser、LSP 或 compiler 建立代码结构,让 Agent 可以像 IDE 一样做重构:移动函数,删除 impl block,整理 imports。不知道是否有朋友做这方面的尝试。

总的来说,即便是 AI Coding 时代,好的编程习惯还是有价值的。尽量在早期通过 harness engineering,把好的编程习惯变成 Agent 的默认工作方式,比后来再重构的成本要小很多。