写点什么

关于何时偿还技术债务的建议

  • 2013-12-18
  • 本文字数:1638 字

    阅读完需:约 5 分钟

Spotify 的敏捷教练 Henrik Knibert 最近了一篇文章,论述了为什么有一些技术债务可以成为一件好事以及可以将其作为判断系统质量的依据。

Henrik 写到,应该避免并有计划地偿还“旧债务”。他还写到,在得出一套“简洁优雅的解决方案”之前,一段时间的试验性尝试和探究是改正一项功能以及理解解决方案的一部分。这种债务应该立即偿还。旧债务会使软件栈衰败并导致交付速度越来越慢。他把这一点与一些日常类比进行了比较:

如果一个人打开电脑开始做新的事情,却发现昨天做事时打开的许多窗口和文档仍然打开着,那会降低做事效率。就像如果一个人去厨房做晚饭却发现里面满是昨天用过的盘子和剩饭剩菜。

Hayim Makabee 是 Yahoo! 的研发工程师和以色列国际软件架构师协会的联合创始人。最近,他写了一篇题为“避免技术债务:如何逐步增加技术储备(Techical Savings)”的博文,探讨了技术储备的问题,认为良好的并且适应性强的设计可以预先偿付债务。他写到“重构干扰(Refactoring Distractor)”,认为在那种情况下有太多的时间花在了后来的重构上。Hayim 提倡“预先适应性设计(Adaptable Design Upfront,缩写为ADUF)”范式,通过这种方式,他认为可以使用 SOLID 原则围绕对高层次概念的初步了解创建基于组件的设计。这样,可以在具体实现和组件交互时处理理解上的变化。ADUF 与 XP 创始人 Martin Fowler 关于用演进式设计代替“预先做大量设计(Big Up Front Design)”的主张有一些相似之处。他先前写到“设计人员需要学习如何做一个简单的设计,如何使用重构保证设计的简洁,以及如何在演进式方式中使用模式。”

在写到 ADUF 时,Hayim 阐述了该方式的一个切实可行的实现:

框架中的每个组件都应该设计成高内聚的,而且框架本身的设计应该使各组件之间是弱耦合的。如果组件接口真是抽象的,并且如果这些组件之间真是弱耦合的,那么框架中的每一类组件都可以看作一种插件。

术语“技术债务”的发明人 Ward Cunningham 在今年早些时候接受了网站 OnTechnicalDebt.com 采访。在探讨提前偿还技术债务时,Ward 认为,如果不想“冒没钱花或者交付一半功能点代码的风险”,那是一个选项。他还指出,在现代持续交付的世界里,缺陷和不良设计都有其可接受的水平:

……当然,有许多方法可以用来构建能够工作的软件,其中一个甚至使我现在都惊讶的观点是,那些运营大型网站并尽可能快地捕获登录信息的人常说,他们给予质量的关注比他们认为需要给予的更少,而他们给予弹性的关注则更多——也就是即使出现错误仍能继续推进的能力。

Henrik 认为,软件永远不会完美,编写无债务代码的机会成本可以从交付次数中看出来。

从理论上讲,把每个功能的技术债务降为零会非常棒。而实际上,这还涉及 80/20 规则。将技术债务保持在一个低水平上所需的工作量还比较合理,但消除剩下的一点点技术债务所需的工作量却高的离谱。

他建议引入债务上限来处理由于过程缺陷而生成的债务。虽然大部分新债务可以实时地偿还,但当达到债务上限的时候,所有的资源都应该致力于降低债务水平:

债务上限应该设置的足够高,那样就始终都不会达到上限,还应该足够低,那样达到上限的时候也不会遭受无法挽回的损失。

虽然可能永远无法达到零债务的状态,但 Hayim 的 ADUF 模式提供了一种可以用来做这种预先储备的方法。Henrik 和 Ward 提醒我们,接纳技术债务是为了在可接受的时间范围内交付可用的产品有意做出地一种让步。Hendrik 在文章末尾指出,债务积累的越多,就越会阻碍未来开发和团队精神的发展。Henrik 已经向我们证明,通过监控技术债务可以更好地了解风险点和平台健康状况。控制技术债务水平并有计划地偿还债务是我们之后必须积极地予以优先考虑的。

Henrik 写道:

一个简洁的代码库不仅能使工作效率更高,而且它更有趣(或者不那么让人厌烦,如果读者更喜欢以这样的方式看事情……)。它还会激励开发人员,有助于他们更快地创建更好的产品,这反过来又会使客户和开发人员都更愉快。一个很好的良性循环。

查看英文原文:**** Advice on When to Repay Technical Debt

2013-12-18 07:042124
用户头像

发布了 256 篇内容, 共 85.5 次阅读, 收获喜欢 12 次。

关注

评论

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

软件测试面试真题 | 面试时被问到知识盲区,该怎么办呢?

测试人

软件测试 面试题 测试开发

3层结构+7大特点,带你认识华为云IoTEdge

华为云开发者联盟

云计算 物联网 华为云 企业号十月 PK 榜

RocksDB 7 终于解决了 Compaction 时性能下降问题

Kvrocks

redis RocksDB kvrocks

ModelBox姿态匹配:抖抖手动动脚勤做深呼吸

华为云开发者联盟

人工智能 华为云 企业号十月 PK 榜

知象光电完成过亿元C轮融资,加速发力全球市场

硬科技星球

HummerRisk V0.5:新版云合规报告、资源风险联动、拓扑展示等内容

HummerCloud

云安全 云原生安全 11月月更

从柯里化讲起,一网打尽 JavaScript 重要的高阶函数

掘金安东尼

前端 11月月更

uniapp简单入门

格斗家不爱在外太空沉思

vue.js uniapp 11月月更

前端面经

肥晨

前端面试题 11月月更 前端面筋 超全面试题

河北首家城商行传统核心业务国产化,TDSQL突破三“最”为秦皇岛银行保驾护航

腾讯云数据库

数据库 分布式 tdsql 客户案例 腾讯云数据库

DevData Talks | 让效能度量产生真正的价值,要避开多少“坑”?

思码逸研发效能

研发效能 研发管理工具 企业研发管理

Serverless Developer Meetup 杭州站精彩回顾!【附赠PPT】

阿里巴巴云原生

阿里云 Serverless 云原生

EMQ《物联网平台大规模数据接入和处理性能评测方法》成功入选“可信边缘计算推进计划”

EMQ映云科技

物联网 IoT 边缘计算 边云协同 11月月更

写给关系数据库开发者的 TDengine 入门指南

TDengine

数据库 tdengine 时序数据库

uniapp多端分享(app,小程序,公众号)

格斗家不爱在外太空沉思

vue.js uniapp 11月月更

京东云开发者|IoT运维 - 如何部署一套高可用K8S集群

京东科技开发者

运维 k8s IoT etcd K8s 多集群管理

为什么要用CSS精灵图

源字节1号

软件开发 前端开发 后端开发 小程序开发

dns-client占用cpu过高的问题解决方案

我是一个茶壶

win10 DNS 11月月更

JavaScript的垃圾回收机制

肥晨

js 垃圾回收机制 11月月更

GoFrame的gmap相比Go原生的map,天然支持排序和有序遍历!?

王中阳Go

Go golang 高效工作 学习方法 11月月更

【C语言】break 关键字

謓泽

11月月更

2022世界互联网大会 | VoneCredit为中小企业纾困解忧

旺链科技

区块链 产业区块链 世界互联网大会 企业号十月PK榜

计算机网络:组帧

timerring

计算机网络 11月月更

SOFARegistry | 大规模集群优化实践

SOFAStack

开源 SOFA SOFARegistry'

web--文件上传

我是一个茶壶

WEB安全 文件上传 11月月更

不借助 Fiori client,直接在手机浏览器里调用 SAP UI5 BarcodeScanner 实现条形码扫描的可能性?

汪子熙

JavaScript 前端开发 Fiori SAP UI5 11月月更

微信小程序—制作一个简单的跑步小程序

格斗家不爱在外太空沉思

JavaScript 微信小程序 11月月更

HTTP和HTTPS是什么 二者区别是什么

肥晨

11月月更 http和https http工作原理

装了我这 10 个 IDEA 神级插件后,同事也开始情不自禁的嘚瑟了

沉默王二

IntelliJ IDEA

Paddle模型性能分析工具Profiler:定位瓶颈点、优化程序、提升性能

汀丶人工智能

自然语言处理 nlp 性能分析 11月月更

云数据库时代,DBA将走向何方?

华为云开发者联盟

数据库 后端 华为云 企业号十月 PK 榜

关于何时偿还技术债务的建议_研发效能_Rafiq Gemmail_InfoQ精选文章