Spec 不只是需求文档
一份可执行的 Spec 至少包含目标、非目标、用户流程、数据结构、状态变化、异常边界和验收标准。它既是人和 AI 的共同上下文,也是测试和 Code Review 的依据。
1 | ## 功能:隐藏报表页面的面包屑 |
状态和边界先写清楚
前端复杂度往往来自状态组合,而不是 JSX 数量。可以先用状态表描述 Loading、Empty、Error、Forbidden 和 Success,再让 Agent 生成组件。
1 | type ViewState = "loading" | "empty" | "ready" | "forbidden" | "error"; |
Spec 如何进入开发闭环
开发前让 Agent 根据 Spec 输出实现计划;开发中逐条勾选;开发后把验收条目转成测试和人工检查。需求变更时先更新 Spec,再修改代码,避免实现和约定分叉。
如何在现有项目中引入 Spec
可以从一个功能目录开始,不要求一次性重写历史需求:
1 | specs/ |
requirements.md 写用户目标,states.md 写页面状态,api-contract.md 写前端需要的数据形状,acceptance.md 写可检查的结果,decisions.md 记录为什么选择当前方案。Agent 进入任务后先读 Spec,再读取源码;代码实现完成后逐条回填验收项。
一个页面的状态 Spec
1 | | 状态 | 页面表现 | 用户操作 | |
这类表格比一句“做好异常处理”更容易被 AI、开发者和测试人员共同使用。
Spec 的变更与评审
当需求变更时,先在 Spec 中增加决策记录,再修改代码和测试。Review 时同时查看 Spec、实现和验证结果,避免只审查代码风格而漏掉产品行为。Spec 也可以作为发布说明和后续维护的入口。
小结
Spec 不会限制创造力,它把创造力放在正确的位置:先明确问题和边界,再自由选择实现方式。对 AI 开发而言,Spec 是减少返工、提高审阅质量的最低成本工具。
