前置知识: 计算机基础

软件工程

8 minIntermediate2026/6/14

软件工程:需求分析、设计模式、敏捷开发、测试策略与项目管理

1. 软件工程概述

1.1 软件危机

1968年 NATO 会议提出”软件危机”概念

  • 软件项目经常超时、超预算
  • 软件质量低劣、维护困难
  • 缺乏系统化的开发方法

1.2 软件生命周期

需求分析 → 系统设计 → 详细设计 → 编码实现 → 测试 → 部署 → 维护

1.3 软件过程模型

模型特点适用场景
瀑布模型线性顺序,文档驱动需求明确的项目
增量模型分批交付,逐步完善大型项目
螺旋模型风险驱动,迭代高风险项目
喷泉模型面向对象,迭代OO项目
敏捷模型快速迭代,拥抱变化需求变化频繁

2. 需求工程

2.1 需求分

  • 功能需求:系统应该做什么
  • 非功能需求:系统应该做到什么程度
    • 性能需求:响应时间、吞吐量
    • 安全需求:认证、授权、加密
    • 可靠性需求:MTBF、MTTR
    • 可用性需求:并发用户数

2.2 需求获取方法

方法优点缺点
访谈深入了解耗时
问卷覆盖面广深度不足
观察真实场景受霍桑效应影响
原型直观验证可能偏离实际

2.3 用例建模

用例要素:

  • 参与者(Actor):与系统交互的外部实体
  • 用例(Use Case):系统提供的功能
  • 关系:包含(include)、扩展(extend)、泛化(generalization)

2.4 需求规格说明

SRS(Software Requirements Specification)应满足:

  • 完整性:覆盖所有需求
  • 一致性:需求之间不矛盾
  • 可验证性:每条需求可测试
  • 可追踪性:需求可追溯到来源

3. 软件设计

3.1 设计原则(SOLID)

原则含义
单一职责(SRP)一个只有一个变化原因
开闭原则(OCP)对扩展开放,对修改关闭
里氏替换(LSP)可替换父
接口隔离(ISP)客户端不应依赖不需要的接口
依赖反转(DIP)依赖抽象而非具体实现

3.2 设计模式分

创建型模式

模式
单例(Singleton)确保只有一个实例
工厂方法(Factory Method)由子决定创建哪个对象
抽象工厂(Abstract Factory)创建一族相关对象
建造者(Builder)分步骤构建复杂对象
原型(Prototype)通过克隆创建对象

结构型模式

模式
适配器(Adapter)接口转换
桥接(Bridge)分离抽象与实现
组合(Composite)树形结构统一处理
装饰器(Decorator)动态添加职责
外观(Facade)简化子系统接口
代理(Proxy)控制对象访问

行为型模式

模式
观察者(Observer)一对多依赖通知
策略(Strategy)算法族可互换
模板方法(Template Method)定义算法骨架
命令(Command)请求参数化
迭代器(Iterator)顺序访问集合
状态(State)状态驱动行为

3.3 架构模式

模式特点适用场景
分层架构关注点分离企业应用
MVC模型-视-控制器Web应用
微服务独立部署、松耦合大型系统
事件驱动异步消息通信实时系统
CQRS读写分离高并发系统

4. 敏捷开发

4.1 敏捷宣言

  • 个体和互动 高于 流程和工具
  • 工作的软件 高于 详尽的文档
  • 客户合作 高于 合同谈判
  • 响应变化 高于 遵循计划

4.2 Scrum 框架

角色职责
Product Owner管理产品待办列表
Scrum Master促进 Scrum 实践
Development Team自组织开发
事件时长目的
Sprint1~4周迭代开发
Sprint计划4h确定Sprint目标
每日站会15min同步进展
Sprint评审4h展示成果
Sprint回顾3h持续改进

4.3 看板方法

  • 可视化工作流
  • 限制在制品(WIP)
  • 管理流动
  • 显式化策略
  • 实施反馈环

4.4 极限编程(XP)

实践说明
结对编程两人一台电脑
测试驱动开发先写测试再写代码
持续集成频繁集成到主干
重构改善代码结构
简单设计只实现当前需要

5. 软件测试

5.1 测试层次

层次目标方法
单元测试验证模块功能白盒测试
集成测试验证模块接口灰盒测试
系统测试验证系统功能黑盒测试
验收测试验证用户需求黑盒测试

5.2 白盒测试

语句覆盖:每条语句至少执行一次。

分支覆盖:每个分支至少执行一次。

路径覆盖:每条路径至少执行一次。

条件覆盖:每个条件的真假至少各取一次。

覆盖强度:路径 > 分支 > 语句

5.3 黑盒测试

等价类划分:将输入分为有效和无效等价

边界值分析:测试边界附近的值。

因果图:分析输入条件之间的逻辑关系。

正交实验法:减少测试用例数量。

5.4 测试金字塔

        /  E2E测试  \        少量,慢
       /  集成测试    \      适量
      /   单元测试      \    大量,快

5.5 度量指标

缺陷密度=缺陷数代码行数(KLOC)\text{缺陷密度} = \frac{\text{缺陷数}}{\text{代码行数(KLOC)}}

测试覆盖率=已覆盖项总项×100%\text{测试覆盖率} = \frac{\text{已覆盖项}}{\text{总项}} \times 100\%

MTBF=总运行时间故障次数\text{MTBF} = \frac{\text{总运行时间}}{\text{故障次数}}

6. 软件度量

6.1 面向规模度量

生产率=KLOC人月\text{生产率} = \frac{\text{KLOC}}{\text{人月}}

质量=缺陷数KLOC\text{质量} = \frac{\text{缺陷数}}{\text{KLOC}}

6.2 面向对象度量(CK度量集)

度量含义
WMC的方法权重总和
DIT继承深度
NOC数量
CBO耦合度
RFC方法调用数
LCOM方法内聚度

6.3 功能点分析

FP=UFP×VAF\text{FP} = \text{UFP} \times \text{VAF}

其中 UFP 为未调整功能点,VAF 为价值调整因子。

7. 软件维护

7.1 维护

占比说明
完善性维护50%~66%增强功能
适应性维护18%~25%适应环境变化
纠错性维护17%~21%修复缺陷
预防性维护4%提高可维护性

7.2 技术债务

技术债务是选择快速方案而非更好方案所产生的额外工作:

技术债务成本=当前妥协成本+未来修复成本\text{技术债务成本} = \text{当前妥协成本} + \text{未来修复成本}

管理策略:定期重构、代码审查、自动化测试。