我被AI写的代码坑了两天:5个让Vibe Coding不出事故的方法
用Cursor跑了三个月,踩了一个让我后怕的坑:AI帮我写的接口能跑通,但第二天打开代码,发现逻辑绕得我自己都摸不着头脑。修了一个bug,引出三个新bug。拖了两周才理清楚——这个教训值一篇博客。
一、我踩的那个坑
事情是这样的。
有一个需求:做一个用户权限模块,原型是RBAC模型(角色-权限)。我让Cursor帮忙写,提示词大概是这样:
帮我写一个用户权限模块,包含角色、权限、用户角色关联三张表,
用FastAPI实现CRUD接口,数据库用PostgreSQL。
Cursor给了我一个完整的模块——3个模型文件、4个路由文件、1个service层文件,总共400多行代码。跑测试,全绿。
一周后,需要加一个"超级管理员"功能:超级管理员可以绕过所有权限检查。需求很简单,代码应该也很好改吧?
我去改。
然后我发现:代码里有两个地方在做权限判断,一个在middleware层,一个在service层,逻辑还不一样。middleware层漏掉了某个场景,service层绕过了middleware的某些判断。更要命的是,我不知道这两段代码是谁先写的——是我之前的手写代码,还是Cursor生成的,我完全分不清。
最后花了两天:
- 把两段权限逻辑理清楚
- 删掉冗余的那段
- 把超级管理员逻辑加进去
- 补测试用例确保不回归
如果我一开始就看懂了代码,这个功能10分钟就能加完。
二、为什么Vibe Coding会产生"看不懂的代码"
AI会把"能用"当成"最优"
AI的目标是"生成能运行的代码",不是"生成容易维护的代码"。这两个目标不完全一致。
例子A:过度抽象
你让AI写一个"处理用户订单"的函数,它可能给你一个抽象了三层的代码:OrderHandler → OrderProcessor → OrderExecutor。你只是想处理个订单,它给你造了一套框架。
例子B:魔法字符串
# AI写的
def check_permission(user_id, action):
if user_role_map.get(user_id) in ["admin", "super", "root"]: # 什么鬼?
return True
它不是不会用常量,是因为你没说"请用枚举或常量"。AI按最短路径生成代码。
例子C:过度嵌套
业务逻辑稍微复杂一点,AI就会生成多层嵌套的条件判断:
# AI写的(我见过最夸张的一个)
if user:
if user.is_active:
if user.role:
if user.role.permissions:
if "admin" in user.role.permissions:
# 终于到了核心逻辑
pass
AI不理解你的业务上下文
AI只知道你告诉它的信息,不知道你脑子里想的。
比如你说"加一个缓存",AI可能给你加上。但它不知道你的缓存命中率只有5%,加缓存反而增加了内存开销。AI没有业务判断能力。
你没有review,AI的缺陷就被埋进去了
这是最要命的。用Vibe Coding的时候,你的心理预期是"代码已经能跑了,我不用管太多"。这种心态一出现,review就被跳过了。
AI写的代码,哪怕有问题,只要跑得通,你就不太想去动它。
结果:代码一天天烂下去,直到有一天你想改,改不动了。
三、5个让Vibe Coding不出事故的方法
方法1:让AI先解释,再让它写
不要直接让AI写代码。先让它解释它要怎么做。
你:我需要给用户模块加一个"冻结账户"的功能。
你:先告诉我你打算怎么实现,需要改哪几个文件,核心逻辑是什么。
这样AI的思路就外化了。你能判断它的思路对不对。如果不对,立刻纠正,而不是等代码写完了再发现。
实测效果:至少避免了50%的返工。
方法2:三步review:这段代码在做什么/合理吗/未来会不会有坑
不是让你深度重构,是让你至少扫一遍:
- 这段代码在做什么? — 能不能用一句话说清楚
- 这段代码的实现合理吗? — 有没有过度设计或逻辑绕路
- 这段代码未来会不会有坑? — 如果需求变了,这里要不要改
确保没有明显的坑,再往下走。
方法3:分步生成,每步不超过50行
我之前犯的错误:一次性把整个模块的需求丢给AI,让它一口气生成400行代码。
正确做法:
步骤1:先写数据模型
步骤2:写基础的CRUD接口
步骤3:加权限判断
步骤4:加日志和异常处理
每一步都review,确认没问题,再让AI生成下一步。这样你每个阶段的代码都看得懂,整体就不会失控。
方法4:让AI补充注释,但要明确要求"为什么"
AI默认不写注释,或者写的注释是废话("这个函数用于处理用户"——这不是废话吗)。
正确做法:
帮我写这个函数,并且在每个关键判断处加上注释,解释为什么这么判断,
而不是在做什么("做什么"看代码就知道了,"为什么"才需要注释)。
方法5:让AI写测试用例,那是最好的"代码说明书"
测试用例会逼着AI解释"这个函数在什么输入下会输出什么"。你读测试用例,就是在读代码的规格说明。
针对我刚才生成的check_permission函数,写5个测试用例,覆盖:
1. 普通用户有权限
2. 普通用户无权限
3. 管理员有权限
4. 冻结账户无权限
5. 不存在的用户
四、工具推荐
Cursor Chat — 能看到你整个项目,结合上下文回答,比直接丢给ChatGPT准得多。
GitHub Copilot Edits — 选中代码,右键"Explain this",给出逐行解释。
Claude — 长上下文理解能力最强,适合搞清楚复杂代码逻辑。
我的用法:Cursor写代码,Claude做代码审查和解释。
五、结论
Vibe Coding不会让你的代码变烂,但你的心态会让你的代码变烂。
AI能帮你写代码,但没办法替你理解代码。如果你把"能跑通"当成终点,不愿意花时间理解AI写的代码,迟早会碰到"代码跑通了,但我不敢动"的困境。
反过来,如果你用Vibe Coding的同时,保持对代码的理解能力——通过分步生成、三步review、测试用例这些方法——你既能享受AI的效率,又不会被AI的代码绑架。
让AI帮你写代码,让你自己保持对代码的控制权。
这是Vibe Coding时代,每个程序员都要学会的事情。
你踩过类似的坑吗?有没有什么好的解决方法?评论区等你。