要成功实施DevOps方法,需要基于DevOps应用的基本原则,规范指导Devops的工作行为。在实施DevOps过程中,开展的各项工作行为可以看做能为客户创造价值的相关活动,在整个软件开发交付生命周期中,结合软件开发交付流程,将DevOps工作活动与各项已有的开发交付活动紧密串联,相互配合形成更高效的技术价值流。
通常在敏捷开发流程中,开发工作始于研发部门接受需求,接受开发工作之后,开发团队运用敏捷的开发流程,将业务需求转化为用户故事以及某种功能性说明,然后通过编写程序代码实现,再将代码上传到版本控制库,对后面每次变更都要进行单元测试、集成测试,通过测试之后转交给运维团队进行部署发布。但在实际工作中,软件产品只有在生产环境中按预期完成部署和正常运行,才能真正为客户提供服务,为企业产生价值,整个开发交付价值流上的价值才能真实产生。
如何有效的指导DevOps实践工作并产生和加强技术价值,通常采用Gene Kim发布的三步工作法作为Devops过程改进的基本原则,分别是第一步流动原则、第二步反馈原则、第三步持续学习与实验原则。
DevOps工作流动原则
工作流动原则,就是建立从开发到运维之间快速的、平滑的、能向客户交付价值的工作流,通过加强工作可视化、减少交付批次大小、缩短前置等待时间加快技术价值流的流速,并通过内建质量管理防止上游缺陷传递到下游,从而增强软件开发交付过程的流动性,提高工作质量,使得工作更加敏捷和高效。
首先,持续加强工作内容的可视化。软件开发行业的工作内容通常是不直观可见的源代码或软件包,在实际软件开发交付过程中很难发现过程中的问题点,但另一方面,软件开发工作中的工作流通过IT工具简单快捷的操作就可以完成。由于这种不可见和简单快捷,导致不同团队之间,因为操作太过容易,产生信息不完整的沟通问题,上游隐藏的问题也被简单而隐蔽的传递到下游工作,直到最后软件产品无法按时按量的向客户交付,或者部署发布后无法正常运行时问题才被暴露。通过工作内容可视化展示,可以较好的解决这类问题,比如敏捷开发的看板或Sprint计划板,通过将整个开发交付过程的所有工作都可视化展示出来,相关干系人可以更容易确定工作优先级和进行全局决策,增加整个工作流程的吞吐量。
其次,减少交付批次大小。在敏捷运动和DevOps概念形成之前,软件行业采用瀑布式大批量生产的方式司空见惯,上下游作业的切换消耗很大,即使在敏捷开发过程中采用2周一个迭代周期的情况下,将开发需求按用户故事进行拆分迭代,依然存在最后软件集成交付导致的各种问题,并且在软件开发工作流程中,约是下游环节发现的问题,定位修复的难度与成本就越高。因此在DevOps工作模式下,强调减少交付批次大小,通过持续部署方式,将每一个提交到版本控制系统的变更都能快速集成、测试并部署到生产环境,能有效的提高问题定位和修复的效率和成本。
最后,缩短约束节点的前置等待时间。任何价值流中,总会存在一个约束节点,任何不针对此约束节点而做的前置优化,都必将在这个约束节点上更快地积压起来。在软件开发交付过程中,通常需要优化的约束节点是环境搭建、代码部署、测试的准备和执行、紧耦合的系统架构。DevOps推荐的解决方案是通过引入自动化搭建、自动化代码部署、自动化测试手段缩短前置等待时间,并且在软件架构设计阶段,提前考虑为DevOps实施创建松耦合的系统架构。最终目标是让小型开发团队可以独立、快速、可靠地开发、测试和部署,并持续的创造和提高工作价值。
DevOps工作反馈原则
流动原则是的软件开发工作能够从左向右快速流动,反馈原则是从右向左在软件开发交付工作中快速、持续地获取工作反馈。通过实施DevOps工作反馈,在企业中简历快速、频繁、高质量的反馈信息流,可以在系统规模小、修复成本低的情况下快速发现并修复问题,在大灾难发生前消除发现的问题。
首先,在问题发生时及时发现问题。通常高绩效的制造行业中,通过在工作系统中建立反馈和反馈回路的方式建立信息流,将整个工作流程进行度量和监控,任何重大缺陷和偏差都能被快速发现和处理,这也是保证质量、安全和持续学习与改进的基础。在传统瀑布式软件开发交付工作中,因为周期长、工作复杂,通常缺乏快速反馈机制,比如在测试之前研发和产品得不到太多的质量反馈,最终工作结果往往难以达到预期目标。实施DevOps的目标是在软件开发交付工作每个阶段的执行过程中,建立快速的反馈机制,通过增加自动化构建、自动化集成、自动化测试过程,尽早检测和发现问题,还需要建立完善的监控系统,对生产环境中运行的服务组件状态,进行持续监控。这种DevOps反馈机制,不仅能快速发现和快速修复问题,而且还能帮助企业持续积累经验防止类似问题复发。
其次,全员参与解决问题和积累新知。及时发现问题是解决问题的开始,全面准确的解决问题才是关键,在复杂的软件系统内,由于人员、流程、产品、环境、时间中存在着大量的意外因素,并且相互作用产生影响,无法依靠个体的力量全面准确的还原问题和解决问题。DevOps建议尽可能在早期工作阶段中,通过全员参与的方式解决小问题,防微杜渐才能把灾难性大事故消灭在萌芽状态,在DevOps持续集成和持续部署实施快速反馈的基础上,能快速隔离和定位问题,发现问题后及时终止和回退相关工作,保证当前系统运行状态稳定,并停止新工作的开展,直到问题被解决。
最后,在工作的源头保障质量。实际在复杂系统的软件开发工作中,做决策的地方一般远离执行工作的地方,不仅降低了决策质量,而且还增加了决策周期,比如开发人员距离真实客户比较远,无法准确理解业务需求,运维人员在项目中进入时间点晚,无法及时提出业务功能之外的非功能性需求。DevOps需要软件开发交付过程中每一环节或人在他们的工作范围内发现并解决问题,把质量控制、安全责任和决策制定都下沉到具体工作开展场景中,让所有人全员担负质量责任。并且开展上游工作时,考虑并优化下游工作的开展,这样在工作的源头及服务外部客户业务需求,又满足内部客户质量要求,这样在源头保障了质量。
DevOps持续学习原则
前两个原则分别从左到右建立了快速工作流和从右到左建立了反馈信息流,为了更好的实施和推广DevOps工作方法,还需要建立持续学习和改进的制度文化,持续提升团队能力,帮助团队快速地适应变化的环境,进而帮助企业在市场更具竞争力。
首先,建立公平公正的安全文化。安全文化的关键,是公正的处理工作中出现的事故和意外情况,避免出现过多的职责,在公平公正的安全文化的氛围下,促进企业和团队自我诊断和自我优化。在实际的互联网软件开发工作中,因系统和网络环境的复杂度高,在产品交付前无法精确的检查和预防所有异常,即使所有必要的工作流程执行和检查无误,也会存在意外情况发生,甚至还会发生重大生产事故。实施DevOps加快了工作流和反馈流,工作中出现问题和反馈问题会更敏捷,更需要打造一个安全文化的工作氛围,在意外和事故发生时,更多关注分析问题的根因,防止事故复发,持续积累经验知识,而不是单纯的追究责任人的问题。
其次,建立持续改进的实验文化。如果团队没有能力或者意愿去改进现有的流程,那么就会持续饱受当前问题的困扰和折磨,而且痛苦指数还会与日俱增。任何过程、方法无法在建立之初,就能解决工作中存在的所有问题,互联网软件开发工作更是如此,开发运维团队陷入各种需求开发、变更、问题修复等工作中,没有预留时间去做更有价值的持续改进工作,往往会造成技术负债和恶性循环。因此通过实施DevOps提高软件交付工作效率,降低软件交付工作成本,增加低成本、低风险的弹性检测机制,持续不断地进行模拟演习和实验,及时发现问题、解决问题,并通过内部学习交流,将局部范围的优良实践分享给组织全员,形成持续改进的工作制度。
最后,建立自上而下的学习文化。上级领导帮助下属在日常工作中发现并解决问题,这是丰田生产系统的核心,也是学习型组织的核心。传统的管理模式中,高层领导负责确定长期战略目标,通过高层决策带领企业和团队做正确的事情来领导团队,然而优秀的领导力并不代表所有的决策都是对的。在互联网行业,因为市场节奏快、环境复杂度高,这种管理和决策方式难以准确、敏捷的应对市场变化,更多的互联网企业采用扁平化管理方式,领导者为团队创造条件,和团队一起建立可迭代的短期目标,然后在工作中设定不同级别的目标条件,逐步实现这些管理目标,最终将这些目标条件构成科学的管理框架,指导下一步的DevOps工作改进。