
3 相关性分析
软件研发效能的提升是复杂的,受到诸多因素的影响。这些因素与结果之间存在相关关系而不是因果关系。即使我们发现两组数据之间有关联,也不意味着其中一组必然会导致另一组。例如,如果某个团队 “代码技术债率”指标很高,一般情况下代表着代码中存在的很多问题被暂时搁置,未来持续维护的成本和技术风险很大,那么从较长一段周期的趋势来看,很有可能 “交付周期”的指标会持续增长,即两组指标之间存在相关性。但这并不是必然的因果关系,虽然技术债很多,但很有可能因为人员能力、突击加班等其他因素暂时掩盖了这种问题,表面上冲抵了这种趋势。
但从研发效能分析的角度来看,我们仍然可以从历史数据中分析这种相关性,然后通过实验的方式进行探索,找到能够切实驱动效能提升的因素进行持续干预。比如,想提升线上质量、降低缺陷密度,经验告诉我们应该去加强单元测试的覆盖、完善 Code Review 机制、做好自动化测试案例的补充。但是,这真的有效么?我们通过数据来看,很可能没有任何效果!并不是说这些实践不该做,而是可能做的不到位。也许只是为了指标好看,编写缺少断言的单元测试、找熟人走过场分分钟通过的代码评审、覆盖一些非热点代码来硬凑测试覆盖率目标等等。所以,我们需要实验思维,要不断检视、反思、检讨所采用的实践,哪些实践的确有效,哪些实践效果不大,哪些实践方向正确但因执行不到位所以效果才不及预期。我们要通过实验找到那些真正有用的改进活动及其与结果之间的相关性关系,有的放矢采取行动才会更有效率和有效果。
在下面这个案例中,我们的目标是降低需求交付周期。根据研发效能领域专家的经验和理论的输入,我们认为研发各阶段耗时、流负载、需求规模、紧急需求插入占比、需求变更率、变更前置时间、代码技术债率、缺陷解决时长、代码复杂度/重复度等指标与需求交付周期有正相关关系,而流动效率、需求评审通过率、代码评审通过率、发布成功率等指标与需求交付周期有负相关关系。

然后,我们对过去半年的历史数据进行相关性分析并得到了一份相关性系数的热力图。在图中,正/负相关性由从浅到深的颜色进行标识,我们可以看到大部分相关性数据的计算结果与我们的经验和理论是匹配的,但也有个别数据与经验存在一定出入。那么接下来我们的行动思路也就明确了,即对已被数据证明存在相关性的活动和过程指标实施干预,如降低流负载、提升需求稳定性等,以期能够加速需求的交付速度。然后,对数据与经验有出入的指标进行检视与反思,分析是实践无效还是数据失真导致的误判,并在下个周期中进一步增加实验进行持续探查。
以上分析过程体现了数据驱动、实验性的思维方式,这正是研发效能度量能够有效指导效能改进、促进效能提升的不二法门。
另外,在这个案例中,我们还使用了北极星指标、群星指标与围栏指标的表述方式。上文已经讲到,北极星指标又称为首要关键指标(One Metric That Matters),可以用来指引我们改进的方向。为了进一步分解、分析北极星指标,我们还需要一些辅助性的参考指标,这些指标可能会有多个,分布在北极星指标的周围,我称之为群星指标。而围栏指标的设置是为了避免过度追求北极星指标所带来的潜在负面影响,避免在达成目标的解决方案选择上采取短视的行为。我们在分析一个特定场景时,可以使用由北极星指标、群星指标与围栏指标构成的指标集来进行全面的度量分析。