【概述】
软件过程,是指软件的诞生和生命周期,其是为开发软件产品或完成软件工程项目而需要完成的有关软件工程的活动,每一项活动又分为一系列的工程任务
通常,使用生命周期模型简洁地描述软件过程,生命周期模型规定了将生命周期划分为哪些阶段与各阶段执行顺序,因此又称为过程模型
【软件生命周期】
软件生命周期,是指从设计产品的构想开始,到最终被市场淘汰的全过程,其时间角度将软件开发和维护的复杂过程,分解为若干阶段,每个阶段都完成特定的相对独立的任务
在传统的软件工程中,软件产品分为六个周期:
- 可行性研究:用最小的代价在最小的时间内确定目标系统能否解决要解决的问题
- 需求分析:将可行性研究期间建立的软件可行性分析细化,对目标系统提出完整、准确、清晰、具体的要求
- 软件设计:根据需求分析阶段确定的功能,来设计目标系统的整体结构、划分功能模块、确定每个模块的实现算法,形成软件的具体设计方案
- 编码:根据软件设计方案,通过程序设计语言编写目标系统源代码
- 软件测试:根据目标系统实际输出与预期输出之间进行审核、比较
- 软件维护:在软件产品发布后,因修正错误、提升性能或其他属性而进行的软件修改
【传统软件过程模型】
在软件工程中,通过建立抽象的软件开发模型,将软件生命周期中的各个活动或步骤安排到一个框架中,将软件开发的全过程直观地表达出来
瀑布模型
瀑布模型是一种基于文档驱动的线性开发模型,具有不可回溯性
开发人员必须等待前一阶段任务完成后,才能开始进行后一阶段的工作,并且前一阶段的输出往往是后一阶段的输入
由于其不可回溯性,如果在软件生命周期的后期发现需要更改的前期的内容,那么需要付出很高的代价
为解决上述问题,提出了待反馈的瀑布模型,其可以通过反馈来在后期对前期内容进行更改
瀑布模型过程简单,容易执行,但无法适应变更,其适用于需求不发生或很少发生变化的模型,软件项目风险低,不具有完善的风险控制机制,对软件开发人员要求较高,需要具有丰富的经验
快速原型模型
原型,是一个部分开发的产品,是一个能让用户进行测试的原型系统
快速原型的本质是快速,原型内部系统的结构并不重要,重要的是迅速的构建原型,然后根据用户反馈意见不断地修改原型。因此,开发人员应尽可能的建造出原型系统,以加速软件开发过程,节约开发成本
快速模型适用于已有产品或样品,只需要客户化的工程项目或进行产品移植和升级的软件
增量模型
增量模型是将待开发的软件系统模块化,将每个模块作为一个增量组件,分批次地进行分析、设计、编码、测试
增量模型的开发过程是递增式的过程,相对于瀑布模型而言,开发人员不需要一次性地将软件产品提交给用户,而是可以采用分批次地进行提交
增量模型最大特点就是将软件系统模块化、组件化,开发顺序灵活,可以对构件的实现顺序激进型优先级排序,先完成需求稳定的核心组件,同时可以分批次地提交软件产品,使用户可以及时了解项目进展,此外,还降低了软件开发的风险,一个开发周期内的错误不会影响到整个软件系统
螺旋模型
螺旋模型是一种用于风险较大的大型软件项目开发的过程模型,该模型将瀑布模型和快速原型模型结合起来,并加入了这两种模型忽略了的风险分析
其将开发过程分为 4 种活动:制定计划、风险分析、实施工程、客户评估
螺旋模型适用于风险较大的、需求不明确的大型软件的开发,其将风险分析扩展到各个阶段当中,大幅降低了软件开发风险,但这种模型控制、管理复杂,可操作性不强,对开发人员要求较高
喷泉模型
喷泉模型是一种过程模型,体系了面向对象软件开发过程不同阶段的相互重叠,这明确表示两个活动间没有明显阶段,存在交迭
在面向对象的方法中,分析模型和设计模型采用相同的符号体系,各阶段间没有明显界限,常常重复、迭代地进行,主要适用于面向对象的软件项目的开发
【现代软件过程模型】
基于组件的开发模型
组件,是系统中模块化、可更换的、实现特定功能的部分,其对实现进行封装,暴露一组接口,常见的组件有:动态链接库、浏览器插件
基于组件的开发模型使用现有的组件与系统框架进行产品开发,充分的体现了软件复用的思想,降低了开发成本与风险,并加快了产品开发
统一软件开发过程模型
统一软件开发过程模型(RUP,Rational Unified Process),是基于 UML 的一种面向对象的软件开发模型
其解决了螺旋模型的可操作性问题,采用迭代和增量递进的开发策略,并以用例驱动为特点,集成了多个软件开发模型的优点
如上图,描述了 RUP 的过程,竖向来看,是有九个工作的工作流;横向来看,整个 RUL 分为四个阶段:
- 初始化:又称先启,进行项目计划、评估风险
- 细化:设计系统架构、确定资源需求
- 构建:开发出所有组件与应用程序,集成并进行详尽测试
- 产品化:将产品移交给用户
在整个过程中,每个阶段在相应的工作流中根据侧重不同,不断通过迭代来进行完善
敏捷过程开发模型
敏捷过程是一种快速、小文档、轻量型的软件工程模型,相对于传统的软件工程方法,其更强调软件开发过程中各种变化的必然性,通过团队成员间充分交流、沟通以及合理的机制来有效地相应变化
其不是一种模型方法,而是一类实践方法,包括:极限编程 XP、自适应软件开发 ASD、动态系统开发方法 DSDM、特征驱动开发 FDD 等
最常用的方法模型方法是极限编程(XP,eXtreme Programmaing),其是一种实践性较强的规范化的软件开发方法,它强调用户需求和团队合作工作,特别适用于软件需求模糊、容易改变、开发团队人数较少的场合
【模型选择技巧】
- 瀑布模型:前期需求明确
- 快速原型模型:用户无使用经验
- 增量模型或螺旋模型:不确定因素很多、很多东西无法提前计划
- 增量模型:资金、成本无法一次到位
- 全新系统开发:在总体设计完成后再进行增量开发或并行开发
- 开发人员经验较少时:尽量不采用敏捷模型