把 Claude Code 当主力编辑器用了一个月,我对"AI 结对编程"这事的看法变了好几次。
最开始两周觉得是神。第三周开始觉得是同事。第四周开始觉得是一个很聪明但有时候会突然犯傻的同事,需要管理。
记一些印象深的瞬间。
救场的那些
凌晨两点的一次部署事故。Railway 上的 worker 进程不停 OOM,我看了二十分钟 log 没头绪。把 log 贴给 Claude,三轮对话之后它说:你这个 Pillow 的图片处理在循环里没释放,每次开新图都是新内存。我去 grep 了一下,确实,加了个 with 块,重启就好了。
这种事我自己肯定也能查出来,但凌晨两点状态下,多一双客观的眼睛省的不只是时间,是判断力。
重构一个 600 行的烂状态机。这种活我以前会拖一周不想动 —— 不是因为难,是因为枯燥。让 Claude 先读一遍画一个状态图给我,然后一条一条聊"这个状态可以合并到那个吗",两小时改完。代码量从 600 减到 220。
枯燥的活变成对话的活,门槛立刻就低了。
一个我搞不懂的 TypeScript 报错。Type 'X' is not assignable to type 'Y' 那种,里面套着五层泛型。我自己读三遍头大,让 Claude 翻译成"它在抱怨什么",一句中文我就明白了。然后一行修复。
很多时候我需要的不是答案,是翻译。
被坑的那些
它会编 API。问它某个不太流行的库的某个函数怎么用,它有时候会非常自信地写一段调用代码 —— 函数名是对的,参数是它编的。
我学到的教训是:它给的代码里只要有不眼熟的方法签名,先去文档查一遍。这一步省不得。
它会过度抽象。让它"加一个登录功能",它会顺手帮你建 AuthService、AuthMiddleware、UserRepository、SessionManager 四个类,每个类带接口。我只是想让一个用户能登进来。
后来我学会在 prompt 里直接写:"最简实现,不要新建文件,不要新增抽象层"。效果立刻好很多。
它会自信地"已修复"一个根本没修的 bug。这是最危险的。
有次我让它修一个数据库迁移脚本,它说"修好了",我看了下 diff,确实改了几行。但跑测试发现 bug 还在。再让它看,它又改了几行,又说修好了。如此三轮之后我才意识到 —— 它从一开始就没理解 root cause,每次都在不同的位置打补丁。
那次之后我多加了一条规矩:让它先用一段话描述「为什么会有这个 bug」,再让它改代码。能讲清楚的,改完十有八九对。讲不清楚的,改了也是瞎改。
它没改变的
有些事它没改变 —— 至少现在还没。
架构判断还是我的事。要不要拆服务、用什么数据库、并发模型怎么设计 —— 这些它能给意见,但每次给的意见都是"标准答案",没有上下文。我得自己拍板。
审美还是我的事。让它写 UI,它默认的产物永远长得像 shadcn-ui demo 站。要做出有个性的设计,prompt 得非常具体,而且经常需要我自己直接动手调一遍。
对项目的整体感还是我的事。它能在一个文件里做得很好,但一个三十文件的项目里,它经常忘了三天前我们已经讨论过的决定。我得不停地把那些决定写进 CLAUDE.md / 文档 / commit message 里给它看。
一个月之后
我现在写代码的姿势变了:
- 写之前先聊。让它把我脑子里的混沌整理成几个明确的选项。
- 写的时候让它写第一版,我改第二版。第一版写得快比写得对重要。
- bug 来了先让它复述一遍场景。能复述清楚的它能修,复述不清楚的它瞎修。
- 周复盘的时候让它读一遍这周所有 commit message,给我总结"你这周到底干了啥"。
整体感受:写代码的 friction 大幅降低,但判断的责任更重了。
以前的瓶颈是手不够快。现在的瓶颈是脑子要够清楚 —— 因为 AI 会非常忠实地把你模糊的指令翻译成模糊的代码,速度还很快。
这是好事。但也意味着,独立开发者最该花时间的地方变了:不是练打字,是练把问题问对。