持续交付与敏捷开发的历史

2023-11-05

      软件中的“持续交付”不仅仅是一个热门话题。

 

      软件的持续交付是软件开发实践和客户保留的圣杯,这也是DevOps今天是如此热门的概念的原因。要了解持续交付的重要性,你需要了解敏捷的历史以及敏捷方法的来源。

 

      敏捷软件开发的历史并不是从敏捷宣言开始的。

首次出现危机

      在20世纪90年代初期,随着PC计算机开始在企业中激增,软件开发面临危机。当时,它被广泛称为“应用程序开发危机”或“应用程序交付滞后”。业内专家估计,经过验证的业务需求和实际生产中的实际应用之间的时间大约为三年。

 

      问题是,即使在25年前,企业的迁移速度也比这更快。

      在三年的时间里,需求、系统甚至整个业务都可能发生变化。这意味着许多项目在中途取消,许多已完成的项目并不能满足企业当前的所有需求,即使项目的最初目标已经达到。

 

      在某些行业,滞后时间远远超过三年。在航空航天和国防领域,在一个复杂的系统投入实际使用之前可能需要20年或更长的时间。在一个极端但绝非例外的例子中,1982年开始运营的航天飞机计划使用了20世纪60年代以来的信息和处理技术。高度复杂的硬件和软件系统通常是在数十年的时间范围内设计,开发和部署的。

 

思想领导感到沮丧

 

      上世纪90年代,航空航天工程师乔恩科恩因为这些漫长的交付时间以及早期做出的决定而变得越来越沮丧,该项目后来无法改变。“我们正在寻找更加及时和反应迅速的产品,”他指出,越来越多的人认为必须有更好的软件构建方式。

 

      他是17名软件思想领袖之一。

 

     他们开始非正式会面并讨论如何更简单地开发软件,而没有当时瀑布和其他流行软件工程技术的过程和文档开销。

 

      其他行业也在进行转型。设计一款新车需要六年或更长的时间,而在九十年代,这一时间几乎减半。AT&T已经被打破,所谓的“小贝尔”正在大幅降低手机和服务的成本。

 

      对于那些具有软件开发组件的产品,例如电话交换机,汽车或飞机,软件往往是事后考虑的,主要原因是软件开发直到硬件设计固定到位才开始。但是,当时大多数产品团队并不优先构建软件。

 

敏捷诞生了

 

      2001年初,在犹他州举行了着名的Snowbird会议,这些看似非生产性的软件开发活动受到志同道合的专业人士的共同欢迎。但这并不是这一群软件领导者第一次见面。他们在2000年春天在俄勒冈州的Rogue River Lodge收集了一年前的资料。

 

      这个团队包括Kern,极限编程先驱Kent Beck和Ward Cunningham,Arie van Bennekum,Alistair Cockburn和其他十二位,今天在敏捷社区都很有名。作为一种实践,敏捷并不是最终的目标。实际上,在那个时代之前,“敏捷”尚未用于正式谈话。在那次会议上,“轻”和“轻”这些术语更为常见,但没有一个参与者对这种描述特别满意。

 

      特别是,这些思想领袖想方设法快速构建工作软件并将其交付给最终用户。这种快速交付方式提供了一些重要的好处。首先,它使用户能够更快地获得新软件的部分商业利益。其次,它使软件团队能够迅速反馈软件的范围和方向。

 

快速反馈和改变意愿成为敏捷运动的关键特征。

 

如果软件团队对理解用户需求没有把握,那么它会提供第一个近似值,然后收听反馈。但是在项目开始的时候几乎没有什么可以做的。

对重量级过程的反弹

 

      敏捷决不是批判在20世纪70年代和80年代开发的开发方法,是以回应软件早期经常使用的混乱和无计划的方法。事实上,从1970年到1990年,软件工程的基础理论和实践应运而生。这个想法是将软件工程和物理工程等同起来,并尽可能地从设计和建筑实际中借用。

 

      这种方法表现在已知的瀑布方法中。这种方法明确定义了从需求到部署的应用程序开发生命周期的主要阶段。它被称为“瀑布”,因为团队完成了一步,然后再进入下一步。在继续进行功能设计之前,必须完成要求,在详细设计之前完成功能设计,等等。就像没有上坡的水一样,很少有条件返回到过程的早期阶段。一旦你完成了一个阶段,那个阶段就会被及时冻结。

 

      这种方法给软件开发带来了组织和工程实践的感觉。但是有一个关键的区别。民用或机械工程项目在十年或更长时间内很少发生变化。如果你今天需要设计一座桥梁或一座高层建筑,很可能在一两年内不需要修改细节。

 

      事实上,最初设想的瀑布应该适应项目决策的变化和重新考虑。可以回到前一阶段,调整一些决策和期望,这些改变可能会改变目前阶段的各个方面。但在实践中,时间表和预算几乎总是让人觉得不可能,迫使团队坚持早先的决定。

 

      当时,大多数软件开发团队和大学计算机科学部门都把它作为福音,你花更多的时间计划,花在编写代码上的时间就越少,代码就越好。这只会加强一个流程繁重的方法,比交付工作软件更重视规划和文档。

 

      软件项目很少具有与传统工程项目相同的稳定性。业务需求似乎在一夜之间发生变化,并且肯定比以前完成软件应用所需的几个月或几年更快。回想起来,软件显然需要一种不同的工程方法。

 

      当然,问题的另一个部分是软件设计既是一门科学又是一门艺术,其缺陷和相关的人类局限性。

 

      首先,我们根本不知道如何很好地定义软件。用户可以描述他们的业务工作流程,但是他们无法告诉软件设计师哪些功能会自动化以及这些功能应该如何工作。在开始构建产品之前,我们无法精确定义需要什么,将软件工程与大多数其他工程学科分离开来。

 

      其次,从需求到原来的不完美,规范,从规格到实施的翻译都充满了含糊不清。其中一些来自文字的性质; 如果一个声明可能会被误解,那么它几乎肯定会是。但是,由于团队正在设计层面阅读并将其转化为实施层面,所以必然会出现错误和误解。

 

从业者想要迭代开发

      同时,更具体的迭代方法正在开发中。例如,Jeff Sutherland和Ken Schwaber在20世纪90年代初期构思了Scrum过程。这个词来源于橄榄球,并提到了一个朝着共同目标努力的团队。为了在德克萨斯州奥斯汀的面向对象会议上展示它,他们在1995年编写了Scrum。他们以标题为“SCRUM软件开发过程”的论文形式发布了它。

 

      Scrum的基础是这样一个概念,即对于开发新的复杂产品,当小型自组织团队获得目标而不是具体任务时,会产生最佳结果。团队可以自由决定实现这些目标的最佳方式。Scrum还定义了时间盒迭代开发周期,其目标是提供工作软件。今天,大多数宣称采用敏捷方法的团队都表示他们正在使用Scrum。

 

      大约在同一时间,Kent Beck被聘为克莱斯勒实验软件开发项目的顾问。最终,他被任命为项目负责人,为了取得成功,他决定将最佳实践推向极致,并以XP方法论为名。尽管克莱斯勒收购后该项目最终取消,但贝克出版了一本名为“ 极限编程解释 ”的书,并且他的名字成为了领先的替代方法之一的代名词。

 

      也许各种敏捷和迭代技术仍然是少数派,但它不适用于2001年在Snowbird会议上编写的敏捷宣言(Agile Manifesto)。尽管这个小组的目标不明确,但宣言是与当时仍然普遍存在的瀑布模型相反的方法的最明确和最简洁的目的声明。

 

      因此,软件开发社区已经将敏捷宣言及其12项原则锁定为敏捷软件开发运动的明确声明。今天,越来越多的团队自我认定为使用敏捷方法。尽管这些团队中的很多人可能使用包含若干敏捷方法和瀑布元素的混合模型,但他们完全认同敏捷运动的特征,证明了声明的强度和运动的力量。

 

敏捷、超越

      尽管敏捷将我们带到了现实的位置,但并不是故事的结束。有超越敏捷的生活,虽然敏捷是必要的第一步,看看软件开发可能能够冒险的地方。尽快要求我们的头脑可以看到需要软件更改可能是愚蠢的,但尝试加快速度并不愚蠢。敏捷概念能否促进我们软件的持续有效变革?我们是否可以达到软件“发布”及其所有改进的目标不再是计划的事件,而只是像呼吸一样每天,每小时或每分钟发生一次?

 

      但是他所描述的内容毫无疑问。他对软件向生产发布的趋势进行了表述,并讨论了能够每季度,每月,每周发布新版本以及最终每日甚至连续发布新版本的意义。“如果我们不知道该功能是否正确,”他指出,“我们提供了两个版本,让用户决定。” 正如我们今天可以说的,这是持续交付的一个缩影,或DevOps。

 

      敏捷流程是朝这个方向迈出的必要的第一步,但持续交付需要更大的改变。这意味着开发人员根据他们的最佳知识尝试某些东西,但却完全准备根据用户的反应立即删除或更改它。

 

      用户的反应并不是以言语的形式出现,而是以行动的形式出现。

 

      我们监视生产中的应用程序并收集用户行为的数据。实时分析这些数据可以告诉团队接下来要做什么。接下来发生的事情不会超过一两天。

 

更多资讯和干货关注微信公号:老布谈敏捷

转载于:https://my.oschina.net/u/3867033/blog/1842942

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

持续交付与敏捷开发的历史 的相关文章

  • 中兴EPON OLT-C300开局配置

    一 基础配置 1 自定义时间 clock set hh mm ss Apr 8 2018 con t username zte password zte privilege 15 用户名密码 2 自定义名称 hostname CeShi O
  • js如何进行数组去重?

    1 数组反转 使用 reverse 实现数组反转 const arr 1 2 3 console log arr 1 2 3 arr reverse console log arr 3 2 1 2 数组去重 1 new Set array
  • python学习语法中与c语言不同之处(1)

    一 发现使用打印使用的是print 而在C语言中我们更多的使用的是printf 比如想要打印出来hello world 直接如下 C语言 printf a d a python语言 print hello world 然后就是直接回车键就可
  • angular表单验证

    表单验证 通常 我们都需要对用户的表单输入做验证 以保证数据的整体质量 Angular也有两种验证表单的形式 使用属性验证 用于模板驱动表单 使用验证器函数进行验证 用于响应式表单 验证器 Validator 函数 验证器函数可以是同步函数
  • 13功能之C++类默认生成的六个成员函数的自定义

    13功能之C 类默认生成的六个成员函数的自定义 1 代码理解即可 pragma warning disable 4996 include
  • UGUI之rectTransform属性

    RectTransform 本文转载自uGUI知识点剖析之RectTransform 一 基本要点 RectTransform继承于Transform 在 Transform 基础上 RectTransform 增加了 轴心 pivot 锚
  • 【文献翻译】构建网络安全知识库的框架-A Framework to Construct Knowledge Base for Cyber Security

    摘要 现在有一些针对不同方面的独立网络安全知识库 在互联网上 也有很多网络安全相关的内容以文字的形式存在 融合这些网络安全相关信息可以是一项有意义的工作 在本文中 我们提出了一个框架来整合现有的网络安全知识库并从文本中提取网络安全相关信息
  • java8日期时间相关

    java8时间相关api 一 java8时间相关api出现的原因 二 LocalDate LocalTime LocalDateTime的使用 1 解释 2 学习点 3 代码示例 三 Instant 1 解释 2 学习点 3 代码示例 四
  • Ubuntu下的CUDA编程(二)

    Ubuntu下cuda编程的基本过程 一 运行程序 按照上一篇文章所述 安装好cuda软件以后 就可以使用 nvcc V 命令查看所用到的编译器版本 本人用版本信息来自 Cuda compilation tools release 3 2
  • python学习——如何求质数/素数

    质数判断 方法一 一个大于1的自然数 除了1和它本身外 不能被其他自然数 质数 整除 2 3 5 7等 换句话说就是该数除了1和它本身以外不再有其他的因数 也就是说 从2到n 1遍历 如果存在一个数是这个整数n的因数 那么它就不是质数 但是
  • docker保存镜像到本地,并加载本地镜像文件

    docker保存镜像到本地 并加载本地镜像文件 1 查看已有的镜像文件 docker images 显示效果如下所示 2 将镜像打包成本地文件 指令 docker save 镜像id gt 文件名 tar docker save 17282
  • COCO数据集的下载、介绍及如何使用(数据载入及数据增广,含代码)

    如何使用COCO数据集 COCO数据集可以说是语义分割等计算机视觉任务中应用较为广泛的一个数据集 具体可以应用到物体识别 语义分割及目标检测等方面 我是在做语义分割方面任务时用到了COCO数据集 但本文主要讲解的是数据载入方面 因此可以通用
  • springboot 微信小程序 对接微信支付功能(完整版)

    微信小程序对接微信支付功能 业务流程时序图 JAVA版 1 项目架构 2 pom xml配置文件 3 小程序账号参数配置类 4 JAVA 通用代码 4 1 工具类 4 1 1 IdGen id生成类 4 1 2 Render 响应结果类 4
  • Springboot

    0 学习目标 了解SpringBoot的作用 掌握java配置的方式 了解SpringBoot自动配置原理 掌握SpringBoot的基本使用 了解Thymeleaf的基本使用 1 了解SpringBoot 在这一部分 我们主要了解以下3个
  • CUDA编程第四章: 全局内存

    前言 本章内容 学习CUDA内存模型 CUDA内存管理 全局内存编程 探索全局内存访问模式 研究全局内存数据布局 统一内存编程 最大限度地提高全局内存吞吐量 在上一章中 你已经了解了线程是如何在GPU中执行的 以及如何通过操作线程束来优化核
  • 【Seq2Seq】压缩填充序列、掩蔽、推理和 BLEU

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Openstack云平台脚本部署之Aodh告警服务配置(十三)

    目录 一 简介 二 部署脚本 三 参考文档 四 源码 五 系列文章 一 简介 Openstack告警服务Aodh负责当收集的数据度量或事件超过所设定的阈值时 会出发报警 从Liberty 版本后从Ceilometer 中拆分出来 独立为单独
  • java把图片url地址转为图片文件并打包压缩下载

    序言 最近做项目时遇到一个需求就是把上传到oss上的图片批量压缩下载 众所周知 上传到oss的图片返回保存的是url地址 而url是无法直接下载成图片的 所有中间需要转一下 下面是我写的一个工具类 纯java操作 不依赖第三方jar有需要的
  • C语言猜数字小游戏

    在大家小时候 肯定玩过猜数字的游戏 那么用代码形式输出的猜数字游戏 大家玩过吗 今天就跟随博主一起来实现这一个小游戏吧 1 我们要先思考的问题是 怎么样才能让计算机随机产生数字呢 这里推荐大家使用一个C语言函数的网站 Cplusplus 里
  • 史上最简单的 SpringCloud 教程

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net forezp article details 81040925 一 spring cl

随机推荐

  • vue 组件样式不生效问题,和如果更改组件样式

    我们现在的编程离不开组件的使用 例如 element ui avue 等 问题 组件的样式太过单一不满足开发的需求 还有的是组件有自己的样式更改但是找不到 解决 深层构造器 css 自带 gt gt gt gt gt gt name col
  • 如何在C#中从同步方法调用异步方法?

    我有一个public async void Foo 方法 我想从同步方法中调用它 到目前为止 我从MSDN文档中看到的所有内容都是通过异步方法调用异步方法 但是我的整个程序不是使用异步方法构建的 这有可能吗 这是从异步方法调用这些方法的一个
  • casperJs的安装

    自己买了vps就是爽 想装什么就装什么 就比如说casperjs 1 首先需要安装它的运行环境phantomjs 将这个git项目clone到自己的vps上 https github com ariya phantomjs 通过查看官方文档
  • Zookeeper实践(四)zookeeper的WEB客户端zkui使用

    前面几篇实践说明了zookeeper如何配置和部署 如何开发 因为大多是后台操作 对于维护和产品项目管理人员来说太抽象 下面介绍一下zookeeper的web客户端使用 一 环境准备 1 既然是客户端 必然得先有一个zookeeper服务
  • Class 09 - Data Frame和查看数据

    Class 09 Data Frame和查看数据 DataFrame tibbles head str colnames mutate 创建 Dataframe DataFrame 在我们开始做数据清洗或者检查数据是否存在偏差之前 我们需要
  • error: method does not override or implement a method from a supertype java:方法不会覆盖或实现超类型的方法

    错误 编译报错 error method does not override or implement a method from a supertype 即java 方法不会覆盖或实现超类型的方法 详细错误 解决方案 对超类进行继承即可
  • 交换两个变量的值的4种方法,你了解了吗?

    目录 一 引入第三变量 二 不引入第三变量 1 a a b b a b a a b 2 利用异或 3 巧妙运用优先级 总结 在我们的开发中 或者在我们平时的练习中 常常会遇到交换两个变量的值 那么如何交换两个变量的值呢 可能很多初学者都只知
  • 区块链四级知识考试

    区块链知识四级考试 考试时间30分钟 总分100分 请认真作答 出题人及监考老师 高志豪 请转载者注明 谢谢支持 一 单选题 每题5分 共40分 1 加密数字货币如果设置过短的确认时间会更容易导致什么出现 A 高效率 B 低效率 C 孤块
  • C/C++:C/C++在大数据时代的应用,以及C/C++程序员未来的发展路线

    目录 1 C C 在大数据时代的应用 1 1 C C 数据处理 1 2 C C 数据库 1 3 C C 图像处理和计算机视觉 1 3 1 导读 2 C C 程序员未来的发展路线 2 1 图导 1 C C 在大数据时代的应用 C C 在大数据
  • 三. go 常见数据结构实现原理之 silce

    目录 一 基础 几个小问题 1 题目一 2 题目二 3 题目三 4 数组和切片陷阱 二 Slice实现原理 切片的创建与底层结构 append 与切片的扩容 切片的值传递引用传递 切片再切片 特殊切片 切片的 Copy 总结 一 基础 为什
  • Path的Data生成归总

    Path的Data数据有三种生成方式 1 最简单的是用Expression Design 可以粘贴来自其它软件的矢量图形 导出时选择 文件 gt 导出 gt 导出属性 gt 格式 gt XAML Silverlight 画布 即可得到XAM
  • ES6中var let const三种变量(一文弄清楚)

    ES6中三种变量声明 ECMAScript 变量是松散类型的 变量可以用于保存任何类型的数据 有3个关键字可以声明变量 var const 和 let 其中 var在ECMAScript 的所有版本中都可以使用 而 const 和 let
  • 判断密码是否包含键盘连续字母

    新增内容为增加键盘列排序检测 原理 用两个与传入密码长度相等的一维数组 Row行数组 Column列数组 按密码顺序在二维键盘数组中查找每个字符 找到了则用 一维行列数组分别存放密码中每个字符的行号和列号 然后循环分析行号和列号是否满足二维
  • Alist V3 “全新版本“ 使用 安装/启动 教程!

    Introduction AList文档 nn ci 如果安装了Docker 请确保将其添加到系统的PATH变量中 您可以通过在终端中运行命令echo PATH来检查这一点 输出应该包括码头工人二进制文件的路径 通常是 usr bin 码头
  • RuntimeError: Pin memory thread exited unexpectedly 或 OSError: [Errno 9] Bad file descriptor 的解决方法

    遇到这几个错 大多是因为内存不足 我的解决方法 方案一 pin memory 不变 pin memory的值仍然为True 不需要改为False 而是把batch size 和 num worker的值分别调成 batch size 2 n
  • 10-20-010-简介-目录-Kylin目录详解

    文章目录 1 视界 1 Kylin二进制源码目录解析 2 HDFS 目录结构 2 1 cardinality 2 2 coprocessor 2 3 kylin job id 2 4 resources 2 5 jdbc resources
  • 基于vue构建lib + 类型声明文件

    构建lib 通过创建一个vue项目 实现自己的组件或工具类 然后创建一个index ts作为导出的入口文件 接下来就可以通过Vue CLIkais构建自己的lib了 index ts export Fns from utils fn 创建了
  • 基于STM32的阿里云物联网项目实战

    引言 之前自学了一些关于阿里云物联网项目的开发 收获颇丰 但是总感觉网上的东西太散了 需要自己去不停的收集整理 于是在项目结束后决心自己写一篇比较具有实用性的指导文档 需要声明的是本文档只适合像我一样的新人小白 路过的大佬不喜勿喷 如有疏漏
  • java开发实习生-面试

    redis常用命令 登录 redis cli p a 检查key是否存在 exists key 设置和获取一个键的值 set get 删除键对 del key 同时获取多个 mget linux常用命令 list 查看文件 cd 切换目录
  • 持续交付与敏捷开发的历史

    软件中的 持续交付 不仅仅是一个热门话题 软件的持续交付是软件开发实践和客户保留的圣杯 这也是DevOps今天是如此热门的概念的原因 要了解持续交付的重要性 你需要了解敏捷的历史以及敏捷方法的来源 敏捷软件开发的历史并不是从敏捷宣言开始的