作为在20世纪70年代、80年代盛极一时的软件开发模型,瀑布模型通过制定计划、需求分析、软件设计、程序编写、软件测试、运行维护等6个流程将整个软件生命周期衔接起来。这6个流程有着严格的先后次序之分,只有当前面的流程结束之后,下一个流程才能开始运转。这种自上而下的流程像极了瀑布的下落,因此得名瀑布模型。

 

我们可以发现,瀑布模型有很多优点:

  1. 有明确的交接点:不论是制定计划还是需求分析,甚至是软件测试,都有明确的起始点及开发流程——也就是在上一流程结束后再开始下一个流程;
  2. 责任明确:开发人员都各司其职,协作流程合理清晰;
  3. 发生问题能准确溯源:在开发过程中,如果发现有环节遗漏,负责人能够准确定位问题根源,并找出最优解决方案;
  4. 流程划分清晰:由于开发流程是环环相接,因此不会出现多个环节同时作业的情况;
  5. 及时反馈:在每个流程结束前都要对该流程完成的内容进行审核,以便及早发现软件开发过程中的错误,及时纠错。

但随着软件行业的快速发展,瀑布模型也逐渐暴露出许多缺点:

  1. 反馈结果单一:由于瀑布模型的反馈形式只针对于目前完成的阶段,无法对整个流程进行宏观反馈,因此各交接点处的反馈结果从整体来讲并不准确;
  2. 客户不参与开发过程:首先,客户在最初提出需求后,便不再被允许参与到开发流程之中,除非提出新的需求。其次,客户只能在开发过程的后期看到成果;
  3. 新需求的增加会打乱整个发布节奏:前文也说到瀑布模型有着严格的先后次序之分,只有前一个阶段完成后,才能进入下一阶段。因此在整个流程中,新需求的增加会导致当前任务停工,并返回需求分析、软件设计等阶段,且后面的流程都需要重新进行;
  4. 造成人力资源浪费:瀑布模型要求流程是环环相接的,因此软件开发还停留在前一阶段时,后面流程的人都处于无可事事的状态。又因为瀑布式开发中要求人员各司其职,因此当某一阶段缺人手时,只能延长时间,导致有些人工作量过于饱和,有些人又过于清闲;
  5. 周期长,不适合急需交付的项目:这一软件开发模式各阶段呈现按部就班的状态,因此不适合急需交付的项目;
  6. 标准化模式导 致流程僵化、死板:管理人员通过规定各阶段完成时间以及交接点来控制过程状态,这种标准化模式不加一点变通,最终导致流程的僵化、死板。

网络的逐渐普及要求软件开发更能贴近人们的日常使用,也在这时,瀑布式开发受到逐渐兴起的“敏捷开发”的冲击。

 

2001年,十七位关于敏捷方法的发起者和实践者聚集到一起,发表了“敏捷软件开发宣言”。他们强调敏捷开发能够以一种更加简洁、可持续、短周期、高效率的方式进行软件开发,同时希望以敏捷联盟为形式的合作可以帮助到行业中的其他人,帮助他们以更加敏捷的新方式来思考软件开发、方法论以及组织架构。
敏捷开发强调:

  • 个体和互动高于流程和工具
  • 工作的软件高于详尽的文档
  • 客户合作高于合同谈判
  • 响应变化高于遵循计划

简单来讲,敏捷开发采用“迭代开发”,将软件项目需求分成多个迭代,且每个迭代成果在完成开发、测试、反馈等环节后都可以进行交付。也就是说,在将软件交付到客户手中之前,开发过程中的任何经过测试的子项目都能够独立运行。

敏捷开发成功地弥补了瀑布式开发的不足,有很大的优势:

  1. 强调“响应变化”:在做出开发计划后,计划并不是需要唯一遵循的指南。开发过程会因客户需求的改变而出现改变,这时就需要产品经理不断更新产品需求,开发团队中的成员主动配合,使迭代过程可以根据需求变化灵活调整;
  2. 使资源利用最大化:瀑布式开发要求每个人各司其职,但敏捷开发要求大家能够互相信任、互相帮助,合作开发。在某一位置出现空缺时,其他人可以暂时代工,这一现象有效地使资源利用效率最大化;
  3. 反馈及时:与瀑布式开发在整个生命周期后期才能得到反馈的状态相比,敏捷开发在每个迭代后都能交付可独立运行的成果。不论是团队对迭代成果进行测试,还是从客户那里,都能得到及时的反馈;
  4. 短周期:每一个迭代就是一个周期,因此交付成果的效率得到显著提高;
  5. 客户参与:在每个迭代结束后都能将迭代的成果交付到客户手中,客户可以及时跟踪到最新的产品状态,且参与到产品开发中去。

与此同时,也有一些相应的缺点表现了出来:

  1. 忽视文档的重要性:敏捷开发认为工作的软件高于详尽的文档,在注重成员之间沟通的同时,过于忽视文档的重要性,这会在团队中增添新人时产生一些不必要的、繁琐的沟通环节;
  2. 开发成本:由于敏捷开发是迭代式开发,在每个迭代中都有一个小型的、完整的开发流程,因此开发成本高;
  3. 需求分析失误:在需求分析阶段,一旦需求分析出现问题,会导致接下来的工作及开发流程都会出现方向上的偏差。

敏捷开发极大地提高了软件开发的速度,但它注重的是软件的开发阶段,并未兼顾到运维阶段。在开发人员与运维人员进行交接的时候,并没有体现出敏捷的价值、原则,因此开发与运维之间仍缺乏一些必要的协作效率。这时DevOps就应运而生,DevOps促进开发、运维、测试之间的高效协同,从而做到用持续软件交付来修复并能够更快地解决问题:

  1. 促进跨职能部门的高效协作:在整个软件开发的生命周期中进行持续开发、持续测试、持续集成、持续部署以及持续监控,解决了开发、运维、测试之间的协作效率不高问题;
  2. 范围更广:不只局限于开发流程,而是集开发、运维、测试于一体,范围扩大到软件的完整生命周期;
  3. 流程自动化:将工作流程自动化,例如:可以通过自动化测试系统来识别代码中的错误或漏洞,确保功能不会出现缺陷或漏洞;
  4. 更具安全性:通过自动化测试来持续地检测交付产品的质量以及可交付标准,或者通过持续监控使产品更具安全性;
  5. 周期短:DevOps可以在较短的周期内开发出高质量软件。

在软件生命周期中,不论是瀑布模型还是现如今各大公司都在积极转型的敏捷开发和DevOps,都是在软件行业不断发展中产生的,迎合了行业发展的需求。而在转型的过程中,不论是敏捷还是DevOps都是困难重重,一不小心就会遇到很多的反模式,这就要求公司内部各团队不能只是形式主义,而是大胆地迈开步子,走好第一步。

软件开发流变史:从瀑布开发到敏捷开发再到DevOps的更多相关文章

  1. 敏捷开发 与 Scrum

    敏捷开发以用户的需求进化为核心,采用迭代.循序渐进的方法进行软件开发.在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视.可集成和可运行使用的特征.换言之,就是把 ...

  2. IT168关于敏捷开发采访

    1.我们知道敏捷开发是一套流程和方法的持续改进,通过快速迭代的方式交付产品,从而控制和降低成本.但是在实行敏捷初期,往往看不到很好的效果.这里面,您觉得问题主要出在哪?团队应如何去解决问题?金根:我认 ...

  3. Scrum敏捷开发沉思录

    计算机科学的诞生,是世人为了用数字手段解决实际生活中的问题.随着时代的发展,技术的进步,人们对于现实世界中的问题理解越来越深刻,描述也越来越抽象,于是对计算机软件的需求也越来越高,越来越复杂,变化也越 ...

  4. 敏捷开发与Scrum

    敏捷开发以用户的需求进化为核心,采用迭代.循序渐进的方法进行软件开发.在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视.可集成和可运行使用的特征.换言之,就是把 ...

  5. SCRUM敏捷开发规则一栏

    敏捷.敏捷开发这类词近期非常火!敏捷开发,就是指可以在需求迅速变化的情况下高速开发软件.我们接触最多的和敏捷相关的名词是:极限编程(XP).结对编程.測试驱动开发(TDD)等. 敏捷建模(Agile ...

  6. 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...

  7. Agile Software Development ——敏捷开发

    敏捷? 过去几年中,软件行业中出现了一个新词汇——agile:与此同时,一个关于新的软件开发方式的变革正悄然兴起. 在老师的引导下,我阅读了Agile Guide网站上的几篇文章,并查阅了相关资料.不 ...

  8. 敏捷开发之道(二)极限编程XP

    上次的博文敏捷开发之道(一)敏捷开发宣言中,我们介绍了一下敏捷开发宣言,在其中,我们了解到了关于敏捷开发的几个重要的价值观.今天我们来了解一个敏捷开发的方法--极限编程XP 1.介绍 极限编程(eXt ...

  9. Scrum敏捷开发简介

    Agile 敏捷开发实践中,强调团队的自我管理.在 Scrum 中,自我团队管理体现在每天的 Scrum 会议中和日常的协同工作,在每天的 Scrum 例会中,团队成员一般回答一下几个问题 : 昨天完 ...

随机推荐

  1. Android Studio--家庭记账本(五)

    想到每次删除之后将表单自动初始化,却发现会导致除去已经删除的不在出现在表单上,数据库中剩余的数据还会再次出现在表单中.导致表单上的数据越来越多.后来又想到,当我实现删除之后,把表单采用全部清除,再重新 ...

  2. 使用HttpClient 发送 GET、POST(FormData、Raw)、PUT、Delete请求及文件上传

    httpclient4.3.6 package org.caeit.cloud.dev.util; import java.io.File; import java.io.IOException; i ...

  3. klassVtable与klassItable

    klassVtable与klassItable类用来实现Java方法的多态,也可以叫动态绑定,是指在应用执行期间通过判断接受对象的实际类型,根据实际类型调用对应的方法.C++为了实现多态,在对象中嵌入 ...

  4. Linux Docker部署

    Docker 安装 卸载旧版docker yum remove docker \ docker-client \ docker-client-latest \ docker-common \ dock ...

  5. C# 8.0 的新特性概览和讲解

    本文转自 https://blog.csdn.net/hez2010/article/details/84036742 C# 8.0 的新特性概览和讲解 前言 新的改变 可空引用类型(Nullable ...

  6. .Net 桌面程序(winform,wpf,跨平台avalonia)打安装包部署到windows 入门

    .Net 桌面程序(winform,wpf,跨平台avalonia)部署到windows 入门 本文以为avalonia为例,用Setup Factory 将.Net桌面程序(winform,wpf, ...

  7. Homekit_二路继电器

    介绍一款二路继电器,使用Homekit进行控制,有兴趣的可以去以下链接看看: https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-11265006 ...

  8. 轻量级Java EE企业应用实战:Struts2+Spring5+Hibernate5/JPA2

    轻量级Java EE企业应用实战(第5版)——Struts 2+Spring 5+Hibernate 5/JPA 2整合开发是<轻量级Java EE企业应用实战>的第5版,这一版保持了前几 ...

  9. 朋友国企干了5年java,居然不知道Dubbo是做什么呢?我真信了

    点赞再看,养成习惯,微信搜一搜[三太子敖丙]关注这个喜欢写情怀的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系 ...

  10. 使用IDEA新建基于SpringBoot的Web项目(超详细)

    目前java的开发很多Learner都慢慢的学习使用IDEA这款工具,个人觉得其实相比Eclipse来说差不多,个人习惯的问题,但是我还是推荐IDEA这款工具.虽然它目前是收费的,但相信网上的各种破解 ...