从 Idea 到 Production — 成熟团队是怎么做的,Celoria 该怎么理解
不管是 Google 这样的万人大厂,还是 Linear 这样的精英小团队,软件开发的核心流程都是这 8 个阶段。区别只在于每个阶段"做多重"。
PRD(Product Requirements Document) 回答两个问题:我们要做什么? 和 为什么要做?
不同公司叫法不同:Google 叫 Design Doc,Stripe 叫 RFC,Linear 叫 Project Brief,Celoria 用 SpecKit 叫 spec.md。本质是同一件事。
核心要素(缺一就是"坏 PRD"):
| 要素 | 回答什么 | 错误示范 |
|---|---|---|
| Problem Statement | 用户遇到什么问题?用数据说话 | "我们需要一个XX功能" ← 只有方案没有问题 |
| Target User | 谁会用?什么场景? | "所有用户" ← 太模糊,等于没说 |
| Goals | 做成什么样算成功?可量化 | "提升用户体验" ← 不可量化 |
| Non-Goals | 明确不做什么 | 不写 Non-Goals ← 范围会无限膨胀 |
| Success Metrics | 用什么数据判断成功? | 没有指标 ← 做完不知道是否成功 |
spec.md 来写需求。例如预约系统的 spec 在 specs/appointments/013-appointment-booking/spec.md。
constitution.md 强制要求:所有新功能必须先有经过批准的 spec(change-id),才能开始写代码。
"当前沙龙预约只能通过电话完成,高峰期 40% 的来电无人接听(基于 QQ Nails 3 个月数据),导致客户流失。需要在线预约渠道让客户 24/7 自助预约。"
"我们要做一个在线预约系统。"
← 只有方案没有问题,看不出为什么要做、做了能改善什么。
没有 PRD 就写代码 = 在没有地图的情况下开车。你可能写出一个技术上完美但没人要的功能。Google Wave 就是经典案例 — 技术很酷,但没解决真实问题。
CUJ(Critical User Journey) 是用户完成核心目标的最短路径。Google SRE 团队用它来定义"什么是不能挂的"。
EUJ(End User Journey) 是完整的用户体验路径,包含非关键步骤。CUJ 是 EUJ 的子集。
| 概念 | 含义 | Celoria 预约系统的例子 |
|---|---|---|
| CUJ | 核心路径,挂了就是 P0 事故 | 客人选服务 → 选技师 → 选时间 → 提交预约 → 预约成功 |
| EUJ | 完整体验,包含非关键步骤 | 打开App → 浏览服务列表 → 查看技师介绍 → 选服务 → 选技师 → 选时间 → 填手机号 → 提交预约 → 收到确认短信 → 到店签到 → 服务完成 → 收到评价请求 |
| User Story | 单个功能点的需求描述 | "作为客人,我希望能选择技师,以便获得我偏好的服务体验" |
关系层级:一个 EUJ 包含多个 CUJ,一个 CUJ 由多个 User Stories 组成。
BDD(Behavior-Driven Development) 用 Given / When / Then 格式把用户旅程写成可执行的测试用例:
Given 必须写清楚权限(resource:action)和 scope,禁止用角色名(如 admin)作为访问前置。
notes/product-design/ 目录,每个业务模块有独立的 CUJ 文件。
web-appointments-cuj.html、web-payments-cuj.html、guest-app-cuj.html。
checklists/requirements.md 中,并要求和 E2E 测试断言保持一致。
不画用户旅程 = 工程师凭想象构建功能。Shopify VP of Engineering 公开说过:他们最大的几次产品失误都是因为"工程师以为自己理解用户,但没有走过完整路径"。
CUJ 也是测试策略的基础 — E2E 测试应该覆盖所有 CUJ。如果你不知道 CUJ 是什么,你的 E2E 就不知道该测什么。
PRD 回答"做什么",Design Doc 回答"怎么做" — 系统架构、数据模型、API 设计、技术选型、风险评估。
| # | 章节 | 内容 |
|---|---|---|
| 1 | Background | 为什么做这个?背景和动机 |
| 2 | Goals / Non-Goals | 做什么,明确不做什么 |
| 3 | High-level Design | 1 张架构图 + 文字说明,系统层面怎么做 |
| 4 | Detailed Design | API 定义、数据模型、算法细节 |
| 5 | Alternatives Considered | 考虑过哪些替代方案,为什么选了当前方案 |
| 6 | Risks & Mitigations | 风险是什么,怎么应对 |
| 7 | Migration Plan | 怎么从现状迁移到目标状态 |
| 8 | Open Questions | 尚未决定的事项(诚实比完美更重要) |
plan.md 对标的就是 Design Doc。预约系统的技术设计在:
specs/appointments/013-appointment-booking/plan.md — 实现计划
specs/appointments/013-appointment-booking/data-model.md — 数据模型
specs/appointments/013-appointment-booking/contracts/booking-api.yaml — API 契约
plan.md 基本覆盖了 Google Design Doc 的核心章节,但可以加强 "Alternatives Considered" 部分。
| 术语 | 回答什么 | 谁写 | Celoria 对应 |
|---|---|---|---|
| PRD | 做什么?为什么? | PM / 产品 | spec.md |
| Design Doc | 技术上怎么做? | 工程师 | plan.md |
| RFC | 我提一个方案,请给反馈 | 任何人 | Slack/会议讨论 |
| Spec | 详细的行为规格 | PM 或工程师 | spec.md(含 BDD 场景) |
很多公司会合并这些 — Celoria 的 SpecKit 就是把 Spec + Plan + Tasks 三者统一管理。
Google 的原则:如果一个系统不能用一张图解释清楚,说明设计太复杂了。
图不是装饰品。Stripe 特别重视 Data Flow Diagram,因为支付系统中资金流向必须绝对清晰 — 他们的安全审计也依赖架构图来识别攻击面。
| 图表类型 | 回答什么问题 | 什么时候画 | Celoria 的例子 |
|---|---|---|---|
| System Architecture 系统架构图 |
系统由哪些部分组成?它们怎么连接? | 几乎每个 Design Doc 都需要 | 前端 → API → 数据库的整体拓扑 |
| Sequence Diagram 时序图 |
各组件之间按什么顺序交互? | API 设计、复杂交互流程 | 预约创建:浏览器→API→冲突检测→数据库→通知服务→短信 |
| Data Flow Diagram 数据流图 |
数据从哪来、到哪去、怎么变换? | 数据密集型功能、安全审计 | 支付数据流:POS→CodePay→回调→对账 |
| ER Diagram 实体关系图 |
数据库表之间有什么关系? | 数据模型设计 | appointments ↔ services ↔ employees ↔ guests |
| State Machine 状态机图 |
实体有哪些状态?怎么转换? | 订单状态、工作流 | 预约状态:confirmed→checked_in→in_progress→completed |
| Deployment Diagram 部署图 |
生产环境的物理/逻辑拓扑? | 基础设施变更 | AWS ECS + Nginx + PostgreSQL 部署拓扑 |
appointment-status-flow.html — 预约状态机图(State Machine)
appointment-database-schema.html — 预约表结构(ER 图的文字版)
pos-payment-state-machine.html — POS 支付状态机
checkout-price-calculation.html — Checkout 价格计算链路(Data Flow)
business-dag/ — 全业务闭环拓扑(System Architecture 级别)
把 Design Doc 拆成可执行的任务,确定依赖关系和执行顺序。
拿到设计后,反复问 "这个能不能更小?",直到每个任务都能在 1-2 天内完成。
按 dependency graph(依赖关系图)排序 — 先做被依赖最多的模块:
tasks.md 就是这个阶段的产物。每个 spec 目录下都有 tasks.md,按依赖顺序排列。
specs/appointments/013-appointment-booking/tasks.md,完成了 82/82 个任务。
TDD(Test-Driven Development) 的核心循环:
Stripe 要求:"If it handles money, it needs a test before it handles money."(处理钱的代码必须先有测试)
| TDD | BDD | |
|---|---|---|
| 核心循环 | Red → Green → Refactor | Given → When → Then |
| 关注点 | 代码的正确性 | 行为的正确性 |
| 测试语言 | 技术语言 assertEquals() | 自然语言 Given user is logged in |
| 谁能读懂 | 开发者 | 开发者 + PM + QA |
| 适用层级 | Unit test 为主 | Integration / E2E 为主 |
| Celoria 工具 | Jest(后端)、Vitest(前端) | Playwright(E2E) |
最佳实践:Unit level 用 TDD,Feature level 用 BDD。先用 BDD 定义系统行为,再用 TDD 实现每个组件。
微软研究院的数据:Code Review 能发现 60-90% 的缺陷,比测试更有效(测试通常发现 25-35%)。
Google 公开的 Code Review 原则:
npm run lint 和相关 npm run test:*
graph TB
E2E["🔺 E2E 测试
少量 · 覆盖 CUJ · 最慢"]
INT["🔶 集成测试
中等 · 验证模块协作"]
UNIT["🟢 单元测试
大量 · 验证单个函数 · 最快"]
E2E --- INT --- UNIT
style E2E fill:#dc262615,stroke:#dc2626,color:#fca5a5
style INT fill:#f59e0b15,stroke:#f59e0b,color:#fcd34d
style UNIT fill:#22c55e15,stroke:#22c55e,color:#86efac
Google 推荐比例:70% Unit / 20% Integration / 10% E2E
| 层级 | 测什么 | 特点 | Celoria 的工具 | Celoria 的例子 |
|---|---|---|---|---|
| Unit 单元测试 |
单个函数/类的逻辑 | 快(毫秒级)、无外部依赖 | Jest(后端) Jest(前端) |
tests/unit/services/conflict-detector.test.js |
| Integration 集成测试 |
多个模块协作是否正确 | 中速(秒级)、可有 localhost 调用 | Jest(后端) Vitest + MSW(前端) |
tests/integration/public-booking/my-appointments.test.js |
| E2E 端到端测试 |
完整用户流程(模拟真实使用) | 最慢(分钟级)、有外部依赖 | Playwright | frontend/web_app/tests/e2e/appointment-board.spec.ts |
前端集成测试经常需要 mock API 响应。Celoria 前端用 MSW(Mock Service Worker) — 它在网络层拦截请求,让组件以为自己在和真实 API 通信。
这比直接 mock fetch 更好,因为它测试了组件的完整请求/响应处理链路。
test-reports/ 目录,按类型和时间戳组织。
CI(Continuous Integration):开发者频繁地将代码合并到主分支,每次合并自动运行测试。目标是"尽早发现集成问题"。
CD(Continuous Delivery):代码随时可以部署到生产环境。可以手动触发(Delivery)或全自动(Deployment)。
代码已经在生产环境中,但通过配置决定是否对用户可见。
if (flag.enabled)新版本先部署到 1% 的用户,监控关键指标。正常则逐步扩大(5% → 25% → 100%),异常则自动回滚。
命名来源:矿井中的金丝雀 — 矿工用金丝雀检测有毒气体,金丝雀先倒下,矿工就知道要撤退。
| 支柱 | 是什么 | 回答什么 | Celoria 的实现 |
|---|---|---|---|
| Metrics | 数值型时间序列 | 系统的总体健康度 | /api/monitoring/metrics |
| Logs | 结构化事件记录 | 发生了什么?为什么? | Winston 日志 → backend/logs/ |
| Traces | 跨服务请求追踪 | 请求经过了哪些服务?哪里慢了? | (未来可接入 OpenTelemetry) |
/monitoring/dashboard
notes/feature-flag-system.html)
| 术语 | 全称 | 一句话解释 |
|---|---|---|
| PRD | Product Requirements Document | 产品需求文档 — 做什么,为什么做 |
| RFC | Request for Comments | 方案征求反馈 — "我有个想法,你们觉得呢" |
| Design Doc | Technical Design Document | 技术设计文档 — 怎么做 |
| CUJ | Critical User Journey | 关键用户旅程 — 不能挂的核心路径 |
| EUJ | End User Journey | 完整用户旅程 — 包含所有步骤 |
| BDD | Behavior-Driven Development | 用 Given/When/Then 描述期望行为 |
| TDD | Test-Driven Development | 先写测试再写代码(Red-Green-Refactor) |
| CI/CD | Continuous Integration / Delivery | 代码自动测试 + 自动部署的流水线 |
| SLO | Service Level Objective | 服务质量目标(如 99.9% 可用性) |
| RBAC | Role-Based Access Control | 基于角色的权限控制(Celoria 用 resource:action 对) |
| Feature Flag | — | 功能开关 — 代码在线但可控制是否可见 |
| Canary | Canary Deployment | 先推 1% 用户,验证后逐步推全量 |
| Circuit Breaker | — | 熔断器 — 外部服务挂了自动断开,防止雪崩 |
| MSW | Mock Service Worker | 在网络层 mock API 响应的前端测试工具 |
| Advisory Lock | PostgreSQL Advisory Lock | 数据库级别的分布式锁,防止并发冲突 |
下面是 Celoria SpecKit 流程与大厂流程的对照:
| 大厂阶段 | Celoria 对应物 | 文件位置 | 状态 |
|---|---|---|---|
| PRD / Product Brief | spec.md | specs/{module}/{feature}/spec.md | ✅ 成熟 |
| User Journey (CUJ/EUJ) | CUJ 文档 + BDD 场景 | notes/product-design/*.html | ✅ 成熟 |
| Design Doc | plan.md + data-model.md | specs/{module}/{feature}/plan.md | ✅ 基本完整 |
| API Contract | YAML 契约 | specs/{module}/{feature}/contracts/*.yaml | ✅ 部分模块有 |
| Architecture Diagrams | Notes HTML + Mermaid | notes/*.html | ✅ 丰富 |
| Task Breakdown | tasks.md | specs/{module}/{feature}/tasks.md | ✅ 成熟 |
| TDD | Jest / Vitest / Playwright | backend/tests/ + frontend/web_app/tests/ | ✅ 732 测试文件 |
| Code Review | GitHub PR Review | — | ✅ 流程在位 |
| CI/CD Pipeline | 手动 + PM2 | ecosystem.config.js | 🟡 可加强 |
| Feature Flag | 自建 Feature Flag 系统 | notes/feature-flag-system.html | ✅ 已实现 |
| Monitoring | 内置监控系统 | /monitoring/dashboard | ✅ 已实现 |
| Alternatives Considered | — | — | 🟡 可加强 |
这份总览文档讲的是"一般方法论"。接下来会对 Celoria 的具体模块做端到端的拆解: