研发效能系列 - 质量与速度能否兼得丨IDCF
引言
我们的时间,应该是用于提高软件质量,还是专注在发布更有价值的功能?这貌似是软件研发中永恒的话题。
-
到底什么是质量?
质量有什么特质?
-
质量与速度是什么关系,两者是一个硬币的正反面,无法兼得么?
-
质量与成本又是什么关系,质量无价指的是什么?
-
还有,质量与创新呢?
关注质量会扼杀创新么?
技术债务与质量是什么关系呢?(技术债务是否必要以及是好是坏不是本节的内容,我们将单开章节讨论这个话题)
质量是什么?
我们先聊聊第一个问题,质量是什么。搞清楚了定义,才好探讨质量与其他事项之间的关系。
日常开发中有很多方面都与软件质量相关:例如,用户界面是否可以轻松引导用户完成需要完成的任务;再例如软件的可靠性;还有架构是否高内聚低耦合,以便开发人员可以轻易的修改和发布;以及代码是否清晰易读方便维护。
似乎有很多事情可以算作软件的质量范畴,那么,到底什么是质量?
百度百科查询质量,共有9个术语,与软件相关的有管理学概念、哲学定义、工程术语、产品术语等几个词条:
-
管理学概念中,质量的定义是:
客体的一组固有特性满足要求的程度。
-
质量工程术语中,质量是“产品或服务的总体特征和特性,基于此能力来满足明确或隐含的需要”。
-
质量产品术语中提出,“产品质量就是产品的适用性,即产品在使用时能成功地满足用户需要的程度”。
-
质量哲学定义中,“时间、空间、质量合称宇宙三要素,质量是三要素中的原生要素,没有质量就没有空间,没有空间就没有时间,如果采用老子道德经的诗化描述,则有:
原生质,质生空、空生时,时生万物。
” (哲学定义中的质量与我们讨论的软件质量不是一个概念,但是其中时间、空间与质量的三要素,事实上在软件开发过程中的理念可进行借鉴,这个我们后面会提到。
)
百度百科中管理学的词条与我们讲的软件质量更为相关,但似乎各种质量管理大师,对质量的理解又各有不同:
-
美国著名的质量管理专家朱兰(J.M.Juran)博士从顾客的角度出发,提出了产品质量就是产品的适用性。
即产品在使用时能成功地满足用户需要的程度。
用户对产品的基本要求就是适用,适用性恰如其分地表达了质量的内涵。
-
美国质量管理专家克劳斯比从生产者的角度出发,曾把质量概括为“产品符合规定要求的程度”;
-
美国的质量管理大师德鲁克认为“质量就是满足需要”;
-
全面质量控制的创始人菲根堡姆认为,产品或服务质量是指营销、设计、制造、维修中各种特性的综合体。
从各位大师的定义,我们可以总结得出观察产品或者软件的质量的两个角度:
-
内部质量:
作为过程指标,更多的聚焦在产品功能研发环节内部,比如缺陷数量,代码覆盖率,UT覆盖情况等等,也就是克劳斯比提到的“生产者的角度”。
-
外部质量:
作为结果指标,关注是否真正的满足了用户的功能性需求以及非功能性需求,在满足用户基本诉求的同时,对于可靠性及用户体验,是否超出用户的预期,也是朱兰和德鲁克的观点。
如果说软件开发是要产生对客户有价值的产品,那么为了让客户持续的、更多的获得价值,我们需要构建质量。外部质量是对客户对价值的认可直接相关的,内部质量是为了更快更多更持续的交付价值。
内部质量对于生产者而言相对可控,也是我们经常讨论的质量內建以及质量保障的主体。外部质量是客户/用户(本章不对客户和用户进行区分,统一称为用户)能够感知的,我们交付的产品是可控的,但用户对质量的预期是不可控的。外部质量是产品价值存在的根本,没有用户认同的产品是闭门造车没有存在意义的。内部质量要体现到,最终也会反映到外部质量,是外部质量的保障因素,不可忽略。
内部质量是否重要?
用户和客户通常可以看到是什么使软件产品具有较高的外部质量,但无法区分内部质量的高低。用户可以判断他们是否愿意支付更多费用来获得更多的功能,更易用的用户界面,因为他们可以评估这些是否足够值得额外花钱。但是用户看不到软件内部的模块化结构,更谈不上判断它的好坏。
为什么要为没有效果的东西付出更多?那么内部质量到底重不重要呢?答案当然是重要。
内部质量与外部质量是一个事务的两个方面,外部质量是结果,内部质量是基础。
质量是內建的,Build In Quality,但最终是需要由外部质量来体现。如果因为对内部质量的过程保障,影响了对外部质量的结果诉求,两者产生了冲突,就是本末倒置了。外部质量是真正用户可见可感知的,而内部是对外部质量的保障,通常称为Quality Assurance。
外部质量,针对客户而言有两类,一类是满足了客户会满意的,一类是不满足客户会不满意的。第一类简单的讲,就是通常我们说的功能性需求;而第二类,就是通常说的NFR非功能性需求,当稳定性、易用性、安全性、性能等无法满足时,客户会不满意。而第二类事实上与我们讲到的内部质量息息相关,事实上也会影响外部质量。
内部质量常见的一个类比是技术债务,是否能够简便的添加功能,其额外的成本就像支付利息,清理阻碍交付的障碍就像偿还本金一样。技术债务这一隐喻的好处是可以让人更容易从经济的视角来看待内部质量,如同外部质量一样,我们可以理解内部质量的价值,以及一旦(或多或少都会)缺失时所需要支付的利息。
忽视内部质量会导致债务快速堆积,这种堆积会减慢功能开发的速度。债务是无法避免的,但通过重构等实践,可以保持内部质量,并将债务堆积保持在最低限度,使团队能够以更少的精力、时间和成本添加功能。
在日益复杂的系统中实施软件开发是困难的,失败/故障也是在所难免。但是技术债务不可避免,即使是最好的团队在他们的软件中也会有缺陷,不同之处在于,好的团队不仅新创建的债务要少得多,而且还不断的偿还了足够多的历史债务 ,以便他们可以继续快速的添加功能。
高绩效团队的秘密在于:
-
主干开发保证紧凑的提交与发布节奏,短分支、小批量的提交;
大批量、低频的变更会给部署环节带来风险,一旦有失败/故障出现,找到问题的根因和恢复服务是非常困难的。
更糟糕的是,部署还会在整个系统里引发一连串其它的故障,全面恢复这些次生故障需要的时间更是惊人的。
-
持续集成,以便于最大限度地减少跨团队协同而造成的集成麻烦;
-
花时间创建自动化测试,测试自动化对持续交付影响重大,尤其是与持续集成结合,以便于快速发现问题并花更少的时间来修正错误并发布上线;
-
经常性的重构,以便于在多余的“脂肪”堆积到足以妨碍行动之前消除它;
-
通过持续交付,按需的交付到生产环境或是客户;
-
将交付质量与系统部署的快速反馈视为第一优先级;
-
持续不断的优化与改进。
不同阶段的产品对质量的要求不同
质量具有时效性
质量不是一个固定不变的概念,它是随时间而动态的、变化的、发展的。质量会在不同时期不断变化,不断的充实、完善和深化。
质量具有时效性,会随着时间、地点、使用对象的不同而不同,随着社会的发展、技术的进步而不断更新和丰富。客户的需求和期望是不断变化的,因此,需要不断地调整对质量的要求。
人们使用产品的过程会对产品质量提出一定的要求,这些要求往往受到使用时间、使用地点、使用对象、社会环境和市场竞争等因素的影响。外界的因素变化,会使人们对同一产品随之产生不同的质量要求。
Kent Beck的3X模型
Kent Beck在Facebook工作期间,亲见了FB的产品及研发模式,可以说一定程度上颠覆了他对开发与质量的理念,由此Kent提出如下图所示的3X模型。
创新阶段的质量如何评估?缺乏用户和市场的产品是最大的浪费,也是最大的质量问题。在产品的早期探索Explore阶段,要的是快速的获取市场反馈,而不是推出面面俱到的产品,此时的质量衡量,应该是反馈的速度以及应对的速度,而不是稳定性、易用性等。
到中间产品的快速扩张Expand阶段,要的是能够支撑产品指数级增长的需要,此时交付速度、性能、可扩展性等是质量的表现。
而到收割阶段,要的是稳定的最大化的产出Extract产品价值,此时稳定性、效率、安全等需要重点考核的质量因子。
外部与内部质量的好坏直接影响到产品在市场上的受欢迎程度,但总体而言质量关注点是由市场决定的,是由外部因素决定的,并非一概而论的以一堆内部指标来衡量。
不同的产品阶段,对于质量的定义与要求不同,对质量的容忍度和失败风险不同,应该考虑质量的边际效益,即边际投入和边际收益的关系,一分钱的投入要同比至少获得一分钱的回馈,而非一味追求高的质量,而错失市场时机。
不同的客户群体对于质量的定义不同
一般的观点认为,产品质量越高越好,质量愈高,价值就愈高,但事实上,这种观点并不一定是正确的。质量高的产品并不一定在市场上受欢迎,事实上不同受众群体对于质量的定义都会不同。
一款产品需要有其匹配的市场与人群,这在特劳特的《定位》理论中有详尽介绍。与产品的定位相同,对于产品的质量应该控制在什么程度也需要有一个定位,即产品的质量定位。
质量具有相对性,不同客户群体可能对同一产品提出不同的功能需求,也可能对同一产品的同一功能提出不同的要求。需求不同,质量要求也不同,只有满足需求的产品,才会被认为是质量好的产品。
近些年拼多多的快速崛起就是极好的案例。早在拼多多小有名气时,京东就曾对其进行研究,得出的结论是不足为据,等到拼多多上市再对其进行复盘才发现,京东这样的电商巨头居然都走了眼,拼多多的用户最看重的居然是产品质量。但是拼多多的用户对于质量有着与京东的用户完全不同的定义,例如高质量的卫生纸是“三层,遇水不化”,而京东的用户心目中的好纸,是“环保,无漂白剂”。
质量定位如同产品定位一样,需要考虑到不同的市场,不同的客户群体,对于产品价值(包括质量)的接受和欢迎程度,根据市场实际需求状况确定产品的质量定位。你心目中的“高质量”,未必与别人心目中的一样。
质量与速度无法兼得?
快速交付带来更好的外部质量
通常,业务压力以及部门绩效考核的原因,会让人们将注意力放在交付业务价值上。而质量往往容易被忽视,直至出现问题。
需要注意的是,我们并非要做一个功能来满足客户需求,而是要去了解客户的目的和意图是什么,客户想要的不是一匹更快的马,或是一辆更快的车,而是按时从A地去B地。如果是上千公里的距离,飞机会合适;如果是几百公里,汽车不错;如果是几十公里,汽车挺好;如果是几公里,自行车就足够。因此客户的需求不是一概而论的,要根据真实的目的去提供相应的产品。
人们往往把保证质量与快速响应客户需求看成一对矛盾,缺乏与客户一起去平衡机会与风险的理念。
客户的意图,是不断通过沟通与探索,逐渐清晰的,这就需要我们通过方法和技术的手段,来快速获取反馈,不断澄清,不断的调整产品方向。客户的目的即产品的方向,是一个移动靶,而敏捷就是要通过快速交付、快速反馈、快速调整,来曲线式的去尝试击中移动的标靶。
所以快速交付所带来的快速反馈,是与外部质量直接相关的。没有外部客户的反馈,任何功能、性能都是水中捞月。速度可以帮助更好的达成客户真正的诉求,尤其是这样的一个乌卡时代。
从长远来看,质量是速度的保障
与此同时,编写好的软件需要一些额外的努力,这在短期内确实会带来一些成本。但是,如同技术债务章节探讨的,内部质量也可以有意的牺牲,以获取更快的速度 ,如果这是有益(处)的话。
当然随之而来的是代码的可读性、可扩展性、稳定性、易用性等的缺失,并且在未来会附着在每一次的新功能交付中。1.01^100≈2.705,0.99^100≈0.366,所以从短期来看内部质量多消耗了资源(人力、物力、时间),但长远来看是指数级的回馈。
所以短期看,故意牺牲内部质量,需要能够带来更大的经济价值,需要跑得赢技术债务的利息。但是从长远看,内部质量的根本作用是降低未来变更的成本。更好的内部质量使添加新功能更容易,因此会更快、更便宜,所以内部质量事实上也会带来外部收益。高内在质量使我们每天10次部署,每周都能添加新功能,而低内在质量却让我们困在繁琐程序中无法自拔。尽管早期可能落后,但很快高内在质量的软件就比低内在质量的产品功能强大的多,然后所有的客户都会选择功能多的那个应用,即使它的价格更高(事实上价格可以更低,因为投入的资源反而更少)。
提升内部质量是为了减少长远来看生产力的下降。这一点,从Martin Fowler的时间-功能-质量图中可见一斑。内部质量差的情况下,最初进展很快,但随着时间的推移,添加新功能变得越来越困难。即使是很小的改动也需要程序员修改大范围的代码;那些难以理解的代码,在更改时大概率会发生意外损坏,导致测试时间过长和额外需要修复的缺陷。
从示意图中也可以看出,有一段时间,低内在质量比高内在质量更有效率。在此期间,质量和成本之间存在某种权衡。问题是在两条线交叉之前的这段时间有多长?根据Martin的图示,低质量的代码会在几周内显著降低交付速度,所以用质量换速度仅适用于极短的期限。
速度与质量可以兼得
在吞吐量(throughput)和稳定性(stability)之间进行取舍(权衡)是一种常见的行业实践,尤其是在政府或高度监管的领域里,组织更愿意采取保守型的软件开发和交付策略。他们保证,低频次地发布代码是一个有效的策略。因为这样就可以有更多的时间用于部署、测试和质量检验,从而失败/故障发生的可能性将会降到最低。
在双模IT模型中,我们探讨了稳态和敏态两种模型的划分,是否适用于当下的IT转型,更进一步引申出IT转型与数字化转型的区别与联系。Jez Humble的观点是,双模模型是伪命题的,从“DevOps现状报告”可见一斑。报告指出,软件研发效能对零售行业影响巨大,金融服务紧随其后,对零售和金融这两个我们通常认为迥然而异的行业而言,问题不再是选择保守还是追求卓越,高效并非是一个TO BE OR NOT TO BE的问题,而是必须,毕竟野蛮人已经破门而入,出入厅堂了。
事实上速度与稳定可以兼得,最优秀的高绩效组织总是能在吞吐量和稳定性上同时达到卓越的水平,而不是在两者中取舍,或者牺牲掉某一个。根据DORA的“DevOps现状报告”,高绩效组织可以做到速度与质量的兼得,通过內建质量、自动化以及持续的反馈,加强质量的同时,并不丧失短时的速度。
“精英软件团队每天多次更新生产代码,在不到一个小时的时间内将代码更改从开发推向生产。当他们这样做时,他们的变更失败率明显低于速度较慢的组织,因此他们可以更快地从错误中恢复。”
“我们没时间编写高质量的代码,因为这需要太长时间”,管窥效应,稀缺思维,只盯着那些短期内收益更高的选择,容易忽略投资在长期而言更高效的事情上。
质量是免费的?给质量算笔经济账
质量免费,但从来不是可以免费获得
克劳士比的《质量免费》管理学的经典名著,“质量不仅是免费的,而且它还是一棵货真价实的摇钱树。由于工作一开始就做对了,没有返工而省下的每一分钱,都会被列入会计报表中“利润”这一栏”,观点深入人心,却知易行难。
质量从来不是免费就可以获得,需要投入大量的人力与物力,但是,追求质量是投入产出ROI最高的活动。追求质量从长期来看是速度倍增的,而且具备加权效应。
质量具有经济性
由于客户的需求是产品价值的表现,物美价廉反映的是人们的价值取向,物有所值,就是表明质量有经济性的表征。
质量哲学定义中时间、空间与质量的三要素,“没有质量就没有空间,没有空间就没有时间”的理念,同样可以对应到软件开发中。传统项目管理三角形的需求、时间和资源,以及隐含的质量因素。需求是固定的,认为资源与时间是可变的,事实上并非如此,所以质量往往是被动牺牲的,而开发人员事实上也是被动的牺牲了质量。敏捷开发中这一模型变成了倒三角,我们承认资源与时间总是有限的,所以需求是可以商量的,而需求也体现了客户对外在质量的要求,也就关联到了内部质量,所以对质量的要求是可以随时间变化的,但这一过程中,我们是主动的。(当然,我们还需要主动的把短期的质量牺牲弥补回来。)
适合的才是最好的,过犹不及,过快的速度与过度追求质量同样都是浪费。举服务等级协议SLA为例,从99%提升到99.99%的追求,所需要的是10倍甚至100倍的资金与时间投入,而对客户而言,感知未必是100倍的提升,也许是10%不到的感受。
所以一味的追求高质量并非明智之举,质量高低除了与速度相关,也与出错概率所带来的风险如影随形。结果若是在承受范围,就完全可以承担起质量略低的风险。
从华为案例看德企与日企对待质量的态度
以华为为例,“在华为看来,创新要向美国企业学习,质量要向德国、日本的企业学习”,在华为的“大质量”形成过程中,与德国、日本企业的对标起到关键作用。
德国企业的特点是以质量标准为基础,以信息化、自动化、智能化为手段,融入产品实现全过程,致力于建设不依赖于人的质量管理系统。德国强调质量标准,特别关注规则、流程和管理体系的建设;大约90%的德国发布的行业标准被欧洲及其他洲的国家作为范本或直接采用。德国的质量理论塑造了华为质量演进过程的前半段,即以流程、标准来建设的质量管理体系。
日本企业的特点则是以精益生产理论为核心,减少浪费和提升效率,认为质量不好是一种浪费,是高成本。日本企业侧重关注“点”上的质量改进,高度关注“人”的因素,强调员工自主、主动、持续改进。这也帮助华为慢慢形成持续改进的质量文化。
华为认为高质量企业的根本是质量文化。工具、流程、方法,是“术”;文化是“道”。
在以客户为中心这一永远不变的主题之外,任总讲的最多的是“质量文化”,而对质量的关注恰恰在任总看来是华为可以不断创新的基石。
数字化对质量工作者的影响
作为质量人员,总得思考数字化对QA未来的职业发展,数字化转型对QA工作方式冲击是很大的,以前由于数据不透明上面需要QA作为警察提供可视性,由于数据无法自动获取没有自动评估模型,项目组也需要QA帮助分析质量或者给予质量方法引导。如果真正实现全面数字化,现在QA的工作,大多数都可以不用做了。
但事实上,只要产品开发是一个过程,通过构建一个好的过程来保证一个好的结果的自然法则不变,产品开发就需要质量管理,就需要有专业人员去建设质量管理体系。
只是数字化转型中,质量管理体系的使能方式发生变化了,QA应该去深入业务分析质量问题总结优秀实践,提取要求和方法,把他们工具化嵌入作业流并跟踪其执行效果且不断完善,QA从以前贴身服务变成通过做质量工具提供服务,数字化转型的路标是先IT化,再自动化,后面是大数据以及AI技术,把这些技术应用到质量保证和效率提升上,都是需要有人承担的,如果以后质量机器人就是QA了,那未来我们就是造机器人的工程师。