在本篇指南中,你将会学习到如何预防、修复和管理技术债务的方法,了解技术债务的种类、技术债务的成本、关键指标以及处理技术债务的工具。
“技术债务”在某些人眼中可能有不太好的形象,这和学生贷款或房贷在人们心目中的形象有些相似。但是,与财务贷款类似,有时选择接受技术债务也可能是一个明智的决策。
我们将会解答以下几个问题:
- 技术债务到底是什么?
- 技术债务有哪些类型?
- 为什么会有技术债务?
- 技术债务会带来哪些影响?
- 团队应当如何管理技术债务?
- 管理技术债务的最佳工具是什么?
什么是技术债务?
技术债务,可以简单地理解为,为了能更快速地发布产品,我们选择接受的某些技术上的妥协或短期解决方案的成本。
简而言之,技术债务(也可称之为技术负担或代码债务)是软件开发过程中不可避免的一部分。
重要的是,我们应当在积累这种“债务”时要小心谨慎,当我们选择接受它时,要确保有有效的管理方式,以及一个清晰的偿还计划。
基于上述内容,我们可以得到一个技术债务的简化定义:技术债务就是那些你认为对你构成负担的代码部分。
关于预防技术债务的重要说明
许多人问我们:“应该如何预防技术债务?”
但这个问题往往并不是最核心的问题。这是因为这个问题背后的默认思维是:技术债务就是不好的。
但我希望大家不要误解,确实,技术债务在某些情况下可能是有害的。但如果我们把它比作经济中的债务,可以发现有时候为了某些目的,选择贷款是必要的。例如,我们可能需要这笔钱来改善我们的住房或者开展新的生意。很多时候,这样的贷款决策是明智的。
所以,我们更应该问的是:
- “如何避免积累不好的技术债务?”
- “在什么情况下,选择承受一些技术债务是明智的?”
- “我们该如何管理已经存在的技术债务?”
为了更好地应对技术债务,我们需要深入了解它是如何产生的。为了达到这个目的,我们需要探讨技术债务的不同类型。
了解不同类型的技术债务
多年来,技术债务已经以多种方式被描述。在2007年,技术债务主要被划分为两大类:有意和无意之债。而到了2014年,这个分类扩展到了13种,包括但不限于架构债务、缺陷债务、人员债务和测试债务。
现在,人们普遍接受的分类技术债务的方式是基于马丁·福勒(Martin Fowler)提出的“技术债务象限”。
什么是马丁·福勒的技术债务象限?
福勒的观点是,我们不应该过于关注什么算是技术债务,而是要去评估这个债务是否是在明智的情况下产生的。他基于“故意与否”和“审慎与否”的维度来定义技术债务,从而提出了四种类型的技术债务:
- 鲁莽和有意
- 鲁莽和无意
- 谨慎和有意
- 谨慎和无意
当团队明确了解自己为什么要承担某些技术债务,以及如何在未来去偿还这些债务时,这通常被视为谨慎地承担技术债务。相反,如果团队没有这样的明确认识和计划,那么他们就是在鲁莽地积累技术债务。
谨慎的团队会有目的地、计划性地承担技术债务,并且他们会有明确的偿还策略。而轻率的团队可能会对待他们的软件开发像是使用没有还款计划的信用卡一样。
最终真正需要我们关心和警惕的技术债务,是那些没有被明确记录、没有得到妥善管理的,或者那些随着时间不断累加、造成越来越大问题的技术债务。
为什么会产生技术债务?
接下来,我们将深入探索为何团队可能会产生技术债务。
有很多因素可能导致技术债务的形成,这些原因并不都与加速发布有关。例如:
- 采用过时的技术
- 做出错误的架构决策
- 编写过于复杂的代码
- 缺少足够的测试
- 技能和经验的不足
当技术债务没有得到妥善地追踪和管理时,它会开始成为一个问题。不追踪技术债务会导致其快速积累,带来更大的后续问题,这些问题可能具有指数级的增长。以下是一些导致技术债务积累增长的因素:
- 问题的隐蔽性:代码库的知识只存在于某些工程师的脑海中,或者团队可能根本不知道某些技术问题的存在。
- 缺乏代码质量文化:公司文化可能不鼓励人们关心技术债务或追求高代码质量。
- 不佳的管理流程:处理技术债务的方法不当,如把所有问题都归入一个待办事项列表。
- 时间投资不足:工程师可能会觉得很难为技术任务(例如重构)辩解所需的时间和资金投入。
- 缺乏背景知识:代码库中的问题可能没有与相关的代码关联,使得问题难以被定位和修复。
- 问题追踪不当:工程师可能没有适当的工具或资源来管理和追踪技术债务。
所有这些问题都归结为一个核心问题:低效或低质量的问题追踪方法。这一主题稍后会进一步讨论。
了解技术债务的真正影响
技术债务不仅仅是代码问题,它对整个组织的工程资源和其他部门也有广泛的影响。
如果没有适当的策略来管理技术债务,那么技术债务就会逐渐失控。一个有效的管理策略从出色的问题追踪开始。使用特定的技术债务管理工具的团队发布速度比那些没有明确技术债务策略的团队快三倍。而如果技术债务管理没有得到适当的关注和计划,那么项目的整体成本可能会增加超过50%。
技术债务会如何影响你的代码:
- 复杂性:增加的复杂性会放大其他问题,从而导致技术债务更快地累积。
- 缺陷:代码中的错误会直接影响产品。
- 代码质量:代码质量的下降会影响产品,并使技术债务更快地累积。
技术债务会如何影响你的产品:
- 功能性:如果功能不能正确工作,这会影响产品的可用性、客户的满意度和品牌的声誉。
- 交付:如果产品或功能的交付被延迟,那么依赖于你交付的客户和其他团队(例如市场营销或销售团队)都会受到影响。
- 停机时间:任何停机时间都会立刻损害品牌的声誉。
- 风险:技术债务可能增加一些严重事件的风险,比如数据安全漏洞。
技术债务会如何影响你的团队:
- 开发速度变慢:由于工程师需要花费额外的时间来处理技术债务,所以发布新功能的速度会减慢。
- 团队士气:工程师通常不喜欢处理技术债务,因为这会影响他们的积极性和工作满意度。
- 留存率:如果工程师对处理技术债务感到不满意,他们更可能会选择离职,这进一步影响了团队的稳定性和人力资源部门。
技术债务会如何影响你的业务:
- 客户满意度:技术债务往往与客户满意度负相关,即技术债务增加时,客户满意度可能会降低。
- 业务效率:由于技术债务,预测和计划可能变得更加困难,而且它还可能影响与产品相关的其他系统。
- 品牌和声誉:品牌和声誉一旦受损,很难恢复到原来的状态。
- 财务:技术债务会增加开发成本,而且由于技术债务带来的各种负面影响,企业的收入也可能会减少。
- 生存:技术债务可能导致严重的财务和业务问题,甚至有导致破产的风险。
技术债务问题追踪不足的迹象
要想有效管理并减少技术债务,首先我们需要对其进行追踪。
追踪问题是良好的技术债务管理的核心原则。以下是一些危险信号,可能表明你需要更好地跟踪团队中的技术债务:
如果这描述的正是你的团队,不必过于担忧 —— 我们每天都与各种工程团队进行沟通,这种情况非常常见。
如何管理和减少技术债务
你的核心工程师们头脑中掌握了多少代码库的知识?
优秀的技术债务管理首先依赖于整个团队在问题追踪方面的出色表现。
领导者应该使他们的工程师更容易地:(1)发现代码库中的问题、(2)报告和登记这些问题,以及(3)优先并解决这些问题。
你的目标应当是能对以下四个问题给予肯定的答复:
- 当工程师能轻易地意识到他们正在处理含有技术债务的代码吗?
- 工程师们报告技术债务的过程简单明了吗?
- 你的团队是否有一个平台或空间来讨论代码库中的问题?
- 技术债务的处理工作是否被持续地融入到你的日常工作流程中?
如果上述问题的答案并非都是肯定的,那么你的团队就面临着加重现有技术债务的风险。接下来,我们将探讨顶尖团队应该遵循的最佳实践。
良好的问题跟踪是基础
当面对技术债务时,透明性至关重要。你无法修复那些你看不到的问题。
你应该使用那些可以帮助工程师在创建问题时,为其提供尽可能多的背景信息的问题追踪工具。
敏捷中的技术债务
为了在敏捷开发中成功管理技术债务,团队需要快速地且定期地处理和减少技术债务。
为了达到这个目的,你可以采纳以下两种策略:
- 在每次的冲刺周期中,确保有15-20%的资源被用于代码重构和错误修正。
- 定期,例如每季度,安排一个完整的冲刺周期专门用来处理技术债务。
为了确定哪些问题应该被优先处理,你可以使用代码库的可视化工具。这些工具可以帮助你根据代码的特定部分或其对团队士气的潜在影响来确定优先级。
你也需要重新定义项目或任务“完成”的标准。只有当某个任务或项目达到了一个可管理和可接受的技术债务水平时,才能认为它真正完成。而且,尽管积累一些技术债务在某些情况下是可以接受的,但这些债务必须被妥善记录,并且这样做是基于明确和合理的判断。
跟踪关键的技术指标可以帮助你识别技术债务、为其提供商业上的修复理由,并跟踪这种修复的成功率。
与所有成功的管理策略一样,组织应该知道哪些关键指标最能帮助他们控制技术债务。
跟踪技术债务指标
以下是关于技术债务的几个主要指标:
- 债务指数:它表示已经解决的问题与所有问题的比例。
- 代码质量:这是多个指标的集合,用于衡量代码的总体质量和复杂度。这些指标包括代码的循环复杂度、类之间的耦合程度、代码的总行数以及继承的深度。
- 代码覆盖率:表示每个项目有多少位工程师做出了贡献。
- 技术债务比率:这是一个估算技术债务未来成本的指标,其中5%被视为一个良好的标准。
- 内聚性:高内聚性的代码意味着代码中的大部分元素都是高度相关的,这通常表示代码易于维护、重用且稳定。这也可以用来评估项目的架构是否设置得当。
- 变动频率:这个指标反映了代码被修改或重写的频率,这可以作为一个指示器来了解哪部分代码可能是导致大部分问题或漏洞的根源。
应对技术债务的工具
目前市场上有很多优秀的工具,这些工具可以帮助我们跟踪和管理所谓的“技术债务”。
三个主要领域会特别受益于这些工具。以下是对这三个领域的详细介绍:
1、更多、更好地跟踪问题
开发人员主要是在编程编辑器里工作,这也是创建、查阅和管理问题的最好地方。
通过这类工具,用户可以更便捷地将问题与相关代码关联起来,并深入了解这些问题如何影响到代码库或团队的效率。
2、Git 分析:
当代码中出现缺陷或漏洞时,我们都希望能够尽快发现。
静态代码分析工具能帮助我们分析代码库,从中挖掘出潜在的风险和团队之间的交互模式。这些分析结果不仅有深度,而且是可操作的,我们可以直接基于这些结果来进行相应的改进。
3、代码质量
如果你刚开始关注代码质量,那么使用代码质量工具是一个很好的起点。这些工具可能不会提供持续解决技术债务的整体策略,但它们可以自动对代码进行分析,并指出其中的问题。
总结
如果忽略技术债务,你的组织可能会面临一系列的问题,包括团队士气低迷、产品推向市场的时间延长、因为架构设计不恰当而导致的系统灵活性降低,以及安全性问题。
为了妥善处理技术债务,你应该采取以下措施:为团队创建一个方便的环境,使他们能够轻松地标识、跟踪并优先解决代码中的问题;定期召开会议讨论技术债务问题;并使用为此特别设计的工具来协助你处理技术债务。