写点什么

破解千行代码缺陷率引发的“血案”:研发效能度量是一把标尺吗?

  • 2021-09-02
  • 本文字数:2765 字

    阅读完需:约 9 分钟

破解千行代码缺陷率引发的“血案”:研发效能度量是一把标尺吗?

人们常常认为软件研发度量为管理者提供了一把标尺,可以简单丈量出团队乃至个人的表现,但这个隐喻背后其实包含了对研发效能度量的一些误解。

 

度量分两种,一种是物理度量,一种是统计度量。

 

物理度量追求极致精确,测定目标物理量的接近绝对精确的数值。从秦始皇统一度量衡,到如今普遍使用的激光测距仪,物理学家已经将距离测定推进到了原子级,把质量测定推进到至少 10 的 27 次方分之一克。

 

而统计度量是通过观察样本,对目标统计量做出一种近似但科学的推断。比如,父母希望知道孩子的发育情况,那么可以参考国家儿童体格发育调查报告。其中的度量就是卫生部门对各个年龄和地区儿童的身高、体重进行大范围抽样,计算出他们的分布和均值等统计量。

 

大家经常引用彼得 · 德鲁克的名言,“you can't manage what you can't measure”(你如果无法度量就无法管理),但这里的度量到底是什么样的含义呢?鉴于物理课从初中开始就是主科,而统计学可能是大学里挂科最多的课程之一,大家对度量的朴素理解往往是偏向物理度量的。而当我们建立了上述两类区分,不难看出,管理学里讲的是统计度量——它对所谓“精确”的要求、对结果的解读都与物理度量有本质不同。

 

当我们谈论研发效能度量时,我们谈论的是统计度量——这是一个对正确理解和管理研发效能有很大影响但却常被忽视的基础性认知。管理学中的度量,包括研发效能度量,追求的不是绝对精确,不是在任何情况下没有反例,而是数据中反映出来的共性规律和潜在问题。对统计度量的使用,需要团队和管理者进行更多系统思考。物理度量简单直接,统计度量则需要辅以分析和调研。

从缺陷度量案例讲起


下面我们通过一个案例,具体理解研发效能度量的统计意义和系统思维。腾讯技术专家茹炳晟老师在文章《研发效能度量引发的血案》中举了一个用“千行代码缺陷率”度量代码质量的反例。

 


针对这个案例,我们想做以下几点补充:

 

首先,虽然代码行数和代码质量之间不存在因果性,但这并不会让“度量的大前提”失效,因为相关性足以支撑统计度量的现实意义:我们都希望软件缺陷少,因为缺陷很可能会影响用户使用,阻碍产品的价值实现,带来更多测试和开发成本;而缺陷数量和代码规模相关,所以要想获得对缺陷情况的全面认知,必然会综合考虑两者的关系,否则就会变成“多干多错、少干少错”。

 

其次,从千行代码缺陷率推导出“我们不相信你能够写出高质量的代码”、“我们不鼓励技术提升阶段的阵痛”和“我们欢迎那些平庸的程序员”这些错误价值观的根本原因,是没能理解统计度量固有的灰度。缺乏度量会使效能问题无法被发现,但度量时套用错误的“理工科思维”,试图依赖单一标尺得出精确结论,甚至是削足适履,可能更加危险。团队如果囿于这样的思维,那么换任何其他的度量指标都是枉然。下一节我们会展开阐述系统思维如何破解这里的问题。

 

最后,降低统计度量中的噪音,设计制衡机制,对度量指标的合理使用非常重要。茹老师提到深度代码分析指标“开发当量”,可通过计算抽象语法树(AST)的复杂度来估计工作量,消除源代码级别的噪音干扰(如换行、注释等)。如果没有类似制衡机制,有人就容易抵制不住走捷径的诱惑;反过来说,不能因为担心有人“在错误的地方花费更多时间和精力”而不做制衡,因噎废食。实际上,当与系统博弈的成本大于通过正确行为获益的成本,大家就会被引导到正确的行为上。

系统化破解“血案”


代码简洁、缺陷少、可维护性好的大牛被认为是测试不充分、工作不饱和,在技术提升阵痛期的工程师被批代码质量不高,平庸的工程师反而乐得逍遥——与其说这是指标的原罪,不如说是缺乏系统思维导致的恶果。我们经常担心某些度量指标的“负向牵引作用”,但“负向牵引”是如何产生的呢?

 

让我们用系统思维重新思考一下前面的案例:

 

  • 平平无奇工程师 A 的千行代码缺陷率虽然落在安全范围,但每需求或每故事点代码行数/当量却异常偏高,说明代码规模有冗余;从缺陷停留时间看,一般需要很长时间才能定位并解决问题,维护成本确实偏高;进而从软件工程质量的角度看,A 的代码中可能有大量可复用逻辑没有被抽象,架构上也有优化的空间;从评审环节看,A 的代码要经过的平均评审轮次也可能偏高——综合起来,虽然工程师 A 不一定会被揪着修复缺陷,但可能需要在设计模式或架构设计方面补补课。

  • 大牛工程师 B 的评价涉及对“缺陷”的多维度理解,如果同时参照后续测试中的故障和线上的事故,那么就能说明 B 的代码质量确实过硬,没有理由被责令加强自测;相反,如果缺少数据支撑,碰上不了解情况的领导反而会百口莫辩。

  • 成长中的工程师 C,因为数据呈现出实际的不足,这本身有什么问题呢?团队如果有抵触“技术提升阶段的阵痛”的文化,只一味掩盖或隐藏“阵痛”,又如何能够改善呢?C 的技术追求需要团队的认可与支持,但在代码缺陷率方面的提升空间同样应该暴露出来。这不仅是对团队工作成果负责,也能为 C 的成长提供反馈和指引。

 

在复杂体系的度量中,任何单一指标被过度宽泛地解读、被过度简化地归因、被过度粗暴地使用,都是危险的。而控制这类风险,确保度量的牵引力不跑偏,需要通过系统化设计才能实现。数据扮演了驱动的角色,但需要组织动起来,这正是“数据驱动”软件工程的要义。

研发效能度量的系统方法


为了让软件效能度量在合适的土壤中生根发芽,我们建立了一套 MARI(measure-analyze-review-improve,即度量-分析-调研-改进,读作“码睿”)四步循环方法框架,帮助团队避坑。该方法的系统性不仅体现在多维指标共同构成度量体系,也体现在度量和后续实践的紧密结合。度量如果只止步于数字,就很难避免“为了度量而度量,为了提升而提升”的教条主义。



研发效能的度量和提升实践可以归纳为上图的闭环:从特定的认知需求出发,通过度量获得客观数据,通过分析定位潜在的问题,通过调研挖掘问题本质,通过改进解决问题。这样层层推进,持续循环,获取自反馈,才能让度量有响应、有落地。MARI 方法可以帮助团队体系化地认知研发效能度量,避免简单粗暴地误用。

 

本文阐述了研发效能度量的统计意义和系统思维,分享了我们对这些底层逻辑的理解,以及怎样在完整框架的支持下实现度量的价值落地。后续的几篇内容已经在筹备中,将详细展开具体的度量指标体系和 MARI 实践方法。非常期待与关心研发效能的朋友们多多交流、互相学习!

 

作者介绍:

 

任晶磊,清华大学计算机系博士,前微软亚洲研究院研究员,斯坦福大学、卡内基梅隆大学访问学者;现任思码逸 CEO,通过打造基于深度代码分析技术的研发大数据平台,以数据驱动软件工程,助力企业和开发团队提升研发效能。在程序分析、软件工程领域具备多年前沿研究经验,多篇论文发表在 FSE、OSDI 等顶级国际学术会议上,参与过微软下一代服务器架构的设计与实施,也是一位积极的开源贡献者。近期作为专家组成员参与《软件研发效能度量规范》标准编制。

2021-09-02 18:446001

评论 7 条评论

发布
用户头像
感谢分享,很有收获!
2022-04-12 21:07
回复
用户头像
统计度量固有的灰度
2021-09-06 10:35
回复
用户头像
太理想化,不切实际。之前一篇文章我就吐槽过,这个不想再费口水。还是那句话:程序员是艺术家,你无法给一个艺术家打分,也不需要管理。
2021-09-06 10:07
回复
软件开发是一门工程,也是行业几十年来业已形成的认知。它的艺术性并不妨碍工程性。你看运动员们打球算艺术吧,但联盟选球员不看数据吗?今天运动员们用多少数据分析技术呀
2021-09-07 16:49
回复
少来这里评价运动员,那些都是帮助运动员提升运动水平用的,打球能叫艺术?请问你对艺术了解多少?那要是这样做饭也是艺术,吃饭也是艺术。
请问千行代码故障率能给程序员带来什么价值?试问管理岗有没有衡量管理水平的参数呢?少在这里给人分三六九的价值关美化说辞。如果给人打分有用,就不会有爱因斯坦,如果能给人打分这个世界就不会有爱情。数据分析别用错了地方。
2021-09-08 14:06
回复
又进入了另一方面极端。的确是艺术
2022-01-14 10:31
回复
用户头像
一切不以业务价值作为度量的效能衡量都是耍流氓
2021-09-03 13:58
回复
没有更多了
发现更多内容

得物API元数据中心探索与思考

得物技术

API管理 元数据中心 自动解析

牵引数字经济重要增长极,天翼云智能边缘云助力元宇宙加速发展!

天翼云开发者社区

云计算

三个要点,掌握Spring Boot单元测试

互联网工科生

Spring Boot 分层架构 单元测试 JUnit Mockito

JAVA OOM异常最佳实践

Yestodorrow

Java 运维 监控 可观测性 系统性能

DxO PureRAW for Mac(RAW照片处理器)v3.6.0永久激活版

mac

苹果mac Windows软件 DxO PureRAW raw智能照片处理工具

供应链透明度的代币开发

区块链软件开发推广运营

交易所开发 dapp开发 区块链开发 NFT开发

华秋DFM新功能丨可焊性检查再次升级,抢先体验!

华秋电子

深圳华秋电子有限公司与共熵服务中心缔结战略合作伙伴关系

华秋电子

合作伙伴

支持信创系统的数据库审计系统有哪些?用哪家好?

行云管家

数据库 信创 数据安全 国产化 数据库审计

如何用装饰者模式代理final方法

程序员万金游

spring aop #java #程序员 #Spring #后端

EOS系统合约链账户介绍

BSN研习社

Topaz Video AI for mac(视频增强和修复工具) 3.5.2完整激活版

mac

苹果mac Windows软件 Topaz Video AI 视频增强修复工具

强强联合!天翼云与神州信息共助银行数字化转型升级!

天翼云开发者社区

数据库 云计算

What's new in Pika v3.5.1

apache/dubbo-go

redis redis sentinel Pika

[分组聚合]基于Lucene8进行多值字段分组聚合(多属性字段)

alexgaoyh

lucene Spring Boot 分组聚合 单字段 多属性

一种提升SQL改写效率的方法

天翼云开发者社区

数据库

探索古彝文AI识别技术:助力中国传统文化的传承与发扬

颜淡慕潇

人工智能 算法 AI识别技术 前言技术

Spring Boot 中常见且必备的注解解析

Liam

Java 程序员 Spring Boot 后端 注解

前端首屏优化 | 提升首屏的 8 个很简单的手段

Yestodorrow

可观测性 网站性能

文心一言 VS 讯飞星火 VS chatgpt (102)-- 算法导论9.3 8题

福大大架构师每日一题

福大大架构师每日一题

什么是API商品数据接口?该怎么使用?

Noah

API 安全 API 文档 API 开发

长沙企业采购云管平台选哪家厂商?联系电话多少?

行云管家

云计算 云服务 云管理平台 云管平台

全面解读 SQL 优化 - 统计信息

KaiwuDB

sql 优化 KaiwuDB

<em> 和 <strong> 标签的区别

Lee Chen

html 前端

苹果电脑pdf文档大小压缩推荐 PDF Squeezer激活中文最新版

胖墩儿不胖y

Mac软件 pdf编辑器 pdf处理工具

“开放原子开源大赛”来袭, inBuilder低代码开发创新赛火热报名中!

inBuilder低代码平台

DApp区块链公链智能合约质押挖矿系统开发

l8l259l3365

专业强大的字体管理软件:RightFont 直装激活最新版

mac大玩家j

字体设置 Mac软件 字体设计 字体管理工具

4点策略调优!智能外呼助力汽车行业盘活客户价值

中关村科金

智能外呼系统

阿里云易立:以云原生之力,实现大模型时代基础设施能力跃升 | KubeCon 主论坛分享

阿里巴巴云原生

阿里云 容器 云原生 KubeCON

与创新者同行!Doris Summit Asia 2023 完整议程公开,首届线下峰会邀你报名!

SelectDB

大数据 数据分析 Doris 峰会 数据库、

破解千行代码缺陷率引发的“血案”:研发效能度量是一把标尺吗?_文化 & 方法_任晶磊_InfoQ精选文章