我们拿了一个棘手的遗留仓库——一个 14k 行的 Express + React 应用,没有测试、状态纠缠不清、 数据库层套了三层抽象——然后把同一份重构任务说明交给五个不同的 AI 编程 agent。之后我们 对结果做了 diff。
**披露:**Build Lab 由 Y Build 出品。这个实验关注的是编程 agent 本身;数据是我们自己的, 方法见下文。
这五个,以及它们为什么不同
市场分成三种形态,我们在每一种里都挑了:
- Claude Code——终端优先的 agent。在公开的 SWE-bench Verified 排行榜上排第一。
- OpenAI Codex (CLI)——终端优先,token 用量明显更省。
- Cursor——IDE 原生,现在带平铺式多 agent 模式。
- Aider——终端、git 原生,外科手术式的 diff。
- Windsurf——IDE 原生,agent 化的工作流。
任务说明
五个全都一样:*“把数据层提取到一个 repository 接口背后,为每个 repository 方法加一个测试, 并且不改动公开 API。“*然后我们测量了:之后测试是否通过、改动了多少行、公开 API 是否真的没破、 烧了多少 token、墙钟时间,以及一个手工打分的质量分。
发生了什么
| Agent | 耗时 | 测试通过 | 公开 API 保住 | 做法 |
|---|---|---|---|---|
| Claude Code | 23 min | ✓ | ✓ | 有条理的多文件重构,质量 9.0/10 |
| Cursor | 47 min | ✓ | ✓ | 更慢,IDE 引导,8.5/10 |
| Codex | 26 min | ✓ | ✓ | token 最省(约比 Claude Code 少 3–4×) |
| Aider | 19 min | 部分 | ✓ | 外科手术式,diff 最小——漏了两个方法 |
| Windsurf | 38 min | ✓ | ✗ | 重写了半层;改坏了一个签名 |
真正的看点是做法上的差异。Aider 做了一处十行的外科手术式改动就停了;Windsurf 重写了 半个应用,还悄悄改了一个函数签名。Claude Code 在跨越最多文件的情况下守住了计划、没有跑偏—— 代价是同样的工作要花上 Codex 3–4× 的 token。
没人提醒你的那个瓶颈
让我们意外的是这件事:一旦你同时跑不止一个 agent,**agent 就不再是瓶颈了。**它周围的一切 才变成真正的工作量——哪个会话在做什么、谁的 diff 准备好了、哪个分支是哪个、自昨天起又坏了 什么。Cursor 那个平铺式多 agent 视图之所以存在,正是因为串行 review 扩展不上去。跑五个 agent 并没有让我们快 5×;它让review成了那份新的全职工作。
方法论
同一个仓库、同一个 commit、同一份任务说明,每个 agent 用全新的上下文、默认模型。每个我们都 跑了两次,保留更好的那一次。质量由人工按一份固定的评分细则打分(可读性、测试的有效性、diff 范围的克制程度)。完整 diff 和日志:github.com/ybuild/lab-04。
结论
不存在”最佳重构 agent”——只存在适合这份活儿的脾性。想要一份紧凑、易于 review 的 diff?Aider 或 Codex。一个必须保持连贯的大型多文件重构?Claude Code。但无论你选哪个,都要为那些 demo 略过的部分留出预算:review agent 干了什么,现在才是真正的工作。