DevOps原则,听伍道长细细道来

简介:

讲师简介

伍斌_Ben,悟道者,ThoughtWorks软件开发咨询师。著有《驯服烂代码:在编程操练中悟道》,译有《测试驱动数据库开发》和《优质代码》。自1993年大学毕业以来,先后做过程序员、测试工程师、项目经理和软件开发咨询师。2013年4月创办全栈开发者的编程操练社区“bjdp.org北京设计模式学习组”。微信公众号bjdp_org。


分享内容介绍

DevOps原则所追求的愿景是什么?

DevOps的实践包括Scrum和用户故事的实践吗?

还是仅仅指自动化测试和部署?

DevOps与Agile和Lean的关系是什么?

有哪4个维度可以用来组织丰富多彩的DevOps原则?

这些原则有没有一些所对应的实践的例子?

让我们一起在本次分享中寻找上述问题的答案。


分享内容总结


Dev指的是“开发”,Ops指的是“运维”,那么到底什么是DevOps?它的原则是什么?它和敏捷和精益的关系是什么?

 

要回答这些问题,让我们先观察一下DevOps的起源

 

DevOps的起源可以分为两条线。

 

第一条线就是比利时独立咨询师Patrick Debois。2007年他在比利时参与一个测试工作时,需要频繁往返于Dev团队和Ops团队。Dev团队已经实践了敏捷,而Ops团队还是传统运维的工作方式。看到Ops团队每天忙于救火和疲于奔命的状态,他在想:能否把敏捷的实践引入Ops团队呢?

 

第二条线是当时雅虎旗下的图片分享网站Flickr。这家公司的运维部门经理John Allspaw和工程师Paul Hammond,于2009年6月23日,在美国圣荷西举办的Velocity 2009大会上,发表了演讲 “每天部署10次以上:Flickr公司的Dev与Ops的合作”。

 

这个演讲有一个核心议题:Dev和Ops的目标到底是不是冲突?传统观念认为Dev和Ops的目标是有冲突的——Dev的工作是添加新特性,而Ops的工作是保持系统运行的稳定和快速;而Dev在添加新特性时所带来的代码变化,会导致系统运行不稳定和变慢,从而引发Dev与Ops的冲突。然而从全局来看,Dev和Ops的目标是一致的,即都是“让业务所要求的那些变化能随时上线可用”。

 

了解了这个演讲的议题后, Debois撸起袖子,于2009年10月30至31日,在比利时 城市根特,以社区自发的形式,举办了一个名为DevOpsDays的大会。这次大会吸引了不少开发者、系统管理员和软件工具程序员来参加。 会议结束后,大家继续在“推特”上聊。 Debois把DevOpsDays中的Days去掉,而创建了#DevOps这个“推特”聊天主题标签,DevOps诞生了。

 

Flickr公司的两位演讲者所表达的“Dev和Ops的共同目标是让业务所要求的那些变化能随时上线可用”这一观点,其实就是DevOps的愿景。而要达到这一点,可以使用一个现成的工具:精益。因为源自丰田生产方式的精益的一个愿景,就是“Shortest lead time”,即用最短的时间来完成从客户下订单到收到货物的全过程。这恰好能帮助实现DevOps的上述愿景。《持续交付》的作者之一Jez Humble也体会出精益在DevOps中的重要性,以至于他把DevOps的CAMS框架修订为CALMS,其中增加的L指的就是Lean(精益) 。

 

从上面DevOps的起源能够看出三点:

 

1)DevOps源自草根社区,最初并没有什么自顶向下设计出来的理论框架;
2)DevOps背后的原则,就是上面两条线中所涉及的敏捷和精益的原则;
3)DevOps的愿景是让业务所要求的那些变化能随时上线可用。

 

因为DevOps源自草根,没有什么框架,所以如何定义DevOps成了DevOps社区里面的一个大难题。一些DevOps从业者,纷纷给出自己的DevOps框架。其中比较有名的框架有上文提到的Damon Edwards所定义并被Jez Humble所修订的CALMS,和Gene Kim所定义的The Three Ways。

  

本人试着从“人、产品、流程和工具”4个维度,来把DevOps的一些原则进行梳理。 其中,“高于”表示右边的实践虽然不如左边的好,但还是有价值的。“而非”表示右边的实践并不值得推荐。这就是本文标题中“实例化”的由来。


gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

领导者身体力行持续改进 高于 关注工具和基础设施


要想让DevOps这颗树苗茁壮成长,企业要为其提供一个良好的土壤——即企业文化。而企业文化,是企业领导者所塑造的。 只有领导者身体力行,不仅自己做试验和持续改进,并给工程师时间来做试验和持续改进,这样所创造出良好的土壤,才能让那些自动化工具和基础设施在企业内部得到有效利用。

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

试验并改进流程 而非 指责人的过失


DevOps对于国内大部分企业都是新事物,需要做试验来“摸着石头过河”,做试验就有失败的时候,此时就要调整流程,而不是怪罪于人,否则企业没有人会去继续尝试DevOps。

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

产品思维 高于 项目思维


根据这一个原则可以定义“人”的组织结构——团队结构,即可以按照产品而不是项目来组建团队。这种自治的全功能团队,能令团队的不同角色目标一致,比起从目标不一致的各种职能团队(比如Dev团队、Tester团队和BA团队)抽调人员拼凑成临时的项目团队,磨合期更短,更加有战斗力。

 

产品

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

质量和安全内建 而非 晚期度量和检查


通过持续改进流程,“一次就把事情做对”,这样就能在不进行后期大规模检查的情况下保证高质量,同时保证质量的成本也趋近于零。

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

客户反馈 高于 按期交付


产品是否实现了价值,只有通过客户的反馈才能知道。很多团队往往过分关注交付期限,而忽视经常从客户那里获得反馈。这样做的后果,就是虽然按期交付,但是产品却不是客户所期望的,造成返工或项目失败。

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

基于不可变容器的微服务 高于 单块应用


产品需要能快速地开发、测试和部署才能有效地交付价值。对于复杂度高的大型产品,如果可以由多个微服务组合而成,每个微服务都能独立地开发、测试、部署和上线。这比起必须集成各个模块才能进行手工测试的单块应用来说,能实现各个微服务之间的并行研发,加快每个微服务的开发下游至上游的反馈环的反馈速度,进而缩短项目进度,让价值交付得更快。

流程

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

管理层实践Improvement Kata和Coaching Kata进行流程持续改进 高于 用结果导向进行管理


传统按结果导向进行管理的一个弊病,就是团队成员会把注意力放到结果上,而不是产生这样结果的原因——即过程改进之上。这样的后果就是,大家会把精力放到如何让报表好看,而不是真正地提高团队成员的持续改进能力来真正达到所期望的结果。企业管理层可以参考《丰田套路》一书来带头实践Improvement Kata和Coaching Kata,让企业产生持续改进的文化。

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

全局优化 而非 局部优化


由于大部分按职能组织团队的企业内部所存在的部门割据的问题,导致大家都在做本职能部门内做局部优化,而没人做部门间的整体优化。有些部门间的扯皮时间甚至长达数月,严重影响了产品的交付。这提醒我们,全局优化来提高企业整体竞争力,才是各个部门赖以生存的保障。

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

单件流 高于 库存


单件流指的是,正在制作的产品的各个模块,能从最初的对其增加价值的加工步骤,直接传递到下一个增值加工步骤进行加工,并最终被传递到客户手中,在这个过程中,各个步骤之间没有发生等待或者排队的现象。而如果在各个步骤的传递过程中发生了等待或排队,那就等同于建立了库存。 软件开发中的库存就是让项目延期的最大原因。而企业如果能做到单件流,那么就相当于消灭了库存,让价值在不同环节之间流动得最快,进而实现了前文所提到的全局优化。

 

工具

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

自动化 高于 手工


按照固定流程所进行的手工工作,比如手工回归测试和手工部署工作,无趣、缓慢且无法审计。如果能将其代码化,且用版本控制系统管理起来,并加以自动化,这既能节省以后手工运行的大量时间,又能体验到开发测试和部署脚本工作的乐趣。

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

基础设施及代码 高于 手工配置


传统Ops的部署工作有些需要用鼠标在界面上点来点去,效率很低;效率高一些的Ops用了自动化脚本,但很多脚本都没有进行版本控制。如果能够将基础设施的维护工作都通过编写代码并加以版本控制来完成,那么让团队了解基础设施的配置,并方便做自动化, 大幅度提升Ops的工作效率。

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

部署流水线 而非 每日构建


有些团队每晚做一次代码构建。这样做的问题是:团队程序员们每天代码的提交会有很多,如果晚上构建发现了错误,第二天从这些众多提交中发现谁导致的错误,将是一个很困难的事情。推荐的做法是每一次代码提交,都能自动触发部署流水线来检查该提交是否通过了自动化单元、验收和性能等测试。一旦发现问题,就能轻松定位是谁在哪个环节出现了什么问题。


总结一下,DevOps的原则来自从业者们的在日常工作中运用Agile、Lean原则的具体实践。这些原则可以按照“人、产品、流程和工具”4个维度来组织。这些原则和实践的目的,都是要实现DevOps的愿景——让业务所要求的那些变化能随时上线可用。

 

精彩问答

请问老师,devops的实践在legacy系统中如何运用呢?有没有可能呢?

在legacy系统中,也是可以运用DevOps的某些原则的,比如“质量和安全内建 而非 晚期度量和检查”、“客户反馈 高于 按期交付”、“全局优化 而非 局部优化”、“单件流 高于 库存”、“自动化 高于 手工”等等。是有可能的。我听到一句很给力的话:其实没有Legacy的系统,而只有Legacy的思维模式。


伍老师能介绍下工作中具体如何落地的吗,具体案例?

这个问题是不是讲DevOps转型如何落地?如果是的话,那么在工作中具体落地的方法是个很大的话题,而且实施方法因组织的具体情况而异。但我个人认为,转型能否落地最重要的一点,就是专注在“因”,而不是“果”上。就是“菩萨畏因”的“因”和“众生畏果”的“果”。“因”其实就是工程师的“行为模式”。要改变“行为模式”,就需要老师。老师可以是组织内有经验的经理,还可以外请教练。没有转型经验的组织,需要让有经验的人带一下。具体案例可以参考Flickr. :-)


devops原则是针对所有软件产品,还是主要针对线上产品?

这些原则可以针对所有软件产品来定制。定制时需要注意:要做试验,来找到适合自己组织的实践方式。


老师,这里提到的集成自动化,主要是那个层面的自动化测试呢?测试一般来说会有,单元,接口,到功能,ui。但是感觉到多数项目只会devops集成到api的自动化测试。这个会有一个通用的做法什么的吗?

这里提到的自动化,可以包括自动化测试和自动化部署,及一切可以用代码来自动化的手工操作。您提到的各种层面的自动化测试,需要按照测试金字塔来组织:即少量的UI自动化测试、中等数量的Service自动化测试和大量的自动化单元测试。

测试金字塔可以参考老马的博客:https://martinfowler.com/bliki/TestPyramid.html


基础设施设置工具推荐哪些,chef,ansible或者salt?

我这里有张图,体现了一些配置管理工具和DevOps工具诞生的时间顺序。

这些工具的对比,大家可以参考:https://www.upguard.com/articles/the-7-configuration-management-tools-you-need-to-know


请教下老师:目前在您实践DevOps的过程中,组织结构是如何演化的?

即用什么样的办法让组织结构从现有的以部门为单位,转向为以产品为单位?

最佳实践是什么?

另外问下,您目前一个产品团队,里面的成员结构和成员构成大概有哪些,人数如何?

我所看到的企业DevOps转型,组织的结构是公司高层由上到下来重新组合,来讲原先以职能划分的团队,调整为以产品为核心的特性团队。其实我觉得没有最佳实践,只有经过了在自己组织中试验并改进后得到的较好实践。但总原则是特性团队包括业务人员、开发人员、测试人员和运维人员,且各个角色的核心人员相对稳定,不会随着项目变化而解散。

人数可以参考亚马逊的“两个披萨”团队(即团队外出吃饭,两个大披萨就能喂饱)的设计:http://blog.jasoncrawford.org/two-pizza-teams


微服务和单件流,在 现实中存在4端,相互交叉版本依赖,这也做到微服务单个发布个集成,和单件流,这种情况怎么来完善和实施devops? 也难做到完全单个情况?

就是我们应用存在4端,划分微服务后,存在依赖太严重了,很慢做到单体价值交付,和单个微服务做ci这样……能否知道有解决方案之类的?

如果拆开微服务后,发现几个微服务的依赖太严重,那么多半是因为拆分的不合理导致的。微服务拆分原则是每一个微服务都能实现“自治”,微服务的拆分原则可以参考老马的“微服务”博客:http://www.10tiao.com/html/551/201603/404584177/1.html


就是我们应用存在4端,划分微服务后,存在依赖太严重了,很慢做到单体价值交付,和单个微服务做ci这样……能否知道有解决方案之类的?

如果拆开微服务后,发现几个微服务的依赖太严重,那么多半是因为拆分的不合理导致的。微服务拆分原则是每一个微服务都能实现“自治”,微服务的拆分原则可以参考老马的“微服务”博客:http://www.10tiao.com/html/551/201603/404584177/1.html

另外老马的“微服务”博客是我翻译的,可以告诉大家原版在这里:http://mp.weixin.qq.com/s?__biz=MjM5MjEwNTEzOQ==&mid=401500724&idx=1&sn=4e42fa2ffcd5732ae044fe6a387a1cc3#rd



来源:中生代技术

原文链接


相关文章
|
存储 运维 数据可视化
【DEVOPS】 Devops原则
【DEVOPS】 Devops原则
154 0
【DEVOPS】 Devops原则
|
运维 Devops 测试技术
|
1月前
|
运维 安全 Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
在数字化转型的浪潮中,企业对于IT基础设施的要求越来越高,不仅需要快速响应市场变化,还要确保系统的稳定与安全。本文深入探讨了如何通过融合DevOps文化和容器化技术来构建一个高效、稳定且易于管理的云基础设施。通过实际案例分析,阐述了持续集成/持续部署(CI/CD)流程的优化、自动化测试、监控以及日志管理等关键环节的实施策略,旨在为运维专业人员提供一套切实可行的解决方案。
28 3
|
1月前
|
运维 Kubernetes Devops
构建高效可靠的云基础设施:DevOps与容器化技术融合实践
【2月更文挑战第30天】 在当今快速迭代和竞争激烈的软件开发领域,传统的IT运维模式已难以满足业务发展的需要。本文将探讨如何通过整合DevOps文化和容器化技术,构建一个既高效又可靠的云基础设施。文章首先回顾了DevOps的核心理念及其对运维工作流的影响,接着深入讨论了容器化技术的优势和挑战,并提出了一套结合两者的实施方案。最后,通过案例分析展示了该方案在实际环境中的应用效果和潜在益处。
|
9天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
11天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第13天】 在当今快速迭代和持续部署的软件开发环境中,传统的IT运维模式已难以满足业务发展的需求。本文聚焦于如何通过融合DevOps理念与容器化技术,构建一个高效、稳定且易于管理的云基础设施。文章将探讨持续集成/持续交付(CI/CD)流程的优化、容器化技术的最佳实践、以及微服务架构下的应用管理,以期为企业提供一种改进运维效率、加速产品上市时间,同时保障系统稳定性的解决方案。
|
26天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
随着企业数字化转型的不断深入,传统的IT运维模式已经难以满足快速迭代和持续交付的需求。本文将探讨如何通过结合DevOps文化与容器化技术,构建一个既高效又稳定的云基础设施。文章首先概述了DevOps的核心理念及其在现代运维中的重要性,然后详细介绍了容器化技术,特别是Docker和Kubernetes在实现微服务架构中的应用。最后,文中通过案例分析展示了这一融合实践如何在真实环境中提升运维效率和系统稳定性。
21 7

热门文章

最新文章