第二篇 · 与 AI 协作 / 第 5 章
五个核心习惯
五个习惯,每一个都对应一个你正在踩的坑。 第 4 章解释了 AI 为什么会变笨;这一章给你五个具体动作,按一件事从开始到做完的顺序排列。
读完这一章,你能
- 用“先不要写代码,一次问一个问题”把模糊需求问成一份清单;
- 把“加一个登录功能”切成 4 个每一步都能亲手验证的小片;
- 在换任务时写出一份交接摘要,并在新会话里先复述再动手。
午饭登记 · 当前状态:还没开始做
- 必读:习惯一、二——先让它问清楚,再把任务切小。
- 必读:习惯三、四——换任务就交接,先定义“完成”再验收。
- 必读:习惯五——让一个干净的会话专门挑错。
- 可选如果你用 Claude Code:
/compact、/clear、/handoff三个命令。
| # | 习惯 | 解决的问题 |
|---|---|---|
| 1 | 让它先问你 | 做出来的东西不是你要的 |
| 2 | 一次只做一小片 | 一口气写一大堆,最后全是错 |
| 3 | 一个会话一件事 | 聊久了它变笨、开始乱改 |
| 4 | 定义清楚「完成」 | 它说做完了,你没法验收 |
| 5 | 让 AI 审 AI | 你没法判断代码质量 |
让它先问你,别急着让它做
症状
你说"帮我做一个记账的小工具"。十分钟后它交给你一个东西—— 有分类、有图表、有导出、还能多人共享。做得很漂亮。 但你其实只想要一个能记下"今天花了多少钱"的输入框。
你想说"不是这样的",但又觉得"都做出来了,凑合用吧"。或者更糟:你说"不是这样的", 它又猜了一个方向,还是不对。
为什么会这样
因为你自己也没想清楚。这不怪你——人本来就是看到具体东西才知道自己要什么。 有句话说得很好:在亲眼看到之前,没有人真正知道自己想要什么。
所以问题不在"你没说清楚",而在顺序错了: 你说 → 它做 → 你判断,这条路注定要返工。 正确的顺序是:你先被问 → 你想清楚了 → 它再做。
怎么做:把问题倒过来
不要让 AI 直接干活。开场就要求它反过来问你问题—— 一次问一个,你答完它再问下一个,直到它觉得没有歧义了才动手。
这听着简单,但效果非常夸张。它逼着你在动手之前把脑子里模糊的地方一个个想清楚, 而这些地方,正是你后面会返工的地方。
我想做一个 XXX。你先不要写任何代码。 请你像面试官一样,一个问题一个问题地问我,直到你完全清楚我要什么。 一次只问一个问题,问完等我回答。
- 「先不要写代码」——不说这句,它会一边问一边偷偷写,你就被带跑了。
- 「一次只问一个问题」——不说这句,它会一口气甩 15 个问题给你,你根本答不完, 最后随便糊几句过去,等于没问。
- 「问完等我回答」——不说这句,它会自问自答。
它该问出什么来
如果它问得好,你会听到这类问题——这些问题本身就是价值:
- "这个东西是给谁用的?只有你自己,还是别人也要用?"
- "数据要存在哪?关掉再打开,之前记的东西要还在吗?"
- "如果用户填了一个空的数字,你希望怎么处理?"
- "你说的『分类』,是固定的几个选项,还是可以自己加?"
每个问题都在替你消掉一个模糊地带。这一轮问完,你脑子里那个东西才第一次真正成形。
问完这一轮,把答案整理成一小段文字,让 AI 存成一个文件(比如叫
spec.md)。
这样下次开新对话,你把它一贴,就不用从头再问一遍了——这正好配合习惯三。
一次只做一小片,做完立刻验证
症状
你说"帮我加一个登录功能"。然后它一口气写了十几个文件:界面、后端接口、数据库表、 密码加密、错误提示、记住登录状态……写完之后你点了一下,崩了。
先把这句话翻译成人话:登录看起来只是两个输入框,背后却要查数据库 (去存用户资料的表里找这个人)、核对密码(而且密码不能原样保存, 要先加密成别人看不懂的样子),还要记住你登录过。任何一环没接好,整个功能都会崩。
然后就是长达数小时的折磨:它改一个地方,另一个地方又崩。你越来越怀疑自己是不是太笨。
为什么会这样
因为 AI 有一个很强的本能:想一次给你一个"完成的方案"。 它脑子里有一个"已经写好的登录功能"的样子,于是一跃把全部写出来, 中间从没验证过任何一个假设。
结果就是:十几个文件里可能有五处假设是错的(你的数据库字段名不一样、你的 项目用的是另一种写法……)。五处错误同时存在, 它们还会互相影响,你根本不知道该从哪查起。
这个毛病有个很形象的说法——开出了车灯照射范围。车灯只能照到前面五十米,它却按一百五十米的速度往前冲。
怎么做:切一小条纵贯线
不要"横向地一层层建",要"纵向地切一小条"。
"一小片"的标准是:窄到可以一次做完,但完整到能亲手跑一遍看见结果。
还是用登录举例,一个好切法是这样的:
-
先做一个假的输入框
只有两个框和一个按钮。点按钮,屏幕上弹一句"你输入了 xxx"。跑一遍,对了。
-
再把"点按钮"接到一个固定的判断上
写死一个用户名密码,输对了就跳转。跑一遍,对了。
-
再把判断接到真实的数据库
现在真的去查了。跑一遍,对了。
-
最后才加加密、错误提示、记住登录
一次加一个,每加一个跑一遍。
看出区别了吗?每一步都是完整的(能点、有反应), 但每一步都很小(出错范围一目了然)。 而且从第 1 步开始,你就已经能看到东西了——不用等到最后。
我们来做 XXX。但不要一次做完。 先只做最小的一小片——小到能立刻跑起来看到效果,但要从头贯穿到尾。 做完停下来,告诉我该怎么验证,等我确认了再做下一片。
这叫曳光弹(tracer bullet)。军用术语——子弹里带一点发光剂, 打出去能看见弹道,你就知道有没有打偏。 先打一发看得见的,再决定往哪儿打。
现在就把“做一个午饭登记”切成三片,每片写一句“我怎么亲手验证它成了”。 如果你切不出三片,或者某一片没法单独验证,说明切得还不够小。
一个会话只干一件事,到点就重开
症状
你在同一个对话里,连着干了三件事:先修了个小 bug,然后加了个新功能,接着想让它美化一下界面。 第三件事的时候,它开始不对劲了——改这儿坏那儿,你说过的要求它当没听见。
为什么会这样
回到第 4 章那张图:上下文是张工作台,只会越来越满。 你做的前两件事并没有"结束",它们还堆在桌上。 到第三件事时,它要在两千字的混乱里找你的要求——找不到很正常。
怎么做:把「开新对话」当成一个正常动作
判断标准很简单:一件事做完、要开始另一件事了,就开新会话。
而上一件事的结论不会丢——你要做的只是交接:
-
让它写一份交接说明
在旧会话结束前,让它总结:我们做了什么、改过哪些文件、还有什么没做、下一步该干嘛。
-
把这份说明存成文件
比如叫
进度.md。存在项目里,新会话能直接读到。 -
开新会话,先让它读这份说明
新会话是张干净的桌子,然后你把这一份必要的东西放上去。不多不少。
我们这一轮先到这里。请写一份交接说明,包含: 我们做了什么、改了哪些文件、哪些地方还没完成、下一步建议做什么。 写成一个文件存下来,方便我在新对话里继续。
请先读一下 进度.md,然后告诉我你理解的现状。
先不要动手改任何东西,等我确认你理解对了再说。
三种「清桌子」的力度
| 做法 | 效果 | 什么时候用 |
|---|---|---|
| 压缩 | 把前面的对话压成一份摘要,保留大意 | 同一件事还没做完,但聊太久了。可以无缝继续 |
| 清空 | 丢掉全部对话,桌子清空,但东西还在项目里 | 要换一件事做了。最推荐,也最容易被忽略 |
| 重开 | 新开一个会话,从一份交接文档重新起步 | 已经乱到没法救,或者它开始反复犯同一个错 |
感觉不对劲的时候,与其继续解释,不如重开。
解释一遍 = 往满桌子上再放一张纸。而重开 + 贴一份干净的需求 = 换一张新桌子。 后者几乎总是更快,哪怕看起来更麻烦。 大部分新手会本能地选择前者,然后在同一个坑里耗掉一下午。
压缩:把前面的对话压成一份摘要,保留大意。 清空:丢掉全部对话,但项目里的文件还在。 重开:新开一个会话,从一份交接文档重新起步。
名字和按钮因工具而异,但你真正要做的判断只有一句: 这件事还没完、只是聊太久了,就压缩;要换事了,就清空或重开。
如果你用 Claude Code:三个命令分别对应哪一种可选
压缩是 /compact,清空是 /clear,
重开那一步可以借助 /handoff——它把你手上还没落地的工作打包成一份能带走的文件。
容易搞反的地方:/handoff 不是“会话总结”。
只有工作要出门时才需要写文件——换工具、换目录、交给同事。
同一个工具里接着干,/compact 就够了。
三者更细的分工见技能档案 · 会话管理。 不用 Claude Code 的读者可以跳过这一框,上面的三种动作照样适用。
把「完成」定义清楚,然后亲手跑一遍
症状
AI 说"已经完成,现在登录功能可以正常工作了"。你打开一看,好像是有个登录框。 但你不确定它到底做完了没有——万一点下去报错呢?万一密码根本没验证呢?
为什么会这样
两个原因叠在一起:
- 它说的"完成"是个模糊概念。它写的代码确实写完了,但不等于你要的功能实现了。
- "验证"这一步被默认交给了读代码。而你不读代码——于是验证这一环直接消失了。
怎么做:开工前先定标准
在让它动手之前,先让它说清楚"怎么样算做完了"。 这个标准要具体到你能亲手试。
不是标准
"登录功能做好了"
"代码已经更新"
"应该没问题了"
↑ 这些你都无法验证,只能选择相信
是标准
"打开页面能看到用户名和密码两个框"
"输错密码会显示红色提示"
"输对了会跳到首页,且右上角显示我的名字"
↑ 每条你都能亲手试一遍
动手之前,先告诉我怎么验证它做完了。 请给我一份清单,每条都是我能亲手点一遍就能确认的,比如"点这里应该看到什么"。 然后你再开始做。
做完之后,就照这份清单一条条点一遍。你是用户,用户验收的就是行为。
如果每加一个功能,你都要把之前所有清单重试一遍,那太累了。 你可以让 AI 把这份清单写成自动检查(行话叫"测试")—— 也就是一段能自己运行的代码,跑一遍就把清单全过一遍,告诉你哪条挂了。
这样一来,每改一次代码,你只要敲一个命令,几十秒就知道有没有碰坏东西。 这是从"能用"走向"敢一直改下去"的关键一步。
还要加一步:存档
每次你确认"现在是对的",立刻存个档(第 3 章讲的 Git 提交)。 这样接下来无论 AI 怎么改,你都有一个确定的退路。
这个版本我验证过了,没问题。请帮我提交一次存档, 备注写清楚这次做了什么。
没有存档,你就不敢让 AI 大改——因为改坏了回不来。 于是你只敢让它小修小补,项目慢慢僵死。 存档不是什么程序员的形式主义,它是你敢放手让 AI 干活的底气。
让 AI 审 AI
症状
你隐约觉得不太对:这个项目里好像存了密码、有些地方一改就崩、 代码文件越来越多你完全不知道哪个是干嘛的。 但你既看不懂代码,也不知道该问谁。
为什么会这样
回到第 1 章那张图:代码质量是你不该亲自判断的事。 但"不该你判断"不等于"没人判断"——否则问题就会一直积压,直到某天爆发。
解决办法很巧妙:换一个 AI 来审。
怎么做:开一个干净的会话专门挑错
你现在是代码审查员,不是开发人员。
请仔细看一下 XXX 这部分代码,从这几个角度挑问题:
- 有没有安全问题(比如密码、密钥被写死在代码里)
- 有没有明显的 bug 或没处理的边界情况
- 有没有哪部分写得特别乱、以后很难改
请直接指出问题,不要先肯定我。 如果确实没什么问题,再告诉我为什么。
- 换个新会话。用刚干完活的那个会话去审查,等于让当事人自己当法官。
- 明确禁止它先夸你。AI 天生爱说"做得很好!不过……"。 说一句"直接说问题",能挤出不少真话。
- 按角度分批审。一次只问"安全",下一次只问"有没有 bug"。 一起问,它会每个角度都浅浅说两句糊弄过去。
审查出来的问题,不要就地修——把它当成新的小任务, 回到习惯二,一片一片来。
三句话带走
- 先让它问你,再让它动手;顺序对了,返工就少了一半。
- 一次只做一小片,每片都要能亲手跑一遍;换任务就先交接,再开新会话。
- “完成”必须是你验证得了的行为;代码质量交给另一个干净的会话去审。
五段完整话术、危险信号清单和开工前自查,都收在 第 10 章 · 工具箱,这里只留一张骨架表。
| 习惯 | 一句话 |
|---|---|
| 1. 让它先问你 | 动手前把模糊的地方问清楚 |
| 2. 一次只做一小片 | 窄到能一次做完,完整到能跑起来看到 |
| 3. 一个会话一件事 | 换任务就重开,先写交接文档 |
| 4. 定义清楚「完成」 | 先拿到一份你能亲手验证的清单 |
| 5. 让 AI 审 AI | 开个干净的会话,专门挑错 |
它们全都在做同一件事:把大而模糊的东西,切成小而确定的东西。
需求大而模糊 → 用提问切小;任务大而模糊 → 用曳光弹切小; 对话长而模糊 → 用重开切小;验收标准模糊 → 用清单切小; 质量判断模糊 → 交给一个专门的审查者。
自测:三个问题
你说“帮我做一个记账工具”,AI 立刻开始写代码。你漏了哪一句?
漏了“先不要写任何代码”,以及“一次只问一个问题、问完等我回答”。 没有这三句,它会一边问一边猜,最后还是按它自己的想象做。
“加一个登录功能”该怎么切成第一片?
先只做两个输入框和一个按钮,点按钮显示“你输入了 xxx”。 这一片窄到一次做完,又完整到你能亲手点一遍;验证通过后再接判断、数据库和加密。
它说“已经完成,可以正常登录了”。你下一步做什么?
先要一份你能亲手点的验收清单,再照着一条条试:输错有没有提示、输对能不能进、刷新后还在不在。 不要用“它说完成了”代替你自己的验证。
动手 10 分钟
挑一件你最近想让 AI 做的小事,按顺序写三句话:
- “先不要写代码,像面试官一样一次问我一个问题。”
- “做完第一小片就停下,告诉我怎么亲手验证。”
- “验证通过后,帮我提交一次存档,再写一份交接摘要。”
把这三句真的发出去,观察它有没有照做。没照做的地方,就是你下次要补的限定。
如果你看到 X,大概率是 Y
- 它一口气问了你 15 个问题 → 你漏了“一次只问一个”。补上这句,重来。
- 它改一处、坏三处 → 这一片切得太大了。退回存档,切小重做。
- 同一句话你说了三遍它还在犯 → 桌子满了,不是你没说清。写交接、开新会话。
- 它说“应该没问题了” → 它自己也没验证过。要一份你能亲手点的清单。