研发团队的「技术债」如何进行量化管理?
我共事过的每个团队都会讨论技术债。有些团队知道如何管理它,也有些团队因此崩溃瘫痪,甚至有一家公司因为技术债务没有得到解决而宣告失败。
什么是技术债务?
「债务」这个比喻非常恰当。最早提出「技术债务 Technical Debt」比喻的工程师 Ward Cunningham 对此做了详细的解释:
有了借来的钱,你可以比采用其他方式更快地做某件事情,但在还清这笔钱之前,你需要支付利息。我认为借钱是个好主意,我也认为赶快对外发布软件以获得经验是个好主意,但当然,你最终会回到这来,并且随着你愈加了解软件,你会通过重构程序来偿还那笔贷款,以此反映你所获得的经验。
本文将与你讨论技术债是如何产生的。但在那之前,我们先了解一些与技术债的产生原因和本质有关的常见误解。
误区一:技术债务 == 坏代码
到底什么是「坏代码」?
好的代码或许是整洁的代码,也可以概括为不会迫使你在未来做出特定决策的代码,它保留了选择的余地。而坏代码则不留余地,还会强加上一些原本不存在的约束。
我几乎没见过由「糟糕的开发者」编写的「坏代码」,至少在生产项目中没有(这正是代码审查的作用)。我遇到的大多数「坏代码」都出自受到约束影响的优秀的开发者。
误区二:技术债是错误的
技术债务和金融债务一样不分对错好坏。在非理想状态下——即没有足够的「现金」来满足需要——它就是产品开发工具箱中的一个有效工具。
误区三:构建完成就万事大吉
最常见的软件开发的比喻是修建建筑。在建筑行业,工作是按顺序进行的:
- 建筑设计师设计建筑并绘制图纸;
- 工人们挖掘地基、修建上层建筑、铺设管线并进行室内装修;
- 业主和租户高兴地搬进来,如有任何问题,再找维修人员解决。
这是一个通俗易懂的比喻,但却和软件行业不怎么类似。
与建筑相比,软件更像是园艺——它比混凝土更有机。你根据最初的计划和各种条件在花园里种植许多花木。有些花木茁壮成长,另一些注定要成为堆肥。你可能会改变植株的相对位置,以有效利用光影、风雨的交互作用。过度生长的植株会被分栽或修剪,颜色不协调的会被移栽到从美学上看更怡人的地方。你拔除野草,并给需要额外照料的植株施肥。你不断关注花园的兴旺,并按照需要(对土壤、植株、布局)做出调整。——《程序员修炼之道》
在(错误的)建筑比喻中,大部分成本是预先产生的。维护成本要么是名义上的,要么被视作偶发事件而忽略不计。
在园艺的比喻中,构建功能是漫长工作中的一个步骤(就像种植作物)。花园越大,所需的维护就越多。这是在重新种植以改变布局(重构),或扩大花园并种植新作物(添加新功能——这也需要维护)之外的工作。
90% 的软件成本均与维护有关——我很多年前就知晓这个数据,但每每想到还是觉得难以置信。
技术债是怎么产生的?
那么,技术债究竟从何而来?它可以避免吗?
技术债务的另一种理解可能是,项目当前所处的状态与「假设利用积累的知识重新开始而现在应处的状态」之间的差值。
技术债有两个来源:
-
决策的权衡和取舍(鲁莽 vs 谨慎)
-
制定和执行决策时所具备(或缺乏)的知识,即有意和无意
(图:技术债务象限)
理想情况下,你会在充分了解情况且不向约束条件妥协的前提下做出决策。但现实可能是,你在没有全盘了解信息和背景时就启动了项目,还要根据时间限制(如利益相关者给的截止日期)或成本限制等约束做出权衡。
如何避免技术债是一门学问,而对「技术债可否避免」这一问题,我的回答是:
“可以避免,但技术债是一种工具,不是敌人。”
如何量化技术债?
「现在有多少技术债?」这么抽象的概念真的能被量化吗?
真的很难,或者说你无法可靠地跟踪技术债。如果向软件工程师了解如何实现某个功能或修复产品的某个部分,他们可能会提供一个估算结果,并将需要偿还的技术债务涵盖在内,但你仍然无法追踪它。
Chelsea Troy 提出了一个与技术债务高度相关的可量化指标:维护负载(maintenance load) 。
维护负载描述了开发团队花费多少精力来保持现有功能同以前一样运行。—— Chelsea Troy
维护负载是有关项目年限和构建实践的函数,其衡量单位是持续付出维护精力的开发者数量(ongoing developer effort)。
需要说明的是,维护负载 != 技术债务。
但它依然是一个非常不错的技术债务指标。如果需要更多的工程师来防止系统/项目崩溃,那么很可能意味着你有很多技术债。如果仅靠十几个人就能建立一家价值 10 亿美元的公司,那么他们大概率很好地控制住了技术债。
(作者 Jacob Bennett,内容经 LigaAI 翻译整理。)
了解更多技术干货、研发管理实践等分享,请关注 LigaAI。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
硬核解读KubeEdge基于大模型边云协同的机器人语义分割算法
本文分享自华为云社区《KubeEdge:基于大模型边云协同的机器人语义分割算法》,作者:云容器大未来。 近年来快速发展的视觉大模型(例如 SAM )在促进高精度的智能感知方面具有很大的潜力。然而,边缘环境中的资源限制往往会限制这种视觉大模型在本地部署,从而产生相当大的推理延迟,导致难以支持自动驾驶和机器人等实时物联网智能感知应用。KubeEdge SIG AI 复旦大学吕智慧团队胡时京在 KubeEdge-Ianvs 上发布了基于大小模型协同推理的云边协同物联网感知方法,通过难例样本挖掘算法将少量难例样本上传云端由视觉大模型处理,大部分简单样本在边缘端由小模型处理,在保证推理时延的情况下提高了应对难例样本的处理效果。 代码请见:https://github.com/kubeedge/ianvs/tree/main/examples/robot/lifelong_learning_bench/semantic-segmentation 一、背景 智慧城市、物联网( IoT )技术的发展已经在国内外社会中根深蒂固,它们改变了人们日常生活和工作的方式,如自动驾驶、机器人、数字孪生、可穿戴设备...
- 下一篇
使用 DeepFlow 消除 APISIX 故障诊断中的“南辕北辙”
摘要:APISIX 被越来越多的用户选择作为 IT 应用系统的入口,由于故障定界能力的缺失,在 IT 业务故障诊断过程中,APISIX 经常成为重点"怀疑对象",一方面"劳师动众 "投入大量运维人力定位,另一方面诊断方向"南辕北辙 ",因而业务故障"久拖不决 "。通过本篇文章复盘重现某全球领先的智能终端提供商 近期对核心业务响应时延劣化故障的处理过程,您将直观了解到"南辕北辙"现象对诊断效率的决定性影响,以及 DeepFlow 可观测性平台如何用数分钟时间 、几步简单操作 ,消除 APISIX 故障诊断中的"南辕北辙 ",解决长达两个月悬而未决的问题,为故障处置效率带来飞跃提升。 01 业务故障的定界困境 作为一款云原生时代极受关注的 API 网关产品,Apache APISIX 被越来越多的用户选择作为 IT 应用系统的入口,在网运行的 APISIX 承载着重要等级各有差异的不同业务,但在运维过程中,普遍存在着故障诊断定位的困难。当业务出现异常需要诊断定位时,运维团队无法快速、清晰地确定故障边界,因而 APISIX 经常成为重点"怀疑对象",一方面投入大量运维人力消耗在无效的读日志、...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G