上周 Godot(一个用户量很大的开源游戏引擎)更新了贡献政策:全面禁止 AI 代理直接提交代码,违者永久禁止访问仓库。这是目前最强硬的一次"反 Vibe Coding"表态。我每天都在用 Claude Code 写代码,看到这个新闻的第一反应不是"AI 又被针对了",而是"这个规则说的正是我一直担心的问题"。
先说清楚 Godot 具体做了什么
Godot 基金会这次更新贡献政策,核心是三条:
| 规则 | 具体内容 |
|---|---|
| 禁止 AI 代理直接提交代码 | 违者永久禁止访问仓库,这是目前开源社区里最严厉的处罚力度 |
| 新贡献者门槛 | 合并 PR 数量在 3 个及以下的用户被定义为"新贡献者",会有额外限制 |
| 强制人工审核 | 任何 PR 必须由真人完成审核并批准,才能合并进主分支——这条规则以前就有,这次是进一步明确和强化 |
触发这次政策更新的原因: 大量 AI 生成的低质量 PR 涌入项目,维护者的审查负担暴增,同时也引发了代码质量和责任归属的争议——如果一段 AI 生成的代码出了问题,责任算谁的?
这不是个例,而是一个正在扩大的趋势
Godot 不是第一个这么做的项目。最近开发者圈里流行一个新词——"Vibe Slop"(氛围垃圾代码),专门用来形容那种"看起来能跑,但没人真正理解、也没人愿意负责"的 AI 生成代码。
这个词流行起来,本身就说明了一个现象:大量开源维护者已经被"Vibe Coding 提交的低质量代码"折磨够了。
维护者的困境很实际:
- 审查一段人写的代码,你大致能判断作者的思路和意图
- 审查一段 AI 生成的代码,你完全不知道提交者自己有没有理解这段代码在干什么
- 如果代码出问题,提交者可能自己都答不上来"为什么这样写"
对开源项目来说,PR 数量暴增但质量下降,等于维护成本不降反升。
作为个人开发者,我怎么看这件事
我自己每天都在用 Claude Code 写代码,效率提升是真实的。但 Godot 这次的政策,让我重新想清楚了一个问题:Vibe Coding 适合"你自己负责"的场景,不适合"你要说服别人相信"的场景。
具体展开:
| 场景 | Vibe Coding 是否合适 | 原因 |
|---|---|---|
| 自己的项目,自己维护 | ✅ 合适 | 出了问题自己扛,理解不理解是自己的事 |
| 给团队提 PR | ⚠️ 谨慎 | 同事需要理解你的代码,AI 生成的东西你自己都说不清就麻烦了 |
| 给开源项目提 PR | ❌ 不合适 | 维护者要为整个项目的长期质量负责,你的"不理解"变成了别人的负担 |
| 写文档/脚手架/一次性脚本 | ✅ 合适 | 低风险,出错影响小 |
Godot 这次针对的其实是最后一种情况的极端版本: 有人用 AI 生成代码,自己完全不审查就直接提 PR 给维护者,把"理解代码"这个责任完全甩给了别人。这不是在用 AI 提升效率,是在用 AI 转移劳动。
一个容易被忽略的区别:AI 辅助 vs AI 甩锅
我自己现在用 AI 写代码,会明确区分两种情况:
AI 辅助(我依然负责):
- 让 AI 生成初稿,我逐行看过、理解、调整
- 遇到我不确定的地方,会去验证或者测试
- 提交前,我能对每一行代码的存在负责
AI 甩锅(我不再负责):
- AI 生成什么就是什么,没有真正 Review
- 提交的时候,其实是"把责任转移给了下一个看代码的人"
- 出了问题,第一反应是"这是 AI 写的"
Godot 这次的政策,本质上是在强制大家从"甩锅模式"切回"辅助模式"。 我觉得这个方向是对的,只是用了比较激烈的手段(一刀切禁止 AI 代理提交,而不是要求提交者做更严格的自我审查)。
这对我们日常写代码有什么启发
不管你是不是给开源项目提 PR,Godot 这次事件都值得我们对照检查一下自己的 AI 使用方式:
自查清单:
- 提交代码前,我能不能对每一行的存在给出理由?
- 如果同事问我"这段逻辑为什么这样写",我能不能不查 AI 对话记录就回答?
- 我有没有真正 Review 过 AI 生成的内容,还是看起来能跑就直接提交了?
- 如果这段代码出了 bug,我能不能独立排查,而不是重新问一遍 AI?
四个问题里如果有两个以上答不上来,说明你正在从"AI 辅助"滑向"AI 甩锅",需要收一收。
最后
Godot 这次的强硬表态,不是"AI 编程不行",而是"不负责任的 AI 编程不行"。作为每天靠 AI 提效的开发者,我反而觉得这种边界感是好事——它把"用 AI 写代码"和"用 AI 逃避理解代码"这两件事划清楚了。
Vibe Coding 本身没有错,错的是把"我不需要理解"也一起 Vibe 掉了。
你怎么看 Godot 这次的政策?你在用 AI 写代码时,会不会做逐行 Review? 评论区聊聊。
kyriewen 
![[爱了]](/js/img/d1.gif)
![[尴尬]](/js/img/d16.gif)