软件开发全流程

从 Idea 到 Production — 成熟团队是怎么做的,Celoria 该怎么理解

基于 Google / Stripe / Shopify / Linear / Vercel 的工程实践 · 更新于 2026-03-24

目录

  1. 全景 Pipeline — 8 个阶段一览
  2. Phase 1: 产品需求 (PRD / Spec)
  3. Phase 2: 用户旅程 (CUJ / EUJ)
  4. Phase 3: 技术设计 (Design Doc / RFC)
  5. Phase 4: 架构图 (Diagrams)
  6. Phase 5: 任务拆分 (Task Breakdown)
  7. Phase 6: 开发实现 (TDD + Code Review)
  8. Phase 7: 测试金字塔 (Testing Pyramid)
  9. Phase 8: 部署与监控 (Deploy + Monitor)
  10. 术语对照表
  11. Celoria 的流程映射
  12. 创业公司如何取舍

全景 Pipeline — 从 Idea 到 Production

不管是 Google 这样的万人大厂,还是 Linear 这样的精英小团队,软件开发的核心流程都是这 8 个阶段。区别只在于每个阶段"做多重"。

1
产品需求
PRD / Spec
2
用户旅程
CUJ / EUJ
3
技术设计
Design Doc
4
架构图
Diagrams
5
任务拆分
Tasks
6
开发
TDD + Review
7
测试
Pyramid
8
部署监控
Deploy
💡 核心认知 越靠前的阶段,修改成本越低。Google 内部数据:设计阶段花 1 小时能节省实现阶段 10 小时。
一个需求级别的错误在 PRD 阶段修改只要 5 分钟,到了代码写完再改可能要 5 天。

Phase 1: 产品需求 (PRD / Spec)

这是什么?

PRD(Product Requirements Document) 回答两个问题:我们要做什么?为什么要做?

不同公司叫法不同:Google 叫 Design Doc,Stripe 叫 RFC,Linear 叫 Project Brief,Celoria 用 SpecKit 叫 spec.md。本质是同一件事。

好的 PRD 长什么样?

核心要素(缺一就是"坏 PRD"):

要素回答什么错误示范
Problem Statement用户遇到什么问题?用数据说话"我们需要一个XX功能" ← 只有方案没有问题
Target User谁会用?什么场景?"所有用户" ← 太模糊,等于没说
Goals做成什么样算成功?可量化"提升用户体验" ← 不可量化
Non-Goals明确不做什么不写 Non-Goals ← 范围会无限膨胀
Success Metrics用什么数据判断成功?没有指标 ← 做完不知道是否成功
🔵 Celoria 是怎么做的 我们用 SpecKit 的 spec.md 来写需求。例如预约系统的 spec 在 specs/appointments/013-appointment-booking/spec.md
SpecKit 的 constitution.md 强制要求:所有新功能必须先有经过批准的 spec(change-id),才能开始写代码。
这对标的就是 Google 的 "Design Review Before Code Review" 原则。

✅ 好的 Problem Statement

"当前沙龙预约只能通过电话完成,高峰期 40% 的来电无人接听(基于 QQ Nails 3 个月数据),导致客户流失。需要在线预约渠道让客户 24/7 自助预约。"

❌ 坏的 Problem Statement

"我们要做一个在线预约系统。"

← 只有方案没有问题,看不出为什么要做、做了能改善什么。

为什么不能跳过?

没有 PRD 就写代码 = 在没有地图的情况下开车。你可能写出一个技术上完美但没人要的功能。Google Wave 就是经典案例 — 技术很酷,但没解决真实问题。

Phase 2: 用户旅程 (CUJ / EUJ)

这是什么?

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 场景 — CUJ 的可执行版本

BDD(Behavior-Driven Development)Given / When / Then 格式把用户旅程写成可执行的测试用例:

# Celoria 预约创建 — BDD 场景

Given 已登录用户拥有 appointments:create 权限
  And 当前门店有可用技师
When 用户选择"经典美甲"服务 + 技师 Alice + 下午 2:00
Then 系统检查时间冲突并创建预约
  And 预约状态为 "confirmed"
  And 客人收到确认短信
⚠️ Celoria 的 BDD 规范 Constitution 强制要求:Given 必须写清楚权限(resource:action)和 scope,禁止用角色名(如 admin)作为访问前置。
这是因为我们用的是 RBAC 权限系统,角色可以被自定义配置,直接写角色名无法真实反映权限逻辑。
🔵 Celoria 是怎么做的 CUJ 文档存放在 notes/product-design/ 目录,每个业务模块有独立的 CUJ 文件。
例如:web-appointments-cuj.htmlweb-payments-cuj.htmlguest-app-cuj.html
BDD 场景写在 spec 的 checklists/requirements.md 中,并要求和 E2E 测试断言保持一致。

为什么不能跳过?

不画用户旅程 = 工程师凭想象构建功能。Shopify VP of Engineering 公开说过:他们最大的几次产品失误都是因为"工程师以为自己理解用户,但没有走过完整路径"。

CUJ 也是测试策略的基础 — E2E 测试应该覆盖所有 CUJ。如果你不知道 CUJ 是什么,你的 E2E 就不知道该测什么。

Phase 3: 技术设计 (Design Doc / RFC)

这是什么?

PRD 回答"做什么",Design Doc 回答"怎么做" — 系统架构、数据模型、API 设计、技术选型、风险评估。

Google Design Doc 的标准结构

#章节内容
1Background为什么做这个?背景和动机
2Goals / Non-Goals做什么,明确不做什么
3High-level Design1 张架构图 + 文字说明,系统层面怎么做
4Detailed DesignAPI 定义、数据模型、算法细节
5Alternatives Considered考虑过哪些替代方案,为什么选了当前方案
6Risks & Mitigations风险是什么,怎么应对
7Migration Plan怎么从现状迁移到目标状态
8Open Questions尚未决定的事项(诚实比完美更重要)
💡 最容易被忽略也最有价值的部分 Alternatives Considered(替代方案比较)— 这迫使你证明当前方案是"比较过的最优",而不是"第一个想到的"。
面对 critic 的时候,如果你能说"我们评估了 A、B、C 三种方案,因为 X 原因选了 B",说服力比"我们就用了 B"高一个量级。
🔵 Celoria 是怎么做的 SpecKit 的 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" 部分。

PRD vs Design Doc vs RFC vs Spec — 到底什么区别?

术语回答什么谁写Celoria 对应
PRD做什么?为什么?PM / 产品spec.md
Design Doc技术上怎么做?工程师plan.md
RFC我提一个方案,请给反馈任何人Slack/会议讨论
Spec详细的行为规格PM 或工程师spec.md(含 BDD 场景)

很多公司会合并这些 — Celoria 的 SpecKit 就是把 Spec + Plan + Tasks 三者统一管理。

Phase 4: 架构图 (Diagrams)

图的价值

Google 的原则:如果一个系统不能用一张图解释清楚,说明设计太复杂了。

图不是装饰品。Stripe 特别重视 Data Flow Diagram,因为支付系统中资金流向必须绝对清晰 — 他们的安全审计也依赖架构图来识别攻击面。

你需要知道的 6 种图

图表类型回答什么问题什么时候画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 部署拓扑
🔵 Celoria 已有的架构图 Notes 里已经有很多了:
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 级别)

Phase 5: 任务拆分 (Task Breakdown)

这是什么?

把 Design Doc 拆成可执行的任务,确定依赖关系和执行顺序。

Shopify 的 "Scope Hammer" 方法

拿到设计后,反复问 "这个能不能更小?",直到每个任务都能在 1-2 天内完成

dependency graph(依赖关系图)排序 — 先做被依赖最多的模块:

# 预约系统的典型依赖排序

第 1 层(被依赖最多,先做)
├── 数据库迁移(appointments 表 + 约束)
├── 核心 Service(booking-service.js)
└── 冲突检测(conflict-detector.js)

第 2 层(依赖第 1 层)
├── API 路由(appointments.js)
├── 可用时间段计算(availability-calculator.js)
└── 通知服务(notification-dispatcher.js)

第 3 层(依赖前两层)
├── 前端页面(Board、Create、Detail)
├── 并发锁(booking-lock.js)
└── 指标采集(booking-metrics.js)

第 4 层(集成测试)
└── E2E 测试(完整预约创建流程)
⚠️ 任务粒度过大的风险 任务粒度过大的最大风险是 "95% done syndrome" — 看起来快完了,但最后 5% 花了整个项目 50% 的时间。经典的《人月神话》里专门讲过这个。
🔵 Celoria 是怎么做的 SpecKit 的 tasks.md 就是这个阶段的产物。每个 spec 目录下都有 tasks.md,按依赖顺序排列。
预约系统的 tasks 在 specs/appointments/013-appointment-booking/tasks.md,完成了 82/82 个任务。

Phase 6: 开发实现 (TDD + Code Review)

TDD — 先写测试再写代码

TDD(Test-Driven Development) 的核心循环:

  1. Red — 先写一个会失败的测试(因为功能还没实现)
  2. Green — 写最少的代码让测试通过
  3. Refactor — 重构代码,保持测试通过

Stripe 要求:"If it handles money, it needs a test before it handles money."(处理钱的代码必须先有测试)

TDD vs BDD — 不是互斥的

TDDBDD
核心循环Red → Green → RefactorGiven → 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 — 比测试更有效的质量保障

微软研究院的数据:Code Review 能发现 60-90% 的缺陷,比测试更有效(测试通常发现 25-35%)。

Google 公开的 Code Review 原则:

  1. 小的 PR 优于大的 PR — 200 行以内的 PR 质量最高。超过 400 行,reviewer 注意力显著下降
  2. Review 优先级:设计 > 功能正确 > 复杂性 > 测试 > 命名 > 注释 > 风格
  3. 24 小时内响应(大多数应在几小时内完成)
  4. 区分 "must fix" 和 "nit"(建议但不强制)
🔵 Celoria 的开发规范 Constitution 要求:
• 关键流程(P1/P2、数据写入、认证、支付)必须先写测试(Red-Green-Refactor)
• 合并前必须通过 npm run lint 和相关 npm run test:*
• RBAC 相关代码必须有权限测试(至少覆盖 "无权限 403" 和 "有权限非 403" 两类断言)

Phase 7: 测试金字塔 (Testing Pyramid)

经典模型

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
💡 核心原则:"Test at the lowest level possible" 能用 Unit Test 覆盖的逻辑,不要用 E2E 测。
E2E 只用来覆盖 CUJ(关键用户旅程) — 因为 E2E 慢、脆弱、难维护。
如果你的测试金字塔是倒的(大量 E2E、少量 Unit),说明测试策略有问题。Martin Fowler 把这叫 "ice cream cone"(冰淇淋蛋筒)。

前端的特殊之处(MSW)

前端集成测试经常需要 mock API 响应。Celoria 前端用 MSW(Mock Service Worker) — 它在网络层拦截请求,让组件以为自己在和真实 API 通信。

这比直接 mock fetch 更好,因为它测试了组件的完整请求/响应处理链路。

🔵 Celoria 的测试规模 当前共 732 个测试文件。 后端覆盖率阈值 60%,前端 70%。
测试报告统一输出到 test-reports/ 目录,按类型和时间戳组织。
Constitution 强制:新增 API 必须有测试,新增 Service 必须有单元测试,Spec 完成必须有 E2E。

Phase 8: 部署与监控 (Deploy + Monitor)

CI/CD — 自动化流水线

CI(Continuous Integration):开发者频繁地将代码合并到主分支,每次合并自动运行测试。目标是"尽早发现集成问题"。

CD(Continuous Delivery):代码随时可以部署到生产环境。可以手动触发(Delivery)或全自动(Deployment)。

# 典型的 CI/CD Pipeline

Push Code → LintUnit TestsBuildIntegration TestsE2E TestsDeploy StagingDeploy Production

Feature Flag — 解耦部署和发布

代码已经在生产环境中,但通过配置决定是否对用户可见。

Canary Deployment — 金丝雀部署

新版本先部署到 1% 的用户,监控关键指标。正常则逐步扩大(5% → 25% → 100%),异常则自动回滚。

命名来源:矿井中的金丝雀 — 矿工用金丝雀检测有毒气体,金丝雀先倒下,矿工就知道要撤退。

可观测性三支柱

支柱是什么回答什么Celoria 的实现
Metrics数值型时间序列系统的总体健康度/api/monitoring/metrics
Logs结构化事件记录发生了什么?为什么?Winston 日志 → backend/logs/
Traces跨服务请求追踪请求经过了哪些服务?哪里慢了?(未来可接入 OpenTelemetry)
🔵 Celoria 的部署架构部署:AWS ECS + Docker + Nginx
进程管理:PM2(本地 + 生产)
监控面板/monitoring/dashboard
Feature Flag:自建系统(见 notes/feature-flag-system.html
熔断器:外部服务调用强制包装 CircuitBreaker

术语对照表

术语全称一句话解释
PRDProduct Requirements Document产品需求文档 — 做什么,为什么做
RFCRequest for Comments方案征求反馈 — "我有个想法,你们觉得呢"
Design DocTechnical Design Document技术设计文档 — 怎么做
CUJCritical User Journey关键用户旅程 — 不能挂的核心路径
EUJEnd User Journey完整用户旅程 — 包含所有步骤
BDDBehavior-Driven Development用 Given/When/Then 描述期望行为
TDDTest-Driven Development先写测试再写代码(Red-Green-Refactor)
CI/CDContinuous Integration / Delivery代码自动测试 + 自动部署的流水线
SLOService Level Objective服务质量目标(如 99.9% 可用性)
RBACRole-Based Access Control基于角色的权限控制(Celoria 用 resource:action 对)
Feature Flag功能开关 — 代码在线但可控制是否可见
CanaryCanary Deployment先推 1% 用户,验证后逐步推全量
Circuit Breaker熔断器 — 外部服务挂了自动断开,防止雪崩
MSWMock Service Worker在网络层 mock API 响应的前端测试工具
Advisory LockPostgreSQL Advisory Lock数据库级别的分布式锁,防止并发冲突

Celoria 的流程映射

下面是 Celoria SpecKit 流程与大厂流程的对照:

大厂阶段Celoria 对应物文件位置状态
PRD / Product Briefspec.mdspecs/{module}/{feature}/spec.md✅ 成熟
User Journey (CUJ/EUJ)CUJ 文档 + BDD 场景notes/product-design/*.html✅ 成熟
Design Docplan.md + data-model.mdspecs/{module}/{feature}/plan.md✅ 基本完整
API ContractYAML 契约specs/{module}/{feature}/contracts/*.yaml✅ 部分模块有
Architecture DiagramsNotes HTML + Mermaidnotes/*.html✅ 丰富
Task Breakdowntasks.mdspecs/{module}/{feature}/tasks.md✅ 成熟
TDDJest / Vitest / Playwrightbackend/tests/ + frontend/web_app/tests/✅ 732 测试文件
Code ReviewGitHub PR Review✅ 流程在位
CI/CD Pipeline手动 + PM2ecosystem.config.js🟡 可加强
Feature Flag自建 Feature Flag 系统notes/feature-flag-system.html✅ 已实现
Monitoring内置监控系统/monitoring/dashboard✅ 已实现
Alternatives Considered🟡 可加强

创业公司如何取舍

保留的(Non-negotiable)

  1. Design Doc / Spec — 但更短更快(1-2 页 vs Google 的 10-20 页)
  2. Code Review — 100% 保留,但要快(小时级响应)
  3. 自动化测试 — 金字塔底部更重(多 Unit,少 E2E)
  4. CI/CD — 必须自动化。手动部署是 anti-pattern
  5. Feature Flags — 解耦部署和发布,是快速迭代的基础

简化的

  1. PRD → 1 页 Project Brief(不写 50 页文档)
  2. User Journey → 只画 critical path(不画所有边缘情况)
  3. 架构图 → 白板 + 截图(不用 Visio 画精美图)
  4. Task Planning → Linear/GitHub Issues(不用 Jira 完整流程)

砍掉的

  1. Architecture Review Board — 用 Slack 讨论代替
  2. 独立 QA 团队 — 工程师自己测,自己保证质量
  3. Change Advisory Board — 用 CI/CD + Feature Flag 代替人工审批
  4. 详细的项目管理文档(甘特图、WBS)— 用 2 周 cycle 代替
Linear 创始人 Karri Saarinen: "我们不做 ceremony(仪式),我们做 clarity(清晰)。每个流程都必须证明它能帮我们更快地交付更好的产品,否则就删掉。"
🔵 Celoria 的定位 我们在"顶级创业公司"这一档。SpecKit 的 spec + plan + tasks 流程已经达到了 Linear/Vercel 级别的严谨度。

可以加强的两个方向:
1. Alternatives Considered — 在 plan.md 中加入方案比较,面对 critic 时更有说服力
2. CI/CD 自动化 — 从手动部署升级到自动流水线,提升发布效率和可靠性

下一步:按业务模块拆解

这份总览文档讲的是"一般方法论"。接下来会对 Celoria 的具体模块做端到端的拆解: