做产品 PMaker
直接要代码
你:做一个评论区
AI 直接输出 400 行代码
↳ 没有分页
↳ 没想过没评论时长什么样
↳ 楼中楼要不要?它自己定了
↳ 提交失败草稿会丢
你读完 400 行才发现 → 返工
先要一页规格
你:先别写代码,列规格
AI 输出 20 行清单:
· 数据结构:楼中楼两层
· 排序:按时间倒序
· 空态:邀请首条评论
· 提交失败:保留草稿
· 未定:要不要点赞?
你花 30 秒改两条 → 再写

同一个需求的两种交办方式。差别不在 AI 的能力,在你什么时候介入判断。

先规格后代码

直接要代码,你要读四百行才能发现它理解错了。先要一页规格,同样的错误在二十行里三十秒就能看出来。

你会遇到的现象
  • 代码跑起来了,但楼中楼、分页、编辑权限这些它自己替你决定了
  • 改到第三轮,它忘了第一轮的约定,你得把需求重讲一遍
  • 发现不对时只能一处一处说「把这里改成那样」,改完还有同类问题

在让 AI 写代码之前,先让它用自然语言写出打算做什么:数据结构、页面上有哪些状态、边界情况怎么处理、哪些地方它自己拿不准。你看这一页,改几条,再让它动手。

这个动作看起来是多了一步,实际上省的是最贵的那一步。AI 写代码几乎不花你的时间,但读代码、发现它理解错了、然后描述该怎么改——这三件事全部消耗你的注意力,而且随代码量线性增长。规格只有二十行,你三十秒能扫完,错误在这里被抓住的成本几乎为零。

更重要的是,规格会逼出那些你自己也没想清楚的问题。做一个评论区这句话里藏着七八个决定:要不要楼中楼、能不能编辑、删除是软删除还是硬删、未登录用户看得见吗。你不说,AI 就替你决定了,而且它多半会选最常见的那个做法,未必是你要的那个。

「与 AI 协作」里的其他模式——三段式提示、参考锚定、约束沉淀——都要先有这个习惯才用得上。

规格里的四块

四块缺一不可,其中最值钱的是最后一块。

1 数据 有哪些实体、关键字段、彼此的关系 这块错了,后面全错 2 状态 界面会出现哪几种样子 至少覆盖正常、空、加载、出错 3 边界 超长内容、零条数据、并发修改 权限不足、网络失败 4 未定项 它只能靠猜的地方,逐条列出来问你 这一块决定了要不要返工
前三块是它替你想清楚,第四块是它承认自己没想清楚。没有第四块的规格,等于把决定权默默交了出去。

设计考量

给 AI 的话

这段可以固定成你每次开新模块的第一句话。

PROMPT · 开工第一步
我要做:[一句话描述功能]

先不要写任何代码。先给我一份不超过 30 行的规格,包含四部分:

1. 数据:涉及哪些实体、关键字段、彼此的关系。
2. 状态:这个界面会出现哪几种样子,各自什么条件下出现。
   至少覆盖正常、空、加载中、出错。
3. 边界:你能想到的异常情况和你打算怎么处理
   (超长内容、零条数据、权限不足、并发修改、网络失败)。
4. 未定项:我没说清楚、你只能靠猜的地方,逐条列出来问我。
   不要自己替我决定。

用中文,列表形式,不要展开解释。我确认之后再动手写代码。

确认完之后,第二句:

PROMPT · 确认后
规格按以下修改后定稿:
- [你的修改 1]
- [你的修改 2]
- 未定项的答复:[逐条回答]

请把定稿的规格写入 docs/specs/[模块名].md,然后按它实现。
之后我对这个模块提的任何修改,都要先同步更新那份规格文件。

真实案例

docs/specs/comments.md
## 数据
Comment { id, postId, parentId?, body, author, createdAt }
楼中楼最多两层,parentId 只能指向顶层评论
## 状态
正常 / 空(邀请首条)/ 加载(骨架 3 条)/ 出错(可重试)
## 边界
正文 > 500 字折叠;提交失败保留草稿到 localStorage

定稿的规格存成项目里的文件,之后每轮改动都带上它。这份文件同时也是几周后你自己回来看时唯一还能读懂的东西。

未定项(AI 主动列出)
1. 未登录用户能看到评论吗?还是要求登录后才可见?
2. 作者能编辑自己的评论吗?有时间限制吗?
3. 删除是软删除(显示"该评论已删除")还是直接消失?
4. 需要点赞或举报吗?

"未定项"这一栏是这个模式的核心收益。这四个问题里任何一个猜错,都意味着推倒重来;在写代码之前回答,各花五秒钟。