![0d04948efcad570cbe0f5f684950eb8b.png](https://img-blog.csdnimg.cn/img_convert/0d04948efcad570cbe0f5f684950eb8b.png)
软件工程是指应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来解决软件问题的工程。其目的是提高软件生产率、提高软件质量、降低软件成本。IEEE对软件工程的定义是:将系统的、规范的、可度量的工程化方法应用于软件开发、运行和维护的全过程及上述方法的研究。
1. 软件生命周期
1.1. 信息系统生命周期
信息系统的生命周期包括立项阶段、开发阶段、运维阶段和消亡阶段。其中在单个系统开发中,开发阶段又可细分为总体规划、系统分析、系统设计、系统实施和系统验收等步骤。具体如下图所示。
![297552304a3d1c00f3995ff2a2fd13d7.png](https://img-blog.csdnimg.cn/img_convert/297552304a3d1c00f3995ff2a2fd13d7.png)
单个系统的各个阶段需要开展的工作和输出的文档如下图所示。
![c0699e949f23408a16a90373d8ed798b.png](https://img-blog.csdnimg.cn/img_convert/c0699e949f23408a16a90373d8ed798b.png)
1.2. 软件的生命周期
软件产品从形成概念开始,经过开发、使用和维护,直到最后退役的全过程称为软件生命周期或生存周期。
根据国家标准GB/T 8566-2007,软件生命周期可以划分为可行性研究、需求分析、概要设计、详细设计、实现、组装测试、确认测试、使用、维护、退役十个阶段,各自分别对应于软件生存周期的基本过程,具体如下图所示。
![4c2565231d56d75c3f7a6567acbd4e3c.png](https://img-blog.csdnimg.cn/img_convert/4c2565231d56d75c3f7a6567acbd4e3c.png)
2. 软件开发方法
2.1. 形式化方法
(1)形式化方法概述
提高软件可靠性的一种重要技术是使用形式化方法。形式化方法是建立在严格数学基础上、具有精确数学语义的开发方法。广义的形式化方法是指软件开发过程中分析、设计和实现的系统工程方法,狭义的形式化方法是指软件规格和验证的方法。
(2)净室软件工程
净室软件工程(Cleanroom Software Engineering,CSE)是软件开发的一种形式化方法,可以开发较高质量的软件。净室软件工程的特点如下:
- 净室即无尘室、洁净室。也就是一个受控污染级别的环境。
- 使用盒结构规约(或形式化方法)进行分析和设计建模,并且强调将正确性验证,而不是测试,作为发现和消除错误的主要机制。
- 使用统计的测试来获取认证被交付的软件的可靠性所必需的出错率信息。
2.2 逆向工程
逆向工程(reverse engineering)术语源于硬件制造业相互竞争的公司为了了解对方设计和制造工艺的机密,在得不到设计和制造说明书的情况下,通过拆卸实物获得信息,软件的逆向工程也基本类似,不过,通常“解剖”的不仅是竞争对手的程序,而且还包括本公司多年前的产品。软件的逆向工程是分析程序,力图在比源代码更高抽象层次上建立程序的表示过程,逆向工程是设计的恢复过程。
一般认为,凡是在软件生命周期内将软件某种形式的描述转换成更为抽象形式的活动都可称为逆向工程。逆向工程的完备性可以用在某一个抽象层次上提供信息的详细程度来描述。逆向工程过程能够导出多个级别的内容,随着抽象层次增高,完备性就会降低。具体包括:
实现级(底层的抽象):包括程序的抽象语法树、符号表、过程的设计表示。
结构级(稍高层次的抽象):包括反映程序分量之间相互依赖关系的信息例如调用图、结构图、程序和数据结构。
功能级(相对高层的抽象):包括反映程序段功能及程序段之间关系的信息,例如数据和控制流模型。
领域级(高层抽象):包括反映程序分量或程序诸实体与应用领域概念之间对应关系的信息,例如实体关系摸型。
3. 软件开发模型
软件开发模型大体上可分为三种类型。
第一种是以软件需求完全确定为前提的瀑布模型;第二种是在软件开发初始阶段只能提供基本需求时采用的迭代式或渐进式开发模型,例如,喷泉模型、螺旋模型、统一开发过程和敏捷方法等;第三种是以形式化开发方法为基础的变换模型。
3.1. 瀑布模型
瀑布模型是一种严格定义方法,它将软件开发的过程分为软件计划、需求分析、软件设计、程序编码、软件测试和运行维护6个阶段,形如瀑布流水,最终得到软件产品,如下图所示。
![a0fd81538213caa8033b7c603a461177.png](https://img-blog.csdnimg.cn/img_convert/a0fd81538213caa8033b7c603a461177.png)
3.2. 演化模型
演化模型主要针对事先不能完整定义需求的软件开发,是在快速开发一个原型的基础上,根据用户在调用原型的过程中提出的反馈意见和建议,对原型进行改进,获得原型的新版本,重复这一过程,直到演化成最终的软件产品。
主要优点:任何功能一经开发就能进入测试,以便验证是否符合产品需求,可以帮助导引出高质量的产品要求。
主要缺点:如果不加控制地让用户接触开发中尚未稳定的功能,可能对开发人员及用户都会产生负面的影响。
3.3. 增量模型
增量模型是把待开发的软件系统模块化,将每个模块作为一个增量组件,从而分批次地分析、设计、编码和测试这些增量组件。运用增量模型的软件开发过程是递增式的过程。
![960520f11cb2afb1d9dcffb311c46e7e.png](https://img-blog.csdnimg.cn/img_convert/960520f11cb2afb1d9dcffb311c46e7e.png)
3.4. 螺旋模型
螺旋模型是瀑布模型与演化模型相结合,并加入两者所忽略的风险分析所建立的一种软件开发模型。螺旋模型是一种演化软件过程模型,它将原型实现的迭代特征与线性顺序模型中控制的和系统化的方面结合起来,使软件的增量版本的决速开发成为可能。在螺旋模型中,软件开发是一系列的增量发布。
![92150f875600c1cef3dfaa73c576642f.png](https://img-blog.csdnimg.cn/img_convert/92150f875600c1cef3dfaa73c576642f.png)
3.5. V模型
V模型是在快速应用开发模型基础上演变而来,由于将整个开发过程构造成一个V字形而得名。V模型应用在软件测试方面的开发过程和测试行为,和瀑布模型有着一些共同的特征。V模型中的过程从左到右,描述了基本其价值在于它非常明确地标明了测试过程中存在的不同级别,并且清楚地描述了这些测试阶段和开发过程各阶段的对应关系,如下图所示。
![d6dce60116b614ffea997eb40db7d85c.png](https://img-blog.csdnimg.cn/img_convert/d6dce60116b614ffea997eb40db7d85c.png)
3.6. 喷泉模型
喷泉模型是一种以用户需求为动力,以对象为驱动的模型,主要用于描述面向对象的软件开发过程。该模型认为软件开发过程自下而上的各阶段是相互重叠和多次反复的,就像水喷上去又可以落下来,类似一个喷泉。各个开发阶段没有特定的次序要求,并且可以交互进行,可以在某个开发阶段中随时补充其他任何开发阶段中的遗漏。
3.7. 构件组装模型
构件组装模型融合了螺旋模型的许多特征。它本质上是演化的支持软件开发的迭代方法。但是,构件组装模型是利用预先包装好的软件构件(有时称为“类”)来构造应用程序的。构建组装模型的过程如下图所示。
![a2b245ed6f1805245895ca8580177487.png](https://img-blog.csdnimg.cn/img_convert/a2b245ed6f1805245895ca8580177487.png)
3.8. 统一过程
统一过程(Unified Process,UP)是一个通用过程框架,可以用于种类广泛的软件系统、不同的应用领域、不同的组织类型、不同的性能水平和不同的项目规模。UP是基于构件的,在为软件系统建模时,UP使用的是UML。与其他软件过程相比,UP具有三个显着的特点,即用例驱动、以架构为中心、迭代和增量。
统一过程包括四个阶段:初始阶段、细化阶段、构建阶段和交付阶段。各个阶段对应的工作内容如下图所示。
![8a88e048fd01df15a4ccaefbaec949e2.png](https://img-blog.csdnimg.cn/img_convert/8a88e048fd01df15a4ccaefbaec949e2.png)
3.9. 敏捷方法
敏捷方法强调,让客户满意和软件尽早增量发布;小而高度自主的项目团队;非正式的方法;最小化软件工程工作产品以及整体精简开发。
目前主要的敏捷方法有极限编程(eXtreme Programming,XP )、自适应软件开发(Adaptive Software Development,ASD)、水晶方法(Crystal)、特胜驱动开发(Feature Driven Development,FDD)、动态系统开发方法(Dynamic Systems Development Method,DSDM)、测试驱动开发(Test-Driven Development,TDD)、敏捷数据库技术(Agile Database Techniques,AD)和精益软件开发(Lean Software Development)等。虽然这些过程模型在实践上有差异,但都是遵循了敏捷宣言或者是敏捷联盟所定义的基本原则。这些原则包括客户参与、增量式移交、简单性、接受变更、强调开发人员的作用和及时反馈等。
敏捷开发的4大价值观、5大原则和12大最佳实践如下图所示。
![a1e43b0830f502a2026097c6df30c9bf.png](https://img-blog.csdnimg.cn/img_convert/a1e43b0830f502a2026097c6df30c9bf.png)
以下介绍几种常见的敏捷方法:
- XP (Extreme Programming,极限编程)在所有的敏捷型方法中,XP是最引人瞩目的。它源于Smalltalk圈子,特别是Kent Beck和Ward Cunningham在20世纪80年代末的密切合作。XP在一些对费用控制严格的公司中的使用,已经被证明是非常有效的。
- Cockburn的水晶系列方法,水晶系列方法是由Alistair Cockburn提出的。它与XP方法一样,都有以人为中心的理念,但在实践上有所不同。Alistair考虑到人们一般很难严格遵循一个纪律约束很强的过程,因此,与XP的高度纪律性不同,Alistair探索了用最少纪律约束而仍能成功的方法,从而在产出效率与易于运作上达到一种平衡。也就是说,虽然水晶系列不如XP那样的产出效率,但会有更多的人能够接受并遵循它。
- 开放式源码,这里提到的开放式源码指的是开放源码界所用的一种运作方式。开放式源码项目有一个特别之处,就是程序开发人员在地域上分布很广,这使得它和其他敏捷方法不同,因为一般的敏捷方法都强调项目组成员在同一地点工作。开放源码的一个突出特点就是查错排障(debug)的高度并行性,任何人发现了错误都可将改正源码的“补丁”文件发给维护者。然后由维护者将这些“补丁”或是新增的代码并入源码库。
- SCRUM。 SCRUM己经出现很久了,像前面所论及的方法一样,该方法强调这样一个事实,即明确定义了的可重复的方法过程只限于在明确定义了的可重复的环境中,为明确定义了的可重复的人员所用,去解决明确定义了的可重复的问题。
- Coad的功用驱动开发方法(FDD-Feature Driven Development) FDD是由Jeff De Luca和大师Peter Coad提出来的。像其他方法一样,它致力于短时的迭代阶段和可见可用的功能。在FDD中,一个迭代周期一般是两周。在FDD中,编程开发人员分成两类:首席程序员和“类”程序员((class owner)。首席程序员是最富有经验的开发人员。他们是项目的协调者、设计者和指导者,而“类”程序员则主要做源码编写。
- ASD方法,ASD (Adaptive Software Development)方法由Jim Highsmith提出,其核心是三个非线性的、重叠的开发阶段:猜测、合作与学习。
4. 软件过程管理
4.1. 软件能力成熟度模型
(1)CMM的等级(5个等级)
- 初始级
- 可重复级
- 已定义级
- 以管理级
- 优化级
(2)关键过程域
(3)能力成熟度模型集成
4.2. 软件过程评估
软件过程能力评估是根据过程模型或其他模型对组织的软件过程所进行的规范的评估。主要参考的方法有以下几种:
(1)CMM模型
(2)Trillum模型
(3)Bootstrap方法
(4)ISO/IEC 15504标准
(5)SJ/T 11234-2001标准