我被AI写的代码坑了两天:5个让Vibe Coding不出事故的方法

0 阅读6分钟

我被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生成的,我完全分不清。

最后花了两天:

  1. 把两段权限逻辑理清楚
  2. 删掉冗余的那段
  3. 把超级管理员逻辑加进去
  4. 补测试用例确保不回归

如果我一开始就看懂了代码,这个功能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:这段代码在做什么/合理吗/未来会不会有坑

不是让你深度重构,是让你至少扫一遍:

  1. 这段代码在做什么? — 能不能用一句话说清楚
  2. 这段代码的实现合理吗? — 有没有过度设计或逻辑绕路
  3. 这段代码未来会不会有坑? — 如果需求变了,这里要不要改

确保没有明显的坑,再往下走。


方法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时代,每个程序员都要学会的事情。


你踩过类似的坑吗?有没有什么好的解决方法?评论区等你。