从“度量之殇” 到 “全生命周期的质量度量”
Editor's Note
如同“钱”一样,没有度量,万万不可;如果只剩下度量,度量也失去其意义。
The following article is from 圆小豆的美梦工场 Author 于晓南
2. 有度量,但无效
3. 有效度量,但无积极影响
4. 有效度量,积极影响,但一量到底
没有度量软件质量是极个别的情况,大部分软件还是有的。但度量的时机和选择的方式是否合理有效,就需要打个问号了。
理想的情况是:根据软件所处的不同阶段确定不同的度量目标,选取合适的度量方式,并根据所处阶段的变化适时调整,周期性的度量软件质量;每次度量的产出是形成有效的改进项,行动并观察效果,持续地对软件质量产生积极影响。
度量目标的确定直接影响度量方式的选择和度量效果的评估。在确定度量目标时,需要综合考虑多种因素,如:软件所处的不同阶段,团队整体对度量成本和收益的预期,度量实施的复杂度,度量效果评估的重要干系人偏好等。在综合考虑多种因素后,确定适合软件现阶段的度量目标。
举个例子,当软件处于0-1阶段时,没有历史的度量数据参考,这时就不宜设置量化的度量目标,如减少前端缺陷、提升自动化测试覆盖率。此时应设置定性的度量目标,如目标用户访谈,团队内反馈收集等。再比如,大量日活的移动端社交软件,老板要求每个迭代提供详细的缺陷报告和前端性能报表,此时就需要设置具体的量化指标来作为度量目标了。
度量方式分为两类,定量分析和定性分析。定量分析是从数量和频率的角度解释因果关系,强调的是数据频率对结果的影响。而定性分析是从意义和影响的角度解释因果关系,强调的是复杂影响和价值判断。两者各有所长,且无法互相取代。
在质量度量方面,定量分析更多的是数据分析,通过数据采集和分析来挖掘背后的意义。如缺陷数量和分布统计,不同服务的测试覆盖率,持续集成各环节的构建效率等。而定性分析更多的是可以引发深度思考的活动,如真实用户访谈,重大事故的根因分析,质量成熟度评估等。针对不同的度量目标,可以选取的度量方式组合也是不同的。
常见度量方式是用测试环境产生缺陷的数量来评估测试效率和软件质量,这属于定量分析。这种方式的优势是简单易操作,实施成本低。但劣势也较为突出:首先是度量不准,我们认为缺陷之间是不具备可比性的,由于缺陷的严重程度和紧急程度不同,我们不能说一个重大缺陷等于若干个普通缺陷,因此缺陷数量的绝对值累计是不具备统计意义的;然后是容易引起争议,针对开发和测试这两种不同的角色来说,这个度量标准的意义是完全相反的。
在这种度量背景下,测试的目标是破坏软件,缺陷越多越能体现测试的价值,因此测试会绞尽脑汁多提Bug。而开发的目标是实现功能,Bug越多说明实现效率越低。这种度量方式很容易引发团队的割裂、针对重大线上问题的追责、质量工作重点的偏离等现象,这是我们不愿意看到的。
那么问题来了,如果不是为了统计缺陷数量,我们收集缺陷数据的意义何在?首先,相比于数量绝对值,我们更应该关注的是数量或分布的变化趋势,比如:在某一时间段内缺陷提交量激增,我们则需要分析出缺陷激增的原因以避免潜在的风险;在大规模重构后,某后端服务的缺陷占比持续增长,我们则需要重点关注该服务,是否在重构时引入了不必要的改动,是否缺乏足够的测试保证原有功能不被破坏。
度量周期的选择也很重要。除了第一次度量,后续的度量都是建立在上一次度量的基础之上的,那么我们期望达到的效果是:上一次度量产生的行动项已经被执行,并产生了稳定的积极影响,那么就可以进行下一次的度量了。一方面检验上次行动项的执行效果,另一方面产生新的行动项。度量周期的设置不宜过短,太短的话可能还来不及产生效果,或者团队还处在适应变化的震荡期中,无法度量成效;度量周期设置也不宜过长,过长的话可能已经引入了额外的变量,导致度量成果不准确。一般来说,我们以改进后两个迭代左右为周期来度量,是比较适宜的。
在持续度量一段时间后,度量陷入瓶颈,更多的度量并没有带来更大的积极效益。这种情况下,我们就需要思考如何重新确定度量目标,选择不同的度量方式,引入更多的变量来刺激变化产生。我们认为质量度量应该发生在产品生命周期的任何阶段,哪怕当下没有调整度量方式的需要。在什么时机调整才算“适时”呢?这需要结合全生命周期的质量度量建模和产品所处阶段的度量目标来综合判断了。
在迭代内的多个阶段,可以针对不同阶段关心的要素选择度量方式和指标。在一个迭代内或者软件的一个稳定阶段内,应采取相同的度量策略,聚焦于主要的观察点,不宜引入过多变化。
需求阶段:更关心需求质量,迭代划分是否合理
实现阶段:更关心实现方案的有效性和复杂度,对需求的工作量预估是否准确等
测试阶段:更关心缺陷趋势、缺陷分布和引入时机
上线和运维:更关心系统稳定性,重大缺陷的响应力
在跨迭代的全生命周期中,可以针对不同阶段的首要交付目标去做度量的建模。由于时间跨度较大,需要持续评估度量效果,适时调整度量策略,及时把控度量方向。
0-1阶段:没有已知的度量参考,偏重定性分析,可关注需求质量和工作量预估,收集团队内部反馈 迭代阶段:需确保新增功能可用,已有功能不受影响;可做定性和定量分析 变更阶段:有重大系统变更,需要全方位的度量,确保风险控制有据可循 维护阶段:持续已有度量,提升效率减少浪费
可以采用仪表盘来可视化整个度量过程,如下图:
横坐标是度量维度,纵坐标是迭代
红绿灯代表健康度,文字表示该度量点上的关键事件
每一行代表一次迭代内的所有度量及效果
多行结合看,可以观察多个迭代的度量变化,以及团队关键事件如何影响度量
软件质量的有效度量,需要在确定度量目标后,选择合适的度量方式和度量指标,持续的度量和反馈,并适时调整度量策略。做到软件全生命周期的有效度量,才能真正为软件研发过程降本增效,事半功倍。
好消息:本文作者本周六会有一个演讲,到时欢迎参与交流。