跳转至

软件工程基础

概述

软件工程是应用计算机科学、数学和管理科学等原理,以工程化的原则和方法来解决软件问题的学科。软件工程的目标是生产高质量的软件。

软件生命周期

软件生命周期

软件从提出到废弃的整个过程。

graph LR
    A[问题定义] --> B[需求分析]
    B --> C[系统设计]
    C --> D[编码实现]
    D --> E[测试验证]
    E --> F[运行维护]
    F -->|需要修改| C
    F -->|废弃| G[退役]

1. 问题定义

问题定义阶段

确定要解决的问题是什么。

任务:

  • 明确问题范围
  • 确定系统目标
  • 分析可行性

2. 需求分析

需求分析阶段

确定系统必须做什么。

任务:

  • 功能需求分析
  • 性能需求分析
  • 约束条件分析
  • 编写需求规格说明书

需求类型:

  • 功能需求: 系统必须提供的功能
  • 性能需求: 响应时间、吞吐量等
  • 约束需求: 技术限制、成本限制

3. 系统设计

系统设计阶段

确定系统如何实现需求。

设计层次:

  1. 概要设计: 系统总体结构
  2. 模块划分
  3. 接口定义
  4. 数据结构设计

  5. 详细设计: 模块内部设计

  6. 算法设计
  7. 数据结构细化
  8. 接口细化

4. 编码实现

编码实现阶段

将设计转换为程序代码。

任务:

  • 选择编程语言
  • 编写程序代码
  • 代码审查
  • 单元测试

编码规范:

  • 命名规范
  • 注释规范
  • 格式规范
  • 文件组织规范

5. 测试验证

测试验证阶段

发现并纠正程序错误。

测试类型:

  1. 单元测试: 测试单个模块
  2. 集成测试: 测试模块组合
  3. 系统测试: 测试整个系统
  4. 验收测试: 用户验收测试

6. 运行维护

运行维护阶段

软件交付使用后的维护。

维护类型:

  • 改正性维护: 修复发现的错误
  • 适应性维护: 适应环境变化
  • 完善性维护: 扩充功能
  • 预防性维护: 提高可维护性

软件开发模型

1. 瀑布模型

瀑布模型

传统的线性顺序模型。

graph TB
    A[需求分析] --> B[系统设计]
    B --> C[编码实现]
    C --> D[测试验证]
    D --> E[运行维护]

特点:

  • 阶段清晰
  • 文档驱动
  • 适合需求明确的项目

缺点:

  • 缺乏灵活性
  • 风险后置

2. 增量模型

增量模型

分批逐步完成系统。

特点:

  • 逐步增加功能
  • 早期交付部分功能
  • 降低开发风险

3. 螺旋模型

螺旋模型

结合瀑布模型和原型模型,强调风险分析。

特点:

  • 风险驱动
  • 迭代开发
  • 适合大型项目

4. 敏捷开发

敏捷开发

强调快速响应变化的开发方法。

核心价值观:

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

敏捷方法:

  • Scrum: 迭代增量开发
  • XP (极限编程): 快速反馈
  • Kanban: 可视化工作流

软件质量

软件质量属性

质量属性 说明
功能性 满足用户需求的能力
可靠性 在规定条件下正常运行的能力
易用性 用户使用的方便程度
效率 资源利用率
可维护性 修改和维护的难易程度
可移植性 在不同环境下的运行能力

软件质量保证

质量保证活动

确保软件质量的一系列活动。

活动:

  • 需求评审
  • 设计评审
  • 代码审查
  • 测试验证
  • 质量度量

软件项目管理

1. 项目计划

  • 工作量估算
  • 进度安排
  • 资源分配
  • 风险管理

2. 项目监控

  • 进度跟踪
  • 成本控制
  • 质量监控
  • 风险监控

3. 配置管理

配置管理

管理软件的变更。

活动:

  • 版本控制
  • 变更控制
  • 配置审计
  • 状态记录

参考资料