写点什么

技术债务量化的局限:你依赖这些数值吗?

2015 年 10 月 11 日

下面是发生在会议午餐期间的一个对话片段:

参与者 A:接下来你要参加哪一场?

参与者 B:我在考虑参加这个关于技术债务的演讲。

参与者 A:噢,技术债务……我们已经使用工具“XYZ”精确地量化了技术债务的量,用偿还债务所需要的工作量来表示,单位为人力小时。它甚至为我们提供了漂亮的图表和可视界面。因此,我不需要参加这个演讲了!

这段对话在我的脑海中引发了一个有趣的问题:在成本和工作量方面,借助当前可用的技术债务工具,能准确地知道软件有多少技术债务吗?这样的一种量化可能在所有方面准确而完整吗?

当前可用的技术债务量化工具和框架所提供的量化数据是不准确、不完整的。为什么呢?考虑下以下原因:

  • 缺乏一致的技术债务量化维度:技术债务有各种维度,包括代码债务、设计债务、架构债务、文档债务和测试债务。技术债务并没有一个普遍接受的范围定义。例如,许多人认为,已知的缺陷也构成技术债务。当前这套技术债务量化工具并没有明确地描述它们所采用的技术债务的维度范围。这会导致一种误解:使用工具的用户会认为,工具得出的结论是完整而准确的,因此,除了工具所提供的信息外,他没有必要为技术债务的维度操心。
  • 对各种技术债务维度的识别和量化支持较差:当前可用的技术债务量化工具仅仅关注几个维度,比如代码债务和一定程度的设计债务和测试债务。对于同其它维度相关的问题,比如架构债务或文档债务,这类工具并没有提供全面的检测支持。实际上,对于所支持的维度,其全面性也是有问题的。例如,这样的工具识别和报告了多少设计债务问题(或设计味道)?虽然这样的工具支持一套设计规则(可以检测设计味道),但这样的规则也屈指可数。而且,处理由底层分析工具生成的主动错误信息(即错误警报)本身就很困难。
  • 笼统地绝对化:技术债务量化工具将识别出的问题转换成修复它们所需要的绝对工作量。修复技术债务问题(尤其是设计和架构相关的问题)所需的工作量会随问题上下文(比如,严重性、范围、平台、技能)的变化而变化。这样一来,笼统地绝对化所产生的估计值与实际情况远不相符。因此,这样的量化最多只能是一种近似,而且必须这样看待它(而不是作为什么板上钉钉的事情)。
  • 缺少利息部分:任何类型的债务都有两个部分:本金 _ 和 _ 利息。当前可用的技术债务量化工具都关注(和计算)与技术债务问题相关的本金,而忽视了利息部分。这使得量化并不可信。一些研究者(比如 Ariadi Nugroho 等人 [1] 和 Vallary Singh 等人 [2])提出了方法,用于计算本金随着时间推移所累计产生的利息。然而,当前的工具并没有包含同他们的技术债务计算相同的方式。利息部分——尤其是关系到增加了理解难度——非常难以(如果可能的话)准确地量化。

让我们讨论两个例子,说明一下为什么当前可用的技术债务量化工具不完整、不准确:

  1. 例子 1:考虑下这样一种情况,有一个大型的企业软件产品正处于维护阶段。软件的原始设计严格遵循分层设计风格(即每一层都只能访问其下面直接相邻的层)。一个架构师最近加入了该项目,他借助架构分析工具在整个代码中识别出了数以百计的分层违规之处。这些债务问题包括“跳跃调用”(即一个层直接访问了一个更低的层,而不是通过其下面直接相邻的层)和“回调”(即一个层调用了它上面的层,这在分层设计风格中是被禁止的)。他们的团队已经使用技术债务量化工具作为质量监控仪表盘的一部分。然而,这些技术债务量化工具并没有覆盖这个架构债务维度,因此,工具所展示的技术债务情况有误导性。
  2. 例子 2:考虑下量化一个订单处理系统的技术债务。假如在之前的其中一次发布中,为了赶在最后发布期限之前发布,作为一个捷径,与税务相关而与订单处理无关的复杂计算被添加到一个现有的 Order 类中,并计划稍后修复。这在技术债务中属于“慎重和故意”[3] 的情况。现在,代码分析人员通常不会发现这个问题。设计分析人员很可能会发现这个问题——如果该类内聚性特别低(由于与税务相关但与 Order 类无关的职责被添加到这个类中)。例如,Designite[6] 会将这样一个设计味道识别为“多元抽象(Multifaceted Abstraction)”。需要重点注意的是,只有你所使用的技术债务量化工具直接或间接(借助其它工具)地检测设计味道,并将它们作为技术债务的一部分,上述识别出的技术债务问题才会成为整个软件技术债务的一部分。

味道的严重程度如何?重构味道,偿还技术债务,需要多大的工作量?味道的严重性和重构味道所需的工作量取决于许多方面:现有类的大小、错位功能的大小和复杂度(即涉税计算)、代码库的其它部分在多大程度上使用了作为 Order 类一部分的涉税特性、现有类承担涉税职责的可能性、Order 类单元测试的可用性等等。这看起来一点都不简单。

重构味道的工作项可能已经在待办事项中存在许多年了。维护软件的开发人员会发现很难理解为什么涉税功能会在 Order 类中。他们不得不围绕这个问题处理工作,不断地向 / 围绕涉税功能增加新的代码,使得在未来版本中对其重构更加困难。这就是所招致的技术债务(本金是原先走了捷径,将涉税功能添加到现有的 Order 类中)的 _ 利息 _ 部分。技术债务量化工具(据我们所知,目前所有的此类工具)在量化技术债务时忽视了 _ 利息 _ 部分。即使有任何工具考虑了 _ 利息 _ 部分,也很难(如果可能的话)准确地量化技术债务在认识、理解和处理作为 Order 类的一部分但与 Order 类不相关的涉税功能上增加了多大的困难。

还不相信吗?可以尝试在同样的代码库上运行不同的技术债务量化工具,然后交叉检验量化结果——你将会惊讶地发现,它们之间有多大的差别!

注意:我们无意冒犯任何工具供应商,因此,我们故意避免提及任何技术债务量化工具。我们也使用技术债务量化工具并且喜欢它们,但是我们也希望提醒读者注意它们的局限性,尤其是不要 _ 依赖 _ 它们生成的数值。

小结

技术债务很好地充当了沟通拙劣设计结果和持续重构需求的隐喻。当我们试图测量和量化技术债务时,它变得同准确测量软件生产力或者量化软件质量一样困难!

当然,工具量化技术债务的某些方面,分配货币值(或者参数化这些量化),有助于我们了解技术债务的程度,为我们提供一种跟踪技术债务偿还进度的方法。不过,需要谨慎对待它们提供的成本和工作量估计。

由于技术债务是走捷径或者做出次优设计决策所招致,所以债务本身就很难准确完整地量化(不像财务债务,数量和利息都可以清楚地计算出来)。务必将由工具得出的、从工作量和成本角度量化的技术债务当作 _ 估计,仅仅是估计,而不是绝对真理 _。

参考资料

[1] Ariadi Nugroho、Joost Visser、Tobias Kuipers.2011.An empirical model of technical debt and interest. 第二届“技术债务管理”研讨会汇编.ACM,New York,NY,USA,1-8.DOI=10.1145/1985362.1985364.

[2] Vallary Singh、Will Snipes、Nicholas Kraft. A Framework for Estimating Interest on Technical Debt by Monitoring Developer Activity Related to Code Comprehension,第六届技术债务管理国际研讨会,国际软件维护与发展会议,2014(ICSME 2014).

[3] Martin Fowler.“技术债务象限”.(最后访问2015.05.26)

[4] “重构软件设计味道:管理技术债务”,Girish Suryanarayana、Ganesh Samarthyam、Tushar Sharma,ISBN - 978-0128013977,Morgan Kaufmann/Elsevier,2014.

[5] Alexandra Szynkarski,同 Ward Cunningham & Capers Jones 的技术债务之争.(最后访问2015.05.25)

[6] Designite——一个设计定量评估工具.(最后访问 2015.05.26)

关于作者

Tushar Sharma 目前是印度班加罗尔西门子技术与服务分公司研究与技术中心的一名专家。他在西门子的工作涵盖软件设计、重构、设计味道、代码和设计质量、设计模式和变更影响分析等相关主题的研究,并提供咨询和培训。软件设计和重构是他的兴趣所在,他一直致力于这方面的研究,并获得了多项专利,发表了数篇研究论文及工具。他拥有位于印度钦奈的印度理工学院马德拉斯分校(IIT-M)计算机科学理工硕士(研究型)学位,专修设计模式和重构。他与人合著了两本书:第一本是 2013 年 2 月由 Apress 出版的“Oracle Certified Professional Java SE 7 Programmer Exams 1Z0-804 and 1Z0-805”;第二本是 2014 年 11 月由 Morgan Kaufmann 出版的“Refactoring for Software Design Smells: Managing Technical Debt”。他是 IEEE 高级会员。他的 Twitter 账号为 @Sharma__Tushar。

Ganesh Samarthyam 有超过 12 年的 IT 行业经验。他目前居于印度班加罗尔,是一名企业培训师兼独立顾问。在过去的 6 年中,他为西门子(班加罗尔公司研究与技术)的“软件架构和开发”团队工作。在为西门子工作之前,他在班加罗尔的 Hewlett-Packard C++ 编译器团队工作了 4.5 年。在 2005 年到 2007 年间,他还代表 HP 担任 ANSI/ISO C++ 标准委员会(JTC1/SC22/WG21)的成员。他是一名获得 IEEE 认证的软件工程认证讲师。他已经发表 / 与人合作发表了许多文章、研究论文和著作。他的最新著作“Refactoring for Software Design Smells: Managing Technical Debt”由 Morgan Kaufmann/Elsevier 出版(2014 年 11 月)。更多信息请访问他的网站或者 LinkedIn 页面][5] 。他的 Twitter 账号为 @GSamarthyam。

查看英文原文: Limitations of Technical Debt Quantification: Do You Rely on These Numbers?

2015 年 10 月 11 日 19:241304
用户头像

发布了 1008 篇内容, 共 308.1 次阅读, 收获喜欢 272 次。

关注

评论

发布
暂无评论
  • 怎么尽量“不写”代码?

    这一次,我们讨论代码复用的问题。商业的规模依赖于可复制性,代码的质量依赖于可复用性。

    2019 年 3 月 8 日

  • 文章:与 Patrick Smacchia 谈.NET 的代码分析

    Patrick Smacchia是Visual C#的MVP,拥有超过15年的软件开发经验。他是《Practical .NET 2 and C# 2》一书的作者。他在多个领域从事过软件开发,包括在Société Générale开发股票交易系统,在Alcatel开发卫星基站。目前他是NDepend工具的首席程序员。

  • 敏捷墙

    在敏捷世界中,大型可视化图表(BVC)、墙面展示(TOW)和简单又古老的白板(POW)都是非常重要的工具——它们都属于“信息辐射器”。使用正确的墙面工具以及它所提供的信息,对敏捷团队的成败至关重要。

  • 如何快速对应用系统做一个 360 度的画像诊断?

    企业级应用系统的开发中,你一定遇到过这几个问题,CPU 飙升、内存利用率暴增,如何定位代码?数据库连接数被耗尽,怎么监控?各种 OOM 如何预防?线程死锁、锁争用、上下文切换太频繁,怎么办? 有没有一种方法,在不用了解具体业务和代码的情况下,可以快速地了解并诊断你的系统,给系统做一个 360 度画像视图?讲师介绍冯忠旗,目前是京东数科高级架构师,2015-2018 在宜信支付与结算中心担任支付结算平台技术负责人,2010-2014 在 IBM CDL 中国研发中心担任 ITAAS 私有云 RingCloud 技术团队研发负责人。对支付、账户产品以及基于支付和账户的消金和供应链金融产品有丰富的项目经验,曾帮助多家互联网银行搭建技术平台,同时主导聚合付钱拉技术平台的产品研发工作。 技术方面,个人比较关注高并发、高可用的架构设计,对分布式系统建设过程中的业务拆分、分库分表、消息队列、性能调优等方面有深入研究和实战经验,热衷于技术研究和分享,曾经在极客邦 InfoQ 全球开发者大会被邀请作为讲师分享技术产品经验。

    2019 年 8 月 7 日

  • Habya'a(临时拼凑的组件)与技术债务

    技术债务并不总是坏事,但我们必须谨慎地管理,因为它会随时间推移呈指数增长。尤其是在敏捷项目中,我们需要对技术债务进行特别关注。Yaser Marey建议将技术债务当作一项风险,使用标准的风险管理流程来管控,并简要介绍了敏捷项目中如何使用该流程。

  • 务实的技术债务管理

    关于技术债务的识别和解决问题往往退居二线,因为开发团队更愿意开发新的功能,而不是进行重构,以偿还技术债务。本文强调功能开发和技术债务偿还之间的平衡的必要性,并概述软件项目可以采取管理技术债务的务实策略。

  • 质量管理:一次把事情做对!

    要想一次把事情做对,你首先得明确什么是对,然后要分析差距,找到相应的质量保障方法,并不断迭代。

    2019 年 11 月 21 日

  • 软件债务的累积会消耗巨大成本

    最近有一篇名为《系统变老,仍可交付更多价值》的文章,作者Chris Sterling在其中讨论了“软件债务”的概念——“如果只想着编译马上通过,而忽略系统随时间推移本应具有的可变性,软件债务就会不断积累。”

  • 技术债务偿还计划

    所有团队最后都会面临技术债务。在这篇文章中,Jeremy描述了什么是技术债务以及什么不是技术债务,并涉及到了一些不同类型的技术债务以及每种如何解决。最后,他打了一个比方,帮助理解技术债务,向干系人解释技术债务,然后以一种有效的方式解决技术债务。

  • 怎么说服你的老板重视技术债?

    作为一名开放人员,经常会遇到这样的情况:管理者似乎对修复已经存在的问题不感兴趣,怎么办?本文奉上说服你的管理者关心技术债务的5个论点。

  • “一问一答”第 3 期 | 18 个软件开发常见问题解决策略

    通过对开发模块的学习,可以帮助你在项目中搭建持续集成环境,推行自动化测试,改进基于源代码管理工具的开发流程。

    2019 年 5 月 9 日

  • 来自荷兰格罗宁根大学的架构决策捕捉工具 RGT

    格罗宁根大学的Dan Tofan向软件架构师提供了开源软件工具RGT(Repertory Grid Tool),这种工具用于捕获和评估他们的架构决策。这个工具可以帮助架构师更好的文档化他们的决策及对决策进行回顾。

  • 大咖对话 | 高斌:过分渲染会过度拉高大众对人工智能的期望

    我觉得人工智能在未来会回归它原本的位置,成为人们比较关注的几个前沿技术领域,并会不断地带来改变人们生活的新技术。

    2018 年 12 月 7 日

  • 重构并非设计的替代品

    Stack overflow社区有人问道“现在设计是重构的一个子集吗?”这个问题凸显了大家经常误解自然设计这种敏捷方法。敏捷中一个常用的信条是:“测试,编码,重构。如此反复!”然而这个方法并没有替代设计,只是把项目生命周期中的这种工作推广开来。

  • 书评与访谈:Refactoring for Software Design Smells

    Girish Suryanarayana、Ganesh Samarthyam 和Tushar Sharma合著的Refactoring for Software Design Smells一书介绍了典型的软件设计味道,并提供了修复方法。

  • 生成验证码数据集

    2019 年 2 月 28 日

  • 设计和代码审查:是好、是坏还是不堪入目?

    Kirk Knoernschild讲述了他对设计和代码复查的观点。他提到,这种复查的承诺是改进软件质量、确保与标准的一致性,并且可以作为一种有价值的工具为开发人员服务,但是它们的执行方式却影响到了自身的价值。在某些组织中,它们可能真的见效;而在另一些地方,可能也不过是官僚作风的一种体现而已。

发现更多内容

第五周总结

fmouse

5.5 负载均衡架构

orchid9

架构师训练营Week01总结

Calvin

week1-作业一:食堂就餐卡系统设计

架构第五周作业

Geek_Gu

极客大学架构师训练营

「架构师训练营第 1 期」第五周作业

张国荣

第一周 架构方法-学习总结

jizhi7

极客大学架构师训练营

食堂就餐卡系统设计

jizhi7

第五周作业(作业一)

Geek_83908e

极客大学架构师训练营

5.2 分布式缓存架构:常见的缓存实现形式

orchid9

「架构师训练营」第 1 周作业 - 食堂就餐卡系统设计

xiaomao

2期架构师训练营 - 食堂就餐卡系统设计

Vicente

极客大学架构师训练营

5.4 消息队列:如何避免系统故障传递?

orchid9

架构师训练营第五周学习笔记

一马行千里

极客大学架构师训练营

第五周学习笔记

张荣召

架构师训练营第一周学习总结

xiaomao

Week 5 作業

Christy LAW

Week_05 总结

golangboy

极客大学架构师训练营

Week 5 學習總結

Christy LAW

week1- 作业二:周总结

第一周作业总结

hunk

极客大学架构师训练营

架構師訓練營第 1 期 - 第 05 周總結

Panda

架構師訓練營第 1 期

食堂就餐卡系统设计

张小胖

极客大学架构师训练营 张小胖

第五周 技术选型 学习总结

应鹏

学习 极客大学架构师训练营

2期架构师训练营 - 第一周学习总结

Vicente

极客大学架构师训练营

5.1 分布式缓存架构:架构原理与注意事项

orchid9

5.3 分布式缓存架构:一致性 hash 算法

orchid9

架构师训练营第一周学习总结

张小胖

极客大学架构师训练营

架构第5周总结

Geek_Gu

极客大学架构师训练营

架构图

猴子胖胖

架构

5.5负载均衡架构

张荣召

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

技术债务量化的局限:你依赖这些数值吗?-InfoQ