写点什么

技术债务就像俄罗斯方块:我如何通过修改代码来搞定它?

  • 2019-05-05
  • 本文字数:1604 字

    阅读完需:约 5 分钟

技术债务就像俄罗斯方块:我如何通过修改代码来搞定它?

和大多数玩过俄罗斯方块的人一样,我也很喜欢这个游戏。我仍然记得第一次在任天堂游戏机上玩这个游戏时的情景。游戏的背景音乐仍然时常萦绕在我的耳边。俄罗斯方块不仅是有史以来最好玩的游戏之一,我们还可以拿它与技术债务作类比。


我将分享我和我的团队如何通过修改代码来减少技术债务,并修复了一个价值 100 万美元 / 年的 bug。



刚开始的时候任务都很简单,因为没有什么复杂性


在软件公司里,产品经理或项目经理与软件开发人员合作,根据客户优先级来开发和交付代码。我们把消除一行俄罗斯方块比作发布一个新功能。



技术债务还没那么多时,即使稍微复杂一点的任务也能轻松应对


交付一个复杂的功能等于要消除更多的行。


通常,为了按时交付,我们需要在业务需求(新特性、新产品)和代码(hack、捷径)之间做出权衡。要么修改产品策略,导致与以前的设计不兼容,需要额外的工作来迁移客户,要么同时支持新旧两套逻辑。



少量的技术债务是正常可控的


于是,技术债务出现了。俄罗斯方块中出现的空格就代表了技术债务。


所有的代码都会有技术债务,这是很正常的。在玩俄罗斯方块的时候,或多或少都会出现几个空格。



淹没在技术债务中


过多的技术债务导致新功能和 bug 修复无法在合理的时间内发布。


这个问题无法通过增加或替换开发人员来解决。在某种程度上,它之所以被称为技术债务,是因为我们需要偿还它。


偿还技术债务可以让你保持竞争力,让你的游戏可以继续。



游戏结束


就像经营一家企业一样,玩俄罗斯方块的时间越长,难度就越大。方块移动的速度越来越快,很难跟上它们的速度。


就像经营一家企业一样,你永远也无法在俄罗斯方块这个游戏中胜出。因为它没有真正的终点,你只能控制输掉游戏的速度。


就像经营一家企业一样,在俄罗斯方块游戏出现的空格会让你输掉游戏。

百万美元 bug

不久前,我和我的团队接到一个任务,负责更新产品代码中的账单和发票逻辑,以支持新的定价计划、新的支付处理器和改进的账单工作流。产品团队还在讨论某些细节,于是我们利用这段时间深入研究了现在的代码。在对代码有了更好的了解之后,我们就能够对即将到来的变更做出更准确的估计。


那些代码的基本功能是遍历每个客户的帐户,计算他们的账单,并将它们发送给票据 API。之前写这些代码的人显然很小心——不能说它们杂乱无章,但起码太缺乏灵活性。它是一个很长的函数,没有测试,只有很少的日志,而且几乎没有任何注释。这些代码是公司的一个联合创始人在 5 年前写的。从那以后,唯一一个改过这段代码的人已经不在公司了。


这有问题吗?发票发出去,公司赚到钱,好像没有任何问题。我们好像也没有必要进行重构,但我们知道即将会发生一些重大的变化,因为这个函数不能按照我们的需求进行伸缩,如果这个部分可以被简化,我们就可以走得更快。


我们在一个 sprint 中重构了这个函数,并增加了一些日志。直到那个时候,我们才发现我们实际上修复了一个什么样的 bug!会计团队的一个工作人员跑到我们的办公桌前,问我们为什么发票的数量增加了这么多。因为旧代码有一些问题,一些客户的使用情况并没有记录在发票上。据我们估计,这样造成的发票丢失每年总额超过 100 万美元。

偿还债务并不总能带来回报

这个故事是真实的,但偿还技术债务并不总是会产生如此戏剧性的效果。只能说我们当时很幸运。



找到技术债务的平衡点


我希望我能够就何时偿还技术债务提出明智的建议。然而,这个问题的答案是:这太复杂了,而且我们往往需要做出某种程度的权衡。你的代码可以是世界上最干净的,并且经过了最全面的测试,但用户可能不会为它掏钱。相反,你的代码也可能非常混乱,但这些代码可以取悦用户,并让他们为它掏钱,公司因此赚得盆满钵满。


我能给出的建议是,产品所有者和开发人员应该在理解技术债务上达成一致,技术债务是永远无法避免的。毕竟,就像俄罗斯方块一样,在软件开发中,你永远无法赢得这个游戏。


英文原文:https://medium.com/@erichiggins/technical-debt-is-like-tetris-168f64d8b700


2019-05-05 07:005674
用户头像

发布了 731 篇内容, 共 466.8 次阅读, 收获喜欢 2006 次。

关注

评论 1 条评论

发布
用户头像
这个类比很形象,赞!!!
2019-05-06 09:21
回复
没有更多了
发现更多内容

InnoDB 表空间

leonsh

MySQL innodb 表空间

英特尔CEO帕特·基辛格:面向未来的数字化需求,推进未来计算创新、探索与颠覆

科技新消息

Python代码阅读(第16篇):列表求差集

Felix

Python 编程 Code Programing 阅读代码

Go- for循环

HelloBug

for Go 语言

做正确的事情,而不是把事情做正确

非著名程序员

个人成长 提升认知 认知提升 8月日更

干货!DataPipeline2021数据管理与创新大会全篇划重点

DataPipeline数见科技

大数据 数据融合 数据管理

火爆 GitHub!这个图像分割神器开源了

百度开发者中心

人工智能 开源 最佳实践 图像

Vue进阶(五十九):ES数组操作:splice() 实现数组删除、替换、增加指定元素

No Silver Bullet

Vue 8月日更 splice

再也不怕 JavaScript 报错了,怎么看怎么处理都在这

前端依依

学习 技术 大前端 js

Linux内核源码分析方法—程序员进阶必备

Linux服务器开发

操作系统 Linux内核 内核源码 底层原理 内核开发

ipfs投资者靠什么赚钱?投资ipfs要多少钱?

投资ipfs要多少钱 ipfs投资者靠什么赚钱

亚信数据库AIDB通过统信UOS认证,国产自主可控项目新选择

亚信AntDB数据库

国产化 国产数据库 亚信数据库AIDB

上游思维:凭一己之力能做些什么?

石云升

读书笔记 8月日更 上游思维

最好用的 Angular 甘特图组件 ngx-gantt

PingCode研发中心

软件 工具 甘特图 ngx-gantt

python通过Matplotlib绘制常见的几种图形

Python研究者

8月日更

项目进度经常超时怎么办?项目经理如何有效管理项目进度?

优秀

项目管理工具

Go- 函数返回值

HelloBug

函数 返回值 Go 语言

Go- switch-case结构

HelloBug

Go 语言 switch case

中国法定数字货币(DCEP)全面启航!全国普及势在必行

CECBC

探索技术与应用融合的区块链 实现产业良性发展

CECBC

BI软件漫谈

格林海文

BI Tableau 帆软

快手基于 Flink 构建实时数仓场景化实践

阿里云大数据AI技术

BuildPacks 打包

Zhang

Docker image CNB OCI

Agora 教程丨一个典型案例,教你如何使用水晶球“数据洞察”

声网

Agora 教程 水晶球

LVS 学习: netfilter 与 ipvs 无秘密

绅鱼片

Linux 负载均衡 LVS Netfilter IPVS

ipfs矿机公司哪家好?ipfs矿机公司实力排行?

分布式存储 Filecoin ipfs挖矿 ipfs矿机 ipfs矿商排名

Tron波场链智能合约系统开发案例|波场链源码搭建

Geek_23f0c3

TRONex波场智能合约 DAPP智能合约交易系统开发 波场DAPP

Go- break和continue

HelloBug

Go 语言 break continue

模块五:微博评论模块高性能高可用计算架构设计

kk

架构实战营

量化策略APP系统开发,马丁策略交易平台

13530558032

跨团队项目的集成测试实践分享

PingCode研发中心

软件测试 测试

技术债务就像俄罗斯方块:我如何通过修改代码来搞定它?_文化 & 方法_Eric Higgins_InfoQ精选文章