什么是技术债
基本定义
关于技术债的定义,维基百科的解释是:由于现在选择简单(有限)解决方案而不是使用需要更长时间的更好方法而导致的额外返工的隐含成本。
在项目中,你是否曾经遇到过这样的问题:
- 随机失败的流水线
- 无处引用的文件和方法
- 令人费解的代码实现
- 大跌眼镜的无效测试
- 无处追溯的基础设施配置
- …..
在项目中,每一个人或多或少都遇到过以上问题。当开始新功能的交付时,每一个问题都可能成为快速且成功交付的阻碍。
如何尽可能地减少或避免这些问题?如何确保项目的稳定交付?除了遵循良好的实践和设计,统一规范之外,对技术债务的有效管理也是其中不可或缺的一环。
技术债四象限
Martin Fowler 提出了著名的TechnicalDebtQuadrant:
鲁莽/有意 - “我们没有时间去设计”
团队虽然意识到这样做会导致技术债的积累,但却不清楚具体欠下债务的后果。为了提醒团队,可以增加相关流程和责任人。
谨慎/有意 - “我们必须现在交付,之后再处理因为追求速度所产生的结果”
当团队面临业务压力时,例如在发布新产品时需要快速上线以占领市场时,快速积累用户的重要性常常超越了更好的实践。在这种情况下,团队往往会选择快速完成产品交付,然后再处理技术债务。团队清楚这样做会带来技术债务,也知道逾期还债的具体后果。
鲁莽/无意 - “什么是分层?”
这个维度技术债务产生的原因通常是由于人员技能的不足。由于缺乏相关技能,开发人员可能不清楚如何编写更优秀和精炼的代码,如何设计良好的架构或者什么是更佳的解决方案。因此,导致技术债的出现和持续积累。这种情况需要加强团队成员的技能培养。
谨慎/无意 - “我们现在知道应该怎么做了”
随着团队成员的能力和对系统的了解的不断提升,使得之前认为是最佳方案的解决方案现在看来并不完全准确。但在当时,团队中没有人知道更好的做法。
以上将技术债务产生的原因分为四类。我们通常认为,健康的技术债是右边的两个维度,不健康的技术债是左边的两个维度。基于此我们可以分析技术债产生的原因并制定相应的改进措施。
技术债类型
关于技术债的类型及常见问题主要有:
为什么要管理技术债
Martin Fowler 在 Is High Quality Software Worth the Cost? 一文中从添加功能 / 时间两个维度来对比高质量的软件和低质量的软件在交付速率上的差别。
我们如何保持高质量的软件状态及交付速率?
技术债的持续累积是导致质量下降的关键原因,但技术债无法避免,因此技术债的有效管理和消除是我们保障高质量软件的必不可少的方式之一。
如何管理技术债
关于技术债管理的流程,主要分为六个步骤:
识别
技术的持续改进离不开团队中每个人的努力,因此需要每个成员都积极参与。在日常交付中,团队成员应该持续识别和记录需要改进的问题并将其放入backlog中,以便在技术改进会议中与团队同步。此外,团队还可以定期组织头脑风暴,以收集技术痛点和改进建议。
可视化
当进行技术债务管理时,我们必须始终以价值为出发点。这个价值不仅限于技术层面,最终还会反映在客户或用户所获得的业务价值上。因此,我们建议在评估技术债务和技术改进任务时,同时考虑技术价值和业务价值两个维度。我们可以参考以下“价值映射图”示例,根据架构债务中存在的技术问题以及解决这些技术债务所带来的技术价值和业务价值进行分析。之后为每个改进任务创建技术卡来可视化所有技术改进任务。
分析优先级
我们时常会遇到的问题是,需要改进的地方太多,尤其是对于遗留系统。怎么办?先排优先级。我们可以基于价值/成本矩阵来评估改进任务的价值和成本。
基于以上价值-成本矩阵,我们会:
- 优先解决高价值+低成本的技术债;
- 尝试将高价值+高成本的技术债拆分为高价值+低成本的技术债,逐步解决;
- 在没有高价值+高/低成本的技术债时,再来考虑低价值+低成本的技术债;
- 最后如果只剩下低价值+高成本的技术债,还是先拆分,再解决,或可考虑直接移除;
计划执行
由于我们难以在一段时间内集中处理技术债务,因此我们认为将消除技术债务作为每个迭代交付目标的一部分是推进技术改进的有效方式。在对技术债务及相关改进任务进行优先级评估后,需要根据优先级将技术改进任务引入到每个迭代中。例如:每个迭代中引入20%的工作量用于技术改进任务。
在技术改进的过程中,我们最常遇到的问题是如何让客户认识到技术改进的价值。首先,了解客户需求至关重要,例如客户关心的系统稳定性、成本控制、交付效率等。基于前面提到的价值树,我们可以分析技术改进任务所带来的业务价值,并解释这些改进如何帮助客户解决问题。
总结回顾
在技术债务管理中,可视化技术改进成果是不可或缺的一环。总结的目的不仅是梳理改进成果,更是与团队成员持续分享我们所创造的价值。通过可视化技术改进成果,能够增强团队成员的归属感和满足感,这对于提高团队士气非常重要。虽然有人开玩笑说“每一行代码都是改变世界的力量”,我们可能还无法真正改变世界,但我们能够为客户和用户持续创造价值。
展示成果
以上我们提到的如何让客户认识到技术改进的价值,除了向客户解释技术改进的价值和解决的问题之外,将技术改进的成果分享给客户也是至关重要的。我们需要持续跟进技术改进的成果,并向客户提供反馈。持续增强客户对技术改进的认可,才能真正确保技术改进的可持续性。
以上,就是我们在技术债管理方面的实践。当然,我们还在持续探索学习的路上。
欢迎和我们一起交流。