2.2 流动项:功能、缺陷、风险与债务
概述与动机
流动项是流动框架的工作单位,每一个流动项都恰好属于四种类型之一:功能,交付给客户的新业务价值或能力;缺陷,针对用户或测试发现的漏洞所做的质量修复;风险,保护业务的安全、合规、隐私与治理工作;以及债务,即技术债务、架构改进,以及能够支撑未来速度的基础设施工作。主题 2.1 介绍了这四个类别所属的框架;本主题则深入探讨这套分类法本身,因为这些类别只有在团队诚实、一致地把自己的工作归入其中时,才能产生价值。
流动项的定义性特质,是这四种类型之间的分配是一场零和博弈:任何给定周期内的工程容量是固定的,花在功能上的每一个小时,都是没有花在债务、风险或缺陷工作上的一个小时。这不是关于软件交付的新事实,每一位工程领导者都已经知道容量是有限的,但大多数组织没有一种一致、诚实的方式来看清实际的分配。冲刺速度不分类型地计算故事点;一份已清空的待办事项列表,无论其背后是一个全新的结账流程,还是三个月不起眼的安全修复,看起来都一模一样。流动项的存在,正是为了让这种不可见的分配变得可见。
对大团队而言,这种可见性改变了资源对话的性质。工程领导者不再需要提出一个无法量化的论点(“我们需要更多时间处理技术债务”)流动项分类会产生一个真实的数字,例如上个季度债务消耗了30%的容量,这个数字可以与业务利益相关方一起被讨论、被辩护,并刻意地调整。运营着许多并行产品线的企业组织,以及在新的面向公民功能与遗留系统风险之间寻求平衡的政府机构,都远比一种私下的、非正式的”我们在维护上花了太多时间”的感觉,更依赖这种站得住脚、经过量化的权衡。
核心原则
- 每一个流动项都恰好属于一种类型。 强制一种单一的分类,而不是允许一种混合或模糊的分类,正是让这套分类法能用于汇总报告的关键。
- 分配是零和的,而不是相加的。 在同一周期内,投给功能的容量越多,投给缺陷、风险和债务的容量就必然越少。
- 没有一种普遍健康的分布。 一个处于增长阶段的年轻产品,正当地应当偏向功能;一个承载着真实技术风险的成熟系统,正当地应当偏向债务和风险工作。
- 没有这门自律,债务和风险工作会长期被少报。 它往往悄悄地发生,被并入笼统的”工程任务”之中,直到流动项分类把它逼入台面。
- 分类质量决定了这套分类法的全部价值。 一套应用不一致或事后被操纵的分类法,产出的数字不是在提供信息,而是在积极地误导。
建议
在纳入时就为每一项工作分类,为每种类型使用一份书面定义
就你所在具体情境下什么算功能、缺陷、风险与债务,达成一份简明的书面定义,并要求每一份新工作在进入价值流的那一刻就依据该定义分类,而不是在完成之后分类。一份提前达成一致的定义,能抵御依据一项工作最终呈现出的样子来事后分类的诱惑,而这恰恰是本主题下文直接点出的操纵风险。
把流动分布当作一种趋势来报告,而不是一份单一快照
单一周期的分布,所能告诉你的,远不如跨越数个周期的趋势。一种朝某一种项类型的稳定漂移(功能逐季攀升,债务却在悄悄萎缩)是一个远比任何单一周期数字更强的信号,而这通常也是一个值得在它变成危机之前,而不是之后,向利益相关方提出的模式。
与业务利益相关方一起设定刻意的目标分布,而不仅仅是工程部门自己设定
与产品和业务领导层一起决定,对你所在的具体价值流当前所处的阶段而言,怎样的分布才算健康,并定期重新审视这个目标,而不是任由它默认漂移。一个处于增长阶段的年轻产品,与一个处于稳定阶段的成熟系统,正当地拥有不同的健康目标,而这个目标本身,应当是一项经过协商的业务决策,而不是工程部门悄悄单方面决定的事情。
用独立证据交叉核实流动项分类
定期把你的流动分布,与不依赖自我分类的指标进行比较:逃逸缺陷率(主题 5.1)、技术债务衡量(主题 4.5),以及漏洞管理指标(主题 6.4)。如果缺陷或漏洞在上升,而”缺陷”与”风险”这两种流动项的份额却保持平坦甚至萎缩,这种不匹配就是分类已经偏离现实的最清晰可用信号。
专门留意功能工厂模式
当流动分布显示功能季复一季地持续吸收几乎全部容量,而债务和风险工作的份额从未升到象征性水平以上时,这种模式(有时被称为”功能工厂”)通常意味着债务和风险正在被剥夺容量,而不是系统真的不需要维护。这种模式短期内令人舒适,长期却代价高昂,最终会以一场质量或安全危机的形式出现,而流动分布图表却从未给出任何预警,因为底层的累积从未被看见过。
权衡取舍:利与弊
| 方案 | 优点 | 缺点 |
|---|---|---|
| 不做正式分类(通用待办事项列表) | 没有流程开销 | 债务、风险和缺陷工作保持不可见;难以为资源决策辩护 |
| 四类流动项分类 | 让容量分配可见、可与利益相关方协商 | 需要纳入时的自律,以及每种类型一份书面、达成一致的定义 |
| 更细粒度的分类(许多子类型) | 更多的诊断细节 | 更多的分类工作;需要向利益相关方解释的数字更多 |
| 事后分类 | 应用起来更容易,无需前期流程变更 | 极易被操纵;分类会漂向看起来最好看的方向 |
核心张力是分类自律与流程开销之间的张力。四类分类法故意保持粗略,粗略到给一个项目分类只需几秒钟,而不需要一场辩论,但这种粗略只有在纳入时依据书面定义分类的自律真正得以维持的情况下才成立。解决之道是把这套分类法保持得恰好这么简单(四种类型,不多不少),并把任何额外的严谨投入到审计步骤(与独立证据交叉核实)之中,而不是投入到一套在真实工作量下会被侵蚀的更精细分类方案之中。
与团队讨论的问题
如果我们把团队上个季度交付的一切都分类,功能、缺陷、风险与债务之间的实际划分会是什么样子,这会让我们的利益相关方感到意外吗? 大多数团队从未诚实地做过这项练习。用真实数据尝试一下,而不要假定自己已经知道答案。
对于什么算功能、什么算债务、什么算风险,在我们所在的具体情境下,我们是否有一份书面、达成一致的定义,还是分类取决于碰巧是谁在给工单贴标签? 一份非正式、不一致的定义,产出的数字看起来精确,实际上跨周期并不可比。
我们的流动分布是否曾在无人刻意决定的情况下,稳定地漂向某一种项类型? 一种缓慢的漂移,逐个周期看很容易被忽略,但一旦画成趋势就一目了然。如果你有数据,拉出数个周期,诚实地寻找这种模式。
对我们产品当前所处的阶段而言,健康的流动分布应该是什么样子,我们是否真的与业务利益相关方就这个目标达成了一致? 大多数组织从未把这个目标明确化,这意味着当实际分布偏离它时,没有共享的基础能让人察觉。
我们的流动分布是否与独立证据(例如逃逸缺陷率或未解决漏洞数量)相符,还是存在一个值得调查的不匹配? 这里的不匹配,是分类已经偏离工作实际情况的最清晰可用迹象。
在交付压力之下,我们团队中是否有人能悄悄把一个债务或风险项目重新贴上功能标签,如果真的发生了,我们现在会察觉到吗? 这正是本主题的核心操纵风险的直接陈述。讨论一下你们当前的流程是否真的能抓住这一点,而不只是讨论是否有人会故意这么做。
行业视角
初创公司。 当整个团队已经知道每个人在做什么时,正式分类往往感觉像是开销。在这个规模上有用的最低限度,只是在规划中大声说出这四个类别的名字,这样债务和风险工作就不会在功能截止日期造成压力的每一次都被悄悄降低优先级,而这种模式一旦代码库和团队都变大,会严重恶化。
小型企业。 在你现有跟踪工具中的一个自定义字段或标签,就足以捕捉流动项类型,无需任何专门的工具投入。在纳入时保持一致分类的自律,远比任何工具的精密程度重要得多。
企业。 流动项分类正是这个框架在规模上发挥价值的地方,因为一个运营着许多并行价值流的大型组织,没有其他可靠、汇总的方式来看清容量究竟是如何在功能、缺陷、风险与债务之间分配的。投资于与工具集成的分类,以及针对独立证据的定期交叉核实;人工、临时的分类经不起真实组织规模的考验。
政府。 当被问及为什么没有交付更多新的面向公民的功能,而诚实的答案是一个遗留系统的风险与债务负担正在消耗一份真实、合理的容量份额时,流动分布能让公共部门技术领导者给出一个站得住脚、经过量化的答案。让这种权衡明确化、经过协商,而不是默默承受,往往比一句未经量化的”技术必要性”诉求,更能赢得监督机构的信任。
案例
企业。 一家大型零售公司的电子商务平台团队,基于冲刺速度,曾相信自己在稳定地交付功能产出。第一次诚实的流动项分类练习发现,“功能”实际上只占已完成工作的40%,而债务(其中很多与一个老化的结账系统有关)消耗了近三分之一的容量,此前从未在任何报告中被如此命名过。把这种划分呈现给产品领导层,配合一个印证债务负担的、正在上升的逃逸缺陷率,为该团队争取到了一笔专门的现代化预算,而此前该团队用了两年时间、仅凭定性论据提出这一请求都未能成功。
政府。 一家州机动车管理机构的数字发证团队,在一次公开停机事件引起对底层系统稳定性的关注之后,第一次对其待办事项列表进行了分类。这项练习揭示,“风险”工作(主要是安全补丁)在过去一年中,因反复被降低优先级、让位于可见的面向公民的功能,而萎缩到了不足5%的容量,这种模式在该团队标准报告中从未可见过。该机构领导层利用这一发现,规定了此后最低限度的风险工作分配,其依据是流动分布数据,而不仅仅是一份笼统的政策声明。
商业理由:动机、投资回报与总拥有成本
流动项分类的回报,是为此前只能定性论证、又常常因为敌不过在利益相关方面前最显眼的工作而落败的资源决策,提供一个站得住脚、经过量化的依据。上面的零售案例,用真实的容量数据而不是一句笼统的诉求争取到了一笔现代化预算,正是这门自律稳定产出的模式:一个具体的数字,远比一种”我们需要更多时间处理维护”的笼统印象更难以被驳回。
一旦分类法及其定义达成一致,总拥有成本就很低:分类只给纳入过程增加几秒钟,算不上有意义的流程负担,而跟踪它所需的工具集成,通常只是一个自定义字段或标签。真正持续的成本,是在交付压力之下维持诚实分类的自律,这也是为什么针对独立证据的定期交叉核实,与最初的采纳同样重要。
反模式与陷阱
- 在结果已知之后才事后分类工作: 本主题核心的操纵向量。在交付压力之下,一个团队可以悄悄把债务或风险工作事后贴上功能标签,或者把一个模糊的项目往在分布图表上看起来更好看的类型上凑,而单独看任何一次决定,都不会显得不诚实。护栏是依据一份书面定义在纳入时分类,并结合定期审计,把流动分布与独立证据(例如逃逸缺陷率,主题 5.1,与漏洞指标,主题 6.4)进行比较,这正是主题 1.2 对本书中每一个指标都要求的、依据独立证据审计的同一门自律。
- 让功能持续吸收几乎全部容量(功能工厂模式): 悄悄地剥夺债务和风险工作,直到它以危机的形式浮现。
- 把单一周期的分布当作全貌: 错过了只有趋势视图才能清楚揭示的缓慢、累积性漂移。
- 在没有业务利益相关方的情况下设定目标分布: 放弃了这个框架的主要价值,即对这种权衡的一种共享的、经过协商的理解。
- 每种类型使用不一致或未记录的定义: 产出的数字看起来精确,实际上跨时间并不可比。
- 用许多子类型过度设计这套分类法: 增加了分类开销,侵蚀自律,却没有带来成比例的洞察。
成熟度模型
- 第一级,启动: 工作以通用方式被跟踪,没有流动项分类;债务和风险工作在报告中不可见。
- 第二级,发展: 部分团队非正式地对流动项分类,但定义不一致,分类也常常是事后进行的。
- 第三级,标准化: 所有团队都依据一份共享的书面定义在纳入时分类,流动分布作为一种趋势被跟踪。
- 第四级,管理: 流动分布被定期与独立证据交叉核实,目标分布与业务利益相关方一起被刻意设定。
- 第五级,协奏: 流动项数据直接为整个组织的资源与投资决策提供依据,领导层能够指出因分类让此前不可见的权衡变得明确而做出的具体决策。
讨论思路
- 一次对上个季度工作的诚实流动项划分会显示什么,这会让任何人感到意外吗?
- 我们是否为四种流动项类型中的每一种都有一份书面定义,还是分类取决于是谁在给工作贴标签?
- 我们的流动分布是否曾在没有刻意决定支撑的情况下漂向某一种项类型?
- 今天我们能用什么独立证据来交叉核实我们的流动分布?
要点回顾
- 流动项恰好属于四种类型之一:功能、缺陷、风险或债务,它们之间的容量分配是零和的。
- 没有一种普遍健康的分布;正确的组合取决于产品所处的阶段,应当是一个与业务利益相关方刻意协商的目标。
- 本主题核心的操纵向量是事后分类,即悄悄地把债务或风险工作事后重新贴上功能标签;护栏是纳入时分类,加上针对独立证据的定期审计。
- 专门留意功能工厂模式,即功能持续吸收几乎全部容量,这会悄悄剥夺债务和风险工作,直到它以危机形式浮现。
- 流动分布作为一种趋势最有价值,其最大回报来自直接与业务利益相关方分享它。
参考文献与延伸阅读
- Kersten, Mik. Project to Product: How to Survive and Thrive in the Age of Digital Disruption with the Flow Framework. IT Revolution Press, 2018.
- Kim, Gene, Kevin Behr, and George Spafford. The Phoenix Project. IT Revolution Press, 2013.
- Reinertsen, Donald G. The Principles of Product Development Flow: Second Generation Lean Product Development. Celeritas Publishing, 2009.