高质量的软件是否值得投入

小脑门

共 4834字,需浏览 10分钟

 · 2021-09-22

从以下几个纬度探讨高质量软件是否值得投入:


生产高质量的软件,一直是每一位工程师追求的目标,在日常工作中大家也投入了很多精力和时间来提升软件的质量,比如编写单测、对代码进行Review、以及重构等等。但有时候受功能交付压力的影响,也难免产生疑问(业界工程师共同的疑问):花时间提高软件质量,还是专注于发布更有价值的功能。Martin Fowler通过《Is High Quality Software Worth the Cost?》这篇文章针对这个疑问做了阐述,以下为文章的主要内容。

       Martin Fowler,世界级著名软件专家,ThoughtWorks首席科学家,曾获Jolt生产力大奖。起草《敏捷软件开发宣言》,著有《重构》、《企业应用架构模式》、《分析模式》、《UML精粹》等书。

      Martin Fowler写的大部分的文章是针对软件开发工程师的,但阅读这篇文章不需要专业的软件开发知识,希望这篇文章对每一个关注软件工作的人都有价值,特别是那些软件开发团队客户的商业领袖。

      贝特里奇的标题定律告诉我们,任何以问号结尾的标题都可以用“不”回答,但Martin的这篇文章打破了这条定律,他通过阐述进一步颠覆了问题本身,这个问题假定质量和成本之间存在权衡,但在Martin看来,这种权衡并不适用于软件——“高质量的软件实际上生产成本更低”。

通常我们会受到软件开发不可能三角影响,在谈到软件质量和成本的时候,往往会下意识的提到,都是紧急需求,研发周期不允许。我们来深刻讨论下这个问题:

1.我们习惯于在质量和成本之间进行权衡

       Martin 指出,人们习惯在质量和成本之间进行权衡。比如,当更换智能手机时,可以选处理器更快、屏幕更好、内存更大但同时也更昂贵的机型,或者可以放弃一些质量换取更低的价格。但他也认为事无绝对,有时候也可以花更少的钱买到高质量的东西。同时,Martin 也承认,在多数情况下,更高的质量意味着更多的花费。

2.软件质量意味着很多事情

        在讨论软件质量之前,Martin 首先对“软件质量”做出了界定。他认为这是个复杂的问题,有很多方面可以囊括在“软件质量”范围内:比如,用户界面清晰吗?是否简单易用?软件足够可靠吗?是否有功能上的缺陷?架构合理、明确吗?开发工程师是否可以轻松的找到并理解需要处理的代码?

        用户可以判断用户界面是否良好;高管可以判断软件是否使工作更加高效;消费者会注意到系统是否存在缺陷,特别是当软件出故障时。但用户可能无法体会软件的架构——这对软件工程师来说是软件质量的判定标准之一。

        所以,这篇文章将软件质量属性划分为外部(例如 UI 和缺陷)和内部(架构)。区别在于,用户和消费者可以看到什么使软件产品具有高外部质量,但不能辨别内部质量的高低。



3.内部质量看似对用户无关紧要

        换句话说,为外部质量买单是有意义的,但为内部质量买单是没意义的。用户可以判断他是否要为更好的用户界面支付更多的费用,因为他们能够评估用户界面的好坏。但是用户无法看到软件的内部模块结构,更无法判断它的好坏。试想一下,如果有两个功能完全相同的软件,且都拥有同样优雅的用户界面,一个卖 6 美元,另一个售价 10 美元,区别仅仅在于后者的代码整洁有序而前者的混乱。用户看不到源代码,并且它不影响程序正常运行,客户为何要多花 4 美元购买后者,一般来说,没有必要为更高的内部质量支付更多的费用?既然如此,为什么软件开发人员还要花时间和精力来提高软件的内部质量?


4.内部质量使软件改进更加容易

        为什么软件开发人员会在内部质量上大做文章呢?程序员大部分时间都在修改代码。即使在新系统中,几乎所有编程都是在现有代码库上完成的。Martin 在此引出了“技术债务”(Technical Debt)及Cruft的概念。他认为逻辑混乱,数据难以理解,命名不规范等等,都可以称之为Cruft,即当前代码与理想情况之间的差异。

        Cruft :指的是程序源代码中随时间累积而变得无用的过时垃圾程序代码。随着软件的发展,以及经历了修改 Bug 和重构的若干周期之后,软件的部分代码已不再使用,但这些代码仍然保留在源码中,这种代码称为 Cruft。Cruft 可能是一两行无用的代码,也可能是整个源文件模块。

技术债务是 Cruft 的一个常见的比喻。添加功能的产生的额外费用就像支付利息。清理杂物就像偿还本金。这一比喻鼓励许多人相信:与实际情况相比,Cruft 更容易测量和控制。

        内部质量的一个主要特征之一是使开发工程师更容易弄清楚程序的工作原理,可以在几个模块中快速找到几百行,能快速了解代码的各个部分,很容易地理解它与客户服务端的请求之间的关系,这样就可以快速添加新功能。

       存在大量技术债务的系统,工程师需要花费更多的时间理解如何做出更改,同时提升了犯错误的概率。如果发现问题,则需要花费更多的时间去定位和解决它们。如果没有发现这些问题,就会遇到生产故障,以后会花更多的时间来修复它们。技术债务的积累,使任何一个微小的改动都需要花费数周的时间。

5.客户关心新功能的快速推出

        Martin 指出,两个拥有相同的功能的软件,一个因为拥有高内部质量,可以每周都添加新功能。而另外一个因为内部质量不高,需要在技术债务中增加新功能,从而导致开发速度大大降低。很快,拥有高内部质量的软件功能就强大得多。即便提升了价格,客户也都卸载了低内部质量的软件,转而购买了高内部质量的软件。

用户非常关注新功能是否可以快速推出,由此看来,内部质量实际上对用户和消费者来说至关重要。因为更好的内部质量使添加新功能变得更加容易、快速、低成本。

6.内部质量影响的可视化

        Martin表示,内部质量的基本作用是降低未来变更的成本,但是编写好的软件需要付出额外的努力,这在短期内确实会产生一些成本。他提供了两张图表,以可视化的方式呈现将内部质量对未来开发速度的影响。在下面的两幅图片中,纵坐标为软件累积的功能,横坐标为实现它的时间(成本)。对于大多数软件来说,曲线看起来会如下图所示。

        上图是软件内部质量较差的情况。可以看到,在最初一段时间内,工作进展的很快,但随着时间的推移,添加新功能变得越来越困难。即使很小的变更也需要程序员理解大量晦涩难懂的代码。当修改代码时,会产生意外的破坏,导致测试时间延长,以及出现需要修复的缺陷。

        专注于提高内部质量就是为了降低生产力的下降。事实上,高质量的产品使开发人员可以基于先前的工作轻松的构建新功能。但这种令人愉悦的情况很罕见,因为它需要一支技术精湛,训练有素的团队来实现这一目标。

        在上图中,增加了高内部质量的曲线做对比,通过比较可以看到,在一段时间内,开发低内部质量的产品比开发高内部质量的产品更具有生产力。那么,问题来了:这段时间有多长?Martin通过收集一些资深开发人员的意见发现:质量差的代码会在几周内大大降低开发速度,拥有高内部质量的软件随后将远远反超。因此,从长远看来,在内部质量和成本之间不需要花时间进行权衡。Martin根据他自己的工作经历发现,即使很小的软件工作也能从良好软件实践中受益。

7.即使最好的团队也会产生技术债务

        很多人认为,只有当开发团队粗心大意或犯错时才会产生技术债务,但实际上,即使是最优秀的团队也会在工作时不可避免地产生一些技术债务。Martin通过和最好的技术团队的负责人聊天,证实了这一点:一个被广泛认为是非常成功的项目,无论是在功能,时间和成本方面,客户对交付的系统都感到非常满意。同事们对在此项目的工作经验给出了非常积极的评价。技术负责人非常高兴,但也承认系统的架构并不是太好。同时给出任何一位经验丰富的软件架构师都熟悉的解释:我们做出了很好的决策,但现在才明白应该如何构建它。

        许多人将构建软件比作建造摩天大楼,这也是为什么我们称资深开发工程师为“架构师”的原因。但构建软件与物理世界不同,它是存在于充满不确定性世界中。软件的客户只是粗略地了解在产品中需要哪些功能,并在构建软件时了解更多信息(特别是早期版本发布给用户后)。软件开发的构建模块(语言,库和平台)每隔几年就会发生重大变化。映射到物理世界中就是,当建筑物被建造和使用后,客户要添加新楼层并改变楼层平面图,混凝土的基本属性也每隔一年就会发生变化。

Dora 对精英团队的研究表明,精英软件团队每天多次更新产品代码,在不到一个小时的时间内,即可完成将代码从开发状态更改为生产状态。当他们这样做时,他们更改失败率明显低于低效团队,因此他们从错误中恢复的速度要快得多。此外,这些精英软件交付组织与更高的组织绩效相关。

        鉴于这种变化,软件项目总是推陈出新。我们几乎从来没有发现自己在解决一个以前已经解决过的问题。在构建解决方案的过程中,对这个问题了解得最多,所以,团队在花了一年左右的时间构建它之后,才能真正理解软件的架构。即使是最好的团队在他们的软件中也会有技术债。

        Martin指出,不同的是,最好的团队其技术债较少,也及时消除了足够多的技术债务,以支撑继续快速添加新功能。他们花时间完成自动化测试,以便能够快速解决问题并减少时间的浪费。他们经常进行重构,以便持续的偿还技术债务。

8.高质量的软件生产成本更低

总结如下:

  • 忽视内部质量会导致技术债务快速累积;

  • 技术债务降低了功能的开发速度;

  • 即使最优秀的团队也会产生技术债,但是通过保持高内部质量可以使其变得可控;

  • 高内部质量可以最小化技术债,使得添加新功能的工作量、时间和成本都更少;

        Martin强调在考虑内部质量时,我们只应该将它作为一个经济论点来看待。高内部质量降低了未来功能的开发成本,这意味着花时间编写好的代码实际上降低了成本。

        Martin再次指出,为构建软件高内部质量所带来的“损耗”实际上是在降低损耗。我们在生活中做大多数决策的时候,习惯于在成本和质量之间进行权衡,但对于软件的内部质量来说,这种权衡是没有意义的。因为成本和内部质量之间的关系不是一种寻常和直觉的关系,它很难理解,但了解它对于以最高效率开发软件来说至关重要。

9、实际案例分析

10、抛砖引玉


浏览 49
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报