软件开发模式
随着软件开发规模的增大,软件开发已经从早期的艺术化发展到现在的 软件工程阶段。软件工程的出现是为了解决软件开发中的软件危机问题,软 件危机指的是在计算机软件的开发和维护过程中所遇到的一系列严重问题。 在软件工程中,软件开发模型占有极其重要的地位。软件开发模型是软件开 发的全部过程、活动和任务的结构框架,软件开发模型能清晰、直观地表达 软件开发全过程,明确规定了要完成的主要活动和任务,用来作为软件项目 开发的基础。软件开发模型给出了软件开发活动各阶段之间的关系,它是软 件开发过程的概括,是软件工程的重要内容,它为软件工程管理提供里程碑 的进度表,为软件开发过程提供原则和方法。
正如任何事物一样,软件也有起孕育诞生,成 长,成熟和衰亡的生存过程,一般称其为软件的生命 周期 . 软件生命周期一般分为六个步骤:即制定计 划,需求分析,设计,编码,测试及运行和维护( 软件开 发各个阶段之间的关系不可能是顺序,线性的,相反 这个过程应该是带有反馈的迭代过程( 在软件工程 中,这个复杂的过程是用软件开发模型来描述和表示 的( 目前#对软件开发模型的研究分支很多 ,其大 多是针对某个问题提出一种新的开发模型)
-
边做边改模型
好吧,其实现在许多产品实际都是使用的“边做边改”模型来开发的,特别是很多小公司产品周期压缩的太短。在这种模型中,既没有规格说明,也没有经过设计,软件随着客户的需要一次又一次地不断被修改。
在这个模型中,开发人员拿到项目立即根据需求编写程序,调试通过后生成软件的第一个版本。在提供给用户使用后,如果程序出现错误,或者用户提出新的要求,开发人员重新修改代码,直到用户和测试等等满意为止。
这是一种类似作坊的开发方式,边做边改模型的优点毫无疑问就是前期出成效快。
对编写逻辑不需要太严谨的小程序来说还可以对付得过去,但这种方法对任何规模的开发来说都是不能令人满意的,其主要问题在于:
1)缺少规划和设计环节,软件的结构随着不断的修改越来越糟,导致无法继续修改;
2)忽略需求环节,给软件开发带来很大的风险;
3)没有考虑测试和程序的可维护性,也没有任何文档,软件的维护十分困难。 -
瀑布模型
瀑布模型是一种比较老旧的软件开发模型,1970年温斯顿·罗伊斯提出了著名的“瀑布模型”,直到80年代都还是一直被广泛采用的模型。
瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。
在瀑布模型中,软件开发的各项活动严格按照线性方式进行,当前活动接受上一项活动的工作结果,实施完成所需的工作内容。当前活动的工作结果需要进行验证,如验证通过,则该结果作为下一项活动的输入,继续进行下一项活动,否则返回修改。
瀑布模型优点是严格遵循预先计划的步骤顺序进行,一切按部就班比较严谨。
瀑布模型强调文档的作用,并要求每个阶段都要仔细验证。但是,这种模型的线性过程太理想化,已不再适合现代的软件开发模式,其主要问题在于:
1)各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量;
2)由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发的风险;
3)早期的错误可能要等到开发后期的测试阶段才能发现,进而带来严重的后果。
4)各个软件生命周期衔接花费时间较长,团队人员交流成本大。
5)瀑布式方法在需求不明并且在项目进行过程中可能变化的情况下基本是不可行的。 -
迭代模型
迭代式开发也被称作迭代增量式开发或迭代进化式开发
是一种与传统的瀑布式开发相反的软件开发过程,它弥补了传统开发方式中的一些弱点,具有更高的成功率和生产率。
在迭代式开发方法中,整个开发工作被组织为一系列的短小的、固定长度(如3周)的小项目,被称为一系列的迭代。每一次迭代都包括了需求分析、设计、实现与测试。采用这种方法,开发工作可以在需求被完整地确定之前启动,并在一次迭代中完成系统的一部分功能或业务逻辑的开发工作。再通过客户的反馈来细化需求,并开始新一轮的迭代。
迭代和版本的区别,可理解如下:迭代一般指某版本的生产过程,包括从需求分析到测试完成;版本一般指某阶段软件开发的结果,一个可交付使用的产品。
与传统的瀑布模型相比较,迭代过程具有以下优点:
1)降低了在一个增量上的开支风险。如果开发人员重复某个迭代,那么损失只是这一个开发有误的迭代的花费。
2)降低了产品无法按照既定进度进入市场的风险。通过在开发早期就确定风险,可以尽早来解决而不至于在开发后期匆匆忙忙。
3)加快了整个开发工作的进度。因为开发人员清楚问题的焦点所在,他们的工作会更有效率。
4)由于用户的需求并不能在一开始就作出完全的界定,它们通常是在后续阶段中不断细化的。因此,迭代过程这种模式使适应需求的变化会更容易些。因此复用性更高 增量模型
与建造大厦相同,软件也是一步一步建造起来的。在增量模型中,软件被作为一系列的增量构件来设计、实现、集成和测试,每一个构件是由多种相互作用的模块所形成的提供特定功能的代码片段构成。
增量模型在各个阶段并不交付一个可运行的完整产品,而是交付满足客户需求的一个子集的可运行产品。整个产品被分解成若干个构件,开发人员逐个构件地交付产品,这样做的好处是软件开发可以较好地适应变化,客户可以不断地看到所开发的软件,从而降低开发风险。但是,增量模型也存在以下缺陷:
1)由于各个构件是逐渐并入已有的软件体系结构中的,所以加入构件必须不破坏已构造好的系统部分,这需要软件具备开放式的体系结构。
2)在开发过程中,需求的变化是不可避免的。增量模型的灵活性可以使其适应这种变化的能力大大优于瀑布模型和快速原型模型,但也很容易退化为边做边改模型,从而是软件过程的控制失去整体性。
在使用增量模型时,第一个增量往往是实现基本需求的核心产品。核心产品交付用户使用后,经过评价形成下一个增量的开发计划,它包括对核心产品的修改和一些新功能的发布。这个过程在每个增量发布后不断重复,直到产生最终的完善产品。
例如,使用增量模型开发字处理软件。可以考虑,第一个增量发布基本的文件管理、编辑和文档生成功能,第二个增量发布更加完善的编辑和文档生成功能,第三个增量实现拼写和文法检查功能,第四个增量完成高级的页面布局功能。螺旋模型
1988年,巴利·玻姆(Barry Boehm)正式发表了软件系统开发的“螺旋模型”,它将瀑布模型和快速原型模型结合起来,强调了其他模型所忽视的风险分析,特别适合于大型复杂的系统。
螺旋模型沿着螺线进行若干次迭代,图中的四个象限代表了以下活动:
1)制定计划:确定软件目标,选定实施方案,弄清项目开发的限制条件;
2)风险分析:分析评估所选方案,考虑如何识别和消除风险;
3)实施工程:实施软件开发和验证;
4)客户评估:评价开发工作,提出修正建议,制定下一步计划。
螺旋模型由风险驱动,强调可选方案和约束条件从而支持软件的重用,有助于将软件质量作为特殊目标融入产品开发之中。但是,螺旋模型也有一定的限制条件,具体如下:
1)螺旋模型强调风险分析,但要求许多客户接受和相信这种分析,并做出相关反应是不容易的,因此,这种模型往往适应于内部的大规模软件开发。
2)如果执行风险分析将大大影响项目的利润,那么进行风险分析毫无意义,因此,螺旋模型只适合于大规模软件项目。
3)软件开发人员应该擅长寻找可能的风险,准确地分析风险,否则将会带来更大的风险
一个阶段首先是确定该阶段的目标,完成这些目标的选择方案及其约束条件,然后从风险角度分析方案的开发策略,努力排除各种潜在的风险,有时需要通过建造原型来完成。如果某些风险不能排除,该方案立即终止,否则启动下一个开发步骤。最后,评价该阶段的结果,并设计下一个阶段原型模型:(样品模型,采用逐步求精的方法完善原型)
主要思想: 先借用已有系统作为原型模型,通过“样品”不断改进,使得最后的产品就是用户所需要的。原型模型通过向用户提供原型获取用户的反馈,使开发出的软件能够真正反映用户的需求,
采用方法:
原型模型采用逐步求精的方法完善原型,使得原型能够“快速”开发,避免了像瀑布模型一样在冗长的开发过程中难以对用户的反馈作出快速的响应
优点:
(1)开发人员和用户在“原型”上达成一致。这样一来,可以减少设计中的错误和开发中的风险,也减少了对用户培训的时间,而提高了系统的实用、正确性以及用户的满意程度。
(2)缩短了开发周期,加快了工程进度。
(3)降低成本。
缺点:
1、当重新生产该产品时,难以让用户接收,给工程继续开展带来不利因素。
2、不宜利用原型系统作为最终产品。采用原型模型开发系统,用户和开发者必须达成一致:喷泉模型
喷泉模型与传统的结构化生存期比较,具有更多的增量和迭代性质,生存期的各个阶段可以相互重叠和多次反复,而且在项目的整个生存期中还可以嵌入子生存期。就像水喷上去又可以落下来,可以落在中间,也可以落在最底部。
快速原型模型
快速原型模型的第一步是建造一个快速原型,实现客户或未来的用户与系统的交互,用户或客户对原型进行评价,进一步细化待开发软件的需求。通过逐步调整原型使其满足客户的要求,开发人员可以确定客户的真正需求是什么;第二步则在第一步的基础上开发客户满意的软件产品。
显然,快速原型方法可以克服瀑布模型的缺点,减少由于软件需求不明确带来的开发风险,具有显著的效果。
快速原型的关键在于尽可能快速地建造出软件原型,一旦确定了客户的真正需求,所建造的原型将被丢弃。因此,原型系统的内部结构并不重要,重要的是必须迅速建立原型,随之迅速修改原型,以反映客户的需求。
快速原型模型有点整合“边做边改”与“瀑布模型”优点的意味。演化模型(evolutionary model)
主要针对事先不能完整定义需求的软件开发。用户可以给出待开发系统的核心需求,并且当看到核心需求实现后,能够有效地提出反馈,以支持系统的最终设计和实现。软件开发人员根据用户的需求,首先开发核心系统。当该核心系统投入运行后,用户试用之,完成他们的工作,并提出精化系统、增强系统能力的需求。
软件开发人员根据用户的反馈,实施开发的迭代过程。第一迭代过程均由需求、设计、编码、测试、集成等阶段组成,为整个系统增加一个可定义的、可管理的子集。
在开发模式上采取分批循环开发的办法,每循环开发一部分的功能,它们成为这个产品的原型的新增功能。于是,设计就不断地演化出新的系统。实际上,这个模型可看作是重复执行的多个“瀑布模型”。
“演化模型”要求开发人员有能力把项目的产品需求分解为不同组,以便分批循环开发。这种分组并不是绝对随意性的,而是要根据功能的重要性及对总体设计的基础结构的影响而作出判断。有经验指出,每个开发循环以六周到八周为适当的长度- 混合模型(hybrid model)
过程开发模型又叫混合模型(hybrid model),或元模型(meta-model),把几种不同模型组合成一种混合模型,它允许一个项目能沿着最有效的路径发展,这就是过程开发模型(或混合模型)。实际上,一些软件开发单位都是使用几种不同的开发方法组成他们自己的混合模型。
大致列举部分常用软件过程模型的特点和适用范围:
模型名称 技术特点 适用范围 瀑布模型 简单,分阶段,阶段间存在因果关系, 各个阶段完成后都有评审,允许反馈,不支持
用户参与,要求预先确定需求
需求易于完善定义且不易变更的软件系统 快速原型模型 不要求需求预先完备定义,支持用户参与, 支持需求的渐进式完善和确认,能够适应用户需求的变化
需求复杂、难以确定、动态变化的软件系统 增量模型 软件产品是被增量式地一块块开发的, 允许开发活动并行和重叠
技术风险较大、用户需求较为稳定的软件系统 迭代模型 不要求一次性地开发出完整的软件系统,将软件 开发视为一个逐步获取用广需求、完善软件产品的过程
需求难以确定、不断变更的软件系统 螺旋模型 结合瀑布模型、快速原型模型和迭代模 型的思想,并引进了风险分析活动
需求难以获取和确定、软件开发风险较大的软件系统
新型软件开发模型
- 智能模型(四代技术(4GL))
智能模型拥有一组工具(如数据查询、报表生成、数据处理、屏幕定义、代码生成、高层图形功能及电子表格等),每个工具都能使开发人员在高层次上定义软件的某些特性,并把开发人员定义的这些软件自动地生成为源代码。这种方法需要四代语言(4GL)的支持。
4GL不同于三代语言,其主要特征是用户界面极端友好,即使没有受过训练的非专业程序员,也能用它编写程序;它是一种声明式、交互式和非过程性编程语言。4GL还具有高效的程序代码、智能缺省假设、完备的数据库和应用程序生成器。但4GL目前主要限于事务信息系统的中、小型应用程序的开发。
WINWIN模型
WINWIN模型融合了螺旋模型的基本成分和原 型实现的迭代特征,强调风险分析和标识,通过早期 谈判使客户和开发者之间达成一致协议,通过一组谈 判活动达成双赢结果,它将变成进展到软件和系统定义的标准,引入了三个里程碑,称为抛瞄 点它将帮助建立一个生命周期的完整性并提供 在软件项目向前进展时的里程碑
基于构建的开发模型
基于构件的开发模型利用模块化方法*将整个系 统模块化*并在一定构件模型的支持下*复用构件库 中的一个或多个构件*通过组合手段高效率-高质量 地构造应用软件系统的过程) 基于构件的开发模型融 合了螺旋模型的许多特征*本质上是演化形的 ’*(*开 发过程是迭代的) 基于构件的开发模型由软件的需求 分析和定义-体系结构设计-构件库建立-应用软件构 造-测试和发布五个阶段组成)
基于构件的开始活动从标识候选构件开始*通过 搜查已有构件库*确认所需要的构件是否存在*如果 已经存在*就从构件库中提取出来复用,如果不存在* 就采用面向对象的方法开发) 之后利用提取出来的构 件通过语法和语义的检查后*将这些构件胶合代码组 装到一起实现系统*这个过程是迭代的)
基于构件的开发使得软件开发不再一切从头开 发*开发的过程就是构件组装的过程*维护的过程就 是构件升级-替换和扩充的过程) 其优点是构件组装 模型导致了软件的复用* 提高了软件开发的效率*构 件可由一方定义其规格说明*被另一方实现*然后供 给第三方使用* 构件组装模型允许多个项目同时开 发*降低了费用*提高了可维护性*可实现分步提交软 件产品)
由于采用自定义的组装结构标准*缺乏通用的组 装结构标准*引入较大的风险) 可重用性和软件高效 性不易协调*需要精干有经验的分析开发人员*一般 的开发人员插不上手*客户的满意度低,过分依赖于 构件*构件库的质量影响着产品的质量)基于体系结构的开发模型
基于体系结构的开发模型是以软件体系结构为 核心*以基于构件的开发方法为基础*采用迭代增量 方式进行分析和设计* 将功能设计空间映射到结构设 计空间* 再由结构设计空间映射到系统设计空间的过 程’,() 把软件生命周期分为软件定义-需求分析和定义- 体系结构设计-软件系统设计和软件实现五阶段)
敏捷开发模型
敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
敏捷开发小组主要的工作方式可以归纳为:作为一个整体工作;按短迭代周期工作;每次迭代交付一些成果,关注业务优先级,检查与调整。
敏捷软件开发要注意项目规模,规模增长,团队交流成本就上去了,因此敏捷软件开发暂时适合不是特别大的团队开发,比较适合一个组的团队使用。敏捷软件开发又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力。它们的具体名称、理念、过程、术语都不尽相同,相对于“非敏捷”,更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重做为软件开发中人的作用。
目前列入敏捷方法的有:
软件开发节奏,Software Development Rhythms
敏捷数据库技术,AD/Agile Database Techniques
敏捷建模,AM/Agile Modeling
自适应软件开发,ASD/Adaptive Software Development
水晶方法,Crystal
特性驱动开发,FDD/Feature Driven Development
动态系统开发方法,DSDM/Dynamic Systems Development Method
精益软件开发,Lean Software Development
AUP(Agile Unified Process)
Scrum
XBreed
极限编程,XP Extreme Programming
探索性测试面向软件产品线的开发模型
软件产品线是一种面向特定领域、以全面和系统的软件复用为基础的软件开 发方法。软件产品线开发主要通过领域工程阶段面向领域的分析、设计和实现过 程形成产品线核心资产集合,并以此为基础实现快速、高效、高质量的应用产品 生产。现实中的软件产品线往往都是在一系列独立的领域应用基础上随着领域的 逐渐成熟而出现的,很少从头开始构造。这些软件产品线一般都是在若干独立开 发应用产品上取得初步的成功后,通过再工程,以增量演化的方法引入的。在此 过程中,如何尽量复用已有遗留应用系统中的软件资源,以降低向软件产品线迁 移的成本是一个现实问题。
面向软件产品线逆向工程与传统逆向工程的主要区别在于针对的分析对象 是多个同属一个业务领域、实现相似需求的遗留应用系统。因此,相应的逆向工 程过程除了模型和视图的抽取之外,还需要实现逆向的共性和可变性分析。这种 逆向可变性分析的基础和前提是能够在不同系统逆向恢复的模型和视图之间建 立起对应关系,而相应的实现方式与遗留应用产品的状况相关