兄弟们,今天聊聊我最近用Claude Code重构后端的一个真实经历。花了3天时间,把一套用了两年的Python FastAPI后端从单体拆成了微服务,中间还顺手试了Cursor、OpenCode和几个MCP工具。结果呢?爽是真爽,坑也是真坑。
为什么突然要重构?
上个月项目用户量翻了三倍,老代码里的同步数据库查询和混乱的依赖注入让每次上线都像在拆弹。老板说:给你一周,搞不定就回滚。我心想,一周手动重写?做梦。于是决定押注AI Agent。
之前我主要用Cursor写前端,但后端重构涉及大量跨文件、跨模块的改动,Cursor的上下文窗口捉襟见肘。正好看到Claude Code出了命令行模式,能直接操作文件树和git,决定一试。
第一天:用Claude Code搭骨架
安装很简单:pip install claude-code,然后配好Anthropic API Key。启动后进入交互式shell,我直接甩给它项目根目录,说:“把这个FastAPI单体应用拆成user、order、payment三个微服务,保持现有API接口不变,数据库用异步SQLAlchemy。”
它花了大概40秒分析代码,然后开始生成目录结构。我盯着终端,看着它自动创建了services/user/、services/order/、services/payment/,每个文件夹里都有main.py、models.py、routers/子目录。最让我吃惊的是,它自动识别了原来代码里的50多个路由,按业务域分到了不同服务里。
关键技巧:给Claude Code的提示词里一定要包含“保持接口兼容性”这句话。否则它会自作主张改字段名,比如把user_id改成userId,那前端就全崩了。
第一天结束,骨架搭好了。但有个小问题:它生成的docker-compose.yml里把三个服务写在了同一个网络里,但没写健康检查。我手动补了几行,顺便让它把日志格式统一输出到ELK。
第二天:Cursor + MCP 双打
Claude Code擅长大局观,但细节代码质量一般。比如它生成的异步查询,经常忘记加await,或者把select()写成了select。这时候我切到Cursor,用MCP(Model Context Protocol)挂了一个本地代码检查工具。
具体做法:在Cursor里安装MCP插件,配置一个名为code-review的tool,指向一个本地运行的pylint + mypy脚本。然后选中Claude Code生成的代码文件,右键“Review with MCP”。它会自动运行类型检查和lint,把报错行和修改建议直接插入编辑器。
举个例子:Claude Code在payment/service.py里写了一段:
async def process_payment(order_id: int, amount: float):
result = db.execute("SELECT * FROM payments WHERE order_id = ?", order_id)
# 错误:忘了 await,而且用了同步execute
return result.fetchone()
MCP检查后立刻提示:“第3行:缺少await关键字;第4行:应使用async execute方法。” 我点一下自动修复,Cursor直接改成了:
async def process_payment(order_id: int, amount: float):
result = await db.execute(select(Payment).where(Payment.order_id == order_id))
return result.scalar_one_or_none()
这种组合拳让我第二天干了原本三天的活。但注意:MCP工具需要自己写脚本,不能完全依赖云端。我写了一个Python脚本,用subprocess调用pylint,输出JSON格式结果,Cursor才能解析。费了半小时,但后面省了几个小时。
第三天:OpenCode 和 Hermes Agent 的意外收获
第三天主要做集成测试。我试了OpenCode(一个开源AI编码工具)来自动生成测试用例。它比Claude Code更激进:我给了它一个API路由文件,它直接生成了100多行pytest代码,覆盖了正常、异常、边界情况。但有个坑:它生成的测试里mock了数据库,但mock对象命名跟实际代码不一致,导致测试跑不过。我花了一小时手动改命名。
然后试了Hermes Agent,一个能自动执行命令的Agent。我让它“在本地启动三个服务,然后运行集成测试”。它真的自动执行了docker-compose up,然后运行pytest,发现一个服务没启动,又自动重启了。但可怕的是:它执行了docker-compose down -v,把我开发数据库的测试数据全删了!
血的教训:Hermes Agent默认有执行权限,一定要用沙箱模式。我在配置里加了--sandbox参数后才限制住它只能操作/tmp目录。
我遇到的坑(必看)
坑1:Claude Code的隐写术标记
这是今天HN上最热的话题。我发现Claude Code生成的代码里,有些注释和字符串里藏着奇怪的Unicode字符。比如一个普通注释# 获取用户信息,后面跟了一个零宽空格。后来看报道才知道,Anthropic用隐写术标记AI生成内容,防止滥用。虽然不影响编译,但如果你把代码提交到GitHub,别人能检测出AI生成比例。我建议:生成后用detect-hidden-chars脚本扫描一遍,或者直接在提示词里加“不要添加任何不可见字符”。
坑2:Cursor的上下文窗口溢出不报错
当项目文件超过500个时,Cursor的Agent模式会悄悄截断上下文。你让它改一个函数,它可能只看到前300行,然后生成一个不完整的修改。我后来用.cursorignore文件排除了node_modules和__pycache__,并手动指定关键文件路径,才解决。
坑3:MCP工具链的版本冲突
我同时装了MCP的code-review和git-helper两个工具,结果它们依赖的pydantic版本冲突,导致Cursor崩溃。解决方案:每个MCP工具用独立的Python虚拟环境,在配置里指定pythonPath。
坑4:OpenCode生成测试用例的假阳性
它生成的测试全部通过,但实际代码有bug。原因:它用了一个过于宽松的mock,导致没覆盖真实逻辑。我后来强制它“必须使用真实数据库连接,不mock”,测试质量才上来。
最终成果和对比
3天后,后端成功上线。具体数据:
- 代码量从8000行增加到12000行(拆服务必然增加样板代码)
- API响应时间从平均120ms降到45ms(异步+独立服务)
- 测试覆盖率从30%提升到78%
- 人工手动改动仅占15%,主要是改命名和加边界处理
工具使用占比:Claude Code干了60%的代码生成,Cursor + MCP干了30%的代码审查和修复,剩下的10%是OpenCode和Hermes Agent的测试和部署。
但说句实话:AI Agent目前只适合“有明确边界”的重构。如果你要从零设计架构,或者需要深度业务理解,还是得人脑主导。比如支付服务的幂等性设计,Claude Code生成了idempotency_key,但没考虑分布式锁的超时策略,我手动加了一个Redis锁才搞定。
结论和建议
如果你也想用AI Agent做后端重构,我总结几条实战建议:
- 先用Claude Code做架构拆分,再用Cursor做细节打磨。前者适合宏观操作,后者适合代码级修复。
- MCP工具一定要本地化。不要依赖云服务,自己写脚本调用lint、测试框架,才能控制质量和隐私。
- 给Agent加权限约束。Hermes Agent和OpenCode都可能执行危险命令,用
--sandbox或--dry-run先测试。 - 扫描隐写内容。Claude Code生成的代码建议用
cat -A或专用工具检查隐藏字符,否则可能影响开源合规。 - 不要迷信测试覆盖率。AI生成的测试用例容易假阳性,一定要手动检查边界条件。
最后说一句:AI Agent不是替代你,而是放大你的能力。你越懂代码,它越听话。如果你连FastAPI的路由装饰器都搞不清,Agent生成的bug你根本发现不了。所以,该学的还得学,只是现在能学得更快、干得更爽。
评论区来聊聊:你用AI Agent重构过什么项目?踩过哪些坑?