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、智能化软件开发