记录下这两天Debug项目的问题与思考

2026-04-14

项目开始初具代码量规模,大几千行的样子。一个Pro账号已经基本应付不了了。
昨天花了一整天调一个 bug,Sonnet 每次改动都只会堆砌代码,问题始终没解决。今天换了 claude --model opus-4-5,它知道从另外一个角度出发,先去查阅相关技术资料文档,当然token量也在快速增加。


问题是什么

我在做一个功能:发消息让 Claude 生成 CAD 图纸(SVG/HTML),前端应该显示"正在生成产物"的转圈动画,完成后出现可点击的卡片,点卡片能在 iframe 里预览 HTML。

听起来不复杂,但实际调试时掉进了一个坑:Cloudflare 和 rendering_mode 之间的矛盾


rendering_mode 的两难

Claude API 有个 rendering_mode 参数:

  • 不设 "raw" → Claude 返回 <antArtifact> 标签格式,前端能正确解析成产物卡片。但 Cloudflare 会拦截请求。
  • 设了 "raw" → 能绕过 Cloudflare,但 Claude 返回的是普通 markdown 代码块,不是 <antArtifact> 格式。

昨天用 Sonnet 反复调试,它的策略是不断在前端代码里加各种兼容逻辑——试图同时处理两种格式、加 fallback、加正则匹配。代码越堆越多,但核心矛盾没解决。


Opus 怎么处理的

换 Opus 之后,它没有继续在前端打补丁,而是直接指出了问题:

rendering_mode 必须是 "raw" 才能过 Cloudflare,那就接受 markdown 代码块格式,改前端解析逻辑来适配这个格式。

思路清晰,不纠结。与其两头兼顾,不如确定一个约束条件,然后围绕它设计。


顺手做了一次重构

之前在没有特别说明的情况下,代码都是堆砌到main.rs里的。导致之后改问题通常都会通读一遍这个大文件。我想这可能是我消耗token过快的一部分原因。

这次模块拆分,把臃肿的单文件拆成了多个模块,每个文件 100-300 行。这样修 bug 时只需要读相关模块,token 消耗能降 80% 以上。

代价是:这次重构瞬间把我 5 小时的 session token limit 烧没了。


体会

Sonnet 适合执行明确的任务,但遇到需要判断"该改哪里"的问题时,它倾向于堆代码而不是退一步想清楚。Opus 贵是贵,但在关键的架构判断上确实更靠谱。

另外,之前我都是自己测试,把问题描写清楚,再让claude修改。我觉得这样会省token,但事实证明,这样大概率会更费事,不如让claude自己设计测试方法,自己测试查找问题,它会更清楚问题所在。当然还有些测试场景它还覆盖不了,比如让CC调起本地浏览器来测试。这个以后应该会有办法吧。