软件分析与设计笔记 26:总结:把整条链路串起来
系列收尾:从需求到代码的完整链路回顾、每一环的产出与验收方式、六条贯穿全系列的原则,以及一份可以直接拿去做项目自查的清单。
本文是 《软件分析与设计笔记》 系列的第 26 篇,共 28 篇
这是我在学习软件分析与设计时整理的系列笔记。概念部分是我按自己的理解写的,示例与图示都是自己编、自己画的。理解有偏差的地方欢迎指出。
0 回头看这条链路
整个系列到这里结束。最后这一篇不做新内容的讲解,而是把前面 25 篇串成一条线:每一环在回答什么问题、留下什么产出、由谁验收。
如果只读一篇,这一篇的功能是导航;如果读完了全部,这一篇的功能是复盘。
为了让它具体一点,我把贯穿案例(片区家电维修派单系统)整条链路走完后的产出盘点一遍 —— 你能看到每一环真的留下了东西:
| 环节 | 本例中留下的产出 |
|---|---|
| 事实调查 | 小林的一天、80 通电话的分类统计 |
| 范围界定 | in/out of scope 两张清单、小林画像、客户旅程图 |
| 需求结构化 | 10 条用户故事 + 验收标准 |
| 功能建模 | 15 个用例、两张活动图、5 个实体的领域模型 |
| 界面设计 | 派单台、工程师 App、经理看板三张线框 |
| 质量属性 | 三张容量表、五条安全要求、三条降级策略 |
| 数据建模 | ERD、数据字典、3NF 表、LDM |
| 对象建模 | 申请配件的顺序图、6 个类的类图 |
| 设计建模 | 表结构 + 三个数据代理 + 事务边界 |
| 代码与重构 | 五条派单测试 + 重写后的 dispatch() |
1 完整链路
| 环节 | 在回答什么 | 产出 | 验收者 | 对应笔记 |
|---|---|---|---|---|
| 事实调查 | 现在实际是怎么运作的 | 访谈记录、观察结论 | 团队内部 | 04、13 |
| 范围界定 | 这次做什么、不做什么 | 范围清单、用户画像、旅程图 | 业务方 | 05、06 |
| 需求结构化 | 用户到底要什么 | 用户故事 + 验收标准 | 业务方 + 开发 | 07 |
| 功能建模 | 系统要做什么 | 用例模型、活动图、领域模型 | 业务方 | 08–11 |
| 界面设计 | 用户怎么操作 | 线框图、屏幕流程 | 业务方 | 12 |
| 质量属性 | 做得多好 | 非功能需求、测试用例 | 运维 + 测试 | 14、15 |
| 数据建模 | 数据怎么组织 | ERD、规范化表、LDM | 开发 | 18、19 |
| 对象建模 | 用对象怎么表达 | 类图、顺序图 | 开发 | 20–22 |
| 设计建模 | 怎么落到平台 | 表结构、访问层、设计方案 | 开发 | 23 |
| 代码与重构 | 结构怎么不烂 | 可维护的代码 | 团队 | 24、25 |
这张表横着看是顺序,竖着看是每一环都有自己的验收者。如果某一环找不到验收者,那一环的产出大概率没人真正需要。
本例里有一环差点没有验收者,值得记下来:界面设计那一环。最初的计划是「开发自己画个能用的就行」,后来才发现派单台的布局只有小林能判断对错 —— 于是验收者从「开发」改成了「小林」。改完之后,那一环的产出质量立刻不一样了。
2 六条贯穿全系列的原则
把 25 篇里反复出现的东西提出来,其实是六句话。每一句都能在本例里找到落点:
2.1 需求要能被验证
「系统要快」不是需求,「峰值时段 2 秒内返回」才是。这条贯穿了笔记 02、07、15。
本例的版本:「早 9:00–10:00 报修高峰,客户查工单进度的响应时间 95 分位不超过 2 秒」。
2.2 事实和假设必须分开记
用户说的、观察到的、你自己推断的,是三类东西。混在一起,几轮讨论之后假设就变成「大家都知道的事实」。见笔记 04。
本例的落点:「客服日均 80 通电话」是事实;「所以人力是瓶颈」是假设 —— 而后者被数据推翻了(真正的瓶颈是排期不可见)。
2.3 能算出来的不要存
无论是一条需求、一个字段还是一个属性 —— 同一个事实存在两处,就一定会有不一致的那天。见笔记 09、19。
本例的落点:缺料率、平均上门时长、完成率都不建字段;合计金额也不存字段。
2.4 行为跟着数据走
「计算工单金额」属于工单,不属于工具类;「依恋情结」之所以是坏味道,就是因为行为离开了它的数据。见笔记 20、25。
本例的落点:WorkOrder.canRequestParts() 而不是控制器里连取三个 getter。
2.5 让变化集中
高内聚让改动集中,低耦合让改动不外溢。判断一句需求的影响面,看的是「要改几个文件」。见笔记 23、24。
本例的落点:新增「保修单」这个需求,重设计后只需新增一个类。
2.6 没有测试的重构是赌博
结构改善必须以「行为不变」为前提,而这一点只能靠测试来保证。见笔记 14、25。
本例的落点:重构那个 280 行的 dispatch() 之前,先补了五条测试。
3 一份可以拿去用的自查清单
3.1 需求阶段
- 每条需求都能写出一条验收标准吗?
- 用户画像里有行为与痛点,而不只是人口统计?
- 范围里有明确的 out of scope 清单吗?
- 例外流程和负面场景都写了吗?
- 那些「假设与理由」里,有几条已经被数据验证过?
3.2 设计阶段
- 每个用例都能指出由哪些对象协作完成吗?
- 基数(1 对多、多对多)都是问过业务方确认的,不是猜的?
- 有没有存着本可以算出来的字段?
- 每个类的职责能用一句话说清楚吗?
- 加一种新类型,需要改几个文件?
- 外部依赖挂了的时候,业务流程还能继续吗(降级策略)?
3.3 验收阶段
- 非功能需求都带指标、条件、阈值吗?
- 测试数据覆盖了边界值与异常条件吗?
- 一条需求能一路追到代码吗?
- 那几条「只存在于代码里」的规则,补上测试了吗?
最后一条是 25 篇留下的:「紧急单优先」这条规则没写在任何文档里,只存在于代码中。如果它没有测试,那它对团队来说等于不存在 —— 下次重构就会丢掉。
4 结语
4.1 一个最有用的自检问题
如果要从整个系列里挑出一个最有用的自检问题,我选这个:
这个决定,如果三个月后被推翻,代价有多大?
它同时适用于「这条需求要不要问清楚」「这个字段要不要存」「这个类要不要抽抽象父类」。很多设计判断没有标准答案,但「被推翻的代价」这个尺度总是能算的。
本例里用这个问题做过三次决定,结果都不一样 —— 这正好说明它不是一条死规则:
| 决定 | 推翻的代价 | 结论 |
|---|---|---|
| 「一个工程师能否属多个片区」要不要现在问清 | 几千条数据要迁移 + 加关联表 | 现在问(代价太高) |
| 缺料率要不要存成字段 | 改报表口径 | 不存(随时能改) |
| 要不要为「工单类型」做多态 | 加一个类 | 做(扩展成本低,不做的代价更高) |
4.2 一个更狠的追问
如果还想再狠一点,可以追问第二句:
这个决定,如果做错了,谁会先发现?
这一问能把「有没有验收者」这件事逼出来。本例里「界面布局对不对」这个决定,做错了第一个发现的人是小林 —— 所以她是验收者。而「表结构合不合理」这个决定,做错了第一个发现的人是三个月后的开发 —— 那时代价已经很高了。
两个问题合起来,就是这套方法论的骨架:算代价,找验收者。
5 系列导航
- 起步与方法:01 课程地图、02 设计思维与数据、03 Agile 与 Scrum
- 需求与分析:04 案例预习、05 用户画像与旅程图、06 数据侧界定、07 用户故事、08 用例与活动图、09 业务实体、10 精炼用例模型、11 Agentic AI
- 质量与交付:12 前端设计、13 需求获取、14 软件测试、15 非功能需求、16 URS 交付物、17 生成式 AI 实践
- 设计与结构:18 数据库分析与 ERD、19 规范化与 LDM、20 面向对象概念、21 UML、22 分析建模、23 设计建模、24 设计原则、25 重构
- 应试:27 Paper 1 完整演算、28 draw.io 作图手册
6 核心概念回顾(术语表)
下面这张表不是新的术语表,而是一次回顾:这些概念的完整解释在前面各自的篇章里,这里只回答一个问题 —— 它们为什么值得记住。
| 术语 | 中文 | 为什么它重要 |
|---|---|---|
| acceptance criteria | 验收标准 | 需求是否可验证的唯一判据 |
| assumption | 假设 | 必须被验证、且要写明理由的推断 |
| data-informed design | 数据知情设计 | 数据与用户互相校验,而不是任一方独裁 |
| use case | 用例 | 把使用者视角的诉求翻译成系统交互 |
| actor | 参与者 | 与系统交互的外部角色,判断依据是目标 |
| domain model | 领域模型 | 不背实现包袱的业务概念模型 |
| normalization | 规范化 | 用结构消除冗余,防止更新异常 |
| multiplicity | 重数 | 关系两端各有多少个实例,决定表怎么建 |
| encapsulation | 封装 | 让状态只能通过约定的方式被改变 |
| polymorphism | 多态 | 用对象自己回答代替类型判断 |
| cohesion / coupling | 内聚 / 耦合 | 衡量设计好坏的两个具体尺度 |
| refactoring | 重构 | 行为不变的前提下持续改善结构 |
| traceability | 可追溯性 | 每条需求都能追到它的来源与实现 |
| non-functional requirement | 非功能需求 | 决定系统「做得多好」,必须量化 |
| degradation | 降级 | 外部依赖失效时保住核心流程 |
| guardrail | 护栏 | 自主系统能被信任的前提 |