研发团队的「技术债」如何进行量化管理?

我共事过的每个团队都会讨论技术债。有些团队知道如何管理它,也有些团队因此崩溃瘫痪,甚至有一家公司因为技术债务没有得到解决而宣告失败。

什么是技术债务?

在这里插入图片描述

「债务」这个比喻非常恰当。最早提出「技术债务 Technical Debt」比喻的工程师 Ward Cunningham 对此做了详细的解释:

有了借来的钱,你可以比采用其他方式更快地做某件事情,但在还清这笔钱之前,你需要支付利息。我认为借钱是个好主意,我也认为赶快对外发布软件以获得经验是个好主意,但当然,你最终会回到这来,并且随着你愈加了解软件,你会通过重构程序来偿还那笔贷款,以此反映你所获得的经验。

本文将与你讨论技术债是如何产生的。但在那之前,我们先了解一些与技术债的产生原因和本质有关的常见误解。

误区一:技术债务 == 坏代码

到底什么是「坏代码」?

好的代码或许是整洁的代码,也可以概括为不会迫使你在未来做出特定决策的代码,它保留了选择的余地。而坏代码则不留余地,还会强加上一些原本不存在的约束。

我几乎没见过由「糟糕的开发者」编写的「坏代码」,至少在生产项目中没有(这正是代码审查的作用)。我遇到的大多数「坏代码」都出自受到约束影响的优秀的开发者。

在这里插入图片描述

误区二:技术债是错误的

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

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

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

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

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

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

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

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

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

技术债是怎么产生的?

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

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

技术债有两个来源

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

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

在这里插入图片描述

(图:技术债务象限)

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

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

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

如何量化技术债?

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

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

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

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

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

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

但它依然是一个非常不错的技术债务指标。如果需要更多的工程师来防止系统/项目崩溃,那么很可能意味着你有很多技术债。如果仅靠十几个人就能建立一家价值 10 亿美元的公司,那么他们大概率很好地控制住了技术债。

(作者 Jacob Bennett,内容经 LigaAI 翻译整理。)


了解更多技术干货、研发管理实践等分享,请关注 LigaAI。

邀您体验 LigaAI-智能研发协作平台,开启 AI 驱动的智能研发协作!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux(Centos7)OpenSSH漏洞修复,升级最新openssh-9.7p1

OpenSSH更新 一、OpenSSH漏洞二、安装zlib三、安装OpenSSL四、安装OpenSSH 一、OpenSSH漏洞 服务器被扫描出了漏洞需要修复,准备升级为最新openssh服务 1. 使用ssh -v查看本机ssh服务版本号 ssh -V虚拟机为OpenSSH7.4p1,现在准备升级为OpenSSH9.7p1…

Centos7 安装oracle 11.2.0.4

荆轲刺秦王 1. 准备工作 需要下载 Oracle 11g 安装包 2.HostName修改: hostnamectl set-hostname oracle 3. 配置hostname(本机IP映射)注意:192.168.116.129 需要换乘本地ip vi /etc/hosts 192.168.116.129 oracle # 测试hos…

创新实训2024.06.17日志:大模型微调总结

前段时间其实我们已经部署了大模型,并开放了对外的web接口。不过由于之前某几轮微调实验的大模型在对话时会有异常表现(例如响应难以被理解),因此我在项目上线后,监控了数据库里存储的对话记录。确定了最近一段时间部署…

docker部署prometheus

1.拉取镜像 docker pull prom/prometheus2.创建配置文件 cd /root/prometheus touch prometheus.yml touch first_rules.yml3.配置文件内容 prometheus.yml文件内容 # my global config global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Defau…

Docker的常见问题

1.容器启动失败 检查映像&#xff1a;运行 docker images 确认所需映像存在。检查Dockerfile&#xff1a;验证Dockerfile中的指令无误。查看日志&#xff1a;使用 docker logs <container_id> 查找启动失败的具体原因。资源检查&#xff1a;运行 docker info 或 docker …

基 CanMV 的 C 开发环境搭建

不论是使用 CanMV 提供的基于 C 语言和 FreeRTOS 的应用开发方式开发应用程序或是编译 CanMV 固件&#xff0c;都需要搭建基于 CanMV 的 C 开发环境&#xff0c;用于编译 CanMV 源码。 1. 开发环境搭建说明 CanMV 提供了基于 C 语言和 FreeRTOS 的应用开发…

模拟面试三

1. 你能介绍一下什么是微服务架构&#xff1f; 答案&#xff1a;微服务架构是一种软件开发方法&#xff0c;将一个应用程序拆分成一系列小型、自治、可独立运行的服务&#xff0c;每个服务都专注于完成一个特定的业务功能&#xff0c;并通过轻量级的通信机制进行互联。 2. 你…

【教程】hexo 更换主题后,部署在 Github Page 无 CSS 样式

目录 前言环境hexo 更换主题解决部署到 Github Page 后无 CSS 样式的问题 前言 最近更换了 hexo 的主题后&#xff0c;重新部署到 Github Page 上发现不显示 CSS 样式&#xff0c;但在本地启动时又是正常的效果。此外&#xff0c;检查资源请求&#xff0c;发现多个 .css 文件请…

VO 和 DO

什么是 VO? VO&#xff08;Value Object&#xff09; 值对象&#xff08;Value Object&#xff0c;简称 VO&#xff09; 是一种对象&#xff0c;它主要用于在不同的层次之间传递数据。VO 通常是不可变的&#xff0c;即它的状态一旦被创建&#xff0c;就不会改变。值对象没有…

【软件测试】软件测试入门

软件测试入门 一、什么是软件测试二、软件测试和软件开发的区别三、软件测试在不同类型公司的定位1. 无组织性2. 专职 OR 兼职3. 项目性VS.职能性4.综合型 四、一个优秀的软件测试人员具备的素质1. 技能相关2. 非技能相关 一、什么是软件测试 最常见的理解是&#xff1a;软件测…

【效率提升】倍速插件Global Speed

global speed插件可以控制网页在线视频&#xff0c;能够应用在Edge和Google浏览器中&#xff0c;只需要在插件商店中下载并配置即可。这款插件的配置选项有很多&#xff0c;支持视频倍速&#xff08;最低0.25倍速&#xff0c;最高16倍速&#xff09;&#xff0c;固定标签页&…

【Java开发规范】IDEA 设置 text file encoding 为 UTF-8,且文件的换行符使用 Unix 格式

1. IDEA 设置 text file encoding 为 UTF-8 file -> settings -> editor -> code style -> file encoding Transparent-native-to-asci conversion 要不要勾选&#xff1f;> 不推荐勾选&#xff08;它的作用是用来自动转换ASCII编码&#xff0c;防止文件乱码&am…

Modbus协议转Profibus协议模块接热传感器配置攻略

一、前言 在工业自动化控制领域&#xff0c;Modbus协议和Profibus协议是两种常见的通讯协议&#xff0c;它们在设备之间传输数据起着至关重要的作用。而Modbus协议转Profibus协议模块&#xff08;XD-MDPB100&#xff09;设备&#xff0c;则扮演着连接不同通讯协议的桥梁角色。…

常规业务如何做到幂等性

一、前端防抖处理&#xff1a; 采用队列模式&#xff0c;队列插入判重处理&#xff0c;避免多次同事调用接口 二、后端处理 1、新增接口可根据数据库设计采用唯一索引方案机制&#xff0c;避免重复调用 2、更新采用乐观锁 例如update table set where version指定值 3、采用状态…

来点干货,比较好用的3D在线展示网站

制作好的3D模型需要客户对3D模型进行确认&#xff0c;图片和视频给过去&#xff0c;后面往往都会扯皮。无意间翻到几个3D展示网站&#xff0c;试用了下都不是很完善&#xff0c;后面在网上大量查阅资料并经过实际使用&#xff0c;发现几个相对比较好用值得推荐的。 1、Sketchf…

掉电安全文件系统littlefs移植

前言 通过查看oneOS中对littlefs的移植工作&#xff0c;发现&#xff0c;littlefs源码本身&#xff0c;有用的就4个&#xff1a; lfs.clfs.hlfs_util.clfs_util.h 剩下的就是适配层&#xff1a; dfs_lfs.clfs_config.h(和lfs_util.h差不多)lfs_crc.c(和lfs_util.c差不多) …

Python 数据持久化:使用 SQLite3 进行简单而强大的数据存储

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 SQLite3是一种轻量级嵌入式数据库引擎&#xff0c;它在Python中被广泛使用。SQLite3通常已经包含在Python标准库中&#xff0c;无需额外安装。你只需导入 s…

IRIS论文阅读笔记

这是ICLR2023一篇world model的论文&#xff0c;提出了一个称为IRIS的world model方法模型仍然是分为两部分&#xff0c;一部分是模拟世界的world model&#xff0c;包括预测下一帧的观测&#xff0c;预测当前reward&#xff0c;预测是否terminate的三个输出&#xff1b;第二部…

BGP简介

BGP 的概念定义 BGP 的概念&#xff1a; 边界网关协议&#xff08;Border Gateway Protocol&#xff0c;BGP&#xff09; 一种用于在不同自治系统&#xff08;AS&#xff09;之间交换路由信息的动态路由协议。互联网的核心路由协议之一&#xff0c;确保了全球网络的互联性和…

Linux ubuntu安装pl2303USB转串口驱动

文章目录 1.绿联PL2303串口驱动下载2.驱动安装3.验证方法 1.绿联PL2303串口驱动下载 下载地址&#xff1a;https://www.lulian.cn/download/16-cn.html 也可以直接通过CSDN下载&#xff1a;https://download.csdn.net/download/Axugo/89447539 2.驱动安装 下载后解压找到Lin…