“DevOps”的人性化可扩展性

“ DevOps”的人性化可扩展性

正如我最近在 Twitter 上面写的那样,我最近花了相当多的时间思考“ DevOps”的人工可伸缩性(我在 DevOps 周围使用引 ,因为有各种各样的定义,我将在后面讨论。)我得出的结论是,虽然 DevOps 在小型工程组织中可以非常好地工作,但是如果不仔细考虑和管理,这种做法可能会导致相当多的人员/组织扩展问题。

什么是 DevOps

术语 DevOps 对不同的人有不同的含义。在我深入思考这个问题之前,我认为弄清楚 DevOps 对我来说意味着什么很重要。

维基百科将 DevOps 定义为:

DevOps (“ development”和“ operations”的简称)是一种软件工程文化和实践,旨在统一软件开发(Dev)和软件操作(Ops)。DevOps 运动的主要特点是在软件构建的所有阶段,从集成、测试、发布到部署和基础设施管理,都大力提倡自动化和监控。DevOps 的目标是缩短开发周期,增加部署频率,以及更可靠的发布,与业务目标紧密一致。

我使用了一个更加狭义和略有不同的 DevOps 定义:

DevOps 是开发人员在生产环境中负责运行他们的服务的实践,24/7。这包括使用共享基础设施原语的开发、测试、随叫随到、可靠度、灾难恢复、定义 SLOs、监控设置和 警、调试和性能分析、事故根本原因分析、配置和部署等。

维基百科的定义和我的定义(开发哲学和运营战略)之间的区别很重要,并且以我个人的行业经验为框架。60. DevOps”运动”的一部分是向缓慢移动的”遗留”企业介绍现代高度自动化的基础设施和开发做法的好处。这些包括: 松散耦合的服务、 api 和团队; 持续集成; 来自主人的小型迭代部署; 敏捷通信和计划; 本地弹性基础设施; 等等。

在我过去的10年职业生涯中,我曾经在高速增长的互联 公司工作过,包括 AWS EC2、 pre-IPO Twitter 和 Lyft。此外,主要是由于创建和谈论特使,我在过去两年中与无数高速增长的互联 公司的技术架构和组织结构进行了会晤和学习。对于所有这些公司来说,拥抱自动化、敏捷开发/计划和其他 DevOps“最佳实践”是一个必然,因为生产力的提高已经得到了充分的理解。相反,这些工程组织面临的挑战是如何在系统可靠性与业务增长、人员增长和竞争(业务和雇佣)的极端压力之间取得平衡。这篇文章的其余部分是基于我的个人经验,我认识到这可能不适用于所有情况,尤其是那些可能每季度部署一次单片软件并被诱导成更快速和敏捷的开发实践的传统企业。

互联 应用操作简史

在我称之为现代互联 时代的过去大约三十年里,互联 应用程序的开发和运行经历了(在我看来)三个不同的阶段。

  1. 在第一阶段,互联 应用程序的构建和部署与“搜索封装”软件的发布方式类似。三个不同的工作角色(开发、质量保证和操作)将通过极其长的工程周期协作将应用程序从开发转移到生产。在这一阶段,每个应用程序都部署在一个专用的数据中心或托管设施中,进一步需要熟悉特定 络、硬件和系统管理的操作人员
  2. 在第二阶段,主要由亚马逊(Amazon)和谷歌(Google)在90年代末和本世纪初牵头,高速增长的公司的互联 应用开始采用类似于现代 DevOps 运动的做法(松散耦合的服务、敏捷开发和部署、自动化等)。这些公司仍然运行着他们自己的(非常大的)数据中心,但是由于所涉及的规模,也可以开始开发集中的基础设施团队来解决所有服务( 络、监控、部署、供应、数据存储、缓存、物理基础设施等)所需的共同问题。然而,亚马逊和谷歌从未完全统一开发工作角色(亚马逊通过系统工程师和谷歌通过Site Reliability Engineer 现场可靠性工程师), recognizing the differing skills and interests involved in each. ) ,认识到不同的技能和兴趣所涉及的每个
  3. 在第三个阶段,或者说本地云阶段,互联 应用程序现在是从头开始构建的,依赖于托管的弹性架构,通常由“三大”公共云之一提供。尽快将产品推向市场一直是首要目标,因为这样做很容易失败。然而在云计算本土时代,“开箱即用”的基础技术允许的迭代速度让之前的技术相形见绌。在这个时代开始的公司的其他拥有属性一直在避免雇佣非软件工程师的角色。可用的基础设施基础是如此强大,以至于他们认为——我会正确地指出——创业公司的员工总数最好花在能够同时进行工程和运营的软件开发人员身上(DevOps)

在第三阶段公司雇用专门的业务人员至关重要。虽然,很明显,这样的公司不需要全职的系统管理员来管理托管设施中的机器,但是这类人之前会填补这样的工作,通常也会提供其他20% 的技能,如系统调试,性能分析,操作直觉等。新公司的员工队伍缺乏关键的、不容易替换的技能。

为什么 DevOps 在现代互联 创业公司中运作良好?

正如我所定义的 DevOps (开发和运营他们服务的工程师) ,对于现代互联 创业公司来说非常好用,原因有几个:

  1. ( 根据我的经验,成功的早期创业工程师是一种特殊的工程师。他们具有风险容忍能力,学习速度极快,无论技术债务多少,都能尽快完成任务,经常能够在多个系统和语言中工作,并且通常拥有操作和系统管理的经验,或者愿意边干边学。简而言之,一个典型的创业工程师非常适合做 DevOps 工程师,不管他们是否愿意自称为 DevOps 工程师(I prefer not 我宁愿不要 ). )
  2. 正如我上面所描述的,现代公共云提供了一个难以置信的基础设施basic 基本的 过去的操作任务已经自动化了,留下了一个基板g足够好 运送最小可行产品,看看是否有适合市场的产品
  3. 我坚信,当开发人员被迫随叫随到并对他们编写的代码负责时,系统的质量就会提高。没有人喜欢被呼叫。这个反馈循环构建了一个更好的产品,正如我在第(1)中所描述的,一个典型的工程师被吸引到一个早期启动产品的工作中,他非常愿意学习和做操作工作。考虑到对于一个可靠性较差的早期启动产品的影响很小,这一点尤其重要。可靠性需要公正 足够好让产品找到市场契合点,进入高速增长阶段

当一个现代互联 创业公司经历高速增长时会发生什么?

大多数创业公司都会失败。这就是现实。因此,任何早期的创业公司花费大量时间以谷歌的形象建立基础设施都是在浪费时间。我总是告诉人们坚持他们的单片体系结构,不要担心其他任何事情,直到人类的可伸缩性问题(通信、规划、紧耦合等)需要向更加分离的体系结构转变。

那么,当一家现代(第三阶段)互联 初创企业获得成功并进入高速增长时会发生什么呢?一些有趣的事情同时发生:

  1. 人员增长速度迅速加快,对通信和工程效率造成严重压力。我强烈推荐阅读The Mythical Man-Month 人月神话 (在首次出版近50年后仍然在很大程度上是相关的)了解更多关于这个主题的信息
  2. 以上几点几乎总是导致从单片机到微服务架构的转变 作为解耦开发团队,提高沟通和工程效率的一种方式
  3. 从单一体系结构到微服务体系结构的转变使系统基础设施的复杂性增加了几百万数量级。 络、可观察性、部署、图书馆管理、安全以及其他数百个以前并不困难的问题现在都是需要解决的主要问题
  4. 与此同时,高增长意味着流量增长和由此产生的技术扩展问题,以及对完全失败和次要用户体验问题的更大影响

中央基础设施团队

几乎所有的公司都遵循早期的启动阶段,现代互联 高速增长的公司最终以类似的方式构建他们的工程组织。这种常见的结构包括一个中央基础设施团队,支持一组实践 DevOps 的垂直产品团队(不管他们是否这样称呼它)。

中央基础设施团队如此普遍的原因是,正如我上面所讨论的,高速增长带来了一系列与人和底层技术相关的变化,而现实是,如果每个产品工程团队都必须单独解决 络、可观察性、部署、配置、缓存、数据存储等方面的常见问题,那么最先进的云本地技术仍然很难使用。作为一个行业,我们距离“无服务器”技术能够完全支持高度可靠、大规模和实时的互联 应用还有几十年的时间,在这些应用中,整个工程组织可以主要关注业务逻辑。

因此,中央基础设施团队的诞生是为了解决更大的工程组织的问题,这些问题超出了基础云本地基础设施原语所提供的范围。很明显,谷歌的基础设施团队比 Lyft 这样的公司要大10个数量级,因为谷歌正在从数据中心层面解决基础性问题,而 Lyft 依赖于大量公开可用的原语。然而,在这两种情况下,创建中央基础结构组织的根本原因是相同的: 尽可能抽象基础结构,以便应用程序/产品开发人员可以专注于业务逻辑。

可替换性的谬论

最后,我们得到了“可替换性”的概念,这是当组织规模超过一定数量的工程师时,纯粹的 DevOps 模型失败的关键。可替换性是指所有工程师生来平等,可以做任何事情。无论是明确的招聘目标(至少像亚马逊(Amazon)或其他公司那样) ,还是通过“训练营”(例如雇佣工程师时不考虑团队或角色的招聘方式) ,可替换性在过去10-15年里已经成为许多公司现代工程哲学的一个流行组成部分。为什么会这样?

  • 正如我已经描述过的,现代的本地云技术和抽象允许使用日益复杂的基础设施抽象来构建功能极其丰富的应用程序。自然,大多数公司不再需要数据中心设计和操作等专业技能
  • 在过去的15年里,软件工程一直被认为是所有学科的根基。例如,微软已经淘汰了传统的 QA 工程师,取而代之的是软件测试工程师,这个想法是,手动的 QA 并不高效,所有的测试都应该自动化。类似地,传统的操作角色已经被站点/可靠度或者类似的角色所取代,这种观点认为手工操作是没有效率的,唯一的扩展方式是通过软件自动化。需要明确的是,我同意这些趋势。自动化 一种更有效的扩展方式
  • 然而,正如许多新的互联 创业公司所做的那样,这个想法走向了极端,结果只雇佣了通才软件工程师,期望这些(DevOps)工程师能够处理开发、质量保证和操作。

    可替换性和通才招聘对于早期的创业公司来说是很好的。然而,超过一定的规模,认为所有工程师都可以交换的想法几乎变得荒谬,原因如下:

  • 多面手 vs 专家. .更复杂的应用程序和架构需要更多的专业技能才能成功,无论是前端、基础设施、客户端、操作、测试、数据科学等等。这并不意味着通才不再有用,也不意味着通才不能成为专家,这只是意味着一个更大的工程组织需要不同类型的工程师才能成功
  • 不是所有的工程师都喜欢做所有的事情. .有些工程师喜欢成为通才。有些人喜欢专门化。有些人喜欢写代码。有些人喜欢调试。有些人喜欢用户界面。有些人喜欢系统。一个支持专家的不断发展的工程组织不得不面对这样一个事实: 员工的快乐有时涉及到解决某些类型的问题,而不是其他问题
  • 不是所有的工程师都擅长做所有的事情. 在我的职业生涯中,我遇到了许多了不起的人。其中一些可以从 IDE 中的空文件开始,从头创建一个令人难以置信的系统。同时,这些人对于如何运行可靠的系统,如何调试它们,如何监控它们,等等都缺乏直觉。相反的,我已经上过很多次了 激怒的一个真正令人难以置信的操作工程师,仅仅凭借调试方面的专业知识和天生的运行可靠系统的直觉,就能为整个组织带来巨大的利益,却因为没有展示出“足够的编码技能”而被拒绝
  • 具有讽刺意味且虚伪的是,像亚马逊和 Facebook 这样的组织优先考虑软件工程师角色的可替换性,但显然重视开发和运营之间的分工(但仍然重叠) ,继续为每个角色提供不同的职业道路。

    崩溃

    纯 DevOps 是如何以及在什么样的组织规模下崩溃的? 出了什么问题?

  • 转向微型服务.当一个工程组织达到75人时,几乎可以肯定已经有了一个中心基础设施团队,开始构建构建微服务的产品团队所需的通用基板特性
  • 纯粹的 DevOps. 与此同时,产品团队被告知做 DevOps
  • 可靠性顾问. 在这样的组织规模下,倾向于从事基础设施工作的工程师很可能是同一批工程师,他们要么有过这方面的操作经验,要么有很好的直觉。这些工程师不可避免地成为事实上的 SRE/生产工程师,并作为顾问帮助组织的其他部门,同时继续构建维持业务运行所需的基础设施
  • 缺乏教育。作为一个行业,我们现在希望雇用能够介入并发展和经营互联 服务的人然而,我们几乎普遍做了一个可怕的工作,新雇员和继续教育要求执行这项任务. 如果我们从未教过工程师这些技能,我们怎么能指望他们有操作直觉呢?
  • 支持故障. 随着工程组织的招聘率持续上升,到了一个临界点,中央基础设施团队不再能够既继续建设和运营对业务成功至关重要的基础设施,同时又保持帮助产品团队完成业务任务的支持负担。中央基础设施工程师除了现有的工作量之外,还担负着全组织 SRE 顾问的双重任务。每个人都知道教育和文档是至关重要的,但是安排时间来处理这两件事情很少被优先考虑
  • 工作倦怠. 更糟糕的是,前面描述的情况造成了人员伤亡,降低了整个组织的士气产品工程师感觉他们被要求去做一些他们不想做或者没有被教会去做的事情。基础设施工程师在提供支持的重压下开始疲惫不堪,他们知道需要教育和文档,但却无法优先考虑创建这些支持,同时还要保持公司现有系统的高可靠性.
  • 在“旧方式”和“ DevOps 方式”之间是否存在一个中间地带?

    对于大约10年以上的公司,现场可靠性或生产工程模型已经成为常见的。尽管各个公司的实施情况各不相同,但是我们的想法是雇佣一些工程师,这些工程师可以完全专注于可靠度,同时不受制于产品经理。然而,一些实施细节是非常相关的,其中包括:

  • 固定资源是自己随叫随到还是软件工程师分担随叫随到的负担?
  • 是否要求 SREs 执行实际的工程和自动化操作,或者只执行手动和重复的任务,如部署、重复页面解析等。?
  • SREs 是中央咨询机构的一部分还是嵌入到产品团队中?
  • 什么是正确的 SRE 模型?

    鉴于目前在行业中实现的示例过多,这个问题没有正确的答案,所有模型都有自己的漏洞和由此产生的问题。根据我过去10年的观察,我将概述一下我认为最佳点是什么:

  • 认识到操作和可靠度是一个独立的 价值连城 技能集。我们急于将所有事情自动化,以及软件工程师可以互换的想法,正在边缘化一部分工程师劳动力,而这部分劳动力是相等的(如果不是更多的话)比软件工程师更有价值。操作工程师不需要熟悉空源文件,就像软件工程师不需要在紧张的停电期间熟悉调试和消防一样运营工程师和软件工程师是合作伙伴,而不是可互换的齿轮.
  • SREs 不随叫随到,不能控制仪表盘,也不能部署猴子。他们是专注于可靠性任务而不是产品任务的软件工程师。一个理想的结构需要 所有 工程师执行基本的操作任务,包括随叫随到,部署,监控等。我认为这是至关重要的,因为它有助于避免可靠性和软件工程师之间的等级/工作分层,并使软件工程师更直接地对产品质量负责
  • SREs 应该嵌入到产品团队中,而不是向产品团队工程经理汇 。这允许 SREs 与他们的团队争夺,获得相互信任,并且仍然有适当的检查和平衡,这样在试图权衡可靠性和功能时就可以进行真正的对话
  • 嵌入式 sre 的目标是通过实现面向可靠性的特性和自动化,对团队其他成员进行操作最佳实践的指导和教育,并充当产品团队和基础设施团队之间的联络人(文档反馈、痛点、需要的特性等等) ,提高产品的可靠性
  • 如上所述,一个成功的 SRE 项目在成长阶段的早期实施,以及对新雇员、继续教育和文档的真正投资,可以提高整个工程组织的门槛,同时减轻许多以前描述的人力扩展问题。

    总结

    很少有公司达到高增长阶段,在这一点上,这个职位是直接适用的。对于许多公司来说,一个基于现代云本地原语的纯粹的 DevOps 模型可能已经完全满足了所涉及的工程师数量、所需的系统可靠性以及业务所需的产品迭代率。

    对于相对较少的申请这篇文章的公司来说,关键的要点是:

  • 对于任何希望参与竞争的新技术公司来说,DevOps 风格的敏捷开发和自动化都是必需的
  • 公开可用的原始云以及一个小型的中央基础设施团队可以允许工程组织在缺乏教育和角色特异性导致的操作代价开始浮现之前扩展到数百名工程师
  • 在人员扩展问题上走在前面,需要对新雇员和继续教育、文档以及开发一个嵌入式 SRE 团队进行真正的投资,这个团队可以成为产品团队和基础设施团队之间的桥梁
  • 在我看来,现代高速增长的互联 公司已经出现了大量的过度疲劳,主要是由于对产品的苛刻需求,以及对运营基础设施的投资不足。我相信工程领导者可以在这种趋势成为组织稳定性的主要障碍之前,通过领先于业务来逆转这种趋势。

    新公司可能会错误地认为,云计算本地自动化的发展正在使传统的运营工程师变得过时,但事实并非如此。在可预见的未来,即使使用了最新的可用技术,专长于操作和可靠性的工程师也应该得到认可和重视,因为他们提供了其他方法无法获得的关键技能,他们的重要角色应该在早期发展阶段正式构建到工程组织中。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年5月1日
    下一篇 2022年5月1日

    相关推荐