软件过程模型是一种规划和组织软件开发过程的方法。
过程模型通常由一系列阶段和任务组成,这些任务在软件开发的不同阶段都有特定的目标。每个阶段都有自己的任务和产出物,这些产出物构成了软件开发的不同部分,最终汇总成完整的软件产品。
瀑布模型 (Waterfall Model) 是最早使用的软件过程模型之一,包含一系列活动。这些活动从一个阶段到另一个阶段逐次下降,它的工作流程在形式上很像瀑布,因此被称为瀑布模型。
(1)软件需求的完整性、正确性等很难确定,甚至是不可能和不现实的。
(2)瀑布模型是一个严格串行化的过程模型,使得用户和软件项目负责人要相当长的时间才能得到一个可以看得见的软件系统。
(3)瀑布模型的基本原则是在每个阶段一次性地完全解决该阶段的工作,不会出现遗漏、错误等情况,而实际上这是不现实、不可能的。
原型模型 (Prototype Model) 又称快速原型。
由于瀑布型的缺点,人们借鉴建筑师、工程师建造原型的经验,提出了原型模型。
创建快速原型,弄清当前需求。
适用于需求不明确的情况。
按照原型的作用不同,分为抛弃型原型和演化性原型。
(1)抛弃型原型是将原型作为需求确认的手段,在需求确认结束后,原型就被抛弃不用,重新采用一个完整的瀑布模型进行开发。
(2)演化性原型是在需求确认结束后,不断补充和完善原型,直至
形成一个完整的产品。
螺旋模型 (Spiral Model) 是在快速原型的基础上扩展而成。也有人把螺旋模型归到快速原型,实际上,它是生命周期模型与原型模型的结合。
这种模型把整个软件开发流程分成多个阶段,每一个阶段都由4部分组成:
(1)目标设定。为该项目进行需求分析,定义和确定这一个阶段的专门目标,指定对过程和产品的约束,并且制订详细的管理计划。
(2)风险分析。对可选方案进行风险识别和详细分析,制定解决办法,采取有效措施避免这些风险。
(3)开发和有效性验证。风险评估后,可以为系统选择开发模型,并且进行原型开发,即开发软件产品。
(4)评审。对项目进行评审,以确定是否需要进入螺旋线的下一次回路,如果决定继续,就要制订下一阶段计划。
该模型支持大型软件开发,适用于面向规格说明、面向过程和面向对象的软件开发方法,也适用于几种开发方法的组合。
从整体上看,V模型就是一个V字结构。
由左右两边组成,如下图。
首先开发核心模块功能,而后与用户确认,之后再开发次核心模块的功能。
即,每次开发一部分功能,并与用户确认,最终完成项目开发,优先级最高的服务最先交付。
但由于并不是从系统整体角度规划各个模块,所以并不利于模块划分。
难点在于如何将用户需求划分为多个增量。
与原型不同的是,增量模型的每一次增量版本都可以作为独立可操作的产品;而原型的构造一般是为了演示。
是一种以用户需求作为动力,以对象作为驱动的模型,适合于面向对象开发方法。
也称为快速开发模型。
主要是利用预先包装的构件来构造应用系统。
构件可以是组织内部开发的构件,也可以是商品化成品软件构件。
特点是增强了复用性。
在开发过程中,会构建一个构件库,供其它系统复用,因此可以提高可靠性,节省时间和成本。
建立在严格数学基础上的一种软件开发方法。
主要活动是生成计算机软件形式化的数学规格说明。
软件开发在20世纪90年代受到两个大的因素影响:
快速变化的需求需要短的产品交付周期,这与传统软件开发流程并不兼容。
2001年2月,17位著名的软件开发专家举行了一次敏捷方法发起者和实践者的聚会。在这次会议上,正式提出了Agile (敏捷)的概念。
敏捷型方法主要有两个特点,这也是其区别于其他方法——尤其是计划驱动或重型开发方法——的最主要的特征。
软件开发不同于传统工程——如土木工程等——无法将设计和实施分离开来。
一些设计错误只能在编码和测试时才能发现,根本无法做出一个交给程序员就能直接编码的软件设计。
软件需求的不稳定,导致软件过程的不可预测。
但是,必须对这样的过程进行监控,以使得整个过程能向期望的目标前进。
敏捷方法使用反馈机制对不可预测过程进行控制。
极限编程 (Extreme Programming,XP)。
在所有的敏捷型方法中, XP是最引人瞩目的。
极限编程是一个轻量级的、灵巧的软件开发方法;同时它也是一个非常严谨和周密的方法。
它的基础和价值观是交流、朴素、反馈和勇气,即任何一个软件项目都可以从4个方面入手进行改善:加强交流;从简单做起;寻求反馈;勇于实事求是。
水晶系列方法(Crystal)与XP方法一样,都有以人为中心的理念,但在实践上有所不同。
其目的是发展一种提倡“机动性的”方法,包含具有共性的核心元素,每个都含有独特的角色、过程模式、工作产品和实践。
Crystal 家族实际上是一组经过证明、对不同类型项目非常有效的敏捷过程,它的发明使得敏捷团队可以根据其项目和环境选择最合适的 Crystal 家族成员。
并列争球法(Scrum)侧重于项目管理。
Scrum是迭代式增量软件开发过程,通常用于敏捷软件开发。 Scrum包括了一系列实践和预定义角色的过程骨架(是一种流程、计划、模式,用于有效率地开发软件)。
在Scrum 中,使用产品 Backlog 来管理产品的需求。
产品 Backlog 是一个按照商业价值排序的需求列表。
根据 Backlog 的内容,将整个开发过程被分为若干个短的迭代周期 (Sprint)。
在 Sprint 中,Scrum 团队从产品 Backlog 中挑选最高优先级的需求组成 Sprint backlog。
在每个迭代结束时, Scrum 团队将递交潜在可交付的产品增量。
当所有 Sprint 结束时,团队提交最终的软件产品。
特征驱动开发方法 (Feature Driven Development,FDD) 是一个迭代的开发模型。 FDD认为有效的软件开发需要3个要素:人、过程和技术。
FDD定义了6种关键的项目角色:
(1)项目经理
(2)首席架构设计师
(3)开发经理
(4)主程序员
(5)程序员
(6)领域专家。
根据项目大小,部分角色可以重复。
(1)开发整体对象模型
(2)构造特征列表
(3)计划特征开发
(4)特征设计
(5)特征构建。
其中,计划特征开发根据构造出的特征列表、特征间的依赖关系进行计划,设计出包含特征设计和特征构建过程组成的多次迭代。
软件统一过程 (Rational Unified Process, RUP) 描述了如何有效地利用商业的、可靠的方法开发和部署软件,是一种重量级过程。
RUP类似一个在线的指导者,它可以为所有方面和层次的程序开发提供指导方针、模版以及事例支持。
RUP 软件开发生命周期是一个二维的软件开发模型,RUP 中有9个核心工作流,具体如下。
表示核心工作流的术语 Discipline,中文意义较多。根据RUP的定义,Discipline是相关活动的集合,这些活动都和项目的某一个方面有关,如这些活动都是和业务建模相关的,或者都是和需求相关的,或者都是和分析设计相关的,等等。
RUP 把软件开发生命周期划分为多个循环 (Cycle),每个循环生成产品的一个新的版本,每个循环依次由4个连续的阶段 (Phase) 组成,每个阶段完成确定的任务。
每一个阶段都由一个或多个连续的迭代 (Iteration) 组成。
迭代并不是重复地做相同的事,而是针对不同用例的细化和实现。
每一个迭代都是一个完整的开发过程,它需要项目经理根据当前迭代所处的阶段以及上次迭代的结果,适当地对核心工作流中的行为进行裁剪。
在每个阶段结束前有一个里程碑 (Milestone) 评估该阶段的工作。如果未能通过该里程碑的评估,则决策者应该做出决定,是取消该项目还是继续做该阶段的工作。
RUP 中定义了如下一些核心概念,理解这些概念对于理解RUP很有帮助。
RUP 2003对这些概念有比较详细的解释,并用类图描述了这些概念之间的关系,除了上述这4个核心概念外,还有其他一些基本概念,如工具教程 (ToolMentor)、 检查点 (Checkpoints)、 模板 (Template) 和报告 (Report) 等。
RUP 是用例驱动的、以体系结构为中心的、迭代和增量的软件开发过程。
RUP中的开发活动是用例驱动的,即需求分析、设计、实现和测试等活动都是用例驱动的。
RUP中的开发活动是围绕体系结构展开的。
软件体系结构的设计和代码设计无关,也不依赖于具体的程序设计语言。
软件体系结构是软件设计过程中的一个层次,这一层次超越计算过程中的算法设计和数据结构设计。
体系结构层次的设计问题包括系统的总体组织和全局控制、通信协议、同步、数据存取、给设计元素分配功能、设计元素的组织、物理分布、系统的伸缩性和性能等。
对于一个软件系统,不同人员所关心的内容是不一样的。
因此,软件的体系结构是一个多维的结构,也就是说,会采用**多个视图 **(View) 来描述软件体系结构。
RUP采用“4+1”视图模型来描述软件系统的体系结构,如下图所示。
RUP强调采用迭代和增量的方式来开发软件,把整个项目开发分为多个迭代过程。
在每次迭代中,只考虑系统的一部分需求,进行分析、设计、实现、测试和部署等过程。
每次迭代是在已完成部分的基础上进行的,每次增加一些新的功能实现。
以此进行下去,直至最后项目的完成。
软件开发采用迭代和增量的方式有以下几种优点:
(1)在软件开发的早期就可以对关键的、影响大的风险进行处理。
(2)可以提出一个软件体系结构来指导开发。
(3)可以更好地处理不可避免的需求变更。
(4)可以较早得到一个可运行的系统,鼓舞发团队的士气,增强项目成功的信心。
(5)为开发人员提供一个能更有效工作的开发过程。