首先必须要讲,这个运维之痛是有前提的:
1、频繁交付高质量的软件是研发、测试、运维的核心职责,运维并愿意承担持续改进的职责。
2、运维在交付的“最后一公里”看到了问题,并 愿意为此提出改进方案,并推动落实之。
很荣幸,自己借助优维创业的机会,很广泛的接触了传统企业,其中覆盖了多个行业,从金融到保险和证券、从物流到电力与运营商、从政府到航空等等。越深入接触,越能感受到一些词语在内心的碰撞:人肉vs平台、突破vs束缚、流程vs创新、持续改进vs责任分离等等。
很有意思的现象,当我们对中国的宏观问题不断的深入探讨的时候,最后都归结成制度的问题,那么运维之痛是否也有此类根源性?运维之痛到底是因为外部原因还是内部原因引起?运维真的只能安于现状没法突破么?
运维之痛1:人肉 vs 平台
人肉不是传统运维的当下过失,是过去的延续。在早期,运维的很多能力建立在少量的高可用硬件对象之上,平台化的需求很弱。另外,闭源的软件生态,给平台化的建设增加难度,而这些历史债务,并不是一下就能丢下的。留给传统企业的时间并不是那么充足,开放平台和业务的互联网化带来的冲击是非常大的,时间非常的短。这是一个多维冲击能力,从思维、技术、能力等多个维度。
不过很开心的是,传统企业运维人对运维平台拥抱非常强烈,从运维自身能力自动化到全流程的持续交付自动化。我也经过和传统企业的IT部门深入广泛接触,大家对运维自动化作为突破口非常认可,更愿意以此为原点,单点突破,再全面覆盖。
运维之痛2:流程 vs 创新
很多人会告诉我,在传统企业中没办法,我们必须通过流程来驱动各个组织角色,确保协同工作。真的如此么?我们在腾讯维护那么多产品线,没有流程怎么做到的?然后真的会混乱不堪么?我和我之前的运维团队来说,如果你不能保持一个对外的简单清晰运维界面,那就是我们工作的失职。
流程是我们找不到解决方案的时候,添加的累赘!很荣幸,我了解的传统企业中,给我上了一趟生动的流程课,此处和大家分享一下。
场景1:服务上线申请
我们都知道根据TOGAF框架,企业中分业务架构、数据架构、技术架构和基础架构中,你仔细去看看定义,非常的完美。但我觉得这种集中式的垂直划分,就是问题所在,谁能做到全局的架构设计,特别是面向应用端的系统设计。这个时候问题来了,一个研发有个业务上线,首先找到了基础架构组要服务资源,基础架构组和研发说,你要和业务、数据架构组先评估一下数据需要,和技术架构评估一下技术架构要求才能确定基础的资源需求。真要如此复杂么?其实就是一个业务上线而已,我们评估了那么多的业务容量,就那么几个指标而已,访问量、读写、热点集中度、数据量大小等等,基本上能评估一个业务完整资源需求。这是一个绕圈式的流程设计。
场景2:附加角色
环境搭建太痛苦了,增加一个环境管理组吧;各部门的目标不一致,KPI无法协调,成立一个目标管理组吧;流程没法协调,成立一个流程组吧;质量不行,成立一个质量管理组吧。我觉得这些都是附加角色,所谓的附加角色,就是在没有找到实质解决方案的情况下,不断的添加一些check角色来改进现状。真的改进了么?没有,附加角色只会是增加了事务的复杂度和后续的执行难度。
那怎么办?这类问题要不断的问自己,为什么环境搭建痛苦?环境太多,太复杂了,为什么复杂?每个业务不一样?为什么不一样?是因为架构不统一,为什么不统一?....问题的改进,其实就是工具和最佳实践的不断组合迭代。
运维之痛3:责任分离 vs 持续改进
没有比责任分离更糟糕的事情了。在一个问题产生的时候,大家首先不是想着如何寻求更好的解决方案,而是在找这个问题应该由哪个团队的责任。责任分离可以说是过度流程化的结果,流程设计者们很多都在精心设计责任应该由谁来背。当责任被清晰的界定之后,而后的解决方案也只能落到该团队上了,自然而然,思维就局限了。
其实应该换个视角,当业务的质量出问题了,持续交付这个链条上的所有人都有责任,而基于责任的分析范围应该更广泛一些,需要思维上的突破。我们总是怪测试不够充分,你给到足够的时间给测试了么?你让测试早期参与了么?你建立了稳定的技术框架,让自动化测试更好的覆盖了么?怪运维的环境部署有问题,你有降低运维部署的复杂度么?怪运维定位问题慢,你有把运维定位故障的复杂度降低么,消除了菜鸟和专家的区别么?反之亦然。
更糟糕的是,当问题变得越来越严重的时候,还在想着流程设计得不够完美。
运维之痛4:组织设计
"设计系统的组织,最终产生的设计等同于组织之内、之间的沟通结构。"--Conway's Law.
不得不说,传统的职能式的IT组织架构越来越不能满足互联网化的业务需要了。基于持续交付打造的全链条整合链条打破的就是职能边界,提供的就是面向产品化的服务能力。如果组织不能给新产品上线和老产品快速迭代提供足够的能力支撑,那么这个组织一定是冗余设计的。架构组提供的架构能力只能是一个意向参考,没有真正的落地实现,这个架构组就是冗余的;流程组提供的流程能力是减慢了交付速度,这个流程组就应该去思考是否把流程让位于更优的技术实现。
很容易观察到的一个效果,复杂的组织设计,最终让设计出来的软件复杂,导致问题重重,随后便不断的增加附加角色,让软件的交付过程主次不分。其实附加角色增加的检查点并不能起到服务改善的作用,“越早发现缺陷,越早修复成本越低”这个准则需要深刻体会,check机制都是事后的机制,是人肉机制,而自动化的机制必须早期介入。
糟糕的情况,组织设计完全面向问题,而非面向用户。谁能代替用户来对IT组织的考核?没有。但我们的方式恰恰相反,认为考核组就可以,针对每个小组,设计了一些指标。说实话考核组离一线现场太远了,数据的是非判断准则都很难建立。
运维之痛5:架构设计
架构设计的问题是一直是核心的技术问题所在。架构设计问题体现在很多方面:
1、不能建立统一的架构标准
架构师在传统企业中是普遍的存在,而架构规范恰恰不是普遍的存在。很多时候都让位于业务的复杂需求,认为技术架构标准可以放低。技术架构标准绝不是架构师的呼声,应该是产品线的统一技术要求。合理的技术架构,会大大提升后续的产品推出速度和演进速度。
2、从代码依赖到二进制依赖到服务依赖
很多传统企业的大型软件之间采用的还是代码依赖,当一个组件发生变化的时候,这个时候需要整个系统的全量更新。久而久之,更新的代码影响哪些外部系统,都不知道。这是深度耦合,给后续的测试和运维都带来了很大的难度。到服务依赖,才能真正的实现架构自治。
3、没有统一的开发框架
开发框架其实是统一技术标准的最佳手段,是真正的把架构规范落到了可执行层面。传统企业的架构组应该在这个点上多思考,统一的开发框架到底包含哪些?
4、业务需求优先,非功能性需求次之
要命的是,评估一个研发团队的绩效是从实现业务的功能需求角度去考核的。
5、软件的服务外购性
外包服务商的能力参差不齐,很难建立统一的标准化。如果只是一些外购的项目,在选型的时候,就很难考虑测试、运维的需要了。见过太多的抱怨,对外包服务商无法强制标准。我觉得基于一个统一开发框架的PaaS化平台也许是这类困境的出路,而这点则需要从上而下建立统一认识了。这个地方做得最好的要属国家电网了!
传统企业的运维问题绝不是人的能力问题,是多方因素的综合结果,因此在寻求解决方案的时候,需要立体的方案。而这一切的基础是运维首先必须改变人肉运维的现状,方能触及更多,这也是当下为什么企业在广泛接受运维自动化的原因。