第三篇 · 做出东西 / 第 6 章

完整实战流程

为什么刷新一下,刚填的东西就没了?因为页面只是页面,数据没有真正写进服务器。 这一章用午饭登记把“从想法到收尾”的 1–7 步走一遍。

预计阅读
30 分钟
前置
第 5 章
关键词
流程、切片、验证

读完这一章,你能

  • 用 1–7 说出一次项目从想法到收尾要经过哪些步;
  • 照着实录完成午饭登记的“登记 → 刷新还在 → 删除”闭环;
  • 判断什么时候该停下验证、什么时候该退回上一个存档。

午饭登记 · 当前状态:只有页面,刷新就丢

本章地图
  • 必读:流程总图,以及“简化版 1–7”和“完整版七阶段”的对照。
  • 必读:午饭登记完整实录,重点看每一步为什么停下来验证。
  • 必读:简化版第 1–2 步、第 3–5 步的循环、第 6–7 步收尾的摘要;详细操作分别在第 7、8 章。
  • 可选以后再看:工具选择与安装,用普通聊天框也能走完这一章。

流程总图

整件事只有两部分:开始前只做一次的准备,和不断转圈的主体。 下面用 1–7 给简化流程编号,完整版有另一套编号,两者在下一节对照。

开始前 · 只做一次 1 想清楚 2 定验收标准 3 做一小片 4 亲手跑 5 存档 重复 每一小片都转一圈 全部做完后 · 只做一次 6 让 AI 审 AI 7 写交接文档 真正花时间的是中间那个圈——转得越多次,项目长得越好
1、2、6、7 只做一次,3、4、5 要转很多圈。 新手最常见的错误,是想用一圈解决全部问题。

简化版 1–7 与完整版七阶段

第 7、8 章讲的是完整版。它把同样的事拆成七个阶段,每个阶段配一个现成技能:

① 拷问 → ② 研究(可选)→ ③ 原型(可选)→ ④ 写规格 → ⑤ 拆票 → ⑥ 实现 → ⑦ 审查(含验收)

在这七个阶段之前,第 7 章还有一节「立项六步」,先判断这件事该不该做。 下面是把简化版 1–7 贴到这套编号上——先看对照,不要混用两套编号。

简化版完整版位置(第 7–8 章)差别一句话详细讲在
1 想清楚 ① 拷问(此前先做立项六步;②③ 按需) 简化版靠你口头问;完整版先判断该不该做,再用技能一次一个问题地拷问,必要时先查事实或做原型。 第 7 章 · 立项六步 / 拷问
2 定验收标准 ④ 写规格 简化版是一张能亲手点的清单;完整版写进 spec.md,并写清不做什么。 第 7 章 · 写规格
3 做一小片 ⑤ 拆票 + ⑥ 实现 简化版按“最小可跑一步”切;完整版切成纵向曳光弹工单,一张一张做。 第 8 章 · 拆票
4 亲手跑 ⑥ 实现里的验证 不管哪一版,都必须由你亲手点;AI 说“完成了”不算验证。 第 8 章 · 实现
5 存档 ⑥ 实现里的提交 每次验证通过就存档;它是你敢继续改的退路。 第 8 章 · 实现
6 让 AI 审 AI ⑦ 审查(含验收) 换一个干净会话,把规格和代码规范分开审。 第 8 章 · 审查
7 写交接文档 不属于七阶段,横跨全程 它是每个阶段结束时都该做的动作,不单独占一个阶段。 第 5 章 · 习惯三

开工之前:选工具、建文件夹、第一次存档

选一个能动手的工具 可选

最理想的是能读写你电脑上文件、能跑命令的 AI 工具, 比如 Claude Code、Cursor、Codex。它们的共同点是:能在项目文件夹里直接动手。 具体选哪个不重要,换工具的成本远低于换方法的成本。

用普通聊天框也能走完

这一章的流程不依赖任何特定工具,靠的是你说的话。 等你想要第 7、8 章那些现成命令时,再换工具。 安装与验证步骤见 第 7 章章末,这里不重复。

建一个空文件夹

给项目建一个专门的文件夹,比如 D:\我的项目\午饭登记, 然后让 AI 只在这个文件夹里工作。 不要让它在桌面或下载文件夹里乱来,否则你很快会找不到东西。

第一件事:建存档

文件夹建好之后,第一句话就可以是: “帮我把这个文件夹变成一个 Git 仓库,并提交一次空状态。” 这一步花不到一分钟,但从这一刻起你就有了后悔药。 一定要在写任何代码之前做。

第 1 步:把想法问清楚

目标只有一个:把脑子里的“感觉”变成一份写下来的清单。 先用自己的话说想做什么,再要求它像面试官一样,一次只问一个问题。 每个问题都是你后面会返工的地方;答不上来就说“我不确定,你推荐哪个”。

问完让它整理成 spec.md,写清做什么、为什么、明确不做什么。 完整做法见 第 7 章 · 拷问;这里只记住顺序:先问,后写。

第 2 步:定验收标准

动手之前,先拿到一份你能亲手点一遍的清单。 每条写成“打开页面能看到什么”“点一下会发生什么”,不要写“实现了数据持久化”这种你无法验证的话。

清单写进 spec.md。如果一条都点不出来,说明需求还没想清楚。 规格的七段结构见 第 7 章 · 写规格, 审查时怎么对照清单验收见 第 8 章 · 审查。

第 3–5 步:一片一片长大

这是主体。每一片都走同样的五步: 切出最小可跑的一片 → 让它做并说“做完停下” → 你亲手跑 → 通过就存档 → 判断下一片。

切片标准是:窄到一次能做完,完整到能跑起来看到效果。 如果发现切不出来,说明你切得太大了,再切一刀。 完整版的拆票规则见 第 8 章 · 拆票, 实现的五个节拍见 第 8 章 · 实现。

第 6–7 步:收尾与审查

功能都做完,还有两件事。第一,换一个干净会话,让它以代码审查员身份挑错, 重点看安全问题和明显 bug。第二,让它写一份交接文档: 做了什么、文件各管什么、下一步能做什么。

审查发现的问题,不要让它一口气全修;把每一项当成新的小片,一片一片做。 完整审查流程见 第 8 章 · 阶段七 · 审查。

午饭登记完整实录

场景:团队要在一个网页上登记午饭。组织者看列表、删掉填错的记录; 同事打开链接,填姓名和想吃的菜。下面是关键对话, 旁注会解释每一步在干什么、验证的是什么。

这次的数据长什么样

每条登记是数据表 lunch_orders 里的一行: id, name, dish, created_at。 id 是自动编号,name 是姓名,dish 是想吃的菜, created_at 是登记时间。

页面通过接口(API,前后端约定怎么问、怎么答)和服务器说话:

GET    /api/lunch-orders?date=today
POST   /api/lunch-orders
DELETE /api/lunch-orders/{id}

第 0 步:建仓库

你 这个文件夹是新的午饭登记项目。先帮我把它变成一个 Git 仓库,把现在的空状态存一次档。
在写任何代码之前先存档。这一步让你后面每一步都有退路。

第 1 步:让它问,别让它做

你 我想做一个团队午饭登记网页。同事打开链接,填姓名和想吃的菜;组织者能看到今天所有登记,并删掉填错的。 手机也要能打开。你先不要写任何代码。请你像面试官一样,一次只问一个问题,问完等我回答。
AI 第一个问题:这个页面只有组织者能填,还是每个同事都能填自己的?
这个问题决定要不要区分“谁填的”。多人使用和单人使用,复杂度差很多。
你 每个同事都能填自己的。组织者只负责看列表和删掉填错的。
AI 明白,那不需要登录,但每条记录要带姓名。第二个问题: 同事关掉页面、下午再打开,之前的登记还要在吗?
你 要在。不能刷新一下就没了。
AI 那数据不能只放在浏览器里,要存到服务器上的数据库。 第三个问题:同事提交后,页面应该立刻显示,还是要点刷新才显示?
你 填完立刻显示。填错了要能删掉,删完刷新也不能再出现。
这三个回答决定了三件事:数据存服务器、页面用接口读写、还要有删除操作。 这正是“想清楚”的产出。

第 2 步:把结论写成 spec.md

你 好,把结论整理成一份 spec.md 存下来。 写清楚要做什么,也写清楚明确不做什么。
AI 已整理。核心功能:填写姓名和菜、查看今天全部登记、删除一条记录、刷新后数据还在。 明确不做:登录、支付、历史统计、按人分组。
“不做什么”不是客套。没有边界,AI 会顺手加功能,而每加一样都要你多验一样。

第 3 步:拿到能亲手点的验收清单

你 现在先别动手。先告诉我怎么验证它做完了, 给我一份清单,每条都是我能亲手点一遍就能确认的。
AI 验收清单如下:
  1. 打开页面,能看到姓名输入框、菜名输入框和“登记”按钮;
  2. 输入“小王 / 牛肉面”并提交,列表立刻出现这一条;
  3. 刷新页面,这一条还在;
  4. 点这一条的“删除”,列表里消失;再刷新,仍然不在;
  5. 姓名或菜名为空时,提交后能看到提示,列表不变。
每一条都是“打开、输入、点、刷新”这种可以亲手做的动作。 对比“实现了数据持久化”——那种说法你根本没法验证。

第 4 步:第一小片,只做“读空列表”

你 开始做,但不要一次做完。先只做最小的一片: 页面能打开,并且从服务器读到今天的空列表。先不要做提交和删除。 做完停下来,告诉我怎么验证。
AI 完成了。页面会请求 GET /api/lunch-orders?date=today, 服务器返回空列表,页面显示“今天还没有人登记”。
你 (打开页面,看到“今天还没有人登记”) 看到了,对了。帮我存一次档。
GET 是“读取”。刷新页面时,浏览器会重新发一次 GET, 所以页面显示什么,完全取决于服务器返回什么。

第 5 步:第二小片,把记录写进服务器

你 加下一片:填姓名和菜,点“登记”,把记录保存到服务器,并立刻显示在列表里。 先不要做删除。
AI 完成了。提交时页面发送 POST /api/lunch-orders, 请求体是 {"name":"小王","dish":"牛肉面"}。 服务器写进 lunch_orders,再把新记录返回给页面。
POST 是“新建”。created_at 由服务器在写入时生成, 不需要你填。id 也是服务器自动给的。
你 (填了小王 / 牛肉面,列表出现;刷新后还在) 刷新还在。存档。
“刷新还在”是这一步的关键证据。 它说明数据真的写进了服务器,而不是只存在当前页面里。 开头那个“刷新一下就没了”的问题,到这里才算真正解决。

第 6 步:第三小片,删除一条

你 再加一片:每条记录右边有“删除”,点了从服务器删掉。
AI 完成了。删除按钮会发送 DELETE /api/lunch-orders/{id}, {id} 替换成这条记录的编号。服务器删掉后返回成功,页面把这一条移除。
你 (删掉小王那条,列表消失;刷新后仍然不在) 对了,存档。
DELETE 是“删除”。id 就是 lunch_orders 里那一行的编号, 它保证删掉的是你点的那一条。
停一下

如果现在刷新页面,刚填的记录会消失吗?为什么?

不会。记录已经通过 POST 写进服务器的 lunch_orders;刷新时页面再用 GET 把它读回来。

第 7 步:出问题了

你 我让它再加“按日期看昨天”,结果它把删除按钮弄坏了,现在点了没反应。
这很正常,会发生在每个人身上。关键不在于会不会出问题,而在于你怎么处理。

错误的处理

继续跟它说“按钮坏了,你修一下”。

它改了一个地方,另一个地方又坏了。你再解释一遍,它又改,又坏。

→ 一下午过去了,项目比刚才更烂

正确的处理

“把项目退回上一个存档,我们重新来。”

退回后,重新描述那一小片,这次说清楚一点。

→ 一分钟回到干净状态,损失为零

第 8 步:聊太久了,换会话

你(在旧会话里) 我们这一轮先到这里。请写一份交接说明:做了什么、改了哪些文件、 哪些还没完成、下一步建议做什么。存成 进度.md。
你(新开会话) 请先读一下 spec.md 和 进度.md,然后告诉我你理解的现状。 先不要改任何东西,等我确认。
新会话是一张干净的桌子,而你只放上去两份必要的文件。 它立刻恢复到“刚开局”的状态。

第 9 步:收尾

你(再开一个新会话) 你现在是代码审查员,不是开发人员。 请检查这个项目,重点看:有没有安全问题、有没有明显的 bug、有没有哪部分以后很难改。 请直接指出问题,不要先肯定我。
审查出来的问题,一项一项当成新的小片去做,不要让它一口气全修。

什么时候该回头

如果它开始忘掉你说过的要求、同一个错纠正了三次、改一处坏一处, 或者你开始觉得“算了就这样吧”,不要继续硬推。 完整的危险信号清单和对应处理动作,见 第 10 章 · 危险信号清单。

三句话带走

  1. 简化版只有 1–7:先想清楚、定验收标准,然后每一小片走“做、跑、存档”,最后审查并交接。
  2. 每一片都必须由你亲手跑;AI 说“完成了”只代表它写完了,不代表你要的功能实现了。
  3. “刷新还在”不是页面魔法,是 POST 把数据写进了服务器,GET 又把它读了回来。

自测:三个问题

简化版第 4 步和第 5 步分别是什么?为什么不能合并?

第 4 步是亲手跑,第 5 步是存档。没验证就存档,会把一个可能是错的状态固化成“已知的好状态”; 验证后不存档,下一次改动就没有退路。

同事填完一条,刷新页面后记录还在。这说明哪一步真的发生了?

POST 请求把记录写进了服务器上的 lunch_orders;刷新时页面又用 GET 把它读了回来。 只改页面、不写服务器,刷新后一定会丢。

删除按钮点了没反应,第一件事应该做什么?

先退回上一个存档,回到已知的干净状态;再把这一片切小重做。 不要在一个已经坏掉的状态上继续打补丁。

动手 10 分钟

打开你正在做的小项目,做三件事:

  1. 写下 3 条你能亲手点一遍的验收标准;
  2. 只做其中最小的一条,做完停下来,刷新一次;
  3. 确认结果对了,再让 AI 存一次档。

然后把 3 条标准贴给 AI,让它逐条回答“能验证 / 不能验证”,并说明理由。

如果你看到 X,大概率是 Y

  • 刷新后刚填的数据没了 → 数据只存在页面或浏览器里。先检查有没有向服务器 POST,以及 GET 有没有把记录读回来。
  • 它一次改了十几个文件 → 这一片切大了。退回存档,切成一个能立刻验证的小片。
  • 它说“完成了”,但你没亲手点过 → 验收根本没有发生。按清单自己跑一遍,再决定是否存档。
  • 同一个错纠正了三次 → 对话已经进入变笨区。写交接文档,开新会话,不要继续解释。