特别放送(二)| 成为DevOps工程师的必备技能(下)

你好,我是石雪峰。在上一讲,我介绍了DevOps工程师的具体职责以及DevOps工程师必备的3项软实力,分别是沟通能力、同理心和学习能力。有了这些认知之后,我们今天来看看“重头戏”:DevOps工程师必备的硬实力以及学习路径。

DevOps工程师必备的硬实力

所谓硬实力,说白了就是指一个人的技术能力。软实力通常是“只可意会不可言传”的,但技术本身就具体多了,重要的是,技术水平的高低相对来说也更好衡量。在公司里面,技术人员要想获得晋升,重点就是依靠技术能力。

IT行业覆盖的技术领域非常广,而且近些年的新技术也是层出不穷的,从入门到精通任何一门技术,都需要大量时间和精力的投入。那么,在面对这么多技术的时候,究竟要选择从哪个开始入手,真是一个难题。对于希望成为DevOps工程师,甚至是DevOps专家的你来说,究竟有哪些必须掌握的核心技术呢?

1.代码能力

现在这个时代,代码能力可以说是最重要的硬实力了。IT行业自然不用说,像运维有运维开发,测试也有测试开发,就连产品经理都要懂代码,不然可能都没办法跟开发同学顺畅交流。

对于工具平台自身的建设而言,代码能力自然是重中之重。这不仅仅在于通过写代码来实现工具平台本身,还在于你能了解开发的完整过程。这些平台的用户每天跟代码打交道的时间可能比跟人打交道的时间还多,如果你不能理解他们的日常工作方式,那么你做出来的工具平台,又怎么能真正解决团队的问题呢?

这里提到的代码能力包含两个方面,分别是脚本语言能力和高级语言编程能力

  • 脚本语言能力。这对于运维工程师来说自然是驾轻就熟,各种VIM、Emacs手到擒来,Shell和Python也是轻车熟路。而对于开发人员来说,难点不在于语法本身,而在于对关联操作系统和命令的理解上。毕竟,脚本语言是一种快速的自动化手段,追求的是高效开发,简单易用。
  • 高级语言编程能力。你需要至少掌握一门高级语言,无论是Java、Python还是Ruby和PHP。其实语言只是工具,你不用过度纠结于选择哪门语言,要求只有一个,就是你能用它来解决实际问题,比如能够支持你实现面向移动端或者Web端的工具平台开发。为了写出好代码,而不仅仅是写出能用的代码,你也需要对于一些常见的开发框架和开发模式有所了解。这是一个相对漫长的过程,绝对不是什么“21天精通XX语言”就够了。因为看得懂和写得好,完全是两码事。

好的代码是需要不断打磨和推敲的。与其说写好代码是一门技术,不如说是一种信仰。我们团队的内部沟通群名叫作“WBC团队”,“WBC”也就是“Write Better Code”的缩写,这其实也是我们团队对自己的一种激励。在日常的开发过程中,我们会不断发现和总结更好的实现方式,在内部分享,互相学习,从而持续提升代码能力。我截取了一部分我们最近优化流水线脚本的经验总结,你可以参考一下。其实,每个人都能总结出自己的代码心经。

2.自动化能力

在自动化方面,你首先需要对CI/CD,也就是持续集成和持续交付,建立起比较全面的认知。因为CI/CD可以说是DevOps工程领域的核心实践,目前大部分公司都在集中建设软件的持续交付能力,尤其是以流水线为代表的持续交付平台,很多时候就同DevOps平台划上了等号。

接下来,为了实现全流程的自动化,你需要能够熟练使用CI/CD各个关键节点上的典型工具,并且了解它们的设计思路。

一方面,目前很多公司都在拥抱开源,参与开源,开源工具自身的成熟度也非常高,并且逐渐取代商业工具,成为了主流方案。通过直接使用开源工具,或者基于开源工具进行二次开发,也是自动化领域投入产出比最高的方式。所以,像版本控制工具Git、代码托管平台Gitlab、CI工具Jenkins、代码扫描工具Sonar、自动化配置管理Ansible、容器领域的Docker、K8S等等,这些高频使用的工具都是你优先学习的目标。

另一方面,无论是开源工具,还是自研工具,工具与工具之间的链路打通也是自动化的重要因素。所以,在理解开源工具的实现方式的基础上,就要能做到进可攻,退可守。无论是封装,还是自研,有了工具的加持,CI/CD也会更加游刃有余。

关于DevOps的工具图谱,我跟你分享一个信通院的DevOps能力成熟度模型版本,供你参考。值得注意的是,工具不在多,而在精。其实,工具的设计思路和理念有共通之处,只要精通单个节点上的工具,就可以做到以点带面。

3.IT基础能力

我始终认为,运维是个特别值得尊敬的工种,也是DevOps诞生的原点。如果你不是运维出身,那你要重点掌握运维的基础概念,最起码要了解Linux操作系统方面的基础知识,包括一些常用的系统命令使用,以及网络基础和路由协议等。毕竟,对于开发者来说,他们通常习惯基于IDE(集成开发环境)图形界面工作。比如,如果问一个iOS开发同学怎么通过命令行的方式进行构建调试,或者如何用代码的方式实现工程的自动化配置,他可能就答不上来了。

另外,随着基础设施即代码的技术不断成熟,你还要能看懂环境的配置信息,应用自动化构建、运行和部署的方式等,甚至可以自行修改环境和应用配置,这样才能实现所谓的开发自运维。虽然在大多数公司,运维的专业能力一般都会通过运维平台对外提供服务,但对于基础概念,还是需要既知其然,也知其所以然。

4.容器云能力

云计算对于软件开发和部署所带来的变化是革命性的。未来企业上云,或者基于云平台的软件开发会慢慢成为主流。而容器技术又天生适合DevOps,Kubernetes可以说是云时代的Linux,基于它所建立的一整套生态环境,为应用云化带来了极大的便利。

所以,无论是容器技术的代表Docker,还是实际上的容器编排标准Kubernetes,你也同样需要熟悉和掌握。尤其是在云时代,基于容器技术的应用开发和部署方式,都是DevOps工程师必须了解的。

5.业务和流程能力

在任何时候,DevOps的目标都是服务于业务目标,DevOps本身也从来不是墨守成规的方式,而是代表了一种变革的力量。所以,加强对业务的理解,有助于识别出DevOps改进的重点方向,而流程化的思维建设,有助于突破单点,放眼全局。

很多时候,企业需要的不仅仅是一个工具,而是工具所关联的一整套解决方案,其中最重要的就是业务流程

对于DevOps工程师来说,要有能力发现当前流程中的瓶颈点,并且知道一个更加优化的流程应该是怎样的,这一点也是制约工程师进一步拓展能力的瓶颈之一。

举个例子,对于开发DevOps平台工具来说,你可能认为最合适承担的团队就是开发团队,因为他们的代码能力最强。但是实际上,DevOps平台的设计,很多时候都是由最熟悉企业内部研发流程的团队来主导的。正因为DevOps工程师的工作应该同业务紧密联系,更加关注于全局交付视角,所以很多时候,配置管理、质量管理、项目管理和技术运维团队更多地在承担相近的角色。毕竟,只有方向正确,所做的一切才是加法。

学习路径

那么,要想成为DevOps工程师,是否有一条普适性的学习路径呢?实际上,这个问题就跟我们要在公司推行DevOps,是否存在一条通用的改进路径一样,并不是一个容易回答的问题。

从前面的能力模型可以看出,DevOps工程师特别符合现在这个时代的要求,他具备多重复合能力,是典型的全栈工程师,或者“梳子型”人才。因为只有这样,才能充分弥合不同角色之间的认知鸿沟,堪称团队内部的万金油。

基于过往在公司内部推行DevOps的经验,以及当前行业的发展趋势,我有几条建议送给你:

1.集中强化代码能力

未来的世界是软件驱动的世界。我们以前总说的必备能力,比如外语、开车等,未来都可以被软件所取代。而编程能力即将成为下一个必备能力,甚至连国务院发布的《新一代人工智能发展规划》中都提到,要在中小学普及推广编程教育。

而写可以用的代码,和写好的代码之间,距离绝不只是一点点而已。你可能会说,以后都用人工智能来编程了,可问题是人工智能从何而来?又是谁来训练和标注人工智能的呢?所以,越是基础的能力,越不会过时,比如数学、核心的编程思想、数据结构,以及基于代码构建对世界的认知和建模能力。

所以,如果你现在只是刚开始接触代码,我建议你给自己定一个目标,专门强化自己的代码能力,至少花1年时间,从新手变成熟手,这对于你未来在IT行业的发展,至关重要。

跟你分享一个小技巧。你可以基于成熟的开源软件来边学习边应用,比如像Adminset这种轻量级的自动化运维平台,已经可以解决大多数中小公司的问题了。其实,代码能力不仅仅是掌握语法和框架,更重要的是基于场景,整体设计数据和业务流程,并通过代码实现出来。毕竟,只有结合实际的应用场景进行学习,才是最有效率的。

2.培养跨职能领域核心能力

相信经过几年的工作,你已经具备了当前岗位所需要的基本能力,这是你当前赖以为生的根本。那么在这些能力的基础上,逐步发展跨领域跨界的能力,尤其是那些核心能力,就成了投入产出比最高的事情。

举个例子,如果你是软件开发工程师,那么恭喜你,你已经走在了代码的道路上,接下来,运维能力就是你要尝试攻克的下一个目标。而在这些目标中,比如操作系统、自动化部署以及云能力,就是你要最优先发展的跨界能力,因为它们是运维的核心,也是了解运维最好的出发点。反过来说,如果你从事的是运维行业,那么除了常用的脚本以外,核心代码能力就是你的目标。

其实,我们每天的工作其实都离不开跨界,比如,运维每天部署的应用,为什么要部署这么多实例?每个实例之间的调用关系又是怎样的?多问几个为什么,往往就有新的收获。

不仅如此,在接触跨领域的时候,除了基础核心技能,那些最常见的工具,你也要花时间来了解。现在网上的资料足够多,快速入门应该并不困难。

3.DevOps核心理念和业务思维

如果你不理解DevOps到底是什么,那何谈成为DevOps工程师呢?因此,像DevOps中的核心理念,比如精益敏捷、持续交付,以及很多实践,你都要有所了解。当然,如果你订阅了这个专栏,我将带你走过前面的这段路,你可以快速地进入下一阶段,在实战中练习。

DevOps在公司的落地是大势所趋,也许你所在的团队也会参与其中,那么除了做好自己的本职工作外,你也可以多参与,多思考,看看推进的过程是怎样的,涉及到的角色又在做些什么,项目的整体进展和计划是什么。在实战中练习和补齐短板,对于积累经验来说,是不可或缺的。很多时候,不是没有学习的机会,只是我们自己不想看到罢了。

另外,可能你现在距离业务还比较远,那么你可以尝试了解一些大的业务目标,多跟你所在团队的上下游进行沟通,看看他们现在的关注点在什么地方。既然业务的目标需要整个团队紧密协作才能完成,那么每个团队都是其中的一份子,所以他们身上也同样体现了业务的目标。

4.潜移默化的软实力建设

类似沟通能力、同理心、自驱力、学习能力、主动性等,无论从事任何职业,都是你身上的闪光点。很多天生或者从小养成的习惯,需要长时间潜移默化的训练才能有效果。

很多时候,IT从业人员给人的印象都是不善表达,再加上东方文化的影响,本身就比较含蓄,这对很多沟通和表达来说,都是潜在的障碍。这个时候,就要尽量把握已有的机会,比如多参加团队内部的读书分享、公司内部的讲师培训报名等。即便刚开始分享的内容还不足你脑中的1%,但至少也是一个好的起点。我的建议就是6个字:勤练习,多总结。就像DevOps一样,持续改进和持续反馈,培养自己的自信心。

总结

总结一下,我在这两讲给你介绍了DevOps工程师要重点关注的3大职责,分别是工具平台开发、流程实践落地和技术预研试点。另外,我还基于实用角度提炼了8大核心能力模型,分为3条软实力和5条实力,并给出了4条提升DevOps核心能力的建议。为了方便你复习和理解,我画了一张脑图,把这两讲内容进行了汇总,你可以参考一下。

最后,我想强调的是,就像DevOps没有明确的定义一样,DevOps工程师的技能也没有明确的限定,所以,你要时刻保持好奇心,持续学习,总结出自己的能力体系,并在实践积累经验,这样才能在激烈的竞争中占得先机。

思考题

针对我们这两讲的内容,你觉得自己需要提升哪方面的能力呢?你有哪些快速提升能力的小窍门吗?

欢迎在留言区写下你的思考和答案,我们一起讨论,共同学习进步。如果你觉得这篇文章对你有所帮助,欢迎你把文章分享给你的朋友。

精选留言

  • 爱吃菜的胖头鱼

    2019-10-19 01:58:23

    想问一下后面会讲具体的实施么?比如CI用什么如何整合?还有希望有讲一下,比如亚马逊是如何做CICD的。用到什么技术?怎样保证持续开发的稳定性。谢谢啦
    作者回复

    你好,后面会有专门一讲来介绍CI持续集成的内容,其实从工具层面来说,现在的解决方案都比较成熟,通过关联版本控制系统和持续集成系统就可以实现每次集成的自动化任务。在这个过程中,有几个点需要特别关注:
    1. 测试能力的集成,如果CI环境中缺乏测试能力,那么就无法做到持续开发的稳定性
    2. 质量门禁的集成,如果没有设定质量门禁,那么持续集成中发现的问题就不会在第一时间解决
    3. 通知机制的集成,需要建立一种有效的通知机制,比如即时通讯软件来告知CI结果
    当然,工具,集成这些方面的因素,更重要的是培养团队的习惯,这也是落地CI最大的挑战。
    至于亚马逊的CICD实践,我这边了解不多,但核心几个方面,强大的内部工具支持,应用架构充分解耦,全功能团队和研发自运维。

    2019-10-20 00:03:01

  • 陈斯佳

    2019-12-23 20:07:37

    老师,请教一个问题,就是有时候我们公司的开发想让我们用Jenkins自动化他们的开发环境,但是因为他们都是用IDE构建,不知道如何用命令行构建。这种情况我需要这么找到他们的构建命令行然后用Jenkins实现呢?需要打开他们IDE的设置去看吗?
    作者回复

    哈哈,这个场景过于真实了,但是我理解常见的语言都提供了命令行方式,这个更IDE好像关系不大,当然,一个小技巧就是打开IDE的调试模式,让他打印后面的日志信息,里面应该会有调用的命令信息。当然也不排除有些场景是依赖于IDE的,这个还得具体分析,谢谢!

    2019-12-24 08:01:56

  • caozhao

    2019-10-31 16:07:32

    需要提高的地方,1.技术方面,学了就得多运用 2.怎么把危机调整为机会。
    学习一门技术,自己觉得先用 视频入门,之后多练习,再然后 通过看书来补充 再练习,重点是可以用来解决问题,如果有更具调整性的问题,那么就该从入门 到 深入,了解底层原理来处理问题,这是用问题来驱动学习。
    作者回复

    非常好的补充,我也给你一个建议,那就是输出式学习,因为输入式学习我们可以偷懒,没听到也无所谓,不练习也没人管,但输出式学习,你的每一句话都有很多人在听着,全世界都可能知道你说的不对,这对一个人的促进力会更强哈。

    2019-11-20 00:46:32

  • Robert小七

    2019-10-19 08:26:14

    老师分享的devops工具图谱大部分都是一些商业化的平台中的模块,有没有专门针对开源的工具图谱?我觉得如果提供开源工具图对订阅专栏的同学更好!
    作者回复

    开源工具的图谱网上应该有很多,我也不是每个工具都使用过,所以建议还是贵精不贵多,可以先把几个环节的典型工具跑通并真正运用起来,再根据需要评估新的工具,如果你对具体哪个方面,或者解决那些问题的工具感兴趣,欢迎给我留言,看看能否给你一些有针对性的推荐哈!

    2019-10-20 00:04:58

  • 何雁秋

    2022-08-24 22:14:19

    文章和图都很好,只是感觉过于侧重流程和建设,忽视了后续的持续监控和运维。
  • BertGeek

    2022-06-30 18:23:05

    目前运维岗位,多处理项目发布,编写流水线。
    后期更发展代码核心能力。先python,自动化平台
    选择一款开源软件,剖析和实战
  • huixisheng

    2022-03-16 09:48:59

    老师,工具图谱的二维码失效了。v0.6 后续的版本有更新么
  • 分清云淡

    2019-12-10 20:04:49

    大部分都是放在哪个领域都是正确的,比如同理心、比如沟通能力;比如代码能力、比如学习能力…… 这些每个人都应该懂,但是就是做不到。教,最好是能将同理心、沟通能力、学习能力等拆解开来,变成具体可以复制的步骤,这样才是对学员能力基本没有要求,可以付复制、跟着做就能实现。
  • IcreamPrince

    2019-11-11 21:12:06

    老师,我想请教一下作为DevOps IT Application Manager,这个角色跟DevOps Engineer的要求和技能模型有什么不同
    作者回复

    你好,你提到的DevOps IT Application Manager的具体职责是什么呢,说实话只从Title很难看出具体的职责,所以不太好随意对比哈,其实我理解DevOps工程师很多都是偏向SRE工程师,还是以运维为核心的岗位职责,只不过拓展了DevOps的能力而已。

    2019-11-19 06:54:01

  • caozhao

    2019-10-31 16:10:13

    还有不管 学习和工作,不追求完美和多,只求开始和 ’少就是多’的体验。
    作者回复

    你好,我也特别认同less is more的理念,如无必要,勿增实体。学习的三重境界就是学过,讲过和实践过,咱们只是第一步,加油!

    2019-10-31 20:02:44

  • 石子头

    2019-10-30 20:15:30

    老师,国内有没有专业靠谱的Devops培训,类似于DevOps Master这种?
    作者回复

    这个问题说实话让我很纠结,要看你对于培训的心里预期,我只能说如果想在短短几天内就精通DevOps是不切实际的,培训更多的是快速提升下线,而对于一种实践来说,输出式学习往往更加有效哈。

    2019-10-31 08:43:01

  • 熊斌

    2019-10-28 16:44:19

    本来想说我比较欠缺沟通能力了,但又仔细回想了一下,工作当中必要的沟通我没有问题,能够清楚表达自己的意思。只是不喜欢闲聊。请问老师 这算是不擅长沟通么? 代码上面还需要精进,工作实践+看书+专栏学习+阅读源码的方式。学完已更的全部内容,喜欢上DevOps了。谢谢老师
    作者回复

    你好,抱歉很晚回复,沟通是一门艺术,还是要看沟通的目的性是什么,我个人觉得,如果想更进一步,能清楚表达意思并带动一群人跟你一起干就很有必要的,毕竟到了一定程度的话,不可能一个人把所有事情都做了。我最近特别喜欢学习的三重境界,学过,讲过和实践过,尽量不要只停留在第一级哈,更多的的分享和实践才是王道!

    2019-10-31 20:06:44

  • libinglin

    2019-10-25 16:00:37

    老师.DevOps 能力成熟度模型的图哪个网页上有?
    作者回复

    你好,我传到了网盘上供参考


    链接:https://pan.baidu.com/s/1N5ELmiAdOr8sud6mkFgYuA 密码:v2vd

    2019-10-26 10:35:09

  • 玉剑冰锋

    2019-10-21 08:06:04

    从认知到落地相信这一定是个漫长的过程,作为个人来讲,在公司都没开始推行devops或者都还没意识到的时候,日常工作学习中应该如何去实践,比如CI/CD,只是自行搭建环境测试学习跟线上还是有很大区别
    作者回复

    你好,我认为DevOps会对组织中的每个角色都会带来影响,而所谓的实践也同样是分布在各个环节内的。既然DevOps的目标在于软件交付效率,那么效率这个事情就可以分为个人和小组两个维度。从小组维度来说,可以率先尝试和引入一些比较好的效率提升实践,即便是基于开源平台也能起到不错的效果。比如像你提到的CICD,如果开发团队可以开始尝试持续集成,并在团队内部一起讨论分支策略的优化空间。而测试团队则可以将一部分测试能力自动化后,同持续集成进行整合。也就是说在自己的部门内部开展改进工作。另外从个人维度来说,使用工具改善日常工作效率,发现上下游协作中的瓶颈点,提升自身的交付质量,并且尝试理解上下游部门的工作内容和过程,拓展上下游的知识能力,这些都有助于个人和小组成为团队DevOps的种子。当然如果真正想推行DevOps,依靠个人的力量还是很难做到的,建议先从个人和小组的能力提升做起来吧。

    2019-10-23 00:01:25

  • 鲍建飞

    2019-10-20 01:03:44

    你好,我之前一直有一个疑问,怎样能快速理解docker和k8s之间的关系呢?看了很久也没把认知提上去,那个编排还是很难理解
    作者回复

    你好,我之前看过一个挺有意思的漫画,发给你参考下,不知道你们公司是否有开始使用k8s,我觉得能在实际应用中了解是最好的哈。不一定是在大规模生产中使用,比如我们之前把编译构建集群放在了k8s里面,然后再一点点的把流水线引入进来,也是一种循序渐进的过程。链接如下: https://mp.weixin.qq.com/s/JKQrxlPkpgI4IJNi6yONCw

    2019-10-22 07:57:14

  • 大鼻子先生

    2019-10-19 19:35:39

    老师,操作系统和网络协议以及jenkins方面有相关的书籍推介吗
    作者回复

    你好,Jenkins方面的书籍说实话一直比较少,我之前翻译过一本Jenkins2权威指南,应该是目前业界比较权威的书籍了,你可以看下。关于操作系统和网络协议,如果你不是要求特别精神的话,我个人认为单纯了解的层面,鸟哥的书就足够啦。

    2019-10-20 00:08:30

  • Robert小七

    2019-10-19 08:41:46

    老师后面讲模块时,会讲京东云是怎么做的吗?对京东云有过一些基本的了解,很想知道京东云面对配置管理是如何做的!devops讲一切相关的元数据都纳入版本控制,但是实际落地时很难!
    作者回复

    你好,你觉得将元数据纳入版本控制的难点具体在什么地方呢,我刚好在这方面有很多积累,可以提出你的问题,我帮你一起分析一下哈。

    2019-10-20 00:06:43