快捷搜索:

从瀑布型开发到迭代型开发的转变

本文来自 Rational Edge :一个抱负的迭代开拓措施模型在很多方面与抱负的瀑布开拓模型有着根本上的不合。然则,从实际来说,没有一个团队严格的利用了每一种开拓措施模型。本文说清楚明了为什么开拓团队抉择慢慢的从类似瀑布型的开拓措施改变成加倍类似迭代开拓的措施,同时也概述了能够赞助这种转变的步骤。

多半的软件开拓团队仍旧在开拓项目中应用瀑布型 的开拓历程。采纳极度的瀑布型开拓措施意味着你要以严格的顺序来完成一系列的项目阶段:需求阐发、设计、实现/集成然后是测试。当项目中呈现的问题解是艰苦的并且办理问题是昂贵时,你可能会推迟测试直到项目周期的末尾;这些问题也能够严重的要挟软件宣布的刻日并且使主要的团队成员在某些开拓环节上是余暇的。

实际上,多半的开拓团队应用了改进了的 瀑布型开拓措施,他们将项目分化成为两个或者更多的部分,无意偶尔这些部分被称为阶段或者是时期。这种改善可以赞助简化集成、使测试职员更早的进行测试事情和供给更早的项目状态的不雅测。这种措施也将代码分化成了易于治理的片断并最小化了以存根和驱动法度榜样形式的、被测试必要的代码集成。此外这种措施容许你原型化你觉得有风险的或者有难度的部分,并且应用来自每一个阶段的反馈改动你的设计。然而,应用瀑布型开拓措施的履行与想象是相反的:很多设计团队把在阶段 1 之后的改动设计视为他们的最初设计或者需求历程的掉败。虽然一个改进了的瀑布型开拓措施并不扫除反馈的应用,然则它并没有匆匆进、支持和鼓励反馈的应用。着末,想要最小化风险就不要范例的驱动一个瀑布型的开拓项目。对付软件开拓历程来说,本文探索了”迭代“开拓措施逾越传统的瀑布型开拓措施的进步。

迭代开拓的好处

相对照而言,迭代开拓措施 — 以 IBM 的 Rational 统一历程 ®,或者 RUP ®为例— 包括了一系列的增量的步骤或者迭代。每一个迭代都包括一些或者很多的开拓活动(需求、阐发、设计、实现等等),就像你在图 1 中看到的那样。每一个迭代也有一系列优越定义的目标并天生终极系统的部分事情实现。每个后续的迭代都建立在前一个迭代的根基上以使系统获得成长和细化,直到终极产品被完成。

早期的迭代着重于需求、阐发和设计;后期的迭代着重于实现和测试。

图 1: RUP 的迭代开拓。每一个迭代都包括需求、阐发、设计、实现和测试活动。同时,每个迭代都建立在前一个迭代事情的根基上,每一次迭代都邑天生加倍靠近终极产品的可履行版本。

迭代开拓措施已经证清楚明了自己优于瀑布型的开拓措施,来由如下:

它容许需求的变更

需求的变更和“进一步的伸展” — 技巧和客户驱动的特点的累加 — 不停是项目中导致麻烦、延期交付、令客户不知足和使开拓职员灰心的主要缘故原由。为了办理这些问题,应用迭代开拓措施的团队应该在项目开拓的几周里就关注天生和演示可履行的软件,这样就强制了需求的反省并可以赞助削减需求从而反应系统的本色。

集成不是在项目的尾声进行的“大年夜动作”

将系统的集成留到项目的结尾险些老是会导致耗时的返工 — 无意偶尔这种返工会花费全部项目事情量的百分之四十的光阴。为了避免这种返工,每一次迭代都以集成构建系统各部分停止;这样赓续的积累将最小化日后的返工。

早期的迭代可以裸露风险

迭代的开拓措施可以赞助团队在早期的迭代中削减风险,由于在这些迭代中包括了对所有历程组件的测试。当早期的迭代覆盖了项目的很多方面时 — 对象、购买的软件和团队成员的技能等等 — 团队能够很快的发明被预料的风险是否是真实的,并且能够在问题相对轻易并花费很少资源办理时揭示没有被发明的新的风险。

对产品的治理能够采取战术性的变更

迭代开拓能够快速的天生可履行的架构(虽然功能有限),这个架构能够为了应对竞争对手的快速版本宣布轻易的调剂产品使之成为”轻量级的“或者“改进的”版本。

它使重用加倍轻易

识别在迭代中进行的部分设计和实现的公用部分要比在计划时代找出公用部分加倍轻易。在早期开拓中的设计评审容许架构师们发明潜在的可重用的时机,并且使用这个时机为接下来的迭代开拓成熟的公用代码。

你能够在每一个迭代中发明并更正缺陷

这会天生壮实的架构和高质量的利用。你以致能够在早期的迭代中而不是在项目末期的大年夜规模测试阶段发明缺陷。你能够在机能瓶颈没有破坏你的计划之前发明它。

它能够更好的使用项目的职员资本

很多开拓组织应用一种管道式的组织要领来匹配他们的瀑布型开拓措施:阐发职员将被完成的需求发送给设计职员,设计职员将被完成的设计发送给开拓编程职员,编程职员再将他们开拓的组件发送给集成职员,集成职员将组件集成起来发送给测试职员测试。这种多次的通报不仅轻易孕育发生差错而且利用造成误解;这种要领也会使人们感到他们对终极的产品有很少的责任。迭代开拓历程鼓励在项目的各个环节中团队成员介入范围加倍宽广的活动,容许团队成员扮演多种角色。项目经理能够更好的使用可获得的项目职员并其可以打消有风险的通报。

团队成员能够沿着项目的蹊径进行进修

事情在迭代开拓的项目中的开拓职员在软件开拓周期内有很多的时机从他们所范的差错中罗致教训,并能够从一个迭代到另一个迭代的历程中增进他们的技能。经由过程评估每一个迭代,项目经理能够为团队成员发明培训的时机。相反,事情在瀑布型开拓措施中的开拓职员范例的被限定在狭窄的技巧专长上,并且仅仅有时机从事设计、编码或者测试之一方面的事情。

你能够沿着项目的蹊径改进开拓的历程

迭代末真个评估不仅能够从产品或者计划方面揭示项目的状态;他们也可以赞助项目经理阐发鄙人一个迭代中若何改进项目的组织布局和历程。

一些项目经理反抗采纳迭代的开拓措施,将迭代开拓视为一种没有尽头的、弗成控的形式。然而,在 RUP 中,这个项目是能够被很好的节制的。迭代的次数、周期和目标被仔细的计划;并且项目介入者的义务和角色被优越的定义。此外,进展的客不雅量度应该能够被获取。虽然团队要从一个迭代到下一个迭代中重做一些工作,然则这个事情也是可以被仔细的节制的

转化的四个步骤

多半的瀑布型的项目将开拓事情划分为阶段或者时期;我们也可以将这个划分视为向迭代措施转换的第一步。然则为了实现向迭代开拓措施的过渡,我们要应用下面四个步骤来利用不合的历程原则:

尽早的构建功能原型。

划分具体设计、实现和测试阶段到不合的迭代中。

在项目早期基线化一个可履行的架构。

采纳迭代式的和风险驱动的治理历程。

让我们来更进一步的解释每一个步骤。

步骤 1 :尽早的构建功能原型

作为向迭代开拓转换的第一步,在需乞降设计阶段斟酌一个或者更多的功能原型。这些原型的目标是削减主要的技巧风险和澄清项目涉众对系统应该做什么的理解。

经由过程识别最紧张的三个技巧风险和最紧张的三个有需要澄清的功能部分开始。技巧风险大概与新技巧、对全部规划影响很多的未抉择的技巧选择或者你知道的很难满意的技巧需求有关。功能上的风险大概与项目涉众为关键的功能性供给了隐隐的需求或者几个需求对项目系统都是核心的有关。

对付每一个紧张的技巧风险,订定你要原型化什么以削减风险。斟酌一下下面的例子:

技巧风险: 项目必要将一个已存在的利用移植到 IBM WebSphere Application Server 上运行。用户已经开始诉苦利用的机能,并且你所担心的是移植后大概机能会加倍的慢。

原型: 构建一个架构的原型来找出移植你的利用的不合措施。要求一个专家级的 WebSphere 架构师来赞助你。评价结果并编写架构的和设计的指示方针为开拓团队供给什么 应该做和什么 不应该做。这将增添你移植的利用的机能是足够好的以避免在项目后期返工的可能性。

技巧风险: 你正在为安排和预计软件项目构建一个新的利用。你知道对付这个利用和购买的软件的关键区分将是若何能够很好的支持迭代计划。然而,这也是在你的需求阐明中最隐隐的部分之一。

原型: 基于你关于若何支持迭代项目计划的设想构建一个功能原型。经由过程向不合的项目涉中演示原型,你将可以鼓励他们加倍留意项目的计划,并且他们能够奉告你他们对你的哪些设想是附和的、哪些是不附和的。原型将赞助你澄清计划的需求,也能够为你供给关于用户体验和对付你的利用的外表和感到的有用的信息。这个原型以致能够孕育发生一些可重用的代码。

步骤 2 :划分具体设计、实现和测试阶段到不合的迭代中

很多项目团队发明在他们知道项目是真正关于什么的之前划分一个项目成为故意义的迭代是艰苦的。然则,当你已经进入了具体设计阶段时,你平日对需求是什么和系统的架构看起来象什么样子有了很好的理解。这是我们试验迭代开拓的时刻了!

你能够应用两个主要的措施来确定你应该在什么样的迭代中作些什么工作。让我们从正反两方面评论争论一下每一个措施。

措施 1 :同时开拓一个或者多个子系统。让我们假设你有九个子系统,每一个都稀有量日益增添的组件。你可以划分具体设计、实现和测试阶段到三个迭代中,每个迭代瞄准实现九个子系统中的三个。假如在不合的子系统之间存在有限的依附这将事情的相称的好。例如,假如你的九个子系统的每一个都为用户供给优越定义的一系列能力,你可以在第一个迭代中开拓优先级最高的子系统,其次紧张的子系统在第二个迭代中实现,以此类推。这种措施有很大年夜的优点:假如你的进度后进了光阴计划,你仍旧可以交付可运行的具有最紧张能力的部分系统。

然而,假如你有一个分层的体系架构,在上层的子系统依附于底层子系统的能力,这种措施将不能够很好的事情。假如你必须要在一个光阴内构建一个子系统,这样的体系架构将迫使你首先构建底层的子系统,然后构建越来越上层的子系统。然则为了构建在底层子系统的精确的能力,你平日必要在上层的子系统长进行大年夜量的具体设计和实现的事情,由于他们抉择了什么是你在底层子系统中必要的。这孕育发生了 “catch-22”的征象;第二个措施说清楚明了若何办理这个问题。

措施 2 :首先开拓最紧张的场景。假如你应用措施 1 ,你一次只能开拓一个子系统。应用措施 2 ,你将重点放在了紧张的场景上,或者应用系统的关键措施上,然后再添加更多的不是那么紧张的场景。这与措施 1 有什么不合呢?让我们来看一个例子。

假设你正在构建一个新的利用,这个利用将为用户供给治理缺陷的能力。这是一个分层的利用,被构建在 WebSphere Application Server 上,应用 DB2 作为底层的数据库。在首先的迭代中,你开拓了一系列紧张的场景,比如输入一个简单的缺陷。在第二次迭代中,你为这些场景添加了繁杂性 — 例如,你大概使缺陷能够被一个事情流来处置惩罚。在第三次迭代中,你经由过程为非范例的用户供给完备的支持,比如保存部分的缺陷条款然后返回到这个条款中的能力等等。

应用这种措施,你在 所有的迭代中完成 所有的子系统的事情,然则在第一个迭代中你仍旧关注最紧张的场景,而将不是异常紧张的或者最小难度的场景留到着末的迭代中实现。

假如你正事情在一个优越定义的体系架构的系统中时,措施 1 是加倍得当的 — 比如,一个已存在系统的增进或者开拓应用简单体系架构的新利用。多半构建繁杂利用的项目应该应用措施 2 ,然则他们应该以这样的要领来计划迭代,这种措施能够减少后来迭代的范围以增补可能的光阴推延。

步骤 3: 在项目的早期基线化一个可履行的架构

你可以将这个步骤看作是加倍正式和有组织的完成步骤 1 ( 尽早的构建功能原型)的措施。然则什么是“可履行的架构”呢?

可履行的架构是系统的部分的实现,它被构建以演示架构的设计所支持的关键的功能。更紧张的是,它能够证实设计能够满意对付机能、临盆能力、容量靠得住性、可丈量性和其他方面的需求。构建一个可履行的架构容许你在稍后的阶段中在一个坚实的根基上构建所有的系统功能性的能力。这个可履行的架构是一个 进化的原型,它的目的是当系统的架构成熟时,维持已经被证实的特点并包管他们最大年夜可能的满意系统的需求。换句话说,这些特点将是交付系统的一部分。与你在步骤 1中构建的 功能原型比拟,这个进化的原型覆盖了架构问题的所有方面。

天生一个进化的原型意味着你要设计、实现和测试一系统的个框架布局或者架构。在利用的角度上,系统的功能还没有被完成,然则大年夜多半的构建模块之间的接口已经被实现了,你能够(并应该)在某种程度上编译并测试架构。指示初始的负载和机能测试。这个原型也会反应你的关键设计的抉择,包括技巧、主要组件和他们之间接口的选择。

然则你将若作甚这个进化的原型提出系统的架构呢?关键是将重点放在最紧张的百分之二十到三十的用例上(系统为用户供给的完全的办事)。这里是一些抉择什么用例是最紧张的措施。

功能是利用的核心,或者它应用的关键的接口。系统的关键功能应该能够抉择系统的体系架构。平日的环境下架构师经由过程阐发很多因向来识别最紧张的用例:冗余治理策略、资本争夺风险、机能风险和数据安然策略等等。例如,在一个 POS 系统中,反省(Check Out)和支付(Pay)是关键的用例,由于它验证了信用卡确认系统的接口 — 并且它从机能和负载方面也是紧张的。

选择描述了必须被交付功能的用例 。交付不包孕关键功能的利用系统是没故意义的。例如,一个订单输入系统假如不容许用户输入订单将是弗成吸收的。平日,领域和问题专家能够从用户的角度理解被必要的关键功能(主要的行径、峰值数据处置惩罚、关键节制事务等等),并且他们可以赞助定义关键的用例。

选择描述了系统体系架构方面的功能并且没有被其他关键用例所包孕的用例。为了确保你的团队能够将留意力放在所有主要的技巧风险上,他们必须理解系统的每一个区域。以致假如必然的架构领域没有呈现在高风险中,它大概是暗藏了技巧上的难度,这种技巧上的难度仅仅能够经由过程设计、实现和测试架构领域的一些功能才能够被裸露出来。

上面所列出的第一个和着末一个标准是架构师最关心的;项目经理主要关注于前两个。

对付每一个关键的用例,识别最紧张的场景并用他们创建可履行的系统架构。换句话说便是设计、实现和 测试这些场景。

步骤 4 :采纳迭代式的和风险驱动的治理历程

假如你将要遵照上面所描述的步骤 2 和步骤 3 ,那么你将会异常的靠近“抱负”迭代开拓的模型。那么,你接下来的步骤应该是交融步骤 2 和步骤 3 ,并添加支持风险驱动和迭代开拓的治理生命周期。这便是在 RUP 中被描述的迭代开式的生命周期。

RUP 对迭代开拓供给了一个布局化的措施,它将一个项目划分成为四个阶段:初始阶段、细化阶段、构建阶段和转换阶段。每一个阶段包孕了一个或者更多的迭代,每个迭代都关注于孕育发生需要的技巧上的可交付物以实现阶段的营业目标。团队经历的迭代次数与必要实现阶段的目标的数量是一样的,而不是更多。假如在团队计划的迭代次数内他们没有成功的实现这些目标,他们必须为那个阶段添加额外的迭代 — 并且推迟项目。为了避免这种工作发生,你必然要严格的将你的精力集中在每个阶段你必要实现的营业目标上。例如,在初始阶段将精力过于集中在需求上将会成生相反的效果。下面是范例的阶段目标的简要描述。

初始阶段: 经由过程得到对所有需求的高层次的理解和确立系统的范围来建立对系统将要构建什么的优越理解。削减多半的营业风险,为构建系统孕育发生营业用例,并从所有项目决策人获得是否继承项目切实着实认。

细化阶段: 关心多半最具技巧难度的义务:设计、实现、测试和基线化一个可履行的系统架构,包括子系统、他们的接口、关键组件和架构上的机制(例如,若何处置惩罚进程间通讯或者持久性问题)。经由过程实现和验证明际的代码,处置惩罚主要的技巧义务,比如资本争夺风险、机能风险和数据安然风险。

构建阶段: 当你从一个可履行的系统架构迁移到系统的第一个可操作的版本时,必要完成大年夜半的实现事情。支配数个内部和 alpha 版本以确保系统是可用的并且能够满意用户的必要。经由过程支配一个完全功能的系统 beta 版原先停止这个阶段,包括安装、支持文档和培训材料;然而,要记着功能、机能和系统总的质量将很可能必要调剂。

转换阶段: 确保软件能够满意软件用户的必要。这个包括在系统宣布的筹备中测试产品,并且基于用户的反馈对系统进行小的调剂。在软件开拓周期的这个点上,用户反馈应该主要的关注在微调产品和设置设置设备摆设摆设、安装以及可用性的问题上;所有主要的布局问题已经在项目周期的早期被办理了。

利用这些步骤的多种措施

在本文中,我们已经描述了你若何能够应用四个步骤慢慢的从瀑布型的开拓措施转换到增量的迭代开拓措施。每一个步骤都以最小的中断为你的开拓事情添加了切实的代价。一些团队每次不止应用一个步骤;其他的团队可能在一个步骤上运作了几个项目,然后才履行下一个步骤。然而,你应该选择应用这种明智的实施措施,由于它能够赞助你在开拓组织中削减因为历程变更所带来的风险。

您可能还会对下面的文章感兴趣: