2024-01-16 08:37来源:m.sf1369.com作者:宇宇
增量是完善,迭代可理解为翻新。
周期
很多人简单的把迭代理解为开发的分阶段进行。有些项目经理会这样说:我们打算通过4次迭代完成软件的开发,第一次迭代,完成需求分析和软件设计,第二次迭代,完成多少多少模块的开发,第三次,完成其他多少模块的开发,第四次,配置,部署,上线,测试,修正软件bug。在这里,虽然他们言必称“迭代”,但是这样的迭代和过去传统的瀑布型开发有多少区别?
迭代开发是要分周期分阶段地进行,但是不能认为简单地把开发周期划分为几个不同的阶段就是迭代。
很多人对于迭代周期有一些误解,比如:
认为迭代只适用于开发阶段,而需求分析和设计工作则不在此范围内。
认为迭代周期可以拉得很长,比如两个月,三个月,甚至一个季度,半年。
将需求分析,设计,开发,测试,部署,用户反馈,修改当作完整的迭代周期,并要求在前一阶段工作完全(或者大部分)完成以后再进行下一步工作(迭代)。
在一个迭代周期内,我们可以做什么事情呢?可以说:所有的事情。如果你认为迭代需要在需求分析完成之后才能开始,或者系统集成必须在所有迭代完成之后才可以进行,你会获得一个真正的瀑布流程开发。
一个迭代周期意味着对一些特定功能(用例)的探索。“探索”一词可能随情况不同而有不同的含义。对于抽象级别较高,模糊程度比较高的用例,我们需要通过和用户的讨论将它逐渐分解为更加清楚和清晰的用例。对于目前我们认为已经得到了详细定义的需求,需要选取合适的部分进行设计和实现,通过这些部分的实现,对需求定义和技术可行性进行反馈。对那些在上次迭代中已经开发完的模块,应该尽可能快速地让用户提出他们的意见,以便了解是否真正解决了用户面临的问题,以及还有没有可以改进的方面,再根据这些意见安排下一阶段的工作。
我们是否可以在开发进行之前把需求或者设计全部弄清楚呢?我认为很难。因为通常来讲,用户对于自己的需求只有一个模糊的概念。让我们假设一个饮食业的例子,有一天餐厅经理把你叫入办公室说:马上设计一个新的菜谱,这个菜谱是为某某特定人群定制的,你要让这些人感觉色香味俱全。不过在你把配料和烹调方法都设计出来之前,我们不打算让大厨来具体做这道菜,我们不允许失败,所以你的设计一定要一次成功,你可以用调查问卷,用户面谈等方法获取最终用户的需求,但是记住:你不能去做这道菜。
这样的事情你可能会觉得很滑稽,但是在软件业,类似的事情人们却认为是天经地义的。
迭代允许我们将开发本身也作为需求探索的一部分,通过用户对已经实现功能的反馈我们和用户都会逐渐明白什么样的软件是我们最终想要开发的。所以,不要等到所有(或者大部分)的分析完了才开始开发,而是尽早对已经捕获到的需求进行细化,尽早开发,以获得反馈。
在安排迭代计划时,应该指明,这次迭代的目标是什么,在结束时应达到的里程碑是什么。如果有任务提前达到了这个里程碑,我们可以提前结束迭代,或者顺便在剩下的时间内安排其他的任务,但是要注意这种安排的合理性,不要因为这个而使得迭代周期被延长。
在一次迭代到达所设定的结束日期时,就必须审视各项任务是否达到了里程碑的要求,如果有任务没有达到,原因是什么,我们是否需要对需求和技术方案做出调整。对于没有达到里程碑要求的任务,我们可以采取的办法有两种:
将剩余的工作列入下一次迭代计划中去,
将本次迭代的结束时间向后延迟,等待任务的完成
前一种办法适合于有很大工作量没有完成的情况,这可能也同时说明计划的制定有问题,在制定下次迭代计划时应该考虑对任务完成时间进行调整。后一种办法适合剩余工作量不是很大的情况。
通常来说,一次迭代完成以后应该有一个产品的新版本可用。这也就意味着:将集成和发布分散到每次迭代中去。借助于一些自动化工具(比如ant),我们甚至可以做到每日构建。
一个迭代周期应该有多长呢?这并没有一个统一的说法,而是应该视目标和可用的资源而定。但是,迭代周期不宜过长,也不宜过短。迭代周期过长的话,会延缓反馈的时间,可能将许多问题隐藏或是堆积了起来。迭代周期过短,会让人身心疲劳,事情难有大的成效。一般来说,迭代周期应该在2-6周之间。如果安排的迭代周期超过了两个月,你可能就必须审视一下迭代计划的合理性了。
不要认为下一次迭代应该和上次迭代的时间差不多,刻板地把所有迭代规定一个统一的时间是一个很坏的做法。但是你可以把以前迭代周期中的工作效率作为估算下次迭代时间的一个依据。
目标
一次迭代必须有明确的目标:我们希望通过这次迭代达到什么目的。在制定目标时,应该同时考虑另外一个问题:如何检查该目标是否已经达成。这就是所谓的“里程碑”。
迭代计划必须有明确而可行的目标。明确的意思是它应该是可度量的,不能太模糊,因为你很难检查一个模糊的目标是否达成。比如,我们可以说,这次迭代的目标是对xxx方面的需求作进一步细化和评审,完成xxx模块的开发以加入到软件的下一版本中去。这样的目标是明确而且可行的。反过来,如果我们这样说:我们要通过和用户的讨论明确绝大部分愿景,同时要有一个初步的开发。“绝大部分”和“初步”这样的词让人感到困惑:多少是绝大部分呢,在总量尚未明确的前提下,怎么能够知道完成的确是“绝大部分”而不是“一小部分”?“初步的开发”似乎告诉我们这次开发量比较小,但是具体开发哪个部分,或者开发到什么程度,并没有指出一个明确的概念。
由此产生了一个困惑,软件项目是一个不断探索的过程,我们怎么能够明确地对未来的事情作安排呢?譬如在项目初始调查用户愿景时,为了实现“明确”的目标,是否这样定义任务:完成20%的用户愿景调查?
很显然,用户愿景总量到底有多少我们并不知道,所以在这次迭代完成以后如果我们问:是否真的完成了20%而不是15%?很难得到答案。
为了避免出现这种情况,你必须换个角度来看问题,比如我们可以说:对xxx部门和yyy部门的用户做愿景调查。在迭代完成后,可以检查是否这两个部门所有用户的访谈,调查都已经完成,是否这些部门每个人都认为自己表达了全部的意思。