前置知识: 计算机基础

软件工程

6 min中级

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

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{未来修复成本}

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