产品软件研发中,技术债不可避免,不管采取什么预防措施,都会积累。技术债日积月累,造成的后果会越来越严重,比如,交付时间的延迟,缺陷数量可观,开发和支持成本上升,可预测性降低,客户满意度降低等等。
因而,技术债的管理和偿还就显得尤为重要。技术债的管理要求综合考量技术和业务因素,因此离不开技术人员和业务人员的参与。这也是每个Scrum团队都要有一名产品负责人的原因之一。
在本文中,阐述了管理技术债的三种主要活动,并且如何偿还技术债。
活动1:管理应计技术债
管理技术债的一个关键维度是管理应计债务。到达临界之前,我们可以承担的技术债就那么多,对比一下,就会发现,日积月累的技术债相当于持续向家里借钱。在某个时刻,必须采取措施,否则后果严重。
| 使用良好的技术实践
管理技术债的增长,第一种方法是停止向产品里增加低级债务。使用良好的技术实践是一个非常好的开端。 对于积累下来的技术债,代码重构是一个非常重要的减轻债务的工具。代码重构用于改变既有代码主题的一种规范技术,在不改变软件外在行为的前提下调整其内部结构。即把软件内部清理一遍,从客户角度看,产品的工作方式没有变。
我们力图通过重构改善可维护性和扩展性,同时降低复杂性。重构可以让手头工作更容易。
| 使用强完成定义
有些工作本来应该在构建特性就做,结果却拖到后期才做,他们是产生技术债的重要根源。
完成定义检查表中的包含的技术细节越多,积累技术债的可能就越少。 而弱完成定义多产生的技术债,偿还成本往往都远远高于在冲刺过程中解决问题的成本。没有强完成定义,简直就相当于给技术积累开绿灯。
活动2:让技术债可见
技术债隐藏的主要好处是,能让开发团队和业务人员在同一个情境中进行必要的交谈。
| 让技术债在业务层面可见
很多组织存在的问题是,开发团队多少还能看出产品技术债处于什么状况,业务人员却是一问三不知。其实,让业务人员看见产品的技术债状况很关键,不然业务人员就搞不清楚产品的真实情况,进而无法做出明智的经济决策。
| 让技术债在技术层面可见
技术人员往往都具备隐性知识,知道最严重的技术债在产品中的哪个地方。 然而,这种理解可能不可见,以至于无法进行分析、探讨和采取相应的行动。
首先,可以把技术债当作缺陷录入缺陷跟踪系统,这样做的好处在于可以使用已知的工具和技术把技术债摆在可见的位置,团队可能会选择同样的方式来维护缺陷和技术债。
另一种让技术债可见的方法是,为技术债创建PBI。 这样做会使重要的技术债与产品列表中的新特性一样醒目。
团队通常可以在技术债偿还成本很高的情况下采取这种方法,而且还要求产品负责人参与决定如何调整它与产品列表中新的增值特性的优先顺序。
让技术债可见的第三种方法是 ,**创建一个特殊的技术债列表,在其中清楚列出每一个技术债。任何时候,只要产品中发现新的技术债或引入新的技术债,开发团队就可以创建一个新的技术债条目并把它加入技术债列表。
通过让技术债可见,开发团队不仅可以看到技术债的债务情况,还可以积极主动地计划偿还技术债。
活动3:偿还技术债
管理技术债的最后一个活动是维护债务或偿还债务。 偿还技术债的方式主要有五种:
- 并非所有技术债都应偿还
- 有债就还
- 先偿还高息技术债
- 分期偿还技术债
- 一边做有客户价值的工作,一边偿还技术债
技术债偿还是很重要,但这并不意味着所有的技术债都应该偿还,通常有两种情况下的技术债是无需偿还的。
第一,临近结束的产品。
如果产品已经积累大量技术债,并且已临近生命周期的终点,再投入大量精力偿还技术债就有点得不偿失了。
如果产品价值不高,就让产品搁置退市,将资源投到价值更高的产品中。 对于高价值、高技术债的产品,与其偿还它欠下的技术债,还不如承担高风险以高成本开发新的产品。
第二,短周期产品。
如果是构建一个短生命周期的产品,经济因素可能不支持偿还技术债。无论从成本考虑,还是市场、盈利等方面考虑,企业组织通常不会做预期只有三个月生命的产品,一般情况下,我们更愿意开发能够长销的产品。
技术债根本核心可以类比为一种债务,需要技术团队有策略偿还,确保产品交付价值,因而我们可以用偿还财务的思维方式偿还技术债。
比如,有债就还,分期还款,先还大头(债务) ,类比到技术债我们技术团队就可以制定相应规则,发现了偶发技术债,就及时清理技术债,而不是放置到缺陷或者PBI中。
若债务过大,积累的技术债水平可能非常高。面对这种情况,我们可以分期、分步骤偿还已知技术债,而不是后期一次性付清。
这样做的好处是,与偿还房贷、车贷类似,每月偿还其中一部分债务,避免一次性付清的方式交完尾款。
债务有大有小,技术债也是如此,我们将所有类型的缺陷都标记为技术债固然为了方面,但也要意识到并非所有技术债都同等重要。
比如,在产品中,一个经常改动或者调用的模块,其他有很多代码都依赖它,由于它变越来越难以修改,所以我们迫切需要对它进行重构。
团队都在为这个债务付息,修改越多,很快就出现债累债的情况。
因而,在维护技术债时,我们能应该先锁定高息技术债并加以维护。
除此而外呢,我们也可以一边做有客户价值的工作,一边偿还技术债。
| 无论采用哪种方式,都必须腾出时间来进行技术清理
团队常常很难腾出时间来偿还技术债,或者清理他们可能在几个月甚至几年前走捷径而付出的代价。当这些缺陷被允许存在于产品中时,就会产生进一步的问题。 这就是为什么“技术债务”这个比喻会引起如此强烈共鸣的原因。
尽管在此概述了三种方法,我更喜欢第四种:避免承担任何技术债务。
但这并不总是可行的。有时,团队会在不知不觉中承担了技术债。所以制定一个技术债务的偿还策略,是很重要的。