首先,不管采用何种开发模型。软件开发都至少具有以下的周期,包括:
既然所有的开发模型都具有相同的开发周期,那不同的开发模型的差别从哪里体现呢?或者说不同的开发模型在指导开发过程中的差异点在哪里?
我理解的差别点主要体现在:
按照上面的理解,看一下常用的开发模型:
下面重点讲一下瀑布模型、增加模型、迭代开发、敏捷开发。
也可以看成是软件的生命周期模型。
主要阶段直接映射基本的开发活动:
主要问题在于它将项目生硬地分解成这些清晰的阶段。因此只有在对需求了解得好,而且在系统开发过程中不太可能发生重大改变的时候,适合使用瀑布模型。
思想是先开发出一个初始的实现,给用户使用并听取用户的使用意见和建议,通过对多个版本的不断修改直到产生一个充分的系统。描述、开发和有效性验证等活动不是分离的而是交织在一起。同时让这些活动之间都能得到快速的反馈信息传递。
增量式开发反映了我们解决问题的方法,系统的每一个增量或版本包括用户需要的一部分功能。通常,系统的早期增量包括最重要或最紧急的功能需求。这就意味着在早期开发阶段,用户可以相对早地评估系统,看它是否满足需要。若不满足需要,就只需要改变当前的增量即可,又或许有新的功能被发现并为下个增量做准备,因此可以大幅度地减少成本。
降低了适应用户需求变更的成本。重新分析和修改文档的工作量较之瀑布模型要少很多。
过程不可见。管理者需要通过经常性的可交付文档来把握进度,若系统开发速度太快,要产生反映系统每个版本的文档就很不划算。
伴随着新的增量的添加,系统结构在逐渐退化。除非投入时间和金钱用在重构系统结构上以改善软件,否则定期的变更会损坏系统的结构。随着时间的推移,越往后变更系统越困难,而且成本也将逐渐上升。
那么什么是"迭代开发"呢?迭代的英文是 iterative,直译为"重复",迭代开发其实就是"重复开发"。
迭代开发将一个大任务,分解成多次连续的开发,本质就是逐步改进。所以他的定义就是:
在迭代开发中, 整个工作被划分为一系列袖珍的、固定时间的小项目,这叫系列迭代,即是迭代开发。
早在20世纪50年代末期,软件领域中就出现了迭代模型。
最早的迭代过程可能被描述为“分段模型(stagewise model)”。迭代模型是RUP推荐的周期模型。被定义为:迭代包括产生产品发布(稳定、可执行的产品版本)的全部开发活动和要使用该发布必需的所有其他外围元素。
在某种程度上,开发迭代是一次完整地经过所有工作流程的过程:需求分析、设计、实施和测试工作流程。
实质上,它类似小型的瀑布式项目。
RUP认为,所有的阶段都可以细分为迭代,每一次的迭代都会产生一个可以发布的产品,这个产品是最终产品的一个子集。
迭代开发本身是一种有计划的修改策略:通过多次开发来改善正在构建的特性,逐步得出一个完善的解决方案。例如,对一个知之甚少的产品,开始时可以先创建原型以获得重要知识,接着可以创建一个更好一点的修订版,再接下来是一个相当好的版本。例如,在文章写作过程中,我在收到反馈以及对如何表达主题有了更深刻的理解后,把每章都修改了几次。
增量开发:
迭代开发:
迭代开发只是要求将开发分成多个迭代,并没有回答一个重要的问题:怎么划分迭代,哪个任务在这个迭代,哪个任务在下个迭代?这时,一般采用"增量开发"(incremental development)划分迭代。
所谓"增量开发",指的是软件的每个版本,都会新增一个用户可以感知的完整功能。也就是说,按照新增功能来划分迭代。
敏捷开发(agile development)是非常流行的软件开发方法。据统计,2018年90%的软件开发采用敏捷开发。
敏捷开发的核心是迭代开发(iterative development)。敏捷一定是采用迭代开发的方式。
敏捷开发是总体概念,而迭代式开发是实践敏捷开发概念的一个手段。敏捷开发除迭代式开发外,还包含了其他许多管理与工程技术实践,如演进式架构设计、敏捷建模、重构、自动回归测试(ART)。综上,敏捷开发与迭代开发是整体与局部的关系,前者是家族,而后者是家族成员。 虽然敏捷和迭代不一样,但是它们也是分不开的,二者的有机结合,既能保证产品质量又可保持在项目持续改进过程中的优势。吸取精华,破其糟粕,只有这样,项目才会趋于完美。
增量开发加上迭代开发,才算真正的敏捷开发。
敏捷开发是以用户的需求为核心,采用迭代、循序渐进的方式开发软件。
敏捷开发的第一个好处,就是早期交付,从而大大降低成本。
还是以上一节的房产公司为例,如果按照传统的"瀑布开发模式",先挖10栋楼的地基、再盖骨架、然后架设屋顶,每个阶段都等到前一个阶段完成后开始,可能需要两年才能一次性交付10栋楼。也就是说,如果不考虑预售,该项目必须等到两年后才能回款。
敏捷开发是六个月后交付一号楼,后面每两个月交付一栋楼。因此,半年就能回款10%,后面每个月都会有现金流,资金压力就大大减轻了。
敏捷开发的第二个好处是,及时了解市场需求,降低产品不适用的风险。
请想一想,哪一种情况损失比较小:10栋楼都造好以后,才发现卖不出去,还是造好第一栋楼,就发现卖不出去,从而改进或停建后面9栋楼?
对于软件项目来说,先有一个原型产品,了解市场的接受程度,往往是项目成功的关键。有一本书叫做《梦断代码》,副标题就是"20+个程序员,三年时间,4732个bug,100+万美元,最后失败的故事",这就是没有采用敏捷开发的结果。相反的,Instagram 最初是一个地理位置打卡 App,后来发现用户不怎么在乎地理位置,更喜欢上传照片,就改做照片上传软件,结果成了独角兽。
由于敏捷开发可以不断试错,找出对业务最重要的功能,然后通过迭代,调整软件方向。相比传统方式,大大增加了产品成功的可能性。如果市场需求不确定,或者你对该领域不熟悉,那么敏捷开发几乎是唯一可行的应对方式。
《敏捷软件开发宣言》里面提到四个价值观。
该宣言还提出十二条敏捷开发的原则。
前者是软件的开发周期模型,是一种开发过程;而后者是多种软件开发 项目管理方法的集合,这是两者最根本的区别。与迭代开发对应是瀑布模型、螺旋模型,而与敏捷开发对应的是Scrum,XP(极限编程),Crystal(水晶编程),所以二者不可混为一谈,但其中又有一定的联系。
近些年来,由于一些特定的需求,越来越多的软件团队开始采用敏捷开发模式,但是在开发过程中却对其核心思想理解不足,有些敏捷开发团队甚至没有管理者,仅设一名Scrum Master向产品经理汇报,职责划分也很暧昧。
除了软件公司,在很多常规企业中,敏捷开发已经成为一种无负责人的开发流程。所谓的产品经理与销售、CEO随意加功能、改需求,然后交给开发团队去“敏捷”开发。在开发过程中,需求调研、设计、反馈、代码评审、测试、全不需要。这就是技术大杂烩,能做到哪一步算哪一步,完全忽略了敏捷开发的实质。
而实际上,敏捷开发并不是这样的, 迭代的核心在于软件的超前规划。如果没有专业规划者的全程指导,造出来的软件系统必不合格 -- 时间超限、预算超支、充斥着各种不科学的奇思妙想、根本不管需求是否合乎逻辑。
所以,无论用什么开发思维,不管是哪种开发手段,都要制定合理科学的开发方案,这样才可事半功倍。
对于我们开发者而言,一个长期迭代的项目,软件复用是非常重要。
在大多数的软件项目中,都存在一定程度的软件复用。
主要阶段:
3种类型的软件组件可能用于面向复用的过程:
优势:
软件开发比较经典的过程模型有:
三个模型相互不排斥,而且经常一起使用,尤其是对大型系统的开发。对大型系统,综合瀑布模型和增量开发模型的优点是有意义的。
参考文章:
一文搞定软件过程模型——瀑布模型、增量式开发/增量开发与迭代开发的区别 https://blog.csdn.net/weixin_55267022/article/details/118121466
开发模型的理解(瀑布、迭代、敏捷) https://zhuanlan.zhihu.com/p/452759262
浅谈敏捷开发概念和迭代开发方案 https://www.minjiekaifa.com/agilearticles/agile-development-and-iterative-development-solutions-80369.html
敏捷开发入门教程 https://www.ruanyifeng.com/blog/2019/03/agile-development.html
浅谈敏捷开发概念和迭代开发方案 https://www.minjiekaifa.com/agilearticles/agile-development-and-iterative-development-solutions-80369.html
转载本站文章《开发模型的理解:瀑布模型/增量式/迭代/敏捷开发——笔记》, 请注明出处:https://www.zhoulujun.cn/html/webfront/engineer/Architecture/8935.html