Skip to content

一、软件工程的定义 ​

1968 年在 NATO 会议上,首次提出“软件工程”这个术语。但软件工程一直以来都缺乏一个统一的定义,有很多学者、组织机构都分别给出了自己认可的定义。以下给出三种常用的定义:

1、Fritz Bauer 在 NATO 上给出的定义 ​

The establishment and use of sound engineering principles in order to obtain economically software that is reliable and works on real machines.

建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。

2、Barry Boehm ​

Software engineering is that form of engineering that applies the principles of computer science and mathematics to achieving cost-effective solutions to software problems.

软件工程就是应用计算机科学和数学的原理,来为软件问题提供经济高效的解决方案。

通俗点来说:①运用现代科学技术知识来设计并构造计算机程序;②开发、运行和维护这些程序所必需的相关文件资料。

3、IEEE 在软件工程术语汇编中的定义 ​

The application of a systematic,disciplined,quantifiable approach to the development,operation,and maintenance of software.

将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件。

二、软件工程的层次 ​

软件工程是一种层次化的技术,支持软件工程的根基就在于对质量的关注。

1、软件工程三个要素 ​

过程、方法、工具

2、软件工程的层次——图解 ​

3、软件工程的层次——逐一分析 ​

(1)质量焦点(a quality focus)

软件工程的根基,任何工程方法都必须以有组织的质量承诺为基础

(2)过程(process)

是软件工程的基础,定义了一组关键过程区域框架,包括*工程产品的产生*,里程碑的建立等等

(3)方法(methods)

提供了建造软件在技术上需要“如何做”,包括需求分析(analysis)、设计(design)、编码(coding)、测试(testing)和支持(backing)

(4)工具(tools)

对过程和方法提供了自动或半自动的支持

E.g. CASE 工具(计算机辅助软件工程):集成硬件、软件和数据库而创建的软件工程环境,类似于硬件的 CAD(计算机辅助设计)/CAE(计算机辅助工程)

三、软件过程的三个阶段 ​

1、定义阶段——“做什么” ​

(1)定义:系统和软件的关键需求被标识

(2)应用场景:①系统和信息工程;②软件项目计划;③需求分析

2、开发阶段——“如何做” ​

(1)定义:定义数据结构、体系结构、过程细节、界面表示、算法和测试如何执行

(2)应用场景:①软件设计;②代码生成;③软件测试

3、支持阶段——“变化” ​

(1)定义:①纠正错误;②随着软件环境的演化而要求的适应性修改;③用户需求的变化而带来的增强型修改

(2)应用场景:①纠错性维护(校正式);②适应性维护;③完善性维护;④预防性维护

下面用一张图了解软件过程的三个阶段:

在这里插入图片描述

四、软件过程框架 ​

1、引例——煮蛋的启示 ​

很久以前,中国人煮蛋方式与德国人煮蛋方式的不同。

中国人:先找一个锅,倒进水,再把蛋放进去,整个过程需要 10~20min。

德国人:先找一个锅,倒进水,再把蛋放进去,在容器的下方焊接一个托盘,再将锅放到托盘上去烧开,如此,仅用 1min 就把水烧开,之后再用火继续煮了 3min,关火;再用余热继续煮了 3min;煮熟后丢到冷水里面 3min;最后他用 10min 时间把蛋煮熟。

从以上分析来看,德国人煮蛋更讲究过程,不同的过程会导致不一样的结果。研究表明,德国人煮蛋的方式有以下几点好处:① 更省水;② 更省热能;③ 煮蛋所花时间更少;④ 利用余热煮 3min,这个时候蛋的营养价值更高;⑤ 用凉水泡了 3min,蛋壳更容易拨开。

在这里插入图片描述

2、软件工程的过程定义 ​

(1)过程(process):一组有序的任务,每个任务由一些步骤组成,每个步骤涉及到活动、约束及产品。

(2)广义上,软件开发的每一个阶段都可看成是一个过程。

(3)简言之,过程就是一个步骤、一个路线图,帮助创建高质量的软件。

3、软件过程框架 ​

先用一张图简单了解软件过程框架:

在这里插入图片描述

(1)通用过程框架活动

  • 沟通
  • 策划
  • 建模
  • 构建
  • 部署

(2)普适性活动

  • 软件项目跟踪和控制
  • 正式的技术评审
  • 软件质量保证
  • 软件配置管理
  • 文档的准备和产生
  • 可复用管理
  • 测度
  • 风险管理

五、CMM ​

1、基础知识 ​

(1)20 世纪 90 年代(CMU/SEI)提出能力成熟度模型(Capability Maturity Model,CMM)

(2)CMM 定义了当一个组织达到不同的过程成熟度时应该具有的软件工程能力

(3)CMM 是一种衡量软件开发能力和成熟度的标准

(4)CMM 模型提供了衡量一个公司软件工程实践的整体有效性的方法,且建立了五级的过程成熟度级别

2、CMM 的级别 ​

(1)第一级:初始级(initial)

① 定义:软件过程是定义的和偶然的,有时甚至是混乱的。几乎没有过程定义,成功完全取决于个人能力。

② 特点:不可预测并且缺乏控制。

(2)第二级:可重复级(repeatable)

① 定义:建立了基本的项目管理过程,能够跟踪费用、进度和功能。有适当的必要的过程规范,可以重复以前类似项目的成功。

② 特点:可重复以前的主要经验。

③ 关键过程区域:需求管理;软件项目计划;软件项目跟踪和监督;软件子合同管理;软件质量保证;软件配置管理。

(3)第三级:定义级(defined)

① 定义:企业的软件过程已经文档化、标准化并与整个组织的软件过程相集成。所有项目都使用统一的、文档化的、组织过程认可的版本来开发和维护软件。包含第二级的所有特征。

② 特点:过程被描述,并得到良好理解。

③ 关键过程区域:组织过程定义;组织过程焦点;培训大纲;集成软件管理;软件质量保证;软件配置管理。

(4)第四级:管理级(managed)

① 定义:软件过程和产品质量的详细数据被收集,通过这些度量数据,软件过程和产品能够被定量地理解和控制。包含第三级的所有特征。

② 特点:过程被测量并受控。

③ 关键过程区域:定量的过程管理;软件质量管理。

(5)第五级:优化级(optimizing)

① 定义:通过定量反馈进行不断的过程改进,这些反馈来自于过程或通过试验新的想法和技术而得到。包含第四级所有特征。

② 特点:关注过程改进。

③ 关键过程区域:缺陷预防;技术变更管理;过程变更管理。

六、软件过程模型 ​

1、软件过程模型概述 ​

软件过程模型是软件开发全部过程、活动和任务的结构框架。软件过程模型不是一种具体模型,是一种开发策略,包含过程、方法和工具三个层次以及一般性阶段,常称为:①软件开发模型;②软件生存期模型;③软件工程范型。

2、软件过程模型分类 ​

(1)传统的软件过程模型(7 种)

详细内容见以下第 3 点

(2)敏捷视角下的过程模型(7 种)

详细内容见以下第 4 点

3、传统的软件过程模型 ​

(1)线性顺序模型(瀑布模型) ​

① 图解

② 存在问题

  • 实际项目很少按照该模型给出的顺序执行
  • 客户常常难以清楚地给出需求
  • 客户必须有耐心,运行版要到开发晚期才能得到
  • 导致“阻塞状态”,常发生在开始和结束时

(2)V 模型 ​

① 图解

在这里插入图片描述

② 特点——强调反馈,不将问题留到下一步

Verification 验证:每个活动保证能正确运行。

Validation 确认:针对需求而言,符合需求规格的定义。

(3)原型实现模型 ​

① 定义

原型是一个可迭代的/可重复的(循环)过程,在这个过程中,一个问题的模型被细化/改进,直到它被接受为止。 ② 流程图

③ 原型开发分类

根据原型与最终产品之间的关系,原型开发分类分为以下三种:

抛弃式 (throw away):验证和澄清系统的需求描述,重新构造系统。

演化式 (evolutionary):逐步改进和细化原型,将原型进化为最终系统。

增量式 (incremental):在建立软件总体设计基础上,采用增量开发方法,使原型成为最终系统。

此处篇幅较长,点击进入原型实现模型的详解

④ 适用情况

当客户有一个合理的需求,但是对细节没有概念的时候最适合使用原型实现模型

⑤ 特点

快速性、迭代性

⑥ 优缺点

优点:

  • 用户能够感受到实际系统
  • 开发者能很快建造出一些东西

缺点:

  • 原型是粗糙的,没考虑软件总体质量和长期的可维护性
  • 开发者常常要对实现内容折中以使得原型能尽快工作

⑦ 不适合的领域

  • 嵌入式系统
  • 实时控制系统
  • 科学数值系统

(4)RAD 模型 ​

① 定义

RAD(Rapid Application Development,快速应用开发)通过使用基于构件的建造方法赢得了快速开发。

② 分类

  • 业务建模
  • 数据建模
  • 过程建模
  • 应用生成(编程阶段 - 基于构件)
  • 测试及反复

③ 流程图

④ 特点

  • 强调极短的开发时间,每一个主要功能在不到三个月的时间内完成;
  • 强调复用

⑤ 存在的问题

  • 对于大型的的项目,RAD 需要足够的人力资源以建立足够的 RAD 组;
  • RAD 要求开发者和客户承担在一个很短的时间框架下完成一个系统所必要的快速活动;
  • 并非所有应用都适合 RAD;
  • 不适合技术风险很高的情况

(5)增量模型 ​

① 定义:增量模型融合了瀑布模型的基本成分和原型的迭代特性。

② 举个例子

例如,使用增量模型开发一款字处理软件,那么,这款软件需要做什么呢?

  • 基本的文件管理、编辑和文档生成功能;
  • 更完善的编辑和文档生成能力;
  • 实现拼写和语法检查功能;
  • 完成高级的页面布局功能。

③ 流程图

④ 特点

  • 增量 1 往往是“核心产品”;
  • 本质是迭代的,但强调每一增量均发布一个可操作产品。

⑤ 优点

  • 面对不能改变的困难时限时,是可考虑的选择;
  • 早期可投入较少人员;
  • 可有计划地管理技术风险。

⑥ 思考问题

Q:假设一个学校在四个月后要参加教学评估,要求现在开发一个学校综合管理信息系统,如果你是开发者,你会选择哪一种过程模型来开发这个系统,RAD 还是增量式的过程模型?为什么?

A:答案是选择RAD 过程模型。为什么呢? 原因在于,RAD 模型适用于模块化比较强的项目,且必须在 60-90 天内完成,不迭代,没有一个动作在重复进行。 而增量模型则是可迭代的,且增量 1 是核心产品,每一增量均可操作。比较适用于市场竞争激烈的项目,有利于抢占市场。

(6)螺旋模型 ​

① 软件开发可能遇到的风险(引例):

  • 产品交付给用户之后用户可能不满意;
  • 到了预定的交付日期软件可能还未开发出来;
  • 实际的开发成本可能超过预算;
  • 产品完成前一些关键的开发人员可能“跳槽“了;
  • 产品投入市场之前竞争对手发布了一个功能相近、价格更低的软件等;
  • ……

② 螺旋模型的基本思想:使用原型及其他方法来尽量降低风险。

③ 流程图

理解这种模型的一个简便方法,就是把它看作在每个阶段之前都增加了风险分析过程的快速原型模型,如下图所示:

在这里插入图片描述

④ 螺旋模型任务区域(4 个象限),各象限含义如下:

  • 客户交流——建立开发者和客户之间有效的通信所需的任务;
  • 制定计划——确定软件目标,选定实施方案,弄清项目开发的限制条件;
  • 风险分析——分析评估所选方案,考虑如何识别和消除风险;
  • 实施工程——实施软件开发和验证;
  • 构造及发布——构造、测试、安装和提供用户支持(如文档及培训)所需的任务;
  • 客户评估——评价开发工作,提出修正建议,制定下一步计划。

注:四个象限包含制定计划,风险分析,实施工程,客户评估;

此处列出 6 点是为了更加细分螺旋模型的流程。

⑤ 优缺点

优点:

  • 随着过程进展演化,开发者和客户能够更好地理解和对待每一个级别上的风险,使用原型实现作为降低风险的机制;
  • 更真实地反映了现实世界;
  • 如应用得当,能在风险变成问题之前降低它。

缺点:

  • 模型的成功依赖于风险评估的专门技术;
  • 是一个较新的模型,功效的确定尚需若干年时间。

⑥ 适用情况

主要适用于内部开发的大规模软件项目

(7)形式化方法模型 ​

①形式化方法使得软件工程师能够通过应用一个严格的、数学的符号体系来规约、开发和验证基于计算机的系统。净室软件工程师是这种方法的一个变种。

②通过应用数学分析,二义性、不完整性和不一致性能更容易发现和纠正。

③形式化方法目前还很费时且很昂贵。

④很少有软件开发者具有实用形式化方法所必要的指示,尚需许多方面的培训。

⑤难以与客户进行沟通。

4、敏捷视角下的过程模型 ​

(1)什么是敏捷 ​

  • 普遍存在的变化是敏捷的基本动力

  • 敏捷就是灵活,支持变化的观点

  • 敏捷过程强调过程的可操作性和适应性

(2)敏捷团队必须具备的特点 ​

  • 基本能力
  • 共同目标
  • 精诚合作
  • 决策能力
  • 模糊问题的解决能力
  • 相互信任和尊重
  • 自我组织

(3)几种重要的敏捷过程模型 ​

① 极限编程(XP) ​
  • 包含了策划、设计、编码、测试四个框架活动的规则和实践,具体流程如下:

在这里插入图片描述

② 自适应软件开发(ASD) ​
  • ASD 的生命周期包含思考、协作和学习三个阶段

在这里插入图片描述

③ 动态系统开发方法(DSDM) ​

定义三个不同的迭代循环,前面还加了两个生命周期活动,如下:

  • 可行性研究
  • 业务研究
  • 功能模型迭代
  • 设计和构建迭代
  • 实现迭代
④Scrum(橄榄球模型) ​

强调使用一系列的软件过程模式,每个过程模式定义一系列开发活动:

  • 待定项——能为用户提供业务价值的项目需求或特征的优先级列表;
  • 冲刺——由工作单元组成,是完成待定项中定义的需求所必需的,能在预定时间段内完成的;
  • Scrum 例会——15 分钟;
  • 演示——交付软件,客户进行评估。
⑤Crystal ​
  • 提倡“机动性”的软件开发方法;

  • 包含具有共性的核心元素,每一个都含有独特的角色、过程模式、工作产品和实践等。

⑥ 特征驱动开发(FDD) ​
  • 特征,即可以在2 周甚至更短时间内实现具有客户价值的功能。

  • 定义五种协作框架:

⑦ 敏捷建模(AM) ​
  • 有目的的建模
  • 使用多个模型
  • 前进灯
  • 内容重于表达形式
  • 理解模型及工具
  • 适应本地需要

写在最后 ​

看完这篇文章,不妨试问下自己以下问题:

  • 你认为介绍的软件过程模型哪一种最有效,为什么?

  • 举出一个采用增量模型开发的软件项目,并指出各个增量的功能。

  • 当沿着螺旋模型的过程路径向外移动时,你认为正在开发或维护的软件发生了什么变化呢?

  • 分别用图示说明瀑布模型、V 模型、原型、RAD、增量模型及螺旋模型这六种模型的原理。

欢迎评论区留下答案 ٩(๑❛ᴗ❛๑)۶

PS 本文篇幅较长,有错别字欢迎评论区纠正,随时改进~ 如果这篇文章对你有帮助,记得留下star哦~

Released under the MIT License.