2.1 软件开发模型

软件开发模型是指软件开发全部过程、活动和任务的结构框架。软件开发包括需求、设计、编码和测试等阶段,有时也包括维护阶段。软件开发模型能清晰、直观地表达软件开发全过程,明确规定了要完成的主要活动和任务,用来作为软件项目工作的基础。

典型的开发模型有:瀑布模型(waterfall model)、增量模型(incremental model)、迭代模型(iterative model)等。

2.1.1 瀑布模型

1970年温斯顿·罗伊斯提出了著名的“瀑布模型”,直到80年代早期,它一直是被广泛采用的软件开发模型。

瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。

在瀑布模型中,软件开发的各项活动严格按照线性方式进行,当前活动接受上一项活动的工作结果,实施完成所需的工作内容。当前活动的工作结果需要进行验证,如果验证通过,则该结果作为下一项活动的输入,继续进行下一项活动,否则返回修改。

瀑布模型强调文档的作用,并要求每个阶段都要仔细验证。但是,这种模型的线性过程太理想化,已不再适合现代的软件开发模式,其主要问题在于:

  • 各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量;
  • 由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发的风险;
  • 早期的错误可能要等到开发后期的测试阶段才能发现,进而带来严重的后果。

2.1.2 增量模型

与建造大厦相同,软件也是一步一步建造起来的。在增量模型中,软件被作为一系列的增量构件来设计、实现、集成和测试,每一个模块(Module)是由多个相互作用的,提供特定功能的组件(Unit)构成。

在使用增量模型时,第一个增量往往是实现基本需求的核心产品。核心产品交付用户使用后,经过评价形成下一个增量的开发计划,它包括对核心产品的修改和一些新功能的发布。这个过程在每个增量发布后不断重复,直到产生最终的完整产品。整个产品被分解成若干个模块,开发人员逐个模块地交付产品,这样做的好处是软件开发可以较好地适应变化,客户可以不断地看到所开发的软件,从而降低开发风险。

但是,增量模型也存在以下缺陷:

  • 由于各个模块是逐渐并入已有的软件体系结构中的,所以加入模块必须不破坏已构造好的系统部分,这需要软件具备开放式的体系结构。

  • 在开发过程中,需求的变化是不可避免的。增量模型的灵活性可以使其适应这种变化的能力大大优于瀑布模型和快速原型模型,但也很容易退化为边做边改模型,从而使软件过程的控制失去整体性。

2.1.3 敏捷开发-迭代模型

敏捷实际上并不是一个方法论,更多是一种思想,一种理念。敏捷强调在软件研发过程中持续地根据用户反馈的需求和需求的优先级来发布新版本,不断进行迭代,让产品逐渐完善。

敏捷开发是以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。软件产品会拆分成多个相互联系且允许独立运行的小产品/子模块,分别独立完成且定期集成,在整个研发过程中保证软件产品始终处于可使用状态。

增量与迭代对比

增量开发并没有真正降低向客户交付不适合的东西的风险,大局只出现在最后。由于增量是详细完成的,因此当一个增量需要返工时会浪费很多精力。而迭代开发提供了从一开始就看到项目交付产品的机会,并指导开发步骤的全貌。使开发者可以更容易地改变产品。两者结合互补的开发模型将更好的利用两种模型的优点。