作者 | Matt Greenberg、Keya Patel
译者 | Sambodhi
策划 | 刘燕
在产品与工程之间最常见的矛盾之一是优先处理技术债。何故、何时以及如何处理技术债对组织和独立团队来说,都特别具有挑战性。常听到的问题有:
很多这类问题都是出于这样一个信念:技术债应该尽可能地低到零。但公司和产品绝不会因为拥有尽可能少的技术债而取胜。快速交付,率先进入市场,以及不断地为产品增加价值,这些都是取胜的因素。而要想取得更多的胜利,大部分技术债的积累都有意义,是一种交换。
正如现实生活中的债务一样,如果你现在承担技术债,那么今天你就能得到有价值的东西,并且在一段时间内偿还。这就是说,你应该将技术债视为组织长期成功的战略杠杆。
要把技术债视为战略杠杆,你需要:
阻碍真正谈论技术债的成见本节将介绍导致技术债管理不善的 4 个基本假设:技术债被定义为具有历史意义的工作,它在功能、稳定性或速度等方面造成问题,如果以当现眼光来看待。
2假设 1:技术债 = 坏账
毋庸置疑,技术债有着坏名声。解决技术债的一个难题是,你面对技术债的类型可能差异很大:一次小规模的实验性推广在本质上无害,但由于依赖多个服务,一种产品的重新设计可能会变得棘手。然而,由于未知的原因,大部分技术债都归为“不良”或“累赘”。其中一些未知因素的例子包括:业务影响可能缺乏 / 不明确 / 很难阐明,或者仍然无法确定其所需的工程时间。
现在,为了反驳“技术债 = 坏账”的假设:
从战略角度来看,Twitter 上有一个关于技术债的具体例子:
“在 Headspace 团队,我们同时或快速连续地进行实验。开发者和项目经理将一起做出一个折衷的决定,即暂停清理实验。我们基本上是偷工减料来启动实验,然后留出一周清理一堆死代码。事实上,我认为这种技术债是积极的,因为:[1] 它使工程师们可以集中精力于清理和维护,而不必在新的开发工作中进行环境切换,[2] 如果最新的实验结果出现,提供了一些新的信息,从而改变作出决策的可能性。
——Keya Patel (Reforge OIR,Headspace 的前产品发展总监)
要解决假设 1 的问题:技术债 = 坏账:
3假设 2:所有技术债 = 复杂的工作
正如其他具有挑战性的工作一样,不仅仅是技术债,有几种方法来处理复杂性。特别是技术债,有几种处理已定义和未定义的问题的方法。
已定义 = 工作有明确的开始和结束。
未定义 = 工作有开始,终点却没有明确。
为了反驳“技术债 = 复杂的工作”的假设:
要解决假设 2 的问题:技术债 = 复杂的工作:
4假设 3: 技术债 ≠ 产品工作
组织非常清楚他们所进行的产品工作将如何推动公司的指标——将每项实验、功能或改造与核心业务目标或 OKR 改进联系起来。技术债通常缺乏这种明确性,因此它与产品工作不正确地脱钩。解决技术债问题对于在合适的时候促进增长非常重要,即使它不会被立即量化。这有助于提高用户对软件的体验,或者帮助公司开启未来新功能。
为了反驳“技术债≠产品工作”的假设:
“在 Airbnb,我们围绕面向服务的架构对我们的整个技术栈(1000 多万行代码)进行了大规模的重构,其重要原因之一就是实现一个能够启动多种其他业务的平台。在此之前,我们讨论的重点是开发者的生产力、团队士气以及其他以技术为中心的投资理由。我们意识到重构对解锁业务线也很重要,并且这一工作最终被列为公司上市前 S-1 文件中的六大优先事项之一。”
——Zainab Ghadiyali (Reforge OIR,Airbnb 平台的前产品主管)
要解决假设 3 的问题:技术债 ≠ 产品工作:
5假设 4: 个人痛苦 = 组织痛苦
工程师或者其他技术债关系密切的人常常会反复说,技术债对他们来说是痛苦的。他们可能会为纠缠于某些史前代码的 QA 而苦苦挣扎,或因为团队花太长时间采用一种新的编程语言而想放弃。对于他们来说,这位员工可能会觉得这是世界末日,而组织中其他成员可能也不会感到同样的痛苦(如果他们注意到的话)。这对那些在职业生涯早期的人来说尤其普遍,因为缺乏更广泛的战略背景,他们的痛点似乎是最重要的。
为了反驳“个人痛苦 = 组织痛苦”的假设:
“在我职业生涯的早期,我和团队正在准备一场重要的客户演示,这次演示可以带来一大笔销售额。为了做演示,我们偷工减料,时间很紧。在演示开始前的周末,另一个团队的一位工程师对我们的代码库进行了重大改动。他们启用了一项新特性,他们相信这将会是一个令我们高兴的时刻,但我们感到巨大的压力而又要退回。此时此刻,我才意识到背景的重要性,我的首要任务并不是其他人的首要任务。”
——Matt Greenberg(Reforge CEO,前 Credit Karma 的工程副总裁)
要解决假设 4 的问题:个人痛苦 = 组织痛苦:
6技术债的六种类型
技术债通常是个很大的总术语,包括从延迟速度、安全漏洞、重构到其他所有东西。你需要了解你可能承担的不同类型的技术债,将其作为战略杠杆,而非总术语。这种分类将帮助整个组织的个人更好地了解手头的技术债的类型和涉及的内容,而不是含糊地谈论“技术债”。
下面是团队遇到的 6 种主要的技术债类型。值得注意的是,一个技术债可能不仅仅属于一种类别,这使得它有可能成为一个更关键的工作来解决。
维护债务
这是什么?团队没有跟上技术工作的更新。这包括在 实验启动 / 特性推出 / 取消发布 事件后,没有在正确时间删除死代码,更新库,注释上下文中的代码片段,并记录实现决策。
维护债务的例子:
开发者效率债务
这是什么?组织在产品上没有正确的测试、监控和 / 或警报。这是一种常见的债务类型,其中工程工作流效率很低,部署和构建时间可能要花费数小时或数天,而开发者缺少可以在产品上线之前发现技术问题的工具。
开发者效率债务的例子:
稳定性债务
这是什么?当组织建立不同类型的技术债时,又会影响其基础设施的稳定性。这就导致了这样的情况:你不是主动去管理待命人员,而是必须通过找主题专家或者间接地让整个团队待命,以被动的方式来管理待命人员。对于工程师和待命轮换团队来说,这成了很大的痛点,但公司其他人并不了解这个问题。稳定性债务还会影响产品的可靠性,使之成为面向客户的问题。
稳定性债务的例子:
安全性债务
这是什么?当技术堆栈中存在问题时,使得公司暴露在安全漏洞之下,比如暴力获取密码信息、数据泄露,或者竞争对手知道如何收集机密信息。这是因为人类很难计划和评估可能(或不可能)发生的假设,所以大多数组织都有大量安全性债务。
安全性债务的例子:
技术产品债务
这是什么?当产品受到明显的负面影响时。这项工作最容易解决,也最有说服力,因为它对用户有明显的影响,而且是向外的,组织中任何团队都能看到对客户和销售 / 收入的影响。
技术产品债务的例子:
决策债务
这是什么?当过去的技术决策在 X% 是错误的,或者在范围、时间或资源方面存在一些权衡,而现在团队要为此付出代价。它通常是最常见的技术债形式。
决策债务的例子:
7评估技术债:急性与系统性
当你了解了将要承担的技术债的类型,需要确定它的成本,这样你就能将它与将得到的回报相比较。当团队问“我们什么时候才有时间处理技术债?”这一合理问题时,在时间、思想和努力方面,你很难知道这些问题涉及的是小事还是大事。
评估技术债有个范围,从急性到系统性。
急性技术债
较小规模的技术债。
例子:为了推出新特性,团队跳过了一些事件测量、监控、在较少使用的平台 / 浏览器上的实现等等。团队能够轻松地加入更新,并且可以迅速完成(如果没有其他障碍,则 <1 天)。
系统性技术债
相对较大到巨大的技术债。
例子:CTO / 创始人在 5 年前作出了一项产品(也是间接的技术)决策,从那以后,团队就一直为这个决策的影响而奋斗。更改决策意味着它将会影响到他们以后做出的每一个决策。它可以是关于核心产品设置、关键功能投资或用户体验,以及由此产生的设计 / 技术架构的决策形式。团队不能轻易地解决这种技术债,并且需要数月甚至数年才能完成。
急性 > 系统性的例子:开发者效率债务
值得注意的是,每种技术债都可以从其急性规模到系统性规模来衡量。例如,对于开发者效率的债务来说:
急性开发者效率债务
系统性开发者效率债务
8从战略上优先考虑技术债
迄今为止,我们已经历过与技术债相关的假设、分类和规模。当你了解了这些知识后,你就可以在产品决策这一大背景下作出战略决策。
调整技术债的优先次序
战略性地看待技术债,关键是要了解什么时候把技术债扩缩地放到其他产品开发的优先次序中。要正确管理技术债,可以考虑以下几个向量:
在此基础上,每个向量应该按照低优先级到高优先级的标准进行分类:
这取决于技术债在整个综合规模中的位置(如下图所示),就很容易理解如何战略性地使用技术债应对公司的其他举措:
从上图来看,很明显,需要尽早解决系统的技术债,因为出现重大问题的可能性很大,问题很快就会迫在眉睫,债务会对达到既定的里程碑产生巨大的影响,而且已经产生了大量的累积债务。
若某些向量(如对用户和顺序的影响)较小,而且在左侧,则可以通过快速解决或在接下来几个月中解决问题的方法来 补修 问题。
若更多的向量(如对时间的影响、对用户的影响和顺序等)都比较小,而且在左侧,就有可能使这个领域的技术债在将来有意义的时候 积压 起来。
对于每一种情况(解决、补救、积压),都必须认真考虑技术债问题,跨越每个向量和从低到高的优先级范围。用这种方式评估技术债能够使团队作出最佳的战略决策,以决定如何向前推进,而其他公司的举措也在考虑之中。
9你的战略技术债组合,基于公司的成长阶段
另一个战略性地解决技术债问题的方法是基于技术债类型和组织规模来确定技术债组合。在 Reforge,我们将它归类为基于公司 S 型曲线的四个成长阶段:
与 S 型曲线相关,每一种技术债都应该根据公司的成长阶段得到适当的平衡。下面直观地显示,随着组织的发展,需要考虑技术债(按技术债类型)的分配的准则,以供参考。
在成长的每一个阶段,都要注意以下关键点:
牵引
拐点
规模
膨胀
10管理技术债投资组合的入门技巧
在企业成长过程中管理技术债组合时,有几个关键领域需要特别关注:过程、工具、Sprint 和路线图。当你想减少一种科技债务的数量来平衡它时,你可以随着公司的发展而承担不同类型的科技债,下面就给出了一些快速指南要点:
减少技术债产生的过程
尽管积累技术债是战略问题,但通过实施过程来阻止技术债的产生甚至有时也很有意义。
在公司成长的拐点和规模阶段尤其如此,随着更多的工程师加入团队,开发者效率债务就会减少。开发者效率债务的减少可以让位于决策债务和维护债务的必要增加。
这些过程的一些例子包括代码 /PR 审查,监控标准,QA 签署,以及技术 / 设计审查。
防止某些类型的债务形成的工具
类似于上面提到的过程,基础工具的投资有时也能防止某些类型的债务的形成。
对于组织发展的规模阶段,这一点尤为重要,因为要采取更加一致的办法避免安全问题(安全性债务),防止可能影响用户体验的错误(技术产品债务),并允许代码一致性(开发者效率债务)。
例如 linter 和 CI/CD 管道就是这些工具的例子。
反应性和急性技术债的 Sprint 工作
如果组织的待命职责已经增加,那么待命 Sprint 就应该被用来救火(待命目的)或者与技术债有关的反应型工作(在待命救火的休息时间)。
这样,组织就可以在重大的技术债项目上取得进展,并通过待命团队对当前 / 过去的事件采取实际行动。
在成长的规模和扩张阶段,让那些待命人员从事这种反应性的工作特别重要,因为在解决严重的技术债之后,其他团队可以建立新的功能 / 产品,并承担额外的债务。
为主动性和系统性的技术债制定路线图
与使用待命的时间来处理反应性和急性技术债不同,在路线图中纳入技术债的做法应该适用于需要重大调整路线图和跨团队工作的债务。
在路线图中纳入技术债的例子有:在提出重大重写的建议期间,重新设计数据系统用于用户最重要的产品功能,围绕关键路径定义和实施警报,从一个收入 / 支付平台转移到另一个,以及其他可能需要数月才能成功实施的领域。
11现在,要从作为负担的技术债过渡到作为战略杠杆的技术债
作者介绍:
Matt Greenberg,Reforge CTO,曾任 Credit Karma 的工程副总裁,也是 Scaling Product Delivery 项目的共同创造者。
Keya Patel,Reforge OIR,曾任 Headspace 的产品发展总监。
原文链接:
https://www.reforge.com/blog/managing-tech-debt
今日好文推荐
为什么除了Flutter之外,我们还需要另一个跨平台开发框架?
字节教育约九成员工被裁,赔偿N+2;王思聪砸百万元组装服务器,跑分全球第4;调查:Clojure语言最赚钱 | Q资讯
InfoQ 读者交流群上线啦!各位小伙伴可以扫描下方二维码,添加 InfoQ 小助手,回复关键字“进群”申请入群。回复“资料”,获取资料包传送门,注册 InfoQ 网站后,可以任意领取一门极客时间课程,免费滴!大家可以和 InfoQ 读者一起畅所欲言,和编辑们零距离接触,超值的技术礼包等你领取,还有超值活动等你参加,快来加入我们吧!
点个在看少个 bug 👇