来源:http://t.cn/Ai9LBVDu

ThoughtWorks 首席科学家 Martin Fowler 指出,软件开发项目中存在一种常见争论,即“花时间提高软件质量,还是专注于发布更有价值的功能?”他认为“提供功能的压力常常主导着讨论,导致许多开发人员抱怨他们没有时间研究架构和代码质量”。于是,Martin 近日在个人博客发布了一篇名为《高质量软件值得这么多成本吗?》[1]的文章,就此展开讨论。

通常,这样的反问句答案显然是否定的。不过,Martin 接下来的阐述进一步颠覆了问题本身,这个问题假定了质量和成本之间的共同权衡,可在他看来,这种权衡并不适用于软件——“高质量的软件实际上生产成本更低”。

这种说法是否颠覆了你的认知?人们习惯于在质量和成本之间进行权衡,“一分钱一分货”不无道理。当然,Martin 承认该假设在大多数情况下是正确的,更高的质量会花费更多。但他强调这并非一个绝对规则。

软件质量意味诸多

Martin 首先对“软件质量”做出了界定。有很多方面可以囊括在内:用户界面清晰吗?软件足够可靠吗?架构合理、明确吗?

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

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

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

用户可以判断他们是否想要支付更多费用以获取更好的用户界面,但对于内部模块化结构难以做出判断。试想一下,如果有两个近乎完全相同的应用程序,一个卖 6 美元,另一个售价 10 美元,区别仅仅在于后者的源码整齐有序而前者较为混乱。这并不影响程序正常运行,客户为何要多花 4 美元购买后者?既然如此,为什么软件开发人员还要花时间和精力来提高工作的内部质量?

Martin 在此引出了“技术债务”(Technical Debt[2])的概念。由于代码混乱而造成的难以清理的残余项(cruft)便是积累技术债务的罪魁祸首,为增加新功能所付出的额外努力则是债务利息。

如果模块结构足够清晰,假设添加一个新功能需要四天时间,但由于逻辑混乱或数据难以理解等代码规范问题,这一工作可能将会被延长至六天。

这些繁琐的部分不仅会更加耗费开发人员的时间和精力,也加大了出错的可能性,那么以后将需要花费更多成本来进行修补。

由此看来,内部质量实际上对用户来说也至关重要。因为更好的内部质量使得添加新功能更快、更容易,成本也更低。

内部质量的影响

Martin 表示,“内部质量的基本作用是降低未来变革的成本。但是编写好的软件需要额外的努力,这在短期内会产生一些成本”。为此,他提供了两张图表,以可视化的方式来呈现将内部质量的影响。

上图是软件内部质量较差的情况。可以看到,在最初一段时间,工作进展很快,但随着时间的推移,添加新功能变得愈发困难。这也是大多数软件工作的境况。

专注于高内部质量很可能造成生产力下降,但开发人员可以通过利用先前的工作轻松构建新功能。这一目标需要一支技术精湛,训练有素的团队来实现。

加上高内部质量的曲线之后,一些微妙之处显现出来:前期低内部质量比高内部质量的软件更具有生产力,在此期间,质量和成本之间存在某种权衡关系。问题是,它能持续多久?

Martin 综合参考了一些熟练开发者的意见,发现质量差的代码会在几周内显著降低生产速度,拥有高内部质量的软件随后远远反超。因此,从长远看来,不必太费心思在质量与成本之间权衡。

即便最好的团队也会产生垃圾

即使是最优秀的团队也会在工作时不可避免地产生一些无用且琐碎的东西(cruft)。

许多人将构建软件比作建造摩天大楼,想想为什么高级程序员被称为“架构师”?但软件构建于物理世界未知的不确定世界中,软件开发的构建模块——语言、库和平台——每隔几年就会发生重大变化。鉴于这种程度的变化,软件项目总是创造出新颖的东西。Martin 说他常常听到团队只有在花了一年左右的时间构建它之后,才能真正理解软件的架构。即使是最好的团队也会在他们的软件中肆意妄为。

不同的是,好的团队即使创造了垃圾,也能及时清理掉它们,他们可以继续快速添加功能。此外,他们还会花时间创建自动化测试,也经常进行重构,以便快速解决问题、清理残余。

Martin 用清理厨房来比喻这项工作:做饭时如果不快速清理台面污渍,之后更难去除,所有肮脏的东西会妨碍烹饪下一道菜。

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

总结一下:

•忽视内部质量会导致 cruft 快速产生•这将进一步延缓功能开发•即使是一个伟大的团队也会产生这样的问题,但通过保持内部质量,可以控制它•高内部质量使团队能够以更少的工作量、时间和成本开发新功能

一些开发团队向 Martin 诉苦:“管理层阻碍我们写出质量好的代码,因为它需要花费太长时间”。对此 Martin 再次呼吁,高内部质量实际上降低了未来成本,了解内部质量与成本之间的关系对于以最高效率开发软件来说至关重要。

开发高质量软件需要更高成本吗?相关推荐

  1. 《高质量程序设计指南——C/C++语言》第1章 高质量软件开发之道

    第1章 高质量软件开发之道 本书的第1章之高质量软件开发之道,作者用大量的篇幅介绍了"软件质量"的基本概念,解释了软件质量的十大属性.这十大质量属性又分为功能性和非功能性两类,功能 ...

  2. 有了实例化需求,交付高质量软件不再是空谈

    引言: 去年12月, infoQ采访了<实例化需求>作者,在采访中作者给出了一些阅读本书的建议和原则,帮助大家在软件开发项目中采用实例化需求去创建活文档.实例化需求是一组方法,它以一种对开 ...

  3. 推荐4款电脑必备高质量软件,各有千秋,总有一款能惊艳到你

    PC端软件众多,但真正良心的软件,少之又少. 笔者的桌面上,就有那么几个,不管换了几次新电脑,都会第一时间,安装上去的良心软件. 小丸工具箱 小丸工具箱,是一款用于处理音视频多媒体文件的软件. 小丸工 ...

  4. 我的高质量软件发布心得

    译者按: 好好写代码,充分做测试,和小伙伴沟通清楚,灰度发布,上线后要有监控和一键启停. 原文: A framework for shipping high quality software) 译者: ...

  5. 高质量软件中的7项自动化要求

    目录 翻译内容 Summary(摘要): 正文 关于作者 Sammy Tam 原链接 翻译内容 Summary(摘要): An advanced, efficient test automation ...

  6. 【华为云技术分享】如何设计高质量软件-领域驱动设计DDD(Domain-Driven Design)学习心得

    DDD做为软件设计方法于2004年提出,一直不温不火,最近几年突然火起来了,为啥呢?正所谓机会给有准备的人,因为微服务的流行,大家都跃跃欲试把传统单体软件转成微服务架构,但理论很丰满,现实很骨感,光是 ...

  7. Kotlin 普及度增加,代码质量比 Java 更高?

    Google 在 I/O 2017 上宣布 Android 加入了对 Kotlin 编程语言的支持.如今,在所有开源的 Android 应用程序中,我们能发现有 12% 都是由 Kotlin 开发.G ...

  8. 3款Win10必备的高质量软件,让你的电脑成为真正利器

    彩云小译 彩云小译,是个人非常推荐的一款高质量翻译软件. 彩云小译 熟悉它的人都知道,彩云小译的整体设计风格,十分简洁清新,给人一种舒适无比的感觉,软件不仅完全支持苹果和安卓版本,还原生支持电脑浏览器 ...

  9. 如何做高质量研究、写高水平论文?| 黄高、王兴刚等共话科研与论文写作

    如何产生好的研究思路?如何撰写一篇高质量论文?如何从浩如烟海的论文中寻找好的科研灵感?如何通过Rebuttal为自己的文章扳回一城?导师跟学生之间怎样才能形成更好的合作关系? 在ECCV 2022中国 ...

最新文章

  1. KDTable的列绑定F7控件方法
  2. 举例让抽象问题具体化:栈的压入、弹出序列
  3. WINCE下的MINGW交叉编译环境下内存崩溃地址的查找方法。
  4. MySQL 中删除的数据都去哪儿了?
  5. 干活的不如写ppt的吗_干活不如写PPT 这话太真实
  6. php为什么没有rz 命令,Linux上传文件-    命令之rz
  7. kratos import 飘红问题
  8. go调用python脚本_谁能取代Python?我使用Go来部署机器学习模型的原因
  9. 怎么让计算机打开就是d盘,电脑怎样设置启动盘符为D盘-win7启动盘,win7如何选择启动盘...
  10. 进程之间的通信方式有哪些?
  11. 《计算机网络 自顶向下》第二章==应用层==随堂笔记
  12. 易企秀把作品转赠给别人,让别人可以编辑
  13. Mybatis源码学习-MapperMethod
  14. ideal springboot class not found 解决办法
  15. 一文轻松明白 Base64 编码原理
  16. P9-Windows与网络基础-Windows基本命令-文本操作(type、findstr)
  17. java集成华为云obs上传下载实战
  18. 如何使用条码标签软件的模板库
  19. 使用FeignClient注解,进行远程http第三方调用
  20. html播放器投屏,爱奇艺万能播放器投屏播放的具体方法介绍

热门文章

  1. strcpy和memcpy的区别 | strcpy和strncpy的区别
  2. python工具-文件及文件夹移动及处理
  3. 应用后台省电秘籍——低功耗状态下应用如何正常运行?
  4. numpy数据集练习
  5. Java中static关键字总结
  6. 如何快速地掌握PowerShell?
  7. oracle创建表空间.创建用户.创建表
  8. HLS实现点播和直播时,M3U8文件的不同
  9. 关于vector的resize()的理解
  10. linux route命令详解