问题描述
在阅读一些关于DevOps的文章后,对DevOps工程师编写什么样的代码还不太清楚。他发现有些DevOps工程师只编写与系统操作相关的代码,而有些人则同时编写与用户需求相关的代码。他想知道DevOps工程师是否常常为用户需求编写代码。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
简答
这取决于组织。如果你是一名专注于基础设施的专业人员,没有任何软件开发经验,那么你不太可能编写功能代码。然而,如果你是一名既懂得Terraform又懂得软件工程的工程师,你可能会在同一天内同时进行这两项工作。
详细回答
DevOps并不是一个严格的职位名称;在最一般的意义上,”DevOps思维方式”是敏捷或精益运营模型的一部分。在这种模型中,DevOps是一种适用于所有人的工作方式,专注于”三种方式”:
1. 系统思维:理解创造价值是整个系统的产物,而不是系统的任何一个部分。当我说系统时,我指的是包括人类和技术组件在内的系统,即编写自动化或功能代码的人和执行该代码的技术。
2. 加强反馈循环:创建和加强消费者与系统各个部分之间的信息流动。
3. 持续实验和学习的文化:建立数据驱动的文化,鼓励通过实验来实现敏捷性和学习。
采用的DevOps采用模式
这三种方式并没有规定组织应该如何组织;它们只提供了DevOps的基本原则。结合大多数公司不会快速变化的事实,这意味着有几种DevOps的”采用模式”:
1. DevOps桥接:由一组DevOps工程师编写代码来自动化部署和运维,并经常操作。
2. DevOps运维团队:一个团队编写代码来操作软件,但开发团队编写代码、基础设施和部署自动化。
3. 工具团队:一组DevOps工程师编写开发人员使用的工具。
4. 嵌入式DevOps:一个DevOps工程师嵌入到团队中,编写基础设施和部署自动化,并构建出运维能力。
5. 普遍的DevOps:整个团队对功能开发和基础设施/部署自动化负责。他们可能有一个DevOps工程师,或者开发人员可能”做DevOps”。
Google和Amazon的方法
Amazon和Google也提出了两种一般方法:
1. “你构建它,你运行它”:这是亚马逊首席技术官Werner Vogels用来描述亚马逊如何扩展开发和运维团队的口号。即整个团队负责构建功能、将其部署到生产环境并在生产环境中运行。
2. Site Reliability Engineering(SRE):这是Google(以及许多其他组织)的技术运营模型,它将开发和运维分开,但以一种共享责任的方式,共同对代码的质量和保修负责。
Amazon的”你构建它,你运行它”模型
亚马逊内部的团队负责交付服务,而不是软件或基础设施。因此,他们需要在团队中拥有能够履行每个技术角色的人员:软件架构师、后端开发人员、前端工程师、基础设施工程师、自动化测试工程师、运维工程师等等。这些团队中的一些人可以担任多个角色,其他人可能更专业。
在亚马逊的模型中,整个团队负责实现功能和编写自动化代码(等等)。他们可以选择雇佣一名软件工程师来编写功能代码,再雇佣一名DevOps工程师来编写自动化代码;或者雇佣两名既擅长功能开发又擅长自动化的工程师。
Google的Site Reliability Engineering模型
Google在八年时间里进行了自己的探索,并提出了Site Reliability Engineering(SRE)。广义上说,Google雇佣了软件工程师(SWE)和Site Reliability Engineers(SREs),软件工程师负责构建代码、自动化基础设施和自动化部署,并承诺如果项目足够重要并且他们已经证明自己能够在生产环境中运行该项目,那么Site Reliability Engineers将接管该项目的运维工作。
SRE使Google同时具备了两个优势:团队对产品上线和可靠性负责。Site Reliability Engineers可以接管多达十个活跃产品,这意味着Google可以减少值班成本,并让软件工程师集中精力开发新功能或产品。
如果你参考Google的Site Reliability Engineering三角形:
– 产品:你认为是高级别的”功能”开发,即理解用户需求并实现它。
– 发布流程:你可能认为是改进功能流入生产环境的代码,可以是部署代码或基础设施。
– 开发:涵盖了三个领域:实现功能的代码、部署代码或基础设施即代码。
我的经历
我从网络技术员和IT经理开始,然后成为.NET开发人员,然后成为DevOps顾问,最后担任现在的职位。我现在的职位可以处理几乎任何任务。
在招聘时,我寻找”T型人才”,即在一两个领域专家,但在我们成功所需的所有领域都有适度的能力。
总结
当你刚开始时,从最终目标开始:
– 如果目标是一个跨职能团队,能够构建和运行一个产品,那么确定团队需要做什么,并确保每个能力都有不止一个熟练的人。
– 如果目标是成为一名DevOps工程师,从基础设施即代码、持续部署和运维的基础知识开始。随着你的学习,教会团队成员如何自己做这些事情,并询问他们如何做自己的工作(包括QA、前端、后端和硬件工程师)。最终,你将成为一个T型人才。