Vibe Coding 实战
Vibe Coding 可以加快从想法到第一版的速度,但“页面能打开”不是完成。生产级做法是让自然语言负责表达目标,让仓库规则限制方案,让测试和真实用户流程决定能不能交付。
哪些任务适合,哪些需要收紧权限
| 任务 | 建议模式 | 原因 |
|---|---|---|
| 已有模式的 UI、表单、CRUD | Agent 实现 + 人审查 | 反馈快,容易与现有代码比较 |
| 小型 prototype | Agent 主导 + 快速验证 | 目标是验证需求,不是直接生产上线 |
| 明确错误的局部修复 | 混合模式 | Agent 定位候选,人确认根因 |
| Auth、权限、支付 | 人主导设计 + Agent 辅助 | 错误影响账户、数据或金钱 |
| Migration、批量修改 | Dry-run + 人工批准 | 副作用可能不可恢复 |
| 分布式并发与性能 | 人主导 + 基准测试 | 单机“看起来可用”容易误导 |
判断标准不是“AI 会不会写”,而是错误的 blast radius、能否自动验证、能否回滚,以及是否涉及外部副作用。
一次 Vibe Coding 迭代
Outcome
→ 给 Agent 目标、背景、约束、验收
→ 让 Agent 读取规则和相邻实现
→ 生成最小 patch
→ 运行窄测试
→ 人检查 diff 与风险边界
→ 运行真实用户流程
→ 保存证据或继续下一轮
一次循环只解决一个可验证行为。不要让“顺便重构、顺便升级依赖、顺便改 UI”进入同一轮。
可复用 Prompt 模板
目标:
[用户完成什么结果]
当前行为:
[如何复现,包含 URL、输入和错误]
相关范围:
[允许读取/修改的目录、已有模式]
不能动:
[URL、API contract、数据库字段、其他人的改动]
技术约束:
[框架、设计系统、测试命令、安全要求]
验收:
- [可观察结果 1]
- [边界条件 2]
- [测试和真实流程 3]
先只读分析并给出证据。确认最小修改方案后再编辑。
这比“做得好看一点”更有效,因为它把主观目标翻译成可观察状态:布局层级、移动端行为、交互反馈、加载/空/错状态和视觉规范。
从 prototype 到 production 的四道门
1. Behaviour gate
- Happy path 能完成。
- 空数据、错误输入、超时和重复点击有结果。
- 刷新、后退和重新进入不会丢失必要状态。
2. Code gate
- Typecheck、lint 和相关测试通过。
- 没有虚构 import、重复 utility 或无用抽象。
- Diff 只覆盖任务范围。
3. Risk gate
- 权限由服务端验证。
- 写操作幂等,高风险动作有审批。
- Secrets、PII 和内部路径不出现在日志或 UI。
4. User gate
- 在真实 viewport、浏览器或客户端中完成流程。
- 文案对目标用户自然,不暴露内部术语。
- 用户知道下一步、成功状态和失败恢复方式。
Quality Gate 不应该是网上抄来的数字
“覆盖率必须 80%”“PR 不能超过 400 行”可能适合某团队,但不是普遍真理。阈值应由仓库风险和历史数据决定。
# 示例:使用项目自己的命令和阈值
steps:
- name: Format and lint
run: bun run lint
- name: Narrow tests
run: bun test src/path/to/changed-feature.test.ts
- name: Build
run: bun run build
- name: Contract check
run: bun run test:contracts
CI 只能证明自动化断言;支付完成、消息发布和真实安装等结果仍需要外部 read-back 或设备验证。
Review AI 代码的七个问题
- 是否引用了不存在的函数、配置或 package?
- 是否绕开仓库已有 helper、组件或错误处理?
- 是否改变 URL、API contract 或数据库关系?
- 是否新增隐藏网络请求、写操作或日志数据?
- 是否把客户端检查误当成授权?
- 是否用更复杂的抽象解决简单问题?
- 测试是否覆盖用户行为与失败方式?
让第二个模型 review 可以提供候选问题,但不能替代责任人读 diff、运行代码和确认业务不变量。
Debug 时给 Agent 什么
差的输入:
报错了,帮我看看。
可诊断输入:
Command: bun test src/auth/login.test.ts
Expected: invalid password maps to INVALID_CREDENTIALS
Actual: response becomes UNKNOWN_ERROR
First failing assertion: login.test.ts:84
Relevant call path: LoginForm → request.ts → mapApiError
Last known good commit: 1a2b3c4
Constraints: do not change API response shape
错误日志应截取第一处有意义的失败和相关调用链。不要把整个终端历史、.env 或 token 复制进 Prompt。
三个可复现故障演练
这些是练习场景,不是假装发生过的“真实事故”。
演练 A:虚构 API
让 Agent 为 UI 引入一个并不存在的 hook。Review 时用 rg、类型检查和 package docs 证明它不存在,再要求复用仓库已有实现。
演练 B:错误并发锁
给多实例订单服务加进程内 mutex。单元测试会通过,但启动两个进程后仍产生重复订单。修复目标是数据库约束、分布式协调或 provider idempotency,而不是相信单进程测试。
演练 C:危险 Migration
生成删除旧字段的 migration,但只允许在 fixture 上 dry-run。要求先证明没有读路径、准备备份与回滚,并在没有生产授权时停止。
UI 任务不能只看代码
至少检查:
| 状态 | 桌面 | 移动端 |
|---|---|---|
| 默认 | 信息层级和首屏 CTA | 无横向溢出,主操作可达 |
| Loading | 布局不跳动 | Skeleton 不占满小屏 |
| Empty | 告诉用户为什么为空和下一步 | 文案不截断 |
| Error | 能恢复、重试或返回 | 操作按钮不被键盘遮挡 |
| Success | 明确保存/提交结果 | 返回路径清楚 |
“组件渲染成功”不能证明页面好用。真实 viewport QA 才能发现断行、重叠、隐藏卡片和错误交互顺序。
安全的 Git 节奏
git status --short
git diff -- path/to/files
git diff --check
git add -- path/to/exact-files
git diff --cached --name-only
git commit -m "fix(scope): describe user outcome"
Dirty worktree 中的其他改动属于用户或同事。不要 stash、reset、restore 或 broad-stage 来让自己的任务“看起来干净”。
动手练习:一个带空错状态的列表页
- 写明用户、结果、不能改的 URL 和 API contract。
- 找仓库里最接近的列表页模式。
- 让 Agent 只实现默认与 loading 状态,运行测试。
- 第二轮补 empty 与 error,检查恢复路径。
- 在桌面和移动 viewport 完成真实流程。
- Review scoped diff,只提交本次文件和证据。
完成标准
- 自然语言输入包含目标、背景、约束和验收。
- 每轮只处理一个可验证行为。
- 自动化检查与真实用户流程都执行了。
- 高风险副作用没有被 Prompt 授权替代。
- 页面中的案例明确标为练习,不伪造内部事故和指标。
相关阅读
官方参考
📚 相关资源
❓ 常见问题
点击问题,查看本章对应的实践答案。
Vibe Coding 是不是按一下按钮 AI 就把整个 product 做完?
不是。Vibe Coding 是一种协作方式:你用自然语言写清目标、约束、acceptance criteria,AI 负责生成 / 改 / 解释 / 迭代代码,定方向 + sign-off 仍然是你的事。AI 解决『机械翻译需求成代码』,解决不了『判断 priority + 做 architecture 取舍 + 对 production 风险负责』。
Vibe Coding 适合哪些任务,哪些要谨慎?
适合:页面样式 / 组件补全、CRUD + form + type、报错排查、新项目 prototype —— 反馈快、容易 validate、规则明确。谨慎:支付 / 鉴权 / 权限系统、核心 architecture 升级 —— 写错代价高,必须人主导方案。不建议全权交给 AI:compliance、security 敏感逻辑必须人工 review。
一个有效的 Vibe Coding prompt 至少包含什么?
至少写清目标、当前行为、相关范围、不能动的边界、技术约束和验收证据。再要求 Agent 先只读探索、引用仓库现有模式,确认最小方案后再编辑。信息写全能减少猜测,但不能保证一次成功;仍需窄测试、diff review 和真实用户流程。
Vibe Coding 新手最容易踩哪些坑?
5 个高频坑:(1) 需求太空 → AI 产出『看似合理但不对题』,修法是写清 input / output / boundary;(2) 一次改太多 file → 出问题没法定位,拆成 1-2 个小 task;(3) 不贴错误信息 → AI 只能猜,直接贴 log + 截图 + 调用链;(4) 只看代码不运行 → 看着像对实际跑不通,每轮 validate;(5) 把 AI 当最终责任人 → 出错没人兜底,sign-off 留给人。
把报错丢给 AI 是『偷懒』吗?
错误信息是诊断输入,但不要“一股脑”复制整个终端。提供执行命令、预期与实际、第一处有意义的失败、相关调用链、最后正常版本和不能改变的 contract;同时删除 `.env`、token、PII 与无关日志。Agent 给出的是根因候选,必须通过复现、代码路径和测试验证。