写点什么

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

  • 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:005541
用户头像

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

关注

评论 1 条评论

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

铭文 LaunchPad 平台 Solmash 推出早鸟激励计划

石头财经

【Docker存储】Docker的容器迁移方式详解

百度搜索:蓝易云

Docker 云计算 Linux 运维 云服务器

铭文 LaunchPad 平台 Solmash 推出早鸟激励计划

大瞿科技

铭文 LaunchPad 平台 Solmash 推出早鸟激励计划

BlockChain先知

首个云原生、分布式、全栈国产化银行核心业务系统投产上线丨TiDB × 杭州银行

PingCAP

数据库 开源 云原生 TiDB 银行业

使用存储过程自动化分区管理 Zabbix MySQL(8) 数据库中的大表;

瀚中子🤩

Project软件的六大核心作用详解

爱吃小舅的鱼

项目管理 Project软件

C 语言结构体和枚举完全指南:成员访问、字符串操作、枚举基础

小万哥

程序人生 编程语言 软件工程 C/C++ 后端开发

2023 Gartner® 云数据库管理系统魔力象限发布 PingCAP 入选“荣誉提及”

PingCAP

数据库 Gartner TiDB

PingCAP上榜工信微报年度回顾《2023 年工业和信息化发展情况》 三大具有国际影响力的开源社区之一

PingCAP

数据库 开源 分布式 数字化 TiDB

软件测试/测试开发全日制|Pytest测试框架fixture作为参数使用

霍格沃兹测试开发学社

【NOSQL】redis哨兵模式、集群搭建详解。

百度搜索:蓝易云

redis 云计算 Linux 运维 云服务器

Yocto环境搭建教程

百度搜索:蓝易云

云计算 Linux 运维 云服务器 yocto

极狐 GitLab 冷知识:使用 git push 创建 Merge Request

极狐GitLab

谈谈文章标题的「模式」

Luke

需求跟踪矩阵的作用

爱吃小舅的鱼

需求管理 嵌入式系统 需求跟踪

倒计时6天|PolarDB开发者大会,我们讲什么?看什么?玩什么?

阿里云瑶池数据库

数据库 阿里云 云原生 开发者大会

1 月 21 日,三件事儿,线上不见不散丨社区活动

声网

铭文 LaunchPad 平台 Solmash 推出早鸟激励计划

加密眼界

ZKFair 结束空投领取,未领取的1.3亿ZKF Token全部销毁

股市老人

打造创新的金融数据平台,加速数字化和智能化转型丨PingCAP 官网金融行业专区上线

PingCAP

数据库 开源 金融 TiDB 金融数据

TiDB 在全球头部物流企业计费管理系统的应用实践

PingCAP

数据库 开源 分布式 TiDB 物流系统

软件测试/测试开发全日制|Pyest结合json实现数据驱动测试

霍格沃兹测试开发学社

神州数码集团荣获“TiDB 社区最佳贡献企业”

PingCAP

数据库 开源 TiDB

2023年度产品评选!人人都是产品经理携手boardmix博思白板联合呈现!

彭宏豪95

产品 产品经理 SaaS 在线白板 效率软件

PingCAP 受邀参加 FICC 2023,获 Open100 世纪全球开源贡献奖

PingCAP

数据库 开源 分布式 TiDB pingCAP

铭文 LaunchPad 平台 Solmash 推出早鸟激励计划

股市老人

深度调光降压型 LED 恒流驱动器

芯动大师

盘点2023年我用过的AI大模型,国内也能免费用

程序员晚枫

大厂 大模型

AWS EC2 必知必会小技巧 | 机型特点解析和选型技巧分享

Greptime 格睿科技

数据库 AWS 时序数据库

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