1.1 DevOps简介
谈到DevOps,就不得不回顾一下软件开发模型(Software Development Model)的历史。软件开发模型是指软件开发全部的过程、活动和任务的结构框架。它包括需求、设计、编码和测试等阶段,有时也包括维护阶段。软件开发模型能清晰、直观地表达软件开发全过程,明确要完成的主要活动和任务。本章不会系统介绍曾经出现的所有软件开发模型,只选取其中较典型的瀑布模型、迭代模型、敏捷模型进行说明,以及如何演进到DevOps。
1.1.1 软件开发模型
瀑布模型严格遵循预先计划的需求分析、设计(可细分为系统设计、概要设计、详细设计)、编码、集成、测试的步骤顺序进行。上一阶段的成果输出成为下一阶段的工作输入,阶段之间通过交付大量的文档进行传递。严格分级、分阶段导致团队的灵活性降低,使项目难以响应需求的变化,难于调整或调整的代价极高。
迭代式开发模型每次只设计和实现这个产品的一部分,在迭代式开发方法中,整个开发工作被组织为一系列短小的、固定长度(如4周)的小周期,被称为一系列的迭代。每一次迭代中都会包含完整的需求分析、设计、编码与测试,再通过反馈来细化需求,并开始新一轮的迭代。这种方式弥补了瀑布模型中的一些弱点,加快了对变更的响应速度,可以提前识别问题,从而降低了项目风险,提升了项目成功率和生产率。
敏捷软件开发模型,是一种从20世纪90年代开始逐渐引起广泛关注的新型软件开发方法,能应对需求的快速变化。敏捷强调开发人员与业务专家之间的紧密协作,强调面对面的沟通,强调频繁交付新的软件版本,强调能够很好地适应需求变化的代码编写和团队组织方法,也更加注重软件开发中人的作用。
瀑布式开发,从需求到测试,要求每一个开发阶段都要做到最好,特别是前期阶段,设计得越完美,提交后的成本损失就越少;迭代式开发,不要求每一个阶段尽善尽美,而是先实现主要功能,再通过持续反馈逐步完善;敏捷开发,相比迭代式开发,两者都强调在较短的开发周期交付软件,但敏捷开发的周期可能更短,更强调团队的高度协作,强调适应性而非预见性。
1.1.2 DevOps发展历史
自从人类创造了计算机,就诞生了程序员(Programmer)这个职业,从为计算机编写程序以利用其计算能力,逐渐演变为专职的实现特定功能的开发人员(Developer)。后来由于存在大量的软硬件资源需要维护,又逐渐出现专职的运维人员(Operator)这一职业。
开发人员关注更快实现功能并交付开发产品,运维人员关注如何使产品运行得更加稳定。Dev和Ops的矛盾主要是面向适应性的敏捷软件交付和面向经验性的传统运维之间的矛盾。而DevOps打破了开发和运维两个部门、团队之间的障碍墙。
2009年6月,在Velocity大会上,一个名为《10 + Deploys Per Day:Dev and Ops Cooperation at Flickr》的演讲成为本次大会最大的亮点,几乎所有和DevOps相关的资料都引用该演讲作为DevOps出现的标志事件。这个演讲提出:“以业务敏捷为中心,构造适应快速发布软件的工具和文化。”
第一届DevOpsDays于2009年10月在比利时根特举行,这次聚会开创了DevOps活动的先河。本次活动尽管只通过推特(Twitter)发起和召集,却出乎意料的成功。世界各地的开发工程师、运维工程师,还有各种IT管理人员、工具爱好者齐聚一堂分享相关技术和实践。从此之后,DevOps在全球开始流行起来。近几年随着微服务和Docker的流行,DevOps得到大规模的应用和实践。
敏捷和DevOps并不是孤立或对立的关系,其实敏捷是DevOps中的关键组成部分。一般而言,敏捷关注于开发过程中的实践,而DevOps包含从开发、持续测试、持续部署到运维的整个过程。图1-1可以更好地帮助我们理解它们在软件开发过程中所处的环节。
图1-1 DevOps生命周期
敏捷实践包含了从规划(涉及需求分析和设计)到代码开发和构建的过程。
持续集成CI(Continuous Integration)在敏捷实践的基础上包含了持续构建和测试的过程;持续集成加强了对开发人员的反馈过程,快速验证并解决问题,提升开发效率。
持续交付CD(Continuous Delivery)在持续集成的基础上,增加了持续进行版本交付的过程;持续交付加强了对测试人员的交互过程,每天都有可用的版本,避免测试阻塞,提升测试效率。
DevOps在持续交付的基础上,包含了持续部署和运维反馈的过程;DevOps加强了用户体验,用户所使用的环境每天迭代更新,用户反馈的问题短时间得到更新,用户体验得到持续提升。
1.1.3 DevOps循环
经典的DevOps循环如图1-2所示。
图1-2 DevOps循环
这个循环包含了开发和运维两部分工作,通过自动化的测试和部署把这两方面的工作进行集成。一份关于敏捷和自动化测试的报告显示70%的团队采用了敏捷实践,但只有30%的团队采用了CI实践,至于CD就更少了。
1.1.4 DevOps价值
DevOps可以缩短软件发布周期,提升软件质量、安全以及反馈速度。从2016至2017年的DevOps现状调查变化中可以看到,2017年DevOps进一步提升的目标不再是生产效率,而是质量和稳定性。
DevOps有如下一些价值:
文化:DevOps首先是一种团队文化的转变,团队拥有共同的目标和信仰。
沟通协作:沟通在团队工作中非常重要,团队可以通过一些实时工具进行协作,通过持续沟通,团队的任务对所有成员可见,团队成员掌握了最新进展,可以有效进行技能传递,消除由于沟通、依赖导致的无效等待,改进团队全方面的能力,包括设计、开发和监控。
信任:是团队的最大特质,没有对团队成员的信任,团队不可能获得成功;成员之间在沟通、协作的过程中增强了相互之间的信任,同时也增强了团队凝聚力,提升了工作质量。
减少对专家的依赖:此前大部分组织都是领域专家领导的面向功能的开发团队,比如开发部、质量部、网络管理部、数据库管理部等。DevOps通过取消这些特性团队来减少对专家的依赖;团队的每个成员都是通才,可以解决团队面临的各方面的问题。
系统性思考:以业务逻辑的视角来全面理解系统所实现的功能,而不只是局限于深入理解某个领域。
精益生产:为组织的纪律、效率和有效性设置标杆;在此过程中努力做到消除浪费、加强质量、延迟承诺、快速发布、尊重个人和全局优化。
自动化:所有需要重复执行的工作都努力做到自动化、代码化,经验可复制、可推广。
持续改进:创建一个持续改进的文化氛围,无论是困难还是收获都进行分享,努力打造学习型团队,最终得以持续改善日常工作。