第 2 章 第一步:流动原则

第 2 章 第一步:流动原则

在技术价值流中,工作通常是从开发人员流向运维人员,也就是业务和客户之间的所有职能部门。本章要描述的第一步工作法,就是建立从开发到运维之间快速的、平滑的、能向客户交付价值的工作流。要为这个全局目标进行优化,而非围绕一系列局部目标,如功能开发的完成度、测试中问题的发现率和修正率、运维维护的可用性等。

通过持续加强工作内容的可视化,减小每批次大小和等待间隔,内建质量以防止缺陷向下游传递,从而增强流动性。通过加速技术价值流的流动,可以缩短满足内部客户和外部客户需求的前置时间,进一步提高工作质量,并使我们更加敏捷,能够比竞争对手更为出色。

我们的目标是在缩短代码从变更到生产环境上线所需时间的同时,提高服务的质量和可靠性。实际上,我们可以在制造行业中找到价值流应用的相关线索,帮助我们将精益原则应用到技术价值流中。

2.1 使工作可见

技术行业的工作内容是不可见的,这是其与制造业价值流相比的一个显著差异。相对于工业产品的生产过程而言,在技术价值流中很难发现工作过程的阻塞点,例如,在哪里受阻了,在哪个环节产生了积压。而在制造业的价值流中,工作在不同工作中心间的转移通常是显而易见并且缓慢的,因为必须真正地转移库存产品。

另一方面,技术工作的流转通过单击一次鼠标就可以完成,譬如将工单重新指派给另一个团队。由于点击的操作太过容易,所以不同团队可能会因为信息不完整而将工作“踢来踢去”,存在的问题也会被传递到下游工序,而这些问题完全是不易察觉的,直到无法按时向客户交付产品,或者应用程序在生产环境中出了问题。

为了能识别工作在哪里流动、排队或停滞,就需要将工作尽可能地可视化。可视化工作板是一种较好的工作方式,如在看板或Sprint计划板上,使用纸质或电子卡片将各项工作展示出来。工作通常从左侧发起(从待办事项中拉取),然后从一个工作中心拉取到下一个工作中心(用列表示),最后到达工作板的最右侧,而这一列也通常被标记为“完成”或“已上线”。

通过这种方式,不仅能将工作内容可视化,还能有效地管理工作,加速其从左至右的流动。此外,还可以通过卡片从在看板上创建到移动至“完成”这一列,度量出工作的前置时间。

理想情况下,看板应该覆盖整个价值流;仅当工作到达看板最右侧时,才能算是已完成(见图2-1)。开发完成某个功能不能算是“已完成”,只有应用程序在生产环境里成功地运行起来,并开始为客户提供价值的时候,才能算是“已完成”。

图2-1 横跨需求、开发、测试、预生产和生产的看板示例

(来源:David J. Andersen和Dominica DeGrandis 2012年的工作坊培训材料“ITOps的看板”)

通过将每个工作中心的所有工作都放进队列中,并且可视化地展示出来,利益干系人更容易从全局目标出发,确定各项工作的优先级。这样,每个工作中心都能采用单任务的处理方式,从优先级最高的任务开始,依次完成所有工作,以增加工作中心的吞吐量。

2.2 限制在制品数

制造业的日常工作通常是由定期(如每天、每周)生成的生产计划决定的,根据客户订单、交货日期、零件库存等条件,确定执行哪些任务。

但技术工作通常是动态的——尤其是存在共享服务的情况下,团队必须要同时满足很多利益干系人的需求,这导致临时安排控制了日常工作。紧急的工作可能会来自于各种渠道,譬如工单系统、宕机告警、电子邮件、电话、即时通信的消息或管理层决定的事件。

生产中断在制造业里很显眼,且代价极高,当正进行中的工作戛然而止时,所有的半成品都将报废,然后再启动一批新作业。这种高昂的代价,让人们不希望中断频繁发生。

但是技术工作者很容易被打断,因为对所有人而言,这个中断的后果似乎是不可见的,即便它对生产效率的影响比制造业更甚。例如,将一个工程师同时分配到多个项目里,他不得不在多个任务、认知规则和目标之间来回切换,付出重新进入角色的成本。

研究表明,即便是完成简单任务,如将各种几何形状分类,当同时执行多个任务时,效率也会显著降低。从认知上看,技术价值流中的工作,显然要比分类几何形状复杂得多,所以多任务会导致更长的处理时间。

当使用看板管理工作时,可以限制多任务的出现,例如对看板的每一列或每个工作中心设置在制品数量的限制,并把卡片数量的上限标记在每一列上。

例如,将测试工作的在制品数量上限设置为3。当测试队列中已有3张卡片时,除非某张卡片完成了,或将3张中的一张退回到前一个队列(左侧的那一列),否则禁止添加新卡片。另外,在把一项工作用卡片的形式显示在看板上之前,任何与之相关的工作都不能开展,这强调了任何工作都必须可视化。

Dominica DeGrandis是在DevOps中运用看板的专家之一,他指出:“控制队列的长度(即在制品数)是一个非常强大的管理工具,因为这是影响前置时间的重要因素之一——对于大多数的工作条目而言,在它们完成以前,其实并无法预测到底需要多长时间。”

通过限制在制品数,还能更容易地发现工作中的阻碍。1例如,当限制在制品时,可能会发现居然没什么工作可干的,因为要等待其他人。虽然进行一项新工作(即“干点什么总比什么都不干强”)可能很诱人,但此时更好的做法是查明导致等待的原因,并协助解决那个等待的问题。实际上,糟糕的多任务处理发生的原因,通常是同时给一个人分配多个项目,造成了很多优先级冲突问题。

1大野耐一把限制在制品比喻为给水库排水来识别出阻碍快速流动的所有问题。

正如《看板方法:科技企业渐进变革成功之道》的作者David J. Anderson所说:“停止开始,开始结束。”

2.3 减小批量大小

建立平滑而快速的工作流的另一个关键点,是通过小批量的模式完成工作。在精益革命以前,大批量(或规模)生产的方式在制造业司空见惯,在作业配置或作业之间的切换相当耗时且昂贵时尤其如此。例如,在生产大型汽车时,需要将巨大而沉重的模具放到金属冲压机上,这个过程可能需要好几天时间。鉴于成本如此高昂,通常会用大批量作业,一次冲压出尽可能多的车身板,从而减少模具的更换次数。

然而,大批量导致在制品的暴涨,并在整个制造工厂中产生流量级联的变化。最后导致前置时间长、产品质量差的后果——如果发现了一个车身板有问题,整个批次都必须报废。

在精益中,一个重要的经验是:为了缩短前置时间和提高交付物质量,应当持续不断地追求小批量模式。理论上,最小的批量是单件流,也就是每次操作只执行一个单位产品的处理。2

2也称为“1的批量大小”或“1×1流量”,该术语表示批量大小和在制品都限制为1。

关于小批量和大批量之间的巨大差异,James P. Womack和Daniel T. Jones在《精益思想》 一书里,通过“模拟邮寄宣传册”的经典案例进行了说明。

这个例子假设要邮寄出10本宣传册。邮寄之前,每本宣传册都必须经历4个步骤:折叠,插入信封,给信封封口,盖戳。

如果采用大批量策略(即“大规模生产”),我们会对每本宣传册按顺序执行上述4个步骤。换句话说,首先要将10张纸全都折叠完,再将每张纸分别插入信封,然后给所有的信封封口,最后全部盖章。

另一种方式是小批量策略(即“单件流”),即对每本宣传册顺序地执行所需的所有步骤,然后再开始处理下一本宣传册。换句话说,先折叠一张纸,将其插入信封,再给信封封口,之后盖章;然后,取下一张纸,并重复以上过程。

采用大批量和小批量策略之间的差异是巨大的(见图2-2)。假设对所有10个信封都必须采取如上4个步骤,并且每一步操作需要10秒。如果使用每批5个的大批量策略处理,则完成第一个盖戳的信封需要用310秒。3

3这里是“5×1流量”,即批量大小为5,在制品为1。由于这里是单人模拟的场景,并且一双手同时只能加工一个信封,所以在制品数量也只能为1。310秒 = (5 × 10 + 5 × 10) + (5 × 10 + 5 × 10) + (5 × 10 + 5 × 10) + 10。 ——译者注

图2-2 模拟“信封游戏”(折叠、插入、封口、盖章)

(来源:Stefan Luyten的文章“单件流:为什么大批量生产不是最有效的处理‘工作’的方式”,https://medium.com/@stefanluyten/single-piece-flow-5d2c2bec845b#.9o7sn74ns,2014年8月8日)

更糟糕的是,假设我们在信封封口操作中发现第一步的折叠做错了,在这种情况下,我们能发现错误的最早时间是在200秒之后,那样我们就不得不将这个批次的10个小册子再重新折叠并装回信封中。

相比之下,使用小批量策略时,仅用40秒就完成了第一封盖戳信的生产,比大批量策略快8倍。如果第一步出错了,只需要返工一本小册子。小批量生产的在制品更少,前置时间更短,错误检测更快,返工量更少。

对于技术价值流而言,大批量的副作用和制造业一样。我们制订了软件发布的年度计划,将一整年的开发成果一次性地都发布到生产环境中。这种大批量的发布会造成突发的、大量的在制品,导致所有下游工作中心4大规模的混乱,其结果是流动性变差,质量下降。这和我们阐述的经验是类似的,即对生产环境的变更越大,问题的定位和修复就越困难,修复时间也就越长。

4多是指数据中心的运维部门。——译者注

Eric Ries在“创业经验教训”(Startup Lessons Learned)这篇文章中说:“在开发(或DevOps)流程中,批量大小是工作产品在不同阶段间移动的单位数。对于软件而言,最容易看到的是代码。当工程师签入代码时,他们就批量地处理了一定数量的工作。有许多控制批处理的方式,从持续部署要求的小批量,到相对传统的基于分支的大型模块开发,都是聚合多个开发人员几周或几个月所工作的代码。”

在技术价值流中,单件流可以通过持续部署实现。5其中,每一个提交到版本控制系统的变更都会集成、测试并部署到生产环境。具体的实现方法,将在第四部分中进行详细描述。

5本书强调的是端到端的价值流,只有在部署之后,把价值交付给客户了,一项工作才算完成,因此是持续部署。 ——译者注

2.4 减少交接次数

在技术价值流中,如果部署的前置时间以月作为周期单位,通常是因为要将版本控制系统中的代码部署到生产环境需要数百甚至数千个操作。实际上,代码在价值流流转的过程中,需要各个不同部门的协同才能完成相关任务,包括功能测试、集成测试、环境搭建、配置服务器、存储管理、网络、负载均衡设备和信息安全加固等。

一项工作在团队之间交接时,需要大量的沟通——请求、委派、通知、协调,而且经常需要排优先级、调度、消除冲突、测试和验证。这些工作可能还需要使用不同的工单系统或项目管理系统,编写技术规范文档,用会议、电子邮件或电话的形式进行沟通,可能还涉及文件共享服务器、FTP服务器和Wiki页面的使用。

实际上,上述流程中的每个环节都有其潜在的队列,当依赖不同价值流共享的资源(例如集中式操作)时,就会出现工作等待。这些请求的前置时间通常会很长,从而导致那些本应按期操作完的工作持续地延期。

即使在最好的情况下,有些信息或者知识也不可避免地在交接过程中丢失。经历了多次的交接后,问题的上下文和所支持的组织目标可能会完全丢失。例如,服务器管理员可能会收到一个关于创建用户账号的新工单,但是他并不知道是什么应用程序或服务会使用这个账号,为什么需要新建账号,其他的依赖关系是什么,或者这到底是不是一个重复劳动。

为了减少这类问题的出现,要么努力减少交接次数,要么用自动化方式执行大部分操作,要么重新调整组织结构,让团队不必依赖其他人就可以独立地为客户提供价值。因此,要通过减少队列中的等待时间以及非增值工作的时间来增加流动性(见附录4)。

2.5 持续识别和改善约束点

为了缩短前置时间、提高吞吐量,我们需要不断地识别系统中的约束点,提高工作产能。Goldratt博士在Beyond the Goal一书中提到:“在任何价值流中,总是有一个流动方向、一个约束点,任何不针对此约束点而做的优化都是假象。”如果我们优化约束点之前的那个工作中心,那么工作必将在这个约束点上更快地积压起来。

反之,如果优化约束点之后的工作中心,那么它还会处于饥饿状态,等待约束点处工作的结束。对于这种现象,Goldratt博士给出了解决方案,定义了如下“5个关键步骤”:

  • 识别系统的约束点;
  • 决定如何利用这个系统约束点;
  • 基于上述决定,考虑全局工作;
  • 改善系统的约束点;
  • 如果约束点已经突破了,请回到第一步,但要杜绝惯性导致的系统约束。

在DevOps的转型过程中,如果希望前置时间从月或季度缩短为几分钟,那么一般需要依次优化下面的约束点。

  • 环境搭建:如果生产或测试环境的搭建总是需要数周或数月,则按需部署就无法实现。解决措施是按需建立完全自服务的环境,保证团队在需要环境的时候,能通过自动化方式创建。
  • 代码部署:如果代码的部署需要花数周或更长时间(譬如每次部署需要1300个手动、易出错的操作,涉及多达300名工程师),那么就无法按需部署。解决措施是尽可能自动化部署的过程,以便让任何开发人员都可以按需自动化地部署。
  • 测试的准备和执行:如果每次代码部署都需要两周的时间来完成测试环境的准备和数据集的配置,手动执行所有的回归测试还需要另外四周时间,那么就无法实现按需部署。解决措施是实现自动化测试,这样才能在安全、并行地执行部署的同时,使测试的速度能跟上代码开发的速度。
  • 紧密耦合的架构:如果架构是紧密耦合的,那也无法实现按需部署,因为每次要做代码变更时,工程师都不得不从变更评审委员会里获得执行变更的许可。解决措施是创建松散耦合的架构,这样开发人员才能安全、自主地进行变更,提高生产力。

如果能突破以上的约束点,那么接下来的约束有可能是开发部门或产品经理。因为我们的目标是让小型开发团队可以独立、快速、可靠地开发、测试和部署,并持续为客户创造价值,所以这些环节应该是约束点集中的所在。对于高绩效者来说,不管工程师是处于开发、QA、运维还是信息安全岗位,他们的目标都是尽量提高生产力。

当约束点出现在开发阶段时,我们将仅受限于有多少创意精良的业务假设,以及能否开发出必要的代码来用真实客户来测试这些假设。

以上所述的约束点在DevOps转型中是相当普遍的——在价值流中识别约束点的技术,诸如如何使用值流映射和度量的方法,以后会详细描述。

2.6 消除价值流中的困境和浪费

丰田生产系统的先驱之一新乡重夫认为,浪费是业务兴盛的最大威胁——精益中对浪费的常用定义是“使用了超出客户需求和他们愿意支付范围的任何材料或资源的行为”。他定义了制造业里7种主要的浪费类型:库存、过量生产、过度加工、运输、等待、移动和缺陷。

现代化的精益理念解释道:“消除浪费”会有点贬义和不近人情的意味,我们的目标其实是想通过持续的学习来破除日常工作中的困境,从而更好地实现组织的目标。在本书的后续内容里,“浪费”一词意味着这个更具现代感的定义,因为它更符合DevOps所期望的理想境界。

Mary和Tom Poppendieck在Implementing Lean Software Development: From Concept to Cash一书中描述道:浪费和困境是软件开发过程中导致交付延迟的主要因素。

下面是该书中描述的关于浪费和困境的部分类型。

  • 半成品:它指的是价值流里任何还没有彻底完成的工作(例如,需求文档或尚未审核的变更单)、处于队列中的工作(如等待QA审核或服务器管理员审核的工单)。部分完成的工作会逐渐地过期,随着时间的推移最终失去了价值。
  • 额外工序:在交付过程中执行的、并未给客户增值的额外工作,可能包括那些在下游工作中心从没使用过的文档,或是对输出结果做出的并不增值的评审或审批。额外工序不仅增加了处理的工作量,还增加了前置时间。
  • 额外功能:在交付过程中构建的那些组织或客户完全不需要的功能(如“镀金”6)。额外功能增加了功能测试和管理的复杂度和工作量。
  • 任务切换:将人员分配到多个项目和价值流里后,他们需要进行上下文切换,并管理工作之间的依赖关系,这会在价值流中耗费额外的工作量和时间。
  • 等待:由于资源的竞争而在工作之间产生了等待,这将增加周期时间,延迟了向客户交付价值。
  • 移动:信息或数据在工作中心之间移动的工作量。例如,在一个需要频繁沟通的项目里,团队成员实际上不在一起办公,无法坐在一起紧密协作,这时人员移动的浪费就产生了。另外,工作交接也会产生移动的浪费,需要额外的沟通来澄清所有歧义的部分。
  • 缺陷:由于信息、材料或产品的错误、残缺或模糊,而需要一定的工作量来确认。缺陷的产生和被检测出来的时间间隔越长,解决问题就越困难。
  • 非标准或手动操作:需要依赖其他人的非标准的或手动的工作,例如使用不能自动化反复重建的服务器、测试环境和配置。理想情况下,任何依赖运维团队手动完成的操作,都应该配置成自动化的、按需提供的,或者是自助服务。
  • 填坑侠:为了实现组织的目标,不得不把有些人和团队置于不太合理的处境,这甚至会成为他们的家常便饭(如半夜两点生产环境出现事故,连夜给软件版本提交了上百个工单)。7

6IT项目中无用的面子工程和功能。——译者注

7虽然填坑侠没有包含在Poppendieck所说的浪费类型中,但我列在这里是由于这种情况很普遍,特别是在运维共享服务的情况下。

我们的目标是将这些浪费和困境(任何需要填坑侠的场合)都可视化,并系统地进行改进,减轻或消除这些负担,从而实现快速流动的目标。

2.7 小结

提升技术价值流的流动性对实施DevOps来说至关重要。为此,我们需要将工作可视化,限制在制品数,减小批量大小,减少交接次数,持续地识别和改进约束点,以及消除日常工作中的困境。

第四部分将详细描述在DevOps价值流中实现快速流动的具体实践。下一章将描述第二步工作法——反馈原则。

目录

  • 版权声明
  • 推荐语
  • 译者序
  • 序言
  • 前言
  • 导言:展望DevOps新世界
  • 第一部分 DevOps介绍
  • 第 1 章 敏捷、持续交付和三步法
  • 第 2 章 第一步:流动原则
  • 第 3 章 第二步:反馈原则
  • 第 4 章 第三步:持续学习与实验原则
  • 第二部分 从何处开始
  • 第 5 章 选择合适的价值流作为切入点
  • 第 6 章 理解、可视化和运用价值流
  • 第 7 章 参考康威定律设计组织结构
  • 第 8 章 将运维融入日常开发工作
  • 第三部分 第一步:流动的技术实践
  • 第 9 章 为部署流水线奠定基础
  • 第 10 章 实现快速可靠的自动化测试
  • 第 11 章 应用和实践持续集成
  • 第 12 章 自动化和低风险发布
  • 第 13 章 降低发布风险的架构
  • 第四部分 第二步:反馈的技术实践
  • 第 14 章 建立能发现并解决问题的遥测系统
  • 第 15 章 分析遥测数据以更好地预测故障和实现目标
  • 第 16 章 应用反馈实现安全部署
  • 第 17 章 将假设驱动的开发和A/B测试融入日常工作
  • 第 18 章 建立评审和协作流程以提升当前工作的质量
  • 第五部分 第三步:持续学习与实验的技术实践
  • 第 19 章 将学习融入日常工作
  • 第 20 章 将局部经验转化为全局改进
  • 第 21 章 预留组织学习和改进的时间
  • 第六部分 集成信息安全、变更管理和合规性的技术实践
  • 第 22 章 将信息安全融入每个人的日常工作
  • 第 23 章 保护部署流水线
  • 行动起来——本书总结
  • 附加材料
  • 附录
  • 参考资源
  • 致谢
  • EXIN DevOps Professional认证备考指南 & 模拟题