# 专题 10-12:系统规划、分析与设计
本篇整合系统规划、系统分析和系统设计。复习主线是:规划回答 “是否值得做”,分析回答 “做什么”,设计回答 “怎么做”。
# 1. 三个阶段的定位
1 | flowchart LR |
| 阶段 | 核心问题 | 关注点 | 典型输出 |
|---|---|---|---|
| 系统规划 | 项目是否值得做?范围多大? | 问题、机会、范围、可行性、计划 | 问题陈述、范围陈述、可行性报告、项目计划 |
| 系统分析 | 系统要做什么? | 功能需求、非功能需求、业务流程、用户角色 | SRS、需求模型、用例描述、需求追溯矩阵 |
| 系统设计 | 系统怎么做? | 架构、模块、接口、数据库、部署、界面 | SDD、设计类图、序列图、构件图、部署图 |
# 2. 系统规划
系统规划是软件工程过程的起始阶段,用来定义项目范围、进度、预算和团队。它的关键任务是用较低成本判断项目是否值得继续。
# 核心目标
- 明确业务问题、机会或上级指示。
- 划定系统边界,避免范围蔓延。
- 通过可行性分析回答 “是否值得做”。
- 制定项目计划、预算、进度和团队安排。
- 向指导委员会汇报并获得正式授权。
# 项目启动的三类理由
| 理由 | 含义 | 示例 |
|---|---|---|
| 应对机会 | 新技术、新市场带来业务增长可能 | 开发线上服务抢占市场 |
| 解决问题 | 当前流程存在痛点、错误、延误或高成本 | 替换低效人工审批流程 |
| 依照指示 | 法规、战略或上级要求 | 数据合规整改系统 |
# 3. 系统规划五大任务
1 | flowchart LR |
| 任务 | 关键活动 | 主要发布物 |
|---|---|---|
| 列出问题 | 识别问题、机会或指示,评估优先级 | 初始问题陈述 |
| 协商范围 | 明确系统包含与不包含的业务功能 | 项目范围陈述 |
| 评估价值 | 从多维度判断项目是否值得做 | 可行性报告 |
| 制定计划 | WBS、PERT/CPM、甘特图、预算和团队安排 | 基线计划、进度表 |
| 汇报计划 | 向指导委员会说明方案并争取批准 | 项目计划书 / 项目方案 |
# 甘特图与 WBS
- WBS:把项目分解成可管理的工作包。
- 甘特图:用条状图表示任务、时间跨度和进度。
- PERT/CPM:分析任务依赖和关键路径。
《人月神话》的核心提醒:增加人手不一定缩短工期,后期加人可能因沟通和培训成本让项目更慢。
# 4. 可行性分析
可行性分析是系统规划阶段的核心决策点,通常形成《可行性研究报告》。
| 维度 | 核心问题 |
|---|---|
| 技术可行性 | 现有技术、团队能力和系统环境能否实现需求? |
| 经济可行性 | 成本是否可接受?收益是否值得投入? |
| 操作可行性 | 用户是否能接受?是否会与组织流程冲突? |
| 法律 / 合规可行性 | 是否符合数据保护、行业监管、知识产权等要求? |
| 进度可行性 | 是否能在规定期限内完成? |
| 资源可行性 | 人员、设备、软件许可等资源是否可获得? |
| 组织文化可行性 | 是否会遭遇强烈组织阻力? |
决策结果通常有三种:
- 全部通过:立项。
- 有条件通过:调整范围、资源或计划后继续。
- 否决:终止或重新规划。
# 5. 项目成功与失败因素
常见失败原因:
- 系统需求不完整或频繁变化。
- 用户参与不足。
- 缺少管理层支持。
- 计划不充分,目标不清楚。
- 缺少必要资源。
成功关键因素:
- 清晰的需求定义。
- 大量且有效的用户参与。
- 上层管理支持。
- 完整详细的项目计划。
- 符合实际的进度和里程碑。
# 6. 系统分析
系统分析是软件生命周期第二阶段,核心任务是理解业务需求并转化为详细的系统需求规格。它承接系统规划,为系统设计提供需求基线。
# 系统需求分类
| 类别 | 含义 | 示例 |
|---|---|---|
| 功能需求 | 系统必须实现的功能 | 在线提交订单、自动发送确认邮件 |
| 非功能需求 | 系统必须具备的质量属性或约束 | 响应时间小于 2 秒、支持 5000 并发、加密传输 |
# 好需求的准则
- 一致:不相互冲突。
- 完整:覆盖所有必要输入、输出和响应。
- 可行:在资源和约束下能实现。
- 需要:确实支持系统目标。
- 正确:准确表达用户真实需求。
- 可追踪:能映射到设计、代码和测试。
- 可验证:能通过测试或评审证明是否满足。
需求错误越晚发现,修复成本越高。需求阶段修正成本最低,到了设计、实现、测试和上线后会成倍放大。
# 7. 需求获取过程
需求获取不是一次性访谈,而是结构化过程。
1 | flowchart LR |
# 阶段一:发现和分析问题
核心是区分表面症状和根本问题,明确范围、目标和利益相关者。
输出:
- 问题陈述草案。
- 利益相关者清单。
- 初步系统改进目标。
# 阶段二:获取需求
系统分析员通常需要收集三类信息:
| 问题类型 | 核心关注 |
|---|---|
| 现有业务过程是什么 | 用户现在怎么工作 |
| 业务过程应该怎样完成 | 新系统应如何支持工作 |
| 需要什么信息 | 报表、字段、查询、决策信息 |
# 阶段三:归档和分析需求
常用工具:
- 用例:描述参与者与系统交互。
- 决策表:描述复杂业务规则。
- 需求表:结构化管理需求属性。
- SRS:正式记录功能需求、非功能需求、接口、约束。
常见问题:
- 遗漏、矛盾、不可行、重叠、二义性。
# 阶段四:需求管理
需求管理用于控制需求变化。项目中 50% 以上需求在上线前发生变化并不罕见。
重点:
- 建立正式变更流程。
- 每项变更评估影响并获得批准。
- 维护需求基线。
- 建立需求追溯矩阵。
# 8. 七种调查研究技术
| 技术 | 类型 | 主要优点 | 主要缺点 |
|---|---|---|---|
| 面谈 | 交互式 | 深入、灵活、可观察身体语言 | 耗时费钱,依赖沟通能力 |
| 问卷调查表 | 交互式 | 快速低廉覆盖大量人群,便于统计 | 难设计,回答率不稳定,无法追问 |
| JRP | 交互式 | 促进共识,减少矛盾,缩短需求获取时间 | 依赖主持人能力和会议准备 |
| 获取原型 | 交互式 | 直观验证需求和可用性 | 用户可能误以为原型就是最终系统 |
| 文档采样 | 非交互式 | 成本低,能了解现有流程和表单 | 依赖样本代表性和分析判断 |
| 实地调查 | 非交互式 | 借鉴行业经验和类似项目 | 外部经验可能不完全匹配 |
| 观察 | 非交互式 | 数据可靠,适合复杂任务 | 用户可能不自然,时机影响结果 |
推荐策略:
- 先看现有文档、表格、报告。
- 合适时观察现有系统。
- 用问卷澄清大范围问题。
- 再做面谈或 JRP。
- 对难以理解的功能构造获取原型。
- 对不确定信息追查到底。
# 9. 系统分析阶段的 UML 使用
| UML 图 | 分析阶段用法 |
|---|---|
| 用例图 | 定义系统边界、参与者和功能范围 |
| 用例描述 | 记录基本流、备选流和异常流 |
| 活动图 | 用业务语言描述业务流程,泳道按角色划分 |
| 领域类图 | 描述业务概念和关联,不强调技术实现 |
| 状态图 | 描述关键业务对象生命周期 |
| 高层序列图 | 可选,用业务语义描述交互场景 |
# 10. 系统设计
系统设计基于系统分析输出的 SRS,制定技术解决方案。它把业务语言转化为开发人员可实现的架构、组件、接口、数据模型和部署方案。
# 系统分析与系统设计对比
| 维度 | 系统分析 | 系统设计 |
|---|---|---|
| 核心问题 | 系统要做什么? | 系统怎么做? |
| 关注点 | 业务需求、业务规则 | 技术架构、实现方案 |
| 输出物 | 需求规格说明书 | 系统设计说明书 |
| UML 重点 | 用例图、活动图、领域类图 | 设计类图、序列图、构件图、部署图 |
| 面向角色 | 用户、业务分析师 | 架构师、开发人员 |
# 11. 系统设计的两级活动
# 架构设计 / 概要设计
主要任务:
- 确定分层架构、微服务、事件驱动等总体结构。
- 选择编程语言、框架、中间件和数据库。
- 划分模块、包、子系统和构件。
- 定义构件提供接口和需求接口。
- 规划部署节点和网络通信。
- 落实安全、性能、可扩展性等非功能需求。
常见架构模式:
| 架构模式 | 特点 | 典型场景 |
|---|---|---|
| 分层架构 | 表示层、业务层、持久层单向依赖 | Web 应用、企业系统 |
| 微服务架构 | 按业务能力拆分为可独立部署服务 | 大型分布式系统 |
| 事件驱动架构 | 组件通过事件松耦合通信 | 实时处理、IoT |
| 管道 - 过滤器 | 数据依次经过处理组件 | 编译器、ETL |
| 客户端 - 服务器 | 客户端请求,服务器响应 | Web、App 后端 |
# 详细设计
主要任务:
- 类设计:属性、方法、类型、可见性。
- 交互设计:用序列图描述关键用例实现。
- 状态设计:为复杂对象设计状态机。
- 数据库物理设计:表结构、字段、索引、约束。
- 界面设计:导航、布局、校验规则。
- 算法设计:复杂逻辑用活动图或伪代码表达。
# 12. 设计原则与常见反模式
# SOLID 原则
| 原则 | 含义 |
|---|---|
| 单一职责原则 | 一个类只应有一个引起它变化的原因 |
| 开闭原则 | 对扩展开放,对修改关闭 |
| 里氏替换原则 | 子类必须能够替换父类 |
| 接口隔离原则 | 不强迫客户依赖不用的方法 |
| 依赖倒转原则 | 依赖抽象,而不是具体实现 |
# 高内聚、低耦合
- 内聚:模块内部元素相关程度,越高越好。
- 耦合:模块之间相互依赖程度,越低越好。
# 常见反模式
- 上帝类:一个类承担过多职责。
- 瑞士军刀接口:接口过大,客户被迫依赖不需要的方法。
- 循环依赖:模块互相依赖,难以维护和测试。
- 功能依恋:一个类过度使用另一个类的数据。
- 过度设计:为不存在的未来需求设计复杂结构。
# 13. 设计阶段工作流与输出
1 | flowchart LR |
# 分析到设计的转化
| 转化 | 含义 |
|---|---|
| 领域类图 → 设计类图 | 添加方法、可见性、技术类、数据类型 |
| 用例描述 → 序列图 | 把业务事件流细化为对象调用 |
| 业务活动图 → 算法活动图 | 把业务流程转为技术控制流 |
| 需求模型 → 构件图 / 部署图 | 把需求约束转化为架构模块和运行拓扑 |
# 设计阶段输出物
- 系统设计说明书(SDD)。
- 系统架构图:包图、构件图。
- 设计类图。
- 数据库设计文档:ER 图、表结构。
- 接口协议文档:API 定义。
- 非功能需求实现策略。
- 详细设计文档:序列图、状态图、算法活动图、界面原型。
- 部署架构图。
- 设计评审记录。
# 14. 本专题考点提炼
- 系统规划回答 “是否值得做”,系统分析回答 “做什么”,系统设计回答 “怎么做”。
- 系统规划五大任务:列问题、协商范围、评估价值、制定计划、汇报计划。
- 可行性分析至少包括技术、经济、操作、法律 / 合规、进度、资源等维度。
- 功能需求描述系统做什么,非功能需求描述质量属性和约束。
- 好需求应一致、完整、可行、必要、正确、可追踪、可验证。
- 七种调查研究技术要组合使用,不要只靠面谈或个人假设。
- 系统设计分为架构设计和详细设计。
- 分析模型偏业务,设计模型偏技术实现。
- 高内聚、低耦合和 SOLID 是设计阶段的核心质量原则。
# 15. 快速自测
- 系统规划阶段为什么通常不大量引入普通用户?
- 项目范围陈述为什么重要?
- 可行性分析中经济可行性和操作可行性分别关注什么?
- 面谈、问卷、JRP、观察分别适合什么场景?
- SRS 应解决哪些问题?
- 架构设计和详细设计的区别是什么?
- 为什么设计类图不能简单照搬分析类图?