软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
概括地说,软件过程描述了为了开发出客户需要的软件,什么人(who)、在什么时候(when)、做什么事(what)及怎样做这些事(how)以实现某个特定的具体目标。
通常使用生命周期模型简洁地描述软件过程。生命周期模型规定了把生命周期划分成哪个阶段及各个阶段的执行顺序,也称为过程模型。
实际从事软件开发工作时应该根据所承担的项目的特点来划分阶段,但是下面典型的软件过程模型不是针对某个特定项目讲的,只能使用“通用的”阶段划分方法。
由于瀑布模型与快速原型模型的主要区别是获取用户需求的方法不同,下面在介绍生命周期模型时把“规格说明”作为一个阶段独立出来。此外,问题定义和可行性研究的主要任务都是概括地了解用户的需求,为了简洁地描述软件过程,把它们都归并到需求分析中去了。同样,为了简洁起见,把总体设计和详细设计合并在一起成为“设计”。
一、瀑布模型
在20世纪80年代之前,瀑布模型一直是唯一被广泛采用的生命周期模型,现在它仍然是软件工程中应用的最广泛的过程模型。
1.1 什么是瀑布模型
瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序。
从本质来讲,它是一个软件开发架构。开发过程通过一系列阶段顺序展开,从系统需求分析开始到产品发布和维护,每个阶段都会产生循环反馈,因此如果有信息未被覆盖或者发现了问题,那么最好 “返回”上一个阶段并进行适当的修改。开发进程从一个阶段“流动”到下一个阶段,这也是瀑布模型名称的由来。
1.2 特点
1、阶段间具有顺序性和依赖性
①必须等前一阶段的工作完成后,才能开始后一阶段的工作。
②前一阶段的输出文档是后一阶段的输入文档,因此,只有前一阶段的输出文档正确,后一阶段的工作才能获得正确的结果。
2、推迟实现的观点
缺乏软件工程实践经验的软件开发人员接到软件开发任务后常常急于求成,总想尽早开始编写程序。但实践表明,对于规模较大的软件项目来说,往往编码开始的越早,最终完成开发所需的时间越长。这是因为前面阶段的工作没做或做的不扎实,过早地考虑进行程序实现,往往导致大量返工,有时甚至产生无法弥补的问题。
瀑布模型在编码之前设置了系统分析与系统设计阶段,分析与设计阶段的基本任务规定,在这两个阶段主要考虑目标系统的逻辑模型而不涉及软件的物理实现。
清楚的区分逻辑设计与物理设计,尽可能推迟程序的物理实现,是按照瀑布模型开发软件的一条重要的指导思想。
3、质量保证的观点
为了保证所开发的软件的质量,在瀑布模型的每一个阶段都应坚持两个重要做法。
①每个阶段都必须完成规定的文档,没有交出合格的文档就是没有完成该阶段的任务。
②每个阶段结束前都要对所完成的文档进行评审,以便尽早发现问题,改正错误。
传统的瀑布模型过于理想化,实际的瀑布模型是带"反馈环"的(左下方)。如图所示(图中实线箭头表示开发过程,虚线箭头表示维护过程),当在后面阶段发现前面阶段的错误时,需要沿图中左侧的反馈线返回前面的阶段,修正前面阶段的产品后再回来继续完成后面阶段的任务。

1.3 优缺点
1、优点
①可强迫开发人员采用规范的方法。
②严格规定了每个阶段必须提交的文档。
③要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证。
2、 缺点
①在可运行的软件产品交付给用户之前,用户只能通过文档来了解产品是什么样的。
②一旦用户开始使用一个软件,关于该软件应该做什么的想法就会或多或少的发生改变,使得最初提出的需求变得不完全适用。
③瀑布模型几乎完全依赖于书面的规格说明,很可能导致最终开发出的软件产品不能真正满足用户的需要。
遵守瀑布模型的文档约束将使软件维护变得更加容易,从而显著降低软件预算。瀑布模型的成功很大程度上是由于它基本上是一种文档驱动的模型。
二、快速原型模型
2.1 什么是快速原型模型
快速原型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集.
快速原型模型的第一步是快速建立一个能反映用户主要需求的原型系统,让用户在计算机上试用它,通过实践了解目标系统的概貌。通常,用户试用原型系统后会提出许多修改意见,开发人员按照用户的意见快速的修改原行系统,然后再次请用户试用。一旦用户认为这个原型系统确实能做他们需要的工作,开发人员便可据此书写规格文档说明书,根据这份文档开发出的软件便可满足用户的真实需求。
2.2 特点
如图所示,快速原型模型是不带“反馈环“的。软件产品的开发基本上是线性顺序进行的。
快速原型的本质是“快速”。开发人员应该尽可能地建造出原型系统以加速软件开发过程,节约软件开发成本。原型的用途是获知用户的真正需求,一旦需求确定了,原型将被抛弃。
当快速原型的某个部分是利用软件工具由计算机自动生成的时候,可以把这部分用到最终的软件产品中。例如用户界面通常是快速原型的一个关键部分,当使用屏幕生成程序和报表生成程序自动生成用户界面时,实际上可以把得到的用户界面用在最终的软件产品中。
2.3 快速原型模型的思想产生、原理及运用方式
1、思想产生
在需求分析阶段得到完全、一致、准确、合理的需求说明十分困难。
获得一组基本需求说明后,就快速地将其“实现”。通过原型反馈,加深对系统的理解来满足用户基本要求,使用户在试用后对需求说明进行补充和精确化,从而获得合理完整、现实可行的需求说明。再把快速原型思想用到软件开发的其他阶段,向软件开发的全过程扩展。
先用相对少的成本、较短的周期开发一个简单但可以运行的系统原型向用户演示或者让用户试用,及早澄清并检验一些主要设计策略,在此基础上再开发实际的软件系统。
2、原理
利用原型辅助软件开发。
经过简单快速分析快速实现一个原型,用户与开发者在试用原型过程中加强通信与反馈,通过反复评价和改进原型,减少误解,弥补漏洞,最终提高软件质量。
3、运用方式
由于运用原型的目的和方式不同,在使用原型时也采取不同的策略。
①抛弃策略:将原型用于开发过程的某个阶段,促使该阶段的开发结果更加完整、准确、一致、可靠,该阶段结束后原型随之作废。探索型快速原型和实验型快速原型就是采用此策略。
②附加策略:将原型用于开发的全过程,原型由最基本的核心开始,逐步增加新的功能和新的需求,反复修改反复扩充,最后发展为用户满意的最终系统。演化型快速原型就是采用此策略。
采用何种形式、何种策略运用快速原型主要取决于软件项目的特点、可供支持的原型开发工具和技术等,根据实际情况的特点决定

2.4 开发步骤
1、快速分析
在分析人员与用户密切配合下,迅速确定系统的基本需求,根据原型需要体现的特征描述基本需求以满足开发原型的需要。
2、构造原型
在快速分析的基础上,根据基本需求说明尽快实现一个可行的系统。
要求具有强有力的软件工具的支持,并忽略最终系统在某些细节上的要求,主要考虑原型系统能够充分反映所要评价的特性。
3、运行原型
发现问题,消除误解,开发者与用户充分协调。
4、评价原型
在运行的基础上,考核评价原型的特性,分析运行效果是否满足用户的愿望,纠正过去交互中的误解与分析中的错误,增添新的要求,并满足因环境变化或用户的新想法引起的系统要求变动,提出全面的修改意见。
5、修改
根据评价原型的活动结果进行修改。若原型未满足需求说明的要求,说明对需求说明存在不一致的理解或实现方案不够合理,根据明确的要求迅速修改原型。
三、增量模型
3.1 什么是增量模型
使用增量模型开发软件时把软件产品作为一系列的增量构件来设计、编码、集成和测试,每个构件由多个相互作用的模块构成,并且能够完成特定的功能。
使用增量模型时,第一个增量构件往往实现软件的基本需求,提供最核心的功能。
把软件产品分解成增量构件时,应该使构件的规模居中。
分解时唯一必须遵守的约束条件是,当把新构件集成到现有构件中时,所形成的产品必须是可测试的。

瀑布模型或快速原型模型的目标是一次就把一个满足所有需求的产品提交给用户。
增量模型分批地逐步向用户提交产品,整个软件产品被分解成多个增量构件,开发人员一个构件接一个构件地向用户提交产品。
3.2 特点
把瀑布模型的顺序特征与快速原型法的迭代特征相结合。
将软件看作一系列相互联系的增量,在开发过程的各次迭代中,每次完成其中的一个增量。
使用增量模型时开发软件和扩充软件功能并没有本质区别,都是向现有产品中加入新构件的过程。
风险更大的增量模型
确定用户需求后就着手拟定第一个构件的规格说明文档,完成后规格说明组转向第二个构件的规格说明文档,同时设计组开始涉及第一个构件。
使用该方法将不同的构件并行构建,可能加快工程进度,但将冒构件无法集成到一起的风险。
3.3 优缺点
1、优点
①能在较短的时间内向用户提交可完成部分工作的产品。
②逐步增加产品功能可以使用户有较充裕的时间学习和试用新产品,从而减少一个全新的软件可能给用户带来的冲击。
2、困难
①把每个新的增量构件集成到现有软件体系结构中时,必须不破坏原来已经开发出的产品。
②向现有产品中加入新构建的过程必须简单方便,即软件体系结构必须是开放的。
四、螺旋模型
4.1 什么是螺旋模型
螺旋模型的基本思想是,使用原型及其它方法来尽量降低风险。理解这种模型的一个简便方法是,把它看作在每个阶段之前都增加了风险分析过程的快速原型模型。
每个阶段开始时(左上象限)的任务是,确定该阶段的目标、为完成这些目标选择方案及设定这些方案的约束条件。然后从风险角度分析上一步的工作结果,努力排除各种潜在的风险,通常用建造原型的方法排除风险。如果风险不能排除,则停止开发工作或大幅度削减项目规模。如果成功排除了所有风险,则启动下一个开发步骤(右下象限),这个阶段的工作过程相当于纯粹的瀑布模型。最后评价该阶段的工作成果并计划下一个阶段的工作。
1、简化的螺旋模型

2、完整的螺旋模型
图中带箭头的点划线的长度代表当前累计的开发费用,螺旋线的角度值代表开发进度,螺旋线的每个周期对应于一个开发阶段。
图中的四个象限代表了以下活动。
①制定计划:确定软件目标,选定实施方案,弄清项目开发的限制条件。
②风险分析:分析评估所选方案,考虑如何识别和消除风险。
③实施工程:实施软件开发和验证。
④客户评估:评价开发工作,提出修正建议,制定下一步计划。
4.2 特点
主要适用于内部开发的大规模软件开发项目。项目越大,风险越大,进行风险分析的必要性越大。只有内部开发的项目才能在风险过大时方便地终止项目。
螺旋模型的主要优势在于它是风险驱动的。但这也是一个弱点,除非软件开发人员具有丰富的风险评估经验和这方面的专门知识,否则将出现真正的风险:当项目实际上走向毁灭时,开发人员可能以为一切正常。
4.3 优缺点
1、优点
①对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件开发的一个重要目标。
②减少了过多测试(浪费资金)或测试不足(产品故障多)所带来的风险。
③在螺旋模型中维护只是模型的另一个周期,在维护和开发之间并没有本质区别。
2、缺点
①采用螺旋模型需要具有相当丰富的风险评估经验和专门知识,在风险较大的项目开发中,如果未能够及时标识风险,势必造成重大损失。
②过多的迭代次数会增加开发成本,延迟提交时间。

