持续集成 代码质量评测初探

tony · 2019年10月25日 · 最后由 toanoyx 回复于 2020年11月09日 · 4354 次阅读

前言

  代码质量在研发过程中是一个很重要的因素,更好的代码质量能产生更少的 BUG,也能降低代码的维护成本使开发人员更不容易犯错,从而使产品的质量得到提升。所以,如何定义代码质量,如何测量并可视化的展现就成了我们探索的方向。
  今年下半年,我们在团队内部引入了代码健康度评测指标及对应 Smart Code 的平台,它是一个自动化的代码质量评测系统,能够给开发者提供多个维度的分析结果及对应的报告,帮助开发者更好的发现潜在问题,提升代码质量。目前,我们的这套系统已经不断迭代并在团队内部运行了 2 个多月,大家积极响应,利用个人时间结合平台所发现的问题进行了多轮优化和重构,通过指标及结果来看,很多项目的代码规范性和代码质量相比过去有了明显的提升,取得了不错的效果。
  我们打算在这里简单介绍一下我们的 Smart Code 代码质量评测平台。一方面是对过去在代码质量保障方面的回顾和思考,另一方面也希望能起到抛砖引玉的作用,让大家分享更多、更好的方案。
 

背景

  原先我们团队在代码质量评测方面的手段不多,也存在诸多痛点,如:

  • 简单的 code review 只能解决代码风格及少部分业务逻辑问题,很难发现重复率、复杂度、用例失败等方面的问题
  • 部分开发同学因迭代需求过多,交付压力较大,会直接跳过代码审查,欠债日积月累,存在一定的隐患
  • 随着产品的迭代,增加了许多新的功能,进行了一些重构,整体代码质量是变好了还是变坏了?如何量化?

  针对上述的问题和痛点,我们希望有这样一套代码质量评测体系:

  • 自动化:能够自动的对代码进行分析,而不用开发同学进行额外的操作和配置,也不用改变其工作流;
  • 可视化:能数值化、可视化的体现代码质量,能方便直观的查看到代码所存在的问题;
  • 标准化:不同的项目运用统一的代码评测标准,方便团队进行多项目管理(不同语言的检测规范可以不同,但整体评测标准和评测维度是统一的);
  • 多维化:提供多维度的代码检测方式和评测手段,而不仅仅已代码违规数来作为唯一衡量标准。

  因此,我们引入了代码健康度指标及 Smart Code 平台
 

代码健康度指标说明

  目前代码健康度主要包含以下 3 个维度,通过一定的权重综合计算得出最终的代码健康度:

  1. 代码规范性得分:通过 Sonar、ESLint 及我们自研的工具对代码进行扫描,根据最终发现的问题数量及对应的严重级别、代码总量加权系数综合计算得到一个代码规范性得分;
  2. 代码复杂度得分:较低复杂度的代码能提高可读性、降低维护成本,避免一些不可控的问题出现。我们通过统计项目的整体圈复杂度,结合代码总行数,得到千行代码圈复杂度,然后按照一定的标准计算得到代码复杂度得分(代码圈复杂度的介绍及优化方式可以参考下这篇文章
  3. 代码重复率得分:重复率较高的代码,一来增加代码体积、二来可能会出现代码漏改导致出现问题的情况。我们通过统计项目代码的整体重复比例,然后按照一定的标准计算得到代码重复率得分。  

Smart Code 平台简介

  我们平台目前主要还是采用定时扫描的策略(每周定时扫描 + 夜间针对当天有代码提交的项目进行扫描),同时结合我们内部的服务治理平台获取每个项目预先设置好的配置信息进行检查,最终将每次的检查结果落地并进行平台化的展示。
  平台部分截图如下:

                        dashboard


                        项目列表


                        项目详情

未来的计划

  经过一段时间的实际使用之后,我们收到了不少的反馈,发现目前的指标维度其实是不够完善的,平台的交互体验也有提升空间,后续我们打算从以下这几个方面进行优化改进:

  • 完善评测规则:针对不同业务线、技术栈进一步完善其对应的评测规则,如问题严重程度的评定、子指标权重的设定等;
  • 拓展评测范围:考虑增加包耦合度、方法内聚度等新的评测维度,以便更全面、更好的发挥代码审查的作用;
  • 融入研发流程:结合我们的持续交付平台对研发过程中的增量代码进行评测和告警,以便更早的发现并解决问题;
  • 增加 CR 支撑:考虑自研 Code Diff 工具,在对比差异的同时增加扫描问题、单元覆盖率、健康度等信息的展示,为 Code Review 提供更多参考信息。

  以上就是我们团队在代码质量评测方面所进行的探索,目标是打造一套完善的代码质量评测体系,希望能提供给大家一些有益的参考,如果大家有更好的想法和方案,也欢迎一起探讨和分享。

共收到 10 条回复 时间 点赞

比较关系这个健康值的定义是怎么定义的

得分低了,要重构吗?第二天要上线的话😂

tony #4 · 2019年11月11日 Author
CC 回复

简单介绍下,代码健康度包含了 3 个子指标,3 个子指标满分都是 100 分,然后按照一定权重计算得出最终的健康度:
1)重复率得分:整个 project 代码重复率≤5%,100 分;重复率≥30%,0 分(线性变化)
2)复杂度得分:千行代码圈复杂度≤100,100 分;≥300,0 分
3)规范性得分:相对复杂点,跟违反规则的严重级别、数量,项目的代码行数、项目等级等因素相关。

tony #5 · 2019年11月11日 Author
我去催饭 回复

目前健康度得分还没有作为准出标准。但是代码规范性方面的严重问题我们现在是阻塞性的,是需要在发版前解决的;

平台有开源么?

7楼 已删除
tony #8 · 2019年12月02日 Author
t-bug 回复

目前还没有,打算是先在内部团队使用推广,将整个平台打磨好之后再开源一整套解决方案。

能不能介绍一下使用到的一些开源工具或者框架?除了 sonar 和 eslint

tony #10 · 2019年12月26日 Author
yt_bryant 回复

比如任务调度和执行我们用的是 jenkins;单元覆盖率的统计我们用的 jacoco,做了一定的拓展增加了针对类的白名单/黑名单;还有针对 IOS 的 OCLint 等

请问现在开源了嘛,有什么途径可以了解到更多代码质量评分原理呢~想请教一下~

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册