PRD 驱动开发
PRD 驱动开发(Spec-First Development)是一种将产品需求文档作为 AI 编程的核心输入的工作流。通过结构化的需求描述,AI 能更准确地理解意图,生成符合预期的代码,大幅减少反复沟通的成本。
为什么需要 PRD 驱动
传统 AI 编程的问题:
- 边想边写,AI 缺乏全局视野,容易产生局部最优的错误设计
- 需求变更时,AI 不了解原始意图,难以做出正确判断
- 多轮对话后,早期的约束和决策会被"遗忘"
PRD 驱动的优势:
- 需求文档作为持久化上下文,任何时候都可以重新喂给 AI
- 强迫开发者在编码前想清楚需求,减少返工
- 团队协作时,所有人对齐同一份 spec
PRD 模板结构
以下是适用于 AI 辅助开发的 PRD 模板:
markdown
# 功能名称:[简短描述]
## 1. 背景与目标
**问题陈述**:当前存在什么问题?
**解决方案**:本功能如何解决?
**成功指标**:如何判断功能成功?
## 2. 用户故事
作为 [用户角色],
我希望 [做某件事],
以便 [达到某个目标]。
## 3. 功能范围
### 必须实现(Must Have)
- [ ] 功能点 A
- [ ] 功能点 B
### 应该实现(Should Have)
- [ ] 功能点 C
### 暂不实现(Won't Have)
- 功能点 D(原因:...)
## 4. 技术规格
**接口设计**:API 端点、请求/响应格式
**数据模型**:数据库表结构或数据类型
**业务规则**:约束条件、验证逻辑、边界情况
**性能要求**:响应时间、并发量等
## 5. UI/UX 说明
**页面流程**:用户操作步骤
**错误状态**:各种错误的展示方式
**加载状态**:异步操作的交互反馈
## 6. 测试用例
**正常流程**:主路径测试
**异常处理**:错误路径测试
**边界情况**:极值、空值、并发等完整 PRD 实例:用户评论系统
markdown
# 功能名称:课程评论与评分系统
## 1. 背景与目标
**问题陈述**:学员完成课程后没有渠道反馈学习体验,导致课程质量无法持续改进。
**解决方案**:为每门课程添加评论和星级评分功能。
**成功指标**:上线 30 天内,完课学员评论率 >20%。
## 2. 用户故事
- 作为学员,我希望在完成课程后提交评分(1-5 星)和文字评论,以便表达学习感受
- 作为学员,我希望看到其他人的评论,以便决定是否购买该课程
- 作为讲师,我希望回复学员评论,以便与学员互动
- 作为管理员,我希望删除违规评论,以便维护社区环境
## 3. 功能范围
### 必须实现
- [ ] 提交评论(含评分 + 文字,最多 500 字)
- [ ] 展示评论列表(分页,每页 10 条,按时间倒序)
- [ ] 显示课程平均评分和评论数量
- [ ] 每个学员每门课只能评论一次
### 应该实现
- [ ] 讲师回复评论
- [ ] 评论点赞
- [ ] 举报违规评论
### 暂不实现
- 评论图片上传(v2 版本考虑)
- AI 生成评论摘要(待评估)
## 4. 技术规格
### API 设计
POST /api/courses/:courseId/reviews # 提交评论
GET /api/courses/:courseId/reviews # 获取评论列表
DELETE /api/reviews/:reviewId # 删除评论(管理员)
POST /api/reviews/:reviewId/reply # 讲师回复
### 请求/响应格式
// 提交评论请求
{
"rating": 5, // 1-5 整数
"content": "课程很好" // 10-500 字符
}
// 评论列表响应
{
"data": {
"reviews": [...],
"pagination": { "page": 1, "total": 42 },
"summary": { "average": 4.6, "count": 42 }
}
}
### 数据模型
reviews 表:
- id: UUID PK
- course_id: UUID FK(courses)
- user_id: UUID FK(users)
- rating: SMALLINT (1-5)
- content: VARCHAR(500)
- created_at: TIMESTAMP
- UNIQUE(course_id, user_id) -- 防止重复评论
### 业务规则
- 只有完成课程(progress = 100%)的学员才能评论
- 评论内容需要经过敏感词过滤
- 删除评论后同步更新课程平均分缓存
## 5. UI/UX 说明
**评论入口**:课程完成页面展示评论表单(弹窗形式)
**评论列表**:课程详情页 Tab 中展示,默认显示最新评论
**错误状态**:
- 未完成课程:提示"完成课程后才能评论"
- 已评论过:展示已有评论,不显示提交表单
- 提交失败:提示错误信息,保留输入内容
## 6. 测试用例
- 正常:完课学员提交 5 星评论,成功显示在列表
- 重复:同一学员再次提交,返回 409 错误
- 未完课:未完成学员提交,返回 403 错误
- 边界:content 为空、超过 500 字、rating 为 0 或 6
- 并发:同时提交 100 个评论,均正确写入将 PRD 转化为 Prompt
有了 PRD,如何高效地转化为 AI 指令:
阶段一:生成数据模型
基于以下 PRD 中的数据模型规格,生成 Prisma schema:
[粘贴 PRD 第 4 节"数据模型"部分]
要求:
- 添加适当的索引(根据查询需求)
- 添加 updatedAt 字段
- 关系使用 @relation 明确声明阶段二:生成 API 接口
基于以下 PRD,实现 POST /api/courses/:courseId/reviews 接口:
[粘贴完整 PRD]
实现要求:
1. 用 Zod 验证请求体(对应 PRD 第 4 节请求格式)
2. 检查用户是否完成课程(对应 PRD 业务规则 1)
3. 检查是否已评论(对应唯一约束)
4. 成功后更新课程平均分缓存(对应业务规则 3)
返回类型遵循 PRD 中的响应格式。阶段三:生成测试
基于以下 PRD 的测试用例部分,为评论提交接口写 Vitest 集成测试:
[粘贴 PRD 第 6 节]
每个测试用例对应 PRD 中一条测试场景,
用 describe/it 组织,it 的描述直接使用 PRD 中的场景描述。用户故事驱动开发
将用户故事转化为可执行的开发任务:
用户故事格式:
As a [role], I want [action], so that [benefit].
转化为 Prompt:
"实现以下用户故事:
作为讲师,我希望在评论列表中看到哪些是新评论(7天内未读),
以便优先处理最新的学员反馈。
技术实现要求:
- 后端:在 reviews 表添加 read_at 字段(讲师已读时间)
- API:GET /api/instructor/reviews 支持 unread=true 过滤
- 前端:未读评论显示红点角标
- 性能:讲师未读数量用 Redis 缓存,有新评论时更新"Spec-First 工作流
1. 写 PRD
↓(将 PRD 存为 docs/specs/feature-name.md)
2. 技术方案评审
"基于这份 PRD,分析技术实现方案,指出潜在风险"
↓
3. 分解任务
"将 PRD 拆解为独立的开发任务,按依赖顺序排列"
↓
4. 逐任务实现
"实现任务 1:[粘贴任务描述 + 相关 PRD 章节]"
↓
5. 验收测试
"对照 PRD 第 6 节测试用例,验证实现是否满足所有要求"提示:将 PRD 文件路径添加到
CLAUDE.md,或在每次对话开始时将 PRD 内容粘贴给 AI,确保 AI 始终有完整的需求上下文。