[项目名称] — Project Spec
文档编号: PRJ-YYYY-XXX
状态:Draft/In Review/Approved/In Progress/Done
版本: v0.1
创建日期: YYYY-MM-DD
最后更新: YYYY-MM-DD
Owner: @姓名
审阅人: Tom(产品)/ e50u(技术)/ kzzs(协调)
TL;DR
三句话内说清楚:做什么、为什么、怎么判断成功。
做什么: 一句话描述
为什么: 业务价值或痛点
成功标准: 关键指标
1. 背景与问题
1.1 背景
描述现状、数据支撑、业务场景。避免主观判断,用事实说话。
- 当前状况:
- 数据佐证:(如有,列出相关指标/数量级)
- 问题触发:
1.2 问题陈述
用"用户视角"描述痛点,而非解决方案。
主要问题:
当 [用户/角色] 尝试 [完成某事] 时,遇到 [问题/阻碍],导致 [影响/后果]。
次要问题:
1.3 不做这个项目的代价
如果不做,会发生什么?量化代价有助于排优先级。
2. 目标与非目标
2.1 目标(Goals)
SMART 原则:Specific / Measurable / Achievable / Relevant / Time-bound
| # | 目标 | 成功指标 | 截止日期 |
|---|---|---|---|
| G1 | |||
| G2 |
2.2 非目标(Non-Goals)
明确写出本次不做的事,避免范围蔓延。
- 本期不包含:
- 未来可能做,但不在本次范围:
2.3 假设与约束
| 类型 | 描述 |
|---|---|
| 假设 | |
| 约束 | |
| 依赖 |
3. 用户与场景
3.1 目标用户
| 角色 | 描述 | 核心诉求 |
|---|---|---|
3.2 核心使用场景(User Stories)
格式:
作为 [角色],我希望 [做某事],以便 [获得价值]
- 作为 [角色],我希望 [做某事],以便 [获得价值]
- 作为 [角色],我希望 [做某事],以便 [获得价值]
4. 技术方案
4.1 方案概览
简述整体技术思路,选择该方案的理由,以及被否定的备选方案。
选定方案:
否定的备选方案:
| 备选方案 | 否定原因 |
|---|---|
4.2 系统架构
文字描述或 ASCII 图,说明主要组件、数据流向、外部依赖。
[Client] → [API Gateway] → [Service A] → [DB]
↘ [Service B] → [Cache]
关键组件:
| 组件 | 职责 | 技术选型 |
|---|---|---|
4.3 数据库设计
仅列出本期新增或修改的表。已有表只描述改动。
新增表:table_name
| 字段 | 类型 | 可空 | 默认值 | 说明 |
|---|---|---|---|---|
| id | bigint | N | auto | 主键,自增 |
| created_at | bigint | N | 创建时间(Unix 秒) | |
| updated_at | bigint | N | 更新时间(Unix 秒) | |
索引:
idx_xxx_yyyON(field_a, field_b)
表关系:
this_table.user_id→users.id
已有表变更:table_name
| 变更类型 | 字段 | 说明 |
|---|---|---|
| ADD | ||
| MODIFY |
4.4 API 接口定义
定义本期新增接口的契约。已有接口如有修改需注明 Breaking Change。
Base URL: /v1/
POST /v1/xxx
描述: 创建 xxx
Request Body:
{
"field_a": "string, required, 最大64字符",
"field_b": 0
}
Response 200:
{
"code": 0,
"msg": "ok",
"data": {
"id": 1
}
}
错误码:
| code | 说明 |
|---|---|
| 1001 | 参数校验失败 |
| 1002 | xxx 不存在 |
GET /v1/xxx/:id
继续列出其他接口...
4.5 非功能性需求(NFR)
| 维度 | 要求 | 备注 |
|---|---|---|
| 性能 | P99 响应时间 < Xms | |
| 并发 | QPS ≥ X | |
| 可用性 | 99.9% uptime | |
| 数据安全 | 敏感字段加密存储 | |
| 兼容性 | 向后兼容,无 Breaking Change |
4.6 安全考量
明确潜在的安全风险和对应措施。
| 风险点 | 措施 |
|---|---|
| 身份认证 | JWT + 签名验证 |
| 权限控制 | RBAC,接口级鉴权 |
| 输入校验 | 所有入参 validator 校验,防注入 |
| 敏感数据 | 日志脱敏,不明文存储 |
4.7 风险与应对
| # | 风险描述 | 概率 | 影响 | 应对措施 | Owner |
|---|---|---|---|---|---|
| R1 | 高/中/低 | 高/中/低 | |||
| R2 |
5. 实施计划
5.1 阶段划分
| 阶段 | 内容 | 工期 | 产出物 |
|---|---|---|---|
| Phase 1 | X 天 | ||
| Phase 2 | X 天 |
5.2 任务拆解
每个任务对应一个可独立合并的 MR,关联 AC 编号。
Phase 1:
-
[BE]任务描述 → 关联 AC-001, AC-002(预计 Xh) -
[BE]任务描述 → 关联 AC-003(预计 Xh) -
[DB]Migration: 新增 xxx 表(预计 Xh)
Phase 2:
-
[BE]任务描述 → 关联 AC-004(预计 Xh)
标签约定:
[BE]后端 /[FE]前端 /[DB]数据库 /[INFRA]基础设施 /[TEST]测试
5.3 回滚方案
每个阶段上线后,如何回滚。
- Phase 1 回滚:
docker rollback+ Migration rollbackVXX__down.sql - Phase 2 回滚:
6. 验收标准(AC)
格式规范(BDD Gherkin):
AC-XXX: [简短标题]
Given [前置状态/条件]
When [用户操作 / 系统行为]
Then [期望结果,包含具体值/状态码/数据变化]质量要求:
- ✅ 每条 AC 必须独立可验证,结果明确(含状态码、字段值等)
- ✅ 覆盖正常路径 + 边界条件 + 异常路径
- ❌ 禁止模糊描述:"功能正常""体验更好""性能提升"
- ❌ 禁止功能描述代替行为描述:"支持用户登录"
AC-001:[功能点名称 - 正常路径]
Given 用户已完成认证,持有有效 JWT Token
When 用户发送 POST /v1/xxx,Body 包含合法参数 { field_a: "test", field_b: 1 }
Then 返回 HTTP 200
Response body: { "code": 0, "data": { "id": [非空 bigint] } }
数据库 table_xxx 中新增一条记录,field_a = "test"
| 字段 | 值 |
|---|---|
| 验证方式 | 自动(集成测试) |
| 优先级 | P0 |
| 负责人 |
AC-002:[功能点名称 - 参数校验]
Given 用户已完成认证
When 用户发送 POST /v1/xxx,Body 中 field_a 为空字符串
Then 返回 HTTP 400
Response body: { "code": 1001, "msg": "field_a 不能为空" }
数据库无新增记录
| 字段 | 值 |
|---|---|
| 验证方式 | 自动(单元测试) |
| 优先级 | P1 |
| 负责人 |
AC-003:[功能点名称 - 权限控制]
Given 请求未携带 JWT Token 或 Token 已过期
When 用户发送任意需认证接口
Then 返回 HTTP 401
Response body: { "code": 4001, "msg": "unauthorized" }
| 字段 | 值 |
|---|---|
| 验证方式 | 自动(集成测试) |
| 优先级 | P0 |
| 负责人 |
继续添加 AC-004, AC-005...
覆盖清单(完成前确认):
- 所有核心功能的 Happy Path
- 参数边界值(空/最大/非法类型)
- 未认证/越权访问
- 并发/幂等性(如适用)
- 数据不存在的 404 场景
7. RACI 矩阵
| 任务/决策 | Tom(产品) | e50u(技术顾问) | kzzs(协调) | 开发 Agent |
|---|---|---|---|---|
| 需求确认与范围锁定 | A/R | C | I | I |
| 技术方案评审 | C | A/R | I | I |
| API 契约确认 | C | A/R | I | C |
| DoD Gate 三方复核 | R | R | R | I |
| 开发执行 | I | C | A | R |
| QA 验收 | I | A/R | I | I |
| 测试环境部署 | I | I | A/R | I |
| 最终交付确认 | A/R | C | C | I |
R= Responsible(执行)A= Accountable(决策负责)C= Consulted(咨询)I= Informed(知会)
8. DoD Gate — 三方复核清单
进入开发前,Tom / e50u / kzzs 三方必须逐项确认。任一方否决则退回修改。
需求质量
- TL;DR 准确概括项目
- 背景有数据支撑,问题陈述无歧义
- 目标可衡量,非目标已明确列出
- User Story 覆盖核心场景
技术质量
- 架构方案已评审,无遗漏组件
- 数据库设计合理,索引策略已考虑
- API 契约完整(入参/出参/错误码)
- 非功能性需求(性能/安全)已定义
- 回滚方案可执行
AC 质量
- AC 覆盖所有任务拆解项
- 每条 AC 独立可验证,有明确期望值
- 覆盖正常路径、边界条件、异常路径
- AC 编号与任务拆解已关联
可执行性
- 任务已拆解到独立 MR 粒度
- 工期估算合理(含 buffer)
- 依赖已识别,风险有应对措施
三方签字:
| 角色 | 姓名 | 结论 | 日期 |
|---|---|---|---|
| 产品(Tom) | ✅ 通过 / ❌ 退回 | ||
| 技术顾问(e50u) | ✅ 通过 / ❌ 退回 | ||
| 协调(kzzs) | ✅ 通过 / ❌ 退回 |
退回原因(如有):
9. 时间线
YYYY-MM-DD Spec 完成,进入 DoD Gate 评审
YYYY-MM-DD 三方复核通过,开发启动
YYYY-MM-DD Phase 1 完成,部署测试环境
YYYY-MM-DD Phase 2 完成,QA 验收开始
YYYY-MM-DD 验收通过,测试环境交付
10. 监控与告警
上线后如何确认系统健康,以及告警阈值。
| 指标 | 正常范围 | 告警阈值 | 告警渠道 |
|---|---|---|---|
| 接口错误率 | < 0.1% | > 1% | Telegram |
| P99 响应时间 | < Xms | > Xms | Telegram |
11. 附录
- 参考文档:
- 相关 MR/Issue:
- 会议记录:
- 变更历史:
| 版本 | 日期 | 修改人 | 变更说明 |
|---|---|---|---|
| v0.1 | YYYY-MM-DD | 初稿 |