AI 写代码已经成为越来越多开发者的日常。但一个普遍的问题是:AI 生成的代码要么是"幻觉代码"——看起来像模像样,一跑就报错;要么是"屎山代码"——功能勉强能跑,但结构混乱到你想改都不知道从哪下手。
这篇指南不教你"怎么写代码",而是教你怎么与 AI 协作写出靠谱的代码。
核心理念:把 AI 当成伙伴,而非工具
新手往往把 Cursor、Codex、Claude Code 当成一个单纯的"代码生成器"。但更好的心态是:把它们当成你的伙伴、同事、助手。
就像你不会让一个新员工第一天就直接上手写业务代码,你也不会让 AI 在不了解项目背景的情况下直接输出代码。你得先让它熟悉"公司业务流程"。
第一步:规划就是一切
不要让 AI 一上来就写代码,先强制它读懂你的项目。
使用 /init 命令,让 AI 充分理解项目的技术栈、架构和规范。有了这份上下文,AI 生成的代码逻辑会清晰得多。
举个场景:用 React + Tailwind CSS 实现一个任务清单(待办)页面。
Vibe 新兵的做法:直接让 AI 写代码。结果呢?AI 会自行脑补大量你没有要求的功能——要不要本地存储?要不要 API 远程存储?要不要拖拽排序?要不要优先级分类?功能无限膨胀,最终变成一坨难以维护的屎山。
正确的做法:先规划,再编码。核心原则是 "胶水编程思维"——优先使用成熟方案,避免凭空造轮子。
第一阶段只做规划,禁止输出任何代码:
- 确认技术栈:React 19 + Tailwind CSS + useState(精确到版本)
- 梳理功能边界:新增待办、删除待办、切换完成状态——明确不做本地持久化、不做筛选、不做拖拽
- 拆分模块:输入框组件、待办列表组件、列表容器组件
- 定义数据流:useState 存储 task 数组,数据结构
{id, text, completed}(字段由你定义,不能让 AI 做主) - 审核规划、更新规划,然后分段输出代码
背后的逻辑很清晰:
- 先划定边界,防止 AI 擅自加功能,无限膨胀成屎山
- 强制模块拆分,好读、好维护——AI 生成的代码我们也要审核
- 预先规定数据结构,从根源减少 AI 的参数和字段幻觉(字段名叫
text就不能是title,不能让 AI 做主) - 先生成规划、审核规划、更新规划,这份规划将伴随项目开发的完整周期
第二步:胶水编程思维
胶水不生产零件,只联通零件。
胶水编程的核心只有八个字:能抄不写,能连不造。
你自己不要从零造轮子,也指挥 AI 不要从零造轮子。去找那些已经被验证了千万次的成熟组件、经典代码,让 AI 把它们组装起来。你只负责写衔接、调用、流转的粘合代码,把各个现成零件联通。
这样做的效果立竿见影:产生幻觉代码和屎山代码的可能性大大降低。
举个例子:我们已经完成了待办清单的项目规划,现在要给列表增加拖拽排序功能。
❌ 错误做法:直接说"帮我写 React 待办清单的拖拽排序功能"。AI 很可能凭空手写一整套拖拽逻辑——自己实现坐标监听、排序算法、边界判断。问题是:手写拖拽逻辑的边界 case 非常多,容易出现幻觉 bug,而且代码难以维护。
✅ 正确做法:
- 先调研:React 生态中成熟的拖拽排序组件有哪些?优先选用
react-beautiful-dnd - 不要自己手写拖拽底层代码,只做粘合工作
- 输出内容按顺序来:先给安装依赖命令,再把现有 TodoList 组件和
react-beautiful-dnd组件进行衔接,只写模块适配和数据流转的粘合代码
轮子别人已经造好了,你只做胶水。
第三步:用元方法论让 AI 自我进化
Claude Code 和 Codex 都具备记忆模块和 Harness 架构。这意味着你可以让 AI 帮你不断优化提示词本身。
这就形成了一个自进化的闭环:
- Alpha 提示词:定义"怎么干活",规范一旦生成,AI 就会遵循
- W 提示词:根据生成结果进行打分和判断,不断迭代优化
AI 系统会在这个反馈循环中持续进化,你得到的代码质量也会越来越高。
总结
Vibe Coding 的本质不是"用 AI 写代码",而是"与 AI 协作":
| 阶段 | 核心原则 | 关键动作 |
|---|---|---|
| 规划 | 先划定边界 | /init 让 AI 读懂项目,定义技术栈、功能边界、模块拆分、数据结构 |
| 编码 | 胶水编程 | 能抄不写、能连不造,用成熟组件组装,只写粘合代码 |
| 进化 | 元方法论 | 让 AI 优化提示词,形成自我进化的反馈循环 |
把 AI 当成一个聪明但需要引导的同事——给它充分的上下文,划定清晰的边界,指挥它用成熟的零件去组装,而不是凭空造轮子。这样,你得到的就不是幻觉代码和屎山,而是真正可维护、可交付的靠谱代码。