迭代开发(Iterative development)是一种产品开发的生命周期模型,它和单次遍历串行(single-pass sequential)的、文档驱动的(document-driven)的瀑布模型(waterfall mode)相对应。在迭代模型中,软件生命周期被分成多个迭代,渐增的开发需求。每个迭代由若干活动组成,如需求分析、设计、编码和测试,但这些活动不是串行的,而是并行的开展,迭代不是若干个小瀑布的迭加。每次迭代之后将产生一个迭代版本(iteration release),这是一个部分完成的系统,但它是稳定的、完整的和被测试过的。最终的迭代版本是全部完成的产品,可以向市场或者客户进行发布。因为每次迭代总有新功能的增加,也就是递增开发(Incremental development),所以,通过迭代使系统增长的方式称为迭代递增开发(Iterative and Incremental development,IID),通常简称为迭代开发。

IID是所有敏捷方法的核心,但作为一个不同的软件过程概念,IID比敏捷要早很多。早期的IID的踪影可见于1930s Walter Shewhart的质量改进PDSA(plan-do-study-act)循环,并在1950s的X15(超音速喷气式飞机)项目上得到成功应用。虽然这不是一个软件项目,但这个项目的成员构成了NASA(美国国家航空和宇宙航行局)的Mercury软件项目(1961~1963)的种子队伍,这个项目在软件开发上应用了IID。在1970s和1980s,IID非常普遍,使用IID方法的项目成百上千。

为什么瀑布型后来被广泛倡导?这始于Winston Royce 1970年的文章《管理大型软件系统的开发》。虽然论文中,作者建议的也不是单遍流程,而是做“两遍”,但误解从此产生。由于瀑布型易于解释和记忆,管理上也很简单,所以很快传播起来。美国军方1985年6月推出的2167标准采纳了瀑布模型,而没有采纳IID模型,一部分原因是受到了1521B标准的影响。很快2167标准成为了其他标准的母版,并且影响了其他政府的标准。虽然美国军方意识到了问题的所在,在1988年2月发布了亲IID的2167A标准,在1994年12月发布了基于IID模型498标准,但其他政府和标准化组织的动作要慢的多。

所以并不是XP和Scrum(XP和Scrum是当前最流行的敏捷开发实践)创造了迭代方法。早期的IID方法(如Evo和UP)并不具有很强的敏捷性(agility)。虽然可以创造一个非敏捷的迭代模型的开发流程,但实践中没有人这么做,所以现在的迭代开发方法都是敏捷的开发方法,只是其敏捷的程度可能有所不同。基于此,敏捷&迭代有时候会连到一起用,有时候会混用。(“迭代”有两个含义,一个是迭代递增开发方法IID(又分为古老的方法和现代的方法),一个是迭代生命周期模型,这是容易导致人们迷惑的原因)