DevOps落地笔记-01|追溯本源:DevOps的发展历史回顾

news2024/9/24 0:54:43

任何事物的诞生、发展和消亡都是由所处社会阶段决定的,软件开发方法也是一样。现在我们津津乐道的 DevOps,也有其自己的起源和诞生的前提条件,今天我带领你追本溯源,一起找一找 DevOps 兴起的历史根源。

当谈到 DevOps,就不得不提的两个词是:精益和敏捷。精益软件开发和敏捷软件开发是 DevOps 发展的两大基础。DevOps 不仅对这两大基础进行了扩展,还引入了很多重要而有用的原则。

因此,在一些人眼中,DevOps 是敏捷的一部分,其实这样的理解是错误的。DevOps 并不从属于敏捷,事实上它更像是在精益和敏捷经验基础上发展出的新生儿,是在前人经验上发展,与时俱进的产物。

精益软件开发
精益思想诞生于 20 世纪中期的日本丰田汽车公司。

我们把时间线拉到20 世纪初,对于当时的人们来讲,汽车还属于奢侈品,只有少数贵族才能拥有。普通老百姓也想拥有这个跑得更快,维护更加方便的交通工具,但他们没有钱。这时的市场迫切需要一种价格便宜、功能简单的汽车满足大多数人的需求。当时的美国福特汽车公司,通过流水装配线,进行大规模生产。流水线一旦建成,生产速度大为提升。于是在 1908 年到 1927 年间,福特共生产销售了 1500 万辆 T 型车,实现了千百万人拥有汽车的梦想。

在美国汽车大行其道的时代,后起的日本汽车工业明显处于薄弱的阶段。成立于1937 年的日本丰田汽车公司,就面临着不少危机:二战后市场购买力低、车辆需求多样化、技术落后、资金短缺… 丰田汽车的负责人大野耐一为了带领丰田生存。在经过 20 多年的不断探索之后,终于找到了适合日本国情的汽车生产方式:丰田生产系统(TPS)。

大野耐一将丰田生产系统描述为“一个绝对消除浪费的系统”,并实行多品种、小批量、高质量和低消耗的精益生产方式。此后,精益生产方式成了日本汽车工业在市场竞争中战胜美国的重要法宝。也由此促使美国为代表的世界各地的专家、学者对开创大批量生产方式和精益生产方式的汽车工业进行研究。最终人们将这种生产方式命名为精益生产。“精”体现在对产品质量上追求“精益求精”,“益”体现在只有通过低成本、少消耗, 企业才能获得收益。

到了2003年,由Mary 和 Tom Poppendieck编写的 《精益软件开发:软件开发管理者的敏捷工具箱》一书问世,该书第一次把精益思想映射到软件开发中。在2006年,作者在第二本书 《实施精益软件开发:从概念到价值实践》 中进一步完善了这种映射,并定义了 7 项原则:消除浪费、内建质量、创建知识、推迟决策、快速交付、对人尊重、整体优化。

作者认为,消除浪费是精益思想的精髓所在。在精益生产领域,一共定义了 7 种浪费,让我们看一看这7种浪费在软件开发中分别对应什么。

& **库存——未完成的工作。**未完成的工作是指一切已经开始但还未完成的东西。可能是还未编码实现的需求,还未进行测试、部署的代码,未完成的工作不能给最终客户带来价值,但资源已经被消耗了。

& 过度处理——不必要的流程。不必要的流程是纯粹的浪费,没有增加任何价值。不必要的流程包括没有达成任何产出的过程,编写没有人读的文档,没有效果的汇报,可以自动化但却还是以手工处理的任务等。

& 过度生产——额外的特性。额外的特性是指用户没有明确的需求。每一行代码都是有成本的,因此,用户不需要的功能就不要创建它。

& 运输——传递。传递是指中间交付物从一个阶段传递到下一个阶段。比如用户故事从业务人员传递到开发人员,系统设计从架构师传递到开发人员等。每次传递都会有知识丢失,因此要尽可能避免传递。

& 等待——延迟。延迟是指在任何环节中的等待,等待就会影响开发进度。与等待相关的延迟有:等待决策、等待资源分配或释放等。

& 移动——任务切换。任务切换是指在不同事情之间来回进行切换。每次切换都需要重新回忆之前任务的上下文,浪费大量时间。相信这个大家都深有体会。

& 缺陷——缺陷。缺陷在制造业和软件产品中都存在的。缺陷会导致返工,返工是没有增加任何价值的,是严重的浪费。

精益软件开发主要关注点便是在对客户有价值的上下文环境中消除浪费。为了帮助企业了解软件开发流程中发生的一切,这里可以采用 价值流图(Value Stream Map,VSM) 这个精益工具,来用于检测和消除浪费。
在这里插入图片描述
VSM 是一种类似地图的图形,可视化地展示了从开始到结束的所有步骤。每一个活动都被标识了“增加价值的”“没有增加价值的”或者“没有增加价值但必需的”。使用 VSM,让我们更容易识别开发过程中的浪费和瓶颈,更好地采用精益软件开发方法。

敏捷软件开发
20 世纪中叶,软件开发方法中被广泛采用的是瀑布模型,将软件开发过程分解为一系列依次完成的单独阶段,包括需求、设计、实现、测试、部署和运维。整个开发过程就像瀑布一样,依次向下经过这些阶段。每个阶段都有一个开始点和结束点,上一个阶段结束后,便进入到下一个阶段,一旦进入到下一个阶段,就不能再回到上一个阶段。

这种模型的一个前提是需求不再发生变化,每个阶段通过文档进行流转,这也就导致了采用瀑布模型开发的软件项目存在大量的问题,比如进度超期、预算超支、不符合用户需求、需求中途被取消等。

这些问题比较资深的程序员应该都遇到过。这是因为软件开发本身是一个高度动态的过程,软件开发过程中的变化是不可避免的。比如:
& 在需求阶段,由于用户也不知道他们想要什么,而这必然会带来需求的改变;

& 在编码阶段,可能会发现设计有问题需要重新设计;

& 在测试阶段,可能会发现代码逻辑有问题需要重新修改;

& 而这必然导致要返回到上一个阶段或上上一个阶段进行返工修复,这些在瀑布模型下是不允许的或者成本是非常高的。

瀑布模型的软件开发导致了项目失败率高、软件质量低下和客户满意度低。

20 世纪 90 年代,人们对瀑布模式的软件开发方法越来越不满意。这种情况下,诞生了其他一些软件开发方法,包括极限编程(XP)、Scrum 方法、动态系统开发方法(DSDM)、水晶方法(Crystal), 以及特征驱动开发(Feature Driven Development,FDD) 等。这些方法有很多相同之处,都是希望能够解决软件开发中遇到的问题。

于是,在 2001 年 2 月,17 位软件开发领域的思想家和领军人物,在美国犹他州的雪鸟滑雪场聚会,为期两天的聚会,几乎囊括了当时软件开发领域大多数知名大咖。这次著名的“雪鸟会议”最终产出了三个重要的结论:
1.决定使用“敏捷”这一术语来表示这些新出现的开发方法。

2.发表了《敏捷宣言》。

3.成立了敏捷联盟。

其中,《敏捷宣言》定义了构成所有敏捷方法的 4 个核心价值观,成为日后指导软件开发的新的开发方法。

我们正通过亲身实践和帮助他人实践,来揭示更好的软件开发方法。

*通过这项工作,我们认为:
个体和互动 胜于 过程和工具
可工作的软件 胜于 面面俱到的文档
客户合作 胜于 合同谈判
响应变化 胜于 遵循计划

虽然右边也具有价值,但是我们认为左边具有更大的价值。
——引自《敏捷宣言》*

在这个《敏捷宣言》陈述的 4 项价值观中,有一点需要特别提醒注意:每一项都涉及左右两项内容,这里并不是说右边的没有价值,而是说左右两项都是有价值的,不过左边的比右边的更有价值。

随后,社区中的项目管理者和开发人员开始采纳并发展敏捷方法,能够快速交付客户可用的软件。

敏捷开发中的关键点有以下几点:
1.开发人员与业务人员要相互合作,才能欣然面对需求的变化。即便到了开发后期也一样,为了客户的价值,通过敏捷来响应变化。

2.降低每个迭代交付的批量大小,减短交付周期,经常交付可工作的软件。

通过使用敏捷方法,软件开发团队一般 2 到 4 周即可发布一个可工作的产品,并交付给客户。这相比以往几个月发布一个版本的节奏,发布周期缩短了很多。因此客户能够更早地使用产品,开发人员也能够更快地获得反馈,并由此对产品进行调整。可以看出,敏捷软件开发并不只是提高了交付软件的效率,更是响应了用户不断变化的需求。

DevOps 的兴起
在一些企业里,享受到了敏捷方法带来的好处,极大地提高了软件的交付速度。但是在有些企业里,在采用敏捷软件开发方法后的实际效果并没有达到预期。

这并不是说敏捷方法不好,问题的关键在于敏捷所涉及的代码开发阶段只是软件端到端价值交付链中的一环。

在实际开发过程中,开发之前还有需求收集、分析、拆解、设计等环节,在开发之后还有编译、构建,及将制品部署到测试环境、生产环境等环节。只有部署到生产环境交付给用户使用,用户将使用效果反馈给开发人员,这才算是一个软件开发周期的完成。

快速部署到生产环境这个环节在很多企业里也是很难实现的。因为,在大多数企业中服务器等硬件基础设施还相对薄弱,多是陈旧的老机器,新采购的预算申请较难且周期长。

这种情况,我是深有体会,在我之前的经历的一家国企里,一个项目预算流程走了长达半年时间。 在这种情况下,为了准备一套测试环境短则数周,长则数月。这些问题严重阻碍了软件向测试环境和生产环境部署的效率。同时,为了保证生产环境的稳定性,运维部门的原则是能不变更就不变更。所有的这些问题,都使敏捷开发的收益难以有效体现出来。

随着虚拟机和云计算技术的快速发展,提供 IT 基础设施的方式方法被彻底改变了。资源被池化,可以根据自己的需求动态分配物理资源,用完即可回收。基于基础设施即代码(Infrastructure as Code,IaC) 的管理方式,我们只需要编写程序代码,就可以创建基础设施。同时,基础设施也能像代码一样进行管理,进行版本控制、变更追溯、回滚等操作。如今,Docker、K8s 等容器技术的兴起,更进一步提高了实施基础设施的效率。

最终,敏捷软件开发方法的广泛普及,以及IT 基础设施即代码(IaC)的管理方式的出现,推动了IT管理方式的变革,这项运动被冠以"DevOps"之名。

DevOps是一场运动,是推动企业内部IT管理方式变革的运动。
DevOps是一个实践,包含了业界广泛采用的、卓有成效的软件开发方法。
DevOps是一个思想,是对精益和敏捷思想的演进,并应用到IT端到端的价值链中。

DevOps 缺少一个清晰的定义,每个人对 DevOps 的理解也都不一样。正如下面这张盲人摸象图,很形象地说明了当前大多数人对 DevOps 理解的现状。
在这里插入图片描述
总之,DevOps 是抽象的,不是具体的;是全局的,不是局部的;DevOps 告诉我们要做什么(What),但没告诉我们要如何做(How)。因为对于一个企业,IT 管理方式的变革跟企业内部的文化、流程、技术关系密切。当企业在应用DevOps的时候,要结合企业现状,有针对性的,制定适合企业内部的应用方案,切勿盲目追求,为了做而做。

DevOps的兴起并席卷全球,是因为 DevOps 的确为我们带来了好处,解决了企业面临的现实问题。“缩短市场响应时间”“减少技术债务”和“消除脆弱性”是 DevOp 着手处理的主要任务。这三个任务中任何一个的改进,都能为企业的业务带来明显的优势。

小知识:
DevOps 运动的起点被认为是在 2009 年的 Velocity 大会。这次大会上,John Allspaw(约翰·沃斯帕)和 Paul Hammond(保罗·哈蒙德) 发表了主题为 “每天 10+ 次部署:Flickr 开发和运维的协作” 的演讲。同年,Patrick Debois 决定在比利时根特市举办首届 DevOpsDays 专题大会。到了 2013年,参加这个活动的 Gene Kim(基恩·金) 的 《凤凰项目》 一书出版,DevOps 企业峰会也开始以每年两届的节奏举办。至此,DevOps 的概念以及社区,开始在全球如火如荼地发展起来。

2017年,中国首届 DevOpsDays 大会在北京召开,DevOps 之父 Patrick 也来到了现场,这场席卷全球的 DevOps 运动终于在中国落地生根。

总结
今天,我把软件开发方法的演变放在历史背景下和你进行了细致讲解,相信你现在对 DevOps 是什么以及其所要发挥的作用有了更好的认识和预期。其实发现到今天,软件开发方法还是在不断演进,出现了很多新的实践,这些新出现的实践就被打上了 DevOps 的标签,成为组织成功的重要因素。

DevOps 通过将敏捷软件开发方法和后续快速部署到生产环境的基础设施能力相结合,真正地打通端到端的软件开发流程,将开发和运维相互融合,最终高效的、高质量的交付用户价值,为企业赢得市场。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1420777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kafka集群搭建需要做的事情

首先,虚拟机克隆好之后的步骤如下: 1. 修改IP、主机名,关闭防火墙;(reboot重启) 2. 在/etc/hosts文件中进行IP与主机名的映射配置,集群中每天都记得配置; 3. 安装JDK并进行分发&a…

3种JWT验证和续签的策略

3 种JWT验证和续签的策略 好文推荐:一文教你搞定所有前端鉴权与后端鉴权方案,让你不再迷惘 - 掘金 (juejin.cn) 3 种jwt 验证的策略 通过解析去验证:每次访问api时parse jwt 判断是否vaild jwt有效 正常调用api jwt无效 返回401 缺点&a…

字符串和格式化输入/输出

本文参考C Primerf Plus进行C语言学习 文章目录 使用scanf() 从scanf()角度看输入格式字符串中的普通字符scanf()的返回值 1.使用scanf() 如果用scanf()读取基本变量类型的值,在变量名前加上一个&;如果用scanf()把字符串读入字符数组中,不要使用&am…

Kotlin快速入门系列6

Kotlin的接口与扩展 接口 与Java类似,Kotlin使用interface关键字定义接口,同时允许方法有默认实现: interface KtInterfaceTest {fun method()fun methodGo(){println("上面方法未实现,此方法已实现")} } 接口实现 …

提升编程效率的利器: 解析Google Guava库之集合篇RangeSet范围集合(五)

在编程中,我们经常需要处理各种范围集合,例如时间范围、数字范围等。传统的集合类库往往只能处理离散的元素集合,对于范围集合的处理则显得力不从心。为了解决这个问题,Google的Guava库提供了一种强大的数据结构——RangeSet&…

【JLU】校园网linux客户端运行方法

终于给这输入法整好了,就像上面图里那样执行命令就行 写一个开机自启的脚本会更方便,每次都运行也挺烦的 补充了一键运行脚本,文件路径$DIR需要自己修改 #!/bin/bash DIR"/home/d0/ubuntu-drclient-64/DrClient" run_per_prog&qu…

微信小程序上传时报错message:Error: 系统错误,错误码:80051,source size 2148KB exceed max limit 2MB

问题: 微信小程序上传时错误码:80051,source size 2248KB exceed max limit 2MB 问题原因: 由于代码中的静态资源 图片大小超了200k以及主包的体积超出1.5M 解决办法 分包 tabBar 是主包的,不需要分包处理,以下是分…

0130-2-秋招面试—HTML篇

2023 HTML面试题 1.src和href的区别 scr用于替换当前元素&#xff0c;href用于在当前文档和外部资源之间建立联系。 <script src"main.js"></script><link href"style.css" rel"stylesheet" />2.对HTML语义化的理解 根据内…

Linux:重定向

Linux&#xff1a;重定向 输出重定向追加重定向输出重定向与追加重定向的本质输入重定向 输出重定向 在Linux中&#xff0c;输出重定向是一种将命令的输出发送到不同位置的方法。通常&#xff0c;执行命令时&#xff0c;输出会显示在终端上。然而&#xff0c;使用输出重定向&a…

5-1 A. DS串应用--KMP算法

题目描述 学习KMP算法&#xff0c;给出主串和模式串&#xff0c;求模式串在主串的位置 算法框架如下&#xff0c;仅供参考 输入 第一个输入t&#xff0c;表示有t个实例 第二行输入第1个实例的主串&#xff0c;第三行输入第1个实例的模式串 以此类推 输入样例&#xff1a; 3 qwe…

产品经理的发展方向是什么?市场需求现状如何?未来有哪些趋势?作为产品经理应该如何准备?

目录 了解产品经理的发展方向 市场需求现状 未来有那些趋势&#xff1f; 作为产品经理应该作何准备? 了解产品经理的发展方向 市场需求现状 未来有那些趋势&#xff1f; 个人软件 &#xff1a;智能终端&#xff0c;轻量化应用&#xff0c;虚拟社交等企业软件&#xff1a…

用GoLand写一个小玩意-git定时push、commit

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 背景 有时候你想刷一刷github的commit墙&#xff0c;或者公司需要每天提交代码&#xff0c;你想摸鱼。就有这么一个小需求&#xff0c;想要自动commit、push代码…

solr的原理是什么

1 Java程序里如果有无限for循环的代码导致CPU负载超高&#xff0c;如何排查&#xff1f; 排查Java程序中由于无限循环导致的CPU负载过高的问题&#xff0c;可以按照以下步骤进行&#xff1a; 资源监控&#xff1a; 使用系统命令行工具&#xff08;如Linux上的top或htop&#xf…

Arrays.asList()方法调用add()或remove()抛出java.lang.UnsupportedOperationException问题

在使用Arrays.asList方法将以,分割的字符串转为list集合时&#xff0c;调用add和remove等方法时会抛出java.lang.UnsupportedOperationException。以下为原因和解决方法。 原因&#xff1a; Arrays.asList()方法返回了一个Arrays类的一个继承了AbstractList的ArrayList内部类…

富文本编辑器CKEditor4简单使用-03(图片上传)

富文本编辑器CKEditor4简单使用-03&#xff08;图片上传&#xff09; 1. 前言1.1 关于CKEditor4的安装及简单使用1.2 关于CKEditor4的插件安装及使用1.3 关于Easy Image 2. CKEditor4自带的默认上传图片按钮功能3. 使用增强的图像插件3.1 什么是增强的图像插件3.2 下载并安装增…

jdk17新特性—— instanceof的模式匹配

目录 一、instanceof模式匹配的概述二、instanceof模式匹配代码示例2.1、jdk17之前 instanceof用法 代码示例2.2、jdk17及之后 instanceof用法 代码示例一2.3、jdk17及之后 instanceof用法 代码示例二 一、instanceof模式匹配的概述 instanceof增加了模式匹配功能&#xff0c;…

vue3之echarts3D环柱图-间隔版

vue3之echarts3D环柱图-间隔版 效果&#xff1a; 版本 "echarts": "^5.4.1", "echarts-gl": "^2.0.9" 核心代码&#xff1a; <template><div class"content"><div ref"eCharts" class"c…

分享4款不能错过的修改照片尺寸的软件!

在当今这个数字化时代&#xff0c;照片已经成为我们分享生活、表达观点的重要方式。但是&#xff0c;你是否曾遇到过这样的问题&#xff1a;一张精美的照片因为尺寸不合适而无法在朋友圈中展现出最佳效果&#xff1f;不用担心&#xff0c;今天我们就来聊聊那些可以帮助你轻松修…

Day02-课后练习2-参考答案(数据类型和运算符)

文章目录 巩固题1、案例&#xff1a;今天是周2&#xff0c;100天以后是周几&#xff1f;2、案例&#xff1a;求三个整数x,y,z中的最大值3、案例&#xff1a;判断今年是否是闰年4、分析如下代码的计算结果5、分析如下代码的计算结果6、分析如下代码的计算结果7、分析如下代码的计…

Real power also called true or active power

Real power also called true or active power flyfish 三相电路的总功率都等于各相功率之和&#xff0c;任意相的有功功率等于该相的相电压乘以相电流&#xff0c;再乘以该相负载的功率因数。 P P A P B P C PP_AP_BP_C PPA​PB​PC​ P有功功率&#xff0c;瓦特(W) U电压…