{T}

架构-怎么做详细设计

一、章节导言:详细设计是架构落地的桥梁

许式伟在之前讨论过"架构=接口+规格",本节他回答了一个更实操的问题:如何把架构决策系统化地表达为一份可执行的设计文档?

详细设计不是写文档的仪式,而是思维的系统化输出。一份好的详细设计文档,应该让任何合格的工程师读完就能实现,而不需要反复追问"这个场景怎么处理"。

架构师的核心能力不是画图,而是把模糊的需求转化为精确的规格


二、核心概念与原理

2.1 详细设计在工程流程中的位置

图表渲染中…

详细设计与架构设计的关系

维度架构设计详细设计
关注点子系统划分、接口定义实现细节、数据模型、异常处理
受众架构师、技术负责人全体开发工程师
粒度系统级模块/类级
变更频率
输出架构文档详细设计文档

2.2 详细设计的核心要素

图表渲染中…

2.3 详细设计文档模板

许式伟推荐了一份结构化的详细设计文档模板:

图表渲染中…

2.4 接口定义:详细设计的核心输出

接口是子系统之间的契约,接口定义必须精确到可以直接编码的程度。

图表渲染中…

2.5 异常路径设计:最常遗漏的部分

大多数详细设计只描述正常路径,但生产环境中异常路径才是系统稳定性的试金石

图表渲染中…

许式伟的建议:为每个接口列举至少5种异常场景及其处理方式。这不是过度设计,而是生产系统的基本要求。

2.6 幂等设计

幂等性是分布式系统中最容易被忽视但最关键的设计约束。

图表渲染中…

2.7 性能预算

详细设计必须包含量化的性能目标,而不是模糊的"要快"。

图表渲染中…

三、设计原则与权衡(Trade-off 分析)

3.1 详细设计深度的 Trade-off

Trade-off一端另一端决策依据
设计深度 vs 效率详尽到伪代码接口+流程即可团队经验水平
文档 vs 代码先完善文档代码即文档项目阶段和团队文化
前瞻 vs 务实设计未来3年扩展只满足当前需求变更成本 vs 过度设计成本
标准化 vs 灵活统一模板按模块定制组织规模

3.2 详细设计的黄金法则

  1. 接口先行:先定义接口,再定义实现。接口是契约,实现是细节
  2. 异常路径必须列举:每个接口至少 5 种异常场景及处理方式
  3. 性能目标必须量化:P99 延迟、QPS 上限、容量增长率
  4. 幂等设计必须明确:哪些操作需要幂等、如何保证
  5. 待决策项必须标注:未决定的设计选择标注为 TODO,不要假装已经想清楚

四、实践案例与反模式

4.1 反模式:详细设计只描述正常路径

设计文档中只有"用户点击按钮→系统处理→返回成功"的流程,没有超时、重试、降级、冲突等异常场景。

后果:实现时遇到异常不知如何处理,各工程师自行处理导致行为不一致。

正确做法:每个接口列举正常路径 + 至少 5 种异常路径的处理方式。

4.2 反模式:接口定义含糊

text
创建文档接口:
输入:文档信息
输出:文档ID

缺少参数类型、必填/可选、错误码、幂等约定、并发策略。

正确做法

text
POST /api/v1/docs
Authorization: Bearer <access_token>
Content-Type: application/json
 
Request Body:
  title: string, required, max 200 chars
  description: string, optional, max 2000 chars
 
Response 201:
  doc_id: string (UUID)
  version: integer (初始值 1)
  created_at: string (ISO 8601)
 
Response 400: 参数校验失败
Response 401: Token 无效或过期
Response 429: 限流
 
Idempotency: 支持通过 Idempotency-Key 头实现幂等
Concurrency: 乐观锁,基于 version 字段

4.3 实战模式:画图程序的详细设计片段

以"创建图形"接口为例,展示完整的详细设计:

图表渲染中…

五、小结与关键要点

  1. 详细设计是架构落地的桥梁,它将架构决策转化为可实现、可测试的规格
  2. 接口定义是详细设计的核心输出,必须精确到可以直接编码的程度
  3. 异常路径设计是最常遗漏的部分,却是生产系统稳定性的关键
  4. 幂等设计必须明确:哪些操作需要幂等、如何保证、去重策略
  5. 性能目标必须量化:P99 延迟、QPS 上限、容量增长率,模糊目标等于没有目标
  6. 待决策项必须标注,不要用假设填满设计,诚实面对不确定性

相关章节34丨服务端开发的宏观视角 定义了架构=接口+规格;46丨服务端开发篇:回顾与总结 将总结整个服务端开发篇