当前位置: 首页 > 编程日记 > 正文

Litmus代码质量平台实践总结

背景

代码质量在项目开发中是一个很重要的地方,更好的质量的代码,能够产生更少的bug,也能使开发人员更不容易犯错,产品的质量得到提升。那么怎么定义代码质量,怎么测量以及如何展现就成为我们内部平台Litmus的主要探索领域。

之前的文章有多次提到我们团队内部的Litmus平台,它是一个自动化代码审查反馈的系统,能够给开发者提供当前代码的各种维度的分析结果,帮助开发人员更好的解决潜在的bug和更好的管理组织代码文件。

目前,我们的系统已经不断迭代和运行了近4个月,得到了不错的效果,也筹备和设计了后续的开源计划。同时也从日常使用中优化了自身很多方面,我们决定在这里完整的介绍一下我们的Litmus代码质量检查平台,关于它是如何构建和架构的,以及在构建这个平台中所产生的对代码质量问题的思考和总结。

什么是代码质量

代码质量是一个很抽象的概念,但是它贯穿于整个程序开发中,并且大部分的bug和delay,以及开发中的体验,都来自于代码质量的偏低。我们一直在探索如何将这个抽象的概念具体的定义出来。随着业务的增加,随着团队的发展,项目代码会越来越多,变得越来越难维护,这些变化并不是一天形成的,而是每次提交每次合并带来的一点点的复杂和混乱,因为没有监控和人力问题,导致项目越来越臃肿和繁杂。我们希望对这个过程进行插手,探索和改进整个流程。

首先我们对现有的工具进行了一番调查,比如sonar等一些学院派的检查工具,这些工具在使用上就非常困难,数据也略复杂和专业,用在业务中将会是一个overkill,于是我们决定自己建立一套质量管理平台。

最先进入我们计划的就是Lint工具提供的语法和风格检查,也是最容易看到直观的结果的检查。于是我们统一了团队的ESLint和TSLint规则,最开始集成在开发流程中,由于众多历史项目和成员的开发习惯,这一步骤经常会被避免掉,于是我们决定将Lint检查放在服务端统一运行作为一个最后的确认,如果有Lint错误将不允许合并代码。其次我们发现代码的重复度和代码的复杂度也是一个重要的指标,具体的指标下文有介绍。

同时我们认为,代码质量检测应该是一个自动运行的东西,程序员不应该从工作流上有所改变,它应该自动分析我们的代码提交,给出结果反馈,程序员再进行相应的修改,整个过程需要流畅和迅速,同时结果的展示应该尽可能的简单,去掉专业化的描述,让学习成本降到最低,直接看到问题即可。带着这些想法,我们尝试构建了Litmus平台。

基础介绍

利用内部仓库系统的钩子,在每次项目提交PR和Merge后触法钩子,发送请求到我们的服务器。服务器便会依照之前对每个项目设置好的配置信息,进行检查,检查完毕后,检查结果将会通过内部im工具发送给PR提交者,他便可以通过页面看到检查结果并有可能对代码进行相应的调整。

目前检测主要有3个维度,分别是语法规则,复制粘贴率和代码复杂度:

  • 语法规则也就是ESLint,TSLint等lint工具的检测,通过对错误和警告数量的计算得到一个代码结果的分数。
  • 复制粘贴率代表代码中间的相似部分,在代码中出现大面积的相似代码,就是一个质量不好的地方,可能出现修改了一处另一处没有被修改导致出现问题的情况。通过重复的多少计算出一个合理的分数来代表结果。
  • 代码复杂度是一个较为复杂的概念,具体的介绍比较多,关于介绍可以参考我们之前的详细的文章

系统部分截图如下(敏感数据被遮盖):



整体架构

最初的架构可以在这个文章中找到,那时候的技术栈很杂,同时扩展性也不高,维护起来会很麻烦。我们不断的对litmus进行修改,目前的架构可以用这个图来展示:


整个Litmus被分成3个部分,一个是处理请求的Server,这个是核心;一个是包含着各种检查器的Core,是一个纯算法库;一个是存储数据的MongoDB。整个Ltimus使用JavaScript编写。下面分别来介绍下每个组成部分

Litmus Server

Server可以说是整个系统的核心部分,它负责提供web界面,处理界面请求,同时还会接受仓库系统触发的钩子请求,分别从数据库中拿到数据来展示和运行检查器。Server的启动需要两份配置文件,一个是对server本身的端口,数据库地址之类的基本信息(Litmus Config);另一个是对每一个需要检查的项目的具体配置信息文件(Project Config)。

当仓库的钩子被触发,仓库将会发起一个请求(在仓库配置),请求我们的Server,接收到请求后,将会知道一个任务需要检查了,就会将任务推进检查队列(Working Queue),检查队列是一个能够同时运行多个任务的任务队列,每次运行任务,通过开启一个进程,运行Litmus Core检查器算法程序。检查结果将会通过事件发送被监听,然后写入数据库。

Litmus Core

Core是检查器的算法库,它是一个纯粹的接收数据,计算,然后产生结果的库,不能感知到外部的任何结构,所有的检查器位于此。需要注意的是,由于要使用ESLint等Lint工具,我们需要将团队的规则做成sharable config的形式,打包成一个npm包,全局安装这个包和其peerDependencies在Server运行的主机上,才能使检查器访问到正确的规则文件。从实际来说,大部分团队的ESLint规则也都是一套全团队适用,这样才能风格统一。

MongoDB

数据库用来存放所有的检查结果,通过在配置文件中给出数据库的地址让Server能够操作它。为了更快速的检索我们建立了一些索引。

Litmus部署

最早期,Litmus为团队内部使用的项目,没有考虑到向外扩展来设计系统的结构。但是随着不断的扩张,我们希望能够将系统的运维工作分发给各个团队的使用者,而不是一个集中化的管理在我们团队,这样我们承担的运维任务就要少很多,同时机器的资源也得到了保证,于是就需要其余的团队能够方便简洁的搭建整个系统。

为了简化自身部署,同时能够给其他团队测试试用版本,我们参考Ghost CLI开发了安装的CLI程序,能够一行命令安装好所需要的各种组件和代码。当然,配置文件的内容还是需要使用者自己来填写。

实践效果分析

我们在不断的迭代中,也在同时的关注litmus整体使用情况,对此我们选择了上线之后到2017年底,几个较为活跃的项目进行统计分析,将分数做成图表,在这里展示部分统计图:




可以看到团队对质量平台的重视程度,并且编写代码的确受到了Lint工具的反馈,重视起代码质量。对于这些数据和我们的详细使用情况分析,以及对现有系统的改进计划,将会在下一篇文章中详细介绍。

未来的计划

在经过了实际使用后,发现有些指标的作用并没有我们期望的那样优秀,表现略平庸,于是我们决定在检测维度上和展示方式上进行一些改进升级。目前的维度还没有足够全面,需要有更多的指标加入才能更好的发挥代码审查的作用。一些新的维度正在被筹备和设计的同时,也将会一改以前使用列表的方式展示数据的方式,采用结构图的方式结合不同的颜色来可视化结果。这些都是我们在使用过程中的探索,目的也是打造一个完善的代码质量评测流程,能够为团队带来实际更大的改进。

关于大家关注的开源计划,我们希望能够将内部团队的使用体验打造至极致后,经过公司内部多团队的测试体验不断的优化自身,再向外部开源一整套解决方案。具体的开源形式还没有确定下来,不过这都是被提上日程的事情,关于Litmus的开发还在不断的迭代之中,大家拭目以待。


相关文章:

到底什么是hash?它起什么作用?

从emule诞生到现在也已经有了两年左右时间了,随着emule的普及,喜欢他的人也越来越多,但是由于emule对技术相应有一个门槛,不像bt那么容易上手,所以很多朋友很长时间以来一直都有这样或那样的疑问,今天是周末…

20个精美图表,教你玩转 Pyecharts 可视化

作者 |俊欣来源 |关于数据分析与可视化本篇文章我们将继续聚焦c模块并且用它来绘制精美的图表,希望读者在看完之后会有不少收获01内嵌饼状图内接一个环状的饼图,里面还有一个饼状的图(Pie().add(series_name"访问来源",data_pair[list(z) for …

【SICP练习】136 练习3.67

练习3-67 原文 Exercise 3.67. Modify the pairs procedure so that (pairs integers integers) will produce the stream of all pairs of integers (i,j) (without the condition i < j). Hint: You will need to mix in an additional stream. 代码 (define (all-pairs s…

glibc方式安装mysql

下载安装包 mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz创建mysql用户useradd -r mysql -s /sbin/nologin解压文件tar -zxvf mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz -C /opt/改名mv /opt/mysql-5.6.38-linux-glibc2.12-x86_64/ /opt/mysql-5.6创建数据目录mkdir /data更…

淘宝网7年变化图--建议非美工UED人员也看看

从2003年开始&#xff0c;这么几年间淘宝网首页截图&#xff0c;UED美工和开发人员都可以看看。图片来自www.infoq.com网站 的PPT

Github 一夜爆火:这份金九银十 Java 面试手册我给跪了

这几天给筒子们整理了一份《Java面试手册》&#xff0c;106页&#xff0c;目前大约6万字左右&#xff0c;初衷也很简单&#xff0c;就是希望在面试的时候能够帮助到大家&#xff0c;减轻大家的负担和节省时间。废话不多说&#xff0c;本手册目前为第一版&#xff0c;后续慢慢也…

a different object with the same identifier value was already associated with the session

当出现a different object with the same identifier value was already associated with the session时&#xff0c;一般是因为在hibernate中同一个session里面有了两个相同标识但是是不同实体。 我直接将接受需要比较的id的list<ab>换成了list<object[]>,再直接将…

【转】unity3d 在UGUI中制作自适应调整大小的滚动布局控件

转自 http://blog.csdn.net/rcfalcon/article/details/43459387 在游戏中&#xff0c;我们很多地方需要用到scroll content的概念&#xff1a;我们需要一个容器&#xff0c;能够指定布局方式&#xff08;比如横排排列、竖排排列、网格排列&#xff09;等。然后我们向其中填充内…

(转)径向模糊效果shader

转自&#xff1a;http://blog.csdn.net/xoyojank/article/details/5146297 最先在这里看到:http://www.gamerendering.com/2008/12/20/radial-blur-filter/ 这效果在鬼泣4中切换场景时见过, 极品飞车12的运动模糊也有这种感觉. 原理: 确定一个中心点(如0.5, 0.5), 跟当前像素连…

初次体验hiphop-php

facebook在github上发布了hiphop-php的源代码。之前听说这玩意能把php代码翻译成c代码&#xff0c;然后带来巨大的性能提升&#xff0c;所以第一时间编译了一份hiphop-php。 我的机器环境是 Centos 5.3 x86_648G内存Intel(R) Xeon(R) CPU E5420 2.50GHz 安装注意事项 编译…

MySQL之父等国际数据库掌门人齐聚,1024 程序员节全体大会重磅官宣!

10月23-24日&#xff0c;由CSDN、长沙市政府及多家机构联合主办的第二届“长沙中国1024程序员节”&#xff08;1024.csdn.net&#xff09;将盛大举行。今年程序员节活动囊括&#xff1a;岳麓书院尖峰对话&#xff0c;2021技术英雄会&#xff0c;9场热门技术主题论坛/专场、第16…

通过yum安装配置lamp

1、安装httpdyum install httpd创建测试文件cd /var/www/htmlvim index.php加入以下内容<html><head><title>PHP Page</title></head><body><h1>PHP start</h1> <?phpphpinfo(); ?><h1>PHP end</h1> <…

PHP“Cannot use object of type stdClass as array”

php再调用json_decode从字符串对象生成json对象时&#xff0c;如果使用[]操作符取数据&#xff0c;会得到下面的错误错误&#xff1a;Cannot use object of type stdClass as array产生原因&#xff1a;展开 -PHP$res json_decode($res);$res[key]; //把 json_decode() 后的对…

RMAN_学习笔记1_RMAN Structure概述和体系结构

2014-12-23 Created By BaoXinjian 一、摘要 是一种用于集备份(backup)、还原(restore)和恢复(recover)数据库于一体的Oracle 工具&#xff0c;支持命令行及图形界面操作 能够备份整个数据库、表空间、数据文件、控制文件、归档文件以及Spfile参数文件。 支持增量数据块级别的备…

全球缺芯大潮中,以软代硬能否另辟蹊径?

在5G和人工智能的技术浪潮如约而至以后&#xff0c;业内人士无不对IoT产业的未来报以极大的期待。以人工智能和家居设备为基础&#xff0c;再加上算力与网络支持&#xff0c;有理由相信未来IoT相关产业必将迎来爆发。然而今年&#xff0c;席卷全球的芯片产能不足问题影响到了各…

Xtrabackup实现数据的备份与恢复

Xtrabackup介绍Xtrabackup是由percona开源的免费数据库热备份软件&#xff0c;它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份&#xff08;对于MyISAM的备份同样需要加表锁&#xff09;&#xff1b;mysqldump备份方式是采用的逻辑备份&#xff0c;其最大的缺陷是备份…

最简单的CI框架入门示例--数据库取数据

这个写给初学者看&#xff0c;这是最简单可以调通的例子&#xff0c;网上很多例子其实初学者本地跑不通&#xff0c;缺这少那。 1.下载CI框架&#xff08;自己找&#xff09;2.配置 database.php配置&#xff1a; 为数据库服务器设置 connection 参数&#xff1a; $db[defau…

ST-GCN 实现人体姿态行为分类

作者 | 李秋键 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 引用 人体行为识别是计算机视觉及机器学习方面的热门研究领域。它在对视频中的人类行为进行运动分析、行为识别乃至延伸至人机交互领域都有着非常广泛的应用。研究初期&#xff0c;人体行为识别主要是以…

【原创】Kakfa utils源代码分析(三)

Kafka utils包最后一篇~~~ 十五、ShutdownableThread.scala可关闭的线程抽象类&#xff01; 继承自Thread同时还接收一个boolean变量isInterruptible表明是否允许中断。既然是可关闭的&#xff0c;因此一定不是守护线程&#xff0c;而是一个用户线程(不会阻塞JVM关闭)。提供的方…

Oracle的分页查询

为什么80%的码农都做不了架构师&#xff1f;>>> 因为Oracle不像MySQL一样有limit函数来实现分页查找&#xff0c;oracle要实现分页查询可使用关键字rownum来处理。使用rownum有以下几点需要注意&#xff1a; 1、ROWNUM存在使用规则&#xff0c;在单个子查询中&…

微软成功抵御峰值高达 2.4Tbps 的 DDoS 攻击

整理 | 祝涛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;微软表示&#xff0c;他们成功抵御了一场发生于8月份的2.4Tbps分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;这次攻击超过了去年针对亚马逊Web服务的2.3Tbps最大攻击。这场攻击持续…

百度吴甜:首席AI架构师培养计划持续为行业输送高端复合型AI人才

CSDN 导语&#xff1a; 随着 AI 技术的发展&#xff0c;关注 AI 的开发者与日俱增&#xff1a;据 CSDN 发布的《中国 AI 应用开发者报告》显示&#xff0c;在 CSDN 的注册开发者中&#xff0c;689 万开发者有阅读、撰写和研究 AI 技术行为&#xff0c;其中精准聚焦 AI 学习和应…

Htaccess文件是什么以及Windows下自由创建.htaccess文件的N种方法

.htaccess是什么 概述来说&#xff0c;htaccess文件是Apache服务器中的一个配置文件&#xff0c;它负责相关目录下的网页配置。 通过htaccess文件&#xff0c;可以帮我们实现&#xff1a;网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访…

Linux grep,egrep及相应的正则表达式用法详解

linux在进行文本处理过程中的文本搜索工具称为正则表达式。文本搜索工具有grep、egrep、fgrep,egrep为正则表达式的扩展正则表达式&#xff0c;fgrep用于搜索文本字符串&#xff0c;与 grep 和 egrep 命令不同&#xff0c;因为它搜索字符串而不是搜索匹配表达式的模式。grep的含…

Java GC 日志解析

JVM 在Java应用程序优化中是不可缺少的一大重项&#xff0c;如何合理配置Java参数&#xff0c;如果验证配置参数的有效性&#xff0c;从GC日志中可以获得很重要的提示&#xff0c;以下是笔者对GC垃圾收集器默认开启的组合日志的部分的解析&#xff0c;希望能帮到想学习的同学O(…

MySQL 备份和恢复策略

在数据库表丢失或损坏的情况下&#xff0c;备份你的数据库是很重要的。如果发生系统崩溃&#xff0c;你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。本文主要对MyISAM表做备份恢复。 备份策略一&#xff1a;直接拷贝数据库文件&#xff08;不推荐&#xff…

zookeeper学习记录

2019独角兽企业重金招聘Python工程师标准>>> 背景 前段时间看了S4流计算引擎&#xff0c;里面使用到了zookeeper进行集群管理&#xff0c;所以也就花了点时间研究了下zookeeper&#xff0c;不求看懂所有源码&#xff0c;但求了解其实现机制和原理&#xff0c;清楚其…

Ubuntu的apt-get使用国内的源

1、复制原文件备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2、打开清华大学TUNA官网发布的Ubuntu 镜像使用帮助。 3、复制下面框中的内容&#xff0c;打开自己的Ubuntu系统。 4、 将框中的内容替换掉原来的所有内容 sudo gedit /etc/apt/sources.list 5、 进…

51单片机实现对24C02进行页写、顺序读取并显示验证

源&#xff1a;51单片机实现对24C02进行页写、顺序读取并显示验证 //************************************************************************************* //**程序名称&#xff1a;51单片机实现对24C02进行页写、顺序读取并显示验证 //**编写人&#xff1a;**** //**修…

配置MySQL主从复制

MySQL支持单向、异步复制&#xff0c;复制过程中一个服务器充当主服务器&#xff0c;而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件&#xff0c;并维护日志文件的一个索引以跟踪日志循环。当一个从服务器连接到主服务器时&#xff0c;它通知主服务器从…