软件工程是将系统化、规范化、可度量的方法应用于软件的开发、运行和维护的学科。
| 目标 | 说明 |
|---|
| 可靠性 | 软件在规定条件下正确运行 |
| 可维护性 | 软件易于修改和扩展 |
| 可扩展性 | 软件能适应需求增长 |
| 高效性 | 合理利用计算资源 |
| 可重用性 | 组件可在不同项目中复用 |
1968年NATO会议提出”软件危机”概念:
| 表现 | 原因 |
|---|
| 项目超期超预算 | 需求不明确、估算不准 |
| 软件质量低 | 缺乏质量保证流程 |
| 维护困难 | 代码结构混乱、文档缺失 |
| 需求变更频繁 | 缺乏变更管理 |
| 团队协作困难 | 沟通机制不完善 |
需求分析 → 系统设计 → 编码实现 → 测试验证 → 部署运维 → 维护演进
| 阶段 | 产出物 | 关键活动 |
|---|
| 需求分析 | 需求规格说明书 | 需求获取、分析、验证 |
| 系统设计 | 设计文档 | 架构设计、详细设计 |
| 编码实现 | 源代码 | 编码、代码审查 |
| 测试验证 | 测试报告 | 单元测试、集成测试、系统测试 |
| 部署运维 | 运行系统 | 部署、监控、运维 |
| 维护演进 | 新版本 | 缺陷修复、功能增强 |
| 模型 | 特点 | 适用场景 |
|---|
| 瀑布模型 | 线性顺序 | 需求明确的小项目 |
| V模型 | 测试与开发对应 | 安全关键系统 |
| 增量模型 | 分批交付 | 大型系统 |
| 螺旋模型 | 风险驱动 | 高风险项目 |
| 敏捷模型 | 迭代增量 | 需求变化频繁 |
软件产品质量
├── 功能适合性
│ ├── 完备性
│ ├── 正确性
│ └── 适当性
├── 性能效率
│ ├── 时间行为
│ ├── 资源利用
│ └── 容量
├── 兼容性
│ ├── 共存性
│ └── 互操作性
├── 可用性
│ ├── 可辨识性
│ ├── 易学性
│ └── 易操作性
├── 可靠性
│ ├── 成熟性
│ ├── 可用性
│ └── 容错性
├── 安全性
│ ├── 机密性
│ ├── 完整性
│ └── 不可抵赖性
├── 可维护性
│ ├── 模块化
│ ├── 可分析性
│ └── 可修改性
└── 可移植性
├── 适应性
├── 可安装性
└── 可替换性
| 原则 | 说明 |
|---|
| DRY | Don’t Repeat Yourself,消除重复 |
| KISS | Keep It Simple, Stupid,保持简单 |
| YAGNI | You Aren’t Gonna Need It,不做过度设计 |
| 关注点分离 | 每个模块只关注一个职责 |
| 信息隐藏 | 模块内部实现对外不可见 |
| 最少知识 | 最小化模块间的依赖 |
| 实践 | 说明 |
|---|
| 版本控制 | Git管理代码变更 |
| 持续集成 | 自动化构建和测试 |
| 代码审查 | 同行评审保证质量 |
| 自动化测试 | 测试金字塔覆盖 |
| 文档驱动 | 设计文档与代码同步 |