@xuemingdeng
2022-10-25T11:12:12.000000Z
字数 4731
阅读 203
未分类
摘要:
软件行业中的人都“知道”代码质量很重要,但从来没有任何数据或数字可以证实这一点。在本文中,我们将通过探究最近关于代码质量的研究来探讨其影响。随着开发速度提高了两倍,bug减少了15倍,完成时间的不确定性显著减少,代码质量的业务优势也就变得清晰了。
正文:
在本文中,我们将通过探究最近关于代码质量的研究来探讨其影响。随着开发速度提高了两倍,bug减少了15倍,完成时间的不确定性显著减少,代码质量的业务优势也就变得清晰了。让我们来深入探究一下,看看如何利用这些数字为自己创造优势。
技术债务这种比喻的说法最初是开发人员向业务人员解释重构需求和权衡的一种方式。然而,这个词在今天有了更广泛的含义。
组织之所以会承担技术债务,有多方面的原因。也许是因为我们试图通过牺牲代码质量来更快地交付功能,也许是因为我们对业务的理解发生了变化,导致设计不再匹配,也许是因为我们的设计一开始就不合适?
因此,虽然原因不同,但结果是相同的——我们最终得到的代码的维护成本比原本的要高。
最近关于代码质量对业务影响的研究表明,一般来说,由于技术债务和糟糕的代码,公司平均浪费了开发人员23%到42%的时间。但似乎这还不够令人感到担忧,关于软件开发人员由于技术债务而导致的生产力损失的研究还发现,开发人员经常“被迫”引入新的技术债务,因为公司一直在用代码质量换取新功能等短期收益。
然而,技术债务的影响比财务浪费更加深远。技术债务同样会影响开发人员的幸福感和工作满意度(参见Graziotin和Fagerholm在2019年撰写的关于软件工程师的幸福感和生产力的论文)。
很少有开发人员喜欢使用本来可以避免的糟糕代码。这样的代码导致我们在解决问题的过程中被困在压力和时间紧迫感之中。高利息的技术债务加剧了开发人员的流失。
这个问题并不局限于开发人员。在过去的几年里,我也看到过许多技术管理者放弃并离开。我还记得向一家知名公司CEO做过一场关于技术债务的报告。报告进行到一半时,这位CEO惊叫道:“现在我明白为什么前CTO会离开了。”未能得到缓解的技术债务的连锁反应在整个组织中严重地打击了士气。
拥有一个高效的软件团队是一种竞争优势。作为一家公司,如果我们想要在市场上站稳脚跟,需要快速对客户的需求做出反应,根据反馈采取行动,并持续创新。我们需要在更短的产品周期内实现这一点。
显然,这需要熟练的软件开发人员。不幸的是,软件开发人员全球短缺——我们不能继续雇佣更多的人,因为不存在。
考虑到这些限制,在技术债务上浪费一半的资源在我看来是一种糟糕的权衡。
作为一种思想实验,我们假设开发人员42%的时间确实花在处理技术债务上。这意味着,如果你的组织中有100名工程师,你只得到相当于58人的产出。然而——这是关键——实际的浪费要比这多得多。100人与58人之间的协调、管理和沟通开销是真实存在的。布鲁克斯定律告诉我们,增加人员数量是有代价的。在一个人员过剩的项目中工作是痛苦的:你花在同步会议上的时间比花在代码编辑器上的时间还要多。
技术债务的主要问题是代码缺乏可见性。代码是一种抽象的概念,不是组织的所有成员都可以理解。因此,即使我们意识到了普遍存在的问题,仍然很容易忽略掉技术债务。对代码库进行量化和可视化是关键,对于工程团队以及产品和管理来说都是如此。
可视化是很奇妙的,因为它让我们进入已知宇宙中最强大的模式探测器:人脑。我在“Your Code as a Crime Scene”中深入探索了这一概念,并在2015年创建了CodeScene,以便让普通观众能够使用这些技术。
我们使用的可视化方法学习起来很快。一旦找到了这些方法,可以用它们来指出代码库中的强点和弱点,以此来增强整个组织。此外,可视化可以让你评估潜在问题的深度。
我来分享一个来自两个流行的开源项目的例子。
在前面的可视化中,每个圆对应一个带有源代码的模块。颜色反映了代码的健康状况(参见“管理技术债务”,以获得更深入的了解):
技术债务的利息不能仅从代码中计算出来。幸运的是,我们可以通过像Git这样的版本控制系统来获取这些关键信息。特别是我们可以获取每段代码的变更频率,即提交的数量,并用它们来了解代码对开发人员的影响。将其与一些复杂性指标(如代码健康状况)相结合,我们就可以识别出需要经常处理的复杂代码。我称之为交叉热点。
热点为我们提供了相关性维度,而代码健康与质量维度相辅相成。为了管理技术债务,我们需要两个维度。下面是一个来自真实代码库的例子。
热点的最大优势在于,它们将信息限制在可操作的范围内。作为一个组织,我们不能也不应该一次性重构和重新设计所有的代码。热点让我们能够平衡短期目标,比如新特性和代码库的长期可持续性。
通过达到这种平衡,我们可以系统地偿还技术债务,并腾出时间进行有价值的创新。这些结果可能可以真正地改变游戏规则。Carterra的案例是一个很好的例子,这是一家领先的生物技术研究公司,报告称在解决了他们的热点问题后,计划外工作减少了82%。通过精确识别正在开发中的文件及其相关的代码健康状况,Carterra可以确定他们的工作优先级。
有了代码健康状况和热点之后,我们就有了进行完整循环所需的一切。如果没有可量化的业务影响,就很难有理由投入资源去偿还技术债务。当代码持续恶化时,我们使用的任何指标都有被视为虚荣指标的风险。我们不希望这样的事情发生。
正如之前所说的,我们以前找不到能够证实高代码质量重要性的数据。在我们的红色代码白皮书中,我们调查了来自不同行业和领域的39个商业代码库,以此来改变这种状况。
红色代码白皮书表明,代码质量对发布时间和产品的外部质量都有显著的影响。
我将通过一家持有红色代码的虚拟公司来详细说明这种不确定性意味着什么。这家公司可能能够在9个月内实现一种新特性。如果他们的竞争对手持有绿色代码,他们可以在一个月内实现相同的特效。这家公司很难跟上竞争对手的步伐。可见代码质量是一个真实的、可度量的竞争优势。
在我从事软件行业的25年里,有很多人告诉我,我们没有时间做X。X可以是重构、适当的单元测试,或者重新调整架构以适应变化的业务环境。似乎存在一种误解,认为速度和质量是相互排斥的。红色代码白皮书的数据表明,实际上不存在这样的权衡。而事实恰恰相反——我们需要高质量的代码才能快速前进。
对于我来说,吞吐量的增加很大程度上是不确定性降低的结果。简单的代码可能造成的意外更少,造成破坏的风险也更低。健康的代码还反映了强大的工程文化,这很可能说明组织有其他一些重要的实践。
最后,值得注意的是,红色代码的发现表明了一种类似于之前由Accelerate/DORA研究提出的关系理论——部署周期越短,生产故障就越少。
代码健康指标清楚地表明我们需要保持较高的标准。然而,大多数时候我们并没有编写新的代码,我们也需要处理遗留代码。那么如何在这种情况下应用这些指标呢?
大规模处理遗留问题和代码质量问题具有一定的挑战性。在过去的十年里,我有幸分析了200多个代码库。我发现行为代码分析技术是必不可少的。我使用这项技术的过程概述如下。
在本文中,我们看到由于技术债务造成的浪费是巨大的,并带来了实实在在的业务风险。为什么这种浪费会被容忍,一种解释可能是因为技术债务的影响在以前不可能在源代码级别进行量化。
本文介绍的红色代码研究为我们提供了挑战现状并将代码质量提升到业务KPI级别的方案。结合热点分析技术,我们甚至让这些发现变得具有可操作性。作为一家软件公司,区分红色代码和绿色代码有助于你通过数据驱动的方法来解决技术债务。
Adam Tornhill是一名工程学和心理学学位的程序员。他是CodeScene的创始人,这家公司专门设计软件工程智能工具。Tornhill是多本技术书籍的作者,包括畅销书“Your Code as a Crime Scene”,也是一位获过奖项的软件研究人员。Tornhill的其他兴趣还包括音乐、武术和复古计算机。
查看英文原文:https://www.infoq.com/articles/business-impact-code-quality/