2.1 软件工程产生背景
作坊式的个人创作的缺点:
- 依靠个人的能力,缺乏合作
- 关注计算存储时空利用,精雕细琢
- 程序规模小,功能单一
- 无系统性方法和标准流程
软件开发需要解决的问题:
- 开发过程
- 开发方法
- 开发管理
- 质量保证
软件危机:
- 由作坊式的个体编程,进行大批量、大规模的软件开发,产生的问题
- 进度经常延迟
- 质量无法保证
- 成本超出预算
- 软件维护苦难
- 失败风险很大
2.2 软件工程基本内涵
软件工程:将 系统的、规范的、可量化 的方法应用于软件的 开发、运行和维护 的过程,以及上述方法的研究。
- 系统化:提供完整全面的解决方法,如目标、原则、过程、开发方法等
- 规范化:语言标准、质量标准、编程标准等等
- 可量化:对于工作量、成本、进度等等
软件工程的目标:在成本、进度等约束下,指导软件开发和运维,开发出满足用户要求的足够好的软件。
软件工程的三要素:
| 要素 | 视角 | 回答问题 | 作用 | 典型成果 |
|---|---|---|---|---|
| 过程 (Process) | 管理 | 软件开发、运行和维护需要开展哪些工作 按照什么样的步骤和次序来开展工作 | 对软件开发过程所涉及的人、制品、质量、成本、计划等进行有效和可量化的管理 | 过程模型、开发方法、管理方法 |
| 方法学 (Methodology) | 技术 | 软件开发、运行和维护如何做 | 为软件开发过程中的各项开发和维护活动提供系统性、规范性的技术支持 | 软件开发方法学 |
| 工具 (Tool) | 工具辅助 | 如何借助工具来辅助软件开发、运行和维护 | 更为高效地运用软件开发方法学来完成软件开发过程中的各项工作,提高软件开发效率和质量,加快交付进度 | SonarQube, Eclipse, Visual Studio |
软件工程的原则:
- 抽象与建模:将开发活动中的关键要素抽象出来,借助于建模语言形成软件模型。
- 模块化:将功能分解为若干模块,内部高内聚,外部松耦合
- 软件重用:尽可能使用已有的软件资源(函数、类、部件),可降本增效。
- 信息隐藏:模块内部信息对外不可见,仅交换所必须的接口。
- 关注点分离:先将不同性质的问题分开处理,再综合起来理解和构建整个系统
- 分而治之:将复杂软件系统进行分解,形成子系统,最后再整合子系统得到整个系统
- 双向追踪:当软件发生变化,既追踪其产生的影响,又追踪产生这种变化的来源
- 工具辅助:尽可能使用各种(尤其是计算机)工具辅助软件开发和维护。
软件开发:包括软件创作和软件生产。
- 软件创作:基于软件开发者的经验和技能,借助于智慧,进行自由创新,如软件设计、编码实现等。
- 软件生产:基于工程化的手段,遵循约束和规范,开展软件生产,如遵循过程、按照标准、质量保证等。
计算机辅助软件工程 (Computer-Aided Software Engineering, CASE):开发人员借助计算机及其软件来开发、维护和管理软件产品的过程。
- 分类:代码编写、项目管理、软件建模、软件测试、软件运维
2.3 软件工程发展历程
- 1950s~1960s:软硬件结合紧密、精雕细琢程序、黑客文化、高级语言、软件危机
- 1970s:计算能力提升、程序设计语言方法、瀑布模型、结构化开发方法、形式化方法、CASE
- 1980s:面向对象语言、软件能力成熟度模型、软件重用、CASE、工程标准化
- 1990s:OOP、UML、RUP、软构件技术、开源软件
- 2000s:群体化软件开发、敏捷开发、软件可信、互联网技术
- 2010s:人机物融合、开源软件生态、DevOps、智能化软件开发