Software Engineering 软件工程
1. 概述
软件工程(Software Engineering)是研究如何以系统化(Systematic)、规范化(Disciplined)、可度量(Quantifiable)的方法,将工程原理应用于软件的开发(Development)、运行(Operation)与维护(Maintenance),以及对这些方法的实证研究的学科。
1.1 软件工程 vs 计算机科学
| 维度 | 计算机科学(Computer Science) | 软件工程(Software Engineering) |
|---|---|---|
| 关注点 | 理论、算法、计算本质 | 工程实践、过程、团队协作、交付 |
| 典型问题 | "这个问题可计算吗?算法复杂度多少?" | "如何在预算内交付可靠可维护的系统?" |
| 产出 | 理论、原型、论文 | 可运行、可维护、满足需求的软件产品 |
| 本质 | 发现"是什么" | 创造"如何做" |
Software Crisis(软件危机):20 世纪 60 年代,随着软件规模增长,出现进度超期、预算超支、质量失控、维护困难等现象的统称,直接催生了软件工程这门学科。
SRS(Software Requirements Specification,软件需求规格说明书):描述软件系统应具备的功能、行为与约束的正式文档。
SDLC(Software Development Life Cycle,软件开发生命周期):软件从概念到退役所经历的全部阶段。
1.2 软件工程的三支柱
- 过程(Process):把人的活动组织成可重复、可改进的流程,如瀑布、敏捷、DevOps。
- 方法(Methods):完成每一步活动的具体技术,如需求建模、架构设计、测试策略。
- 工具(Tools):支撑过程与方法自动化的软件,如 IDE、Git、CI/CD、测试框架。
过程、方法、工具三者共同构成软件工程的"工程性"——它不是一门手艺(craft),而是一门有纪律的工程学科。全球公认的权威知识框架是 IEEE 计算机学会发布的 SWEBOK(Software Engineering Body of Knowledge,软件工程知识体系),其最新 V4.0 定义了 18 个知识领域。
1.3 软件完整分类——规范差异的总纲
软件工程的知识体系(SWEBOK)是"公分母",但工程规范不能一刀切:软件分很多类型,面向的用户不同,质量属性优先级、生命周期模型、架构设计依据、编码底线都随之不同。因此软件工程实践的第一步是先给软件分类——分类决定规范。按"用户/消费者 + 运行形态"可把软件完整划分为五类:
| 类别 | 代表 | 用户/消费者 | 运行形态 |
|---|---|---|---|
| 底层/系统软件 | 操作系统、驱动、固件、嵌入式、编译器 | 机器 / 硬件 | 直接运行在硬件之上 |
| 中间件/基础设施 | nginx、redis、Kafka、消息队列、容器运行时 | 其他软件系统 | 独立进程,通过协议对外提供服务 |
| 开发工具 | CLI、IDE、CI/CD、包管理器、调试器 | 开发者 | 交互式/脚本化,嵌入开发工作流 |
| 框架/库 | Spring、React、SDK、各类依赖 | 开发者(复用者) | 代码库,编译/部署期被组装进应用 |
| 业务系统/应用软件 | ERP、电商、OA、行业应用、消费级 App | 企业用户 / 终端消费者 | 面向具体业务流程与用户界面 |
1.4 业务系统开发的本质
业务系统/应用软件(ERP、电商、OA、行业应用、消费级 App)是五类软件中需求量最大的一类,也是绝大多数工程师真正在做的软件。它的本质决定了工程重心不在"造工具",而在组织工具与面向用户,这与底层软件、中间件、开发工具、框架/库有本质区别。
这一判断落到工程规范上,业务系统应:优先复用成熟框架(不重复造轮子)、保持技术栈克制、快速迭代响应业务、重可维护性与测试,对应关系见 4.8 约束来源 与 5.4 质量属性优先级 中"业务系统"一列。
2. 生命周期与过程模型
2.1 软件生命周期模型(Process Models)
| 模型 | 核心思想 | 适用场景 | 优点/缺点 |
|---|---|---|---|
| 瀑布模型(Waterfall) | 需求→设计→实现→测试→部署,阶段严格串行 | 需求明确、稳定的项目(如嵌入式、政府项目) | 文档规范/变更代价高、反馈晚 |
| V 模型(V-Model) | 把测试与开发阶段对应起来,强调验证与确认 | 安全关键系统(航天、医疗) | 测试前置/仍偏串行 |
| 迭代/增量模型 | 分多轮迭代交付可运行子集,逐步完善 | 需求不完整、需快速反馈 | 尽早得到可用版本/规划复杂 |
| 螺旋模型(Spiral) | 四象限(目标→风险→开发→评审)循环,风险驱动 | 大型、高风险项目 | 重视风险/成本高、管理重 |
| 敏捷(Agile / Scrum) | 短周期迭代、拥抱变化、持续交付、自组织团队 | 互联网产品、需求频繁变化 | 响应快/文档与整体规划弱 |
| DevOps / 持续交付 | 开发与运维一体化,CI/CD 自动化流水线 | 需要频繁可靠发布的产品 | 发布快、质量稳/基础设施要求高 |
Agile(敏捷):基于《敏捷宣言》的一组价值观与方法论,强调个体与互动、可用软件、客户协作、响应变化。
Scrum:最流行的敏捷框架,以 Sprint(固定时长迭代,通常 1-4 周)、站会、评审会、回顾会为节奏。
DevOps:Development(开发)与 Operations(运维)的融合,通过自动化(CI/CD)打通"构建-测试-部署-监控"闭环。
CI(Continuous Integration,持续集成):频繁地把代码合并到主干并自动构建、自动测试。
CD(Continuous Delivery/Deployment,持续交付/部署):让每次通过测试的构建都能随时可靠发布(Delivery 需人工批准,Deployment 全自动)。
2.2 过程框架标准:ISO/IEC/IEEE 12207
ISO/IEC/IEEE 12207 是软件生命周期过程国际标准,把软件工程活动组织为 四组过程:
| 过程组 | 包含过程 | 说明 |
|---|---|---|
| 协议过程(Agreement) | 获取(Acquisition)、供应(Supply) | 客户与供应商之间的契约活动 |
| 组织项目使能过程(Organizational) | 管理、基础设施、过程改进、人力资源、资产管理 | 支撑组织的长期能力 |
| 项目过程(Project) | 规划、评估与控制、风险管理、配置管理、质量保证、度量 | 单个项目的计划与治理 |
| 技术过程(Technical) | 需求定义→需求分析→架构设计→实现→集成→验证→运行→维护 | 真正"做出软件"的核心工程活动 |
这四组过程的整体结构,详见 7.3 包图。
3. SWEBOK 知识体系
SWEBOK(Software Engineering Body of Knowledge)由 IEEE 计算机学会组织编写,是全球公认的软件工程知识权威框架。V4.0 共 18 个知识领域(Knowledge Area, KA),可分为四类:
| 类别 | 知识领域 | 核心内容 |
|---|---|---|
| 软件工程核心过程 | 1. Software Requirements 需求 | 需求获取、分析、规格说明、验证与管理 |
| 2. Software Architecture 架构 | 系统结构、质量属性、架构决策与文档化 | |
| 3. Software Design 设计 | 模块划分、设计模式、接口与数据设计 | |
| 4. Software Construction 构建 | 编码、单元测试、代码评审、编码规范 | |
| 5. Software Testing 测试 | 测试级别、测试技术、测试管理、缺陷跟踪 | |
| 软件运营与维护 | 6. Software Engineering Operations 运维 | 部署、监控、容量管理、事件响应(含 DevOps) |
| 7. Software Maintenance 维护 | 缺陷修复、适应性/完善性维护、再工程 | |
| 8. Software Configuration Management 配置管理 | 版本控制、变更管理、构建管理、发布管理 | |
| 管理、质量与安全 | 9. Software Engineering Management 管理 | 项目计划、估算、进度、人员与风险管理 |
| 10. Software Engineering Process 过程 | 过程定义、过程改进(CMMI、SPICE) | |
| 11. Software Engineering Models and Methods 模型与方法 | UML、形式化方法、模型驱动开发等 | |
| 12. Software Quality 质量 | 质量模型、质量保证(SQA)、质量度量 | |
| 13. Software Security 安全 | 威胁建模、安全编码、漏洞管理、安全测试 | |
| 专业与学科基础 | 14. Software Engineering Professional Practice 专业实践 | 职业道德、团队协作、沟通 |
| 15. Software Engineering Economics 经济学 | 成本估算、ROI、价值决策 | |
| 16. Computing Foundations 计算基础 | 算法、数据结构、操作系统、网络、数据库 | |
| 17. Mathematical Foundations 数学基础 | 离散数学、概率统计、逻辑 | |
| 18. Engineering Foundations 工程基础 | 工程建模、度量、试验设计、工程伦理 |
Knowledge Area(知识领域):SWEBOK 中划分学科内容的独立主题单元,每个 KA 都有公认的核心概念与参考书目。
CMMI(Capability Maturity Model Integration,能力成熟度模型集成):评估与改进组织过程成熟度(1-5 级)的模型。
SQA(Software Quality Assurance,软件质量保证):通过计划、评审与审计确保软件及过程符合要求的管理活动。
4. 架构·设计·编码的定位与参考资源
软件工程中常被混淆的三个概念——架构设计(Architecture)、详细设计(Design)、编码规范与实现(Construction)——在业界是三个独立的研究层面,分别对应 SWEBOK 中的不同知识领域(KA)。本章厘清它们的边界、归属、代码摆放与职责划分的业界流派,并给出完整参考资料清单。
4.1 三个层面的定位对比
| 层面 | 关注点 | 决策时机 | 改动成本 | SWEBOK 归属 | 主要交付物 |
|---|---|---|---|---|---|
| 架构设计(Architecture) | 系统级结构:模块边界、组件关系、部署、质量属性(性能/安全/可用性) | 项目早期 | 高,后期极难改 | KA2 Software Architecture | 架构文档、ADR、部署图 |
| 详细设计(Design) | 部件内部:类、接口、数据结构、设计模式 | 架构确定后 | 中,模块内可改 | KA3 Software Design | 设计文档、类图、接口定义 |
| 编码规范与实现(Construction) | 代码怎么写:命名、目录摆放、职责划分、lint、测试习惯 | 每日开发 | 低,随时可改 | KA4 Software Construction | 源码、单元测试、编码规范 |
ADR(Architecture Decision Record,架构决策记录):以"背景-决策-后果"三段式记录一次重大架构决策的短文档,是架构可追溯与演进的关键实践。
质量属性(Quality Attribute):系统的非功能特性,如性能、可用性、可维护性、安全性等,是架构设计的核心约束(见 第 5 章 ISO 25010)。
KA(Knowledge Area,知识领域):SWEBOK 划分学科内容的独立主题单元,见 第 3 章。
4.2 关键判断标准
- 架构 = 系统"怎么拆":回答模块间关系、边界、技术选型,影响整个系统,后期难改。
- 设计 = 部件"怎么做":在架构给定的框架内细化单个模块。
- 规范 = 代码"怎么写":与系统结构无关,追求一致性与可读性。
代码摆放与职责划分是横跨 Design 与 Construction 的过渡地带:包的大结构(按业务域 vs 按技术层)属于架构/设计决策;单个 controller / service / repository 内部的写法属于编码规范。
4.3 业界主流的代码组织与职责划分流派
业界对"代码怎么摆、职责怎么分"的分类,按架构风格划分如下。这些流派既决定了目录摆放,也决定了职责划分方式。
| 流派 | 代码摆放 | 职责划分 | 适用场景 |
|---|---|---|---|
| 分层架构(Layered) | 按技术层:controller / service / repository | 每层一种技术职责,上层依赖下层 | 传统单体、大多数业务系统 |
| 包按业务域(Package by Feature) | 按业务模块:order / user / payment | 模块内自包含 controller+service+repo,内聚高 | 中大型系统,业界主流趋势 |
| 六边形架构(Hexagonal) | domain / application / infrastructure | 领域核心不依赖外部,端口+适配器接外部 | 需隔离框架、便于测试的系统 |
| 整洁架构(Clean Architecture) | entities / usecases / adapters / frameworks | 依赖只指向内层,内层不知道外层存在 | 复杂业务、长期演进的核心系统 |
| MVC / MVVM | 前端:views / controllers / models(或 stores) | 视图、控制、模型分离 | Web 与移动端 UI 层 |
| DDD(限界上下文) | 按限界上下文划分模块,内部四层 | 领域模型驱动,聚合维护业务不变量 | 复杂业务领域(见 DDD 文档) |
演示:同一功能在三层分别如何呈现
// 架构层(KA2)——系统级边界:模块间只通过接口调用
[订单服务] -->|REST| [支付服务] // 同步接口
[订单服务] -->|事件| [库存服务] // 异步解耦
// 详细设计层(KA3)——单个模块内部的设计
class OrderService {
private final OrderRepository repo; // 依赖抽象接口
public Order create(OrderCmd cmd) { // 业务编排
Order o = new Order(cmd);
repo.save(o);
eventBus.publish(new OrderCreated(o.getId()));
return o;
}
}
// 编码规范层(KA4)——命名、目录摆放、职责划分
app/order/
├── controller/ OrderController // 只收请求、转发,不含业务
├── service/ OrderService // 业务逻辑编排
├── repository/ OrderRepository // 只管持久化
└── dto/ OrderCreateCmd // 入参传输对象
4.4 权威标准与知识体系
| 资料 | 定位 | 说明 |
|---|---|---|
| SWEBOK V4.0(IEEE CS, 2024) | 知识体系总纲 | 18 个 KA 定义软件工程边界,www.swebok.org 免费获取 |
| IEEE Std 610-1990 | 术语标准 | 权威定义 architecture / design / construction 等术语 |
| IEEE Std 42010 | 架构描述标准 | 软件架构的"视图-视角-关切点"(Viewpoints and Views)国际标准 |
| ISO/IEC/IEEE 12207 / 15288 | 生命周期过程 | 软件/系统生命周期过程框架(见 第 2 章) |
| ISO/IEC 25010 | 质量模型 | 软件质量的 8 大特性(见 第 5 章) |
4.5 经典书籍
| 书籍 | 作者/年份 | 覆盖层面 |
|---|---|---|
| 《Software Engineering》10th | Sommerville, 2016 | 全书总纲,软件工程全景 |
| 《Software Architecture in Practice》 | Bass / Clements / Kazman | 架构设计与质量属性 |
| 《Documenting Software Architectures》 | Clements et al. | 架构文档化(视图方法) |
| 《Clean Architecture》 | Robert C. Martin, 2017 | 整洁架构、依赖规则 |
| 《Design Patterns》(GoF) | Gamma et al., 1994 | 设计模式与复用 |
| 《Code Complete》2nd | McConnell, 2004 | 编码规范与构建细节 |
| 《Domain-Driven Design》 | Eric Evans, 2003 | DDD 战略+战术设计 |
| 《The Unified Modeling Language User Guide》 | Booch / Rumbaugh / Jacobson | UML 建模(本馆另有 UML 详解) |
4.6 经典论文(按时间)
| 论文 | 作者/年份 | 贡献 |
|---|---|---|
| "On the Criteria To Be Used in Decomposing Systems into Modules" | Parnas, 1972 | 信息隐藏与模块划分——模块化理论源头,架构设计的基石 |
| "No Silver Bullet" | Brooks, 1986 | 软件复杂度本质,说明工程化并非银弹 |
| "Class-Responsibility-Collaboration Cards (CRC)" | Beck & Cunningham, 1989 | 职责划分的协作建模方法 |
| "ATAM: Method for Architecture Evaluation" | Kazman et al., 2000 | 架构权衡分析方法,架构质量评估标准方法 |
| "Out of the Tar Pit" | Moseley & Marks, 2006 | 复杂度本质与简单设计/函数式范式 |
4.7 历史脉络
| 年份 | 事件 | 意义 |
|---|---|---|
| 1968 | NATO 软件工程会议 | "软件工程"术语诞生,软件危机被正式提出 |
| 1972 | Parnas 模块化论文 | 确立"信息隐藏+模块划分"的架构设计基石 |
| 1970s-80s | 结构化方法(Yourdon、Jackson) | 从"编程手艺"走向"软件方法" |
| 1994 | GoF 设计模式 | 对象设计与职责划分的范式 |
| 1997 | UML 1.0 标准发布 | 统一建模语言成为业界标准 |
| 2001 | 敏捷宣言 | 轻流程、拥抱变化 |
| 2003 | DDD(Evans) | 复杂领域的模型驱动方法 |
| 2017 | 《Clean Architecture》 | 架构分层与依赖规则的集大成 |
| 2024 | SWEBOK V4.0 | 18 个知识领域的现行权威框架 |
4.8 不同软件类型的架构·设计·编码差异
前几节给出的"架构/设计/编码三层"定义是通用骨架。但软件分很多类型——底层/系统软件、中间件、业务系统、开发工具、框架/库,面向的用户完全不同,三层的约束来源也因此不同:架构"怎么拆"的依据、设计"怎么做"的约束、编码"怎么写"的底线,由不同类型软件的决定性因素支配,不可能用同一套规范(分类见 1.3)。
| 层面 | 底层/系统软件 | 中间件/基础设施 | 开发工具 | 框架/库 | 业务系统/应用软件 |
|---|---|---|---|---|---|
| 架构 (怎么拆) | 拆的依据是硬件:内存映射、总线、中断、实时性、无 OS/RTOS,资源受限直接框死边界 | 拆的依据是协议与性能:核心引擎+插件/模块化(nginx 模块、redis 命令集)、主从/分片/哨兵/集群高可用、master-worker 进程模型 | 拆的依据是用户工作流:极简内核+插件、CLI 入口、Unix 管道哲学、启动快 | 拆的依据是复用者生态:开放-封闭、SPI/扩展点、依赖倒置,SemVer 兼容本身是架构决策 | 拆的依据是业务域:DDD 限界上下文、微服务、演进式架构,关注可扩展与可用性 |
| 设计 (怎么做) | 状态机、寄存器级数据流、手动内存管理、无 GC、无堆分配约束 | 非阻塞 I/O(Reactor/epoll)、协议解析(HTTP/Redis Protocol)、存储引擎与一致性模型、缓存/淘汰策略 | 命令/API 尽量少而清晰、数据格式(JSON/YAML)即接口 | API 设计是一等公民:泛型/类型系统设计、扩展点设计、弃用(Deprecation)策略 | 对象设计、事务边界、事件驱动、CQRS、设计模式 |
| 编码 (怎么写) | MISRA C、禁止动态内存/递归、静态分析强制、体积与性能优先 | 高性能 C/C++/Go、内存管理与零拷贝、基准/压测驱动、严谨变更控制 | 精简依赖、标准库优先、错误信息与帮助文档当产品做 | 向后兼容是红线、弃用流程、文档即规范、注释即示例 | 可读性优先、命名规范、评审+覆盖率门槛、重构文化、适度抽象 |
5. 质量保证与度量
5.1 软件质量模型(ISO/IEC 25010)
国际标准 ISO/IEC 25010 定义了软件质量的 8 大特性:
| 特性 | 含义 | 典型子特性 |
|---|---|---|
| 功能适合性 Functional Suitability | 满足用户需求的程度 | 功能完整性、正确性、适当性 |
| 性能效率 Performance Efficiency | 资源与时间消耗 | 吞吐量、响应时间、资源利用率 |
| 兼容性 Compatibility | 与其他系统协作 | 共存性、互操作性 |
| 易用性 Usability | 易学易用程度 | 可学习性、可操作性、可访问性 |
| 可靠性 Reliability | 在条件下维持性能水平 | 可用性、容错、可恢复性 |
| 安全性 Security | 防护数据与系统 | 机密性、完整性、可追溯性 |
| 可维护性 Maintainability | 可被修改的程度 | 模块化、可测试性、可分析性 |
| 可移植性 Portability | 在环境中迁移 | 适应性、可安装性、可替换性 |
5.2 测试层次(Test Levels)
- 单元测试(Unit Test):验证单个函数/模块,通常由开发者编写。
- 集成测试(Integration Test):验证模块之间的接口与协作。
- 系统测试(System Test):在完整系统上验证功能与非功能需求。
- 验收测试(Acceptance Test / UAT):由客户/用户确认系统满足业务需求。
5.3 常用度量指标
| 指标 | 含义 | 良好基准(参考) |
|---|---|---|
| 代码覆盖率 Coverage | 测试执行覆盖的代码比例 | 语句覆盖 ≥ 80% |
| 缺陷密度 Defect Density | 每千行代码缺陷数 | < 5 个/KLOC(成熟产品) |
| 缺陷修复率 Bug Resolution | 已修复缺陷占比 | 随发布趋近 100% |
| MTBF(平均无故障时间) | 可靠性指标 | 依系统而定 |
| 循环时间 Cycle Time | 从需求到上线的时间 | 持续缩短 |
| 变更失败率 Change Failure Rate | 上线后导致故障的变更比例 | < 15%(DevOps 标杆) |
MTBF(Mean Time Between Failures,平均无故障时间):系统两次故障之间的平均间隔时间,是可靠性关键指标。
MTTR(Mean Time To Repair,平均修复时间):从故障发生到恢复的平均耗时。
UAT(User Acceptance Testing,用户验收测试):最终用户确认系统满足业务目标的测试阶段。
5.4 不同软件类型的质量属性优先级与规范裁剪
ISO 25010 的 8 大特性对所有软件都适用,但面向的用户不同,特性优先级排序就不同(分类见 1.3)——"哪个质量特性排第一"决定了工程规范的强度与侧重。ISO/IEC/IEEE 12207 本身也明确允许裁剪(Tailoring),即每个组织/项目按自身情况增删过程,这是"规范因软件类型而异"的标准依据。
| 类型 | 用户 | 第一优先级质量属性 | 典型规范差异 |
|---|---|---|---|
| 底层/系统软件 (OS/驱动/嵌入式) | 机器 / 硬件 | 可靠性、性能、安全性 | V 模型/瀑布、MISRA C、严格认证(DO-178C)、长维护周期 |
| 中间件/基础设施 (nginx/redis/Kafka) | 其他软件系统(运行时依赖) | 性能效率、可靠性、可用性(一致性) | 高可用集群/SRE、协议兼容红线、滚动升级/灰度发布、长维护周期 |
| 开发工具 (CLI/IDE/DevOps 工具) | 开发者 | 易用性、性能效率 | 快速迭代、插件生态、脚本/API 优先 |
| 框架/库 | 开发者(复用者) | 兼容性、可维护性 | SemVer 版本治理、API 稳定性、向后兼容、文档与社区治理 |
| 业务系统/应用软件 (ERP/电商/中后台) | 企业内部 / 终端消费者 | 功能适合性、可维护性 | 敏捷+DevOps、分层架构/DDD、需求变更管理 |
6. 行为图(系统"做什么")
行为图描述软件工程中人、团队、流程"做什么"。先以用例图纵览整体行为,再以活动图、时序图、状态机图逐步细化核心主流程。
6.1 用例图——软件工程整体行为
用例图展示软件工程中各方角色参与的活动。客户与产品经理定义需求,架构师设计结构,开发者编码,测试者验证,运维保障上线,管理者统筹全局。
演示:用用户故事(User Story)表达一个用例的验收标准
// 用例 UC1 "收集与分析需求" 的用户故事形式 As a 注册用户, I want 用手机号+验证码登录, So that 我可以快速安全地访问系统. 验收标准 (Acceptance Criteria): - 输入正确手机号与验证码后 3 秒内登录成功 - 验证码 5 分钟内有效且只能使用一次 - 连续 5 次输错后锁定 30 分钟
6.2 活动图——软件生命周期完整主流程
活动图用泳道展示从需求提出到上线运营的完整流程:需求分析→架构设计→迭代开发→测试→发布→监控→反馈,形成持续改进的闭环。
演示:CI 流水线配置(GitHub Actions)——把活动图中的"构建-测试-发布"自动化
name: CI
on:
push:
branches: [main]
jobs:
build-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm run lint
- run: npm test -- --coverage
- run: npm run build
6.3 时序图——敏捷 Scrum Sprint 迭代
时序图刻画一个典型 Scrum 迭代中,产品负责人、开发者、测试、CI/CD 平台与生产环境之间的消息协作时序。
演示:一个 Sprint(2 周)的节奏安排
Sprint 周期节奏(Scrum 仪式): Day 1 : Sprint Planning 计划会(明确目标与待办) Daily : Daily Standup 每日站会(15 分钟同步障碍) Day 8 : Backlog Refinement 待办梳理 Day 10 : Sprint Review 评审会(演示可运行成果) Day 10 : Retrospective 回顾会(改进过程) Day 10 : Release 通过验收后发布
6.4 状态机图——缺陷(Defect)生命周期
状态机图描述软件工程中最典型的工件之一——缺陷从发现到关闭的状态流转,是配置管理与质量管理的基础。
演示:缺陷实体状态字段(JSON 形态)
{
"id": "BUG-1042",
"title": "订单页在 iOS 下白屏",
"severity": "High", // Blocker/High/Medium/Low
"status": "Fixed", // New/Open/Fixed/Verified/Closed/Reopened
"steps": ["打开首页", "点击下单", "观察白屏"],
"reporter": "qa.wang",
"assignee": "dev.li",
"foundIn": "v1.4.0-rc1",
"fixedIn": "v1.4.0-rc2"
}
7. 结构图(系统"由什么组成")
结构图描述软件工程"由什么组成":从部署环境的物理拓扑(部署图),到软件产品内部组件(组件图),再到学科层面的过程包结构(包图),最后到核心概念实体关系(类图),由宏观到细节逐层细化。
7.1 部署图——软件交付部署拓扑
部署图展示软件从代码提交到生产上线的物理节点:开发者工作站→代码托管→CI/CD 服务器→制品仓库→测试环境→生产环境,及监控观测。
演示:生产环境部署清单(Docker Compose 片段)
version: "3.8"
services:
gateway: { image: myapp/gateway:1.4.0, ports: ["80:8080"] }
app: { image: myapp/app:1.4.0, depends_on: [db, cache] }
cache: { image: redis:7 }
db: { image: postgres:16, volumes: ["pgdata:/var/lib/postgresql/data"] }
monitor: { image: prom/prometheus, ports: ["9090:9090"] }
7.2 组件图——现代软件系统组件
组件图展示典型现代软件系统(如微服务应用)的内部组成与依赖关系:前端、网关、业务服务、数据存储、缓存、消息、可观测性与安全。
演示:服务间依赖的接口声明(REST 风格)
# 订单服务提供的接口
GET /orders?user={uid} 查询订单列表
POST /orders 创建订单
POST /orders/{id}/pay 发起支付
# 订单服务消费的接口
POST /payments/{orderId} 调用支付服务
GET /inventory/{sku} 查询库存服务
PUB /order/created 发布订单创建事件
7.3 包图——软件工程过程体系(ISO 12207)
包图用国际标准 ISO/IEC/IEEE 12207 的四组过程展示软件工程"由哪些过程构成",以及技术过程的递进依赖关系。
演示:一个典型项目的工程目录(对应包图中的过程产物)
my-service/ ├── docs/ │ ├── srs.md # 需求规格 (Requirements) │ ├── architecture.md # 架构设计 (Architecture Design) │ └── design.md # 详细设计 (Design) ├── src/ # 实现 (Implementation) ├── test/ # 测试 (Verification) ├── ci/ # 流水线定义 (Engineering Operations) ├── scripts/ # 部署脚本 (Operations) └── CHANGELOG.md # 配置与发布管理 (SCM)
7.4 类图——软件工程核心概念模型
类图刻画软件工程领域内的核心实体及其关系:项目、干系人、需求、用例、设计文档、代码模块、测试用例、缺陷、构建、发布。
演示:核心实体示例(TypeScript 接口形态)
interface Requirement {
id: string;
description: string;
priority: 'P0' | 'P1' | 'P2';
acceptanceCriteria: string[];
}
interface Defect {
id: string;
requirementId: string; // 关联需求 (traced to)
testCaseId?: string; // 关联测试用例 (finds)
severity: 'High' | 'Medium' | 'Low';
status: 'New' | 'Open' | 'Fixed' | 'Closed' | 'Reopened';
}
interface Release {
version: string; // 语义化版本, 如 "1.4.0"
buildNumber: number; // 关联构建
requirements: string[]; // 满足的需求 (satisfies)
releaseDate: Date;
}
8. 实战速查手册
8.1 生命周期模型选择速查
| 场景特征 | 推荐模型 |
|---|---|
| 需求明确稳定、流程受监管 | 瀑布 / V 模型 |
| 需求不确定、变化频繁 | 敏捷 Scrum / 迭代增量 |
| 高风险大型项目 | 螺旋模型 |
| 需要高频可靠发布 | DevOps / 持续交付 |
| 安全关键系统 | V 模型 + 严格验证 |
8.2 各阶段核心交付物速查
| 阶段 | 交付物 | 质量检查点 |
|---|---|---|
| 需求 | SRS、用户故事、原型 | 需求评审、可追踪性矩阵 |
| 架构/设计 | 架构文档、设计图、接口定义 | 架构评审、ADR 记录 |
| 实现 | 源码、单元测试、代码评审记录 | 覆盖率、静态检查、CI 通过 |
| 测试 | 测试计划、用例、缺陷报告 | 缺陷收敛、回归通过、UAT 通过 |
| 发布 | 版本产物、变更说明、发布计划 | 发布检查单、回滚预案 |
| 运维 | 监控面板、日志、SLO 报告 | 告警响应、SLO 达成率 |
8.3 常用工具速查
| 类别 | 工具 |
|---|---|
| 版本控制 / SCM | Git、SVN、GitHub、GitLab、Bitbucket |
| 项目与需求管理 | Jira、Trello、Linear、禅道 |
| CI/CD | Jenkins、GitHub Actions、GitLab CI、ArgoCD |
| 测试 | JUnit、pytest、Selenium、Cypress、Postman、SonarQube |
| 构建/包管理 | Maven、Gradle、npm、pip、Docker、Harbor |
| 运维监控 | Prometheus、Grafana、ELK、SkyWalking、Kubernetes |
| 协作沟通 | Confluence、Slack、飞书、钉钉 |
8.4 质量指标速查
| 指标 | 建议值 | 用途 |
|---|---|---|
| 语句覆盖率 | ≥ 80% | 测试充分度 |
| 缺陷密度 | < 5/KLOC | 代码质量 |
| 变更失败率 | < 15% | 发布稳定性 |
| 循环时间 | 持续下降 | 交付效率 |
| SLO 达成率 | ≥ 99.9% | 服务可靠性 |
8.5 研发最佳实践 Checklist
- 先写测试再写代码(TDD)或至少保证核心逻辑有自动化测试。
- 小步提交、频繁合并到主干,避免长分支。
- 每次提交触发 CI,编译、测试、静态检查全自动。
- 代码评审作为合并硬性门槛。
- 需求可追踪:从用户故事到代码到测试到发布的链条完整。
- 语义化版本(SemVer:MAJOR.MINOR.PATCH)管理发布。
- 发布有回滚预案,配置与代码分离。
- 监控告警前置:上线即有日志、指标、告警。
- 定期回顾改进过程(Retrospective)。
- 安全左移(Shift-Left):依赖扫描、安全测试在 CI 中尽早执行。