Vibe Coding 调试策略集
12 招排查策略,从贴报错到 Deep Debug,按成本逐级升级。
展开章节目录 (21 节)
策略全景图:十二招在手,Bug 不愁
一句话速览
| # | 策略 | 一句话 | 一句话:大白话版 |
|---|---|---|---|
| 1.1 | 让 AI 自己查 | 不描述问题,直接让 AI 自查代码中的错误。 | "你再检查一遍,看看有没有问题。" |
| 1.2 | 直接丢错误 | 把终端/控制台的报错信息完整贴给 AI。 | "这个报错啥意思?帮我修。" |
| 1.3 | 直接丢截图 | 页面显示异常说不清楚,截图丢给 AI。 | "你看这个页面,哪出问题了?" |
| 2.1 | 代码审查 | 让 AI 系统性通读整个模块的代码逻辑和调用关系。 | "帮我从头到尾审一遍这段代码。" |
| 2.2 | 查看日志 | 在关键节点加日志,追踪数据流转和异常点。 | "帮我加几行打印,看看数据走到哪断了。" |
| 2.3 | Deep Debug | 假设驱动的科学调试法:列出假设→交叉验证→确认根因→最小化修复。 | "别着急改,先猜 5 个原因,一个一个验证。" |
| 3 | 加上测试 | 用测试用例把"什么是正确的"锁死,让 AI 在测试框架下修复。 | "先写测试证明这有 Bug,再修。" |
| 4.1 | 调研最佳实践 | 调研市面上的开源方案和行业做法,对比选择最优解。 | "别人遇到过这问题吗?他们怎么解决的?" |
| 4.2 | 换个模型 | 当一个 AI 反复陷入死循环,换另一个模型从不同角度分析。 | "这 Bug 换个脑子来看看。" |
| 5.1 | 回滚代码 | 修了 30 分钟还没好,果断回到上一个正常版本,复盘重做。 | "修乱了,回去,重新来。" |
| 5.2 | 完善文档后重做 | 不是代码的问题,是需求没说清楚。停下来,把规格写清楚再让 AI 写。 | "问题出在需求上,先把需求文档重新理一遍。" |
| 6 | 打印变量 | 最朴素但最万能的方法:把关键变量的值打印出来看。 | "不知道哪错了?先把数据打出来看看。" |
梯度图:从零成本到深水区
解决一个 Bug 的正确姿势不是"随便挑一个方法试试",而是从成本最低的方法开始,逐级升级。下面的梯度图帮你找到起点:
🟢 零成本区(10 秒出招,张口就来)
│
├── 1.2 直接丢错误 ← 终端有报错?先贴再说
├── 1.3 直接丢截图 ← 页面有问题?截图丢过去
└── 1.1 让 AI 自己查 ← 感觉不对劲?让它自查
│
▼ 如果没解决...
│
🟡 轻量区(花 2–5 分钟,加点引导)
│
├── 6 打印变量 ← 不知道数据在哪断了?打出来看
├── 2.1 代码审查 ← 让 AI 更大范围地通读代码
├── 2.2 查看日志 ← 加日志追踪数据流和时间线
└── 5.1 回滚代码 ← 修了半小时越来越乱?回去重来
│
▼ 如果还没解决...
│
🟠 深度区(10–30 分钟,需要方法论)
│
├── 2.3 Deep Debug ← 科学调试:假设→验证→根因→修复
├── 3 加上测试 ← 用测试锁死正确行为,防止反复
└── 5.2 完善文档后重做 ← 承认需求没写清,重新来
│
▼ 如果依然无解...
│
🔴 外援区(换思路,不换问题)
│
├── 4.1 调研最佳实践 ← 市场上别人怎么解决的?
└── 4.2 换个模型 ← 让另一个 AI 从零开始审查快速决策:看着现象找方法
不用读完整篇文档,看到什么现象,直接用对应策略:
| 你遇到了... | 第一反应 | 如果不行 |
|---|---|---|
| 终端/控制台有红色报错 | ➜ 1.2 贴错误给 AI | ➜ 2.1 代码审查 |
| 页面白屏、样式崩了、按钮不见了 | ➜ 1.3 截图丢给 AI | ➜ 6 打印变量 |
| 功能不对,但说不清哪错了 | ➜ 6 打印变量,看数据流 | ➜ 2.3 Deep Debug |
| AI 说"没问题",但你感觉不对 | ➜ 1.1 "请你更认真地查一遍" | ➜ 2.1 代码审查 |
| 同一个 Bug 修了 3 次还在 | ➜ 5.1 回滚,复盘,重做 | ➜ 5.2 完善文档重做 |
| 一个 Bug 反复出现(修好了过几天又坏) | ➜ 3 加上测试锁死 | ➜ 2.3 Deep Debug 找根因 |
| 数据算错了、金额不对、结果错误 | ➜ 6 打印变量 | ➜ 3 加上测试 |
| 环境/配置/依赖问题 | ➜ 1.2 贴错误 | ➜ 手动检查 .env 和版本 |
| 不确定自己的方案是否最优 | ➜ 4.1 调研最佳实践 | ➜ 4.2 换个模型 |
| 一个 Bug 花了 30 分钟还没头绪 | ➜ 5.1 回滚代码 | ➜ 4.2 换个模型 |
开篇:为什么调试能力是 Vibe Coder 的第一护身符
Vibe Coding 和传统编程最大的区别是:你不需要从零写每一行代码,但你依然需要面对海量的报错、意外行为和"明明感觉说清楚了但就是不对"的情况。
用数据来说话:一堂 Vibe Coder 的实际项目统计里,60%–70% 的时间不是在写功能,而是在调试。剩下那 30%–40%,才是真正"建东西"的时间。
所以这不是锦上添花的技巧,这是生存技能。
这篇文档的目标很简单:让你从"看到报错就慌"变成"看到报错就笑"——不是笑它可怕,而是笑它逃不出你的排查套路。
一、心态篇:在学方法之前,先搞定你的大脑
1.1 这五个真相,每天默念一遍
| 真相 | 一句话解释 |
|---|---|
| Vibe Coding 的日常就是报错 | 一个中等复杂度的项目,一天遇到 10–20 次报错是正常水平,不是你的问题。 |
| 报错是信息,不是审判 | 报错信息是系统在告诉你"我哪里不懂",不是在骂你"你不行"。 |
| 没有修不了的 Bug | 只要你愿意用正确的方法逐层排查,99% 的 Bug 都是可解的。 |
| 慢就是快 | 花 5 分钟系统排查,好过花 2 小时盲目乱改。快不一定对,对才是真的快。 |
| 你不需要一个人扛 | AI 是你的搭档,不是你的对手。把错误丢给它、让它帮你分析,本身就是 Vibe Coding 的工作方式。 |
1.2 调试时最容易犯的四个心态错误
恐慌模式:"完了完了,怎么又报错了"——然后开始疯狂让 AI "修一下""再修一下""不对再修一下"。结果是越修越乱。
正确做法:先停下来,读一遍报错信息。至少看懂"错在哪一行、什么类型的错误"再让 AI 动手。
甩锅模式:"这肯定是 AI 的问题"——不读报错,不分析原因,直接换模型、换提示词。
正确做法:AI 写的东西出问题,原因可能是你的需求没说清楚。先检查"我描述清楚了吗",再怀疑"AI 写错了吗"。
跳跃模式:"这里改一下试试……不行……那里改一下……还不行"——没有假设地盲目试错。
正确做法:每改一次之前,先在心里说"我怀疑问题是 X,所以我要改 Y 来验证"。如果验证失败,这条线索就排除了,换下一条。
绝望模式:"这个 Bug 修了三个小时了,我感觉自己是废物"——把技术问题上升到自我评价。
正确做法:三个小时修不好一个 Bug,在专业程序员的世界里是日常。站起来走一圈,回来从第一步重新梳理。你不是废物,你只是还没找到根因。
二、分类篇:先搞清楚你的敌人是谁
在动手之前,先学会给 Bug 分类。不同类的 Bug,排查策略完全不同。用错了方法,费时费力还没结果。
2.1 三大 Bug 类型
🟡 类型一:环境和配置问题
是什么:代码本身没问题,但运行的环境"不对"——缺依赖、版本冲突、端口被占、环境变量没配、路径写错。
典型症状:
Module not found/Cannot find modulecommand not foundport already in use.env里的变量读不到- "在我电脑上能跑,换到服务器就不行"
面对 Vibe Coding 的排查策略:
- 直接贴报错给 AI,说"帮我看看是不是环境问题"
- 让 AI 列出项目需要的依赖,逐个检查是否已安装
- 检查 Node/Python 版本是否匹配项目要求
- 检查端口占用:
lsof -i :端口号 - 检查 .env 文件是否存在、变量名是否拼写正确
最常见的坑:本地装了全局包,远程没装。或者 npm install 的时候漏了 --save。
🔵 类型二:程序和语法问题
是什么:代码写错了——语法错误、类型不匹配、引用未定义的变量、拼写错误、括号没闭合。
典型症状:
SyntaxError/Unexpected tokenTypeError: xxx is not a functionReferenceError: xxx is not defined- 代码编辑器里有红色波浪线
- 运行就崩溃,一眼能看出问题
面对 Vibe Coding 的排查策略:
- 打开 IDE 的问题面板,看红色/黄色的提示
- 直接贴报错截图给 AI,说"这行的语法有什么问题"
- 如果是 TypeScript 类型错误,让 AI"检查类型定义和传参是否匹配"
- 让 AI 对比报错行和附近的代码,检查是否有拼写错误或遗漏的括号
最常见的坑:复制粘贴代码时漏了一个括号、单引号和双引号混用、变量名多打了一个字母。
🔴 类型三:逻辑和缺陷问题
是什么:代码语法正确、能跑起来,但行为不对——结果算错了、条件判断漏了、边界情况没处理、数据流转断了。
典型症状:
- 页面能打开,但数据显示为空或错误
- 点击按钮没反应,或者反应不对
- 某个功能"有时好有时坏"
- 数据存到数据库了,但内容和预期不一样
- 没有报错,但结果明显不对
面对 Vibe Coding 的排查策略:
- 先复现:精确描述"做了什么操作、期望看到什么、实际看到什么"
- 加日志打印关键变量:在怀疑的代码路径上加
console.log - 让 AI 做代码审查:让 AI 从入口到出口通读一遍数据流转
- 写测试用例:用测试框住预期行为,让 AI 在测试框架下修复
最常见的坑:异步操作的顺序问题(A 还没返回,B 就用上了 A 的结果);空值和 undefined 的边界处理;数组索引从 0 开始的认知偏差。
2.2 快速分类判断表
下次遇到 Bug,先花 10 秒问自己三个问题:
| 判断问题 | 如果是 → 类型 | 优先用什么方法 |
|---|---|---|
| 代码能跑起来吗? | 不能 → 🟡环境或🔵语法 | 贴报错给 AI |
| 报错信息清楚吗? | 清楚 → 🔵语法 | IDE 问题面板 |
| 能跑但结果不对? | 是 → 🔴逻辑 | 加日志 + 写测试 |
三、Vibe Coding 十大调试策略(一堂实战版)
以下策略不是"选一个用",而是"按顺序用"——先低成本排查,再逐步深入。就像探案:先看监控,再问证人,最后才动现场。
策略一:让 AI 自己检查 —— 最低成本的"自愈"
这是 Vibe Coding 最独特、最省力的调试方法。你不用懂技术细节,只需要学会"怎么说"。
1.1 让它自己查
核心话术:不用描述 Bug 是什么,直接让 AI 自查。
一句话版 → "你检查一下代码,看看有没有问题"
认真版 → "你认真看一遍所有文件,看看有没有写错的地方,有的话直接改掉"
刨根问底版 → "你把整个项目从头到尾仔细看一遍,一个文件一个文件看,逻辑对不对、有没有漏掉的情况、该处理的特殊情况处理了没,有问题全改掉"为什么有效:AI 在生成代码时可能"注意力分散",让它重新审视一遍自己的产出,往往能发现 70% 以上的表面问题。
经验:
- 加上"认真""精细""逐一"这样的副词,效果显著提升——这会让 AI 进入更仔细的检查模式
- 对于超过 300 行的项目,让 AI "按文件逐个检查",而不是一次全看
- 如果 AI 说"没发现问题"但实际有问题,换到策略二的"深度检查"
适用场景:
- 刚写完一段代码,不确定有没有低级错误
- 修改了一个地方,担心影响其他地方
- 代码能跑但感觉"不干净"
1.2 直接丢错误
核心话术:把终端里的报错信息完整复制给 AI。
一句话版 → "报了这个错:[粘贴]"
加前因版 → "我跑项目的时候报了这个错:[粘贴],你帮我看看哪出问题了,直接修掉"
带上下文版 → "[粘贴] 我是做了 X 操作之后报的错。帮我搞清楚到底是哪的事,然后把有关的代码都查一遍,修掉"为什么有效:报错信息里通常包含了"错误类型 + 出错位置 + 调用栈",AI 看到这些信息能快速定位。
关键点:
- 不要筛选报错,完整的调用栈(Stack Trace)最有价值
- 告诉 AI 你做了什么操作,帮助它复现上下文
- 如果错误太长,至少保留"第一行的错误类型"和"最后几行的位置信息"
适用场景:
- 终端/控制台有明显的红色报错
- 代码编译失败
- 接口返回非预期状态码(404/500 等)
1.3 直接丢截图
核心话术:截图 + 一句话描述。
一句话版 → "[截图] 这个问题怎么修?"
带指引版 → "[截图] 你看控制台这个报错,帮我看看是哪的事"
沉着冷静版 → "[截图] 页面白屏了,控制台报这堆东西。你先帮我猜猜可能是哪几种原因,然后一步一步试,试一步确认没问题了再往下走"为什么有效:有些错误发生在浏览器 UI 层面——页面布局错乱、按钮不见了、样式崩了——文字描述很难说清楚,截图是最直接的方式。
适用场景:
- 页面显示异常(但控制台无报错)
- 浏览器 DevTools 的网络面板/控制台截图
- 移动端适配问题
- UI 组件的视觉 Bug
策略二:深度检查 —— 当"自愈"不够时的升级打法
如果策略一(让 AI 自查)没解决问题,说明这个 Bug 不是表面问题,需要系统性地排查。
2.1 代码审查:让 AI 帮你从头到尾看一遍
核心思路:不让 AI 只看报错的那一行,而是让它通读整个模块的代码逻辑。
话术模板:
第一步:框定范围
"帮我看看 [文件名/功能模块] 这段代码写得怎么样,重点帮我盯一下 [你怀疑的方向]"
第二步:系统检查
"帮我从这几个角度看看有没有问题:
1. 数据怎么走的:从哪进来的、中间怎么处理的、最后输出啥
2. 漏没漏检查:该判空的地方判了没、该兜住的特殊情况兜了没
3. 边边角角:数据为空的时候、没值的时候、各种意外情况,都处理了吗
4. 调用关系:这段代码用了哪些别的地方的东西、传过来的格式对不对得上"
第三步:找到问题
"帮我找出至少 3 个可能有问题的地方,严重的直接帮我改掉"为什么有效:很多 Bug 不是"代码写错了",而是"不同模块之间的约定不一致"。A 模块返回的是数组,B 模块以为返回的是对象——两个模块单独看都没错,放一起就崩了。代码审查能发现这种"模块间的误会"。
适用场景:
- Bug 能稳定复现但报错位置不明确
- 多个功能之间有数据依赖
- 重构后出现了新问题
2.2 查看日志:让系统自己说出真相
核心思路:在关键节点加日志,让 AI 帮你分析日志。
话术模板:
第一轮:加日志
"帮我在几个重要的地方加上 console.log,打印出 [变量名] 的值,标清楚是从哪打印的"
第二轮:跑一遍
(运行项目,触发 Bug,把日志输出贴给 AI)
第三轮:分析日志
"这是跑出来的日志,你帮我看看数据走到哪一步出问题了。重点看 [你怀疑的地方]"实战案例:
# 假设一个"用户登录后看不到数据"的 Bug
你让 AI 加日志:
- 登录成功后 → 打印 "登录成功,user_id: xxx"
- 请求数据前 → 打印 "请求数据,token: xxx"
- 收到响应后 → 打印 "收到响应,status: xxx, data: xxx"
日志输出:
登录成功,user_id: 123
请求数据,token: undefined ← 这里断了!
收到响应,status: 401, data: null
一目了然:token 丢了,所以请求被拒绝。适用场景:
- 数据流转问题("数据去哪了")
- 异步操作顺序问题
- 接口调了但不知道请求是否成功
2.3 Deep Debug:科学调试法 —— 像侦探一样破案
这是最高阶的调试方法,也是专业程序员和"乱改党"的分水岭。它来自一堂核心技术资产——科学调试技能(Deep Debug Skill),核心理念只有一句话:
你观察系统的次数越多,修改系统的次数就越少。
直觉式调试和科学式调试的区别:
❌ 直觉式:看到问题 → 快速猜测 → 修改代码 → 祈祷有效
✅ 科学式:看到问题 → 提出假设 → 交叉验证 → 确认根因 → 最小化修复直觉式调试之所以会失败,是因为人类在调试时有五种认知偏差:
| 偏差 | 表现 | 怎么破 |
|---|---|---|
| 首因效应 | 第一个想到的原因就死磕不放 | 动手前列出至少 5 个可能的假设 |
| 确认偏差 | 只看支持自己猜想的证据 | 主动找"反驳自己"的证据 |
| 沉没成本 | 已经花了 2 小时,必须走到底 | 提前设好验证标准,不通过就换路 |
| 修改偏见 | 第一反应就是改代码 | 先用日志、历史记录、静态分析做观察 |
| 局部最优 | 修复了表面现象,根因还在 | 连问 5 次"为什么" |
六步科学调试法:
第 1 步:定义问题(5W 框架)
不要模糊地说"有问题",要用 5 个 W 精确描述:
| W | 要回答的问题 | 示例 |
|---|---|---|
| What | 什么现象? | "点击提交按钮后页面白屏" |
| When | 何时发生? | "每次提交都发生,还是第一次正常第二次崩溃?" |
| Where | 在哪里发生? | "本地正常,部署到 Vercel 后崩溃" |
| Who | 谁受影响? | "所有用户还是只有特定账号?" |
| How | 如何触发? | "填写表单 → 点击提交 → 白屏,精确到每一步" |
关键原则:量化描述。 不要说"很慢",要说"页面加载需要 5 秒,预期 1 秒"。不要说"数据不对",要说"字段 X 显示 null,预期显示字符串"。
第 2 步:生成假设(不少于 5 个)
把可能的原因分成六类,逐个生成假设:
问题现象:表单提交后白屏
│
├─ 数据流假设:提交的数据格式和后端要求的不匹配
├─ 控制流假设:提交后触发了某个未处理的异常分支
├─ 时序假设:异步请求还没返回,后续代码就开始执行了
├─ 依赖假设:某个第三方库版本更新导致兼容性问题
├─ 资源假设:API 接口限流或超时
└─ 环境假设:生产环境的环境变量和本地不一致生成假设的两个技巧:
-
5 Why 追问:从现象一层层往下问
症状:表单提交后白屏 Why 1? → API 返回了错误 Why 2? → 请求的 Content-Type 不对 Why 3? → 用了 FormData 但后端期望 JSON Why 4? → 一开始没约定好数据格式 Why 5? → 需求文档里没写接口规范 -
逆向思考:问"什么情况下 Bug 不会出现?"
正常:本地开发环境 OK,线上失败 → 怀疑环境差异 正常:旧数据 OK,新数据失败 → 怀疑数据格式变化 正常:单个请求 OK,连续请求失败 → 怀疑状态未重置
第 3 步:优先级排序
不是所有假设都值得先验证。按两个维度排:
高影响 ┃ H1(立即验证)┃ H2(尽快验证)┃
┃ 可验证性高 ┃ 可验证性低 ┃
━━━━━━━━━━━━╋━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━╋
低影响 ┃ H4(有空再验)┃ H3(标记观察)┃
┃ 可验证性高 ┃ 可验证性低 ┃优先验证"高影响 + 高可验证性"的假设——能用日志或 Git 历史就能验证的,不要先去改代码。
第 4 步:交叉验证(最关键的一步)
核心原则:单一证据可能误导你,至少用 3 种不同的方法交叉验证同一个假设。
只有日志 → 可能日志本身写错了
只有代码 → 可能代码有误导性
日志 + 代码 + Git 历史 → 三条独立线索指向同一个结论,信心大增四种验证方法:
| 方法 | 具体操作 | Vibe Coding 话术 |
|---|---|---|
| 时间线分析 | 用 Git 看最近改了什么 | "帮我看看最近几天改了哪些代码,哪次改动可能跟这个 Bug 有关" |
| 日志模式识别 | 分析日志的时间和频率规律 | "帮我把报错日志按时间排一下,看看有没有什么规律" |
| 静态代码分析 | 画出函数调用链 | "帮我画一下从用户点按钮到最后数据回来,中间经过了哪些步骤" |
| 数据状态验证 | 检查数据库/存储中的数据 | "帮我写个查询,看看数据库里有没有不对劲的数据" |
第 5 步:确认根因
不要停在"直接原因",要追问到"根本原因":
症状:页面白屏
↓
直接原因:API 返回 500 错误
↓
根本原因:数据库连接池耗尽
↓
深层原因:没有配置连接超时和重试机制只修复"直接原因"(比如加个 try-catch 把错误吃掉),问题还会以另一种方式出现。修到"根本原因",同类问题才不会再犯。
第 6 步:最小化修复
修复的范围要精确匹配问题的范围:
| 原则 | 说明 |
|---|---|
| 精确匹配 | 改一个函数能解决的,不要改整个模块 |
| 可逆性 | 用 Git commit 保留回滚点,修坏了能秒回 |
| 添加防护 | 修完 bug 顺手加一行日志或断言,下次再出问题秒定位 |
| 测试覆盖 | 先写一个能复现 Bug 的测试用例,修完验证测试通过 |
Vibe Coding 话术:
"问题终于找到了,就是 [X] 的问题。现在帮我改 [文件名] 里的 [具体位置],只改这一个地方,别的文件都别动。改完之后帮我按原来出错的操作步骤再试一遍,看看还有没有问题。"独立技能文件:Deep Debug 的完整方法论也保存为独立技能文件,可直接导入支持 Skill 的工具(如 WorkBuddy、Claude Code)中使用。源码仓库中的文件位于
docs/reference/SKILL:科学调试DeepDebug_SKILL.md。
策略三:加上测试 —— 让 Bug 无处可逃
核心思路:与其修完 Bug 再验证"好了没有",不如先用测试把"什么是正确的"定义清楚。
话术模板:
一句话版 → "帮我给这个功能写个测试,看看它跑得对不对"
加场景版 → "帮我把这个页面的主要功能都写成测试,正常情况跑一遍、出问题的情况也跑一遍"
锁死版 → "先帮我写个测试证明这个 Bug 真的存在(让它跑失败),然后我再让你修代码,修完之后再跑一次测试看看通过没。修完了再多补几个测试,把各种可能出错的情况都兜住,防止下次再坏"什么时候必须加测试:
- 一个 Bug 修了两次以上还反复出现
- 修改了一个被多处调用的核心函数
- 上线前做最后检查
- 数据计算逻辑(金额、库存、权限等关键业务)
- 异步流程(登录、支付、文件上传等)
对 Vibe Coder 来说,测试最重要的价值是:告诉 AI"不改这个功能也能通过",避免 AI 在修一个 Bug 时破坏了另一个功能。
策略四:外部支持 —— 当一个人的智慧不够用时
4.1 调研最佳实践
核心思路:你遇到的问题,大概率已经有人解决过了。让 AI 帮你调研。
话术模板:
第一步:看看别人咋做的
"帮我搜一下,别人遇到 [这个问题] 都是怎么解决的?找 2-3 种常见的方法,跟我说说哪种好哪种不好"
第二步:找现成的
"有没有人类似的问题已经解决了?帮我找来参考参考"
第三步:定方案
"我是做 [什么样的项目],你觉得刚才那些方法里,哪种最适合我?为什么?"适用场景:
- 遇到一个从未见过的问题类型
- 不确定自己的方案是不是最优解
- 想确认"是不是有更简单的办法"
4.2 换个模型帮忙
核心思路:不同的 AI 模型有不同的"思维方式"。当一个模型反复陷入同一个错误时,换一个模型可能一眼就看出问题。
使用方法:
- Claude / GPT 擅长代码推理和架构设计 → 适合做代码审查和逻辑分析
- Gemini 有超长上下文 → 适合审查跨多个文件的大型项目
- 不同的 Agent 有不同的工具配置和审查角度 → 适合交叉验证
话术模板:
"这个 Bug 我已经让别的 AI 修了 3 次了都没搞定。你帮我重新看看这代码,别管之前怎么修的,就当第一次见,从头帮我找找问题到底在哪。"重要提示:换模型不是为了"找一个能猜对的",而是为了获得不同角度的分析。最终还是要你自己理解问题并确认修复方案。
策略五:回滚重做 —— 有时候后退才是前进
5.1 回滚代码
核心思路:当你发现自己在一个 Bug 上花了 30 分钟以上、改了好几次但越来越乱——立刻回滚。
话术模板:
第一步:退回去
"把我代码退回到 [上次正常能跑的时候],不要现在的改动"
第二步:复盘
"帮我看看从那次到现在我们都改了啥?哪些改动可能导致现在的问题?"
第三步:重新来
"行,咱们重新来。这次慢一点,改一步就试一步,确认没问题了再改下一步"什么时候必须回滚:
- 已经连续修了 30 分钟以上还没好
- 修了一个 Bug 又冒出 3 个新 Bug
- 不确定哪个改动导致了当前状态
- 感觉代码"越来越乱了"
Vibe Coding 的回滚优势:和传统编程不同,Vibe Coding 重新生成的成本极低。如果一段代码修了 3 次还不行,让 AI 根据原始需求重新生成,往往比反复修补更高效。
5.2 完善文档后重做
核心思路:很多 Bug 的根因不在代码,而在"一开始就没说清楚"。停下来,把需求、接口、数据流重新梳理清楚,然后让 AI 基于清晰的文档重新实现。
话术模板:
第一步:承认问题
"这段代码改来改去都不对,我怀疑是我一开始就没说清楚到底要做什么"
第二步:重新说清楚
"帮我重新理一下这个功能到底要干嘛,说清楚:
- 用户怎么操作的(先干嘛、再干嘛、最后看到什么)
- 数据怎么走的(前端传什么、后端处理成什么、最终存成什么)
- 各种意外怎么办(网断了咋办、数据是空的咋办、用户连点两下咋办)
- 前后端怎么传数据(用什么方式、传什么参数、返回什么结果)"
第三步:重做
"好了,就按刚才写清楚的这个要求,帮我重新做一遍。别自己发挥,就按这个来。"适用场景:
- 一个功能反复修改,每次都觉得"快好了",每次都发现新问题
- 需求本身很模糊,"做一个好看的页面"这种级别的描述
- 多个模块之间的数据约定不一致
策略六:打印变量 —— 最简单的万能方法
核心思路:当一切分析都模糊不清时,回到最朴素的方法——把数据打出来看。
话术模板:
第一轮:加打印
"帮我在下面这些位置各加一行 console.log:
- 每个函数刚开始的地方:把所有传进来的值打印出来
- 每个 if/else 里面:打印一下进了哪个分支
- 数据改完之后:打印改之前和改之后的值
- 每个函数最后 return 之前:打印最终要返回的值"
第二轮:跑一遍,贴给 AI
"这是代码跑出来打印的东西:
[粘贴输出]
你帮我看看哪个地方的数值不对"
第三轮:修
"问题出在 [这个地方],帮我修一下"真实案例:一个同学做一个购物车功能,发现结算金额永远是 0。让 AI 加了几个 console.log,发现是"商品价格从后端返回的是字符串 "99",前端做加法时变成了字符串拼接而不是数字相加"。一行打印,一秒定位。
适用场景:
- 一个"万能方法",几乎所有 Bug 排查都可以先加打印试试
- 数据相关的 Bug(金额、数量、状态)
- 不确定代码是否执行到了某个分支
- 条件判断的走向不明
四、调试策略速查表
当你遇到 Bug 不知道怎么开始时,按这个表走:
| 你看到的现象 | 先用哪个策略 | 不行再用哪个 |
|---|---|---|
| 终端/控制台有明确报错 | 策略 1.2:直接丢错误 | 策略 2.1:代码审查 |
| 页面显示异常但没报错 | 策略 1.3:直接丢截图 | 策略 6:打印变量 |
| 功能行为不对,说不清哪错了 | 策略 6:打印变量 | 策略 2.3:Deep Debug |
| AI 自查说"没问题"但你感觉不对 | 策略 1.1:让它更认真查 | 策略 2.1:代码审查 |
| 修了 3 次还没好 | 策略 5.1:回滚代码 | 策略 5.2:完善文档重做 |
| 不确定是不是自己的方案有问题 | 策略 4.1:调研最佳实践 | 策略 4.2:换个模型 |
| 一个 Bug 反复出现 | 策略 3:加上测试 | 策略 2.3:Deep Debug |
| 数据对不上、计算结果错误 | 策略 6:打印变量 | 策略 3:加上测试 |
| 环境/配置/部署问题 | 策略 1.2:丢错误 | 手动检查 env 和依赖 |
五、调试报告模板
当你需要和其他人(或未来的自己)沟通一个 Bug 时,用这个模板:
## Bug 报告: [一句话描述]
### 1. 问题定义
- **时间**:YYYY-MM-DD HH:mm
- **环境**:本地开发 / 测试环境 / 线上生产
- **症状**:[量化的问题描述,如"页面加载 8 秒 vs 预期 1 秒"]
- **复现步骤**:
1. 打开 [页面/功能]
2. 执行 [操作]
3. 观察 [实际结果 vs 预期结果]
### 2. 排查过程
- H1:[假设 1] → [验证方法] → ❌ 排除 / ✅ 确认
- H2:[假设 2] → [验证方法] → ❌ 排除 / ✅ 确认
- H3:[假设 3] → [验证方法] → ❌ 排除 / ✅ 确认
### 3. 根因
- 症状:[表面现象]
- 直接原因:[什么代码/配置出了问题]
- 根本原因:[为什么这个代码/配置会出问题]
### 4. 修复
- **改了什么**:[文件 + 行号 + 具体变更]
- **为什么这样改**:[逻辑说明]
- **测试验证**:[如何验证修复有效]
### 5. 预防
- **同类问题如何避免**:[加测试?加日志?改流程?]六、总结:记住这五句话就够了
- 遇到报错先别慌——贴完整的报错信息给 AI,让 AI 先自查,这是 Vibe Coding 的第一反应。
- 说不清的 Bug 先加日志——把关键数据打印出来,让数据替你说话。
- 修了 3 次没好就回滚——不要在不理解问题的情况下反复修补,重新来往往更快。
- 复杂的 Bug 用 Deep Debug——先假设、再验证、确认根因后再下手修,不要猜。
- 修完 Bug 加测试——今天修好了不代表以后不会再犯,用测试把正确行为锁死。
最后想说的:调试不是编程的"副作用",它是编程本身。每一个你修掉的 Bug,都是你对系统理解加深一步的证据。Vibe Coding 给了你 AI 这个搭档,也给了你前所未有的排查效率。学会调试,你就真正拥有了"做出任何东西"的能力。