前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >陈军IIDevOps转型中的那些坑

陈军IIDevOps转型中的那些坑

作者头像
Worktile
修改2019-07-19 16:30:01
4390
修改2019-07-19 16:30:01
举报
文章被收录于专栏:Worktile
 (陈 军 —— 原腾讯高级项目经理、华为精益敏捷专家)
(陈 军 —— 原腾讯高级项目经理、华为精益敏捷专家)

DevOps是现在非常流行的一个词,很多人都在提DevOps,在往那个方向去转,但转的时候坑特别多。

现实是很理想的,大家都觉得做了DevOps之后就会非常快了,业务就会非常好了,但其实做了DevOps之后,你的业务也不一定会非常好。在很多公司内部也有共识,业务的好坏跟工程没有必然的关系,但做了总比没做好。

这是转型的J型曲线,这个曲线出现在DevOps2018的报告里,但这个曲线在很多变革当中都会出现,任何一场组织变革,DevOps也好,敏捷也好,都会经过这样的曲线,这中间有一个非常大的坑要过,经历过这个痛苦的过程之后,你的绩效会变得越来越好。

转型的时候我们希望大家有一个思考的逻辑。这个思考逻辑从上到下是Values、Principles、Methods、Tools&activities。不要一心扑到工作上,要想清楚价值是什么,采用的是什么原则,要用什么样的方法,再选择用什么样的工具跟活动。

敏捷价值观就是敏捷宣言那四句话,那四句话是我们的价值观,价值观下面有十二原则:方法(Scrum,XP,看板等)工具(故事墙等)实践活动(站会、回顾会议等),这是思考转型的逻辑,DevOps也是一样的。

DevOps里面有敏捷、精益、持续集成、持续交付 ,里面包括很多东西,你在真正解决问题的时候要得到什么样的好处,你用的是什么原则,用的是什么方法,然后再配相应的工具,这是你转型的原则。我觉得这样非常重要,如果思考不清楚就不要去用。

所以我们在做一件事情的时候,你要获得的价值是什么?这是你要思考的逻辑。

1-DevOOps是个坑

这个图大家可以看得很清楚,第一个是Dev&Ops,原来的Dev和Ops是分开的,Dev把坑丢给Ops。当我们用了DevOps之后,它还是一个坑,只不过这个坑在内部Dev和Ops一起踩了。最怕的是把这个坑丢给客户了—Oops!,所以我们这里非常重要的原则就是坑谁都不要坑客户,你不要把不好的东西给客户。

有一个团队在转型DevOps过程中出了一次事故,出了比较严重的线上问题,还好领导有意识,在转型的过程当中肯定会有坑,所以领导帮团队去承担了处分,最后处分的是领导。这个也是在DevOps转型时非常重要的点,团队一定会犯错,作为领导要帮团队创造容错氛围,不要一犯错就指责团队。但是还是要记住坑谁都不要坑客户,这是非常重要的点。

这是DevOps的模型,可以看到最底层的东西是精益管理。

精益的来源是谁?丰田!

丰田最重要的两个原则是准时生产和自働化。但这两个原则其实是冲突的,一边讲流动要快(准时生产)另一边讲出了问题要停下来(自働化),丰田要的就是不仅要快而且质量要好

最早丰田是做织布机的,把手动织布机改成了自动织布机。一开始的版本有问题,一旦织布机的线断了之后织布机不会停,跑出来的布是有问题的,因为里面的线断了,所以出来的是残次品,质量非常不好。后来丰田做了改进,一旦线断了织布机会停掉,需要人把线接起来手动启动机器再继续跑,这就是丰田注重质量的原则和方法。

建立以下游为中心而优化,做到质量内建。不能把问题留在下游,一旦这个过程出了问题,整个生产都要停下来,这是持续集成、持续交付非常重要的原则,一旦流水线出问题了,你第一时间要处理流水线,而不是提交新的代码,这是非常重要的原则。

2-技术债务拖后腿是一个坑

这是目前非常隐形的问题,虽然大家不是很在乎,但如果你的产品想长期发展,想速度越来越快,这是很重要的事情。

我们可以从漫画里看到,这两个人一直在挖坑,发现自己挖到一定程度就出不去了。我们现在就是这样,我们是在给自己挖坑,虽然看起来还觉得很快,但回过头会发现,那些坑已经填不了了。

质量分外部质量和内部质量。外部质量是用这个产品时体会到的,通常是通过测试去覆盖的,内部质量是指代码。从这个系统思考图,可以看到有很多的恶性循环。

如果外部质量差,测试信息会受到影响,测试周期会越来越长,因为不知道哪里会出问题,所以测试不放心就会跑大量的用例,这样也会影响到交付周期,交付周期很紧张了,开发压力就大了可能会尽快交代码,代码会乱写,内部质量会越来越差,这是恶性循环。

内部质量和外部质量之间的影响是有时滞的,不会那么快的反映出来,所以很多时候我们重视外部质量,但忽略了内部质量。内部质量差的时候,会发现添加功能会越来越慢。

怎么减少技术债务? 我们说衡量代码质量的唯一标准是你在做代码检视的时候每分钟说了多少个F词。我在一个关于DevOps的网站上看到一篇非常火的博文,推荐了DevOps相关的十本书。推荐的第一本书是Clean Code而不是什么DevOps handbook之类的。要把DevOps做好,基础代码质量是非常重要的事情。

怎样减少技术债务?代码的规范是非常重要的。为什么代码的规范非常重要?首先你的代码是写给人看的,其次才是写给机器的。读代码和写代码的比例时间是10:1,你的代码一定要先写给人看再写给机器。你想想如果你要看别人写的代码,你看都看不懂那要怎么改这个代码。很多的遗留代码我们不敢去改,就是因为看不懂,所以代码规范非常重要。

谷歌专门有一种人是做代码规范review的,他们内部有一个Readability(可读性)的证书,有了这个证书才能review别人的代码,而且是有权利把别人的代码打回去的。如果没有通过代码审查,是没办法提交的,谷歌做的就是这么严格,可见可读性是非常重要的事情。

规范与度量包括代码规范、代码质量度量。谷歌的code review做的非常严格,一定要通过code review才能提交代码。工具辅助包括规范检查、代码质量检查。重构这个事很重要,也是最被忽视的,《Clean Code》里的童子军规则,在出营地的时候要比进营地时的这块地更干净。如果我看了这一段代码,当我关闭这段代码的时候,一定要打扫干净它。重构不是运动,不是临时想起来就要大范围搞一下,一定是平时就要去做的习惯,看到代码不爽就要去改,但是这个改是建立在团队共识的规范的基础上。

3-团队的一个案例中的坑

某实施DevOps的团队遇到下面的问题,一开始他们采用主干开发,但是频繁提交代码集成无法保证主干的质量(主干健康度的度量),QA会经常找团队,团队觉得非常烦,慢慢他们不再那么频繁提交,做完一堆需求再一起提交。后来PM抗不住了,改变策略采用分支开发,大量的问题在集成测试时爆发,导致集成测试时间很紧。如果是你,你会怎么给他建议?

我给的建议是,其实他们采用分支开发是往后退的,在持续集成里有一个非常重要的原则,他们绕过痛苦的事情就会更痛苦,频繁提交是ok的,他们要解决的问题是怎样把主干集成度做起来,而不是往后退。当时他们也有做单元测试,但他们的单元测试是后补的,不是跟代码一起提交的,所以主干健康度比较差。他们要改变的是把单元测试和代码同时提交,一定要跑过单元测试代码才能往上提。

现在我司提交代码到主干的时候,都会有一个所谓的门禁,门禁里面要检查很多东西,包括代码、规范、质量指标、单元测试都要跑通才能提交代码。

这里面有两个,一个是机器检查,一个是Code Review,这两个都提交才可以。但不能说主干质量不好就往后退,要解决主干质量的问题,而不是往后退,所以越痛苦的事情越要经常做,越要频繁去做,痛苦的点才是你要改进的点。

让代码流动起来,并快速获得反馈。一定要小批量频繁提交代码,但提交代码是有前提的,要过门禁才行。

4-微服务是个坑

微服务也是我们现在提的比较多的东西,到底要不要做?很多人都在说。这里的理念是什么?如果你的代码是一坨shit,切成微服务就是N坨shit,是管理一坨还是N坨?你做微服务的基础是系统要比较好,微服务架构要紧的是如何正确划定边界,微不微其实不重要。我们最近有一个上海的团队,他们切了微服务尝到了一些甜头,但更痛苦的是服务间的耦合以及服务与硬件的耦合,这让他们非常痛苦,改一个地方要改好多服务。

这是Martin Fowler 2015年提出的 单体优先 。微服务本身在做的时候有很大成本,付出的成本能不能给你带来更多的收益?这是我们在做一项决策时会考虑的,就是投资回报率的问题。

Martin Fowler强调单体优先,如果一开始做微服务很多的基础设施都要跟上,这个成本蛮高,所以他提到微服务溢价的问题,要看微服务的好处能不能抵消成本。

构建演进式的架构,地球以前的大陆是在一块地,随着时间的推移和环境的变化才慢慢演进出了各个洲、各个块,我们的架构也是一样的,不一定一开始就要创建合适的架构,可以创建演进式的架构,可以在特定的时间进行转换。我们要注意几个原则,讲的都是解耦的问题。

一是将大型的域分割成变更孤岛;

二是针对可替代性进行设计。可替代性是什么?原来很多的系统跟模块不敢去改,虽然这块可能很多人没用,但我们也不敢改,因为有耦合性,我们不敢动。如果针对可替代性做服务,这个服务如果不用了,随时可以停掉,把服务直接杀死接新服务就可以了;

三是最小化共享依赖,重点关注自治和冗余,而不是重用。

5-度量是个坑

度量我们听到的最多反馈是什么?这玩意儿就是给上面看的,没什么用。没有这些指标,我咋知道下面的人干的咋样?这是我们听到最多的说法。包括有人说为了确保数据的真实性,需要加上考核指标。前一阵有人就在问我,他们公司团队是分布式的,在两地,他们想知道异地团队在干什么事,有一个IT系统,怎么确保他们更新的数据是真实的?是不是要加一些考核指标去考核他?保证他更新的数据是真实的。这些都是我们常见的对度量的误解。

有哪些度量的误区?

一是数据的生产者不是数据的消费者,数据生产者不关心数据的价值,也不关心数据准确与否。很多时候数据是给领导看的,不是给我们看的;

二是数据的生产者关心是佛会对自己带来惩罚或受益,不关心数据跟软件开发的关系。这会产生什么问题?数据造假;

三是数据等于控制,一定要看到数据才知道下面的人在干什么。

度量的意义到底是什么?我们觉得度量的意义是改进。改进在于什么?自己跟自己比,不要横向比较,每个团队都不一样,横向比较是非常痛苦的一件事情,我司是踩过坑的。度量会告诉我们离目标还有多远,现状是什么,进展如何。

这是一个度量指标的体系,非常多,大家可以参考一下。

度量是一个系统工程,需要不断演进。首先你要知道度量不是免费的,有成本,需要有效性和可靠性,我们收集的数据最好是机器产生的,而不是人去填的,这个很重要。第二个是OMTM,这是精益数据分析的概念,叫单一关键指标。选择适合当前的产品阶段的指标,重点优化该指标。最好是一段时间就优化一两个指标,不要分得太散。第三个是随时审视,做加法也要做减法,不要让度量成为团队的负担。最重要的一点,不要跟考核挂钩,不要横向比较,一旦跟考核挂钩,一旦横向比较,数据一定会造假。

6-缺乏全局视角,阻碍进一步提升是一个坑

这是DevOps三步工作法中的内容

第一步是持续流动

第二步是持续反馈

第三步是持续学习

今天我们要讲的是持续学习

这里有一个案例,数据大屏让团队拥有全局视角。我司内部看团队DevOps是否做好,就要看数据大屏是否做起来了,研发所有的数据在这个屏上都能看到。

这是一个微服务团队的数据指标,包括服务得分、服务告警、API访问次数TOP等等都有,可以根据自己的情况去做。这个用处是什么?让研发团队看到全局,知道我这个东西发出去之后有多少人在用,有没有问题,有问题要及时解决。

这是其中一个案例,这个接口原来有性能问题,在没有大屏之前,运维跟团队讲了,但没人管,大家都在做新的需求。后来有了大屏之后,这个接口平均耗时排在第一位,团队和领导都看到了,然后安排人员去优化,接口性能提升了9倍。

通过大屏数据挖掘用户潜在需求,提升满意度。这也是一个真实案例,关注运营指标,他们看到在9月份访问量突然增加,但用户数又没有变。他们进一步分析,找到用户去问,为什么这个时段的访问量这么大?后来发现是因为用户定期会有巡检,然后就挖掘了更多用户的需求。这对于开发团队来讲也是很重要的一点,很多时候东西发出去不知道用户的满意度怎样,有没有人在用,这其实是限制了开发人员的创新,软件开发不是一个体力活是一个脑力活。

最后再回顾一下这张图,我们转型的思考逻辑,首先是价值,做这个事情对我们的价值是什么?我们需要的原则是什么?我们应该用什么样的方法?对应的工具和时间活动到底是什么?

DevOps不只是工具,转型应该是更高维度的思考,自上而下。

文章转载请注明出处。

想了解更多关于研发管理、敏捷相关的知识,可登陆【Worktile敏捷博客】查看哦~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Worktile研发中心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 6-缺乏全局视角,阻碍进一步提升是一个坑
相关产品与服务
CODING DevOps
CODING DevOps 一站式研发管理平台,包括代码托管、项目管理、测试管理、持续集成、制品库等多款产品和服务,涵盖软件开发从构想到交付的一切所需,使研发团队在云端高效协同,实践敏捷开发与 DevOps,提升软件交付质量与速度。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档