串联信息系统规划、分析、设计、实施与运行维护阶段,梳理各阶段目标、关键产出物和常用分析设计方法。
# 总览:系统生命周期主线
本篇整合系统规划、系统分析、系统设计、系统编码、系统测试和系统运行维护。复习主线是:规划回答 “是否值得做”,分析回答 “做什么”,设计回答 “怎么做”,编码回答 “如何实现”,测试回答 “是否正确”,运维回答 “如何长期稳定运行”。
# 生命周期阶段定位
1 | flowchart LR |
| 阶段 | 核心问题 | 关注点 | 典型输出 |
|---|---|---|---|
| 系统规划 | 项目是否值得做?范围多大? | 问题、机会、范围、可行性、计划 | 问题陈述、范围陈述、可行性报告、项目计划 |
| 系统分析 | 系统要做什么? | 功能需求、非功能需求、业务流程、用户角色 | SRS、需求模型、用例描述、需求追溯矩阵 |
| 系统设计 | 系统怎么做? | 架构、模块、接口、数据库、部署、界面 | SDD、设计类图、序列图、构件图、部署图 |
| 系统编码 | 如何用代码实现设计? | 环境、规范、代码、审查、单元测试、构建 | 源代码、单元测试、构建脚本、可部署制品 |
| 系统测试 | 系统是否正确且满足需求? | 缺陷发现、功能验证、质量评估、验收决策 | 测试计划、测试用例、缺陷报告、测试报告 |
| 运行维护 | 系统如何持续稳定运行? | 监控、故障、备份、安全、变更、优化 | 运维手册、维护记录、变更记录、知识库 |
# 系统规划
系统规划是软件工程过程的起始阶段,用来定义项目范围、进度、预算和团队。它的关键任务是用较低成本判断项目是否值得继续。
# 核心目标
- 明确业务问题、机会或上级指示。
- 划定系统边界,避免范围蔓延。
- 通过可行性分析回答 “是否值得做”。
- 制定项目计划、预算、进度和团队安排。
- 向指导委员会汇报并获得正式授权。
# 项目启动的三类理由
| 理由 | 含义 | 示例 |
|---|---|---|
| 应对机会 | 新技术、新市场带来业务增长可能 | 开发线上服务抢占市场 |
| 解决问题 | 当前流程存在痛点、错误、延误或高成本 | 替换低效人工审批流程 |
| 依照指示 | 法规、战略或上级要求 | 数据合规整改系统 |
# 系统规划五大任务
1 | flowchart LR |
| 任务 | 关键活动 | 主要发布物 |
|---|---|---|
| 列出问题 | 识别问题、机会或指示,评估优先级 | 初始问题陈述 |
| 协商范围 | 明确系统包含与不包含的业务功能 | 项目范围陈述 |
| 评估价值 | 从多维度判断项目是否值得做 | 可行性报告 |
| 制定计划 | WBS、PERT/CPM、甘特图、预算和团队安排 | 基线计划、进度表 |
| 汇报计划 | 向指导委员会说明方案并争取批准 | 项目计划书 / 项目方案 |
# 甘特图与 WBS
- WBS:把项目分解成可管理的工作包。
- 甘特图:用条状图表示任务、时间跨度和进度。
- PERT/CPM:分析任务依赖和关键路径。
《人月神话》的核心提醒:增加人手不一定缩短工期,后期加人可能因沟通和培训成本让项目更慢。
# 可行性分析
可行性分析是系统规划阶段的核心决策点,通常形成《可行性研究报告》。
| 维度 | 核心问题 |
|---|---|
| 技术可行性 | 现有技术、团队能力和系统环境能否实现需求? |
| 经济可行性 | 成本是否可接受?收益是否值得投入? |
| 操作可行性 | 用户是否能接受?是否会与组织流程冲突? |
| 法律 / 合规可行性 | 是否符合数据保护、行业监管、知识产权等要求? |
| 进度可行性 | 是否能在规定期限内完成? |
| 资源可行性 | 人员、设备、软件许可等资源是否可获得? |
| 组织文化可行性 | 是否会遭遇强烈组织阻力? |
决策结果通常有三种:
- 全部通过:立项。
- 有条件通过:调整范围、资源或计划后继续。
- 否决:终止或重新规划。
# 项目成功与失败因素
常见失败原因:
- 系统需求不完整或频繁变化。
- 用户参与不足。
- 缺少管理层支持。
- 计划不充分,目标不清楚。
- 缺少必要资源。
成功关键因素:
- 清晰的需求定义。
- 大量且有效的用户参与。
- 上层管理支持。
- 完整详细的项目计划。
- 符合实际的进度和里程碑。
# 系统分析
系统分析是软件生命周期第二阶段,核心任务是理解业务需求并转化为详细的系统需求规格。它承接系统规划,为系统设计提供需求基线。
# 系统需求分类
| 类别 | 含义 | 示例 |
|---|---|---|
| 功能需求 | 系统必须实现的功能 | 在线提交订单、自动发送确认邮件 |
| 非功能需求 | 系统必须具备的质量属性或约束 | 响应时间小于 2 秒、支持 5000 并发、加密传输 |
# 好需求的准则
- 一致:不相互冲突。
- 完整:覆盖所有必要输入、输出和响应。
- 可行:在资源和约束下能实现。
- 需要:确实支持系统目标。
- 正确:准确表达用户真实需求。
- 可追踪:能映射到设计、代码和测试。
- 可验证:能通过测试或评审证明是否满足。
需求错误越晚发现,修复成本越高。需求阶段修正成本最低,到了设计、实现、测试和上线后会成倍放大。
# 需求获取过程
需求获取不是一次性访谈,而是结构化过程。
1 | flowchart LR |
# 阶段一:发现和分析问题
核心是区分表面症状和根本问题,明确范围、目标和利益相关者。
输出:
- 问题陈述草案。
- 利益相关者清单。
- 初步系统改进目标。
# 阶段二:获取需求
系统分析员通常需要收集三类信息:
| 问题类型 | 核心关注 |
|---|---|
| 现有业务过程是什么 | 用户现在怎么工作 |
| 业务过程应该怎样完成 | 新系统应如何支持工作 |
| 需要什么信息 | 报表、字段、查询、决策信息 |
# 阶段三:归档和分析需求
常用工具:
- 用例:描述参与者与系统交互。
- 决策表:描述复杂业务规则。
- 需求表:结构化管理需求属性。
- SRS:正式记录功能需求、非功能需求、接口、约束。
常见问题:
- 遗漏、矛盾、不可行、重叠、二义性。
# 阶段四:需求管理
需求管理用于控制需求变化。项目中 50% 以上需求在上线前发生变化并不罕见。
重点:
- 建立正式变更流程。
- 每项变更评估影响并获得批准。
- 维护需求基线。
- 建立需求追溯矩阵。
# 七种调查研究技术
| 技术 | 类型 | 主要优点 | 主要缺点 |
|---|---|---|---|
| 面谈 | 交互式 | 深入、灵活、可观察身体语言 | 耗时费钱,依赖沟通能力 |
| 问卷调查表 | 交互式 | 快速低廉覆盖大量人群,便于统计 | 难设计,回答率不稳定,无法追问 |
| JRP | 交互式 | 促进共识,减少矛盾,缩短需求获取时间 | 依赖主持人能力和会议准备 |
| 获取原型 | 交互式 | 直观验证需求和可用性 | 用户可能误以为原型就是最终系统 |
| 文档采样 | 非交互式 | 成本低,能了解现有流程和表单 | 依赖样本代表性和分析判断 |
| 实地调查 | 非交互式 | 借鉴行业经验和类似项目 | 外部经验可能不完全匹配 |
| 观察 | 非交互式 | 数据可靠,适合复杂任务 | 用户可能不自然,时机影响结果 |
推荐策略:
- 先看现有文档、表格、报告。
- 合适时观察现有系统。
- 用问卷澄清大范围问题。
- 再做面谈或 JRP。
- 对难以理解的功能构造获取原型。
- 对不确定信息追查到底。
# 系统分析阶段的 UML 使用
| UML 图 | 分析阶段用法 |
|---|---|
| 用例图 | 定义系统边界、参与者和功能范围 |
| 用例描述 | 记录基本流、备选流和异常流 |
| 活动图 | 用业务语言描述业务流程,泳道按角色划分 |
| 领域类图 | 描述业务概念和关联,不强调技术实现 |
| 状态图 | 描述关键业务对象生命周期 |
| 高层序列图 | 可选,用业务语义描述交互场景 |
# 系统设计
系统设计基于系统分析输出的 SRS,制定技术解决方案。它把业务语言转化为开发人员可实现的架构、组件、接口、数据模型和部署方案。
# 系统分析与系统设计对比
| 维度 | 系统分析 | 系统设计 |
|---|---|---|
| 核心问题 | 系统要做什么? | 系统怎么做? |
| 关注点 | 业务需求、业务规则 | 技术架构、实现方案 |
| 输出物 | 需求规格说明书 | 系统设计说明书 |
| UML 重点 | 用例图、活动图、领域类图 | 设计类图、序列图、构件图、部署图 |
| 面向角色 | 用户、业务分析师 | 架构师、开发人员 |
# 系统设计的两级活动
# 架构设计 / 概要设计
主要任务:
- 确定分层架构、微服务、事件驱动等总体结构。
- 选择编程语言、框架、中间件和数据库。
- 划分模块、包、子系统和构件。
- 定义构件提供接口和需求接口。
- 规划部署节点和网络通信。
- 落实安全、性能、可扩展性等非功能需求。
常见架构模式:
| 架构模式 | 特点 | 典型场景 |
|---|---|---|
| 分层架构 | 表示层、业务层、持久层单向依赖 | Web 应用、企业系统 |
| 微服务架构 | 按业务能力拆分为可独立部署服务 | 大型分布式系统 |
| 事件驱动架构 | 组件通过事件松耦合通信 | 实时处理、IoT |
| 管道 - 过滤器 | 数据依次经过处理组件 | 编译器、ETL |
| 客户端 - 服务器 | 客户端请求,服务器响应 | Web、App 后端 |
# 详细设计
主要任务:
- 类设计:属性、方法、类型、可见性。
- 交互设计:用序列图描述关键用例实现。
- 状态设计:为复杂对象设计状态机。
- 数据库物理设计:表结构、字段、索引、约束。
- 界面设计:导航、布局、校验规则。
- 算法设计:复杂逻辑用活动图或伪代码表达。
# 设计原则与常见反模式
# SOLID 原则
| 原则 | 含义 |
|---|---|
| 单一职责原则 | 一个类只应有一个引起它变化的原因 |
| 开闭原则 | 对扩展开放,对修改关闭 |
| 里氏替换原则 | 子类必须能够替换父类 |
| 接口隔离原则 | 不强迫客户依赖不用的方法 |
| 依赖倒转原则 | 依赖抽象,而不是具体实现 |
# 高内聚、低耦合
- 内聚:模块内部元素相关程度,越高越好。
- 耦合:模块之间相互依赖程度,越低越好。
# 常见反模式
- 上帝类:一个类承担过多职责。
- 瑞士军刀接口:接口过大,客户被迫依赖不需要的方法。
- 循环依赖:模块互相依赖,难以维护和测试。
- 功能依恋:一个类过度使用另一个类的数据。
- 过度设计:为不存在的未来需求设计复杂结构。
# 设计阶段工作流与输出
1 | flowchart LR |
# 分析到设计的转化
| 转化 | 含义 |
|---|---|
| 领域类图 → 设计类图 | 添加方法、可见性、技术类、数据类型 |
| 用例描述 → 序列图 | 把业务事件流细化为对象调用 |
| 业务活动图 → 算法活动图 | 把业务流程转为技术控制流 |
| 需求模型 → 构件图 / 部署图 | 把需求约束转化为架构模块和运行拓扑 |
# 设计阶段输出物
- 系统设计说明书(SDD)。
- 系统架构图:包图、构件图。
- 设计类图。
- 数据库设计文档:ER 图、表结构。
- 接口协议文档:API 定义。
- 非功能需求实现策略。
- 详细设计文档:序列图、状态图、算法活动图、界面原型。
- 部署架构图。
- 设计评审记录。
# 系统编码
系统编码又称实现阶段,依据详细设计文档编写、调试并集成程序代码,把设计模型转化为可运行的软件系统。
# 编码阶段核心目标
- 忠实实现设计:把设计类图、序列图、状态图等模型落实为代码。
- 保证代码质量:通过编码规范、代码审查、单元测试提升正确性、可读性和可维护性。
- 持续集成验证:逐步集成模块,尽早发现接口和依赖问题。
- 落实非功能需求:在实现中处理性能、安全、并发、异常和资源约束。
- 产出可部署制品:形成可执行文件、库、镜像或发布包。
# 编码阶段核心活动
| 活动 | 要点 |
|---|---|
| 编码准备 | 搭建 IDE、编译器、调试器、构建工具,配置 Git 仓库和 CI 流水线 |
| 代码编写 | 按设计文档逐模块实现,遵循命名、格式、异常处理和注释规范 |
| 代码审查 | 检查正确性、可读性、安全性、性能隐患和边界条件 |
| 单元测试 | 针对函数、方法、类验证正常路径、边界条件和异常路径 |
| 持续集成 | 提交后自动编译、运行测试、做静态分析,提前暴露集成问题 |
| 缺陷修复 | 定位缺陷、修复、回归验证,形成闭环 |
# 现代实现方式
| 方式 | 核心特征 | 适用边界 |
|---|---|---|
| AI 辅助编程 | 用自然语言描述需求,由 AI 生成代码,人负责验证和审查 | 适合提升效率,但不能替代需求澄清、架构判断和质量把关 |
| 低代码开发 | 通过图形化配置、拖拽组件、自动代码生成快速构建应用 | 适合内部管理工具、简单流程、原型和 MVP;不适合高并发核心系统和复杂算法系统 |
| 版本管理 | 记录变更历史,支持多人协作、回退和分支开发 | Git 是主流基础设施,代码、配置、脚本都应纳入管理 |
编码不是 “把设计翻译成代码” 这么简单。实现阶段如果缺少规范、审查、测试和版本管理,设计质量很快会在代码层面退化。
# 系统测试
系统测试是验证与确认的核心活动,用执行程序的方式发现缺陷,验证系统是否符合需求规格,并评估性能、安全、可靠性等质量属性。
# 测试基本原则
- 测试只能显示缺陷存在,不能证明系统没有缺陷。
- 穷尽测试不现实,应按风险和优先级选择测试重点。
- 测试越早开始,缺陷修复成本越低。
- 缺陷有群集效应,少数模块常包含多数缺陷。
- 测试用例需要持续更新,避免 “杀虫剂悖论”。
- 测试策略依赖项目上下文,安全关键系统和普通业务系统的侧重点不同。
# 测试层次
| 层次 | 测试对象 | 目标 | 主要执行者 |
|---|---|---|---|
| 单元测试 | 函数、方法、类 | 验证最小可测单元的正常、边界和异常行为 | 开发人员 |
| 集成测试 | 模块、组件、服务接口 | 验证数据传递、协议一致性、事务完整性和协作关系 | 开发人员 / 测试人员 |
| 系统测试 | 完整系统 | 验证端到端业务流程、功能需求和非功能需求 | 专业测试团队 |
| 验收测试 | 待交付系统 | 由用户或业务代表确认是否满足业务预期 | 用户 / 业务代表 |
| 回归测试 | 已通过功能集合 | 变更后确认旧功能未被破坏 | 开发 / 测试团队 |
集成测试常见策略:
- 自顶向下集成:先测上层控制逻辑,再逐步加入底层模块,需要桩程序。
- 自底向上集成:先测底层模块,再逐步组装上层逻辑,需要驱动程序。
- 三明治集成:结合自顶向下和自底向上。
- 持续集成增量测试:每次提交后自动运行相关测试。
# 测试类型
| 类型 | 关注点 | 典型依据或场景 |
|---|---|---|
| 功能测试 | 系统是否按需求实现功能 | 需求文档、用例图、用例描述、业务规则 |
| 性能测试 | 响应时间、吞吐量、资源利用率 | 高并发访问、页面加载时间 |
| 压力测试 | 极端负载下的极限和恢复能力 | 逐步加压直到系统失效 |
| 容量测试 | 海量数据处理能力 | 大表查询、历史数据增长 |
| 安全测试 | 未授权访问、注入、越权、身份伪造 | SQL 注入、XSS、权限绕过 |
| 兼容性测试 | 不同硬件、系统、浏览器、设备表现 | 多浏览器、多终端适配 |
| 可用性测试 | 易用性、学习成本、任务完成效率 | 用户完成关键任务的时间和错误率 |
| 可靠性测试 | 长时间运行稳定性与故障恢复能力 | 7x24 运行、MTBF |
| 可维护性测试 | 修改和扩展难度 | 新增功能所需改动范围 |
# 重要测试概念
- Alpha 测试:开发组织内部,由最终用户或模拟用户在受控环境中进行。
- Beta 测试:真实用户环境中由最终用户进行,开发组织通常不在现场。
- UAT:用户验收测试,按验收标准和业务场景正式确认系统是否可接收。
- 冒烟测试:正式测试前快速验证核心功能,判断版本是否 “可测”。
- 健全性测试:局部修复或小改动后,快速验证相关功能是否正常。
- 探索性测试:测试人员凭经验自由探索系统,发现预设脚本外的问题。
- 黑盒测试:基于规格说明设计输入输出,不关心内部结构。
- 白盒测试:基于程序内部逻辑结构设计用例,关注路径和覆盖。
# 系统运行维护
系统运行维护是系统交付并投入使用后的持续保障活动,目标是让系统稳定运行,并在业务、法规、技术环境变化时不断修正和演化。
# 运行维护的核心目标
- 保障可用性:按 SLA 提供稳定服务。
- 快速响应故障:发现、诊断、恢复异常,降低业务中断时间。
- 适应业务变化:持续修改功能和规则。
- 优化性能:通过监控和调优提升响应速度、吞吐量和资源利用率。
- 管理技术债务:重构老旧代码、升级平台,避免系统腐化。
- 保障安全合规:修补漏洞,满足安全标准和法规要求。
# 系统运行活动
| 活动 | 要点 |
|---|---|
| 日常监控与巡检 | 监控服务器、网络、数据库、应用状态,设置告警阈值 |
| 事件与故障管理 | 对告警和报修进行响应、分级、排查、处理和复盘 |
| 备份与恢复 | 执行备份策略,定期演练恢复,保证灾难情况下数据可恢复 |
| 用户支持 | 受理咨询、权限申请、数据修正等工单,维护知识库 |
| 性能与容量管理 | 跟踪资源趋势,规划扩容或优化 |
| 安全管理 | 管理账号权限,监控异常访问,安装补丁,进行安全审计 |
# 软件维护四种类型
| 类型 | 含义 | 示例 |
|---|---|---|
| 纠错性维护 | 修复交付后发现的缺陷 | 修复金额计算错误 |
| 适应性维护 | 适应外部环境变化 | 适配新操作系统、数据库升级、新法规 |
| 完善性维护 | 增强已有功能或新增功能 | 新增报表导出、优化查询、改进界面 |
| 预防性维护 | 提前修改以避免未来问题 | 重构高耦合模块、消除硬编码配置 |
维护阶段通常占软件生命周期成本的大头。完善性维护占比最高,因为用户会在长期使用中不断提出新的业务期望。
# 考点提炼与快速自测
# 本专题考点提炼
- 系统规划回答 “是否值得做”,系统分析回答 “做什么”,系统设计回答 “怎么做”。
- 系统规划五大任务:列问题、协商范围、评估价值、制定计划、汇报计划。
- 可行性分析至少包括技术、经济、操作、法律 / 合规、进度、资源等维度。
- 功能需求描述系统做什么,非功能需求描述质量属性和约束。
- 好需求应一致、完整、可行、必要、正确、可追踪、可验证。
- 七种调查研究技术要组合使用,不要只靠面谈或个人假设。
- 系统设计分为架构设计和详细设计。
- 分析模型偏业务,设计模型偏技术实现。
- 高内聚、低耦合和 SOLID 是设计阶段的核心质量原则。
- 系统编码阶段要同时关注代码实现、规范、审查、单元测试、持续集成和版本管理。
- AI 辅助编程和低代码能提高实现效率,但不能替代质量控制和技术边界判断。
- 测试层次包括单元、集成、系统、验收和回归测试。
- 黑盒测试看规格和输入输出,白盒测试看内部结构和路径覆盖。
- 测试只能发现缺陷存在,不能证明系统绝对无缺陷。
- 系统运行侧重稳定服务,系统维护侧重修改和演化。
- 四类维护:纠错性、适应性、完善性、预防性,其中完善性维护通常工作量最大。
# 快速自测
- 系统规划阶段为什么通常不大量引入普通用户?
- 项目范围陈述为什么重要?
- 可行性分析中经济可行性和操作可行性分别关注什么?
- 面谈、问卷、JRP、观察分别适合什么场景?
- SRS 应解决哪些问题?
- 架构设计和详细设计的区别是什么?
- 为什么设计类图不能简单照搬分析类图?
- 编码阶段为什么必须配合代码审查、单元测试和持续集成?
- 低代码平台适合哪些场景?为什么不适合高并发核心系统?
- 单元测试、集成测试、系统测试和验收测试的对象分别是什么?
- 黑盒测试和白盒测试的主要区别是什么?
- 回归测试为什么适合自动化?
- 纠错性、适应性、完善性、预防性维护分别解决什么问题?
