开发模型的理解(瀑布、迭代、敏捷)

首先,不管采用何种开发模型。软件开发都至少具有以下的周期,包括:

  1. 需求获取/分析(系统分析、软件分析)
  2. 设计
  3. 实现
  4. 测试
  5. 发布(运行)
  6. 维护

既然所有的开发模型都具有相同的开发周期,那不同的开发模型的差别从哪里体现呢?或者说不同的开发模型在指导开发过程中的差异点在哪里?

我理解的差别点主要体现在:

  1. 每个周期活动的工作上限
  2. 每个周期被重复的次数
  3. 周期活动被重复的时机
  4. 对软件开发活动的指导范围

按照上面的理解,看一下常用的开发模型:

瀑布模型:期望整个系统从开始到结束都是一个整体,所有的周期活动只进行一次。也就是只做一次需求获取(一次就获取到所有的需求),一次需求分析(一次将所有的需求分析完整),一次设计等等。

增量模型:增量模型将整个系统结构化的拆成几个增量(功能模块)-- 比如3个,每一个完整的周期完成一个增量,有几个增量就重复几个周期。

演化模型:演化模型属于迭代开发。演化开发不需要(或者无法)在一开始确定所有的需求。所以先开发一个相对精简的原型并上线(这中间采用瀑布模型),然后在根据各种需求来源确定下一个迭代需求,在重复瀑布模型完成下一次迭代。

螺旋模型:螺旋模型属于演化开发(也属于迭代开发)。螺旋模型结合了演化开发的迭代和瀑布模型的系统性和监控。最大的特点就是引入了其它模型不具备的风险分析。在每一个迭代里,当确定了目标、方案和限制条件以后,进入风险评估阶段(识别并消除风险)。如果有不确定的风险,则需要进一步工作以将所有风险都确定。风险过大甚至会终止项目。当风险识别完成并有确定的风险消除方案以后,就继续采用瀑布模型完成一次迭代开发。在多次迭代以后,达成所期望的戏疼。

喷泉模型:喷泉模型体现了软件开发的无边界性(每个阶段之间没有清晰的边界)和反复性。就像喷泉水喷出又落下。开发的阶段也是这样,可能从某个阶段回落到之前的任何一个阶段(比如,从测试回到需求获取)。PS:感觉像边改边做模型

边改边做模型:边改边做模型属于软件开发的奔放模型(也是软件开发最容易成为的模型)。边做边改模型下的软件开发没有固定的、明确的周期和阶段。当任何一个想法的出现(都还不能说是需求),就开始做设计(需求分析被无意识的融入到了设计和开发甚至是测试环节)。等产出30版以后在选择第一版开始开发。开发到一半决定在加点灵感(可能推翻了之前做的功能)甚至是决定采用第二版。反复的重新设计、重新开发以后,终于开发了一半,发现资源/时间不够,于是被告知明天必须上线。最终延期半年上线以后发现bug一堆(系统功能组合bug、设计bug、开发bug等),开始进入边甩锅边修bug的阶段(很可能项目开发一半就夭折了)。

迭代开发:在迭代开发中,将系统的开发工作划分成一个个迭代,不要求一次行完成整个系统的开发(相对于瀑布开发而言)。迭代开发目前有两种,一种是在每个迭代中使用瀑布模型。另一种是每一个迭代中完成软件开发阶段的某一个阶段。前一种好理解。在后面这种迭代模型中,每个迭代开始的时候只需要确定当前迭代的需求就可以开始迭代。如迭代0完成迭代1的需求获取以及架构设计,开发、测试等的准备工作,迭代1完成迭代2的需求获取和迭代1的设计,迭代2完成迭代3的需求和迭代2的设计和迭代1的开发,迭代3完成迭代4的需求、迭代3的设计、迭代2的开发和迭代1的测试。此时,迭代1可以发布了。后续每一个迭代都可以做一次发布。这样持续循环。

敏捷开发:如果只是从开发的核心阶段来看,敏捷开发就是迭代开发。然而实际上迭代开发是敏捷开发的一部分,指导开发阶段的那一部分。敏捷开发还包括了迭代开发不包含的:开卡、结卡、TDD、Pair programming、review、feedback等等实践活动。敏捷开发在迭代开发的基础上,通过引入一些活动来达到团队自循环、自我完善,从而对团队本身进行迭代,以提高团队的开发效率、质量、体验等。


个人理解,欢迎讨论。

编辑于 2022-01-03 14:30