AICon 深圳站 Keynote 嘉宾官宣!共探AI价值转化的实践路径 了解详情
写点什么

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

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

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

关注

评论 1 条评论

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

全栈程序员这个月写了啥代码?

程序员鱼皮

Java JavaScript 大前端 后端 全栈

VRIO模型 - 发现自己的核心资源与能力

石云升

创业 职场经验 管理经验 6月日更

理解【Apache Zookeeper】

awen

zookeeper

博睿数据重塑APM,引领IT运维新标杆

博睿数据

博睿数据 数据链DNA 服务可达

极光开发者周刊【No.0604】

极光GPTBots-极光推送

程序员 开发者 IT行业

Nacos-- docker搭建

是老郭啊

Docker nacos

勒索病毒卷土重来?看亚马逊云科技如何保护你的网络安全!

亚马逊云科技 (Amazon Web Services)

【环球网】博睿数据CEO冯云彪:做好生态链企业的适配工作

博睿数据

博睿数据 博睿数据数据链DNA 生态链

《原则》(四)

Changing Lin

Nacos--简介

是老郭啊

微服务 nacos 服务注册与发现

贝特瑞新能源汽车的速度与激情

亚马逊云科技 (Amazon Web Services)

字节跳动的ToB生意,为什么需要火山引擎?

ToB行业头条

农业SaaS,「无人关注」的万亿市场

ToB行业头条

3D场景搭建的隐秘功能——时间轴

ThingJS数字孪生引擎

大前端 物联网 可视化 3D可视化 数字孪生

博睿数据深化信创布局,通过华为鲲鹏920和统信UOS测试认证

博睿数据

信创 国产化 博睿数据

拍乐云运维专家受邀QECon大会,畅谈多云环境伸缩实践

拍乐云Pano

Java“圣经”学累了?那就看看这些通俗易懂的内容吧

Java架构师迁哥

聊聊MySQL全局锁

架构精进之路

MySQL 6月日更

拼多多电商部java岗三面落选,记下的面试题,不睡觉都要背下来!

Java 程序员 架构 面试

Polkadot“升级”之道

趣链科技

区块链 区块链技术 polkadot

我们并不需要 Deno

LeanCloud

node.js deno 开发工具 JavaScrip

算法如何促成亿级别扶持曝光视频?爱奇艺Budget Pacing智能扶植系统实践

爱奇艺技术产品团队

架构 推荐 算法 广告 扶植

架构实战营模块5作业

En wei

架构实战营

区块链作为“信任的机器”,将改变社会价值的传递方式

CECBC

一些有意思的句子

IT蜗壳-Tango

IT蜗壳 6月日更

【立刻报名】加速开发 Perforce on Tour China 2021-龙智

龙智—DevSecOps解决方案

从天而降的AI“青云梯”,开发者们准备好了吗?

白洞计划

博云容器云 3.2 发布:核心能力再提升,易用性再升级

BoCloud博云

容器

dubbo使用curator作为zk客户端优雅停机存在的问题

林一

zookeeper dubbo curator

深入理解iOS图文混排原理并自定义图文控件

Geen练

图文混排 iOS Developer iOS 知识体系

【得物技术】JS资源分包

得物技术

CSS 大前端 js 版本 页面

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