技术债务墙:一种让技术债务可见并可协商的方法

原文:

The Wall of Technical Debt:A method for making technical debt visible and negotiable
Published on 22 January 2020 by @mathiasverraes
翻译:

0x01 介绍
术语“技术债务”(Technical debt),是对软件设计中那些次优的、不再有效的、甚至错误的设计选择的隐喻。它们增加了软件进一步开发的成本。出来混的总是要还的,你今天选择的临时或山寨做法,将会在明天拖你的后腿,直到你修复了对应的问题,“偿还了”债务。技术债务并非都是代码:构架、文档、测试、以及领域模型都可能欠下技术债务。

问题并不是技术债务本身,而是未经管理的技术债务(unmanaged technical debt)。任何一家公司的CFO都精确地知道有多少财务债务(Financial debt)。他们拥有债务表格、季度报告、支付计划、以及再融资或出售债务的选项。但是如果你问一家公司的CTO,他所在的组织有多少技术债务,你会得到吞吞吐吐的回答:“额,...挺多的吧?”

技术债务墙(Wall of Technical Debt)是你办公室里的一个平面,你可以在上面用便签纸把技术债务一个个贴上去,所有人都可以看到它们。这很容易开始并且维护,然而我们如何选择增加、减少、偿还、甚至忽略技术债务都会产生深远的影响。它当然不是技术债务管理的完整的有伸缩性的方案,但是它恰好能用(it works),因为它不需要买什么东西。

0x02 如何构建技术债务墙(How to do it)
很简单:让债务可见、建立习惯、定期协商,并且放弃控制。

图片来自twitter:Pim Elshoff,以Creative Commons Attribution 4.0 International License授权。

0x03 让债务可见(Make it visible)
选择团队办公地的一面墙。
保证它最大限度公开可见。
命名这面墙为“Wall of Technical Debt”。
画一个好玩的Logo.
保证旁边有足够的N次贴和记号笔。
0x04 建立习惯(Build a habit)
每当你在工作时:
思考债务问题:是什么让你变慢了?是什么让代码变得难以理解?是什么导致了BUG难以跟踪?哪些部分应该有更好的文档?哪些部分应该有更好的测试?然后在便签上记下你所遇到的技术债务。但是要保证事后你知道自己写的是什么。
估计机会成本:如果这些问题不存在,你可以花在其他事情上的时间有多少。把你的估计写在便签上。商定好时间标记,例如计数符号(Tally_marks)或每个点表示半天。相对于时间估计的精确度,更重要的是让机会成本估计本身被团队成员所知道,遵循可见性大于精确度的原则。
估计修复时间:需要多久修复这个问题?同样的需要在便签上写下这个估计。
考虑怎样修复:可选的,你可以写下怎样才能修复该技术债务。你可能会在一个issue管理软件里跟踪该问题的修复,写下issue管理软件里对应的ID。
最后,把便签贴到技术债务墙上。
每当有人碰到同样的问题,添加更多标记,累计损失的时间。
记住:每当你引入了一个技术债务的时候就应该自觉添加一个技术债务便签。对自己诚实,这没什么好羞耻的,因为你并不是你写的代码。

记住:技术债务是一笔投资,不是一次犯罪。----除非你在隐藏债务,那你就是在-烧书(cooking the books)-。

译者注,小节参考,西文/中文计数符号:

0x05 定期协商(Negotiate)
随着技术债务的增加,组织中会有人开始有一点点焦虑。这没关系,债务总是在那,你只是让它可见,并希望一些习惯开始改变。

无论何时,如果有人给已存在的债务便签上的时间记号增加一个点,就应同时和团队讨论该技术债务。比较该债务上已经浪费掉的时间和预估的修复它所需要的时间成本。当然,你可能需要花一天时间修复它,但是相比于你每周都要在这上面浪费两个小时,你很快就回本了。又或者,它并不值得你去修复。技术债务再也不是一个审美问题或观点问题了,而是一个经验收集的指标问题。恭喜你,你们作为一个团队协商,并取舍(tradeoffs)。

无论何时,如果有人添加了一个新的技术债务贴,并覆盖了一个已发现的债务,考虑一下是否是时候修复问题了。但是让技术债务继续呆在墙上也毫无问题,那就是它应该呆的地方。没有证据显示该债务会让你继续付出成本?那就让子弹飞一会儿,从现在开始收集更多的点。

然而,当你引入了一个新的技术债务,那是不同的。考虑一下团队是否可以对临时做法或山寨做法说不,立刻就修复它,并且保持最小代价。我们不应该问:“我们有时间吗?”,而应该问:“这个债务是否值得延后关注?代价多大?”。答案应该在“没关系,就提交这个债务吧”到“很多事情都依赖它,在继续前进之前,让我们干掉它”之间。

关键不在于解决所有的技术债务,关键在于学会协商什么时候添加、修复、以及规避技术债务。在此之前,这些通常都在看不见的地方发生着,团队中的成员在不知道全部细节的时候,默默添加或修复技术债务。而现在,集体的智慧加上真实的数据,在发挥力量。

0x06 放弃控制(Give away control)
现在,是时候展示我们的魔法了。因为技术债务墙是如此的可见,管理者应该开始注意到了。(如果他们还是没注意到,那就用红色加粗字体添加一些 € 或者 $ 符号到墙上。毕竟钱是通用语言,并且亏钱两次是令人肉痛的。)

当一个团队申请时间解决技术债务时,并不能直接看到商业上或者用户可获得的收益。一个管理者就没法判断这些技术债务修复是重要而关键的?或者仅仅是为了使用最新的技术?又或者是为了把代码写漂亮?即使是有着深厚技术背景的管理者,如果他们不是直接去看代码,他们也无从判断一个技术债务的修复是否重要。

但是有了技术债务墙就不一样了。现在,它不再是一个观点问题;不再是一个编写优雅代码的工匠者的欲望;不再是关于解决难题的挑战。现在,它是事实,数据,债务和投资,以及投资回报。你开始讲管理者的语言。好的代码做为资产,坏的代码做为负债。他们被训练成:看数据、做出决策;他们开始学习这些方法:CBA,OODA,PCDA,SWOT。([1],[2],[3],[4])

放弃控制。管理者知道更多关于公司的策略、预算和风险。让他们在你的帮助下做出决策,哪些应该修复,什么时候计划等等。真实的数据足以支撑这些决策。

译者注,小节参考:

[1] CBA:Cost Benefit Analysis,成本效益分析
[2] OODA: Observe, Orient, Decide, Act,包以德循环
[3] PCDA: Plan, Do, Check, Act,戴明环
[4] SWOT: Strengths, Weaknesses, Opportunities, Threats,态势分析法,道斯矩阵
0x07 提示和陷阱(Tips and Traps)
不要从对代码的全面审计开始管理技术债务。你当然可以花好几天识别所有的债务,但是这样你就开始花钱、安排日期、从而也就把事情搞大了(making it a big thing)。“我们会在夏天做”或者“在这个大项目结束后”或者其他任何相对于“永远不做”来得委婉的词,都是可接受的。今天在贴到墙上的一张便签,带来了今天的价值。你总能延后做一个大的审计,就是不要让它成为瓶颈。

缺了计数标记或者点号代表实际消耗的成本,我们就躲在了观点后面。某些干扰你的事情,也许并不会对未来的开发产生实际的影响,但只在你开始运行它们的时候才会带来问题,你的技术债务墙将会记录实际浪费的时间,而不是一些感知的质量。你需要建立一个协商债务的习惯,而不要回到老路子上做单方面的努力。

它使用另一种方式产生效力。如果你碰到丑陋或奇怪的代码,但你没有在上面失去时间,那就不要标记它。我们不是在测量你是否喜欢它,只是在测量它消耗的时间。

不要忽略心理上的墙。抵抗把所有事情都使用数字化并使用BUG跟踪软件管理的欲望,日志和指标只在人们看它们的时候有印象(译者注:所有issue管理软件都依赖人主动打开去看,例如需要项目管理者定时汇总并在通信工具里发送以保证可见性)。数字工具更容易隐藏事情。债务墙则是可见的,扑面而来的。

0x08 结论
在阅读了我(译注:指原文作者@mathiasverraes)在2013年的博客后(译者注:参考下一节),一家创业公司引入了技术债务墙。它们是一家很小的公司,并且所有的墙壁都已经被用来展示商务计划和App原型来。它们把技术债务便签贴到了公司里一面玻璃窗上。于是有一个笑话是:如果房间开始变的太暗,大家就知道是时候解决技术债务了。更重要的是,他们曾被完美主义和临时方案之间以适应快速的市场变化所困扰。技术债务墙帮助他们打破了困局,从而很快地运转了起来。我们听到很多成功使用技术债务墙的团队故事,也许你也可以。

0x09 致谢
这篇文章是为“Visual Collaboration Tools”而写的,这是一本由 Kenny Baas-Schwegler 和 Jo?o Rosa 编辑的书。它松散地基于“Managed Technical Debt”, Verraes 2013.([1]) 这篇文章而写。感谢Indu Alagarsamy 和 Rebecca Wirfs-Brock
对稿件的审校。

译者注,小节参考:
[1] Managed Technical Debt:We should make a distinction between Managed and Unmanaged Technical Debt. Published on 21 July 2013 by @mathiasverraes

原文地址:https://www.cnblogs.com/juking/p/12297688.html

时间: 2024-08-03 17:53:41

技术债务墙:一种让技术债务可见并可协商的方法的相关文章

iOS的三种多线程技术NSThread/NSOperation/GCD

1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心线程的具体使用问题 NSOperation/NSOperationQueue 面向对象的线程技术 GCD -- Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术. 以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,

iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现 -- 转

1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØNSOperation/NSOperationQueue 面向对象的线程技术 ØGCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术 以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Ap

【收藏用】--切勿转载Java处理XML的三种主流技术及介绍

原帖地址 : http://www.ibm.com/developerworks/cn/xml/dm-1208gub/ XML (eXtensible Markup Language) 意为可扩展标记语言,它已经是软件开发行业中大多数程序员和厂商用以选择作为数据传输的载体.本文作者对于 Java 处理 XML 的几种主流技术进行一些总结和介绍,希望帮助那些有不同需求的开发人员对于 XML 处理技术的作出最优的选择. 最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该

Google Android API官网封杀了,没法查android技术资料的3种解决方案

1.从uhdesk上访问简化版android api在线文档(反应速度极快) http://www.uhdesk.com/simpleandroidoc/index.html 2.下载chm本地文档(19M的样子) http://www.uhdesk.com/doc/Andorid%20API%20docs.chm 3.使用完整版本android api在线文档(明显这个域名的服务器跟不上) http://www.uhdesk.com/androidoc/index.html Google An

你应该掌握的七种回归技术

转自:http://www.iteye.com/news/30875 英文原文:https://www.analyticsvidhya.com/blog/2015/08/comprehensive-guide-regression/ [编者按]回归分析是建模和分析数据的重要工具.本文解释了回归分析的内涵及其优势,重点总结了应该掌握的线性回归.逻辑回归.多项式回归.逐步回归.岭回归.套索回归.ElasticNet回归等七种最常用的回归技术及其关键要素,最后介绍了选择正确的回归模型的关键因素. 什么

Java 处理 XML 的三种主流技术及介绍

简介: XML (eXtensible Markup Language) 意为可扩展标记语言,它已经是软件开发行业中大多数程序员和厂商用以选择作为数据传输的载体.本文作者对于 Java 处理 XML 的几种主流技术进行一些总结和介绍,希望帮助那些有不同需求的开发人员对于 XML 处理技术的作出最优的选择. 最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记语言可扩展,严格的语法规定,可使用有意义的标记,内容

常见的三种存储技术以及iSCSI协议

1.常见的存储技术 DAS:Direct  Attached Storage,直接附加存储,存储设备通过SCSI接口电缆直接连接到服务器的,存储设备不带有任何操作系统.它依赖于服务器,存储设备就是将硬件设备堆叠起来的.DAS也可称为SAS(Server Attached storage,即服务器附加存储). DAS具有如下特性: 1.DAS设备不带有任何操作系统,文件系统位于服务器端,因此是以块级别进行数据传输 2.它是通过SCSI接口电缆与服务器相连,因此,会增加服务器的I/O操作,占用cpu

Android无线开发的几种常用技术(阿里巴巴资深工程师原创分享)

本文由阿里巴巴移动安全客户端.YunOS资深工程师Hao(嵌入式企鹅圈原创团队成员)撰写,是Hao在嵌入式企鹅圈发表的第一篇原创文章,对Android无线开发的几种常用技术进行综述. 嵌入式企鹅圈现拥有七个专栏(Linux内核驱动情景分析.资源紧缺型SOC嵌入式架构设计.嵌入式交叉工具链及其应用.嵌入式设计和编程.微信硬件平台和物联网解决方案.Android开发.开发资源共享).更多Android.Linux.嵌入式和物联网原创技术分享敬请关注微信公众号:嵌入式企鹅圈.我们百分百原创,资深工程师

负载均衡的几种实现技术

当web服务器的垂直扩展变得话费很高或困难的时候,我们需要考虑服务器的水平扩展,即负载均衡技术.负载均衡有很多技术,这里我们来一一介绍. 1.HTTP重定向 我们可以在代码层面实现,通过设定访问特定页面如index.php,在php代码中设置header的location值,返回重定向指令.这实际上是web应用程序自己来实现. 2.DNS负载均衡 DNS负责域名和IP地址之间的映射.DNS服务器可以作为调度器(DNS的常见策略是RR Round Robin方式). 尽管基于HTTP重定向的负载均