This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,127 @@
<audio id="audio" title="特别放送(一)| 成为DevOps工程师的必备技能" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f3/b0/f355c5af97c63158c38fb57b222031b0.mp3"></audio>
你好我是石雪峰今天到了“特别放送”环节。有很多留言问道“DevOps专家这个岗位需要的技能和技术栈有哪些成长路径是怎样的呢
我相信这应该是很多刚开始接触DevOps的同学最关心的问题。毕竟从实用的角度出发每个人都希望能够尽快上手实践。所以今天我来跟你聊聊我认为的DevOps工程师的必备技能以及学习路径。不过在此之前我们要先了解DevOps工程师的岗位职责。
全球最大职业社交网站LinkedIn领英2018年发布的一份[报告](https://business.linkedin.com/content/dam/me/business/en-us/talent-solutions/cx/2018/pdf/33-most-recruited-jobs.pdf)显示,当今全球最热门的招聘职位分别是**DevOps工程师、企业客户经理和前端开发工程师**。其中排名第一的就是DevOps工程师。
无独有偶2019年全球最大知识共享平台Stack Overflow的[开发者调查报告](https://insights.stackoverflow.com/survey/2019)显示在薪资排行榜上DevOps工程师排名第三仅次于技术经理和SRE网站可靠性工程师。而在去年的调查报告中DevOps工程师的收入甚至排名第二。
无论是人才市场需求还是收入薪资水平这种种迹象都表明DevOps工程师已经成为了当今最炙手可热的岗位收入也攀升至IT行业的金字塔顶端。难怪有越来越多的人开始接触和学习DevOps。
但是DevOps这样一个刚刚诞生10年的“新兴事物”并不像一门专业技术那样有一条相对清晰的学习路径以及经典的学习资料比如你要学习Java就可以从《Java编程思想》看起。
除此之外DevOps似乎又跟软件工程的方方面面有着说不清的关系。我跟你分享一幅DevOps技能发展路线图根据这幅路线图你要从编程语言入手理解操作系统原理、系统性能、网络安全、基础设施即代码、CI/CD、运维监控和云技术等等。
<img src="https://static001.geekbang.org/resource/image/df/b3/df028795541ad1758d13004acd68fcb3.png" alt="">
>
图片来源:[https://roadmap.sh/devops](https://roadmap.sh/devops)
怎么样是不是看到这么一堆名词就瞬间头大了吧如果要把这些所有的技术全部精通那至少得是CTO级别的岗位。对普通人来说这并不太现实。毕竟**啥都懂点儿但是啥都不精通本身就是IT从业者在职业发展道路上的大忌**。
如果要说清楚这个岗位核心就是要回答3个问题
1. DevOps工程师在公司内承担的主要职责是什么
1. 为了更好地承担这种职责,需要哪些核心技能?尤其是从我接触过的这些公司来看,有哪些技能是当前最为紧俏的呢?
1. 学习和掌握这些技能,是否存在一条可参考的路径呢?
接下来,我们就重点聊一聊这些内容。
## DevOps工程师的岗位职责
关于DevOps工程师这个岗位一直以来都存在着很大的争议。很多人认为DevOps应该是一种文化或者实践而不应该成为一个全新的职位或者部门因为这样会增加公司内部的协作壁垒。
其实我倒觉得没有必要纠结于这个Title因为很多时候DevOps跟公司内部已有的角色存在着重叠。比如开发变成了DevOps开发运维变成了DevOps运维。另外在不同的公司里面类似角色的岗位名称也大不相同。比如在DevOps状态报告中DevOps就和SRE被归为一类进行统计。而在公司中实际负责推行DevOps的部门至少我见过的就有工程效能团队、运维团队、配管团队甚至还有项目管理团队。可见不同公司对于DevOps工程师的职责定义也同样存在着差异。
但不管怎样我觉得谈到DevOps工程师职责的时候除了本职工作的内容以外至少还应该额外关注3个方面
**1.工具平台开发**
关于工具平台开发争议应该是最小的而且这也是很多公司推行DevOps的起点。**因为工具是自动化的载体而自动化可以说是DevOps的灵魂**。随着公司规模越来越大,研发内部的协作成本也随之水涨船高,那么工具平台的能力水平就决定了公司交付能力的上限。
但问题是,因为种种原因,很多公司只有大大小小的分散工具,并没有一套完整的研发协同工作平台,这本身就制约了协作效率的提升。你可以想象一下,研发每天要在大大小小的系统里面“跳来跳去”,很多功能甚至还是重复的,这显然是很浪费时间的。
比如你明明已经在代码托管平台上做了代码评审结果提测平台上面还有个必填项是“你是否做过了评审”是不是很让人抓狂呢这背后的主要原因就是缺乏顶层设计或者压根就没有专人或者团队负责这个事情。这样一来团队各自为战发现一个痛点就开发一个工具发现一个场景就引入一个系统再加上考核指标偏爱从0到1的创造性工作也难怪每个高T升级都要有自己的系统加持了。但如果任由这种趋势发展下去内部的重复建设就难以避免了。
所以对于DevOps工程师而言除了要关注原有的工具重构、新功能的开发之外更要聚焦于整个软件交付流程将现有的工具全面打通以实现可控的全流程自动化。也就是说不仅仅要追求点状的工具还要包括整条线上的工具链从而形成覆盖软件交付完整流程的工具体系。
另外工具平台同样是标准化流程的载体同时也是DevOps实践的载体所以在设计实现时需要考虑这些实践的支持。举个例子在配置管理领域将一切纳入版本控制是不二法则。那么在建设工具平台的时候就需要始终有这样的意识比如记录流水线的每一次配置变更的版本并且能够支持快速的对比回溯。
**2.流程实践落地**
其次,无论是工具平台的推广落地,还是结合平台的流程改进,都需要有人来做。毕竟,即便是完全相同的工具,在不同人的手里,发挥的作用也千差万别,把好好的敏捷管理工具用成了瀑布模式的人也不是少数。而针对流程本身的优化,也是提升协作效率的有效手段。
比如在有的公司里,单元测试需要手动执行,那么当工具平台具备自动化执行的能力,并且能够输出相应的报告时,这部分的操作流程就应该线上化完成。再比如,以往申请环境需要走严格的线上审批流程,当环境实现自动化管理之后,这些流程都可以变为自服务,通过工具平台进行跨领域角色的交叉赋能,从而实现流程优化的目标。
另外我接触过的一些公司倾向于在不改变流程的前提下推动DevOps落地。坦率地说这种想法是不现实的。如果流程上没有约束开发和测试共同为结果负责那开发为什么要跟测试共同承担责任呢出了问题又怎么可能不扯皮呢因此**如果你在公司内部负责流程改进,遇到问题就应该多问几个为什么,找到问题的本源,然后将流程和工具相结合,双管齐下地进行改进。**
所以,**理念和实践的宣导内部员工的培训持续探索和发现流程的潜在优化点这些也都是DevOps工程师要考虑的事情**。
**3.技术预研试点**
最后,各种新技术新工具层出不穷,哪些适用于公司现有的业务,哪些是个大坑呢?如果适合的话,要如何结合公司的实际情况,评估潜在的工具和解决方案,而不是盲目地跟随业界最佳实践呢?类似技术债务的识别和偿还这种重要不紧急的事情,到底什么时候做合适呢?
另外,如果公司决定开始推行单元测试,那么,选用什么样的框架,制定什么样的标准,选择什么样的指标,如何循序渐进地推进呢?这些同样非常考验团队的功底。如果步子一下子跨得太大了,到最后就可能成为形式主义了。
你可能会觉得我就是一个小开发、小运维怎么能推动这么大的事情呢但实际上DevOps从来都不是某一个人或者某一个角色的职责而是整个研发交付团队所共享的职责。在你力所能及的范围内比如在你所在的部门内部开展DevOps的理念宣导和技术培训鼓动领导参加行业的大会在和上下游团队协作的时候向前一步这些都是DevOps所倡导的自服务团队应该具备的能力。
## DevOps工程师的主要技能
说完了DevOps工程师主要负责的事情接下来我们就来看看DevOps工程师所要具备的能力。我从实用的角度出发总结了DevOps工程师的核心能力模型。
其中,**能力模型分为两个方面:专业能力和通用能力**。专业能力也就是常说的硬实力是IT从业人员身上的特有能力比如软件工程师会写代码就跟导演会拍电影司机会开车一样。而通用能力更加接近于软实力这些能力并不局限于某一个岗位或者职业是所有人都应该努力培养的能力。很多时候当硬实力到达天花板之后软实力的差异将决定一个人未来的高度这一点非常重要。
### 软实力
我们今天先从软实力说起。在讲具体的软实力之前,我先跟你分享一个小故事。
我在国外听过这样一种说法在企业中印度裔的工程师往往比华裔工程师的岗位职级要高。为什么会这样呢我曾经做过一个跨中美印三地的工程团队的负责人我发现每次我跟印度工程师交代一个事情他们总能又快又好地做出一个特别清晰漂亮的PPT。我特意问过他们是怎么做到的。原来他们在上学时受过这方面的训练还专门练习过表达、演讲等技能可见事出必有因软实力对个人的发展至关重要。
那么作为一名DevOps工程师需要具备什么软实力呢
**1.沟通能力**
DevOps倡导的核心理念就是沟通和协作所以难怪沟通能力会排在软实力的第一名。
**在推动DevOps落地的过程中你需要同时具备向上沟通、向下沟通和横向沟通的能力**。提炼DevOps实施框架和落地价值寻求领导层的支持需要**向上沟通**;打破组织间的边界,建立跨团队的协同,需要**横向沟通**;引导团队快速完善平台工具能力,表明工作的意义和价值,提升大家的主动性,需要**向下沟通**。所以你看,其实每天的工作中都充满了大量的沟通。
需要注意的是,**沟通能力不仅限于语言能力,很多时候,开发运维的沟通是基于代码完成的**。所以,良好的注释风格、清晰结构化的描述方式……这些细节往往也能提升沟通的效率。
比如有一种很DevOps的方式就是ChatOps是以GitHub的Hubot为代表的对话式运维慢慢扩展为人机交互的一种形式。通过建立一种通用的沟通语言打破开发和运维之间的隔阂。
**2.同理心**
DevOps希望团队可以共享目标共担责任但是实际上哪个团队不想更加自动化、更加高效地工作呢所以DevOps工程师要能够站在对方的角度来看问题设身处地地想想他们的困难是什么我能做些什么来帮助他们。这种同理心也是弥合团队分歧建立良好的协作文化所必需的能力。
除此之外,**培养团队以用户为中心的思想,也是很好的方式**。这里的用户,不是外部用户,而是在交付流程中存在交付关系的上下游部门。在交付一个版本的时候,要尽力做到最好,而不是不管三七二十一,先丢过去再说。
我还是要再强调一下,**同理心只有在流程和机制的保证之下才能生根发芽**。
**3.学习能力**
DevOps工程师需要了解的东西真得很多因此能够在有限的时间里快速学习新的技能并且有意愿主动地改进提升也是一种能力。
在DevOps工程师的眼里从来没有“完美”二字。比如完美的流程、完美的技术实现、完美的软件架构等。他们似乎天生就有一种能力那就是能发现问题并时刻想着可以做到更好。但实际上如果没有日积月累的思考没有外部优秀实践的学习没有开放的沟通和交流是没有办法知道原来还有一种更好的工作方式的。引用质量管理大师戴明博士的一句话
>
Dont just do the same things better find better things to do.
很多时候,我们都在等待一个完美的时机,比方说,你打算学习一个新的知识点,但要等到工作都完成了,没人来打扰,有大段的时间投入才开始学习。**但实际上哪来这么多准备就绪的时候呢真正的学习者都是在没有条件来创造条件的过程中学习的。所以如果想开始学习DevOps我信奉的原则只有一个那就是先干再说**。
## 总结
今天我给你介绍了DevOps工程师的前景可以说现在是这个岗位的黄金时期。我还给你介绍了DevOps工程师的主要职责包括工具平台开发流程实践落地和技术预研试点这些都是在完成本职工作的基础上需要额外考虑的。在个人技能要求方面我重点提到了3项软实力希望你始终记得软实力不等于玩虚的这对未来个人的发展高度至关重要。
在下一讲中我会跟你分享DevOps工程师必备的硬技能以及成长路径敬请期待。
## 思考题
你所在的公司是否有DevOps工程师的岗位呢他们的职责要求是怎样的呢你觉得还有哪些软实力是DevOps工程师所必备的呢
欢迎在留言区写下你的思考和答案,我们一起讨论,共同学习进步。如果你觉得这篇文章对你有所帮助,欢迎你把文章分享给你的朋友。

View File

@@ -0,0 +1,183 @@
<audio id="audio" title="特别放送(三)| 学习DevOps不得不了解的经典资料" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/3f/f7/3fcf422d8f32b70500096cd9630ceef7.mp3"></audio>
你好,我是石雪峰。
今天又到了特别放送的环节在学习交流DevOps的过程中经常有人会问这样的问题
- 我想学习DevOps可以推荐一些好的书和资源吗
- DevOps相关的最新行业案例我可以在哪里获取呢
- 你是怎么知道这么多有趣的故事的呢?
这些问题的“出镜率”特别高所以我今天专门来跟你聊聊有关DevOps学习资料的事情。
你应该也有感觉在这个信息爆炸的时代如果想要了解一个新的事物相关的信息不是太少而是太多了。像DevOps这种热门话题相关的资料网上一搜就一大把。各种新书也像“采用了DevOps实践”一样发布频率越来越快。信息一多我们就很容易焦虑这么多资料什么时候才能看完啊
更何况,如果单单只是臻选有用的资料,就要花费大量的时间,按照精益的理论来说,这也是不增值的活动呀。在这个时间稀缺的时代,想要花大段的时间投入到一件事情上,找到一个靠谱和有价值的信息,就成了很多人开始学习的第一步,
所以为了让你在专栏之余可以更加有效地持续学习我特意整理了一份我认为DevOps从业人员需要了解和关注的资料你可以参考一下。
需要强调的是,有针对性地精读一本好书的一部分内容,要比泛泛地读好几本书要更有收获一些,也就是“**贵精不贵多”,先定下一个小目标,然后沉下心来反复地学习实践,这个道理在大多数领域都是适用的**。
## 一份报告
如果说DevOps领域有行业公认的权威资料的话DevOps状态报告自然是不二之选。
从2014年开始这份报告每年发布一次主要编写方也经历了好几次变迁从最开始的Puppet实验室、IT Revolution到DORADevOps Research &amp; Assessment的加入再到去年DORA和Puppet分家两边各自推出了自己的DevOps状态报告。
但从影响力来说我更推荐DORA的这份报告从去年开始这份报告正式改名为加速度DevOps状态报告。
提到DORA你可能不太熟悉但是如果说到DORA的两位核心创始人Nicole博士和Jez Humble相信你一定有所耳闻他们也是我今天推荐的一些书的作者。
有意思的是去年DORA宣布加入谷歌其主要成员也被谷歌云收编比如Jez Humble目前就是谷歌云的技术布道师。
回到报告本身我在2017年就开始进行报告的本地化工作。从近两年来看报告的体量在持续扩大比如今年的报告洋洋洒洒有80页内容而且是全英文的。
那么,关于这份报告,重点是要看什么呢?纵观过去几年的报告模式,我给你画个重点:**核心是看趋势、看模型和看实践**。
**首先看趋势**
每年的报告都会有一些核心发现这些发现代表了DevOps行业的发展趋势。比如今年的报告就指出云计算能力的使用依然是高效能组织和中低效能组织的分水岭所以如果公司还在纠结是否要上云不妨从DevOps的角度思考一下使用云计算能力带给交付能力的提升可以有多明显。
另外公司内的DevOps组织比例也从2014年的14%提升到了今年的27%。由此可见越来越多的公司在拥抱DevOps至少从组织层面可以看到越来越多带有DevOps职责或者是以DevOps命名的团队出现。这对于公司内部职责的划分和团队架构演进具有一定的指导意义。
当然不得不提的还有衡量DevOps实施效果的4个核心指标也就是**变更前置时间、部署频率、变更失败率和故障修复时长**。
从2014年的第一份报告开始每年的报告都在对比这4个核心指标在不同效能团队之间的变化和差异。实际上就我观察国内很多公司的DevOps度量体系都深受这些指标的影响或多或少都有它们的影子。
可以说这4个指标已经成为了衡量DevOps效果的事实标准甚至有人直接把指标拿给老板看“你看高效能组织比低效能组织的故障恢复时长要快2000倍由此可以证明DevOps是势在必行的。”
我个人觉得,没有必要纠结于数字本身,这东西吧,看看就好,更多的还是要透过数据看趋势。
比如,去年的指标数据就显示,在交付能力方面,不同组织间的差距在缩小,相应的质量维度的指标差异却在拉大。这就说明,通过初期的自动化能力建设,团队可以快速地提升交付水平。但是,由于缺少质量能力的配套,很容易产生更多的问题,这就带来一个警示,在快速提升交付能力的同时,质量建设也不能落在后面。
<img src="https://static001.geekbang.org/resource/image/79/ac/79665c64da0a9ccab7f0244c5e59eeac.png" alt="">
**关于报告,其次是看模型**
我在[第4讲](https://time.geekbang.org/column/article/148878)中提到过一个观点:**任何技术的走向成熟,都是以模型和框架的稳定为标志的**。因为当技术跨越初期的鸿沟,在面对广大的受众时,如果没有一套模型和框架来帮助大众快速跟上节奏,找准方向,是难以大规模推广和健康发展的。
在软件开发领域是这样,在其他行业也是如此,要不然,为啥会有那么多国标存在呢?所以说,模型和框架的建立是从无序到有序的分水岭。
在今年的状态报告中,研发效能模型进一步细化为软件交付运维模型和生产力模型。今天我不会深入解析模型本身,但我会在专栏后面的内容中结合实际案例进行详细解释,从而帮助你更好地理解。
但是从过往的报告可以看出每一年关于模型的进化是整个报告的核心内容报告也在不断覆盖新的领域试图更加全面地揭示影响软件开发效能的核心要素。在实践DevOps的时候你可以参考这个能力模型识别当前的瓶颈点在遇到拿捏不准的决策时也可以参考模型中要素的影响关系。
比如,公司内部经常会争论是否需要更加严格的审批流程,希望借助严格的审批流程,促使软件交付更加有序和可靠。很多系统和需求在提出的时候,都是以这种思想为指导的。我一直对这种流程的有效性抱有怀疑,加入更多的领导审批环节,除了出问题的时候大家一起“背锅”之外,并没有带来什么增值活动。
在今年的模型中,这种观点得到了印证。**重流程管控不利于软件交付效能的提升,轻流程管控也不会影响软件交付质量,关键要看公司是否选择一种“更好”的做法来实现管控的目的**。
<img src="https://static001.geekbang.org/resource/image/c8/63/c87bd960e6743511dae31617f99e0c63.png" alt="">
最后,我们要重点关注**实践**。
在实施DevOps的时候经常会有这样的困扰道理都懂却仍然做不好DevOps。所以DevOps落地的核心无外乎实践和文化而实践又是看得见摸得着的这一点当然值得关注。在状态报告中有很大篇幅都在介绍实践部分这些实践都是在大多数公司实施总结出来的并且得到了实际的验证具有很强的参考性。
比如今年的报告重点介绍了技术债务、灾难恢复测试和变更管理流程这几个方面的实践这些都是企业实施DevOps时的必经之路。
比如灾难恢复测试,很多公司都有非常详尽的文档,但是如果找他们要操作记录,他们却又很难拿出来。
我之前就见过一家国内Top的公司说是在做关键数据的备份但实际去看才发现这个备份任务已经很长时间处于失败状态了。
如果有定期的灾难恢复测试,类似的这种问题是一定可以发现的。而**往往在灾难发生的时候,才能体现一家公司的工程能力水平**。
比如Netflix正是因为混沌工程才没有受到AWS云服务down机的影响这和日常的演练是密不可分的。
从2014年至今的DevOps状态报告的中英文版本我已经收集并整理好了你可以点击[网盘](https://pan.baidu.com/s/1W7-_et-wulD7AueBU2KTow)链接获取提取码是mgl1。
## 几本好书
讲完了报告,接下来,我再给你推荐几本好书。
**1.《[持续交付](https://item.jd.com/1027475074.html)》&amp;《[持续交付2.0](https://item.jd.com/12512514.html)》**
谈到DevOps里面的工程实践持续交付可以说是软件工程实践的终极目标。对于在企业内部推进DevOps工程能力建设的人来说这两本书可以说是案头必备常看常新。
对我自己来说因为2011年机缘巧合地拿到了第一版第一次印刷的《持续交付》这本书我的职业生涯彻底改变了。因为我第一次发现原来软件交付领域有这么多门道。帮助组织提升交付效率这个事情真是大有可为。
《持续交付》围绕着软件交付的原则,给出了一系列的思想、方法和实践,核心在于:**以一种可持续的方式,安全快速地把你的变更(特性、配置、缺陷、试验),交付到生产环境上,让用户使用**。你可以参考一下软件交付的8大原则。
- 为软件交付创建一个可重复且可靠的过程
- 将几乎所有事情自动化
- 将一切纳入版本控制
- 频繁地做痛苦的事情
- 内建质量
- DONE意味着已发布
- 交付过程是每个成员的责任
- 持续改进
很多人都有《持续交付》这本书,但我敢打赌,真正能沉下心来把这本书看透的人并不多,因为这本书里面通篇都是文字,而且有些难懂,如果没有相关的实践背景,基本上就跟看天书差不多了。
所以,通读《持续交付》并不是一个好的选择,我建议你**尽量带着问题有选择性地去读**。
到了《持续交付2.0》乔梁老师创新性地将精益创业的思想和《持续交付》结合起来更加强调IT和业务间的快速闭环也更加适应当今DevOps的发展潮流。
另外,乔梁老师的文笔更加流畅,读起来更加轻松,他会结合案例进行说明,对于实际操作的指导性也更强。毫无疑问,他是国内软件工程领域的集大成者。
如果你对软件开发流程的工程实践不太了解,你可以读一读这两本书。
当然,对于开发、测试、运维人员这些软件交付过程中必不可少的角色来说,也可以用来拓展知识领域。
**2.《[精益创业](https://item.jd.com/11055746.html)》&amp;《[Scrum精髓](https://item.jd.com/11462889.html)》&amp;《[精益产品开发](https://item.jd.com/12132997.html)》&amp;《[精益开发与看板方法](https://item.jd.com/11862173.html)》**
关于管理实践和精益方面我给你推荐4本书。
《精益创业》提出的MVP最小可行产品思想已经被很多的企业奉为圭臬。它的核心是只有经过真实市场和用户的验证想法才是真正有效的产品需要在不断的验证和反馈过程中持续学习持续迭代而不是试图一步到位耗尽所有资源从而失去了回旋的余地。
《Scrum精髓》适合于使用Scrum框架的敏捷团队学习和实践以避免Scrum实施过程中形似而不神似的问题。同时这也是立志成为Scrum Master的同学的红宝书。
《精益产品开发》是何勉老师在2017年出版的一本基于精益思想和精益看板方法的著作。在精益软件开发领域这本书和李智桦老师的《精益看板方法》都是看一本就够了的好书。
这几本书比较适合想要了解敏捷或者是在实际工作中践行敏捷开发方法的同学阅读。另外精益思想可以说是DevOps的理论源泉很多的文化导向以及持续改进类工作都跟精益思想有密切的关系。
**3.《[DevOps实践指南](https://item.jd.com/12350780.html)》&amp;《[Accelerate加速](https://item.jd.com/29263749137.html)》**
如果你想了解DevOps的全貌以及核心理论体系和实践《DevOps实践指南》和《Accelerate加速》就是最好的选择了。这两本书的作者都是DevOps行业内的领军人物作为Thought Leader他们引领的DevOps的体系在不断向前演进。
其中《DevOps实践指南》也就是俗称的Handbook重点介绍了DevOps实践的三步工作法还包含了大量DevOps实施过程中的参考案例。而《Accelerate加速》的作者就是DevOps状态报告的作者。他在这本书中揭示了状态报告背后的科学方法并提出了DevOps能力成长模型以帮助你全面提升软件交付能力。
**4.《[凤凰项目](https://item.jd.com/11789836.html)》&amp;《[人月神话](https://item.jd.com/12401749.html)》&amp;《[目标](https://item.jd.com/12610010.html)》**
最后,我想再推荐三本小说,这也是我读过的非常耐看的几本书了。
其中《凤凰项目》提出的DevOps三步工作法和《DevOps实践指南》一脉相承《人月神话》是IT行业非常经典的图书畅销40余年《目标》则是约束理论的提出者高德拉特的经典著作他所提出的改进五步法构成了现代持续改进的基础。
## 大会,网站和博客
当然报告和书只是DevOps资源中的一小部分还有很多信息来源于大会、网站和博客我挑选了一些优质资源分享给你。
- [DEOS](https://events.itrevolution.com) DevOps国际峰会以案例总结著称
- [DevOpsDays](https://devopsdays.org/)大名鼎鼎的DevOpsDays社区
- [TheNewStack](https://thenewstack.io/) :综合性网站,盛产高质量的电子书;
- [DevOps.com](https://devops.com/) :综合性网站;
- [DZone](https://dzone.com) 综合性网站,盛产高质量的电子书;
- [Azure DevOps](https://devblogs.microsoft.com/devops/):综合性网站,盛产高质量的电子书;
- [Martin Fowler](https://www.martinfowler.com/bliki/) Martin Fowler的博客
- [CloudBees Devops](https://www.cloudbees.com/devops) Jenkins背后的公司的博客。
在这些资源中,有一些值得你重点关注一下。
比如Gene Kim发起的DOESDevOps企业峰会就是获取实践案例的绝佳场地而DZone和NewStack经常会推出免费的电子书和报告也值得订阅Martin Fowler的博客每一篇内容都是精品对于很多技术细节可以说是起到了正本清源的作用值得好好品味。
说了这么多,最后我还想再花一点点时间,跟你聊聊学习这个事情。我跟你分享一幅美国学者爱德加·戴尔提出的学习金字塔模型图,这个模型也是目前比较有参考性的模型之一。
<img src="https://static001.geekbang.org/resource/image/f2/d6/f2de4f052d1c4e90d5caf3e5f863bfd6.jpeg" alt="">
>
图片来源:[https://www.businessdirect.bt.com/](https://www.businessdirect.bt.com/)
在这个模型中,学习的方式分为两种,一种是主动学习,一种是被动学习。其实,无论是读书,看视频,还是听专栏,都属于是被动式的学习,最终收获的知识可能只有输入信息的一半儿,这还是在记性比较好的情况下。大多数时候,看得越多,忘得越多,这并不是一种特别有效的学习方式。
实际上对于DevOps这种理念实践、技术文化、硬技能、软实力交织在一起的内容来说主动学习的方式是不可或缺的比如**案例讨论,线下交流,在实践中学习**等。
所以希望你能多思考多总结结合工作中的实际问题摸索着给出答案并积极分享跟大家讨论。只有主动思考才能消化吸收最终总结沉淀出一套自己的DevOps体系认知。
## 总结讨论
好了今天我跟你聊了DevOps的学习资料包括状态报告、书籍和大会、网站、博客。不过对于DevOps来说这些也仅仅是点到为止。
我想请你来聊一聊你自己在学习和实践DevOps的过程中有没有私藏的干货和渠道呢如果有的话希望你可以分享出来我们共建一个DevOps相关的资源库并在GitHub上进行开源维护从而帮助更多人了解和学习DevOps。
欢迎在留言区写下你的思考和答案,我们一起讨论,共同学习进步。如果你觉得这篇文章对你有所帮助,欢迎你把文章分享给你的朋友。

View File

@@ -0,0 +1,120 @@
<audio id="audio" title="特别放送(二)| 成为DevOps工程师的必备技能" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/64/51/648ba3c530957179fd48d8275be09751.mp3"></audio>
你好我是石雪峰。在上一讲我介绍了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”的缩写这其实也是我们团队对自己的一种激励。在日常的开发过程中我们会不断发现和总结更好的实现方式在内部分享互相学习从而持续提升代码能力。我截取了一部分我们最近优化流水线脚本的经验总结你可以参考一下。其实每个人都能总结出自己的代码心经。
<img src="https://static001.geekbang.org/resource/image/91/0b/9124fd4c7ef664ba04af700faca06e0b.jpg" alt="">
**2.自动化能力**
在自动化方面你首先需要对CI/CD也就是持续集成和持续交付建立起比较全面的认知。因为CI/CD可以说是DevOps工程领域的核心实践目前大部分公司都在集中建设软件的持续交付能力尤其是以流水线为代表的持续交付平台很多时候就同DevOps平台划上了等号。
接下来为了实现全流程的自动化你需要能够熟练使用CI/CD各个关键节点上的典型工具并且了解它们的设计思路。
一方面目前很多公司都在拥抱开源参与开源开源工具自身的成熟度也非常高并且逐渐取代商业工具成为了主流方案。通过直接使用开源工具或者基于开源工具进行二次开发也是自动化领域投入产出比最高的方式。所以像版本控制工具Git、代码托管平台Gitlab、CI工具Jenkins、代码扫描工具Sonar、自动化配置管理Ansible、容器领域的Docker、K8S等等这些高频使用的工具都是你优先学习的目标。
另一方面,**无论是开源工具,还是自研工具,工具与工具之间的链路打通也是自动化的重要因素**。所以在理解开源工具的实现方式的基础上就要能做到进可攻退可守。无论是封装还是自研有了工具的加持CI/CD也会更加游刃有余。
关于DevOps的工具图谱我跟你分享一个信通院的DevOps能力成熟度模型版本供你参考。值得注意的是**工具不在多,而在精**。其实,工具的设计思路和理念有共通之处,只要精通单个节点上的工具,就可以做到以点带面。
<img src="https://static001.geekbang.org/resource/image/91/bd/91b7d3327892002d68029c7817fe06bd.png" alt="">
**3.IT基础能力**
我始终认为运维是个特别值得尊敬的工种也是DevOps诞生的原点。如果你不是运维出身那你要重点掌握运维的基础概念最起码要了解**Linux操作系统方面的基础知识**,包括一些**常用的系统命令使用**,以及**网络基础和路由协议**等。毕竟对于开发者来说他们通常习惯基于IDE集成开发环境图形界面工作。比如如果问一个iOS开发同学怎么通过命令行的方式进行构建调试或者如何用代码的方式实现工程的自动化配置他可能就答不上来了。
另外,随着基础设施即代码的技术不断成熟,你还要能看懂环境的配置信息,应用自动化构建、运行和部署的方式等,甚至可以自行修改环境和应用配置,这样才能实现所谓的开发自运维。虽然在大多数公司,运维的专业能力一般都会通过运维平台对外提供服务,但对于基础概念,还是需要既知其然,也知其所以然。
**4.容器云能力**
云计算对于软件开发和部署所带来的变化是革命性的。未来企业上云或者基于云平台的软件开发会慢慢成为主流。而容器技术又天生适合DevOpsKubernetes可以说是云时代的Linux基于它所建立的一整套生态环境为应用云化带来了极大的便利。
所以无论是容器技术的代表Docker还是实际上的容器编排标准Kubernetes你也同样需要熟悉和掌握。尤其是在云时代基于容器技术的应用开发和部署方式都是DevOps工程师必须了解的。
**5.业务和流程能力**
在任何时候DevOps的目标都是服务于业务目标DevOps本身也从来不是墨守成规的方式而是代表了一种变革的力量。所以加强对业务的理解有助于识别出DevOps改进的重点方向而流程化的思维建设有助于突破单点放眼全局。
很多时候,**企业需要的不仅仅是一个工具,而是工具所关联的一整套解决方案,其中最重要的就是业务流程**。
对于DevOps工程师来说**要有能力发现当前流程中的瓶颈点,并且知道一个更加优化的流程应该是怎样的**,这一点也是制约工程师进一步拓展能力的瓶颈之一。
举个例子对于开发DevOps平台工具来说你可能认为最合适承担的团队就是开发团队因为他们的代码能力最强。但是实际上DevOps平台的设计很多时候都是由最熟悉企业内部研发流程的团队来主导的。正因为DevOps工程师的工作应该同业务紧密联系更加关注于全局交付视角所以很多时候配置管理、质量管理、项目管理和技术运维团队更多地在承担相近的角色。**毕竟,只有方向正确,所做的一切才是加法。**
<img src="https://static001.geekbang.org/resource/image/df/d2/df7819fcd4372b837317754a4c72c9d2.png" alt="">
## 学习路径
那么要想成为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核心能力的建议。为了方便你复习和理解我画了一张脑图把这两讲内容进行了汇总你可以参考一下。
<img src="https://static001.geekbang.org/resource/image/48/07/48de933119e78f7f94cd2abe91073d07.png" alt="">
最后我想强调的是就像DevOps没有明确的定义一样DevOps工程师的技能也没有明确的限定所以你要时刻保持好奇心持续学习总结出自己的能力体系并在实践积累经验这样才能在激烈的竞争中占得先机。
## 思考题
针对我们这两讲的内容,你觉得自己需要提升哪方面的能力呢?你有哪些快速提升能力的小窍门吗?
欢迎在留言区写下你的思考和答案,我们一起讨论,共同学习进步。如果你觉得这篇文章对你有所帮助,欢迎你把文章分享给你的朋友。

View File

@@ -0,0 +1,152 @@
<audio id="audio" title="特别放送(五)| 关于DevOps组织和文化的那些趣事儿" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/d8/ee/d81e325d77022ec265531c388f549fee.mp3"></audio>
你好我是石雪峰今天又到了特别放送环节。写到这儿专栏已经接近尾声了我想再跟你聊聊DevOps的组织和文化。
DevOps文化好像是一个矛盾结合体一方面文化这种东西似乎只可意会不可言传另一方面文化对DevOps实践的重要性又是毋庸置疑的。
在各种行业大会上,关于文化的议题总是屈指可数。原因也很简单,关于文化,一般都说不明白,即便能说明白,也改变不了什么。因为文化的改变可不是像引入一个工具那么简单,很多时候都需要思想上的转变。
谈到DevOps文化我想到去年我和几个朋友一起组织《DevOps实践指南》的拆书帮活动。这个活动就是通过连续几周的线上分享我们帮助大家总结提炼书中的核心知识。
在分享的过程中有这样一件事我印象特别深刻。事情的起源是原书的第14章中有这样一段描述
>
团队在客户面前没有任何需要隐藏的,对自己也同样如此。与其把影响线上系统的问题视为一种秘密,不如尽可能地将它透明化,主动将内部的问题广而告之给外部用户。
某大型公司的IT负责人刚好负责分享这个章节他表示为了尊重原文他保留了这段描述但是在国内的环境下这并不现实。即便是他自己一个坚定的DevOps实践者也很难做到这种程度。因为如果把公司内部的问题通通开放给客户那估计转天就可以收拾东西回家了。
也正因为公司一般不会在第一时间对外公布故障,所以也难怪,这些事情基本都是通过“云头条”这类公众号第一时间公布出来的。
但是,似乎大家的记忆力也都不太好,很多时候,这些事情过去了也就不了了之了,除了听说“谁又背锅了,谁又被牵连了“之类的流言蜚语之外,也没有什么特别之处。
这也可以理解,毕竟家丑不可外扬,内部吐吐槽也就罢了,如果凡事都到外面去宣传,那公司岂不是形象全无?更有甚者,还会影响用户对公司的信心。你想,如果天天就你问题最多,那谁还敢用你的服务呢?
我们都知道DevOps文化的几个关键词**协作**、**分享共担**、**无指责文化**、**在错误中学习**……这些道理大家都懂,但真正遇到问题、需要平衡不同部门利益的时候,是否还能以这些文化为准则,来指导行为模式,就是另外一码事了。
说白了如果想看团队是否具备DevOps文化与嘴上说说相比更重要的是看怎么做。所以今天我给你分享几个故事看看在面对同样的问题时其他公司是怎么做的并思考一下为什么这样是一种更好的做法
## GitLab删库的故事
时间回到2017年1月31日全球最大的代码托管协作平台之一的GitLab出现了一次长达18小时的停机事故原因居然是一个IT工程师把生产数据库的数据给清空了。
由于遇到了爬虫攻击主备数据库之间的同步延迟已经超过了WAL的记录上限导致数据同步无法完成。当时遇到这种问题的操作就是移除所有备份数据库上的数据记录然后全量触发一次新的同步。但是由于数据库配置并发数和连接数等一系列的配置问题导致数据库的数据备份一直失败。
这个时候时间已经来到了标准国际时间的晚上11点半。由于时差的关系对于身在荷兰的工程师来说这时已经是深夜1点半了。当值工程师认为有可能是之前失败的同步遗留的数据导致的数据库备份失败所以决定再一次手动清空备份服务器的数据。
但是,也许是由于疏忽,他并没有意识到,当时他操作的是**生产数据库**。几秒钟后当他回过神来取消操作的时候一切都已经来不及了。最终的结果是总共有超过300G的线上数据丢失直接导致了服务进入恢复模式。
按道理说这种事情虽然难以接受但其实并不少见。更加严重的是当GitLab尝试恢复数据的时候才发现他们所谓的“精心设计”的多重备份机制竟然都无法拯救被删除的数据。
最夸张的是,直到这会儿,他们才发现,由于升级后工具版本不匹配,数据库的定时备份一直处于失败状态。他们原以为邮件会告警这个问题,但巧合再一次出现,针对自动任务的报警也没有生效。
事已至此,要么是隐藏事实,然后给外界一个不疼不痒的解释,要么就是把问题完全公开,甚至是具体到每一个细节,你会选择怎么处理呢?
GitLab公司的选择是后者。他们第一时间将系统离线并将事件的所有细节和分析过程记录在一个公开的谷歌文档中。不仅如此他们还在世界上最大的视频网站YouTube上对恢复过程进行全程直播。
考虑到有些用户不看YouTube他们还在Twitter上同步更新问题状态硬生生地将一场事故变成了一个热门话题。当时同时在线观看直播的用户超过5000人甚至一度冲到了热门榜的第二位。
除此之外在几天后公司的CEO亲自给出了一篇长达4000字的问题回溯记录包含问题发生的背景、时间线、核心原因分析针对每一种备份机制的说明以及将近20条后续改进事项由此获取了用户的信任和认可。可以说在这一点上他们真的做到了透明、公开和坦诚相待并且做到了极致。
>
问题回溯的资料: [https://about.gitlab.com/2017/02/10/postmortem-of-database-outage-of-january-31/](https://about.gitlab.com/2017/02/10/postmortem-of-database-outage-of-january-31/)
至于那位倒霉的工程师的结果,估计你也听说了,对他的惩罚就是强迫他看了几十分钟的《彩虹猫》动画。说实话,这个动画有点无聊。但是,如果这种事情发生在咱们身边,估计直接就被开掉了。我知道你肯定好奇这个《彩虹猫》到底是个啥动画片,我也特别无聊地找来看了下,如下所示:
<img src="https://static001.geekbang.org/resource/image/86/c1/86a033098638db7244c2ec6f661808c1.png" alt="">
从此以后GitLab的开放越发“变本加厉”。现在你可以在任何时间去查看服务的实时状态包括每一次过往的事故分析。同时名叫“GitLab状态”的Twitter账号实时更新当前的问题目标就是在任何用户发现问题之前尽量主动地将问题暴露出来至今已经发布了将近6000条问题。
同时你还可以查看GitLab服务的详细监控视图和监控数据包括GitLab的运维标准手册、备份脚本。这些通通都是对外开放的。只要你想用你就可以直接拿来使用如果你觉得哪里不靠谱也可以直接提交改动给他们。我提取了一些截图和地址你可以参考一下。
1.GitLab状态Twitter[https://twitter.com/gitlabstatus](https://twitter.com/gitlabstatus%5Breference_end%5D)
<img src="https://static001.geekbang.org/resource/image/cb/7f/cba011cebb4cdf8318772bf04bd95d7f.png" alt="">
2.GitLab状态网页[https://status.gitlab.com/](https://status.gitlab.com/%5Breference_end%5D)
<img src="https://static001.geekbang.org/resource/image/7d/50/7d5909f0a8c2c6e7903aa0a7fddfcf50.png" alt="">
3.GitLab内部监控大屏[https://dashboards.gitlab.com/](https://dashboards.gitlab.com/%5Breference_end%5D)
>
<img src="https://static001.geekbang.org/resource/image/4c/6c/4c79b3a2c797cc0e2651dd9a53216a6c.png" alt="">
这并不是GitLab公司发疯了实际上开放已经成为了主流公司的标配。比如在GitHub上你同样可以看到类似的信息。
<img src="https://static001.geekbang.org/resource/image/69/fc/69c4413d897ca9bd82747580c51092fc.png" alt="">
故事讲到这儿,就可以告一段落了。**面对事故的态度,很大程度上体现了公司的文化**。
首先,就是**在错误中学习**。
GitLab的分析报告不仅是对问题本身的描述很大程度上也是希望把他们的经验尤其是修复过程中的经验分享出来通过错误来积累经验改善现有的流程和工具从而彻底地避免类似问题的出现。
每个人、每个公司都会犯错,**对错误的态度和重视程度,决定了成长的高度**。所以,假如说我要去一家公司面试,面试官问我有没有问题,那我非常关心的一定是他们公司对错误的态度,以及具体的实际行动。
另外,就是**建立信任和及时反馈,公开透明是关键**。这不仅是对外部用户而言的,对内部协作的部门和组织来说,也是这样。因为只有充分的透明,才能赢得对方的信任,很多事情才有得聊,否则,建立协作、责任共担的文化,就成了一句空谈。
在开始建立DevOps文化的时候你首先要明白上下游所需要的信息是否能够自主简单、随时地获取到如果不能的话这就是一个很好的潜在改进事项。
## Etsy三只袖子毛衣的故事
Etsy是美国的一家手工艺电商平台从2015年上市以来它的市值一度接近80亿美元。当然除了快速增长的市值以外最为人称道的就是它们的DevOps能力而它们的案例也大量出现在了《DevOps实践指南》一书中。
那么,为什么这个名不见经传的公司能够做到这种程度呢?实际上,通过一件小事,我们就能看出来原因。
你可能不知道的是,一家在线电子商务公司每日浏览频率最高的单体页面不是首页,也不是具体哪个商品的页面,而是**网站的不可用页面**也就是我们习惯说的502页面。有些公司甚至为了提升502页面的用户体验利用好这部分流量在502页面做了很多文章比如把502页面作为一个产品推广的阵地等。
当Etsy的网站不可用的时候你看到的是一个小姑娘在织毛衣的画面而这个毛衣竟然有三只袖子。
<img src="https://static001.geekbang.org/resource/image/48/51/48b597fce55138868119d2fb55dea751.png" alt="">
实际上“三只袖子的毛衣”代表了Etsy对于错误的态度。我们都知道一件毛衣应该只有两只袖子这是常识。如果有人真的织出来第三只袖子我们的第一反应就是觉得这很可笑这只是个人的问题却很少去想他为什么会做这种反常识的事情背后的根因是什么。
但是Etsy公司却不是这样的。在每年的年终总结大会上公司都会颁发各种奖项其中一个奖项的奖品就是“三只袖子的毛衣”获奖者是公司年度引入最大问题的个人。
这是因为,在他们看来,**犯错误并不是什么大不了的事情。错误本身并不是个人的问题,而是公司系统和制度的问题,正因为有了这样的错误,才给了公司改进和成长的空间**。从某种意义上说,这也是一种贡献。
当然,除了制造噱头之外,通过这种行为,其实公司想表达的是它们对文化的偏好,也就是要**建立一种心理安全**、**快速变化**、**及时反馈**、**鼓励创新的文化**,由此来激发整个团队的士气和战斗力。
无独有偶2019年的DevOps状态报告也特别指出**心理安全的文化氛围,有助于团队生产力的提升**。更重要的是状态报告还把它作为一条重要能力放入了DevOps能力模型之中。
因为只有当员工感受到心理安全时才会把注意力集中在解决问题和快速完成工作上而不是花费大量的时间用于互相攻击和部门政治。在跨部门寻求合作的时候才会思考如何让组织的价值最大化而不是想“谁过来动了我的奶酪我要如何制造更高的门槛来保护自己的利益”。对于DevOps这种注重协作的研发模式来说这一点真的太重要了。
## Netflix招聘成年人的故事
美国硅谷聚集了世界上大多数精英的IT公司但是精英中的精英就是FAANG也就是Facebook、Apple、Amazon、Netflix和Google这五家公司的首字母简称这五家公司基本引领了硅谷技术的风向标。大多数人对其中的4家公司都非常熟悉但是对Netflix却知之甚少。那么这家公司凭啥能跻身为精英中的精英呢
如果我告诉你在Netflix每个工程师不仅拿着数一数二的薪水还可以自己决定什么时候休假爱休多长时间就休多长时间而且报销不需要经过审批填多少就报多少。另外即便只加入公司一天就离职了公司给予的补偿也足够他们活上一年半载。
看到这里,你是不是觉得这家公司的老板疯了呢?
这个叫作里德·哈斯廷斯的人还真没疯。我所说的这一切背后的原因都被记录在了《奈飞文化手册》一书中这也是号称硅谷最重要的文件的作者在离开Netflix之后写的一本阐述Netflix文化的书。
Netflix认为**与其建立种种流程来约束员工,不如砍掉所有不必要的流程,给员工一个自由发挥自我价值的空间**。因为,把所有员工都视为一个成年人是他们的行为准则。**作为一个成年人,你应该能够为自己的行为负责,同时为公司的发展负责,由此做出最好的选择,并付出最大的努力**。
正是这种开放的氛围使得Netflix至今开源了171个项目和插件。其中像混沌工程的鼻祖混乱猴子[Chaos Monkey](https://github.com/Netflix/chaosmonkey))、断路器工具[Hystrix](https://github.com/Netflix/Hystrix)、服务注册工具[Eureka](https://github.com/Netflix/eureka)、部署工具[Spinnaker](https://www.spinnaker.io/) 都是DevOps领域最为著名的开源工具。
**开源为先的共享精神**正在成为越来越多的公司重视开源的动力之一。让真正优秀的人做有价值的事情而不是让他们整日为复杂的流程、公司的内部政治和无意义的工作所影响他们才能发挥最大的价值。对DevOps来说也是如此。
## 总结
说到这儿三个故事已经讲完了。我们来总结一下在DevOps文化中最为知名的几点内容
1. 建立免责的文化,并在错误中学习;
1. 通过对外开放透明,建立信任,促进协作;
1. 打造心理安全的氛围,鼓励创新;
1. 开源为先的共享精神。
改变企业文化绝不是一个人、一句话的事情管理层的认同和导向非常重要。但是我们并不能期望每家公司都能成为FAANG一样的硅谷巨头。所以从我做起从力所能及的范围做起别觉得文化跟自己没有关系这才是最重要的。
最后,希望你看完这一讲以后,可以重新审视一下,团队内部是否建立了正向的错误回溯机制?是否鼓励内部分享和创新?是否和上下游之间做到了开放和协作为先?是否在身体力行地减少重复建设?
## 思考题
你对今天的哪些内容印象最深刻呢你又有哪些跟DevOps文化相关的故事可以拿来分享呢
欢迎在留言区写下你的思考和答案,我们一起讨论,共同学习进步。如果你觉得这篇文章对你有所帮助,也欢迎你把文章分享给你的朋友。

View File

@@ -0,0 +1,99 @@
<audio id="audio" title="特别放送(四)| Jenkins产品经理是如何设计产品的" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f4/ca/f413fa247e11f3545a5ed38cc92d65ca.mp3"></audio>
你好,我是石雪峰。这是一期临时增加的特别放送。
前两天我去葡萄牙里斯本参加了2019年的DevOps World | Jenkins World大会。这是一年一度的社区聚会参会人会围绕Jenkins和DevOps展开为期3天的密集交流信息量非常大。很多新技术、行业趋势、产品设计思路都在大会上涌现了出来我觉得非常有价值也很有必要整理出来分享给你。
2019年是Jenkins诞生15周年对于任何一个软件来说15年都不是一个短暂的时间。在这个时间点社区也在展望过去15年来的Jenkins发展历程并憧憬下一个15年Jenkins的变化。
可以说从DevOps产品的角度来说Jenkins本身就是一个非常出色的典型案例。
最开始这是一个由于Jenkins创始人KK无法忍受同事天天导致编译失败而开发的一个人项目。到今天这个项目已经有将近900名或全职、或兼职的贡献者26万多个Master节点超过3000万个任务了。这些数字还仅仅是官方可以统计到的部分如果再加上企业内网、个人电脑上的实例那就更加不计其数了。
今年我印象最深刻的是Jenkins创始人KK并没有在主会场上讲太多的产品细节、设计思路、发展方向等而是仅仅用了10多分钟回顾了自己的心路历程。在演讲的最后他将舞台交给了一位Jenkins产品经理。这位产品经理是何方神圣呢为什么是一位产品经理来讲这些内容呢这激起了我极大的好奇心。
一直以来KK都被视为Jenkins的头号产品经理。的确技术专家兼产品经理是比较普遍的一个现象。这是因为与普通面向用户的产品相比DevOps产品有几个非常鲜明的特征。
- **技术背景要求高**。因为DevOps产品要解决的很多问题都是一线的技术问题
- **面向的用户是开发人员**。这就意味着,如果你不了解开发的真实工作方式,就很难设计出开发友好的产品;
- **专业工具繁多**。产品引用到的开源组件和工具都是专业领域的内容比如Jenkins就是一个典型的持续集成系统如果你不了解Jenkins又怎么设计Jenkins呢
在几天的会议过程中针对DevOps产品经理面对的这些挑战我专门跟这位神奇的Jenkins产品经理进行了沟通。他就是Jeremy Hartley一个来自荷兰的大哥。
我先给你介绍下社区的运作方式。以Jenkins这个产品为例它背后的主要贡献者都来自于CloudBees公司。虽然这些人都属于同一个公司但实际上他们大多各自分散在家办公一年到头也见不了几次面。
比如产品经理Jeremy在荷兰创始人KK在加州基础设施的负责人Oliver在比利时K8S的插件维护者在西班牙。因此每年的FOSDEM年初的欧洲最大的开源软件大会以及年末的Jenkins World大会就成了这些世界各地的开发者汇聚到一起的难得机会。
言归正传与产品经理的积极外向、滔滔不绝的一般形象不同Jeremy可以说是一个异类。他从始至终都给人一种温文尔雅的感觉甚至在公开演讲的时候他的语气也非常平和没有太多的情绪表达只是把他和他的产品的故事娓娓道来。
Jeremy早先在一家互联网在线视频公司干了10年。他半开玩笑地说即便干了10年也不如跟腾讯合作一个项目来得出名。后来他加入XebiaLabs。这是一家专门做DevOps平台产品的公司在国内可能不是特别出名但如果提到DevOps工具元素周期图相信你肯定听说过这就是这家公司迭代更新的。
<img src="https://static001.geekbang.org/resource/image/fa/bc/fa1f9db00986532b0acc1790043178bc.png" alt="">
>
图片来源:[https://xebialabs.com/periodic-table-of-devops-tools/](https://xebialabs.com/periodic-table-of-devops-tools/)
在今年的4月份他加入了CloudBees成为了主管开源和商业版本Jenkins的高级产品经理。在跟他交流的过程中我对产品经理这部分内容的印象非常深刻。我梳理了一些要点分享给你。如果你已经是DevOps产品经理或者是立志要成为DevOps产品经理的话你一定要认真看一下。
## 一、自我颠覆
什么叫自我颠覆呢我给你举个例子。比如Jenkins的用户UI项目Blue Ocean很多人应该都知道目前这个项目的主要开发已经停止了。社区仍然会修复缺陷和安全漏洞也会接受开发者共享的PR但是不会再投入专职工程师进行开发工作了新需求也都处于无限暂停的状态。
实际上不仅仅是Blue Ocean去年Jenkins大会上星光闪耀的项目比如Five super power、Jolt in Jenkins、Evergreen等项目也都因为方向调整和人员变动而处于半终止、暂缓开发的状态。那么为什么在短短一年的时间内会有这么大的颠覆性变化呢我把这个问题抛给了Jeremy。
他的观点是,这些项目并非没有意义,但是确实没有达到项目原本的预期。对于产品经理来说,**管理预期是一项非常重要的能力**。当需求走到产品经理的时候,做哪个、不做哪个经常是个问题。团队往往会进行协商,挑选出来最有希望的项目,但这并不代表这些项目注定会成功。相反,很多想法只有做了才知道是不是靠谱,用户是不是买单。**如果使用场景有限,又没有很好的增长性,及时叫停反而是一种好的选择**。
Blue Ocean项目诞生之初可以说是让人眼前一亮充满期待甚至一度和Jenkins流水线一起被视为2.0版本的最大功能。但是几年之后,由于产品性能、插件扩展支持等种种原因,真正在企业中大规模使用的机会并不多。正因为项目没有达到预期,产品团队就决定停止这个项目。
但是与此同时全新的Jenkins用户界面项目已经被提到了日程表中。这个全新的用户界面大量借鉴了Blue Ocean的设计思路并最终通过一套用户界面取代了现有的Blue Ocean。我想正是这种不断的自我颠覆才让一个15年的软件始终保持着活力和创新力。
## 二、化繁为简
对于Jenkins这样的产品来说很多插件都是开发者提供的但是开发者往往倾向于追求功能的全面性这从很多插件的设计中就能看出来。
开发者不加筛选地把所有功能都罗列在用户面前,自然是得心应手。但是,对普通用户来说,当他第一眼看到这个复杂产品的时候,他的使用意愿就会大打折扣。
另外面对这么多的插件从表面上看用户好像有很多选择但是有些插件的名字长得差不多你并不知道哪个能用。或者有些插件适用于当前的Jenkins版本但是一旦Jenkins升级它们就无法正常使用了。但是用户在升级之前并不知道是否适配往往是在升级完成之后才会发现问题只能再进行版本回滚。类似这些插件使用中的问题都给用户带来了很大的使用障碍。
在探讨这个问题的时候Jeremy也认为**系统过于复杂有悖于产品设计的初衷**,但是,作为一个公开的平台,他们并不能约束开发者的行为,所以就需要一种方法来平衡功能的全面性和功能的易用性。
比如在重新考虑Jenkins插件生态的时候一方面产品团队会针对全新的业务场景提供官方的插件支持。举个例子在云原生开发场景下通过和云服务商深度合作提供更多的官方插件来满足典型的云服务商的使用场景。无论是对亚马逊的AWS、微软的Azure还是未来国内的主流云服务商他们都会通过这种方式来进行合作。无论你使用的开源产品还是商业产品都能通过这个项目来获得收益。
另一方面产品团队也会进一步对现有的1600多款插件进行分类并将其中的一部分插件纳入CloudBees的保障项目之下。这就意味着将由CloudBees公司来保证这类插件的兼容性和可用性。对于专业用户来说他们依然可以按照自己的方式自由地选择和开发插件而对于普通用户来说官方推荐的插件集合就足够了。
不仅仅是插件,产品的易用性体现在产品设计的方方面面。凡是阻塞用户使用的问题,都是需要优先解决的。
比如对于一个10多年的产品来说历史积累的文档数量巨大很多时候用户都无法找到真正有用的信息。所以Jenkins产品团队启动了一个文档治理的项目会重新梳理所有文档并把它们迁移到GitHub平台上。另外他们还会结合新的产品功能整理出最佳实践。比如对于流水线使用来说官方也总结了很多[最佳实践](https://support.cloudbees.com/hc/en-us/articles/230922208-Pipeline-Best-Practices)供入门者参考,你可以结合前面两讲的内容一起学习。
**要始终记得,不要让你的产品只有专家才会使用。将复杂的问题简单化,是产品经理不论何时都要思考的问题。**
## 三、退后一步
DevOps的产品经理大多是技术人员出身因此会特别容易一上来就深入细节甚至是代码实现的细节。
Jeremy同样也是程序员出身他做过很长一段时间的前端开发。当我问他“**一个好的产品应该如何平衡用户视角和实现视角**”的时候,他给我的回答是,**要尽量退后一步来看问题**。
**退后一步,就是说不要把关注点只聚焦在问题表面,而是要尽量站在旁边,以第三方的视角来全面审视问题**
他举了个Jenkins的流水线即代码的例子。在实际使用的时候流水线文件中经常会有大量的代码有时候流水线代码甚至会有上千行。代码越多系统的不稳定因素就越多测试起来也越麻烦。同时按照现有的运行机制来说很多代码都是运行在master节点上的这就给集群的master节点带来了很大压力。
要想解决这个问题从实现的角度出发就是提供一种标准化、结构化的语法格式也就是声明式流水线语法以此来降低流水线的编写难度减少流水线代码量并且让这个代码结构更加清晰。但是这些优化依然不能解决集群master节点压力过大的问题这就相当于问题只看了一部分。
退后一步来看,这就需要一种全新的视角,来提升流水线整体的隔离性。所以,产品团队目前就在设计一种新的流水线组件 **building block**,也就是构建块。
**所谓构建块,是指一整块的代码片段,而不是一条条独立的指令**。这些构建块结合到一起就可以满足一个具体场景的问题。比如Maven打包构建的场景构建块可以帮你解决环境、工具、构建命令等一系列问题。这些构建块以代码形式在子节点上运行既降低了流水线的编写难度也缓解了master节点上的压力。对用户来说使用构建块也更为简单可以直接把它放在自定义的步骤中执行。
对于产品经理来说,找到方案、解决问题自然是职责所在,但与此同时,他们往往需要同时保有两种思维,即**用户思维和实现思维**。能够在这两种思维之间自由切换,是产品经理走向成熟的标志。
## 总结
说到这儿,我来回答一下最开始的那个问题,也就是“为什么是产品经理来分享产品的规划呢?”这是因为,无论要开发一个多大还是多小的产品,都需要有这样一拨人来退后一步,找到用户的真实问题,化繁为简,实现这个功能,并不断颠覆自己,持续打磨和改进。这对于任何一个想要解决更多人问题的产品来说,都是至关重要的。
## 思考讨论
关于这次Jenkins World大会你还有什么希望进一步了解的内容吗欢迎你积极提问我会知无不言。
如果你觉得这篇文章对你有所帮助,也欢迎你把文章分享给你的朋友。