写点什么

如何偿付技术债务

  • 2010-12-17
  • 本文字数:1311 字

    阅读完需:约 4 分钟

Paul Tevis 的团队在四个月前开始使用 Scrum。 该项目拥有大量技术债务,他正在努力解决如何跟踪和偿付技术债务的问题。 Tevis 写到:

我关心的问题是:(1)我们一开始跟踪非故事的任务,就无法集中于交付客户的价值;(2)如果我们不让这些任务可见,那么就无法以需要的速度取得进展。 对于解决不是直接与故事相关(或者涉及到多个故事)的技术债务,你有什么好的模式吗?

什么是技术债务? Ward Cunningham 创造了“技术债务”这个词,它指的是组织为了达到短期的目标,而降低代码质量时所造成的债务。 想要重新提高代码质量,马上解决会很容易,而做的越晚,成本就越高。 额外的成本就是技术债务的“利息”。

Malcolm Anderson 创建了一个案例,它与特定情况下的技术债务相关

之所以使用短期的技术债务,会有很多种原因。 让我使用利息率为 36% 的信用卡作为比喻。 你不想使用那个卡。 但是,当拥有很大的业务合理性的时候,你就会在短期的情况下使用那个卡。

但是 Adam Sroka 反对说

如果你想要做出业务决定,至少要知道: 1. 我会花费多少?
2. 会产生多少利息? 会经过多长时间?
3. 我是否有足够的收入来偿付?

当团队自发地采用技术债务的时候,甚至很少有人(如果有的话)知道以上任何一个问题的答案。

不管这是否是个好主意,在 Tevis 的案例中,债务已经发生了。 那么我们如何才能在项目中减少已经存在的技术债务呢?

Roy Morien 为如何偿付技术债务的问题提供了两种可能的解决方案

你真的需要做出这么困难的选择吗? 我想,如果你的“技术”开发需求那么重要,那么大,或者那么多,那么暂停面向用户的开发是否是可行的呢?那样你可以把那些技术问题理清并清理掉。 或者,是否可以重新分配一些开发者来解决这些技术问题,同时团队中其它人员会继续开发面向用户的内容。 这可能会影响团队的效率,但那又怎么样呢?

然而,Ron Jeffries 并 不同意这两个方法

当技术问题是由故事驱动的时候,处理它才会最有效。 代码库可能到处都需要处理,但是只有在因为面向用户的原因工作的代码才需要偿付技术债务。 如果某些糟糕的代码没有涉及到任何故事,那么对它所做的工作就是很大程度上的浪费。

因此,我更喜欢像平时那样(但可能很少会那样)采用故事的方法,并且遵循“童子军军规”,在离开营地时让它比我们找到时更干净。 也就是说,在故事引领我们到达的地方,让我们编写更多的测试,并更积极地进行更多的重构。

这个方法至少拥有以下优点:

  • 保持故事“最敏感”的流程;
  • 发动所有团队智慧来提供帮助;
  • 让整个团队知道如何保持代码整洁;
  • 专注于对需要的地方进行改善;
  • 不浪费精力在可能需要的改善上;

… 以及更多。

而“banshee858”提供了下面的建议(他最初信任 Tobias Mayer),这与 Jeffries 的方法非常吻合:

在很小的便利贴上列举所有技术债务,并把它们贴到任务板上。 当为 Sprint 选择产品 Backlog 项目(PBI)的时候,看一下各个技术债务,并找到处理 PBI 的同时可以合理完成的那些项目。 把它们添加到 PBI 的工作范围之内,并估计需要多长时间才能完成特性和技术债务内容。 使用这种方式,你就可以看到技术债务方面的工作,并且能够区分出优先次序,与真正的价值关联起来。

查看英文原文: How To Pay Down Technical Debt

2010-12-17 18:431530
用户头像

发布了 340 篇内容, 共 129.0 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

Spring Boot FatJar类加载机制简要分析

luojiahu

Spring Boot 类加载 ClassLoader FatJar

react源码解析4.源码目录结构和调试

全栈潇晨

React Hooks react源码

React Hooks - 如何安全地使用state

蛋先生DX

大前端 React React Hooks JavaScrip 6月日更

你们公司的数据库出过问题么?

escray

学习 极客时间 朱赟的技术管理课 6月日更

BZZ算力挖矿系统开发功能丨BZZ算力挖矿源码设计

系统开发咨询1357O98O718

GrowingIO 前端团队对于 GraphQL 的实践总结

GrowingIO技术专栏

大前端 graphql

中断Hwi:提高鸿蒙轻内核系统实时性及执行效率的秘密武器

华为云开发者联盟

鸿蒙 硬件 中断 鸿蒙轻内核 中断信号

面试系列-2 redis列表场景分析实践

李阿柯

php 面试 redis cluster

在Spring Bean实例过程中,如何使用反射和递归处理的Bean属性填充?

小傅哥

Java spring 小傅哥 反射调用 属性填充

HarmonyOS 2正式发布 硬件生态品牌HarmonyOS Connect一同亮相

科技汇

情指勤一体化指挥调度平台搭建,情报研判分析系统搭建

k8s 插件管理工具之krew使用

雪雷

6月日更

手把手教你在IDEA中配置Maven

打工人!

Java maven 6月日更

深圳首辆数字人民币主题观光巴士亮相

CECBC

一文了解预训练语言模型!

博文视点Broadview

直击Huawei Mate 40产线背后的华为云IoT智能制造

华为云开发者联盟

IoT 数字化转型 数字孪生 华为云IoT

详解Camtasia的注释功能

淋雨

视频剪辑 Camtasia 录屏

关于第四次财富狂潮的思考,区块链如猛虎出笼?

CECBC

Hello Python! 第一天学 Pyhton 语言

在即

6月日更

Redis数据结构

邱学喆

数据库 redis 跳跃表

实现多级缓存架构设计方案

xcbeyond

缓存 缓存架构 6月日更

【Vue2.x 源码学习】第二篇 - Vue的初始化流程

Brave

源码 vue2 6月日更

“扯皮”终结者,区块链帮农民工计薪水

CECBC

Dubbo SPI

青年IT男

dubbo

微博评论的高性能高可用计算架构设计

唐高为

分治(详解残缺棋盘 —— Java代码实现)

若尘

算法 分治 java代码 6月日更

ARTS- 日常打卡5

pjw

面试系列-3 限流场景实践

李阿柯

php lua redis 面试 限流算法

致恰达耶夫,致鸿蒙

脑极体

【Flutter 专题】114 图解自定义 ACEProgressPainter 对比进度图

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

有点难的 webpack 知识点:Dependency Graph 深度解析

范文杰

webpack 6月日更

如何偿付技术债务_研发效能_Dan Puckett_InfoQ精选文章