如何量化管理研发团队的技术债务?

在探讨技术债的成因之前,我们需要澄清一些关于技术债起因和本质的普遍误解。

误解一:技术债务等同于劣质代码 那么,什么构成了所谓的「劣质代码」?

所谓的好代码,可能是指那些整洁、不会在未来限制你决策的代码,它为未来的变化留下了空间。相对地,劣质代码则会限制选择,并可能引入不必要的约束。

实际上,我在生产项目中很少看到由「差劲开发者」编写的「劣质代码」(这正是代码审查的目的所在)。我所遇到的多数「劣质代码」,实际上是由那些在特定限制下工作的优秀开发者所编写的。

误区二:技术债是错误的

技术债务和金融债务一样不分对错好坏。在非理想状态下 —— 即没有足够的「现金」来满足需要 —— 它就是产品开发工具箱中的一个有效工具。

误区三:构建完成就万事大吉

最常见的软件开发的比喻是修建建筑。在建筑行业,工作是按顺序进行的:

  • 建筑设计师设计建筑并绘制图纸;
  • 工人们挖掘地基、修建上层建筑、铺设管线并进行室内装修;
  • 业主和租户高兴地搬进来,如有任何问题,再找维修人员解决。

这是一个通俗易懂的比喻,但却和软件行业不怎么类似。

与建筑相比,软件更像是园艺 —— 它比混凝土更有机。你根据最初的计划和各种条件在花园里种植许多花木。有些花木茁壮成长,另一些注定要成为堆肥。你可能会改变植株的相对位置,以有效利用光影、风雨的交互作用。过度生长的植株会被分栽或修剪,颜色不协调的会被移栽到从美学上看更怡人的地方。你拔除野草,并给需要额外照料的植株施肥。你不断关注花园的兴旺,并按照需要(对土壤、植株、布局)做出调整。——《程序员修炼之道》

在(错误的)建筑比喻中,大部分成本是预先产生的。维护成本要么是名义上的,要么被视作偶发事件而忽略不计。

在园艺的比喻中,构建功能是漫长工作中的一个步骤(就像种植作物)。花园越大,所需的维护就越多。这是在重新种植以改变布局(重构),或扩大花园并种植新作物(添加新功能 —— 这也需要维护)之外的工作。

90% 的软件成本均与维护有关 —— 我很多年前就知晓这个数据,但每每想到还是觉得难以置信。

技术债是怎么产生的?

那么,技术债究竟从何而来?它可以避免吗?

技术债务的另一种理解可能是,项目当前所处的状态与「假设利用积累的知识重新开始而现在应处的状态」之间的差值。

技术债有两个来源

  • 决策的权衡和取舍(鲁莽 vs 谨慎)

  • 制定和执行决策时所具备(或缺乏)的知识,即有意和无意

(图:技术债务象限)

理想情况下,你会在充分了解情况且不向约束条件妥协的前提下做出决策。但现实可能是,你在没有全盘了解信息和背景时就启动了项目,还要根据时间限制(如利益相关者给的截止日期)或成本限制等约束做出权衡。

如何避免技术债是一门学问,而对「技术债可否避免」这一问题,我的回答是:

“可以避免,但技术债是一种工具,不是敌人。”

如何量化技术债?

「现在有多少技术债?」这么抽象的概念真的能被量化吗?

真的很难,或者说你无法可靠地跟踪技术债。如果向软件工程师了解如何实现某个功能或修复产品的某个部分,他们可能会提供一个估算结果,并将需要偿还的技术债务涵盖在内,但你仍然无法追踪它。

Chelsea Troy 提出了一个与技术债务高度相关的可量化指标:维护负载(maintenance load) 。

维护负载描述了开发团队花费多少精力来保持现有功能同以前一样运行。—— Chelsea Troy

维护负载是有关项目年限和构建实践的函数,其衡量单位是持续付出维护精力的开发者数量(ongoing developer effort)。

需要说明的是,维护负载!= 技术债务

但它依然是一个非常不错的技术债务指标。如果需要更多的工程师来防止系统 / 项目崩溃,那么很可能意味着你有很多技术债。如果仅靠十几个人就能建立一家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/719506.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Type-C诱骗芯片LDR6500

随着科技的飞速发展,电子设备的智能化和便携化已成为趋势。在这个过程中,Type-C接口因其高速传输、正反可插以及强大的扩展能力,逐渐成为主流接口标准。然而,Type-C接口的广泛应用也带来了一系列挑战,其中之一便是如何…

CENTOS7.9下服务器双网卡bond模式6配置示例

​1.bond口的特点 bond口通过将多个网口进行聚合,多个网口聚合后一方面实现了大带宽传输,另外多网口聚合后也同时具有冗余特性,当其中一个网口down掉后,其他网口会继续转发流量,不会导致流量中断。 2.使用条件 当环境…

wireshark使用情况与网口调试记录

wireshark使用情况与网口调试记录 前言wireshark无法获取本地数据方法一——Npcap方法二——WinPcap效果 UDP组播,却一直捕获到127.0.0.1总结 前言 在网口调试中,wireshark使用较多,常出现一些无法捕获或者ip获取数据不正确的情况&#xff0…

探索设计模式——单例模式详解

前言:设计模式的作用主要是为了——利用设计方式的重用来自动地提高代码的重新利用、提高代码的灵活性、节省时间, 提高开发效率、低耦合,封装特性显著, 接口预留有利于扩展。 设计模式的种类有很多种,本篇内容主要讲解…

目标检测顶会新成果!20个突破性方法,更高性能,更强理解与分析能力!

【目标检测】在近年来的深度学习领域中备受关注,它通过识别和定位图像中的目标对象,提升了模型在图像理解和分析方面的能力。目标检测技术在自动驾驶、安防监控和医疗影像分析等任务中取得了显著成果。其独特的方法和卓越的表现使其成为研究热点之一。 为…

我整理的面向大模型的高质量语料集!

自己一直在做企业内部的垂类大模型,但随着运营深入,发现光有企业内部的领域数据还不足以微调出一个健壮的领域大模型,因为泛化能力比较弱。 在领域数据中融入公共数据进行训练是公认的提升领域大模型泛化能力的方法,下面是我整理的…

《 穿越时空的代码、在回首:Evil.js两年后的全新解读 》

破坏计算机系统罪可能香翅捞饭!!! 本文以源码解析,场景复现,毒与药1.0.0攻防战,来主导本次攻击下毒、防守破解 只有周日才注入,当周日产生bug时,工作日程序员进行debug时将不会进行…

JavaScript和promise——0_1 promise

文章目录 是什么?未来值回调和未来值在回调环境下这么和未来值交互?群居的未来值其他的解决方案 这样写可以实现目标效果。可是,这样写优雅吗? 英雄登场关键词:then关键词:回调 为什么promise不需要start函…

【机器学习】CART决策树算法的核心思想及其大数据时代银行贷款参考案例——机器认知外界的重要算法

目录 引言 概述 CART决策树的特点 核心思想 减少不确定性的指标 基尼系数(Gini Index) 分类错误率 熵 银行实例 背景 数据准备 模型构建 模型评估与优化 应用与结果 代码示例 ✈✈✈✈引言✈✈✈✈ CART算法既可以用于分类问题&#xff0…

Simulink代码生成: 状态机的其他建模方法

本文研究状态机建模的一些方法和技巧。 文章目录 1 引入2 状态机建模方法2.1 状态机中的计时2.2 状态机中的计数2.3 转移顺序 3 总结 1 引入 博主一直很喜欢用Simulink中的状态机建模,在这里想记录一下自己平时使用Stateflow建模的心得。因为自身行业所限&#xff…

深入理解并打败C语言难关之一————指针(3)

前言: 昨天把指针最为基础的内容讲完了,并且详细说明了传值调用和传址调用的区别(这次我也是做到了每日一更,感觉有好多想写的但是没有写完),下面不多废话,下面进入本文想要说的内容 目录&#…

【数据结构】第十七弹---C语言实现选择排序

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、选择排序 1.1、基本思想 1.2、代码实现 1.3、代码测试 1.4、时空复杂度分析 总结 1、选择排序 1.1、基本思想 选择排序是一种简单直观的比…

【测试专题】系统测试报告(原件Word)

软件测试报告在软件开发过程中起着至关重要的作用,主要有以下几个主要原因: 1、确保软件质量 2、提供决策支持 3、记录测试过程和结果 4、促进沟通和协作 5、符合标准和法规要求 6、改进测试流程和策略 7、降低风险 软件开发全套资料获取进主页或者本文末…

如何判断三相交流电子负载的性能

三相交流电子负载是模拟实际负载的设备,用于测试电源、变频器、逆变器等电力电子设备的性能。在购买和使用三相交流电子负载时。 三相交流电子负载能够稳定输出的最大有功功率,额定功率越高,说明负载的承载能力越强。在选择三相交流电子负载时…

计算机相关专业是否仍是“万金油”的选择?

亲爱的朋友们: 2024 年高考已然落幕,数百万高三学子站在了人生的重要十字路口,面临着选择大学专业这一关键抉择。在这个节点上,计算机相关专业是否还能被称为“万金油”的选择呢? 相信大家都知道,在最近这几…

【前端项目笔记】2 主页布局

主页布局 element-ui提供的组件名称就是它的类名 ☆☆ CSS选择器: (1)基本选择器 类型选择器 p/span/div…… 类选择器 (.classname) ID选择器 (#idname) 通配选择器 ( * ) (2)属性选择器 选择具有特定属性或属性值的…

k8s删除状态为 Terminating 的pod

卸载calico pod时候pod资源状态会卡在terminating,这时候需要手动进行删除 使用以下命令即可 kubectl delete pod podName -n NAMESPACE --force --grace-period0记住一定要加命名空间,不然会报错没有找到

Android可穿戴设备世界之旅

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 介绍 Android通过在电视、穿戴和汽车等各种电子模块中扩展下一代应用开发概念,扩展了其整个范围和可…

计算机网络:6应用层

概述 客户/服务器方式和对等方式 客户/服务器(Client/Server,C/S)方式 客户和服务器是指通信中所涉及的两个应用进程。 客户/服务器方式所描述的是进程之间服务和被服务的关系。 服务器总是处于运行状态,并等待客户的服务请求。 …

C# + easyui 写的一个web项目

用C# easyui 来开发,其实就是为了开发速度,用easyui可以一天写很多页面,比一些低代码平台还快。 登陆页面 主界面 记录数统计 家庭信息采集表 新建家庭 家庭成员 低保、五保人员帮扶情况登记表 低保、五保人员帮扶情况登记表的新增和编辑 治…