devops发展历程
第一阶段:只有 Dev ,没有 Ops ,Dev 是全栈工程师
如何理解?最初的时候,产品和业务形态都处于摸索期,业务复杂度不高,访问量不大,软件能够尽快跑起来推向市场是最重要的,所以架构上不设计的很复杂,单体或分层架构足矣。典型的 LNMP 架构
服务器和网络设备数量也就是两位数规模,最最一开始个位数也有可能。所以几个开发同学在简单架构下,维护几十台服务器还是没问题的所以,这个时期确实不需要运维工程师( 但是并不意味着没有运维的事情 ),这个逻辑同样适用于测试。
现在很多 startup 公司,直接在云上使用 docker 部署模式,对于基础设施就更不用投入太多精力去维护,所以这些公司都会讲我们的研发团队比较单一,只有开发,没有运维和测试,所有的事情开发都可以搞定。
第二阶段:Dev + Ops ,但不是 DevOps
一个业务发展良好的公司,第一个阶段肯定不会停留太久,毕竟业务在发展,甚至是高速发展,不然公司肯定就没什么前途了。
伴随着业务发展,业务复杂度升高,开发需要将更多的精力放到更多更快地需求实现上,也就是集中精力写代码;同时业务访问量增加,后端设备数量也增加起来( 一定时期内堆机器还是可以解决不少问题的 ),达到几百上千这样的规模,维护的工作量也就上来了。
所以很自然的,这个时候就需要 Ops 这样的角色来管理和维护设备,同时对于 DB 、缓存、Web 服务器、存储以及 CDN 这样的通用基础服务也适用这个逻辑。概括一点说,除了写代码,运维最好能把所有之前开发干的事情都干了。
这时 Ops 的主要职责:硬件维护、网络设备维护、DBA 、基础服务维护等。
我也是在这样一个阶段进入到现在的公司,我觉得在这个阶段上,我们的意识还是比较好的,比我当时的意识要超前很多,运维团队已经具备工具开发能力,并有了类似机器资源管理、PHP 发布系统、监控等一些工具平台,以及一些非常高效的自动化脚本工具。所以,这个团队从一开始就崇尚能用技术解决问题就绝对不靠人的理念。
但是运维的注意力仍然聚焦在上面提到的基础设施和服务层面,而且运维开发在做的事情更多的是自给自足,也就是满足运维团队内部的工具需求,当然也有一部分原因是受限于当时的技术架构,规模和复杂度有限,运维能做的事情也有限。
所以这个时候是 Dev 是 Dev ,Ops 是 Ops ,还没有做到 Dev 和 Ops 的融合。
第三阶段:仍是 Dev + Ops ,但 Ops 开始组建运维开发团队
这里有个技术架构演进的背景,就是从单体 + 分层的架构,向服务化架构演进。随着业务复杂度的提升,所有代码和逻辑都放到一个工程里的结果就是下图:
这时耦合严重,牵一发而动全身,开发效率日渐低下,所以要做的事情就是一个字,拆( 专业说法:服务化拆分 ),如下图所示:
这时,大量的应用被拆分出来,对运维自动化、持续发布、稳定性的要求就随之而来,所以 Ops 开始正式组建运维开发团队来做有规划的、系统性的提升效率和稳定性方面的事情,这个时候的运维开发团队支撑的需求方有两个:一个是运维内部,一个是开发,因为运维会配合支持开发做很多事情,所以很多情况下运维的需求一定程度上就代表了开发的需求,但不是完全代表。
运维内部的需求主要是资源分配、扩缩容、应用管理、域名、VIP 等的管理需求,开发主要是持续交付的需求,两者共同的需求就是监控、容量管理、性能管理、链路跟踪等等。
还是说说这个阶段 DevOps 存在的一些问题:
运维开发是脱离实际运维工作的
这个团队的定位还是要从运维这里承接需求,然后开发实现,并不实际参与运维工作,再加上运维开发自身也会有一些独立的想法或者带着之前的经验在设计开发,所以对于现状下的运维工作理解是不够深入的。同时,运维同学自身也不是产品出身,一开始也很难按照产品化的思维模式表达清楚自己的需求,往往就是现实工作场景的口述,所以表达的更像是一个个功能点的堆砌,而不是系统化的建设思路。
所以这里始终就会有个 Gap 。结果上,最直接的体现就是运维开发做出来的工具和平台没法很好的满足运维的需求,甚至过程中也会出现一些矛盾,比如运维抱怨运维开发没能很好地实现需求,做出来的东西不好用,甚至是没法用,运维开发也会抱怨运维需求没提清楚,或者说辛辛苦苦做出来的东西运维不用,辛苦都是白费。
所以你看,一个团队并不是有了运维开发和运维自动化就万事大吉了,还会涉及到一些团队管理和运作模式上的问题。
而且现实中,有很多公司的运维开发团队是独立的,运维和运维开发不是同一个主管,甚至不在同一个组织架构下,这样就很容易出现上面说的这个问题。这里根本原因还是目标不一致,运维是需要一个平台能把自己的事都干了,但是运维开发更多的是考虑你给我提什么需求我做什么需求,目标是做完需求,而至于好不好用,不是最重要的事情。
稍好一点的运作模式,运维和运维开发在某个具体的项目上形成虚拟团队,这个团队的目标和考核方式一致,如果运维和开发的效率得不到提升,团队的整体绩效就会受到影响,至于考核方式和一些细节就不详细说了。记住一点,就是目标一致的情况下,大家才会朝一个方向使劲,事情做地才会更好。
Ops 去做运维开发,运维开发去做 Ops ,这样也就不存在需求传递的过程和 Gap 了,自己做出来的东西自己用,运维开发可以更深刻地理解运维工作,而不是天马行空地凭空 YY 。
这样可以让彼此能够站在对方的角度去考虑问题,也就不会有什么抱怨和指责了。
我们当前模式是虚拟项目组模式,好在运维和运维开发团队都在统一团队中,这样可以省去大量沟通成本,目标也可以相对容易达成一致。同时,我在做的一个尝试就是上面说的,Ops 有一部分员工要去做运维开发的事情,运维开发要去做运维的事情,后续应该会把两个团队逐步融合。
总结下第一个问题,我们可以看到不光 Dev 和 Ops 之间会有协作问题,哪怕是运维团队内部的开发,在配合上也会存在问题,这是个细节问题,需要团队管理和项目运作上做一些优化。
运维开发和业务开发团队的协作问题
第一个问题可以通过内部沟通和协作的方式去改进,但是对外,只能强调服务意识,这里就一个判断原则,如果你做出来的东西,开发都不用或者意见很大,那只能说你的工作完成不到位,或者在合作协作上是有很大问题的。
第四阶段:真正的 DevOps ,Dev 和 Ops 融合
当 Ops 的能力沉淀到一个个产品平台之后,原来开发依赖运维的人去干的事情,就可以自助地依赖运维平台去做了,也就是日常运维由开发自己做,而不再依赖运维这个环节,真正实现 DevOps 。
典型案例就是持续交付做好之后,开发完全可以自助发布,全程无需运维介入。
devops发展历程的更多相关文章
- DevOps实施历程-v1.0
有AF项目的成功案例(DevOps实施历程-半自动化),公司新项目全部依此为模板,实现了从代码到安装的自动化流水线,为此我输出了Jenkins自动化指南.AF项目指南等文档,方便大家查阅和参 ...
- C#与C++的发展历程第三 - C#5.0异步编程巅峰
系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...
- Linux实战教学笔记03:操作系统发展历程及系统版本选择
标签(空格分隔): Linux实战教学笔记-陈思齐 第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System ...
- C#与C++的发展历程第一 - 由C#3.0起
俗话说学以致用,本系列的出发点就在于总结C#和C++的一些新特性,并给出实例说明这些新特性的使用场景.前几篇文章将以C#的新特性为纲领,并同时介绍C++中相似的功能的新特性,最后一篇文章将总结之前几篇 ...
- C#与C++的发展历程第二 - C#4.0再接再厉
系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 开始本系列的第二篇,这篇文章中将介绍C#4.0中一些变化,如C++有类似功 ...
- Java的发展历程
Java的发展历程充满了传奇色彩. 最初,Java是由Sun公司的一个研究小组开发出来的, 该小组起先的目标是想用软件实现对家用电器进行集成控制的小型控制装置. 开始,准备采用C++,但C++太复杂, ...
- C# 6.0可能的新特性及C#发展历程
据扯,C# 6.0在不远的将来就发布了,对应的IDE可能是VS 2014(.Net Framework 5.0),因为VS 2013已于2013年10月份发布了,对应的是.Net Franework ...
- C#发展历程以及C#6.0新特性
一.C#发展历程 下图是自己整理列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的. 二.C#6.0新特性 1.字符串插值 (String In ...
- Java起源、发展历程、环境变量、第一个Java程序等【1】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: 本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pi ...
随机推荐
- Java实现回形数,只利用数组、循环和if-else语句
import java.util.Scanner; public class learn { public static void main(String[] args){ System.out.pr ...
- js删除array数组中元素
for(var i = 0; i < array.length; i++) { if(-1 != array[i]) { array.splice(i, 1); i--; } } 上面if就是判 ...
- python线程定时器Timer(32)
相对前面几篇python线程内容而言,本片内容相对比较简单,定时器 – 顾名思义,必然用于定时任务. 一.线程定时器Timer原理 原理比较简单,指定时间间隔后启动线程!适用场景:完成定时任务,例如: ...
- 2、1 昨天讲列表缓存,为了让列表更新,我们需要在增、删、改方法之前加 @CacheEvict(value="list",allEntries = true)
package com.bw.service; import java.util.List; import javax.annotation.Resource; import org.springfr ...
- eclipse3.62开发第一个java程序HelloWorld
[学习笔记] 用eclipse3.62开发第一个java程序: 使用eclipse之前们需要先配置一下jdk.window/preference/java/installed JREs,详细请见视频. ...
- golang设置运行的核数
package main import ( "fmt" "runtime" ) //设置golang运行的核数 //1.8 版本以上的会自动设置 func ma ...
- Vue CLI 3开发中屏蔽的EsLint错误 (.eslintrc.js 在vue3+中 修改这个)
1.关闭eslint校验有了eslint的校验,可以来规范开发人员的代码,是挺好的.但是有些像缩进.空格.空白行之类的规范,在开发过程中一直报错,未免太过于苛刻了.所以,我还是会选择关闭eslint校 ...
- axios全局配置及拦截器
axios使用说明文档 axios 全局配置: //axios-init.js import axios from 'axios': let loadingInstance; //创建Loading ...
- Python考试_第一次
python基础数据类型考试题 考试时间:两个半小时 满分100分(80分以上包含80分及格) 一,基础题. 1. 简述变量命名规范(3分) 答:(1) 变量为数字,字母以及下划线的任意组合,且不能以 ...
- VBA常量(八)
常量是一个命名的内存位置,用于保存脚本执行期间固定(无法更改)的值.如果用户试图更改常量值,则脚本执行结束时会出现错误.常量声明与声明变量相同. 以下是命名常量的规则 - 常量名称必须使用一个字母作为 ...