精华内容
下载资源
问答
  • 华为代码质量管理办法,非常具有可落地性。 下载分为1保本而已。
  • 代码质量自检工具

    2018-03-14 16:42:06
    代码质量自检工具代码质量自检工具代码质量自检工具代码质量自检工具代码质量自检工具代码质量自检工具代码质量自检工具代码质量自检工具代码质量自检工具代码质量自检工具代码质量自检工具代码质量自检工具代码质量...
  • 其实这些都是代码质量差惹的祸。代码质量是研发质量管理的根本,它决定了整个开发团队的开发效率,项目质量,其他监控,告警,日志等手段都只能是事后补偿。本文就如何保证代码质量总结了一些经验和方法,供大家参考...

    你的团队有没有过这样的经历:开发效率低,招了很多人,天天加班,出活却不多,线上bug频发,领导发飙,中层束手无策,工程师抱怨不断,查找bug困难。其实这些都是代码质量差惹的祸。代码质量是研发质量管理的根本,它决定了整个开发团队的开发效率,项目质量,其他监控,告警,日志等手段都只能是事后补偿。本文就如何保证代码质量总结了一些经验和方法,供大家参考。

    代码质量本身并没有一个特别明确的量化指标,而且根据公司发展的不同阶段,团队规模的大小不同,项目性质的不同等,对代码质量的要求也不尽相同.不过如果项目中出现以下情况时候,就说明代码质量要值得重视了.

    • 添加或修改一个简单功能时,涉及要修改的地方特别多,而且很分散;
    • 代码不可复用:相似的功能无法复用代码,要重新开发;
    • 线上bug频发,排错困难,修复难度大,时间长;
    • 有很多奇怪的代码,代码读不懂,新人无法很快了解代码;
    • 代码中坑特别多,不敢大动,一不小心就踩坑;

      以上这些问题,基本上都是代码质量不高导致的,包括代码无注释,无文档,命名差,项目层次结构差,调用关系混乱,到处hardcode,临时解决方案等等。怎么才能时刻保证代码的高质量,避免以上问题发生?当然团队的技术素质很重要,除此之外,还有一些方法可循的.

      1. 吹毛求疵般地执行编码规范

      严格执行代码编写规范,可以使一个项目乃至一个公司的代码具有完全统一的风格,就像同一个人编写的一样,而且命名良好的变量,函数,类和注释,也无疑可以提高代码的可读性.具体落实到执行层面,可以参照Google的编码规范或者java官方的编码规范,网上可以找到,关键是要严格遵守,并且在code review时,严格要求,没有按照规范的一定要指出并且要求修改.

      实际情况往往是虽然大家都知道优秀的代码规范是怎样的,但在具体写代码的过程中,却执行的差强人意,很多情况是认识上不够重视,觉得一个变量或者函数的命名成哪样关系不大,所以不够推敲,注释很多也都不写,code review的时候大家也都事不关己心态,或者觉得没必要太抠细节,导致慢慢的整个code base变得越来越差.所以这里还是要强调一下,细节决定成败,提高团队对代码规范的认同及其严格的执行是关键.

      2. 编写高质量的单元测试

      单元测试是最容易执行,且对提高代码质量见效最快的方法之一还。但还是有很多公司对单元测试重视不够,包括一些大的互联网公司,不写或者随便写写。

      有些工程师觉得有测试团队就够了,再写单元测试就是浪费时间。其实测试团队的测试和单元测试是在不同层面上的,测试团队的测试一般是黑盒测试,系统层面的集成测试,对于复杂系统来说,组合爆炸,测试团队无法穷举所有的测试用例。单元测试是代码层面的测试,一般是针对类的测试。既然无法从系统的整体上保证100%符合我们的预期,那单元测试起码能保证我们代码在细粒度上运行符合预期。

      有些工程师认为开发任务重没时间写。这个还是没有足够重视单元测试,觉得是可有可无的部分,才会有这样的想法。写好单元测试,节省很多解决线上bug的时间,开发时间反而更充足了。

      还有很多工程师虽然在写单元测试,但只对正常流程做测试。代码中的bug多数是写代码时异常情况没有考虑全面导致的,正常流程一般不会出问题。单元测试的作用就在于测试各种异常情况下代码的运行是否符合预期,所以只对正常流程测试无法发挥单元测试真正的作用。

      一般情况下,单元测试代码量要比要测试的代码多,一般是1-2倍的样子,写单元测试本身没有太多的技术挑战,主要看工程师逻辑是否缜密,能够考虑各种异常情况,写起来比较枯燥,所以写高质量的单元测试的一方面要靠工程师的耐心执行,另一方面要靠团队的严格要求。当然这些都是建立在对单元测试重要性的认同之上。

      3. 不流于形式的Code Review

      如果说单元测试很多工程师不怎么重视,那code review就是不怎么接受.跟很多大型互联网公司的人聊过,对code review都不怎么认可,大部分反应都是,这玩意不可能很好的执行,浪费时间,是的,code review做的再流畅,也是要花时间的,关键在于我们是愿意花2天写代码花5天修bug,还是愿意花3天写代码花半天修bug.

      其实,code review的好处不仅仅是能够大大提高代码质量,减少代码bug,你想想如果我们没有code review,平时写的代码“偷偷”就commit了,难免有人不自律,有了code review,直播代码,曝光dirty code,大家就会更认真些.其次来讲,code review也是一种有效技术传帮带的途径,每次code review都是一次案例的剖析,可以帮助初级的工程师培养编码规范,提高编码质量,设计能力甚至于架构能力,反过来,review别人写的好的代码,对自己也是一种学习和提高.

      除此之外,严格的code review不仅能保证代码的质量,还能形成良好的技术氛围。

      4. 开发未动文档先行

      编写技术文档对大部分工程师来说都是挺反感的事情。一般来讲在开发某个系统或者重要模块或者功能之前需要先写技术文档,然后发送给同组或者相关同事审查,在审查没有问题的情况下再开发,这样能够事先达成共识,开发出来的东西不至于走样,而且当开发完成之后进行code review的阶段,代码审查者通过阅读开发文档也可以快速的理解代码.

      除此之外,文档对于团队和公司来讲都是重要的财富,对于新人加入公司熟悉代码,产品,对于任务的交接等等都很有帮助,而且作为一个规范化的技术团队,技术文档是一种摒弃作坊式开发和个人英雄主义的有效方法,是保证团队有效协作的途径.

      不过,有很多工程师提出说不会写技术文档,不知道写什么,希望给一个模板或者目录.我之前曾经想过是否可以给出一个固定的模板,但最后还是放弃了,比较难,难点在于,每个项目侧重点都不一样不容易总结,如果硬要给出一个很宽泛的目录,不具有指导性也没有意义.大体上来讲,文档的内容主要是将做的东西讲清楚,包括出问题背景,解决了什么问题,外部怎么用或调用,内部如何实现,大的架构,关键功能和算法等,以及一些非功能性的考虑。

      5. 持续重构,重构,重构

      个人比较反对平时不注重代码质量,堆砌烂代码,实在维护不了了就大刀阔斧的重构甚至重写。有时候项目代码太多了,重构很难做到彻底,最后又搞出来一个四不像的怪物,更麻烦了!

      优秀的代码或架构不是一开始就能完全设计好的,就像优秀的公司或产品也都是迭代出来的一样的,我们无法100%遇见未来的需求,也没有足够的精力,时间,资源为遥远的未来买单,所以随着系统的演进,重构代码也是不可避免的,虽然上面说了不支持大刀阔斧推到重来式的大重构,但持续的小重构还是比较推崇的,也是时刻保证代码质量防止代码腐化有效手段.简单一句话就是不要等到问题堆得太多了再采取重构,要时刻有人对代码整体负责任,平时没事就改改代码,而不要觉得重构代码就是浪费时间,不务正业!

      特别是一些业务开发团队,有时候为了快速完成一个产品或者业务功能,只追求速度,到处hard code,在完全不考虑非功能性需求的情况下,堆砌一些烂代码,这种情况还是比较常见的。不过没关系,等有时间一定要记着重构,不然烂代码越堆越多,总有一天会没人能维护。

      6. 项目与团队”微服务化”

      只有小项目是可以维护的,大项目是无法维护的.团队人比较少的时候,十几个人的样子,代码量也不多,不超过10万行,怎么开发,怎么管理都没问题,大家互相都了解彼此做的东西,代码质量太差了,大不了重写一遍.但如果是一个极其庞大的项目,几十万行代码,几十个开发维护,那基本上没人能对代码负责了.

      所以当项目太大了之后,就需要对代码和团队进行拆分,模块化,大团队拆成几个小团队,大项目拆成几个小项目,这样每个团队每个项目的代码都不至于很多,也不至于出现代码质量太差无法维护的情况,其实很多技术也都体现了这种思想,比如大到soa, 微服务,小到jar, .so等lib模块开发,Class类的封装,都是一种拆分的思想.

      7. 重视代码关注细节

      以上其他的所有方法都是治标不治本,找到对的人用好对的人,打造优秀的技术文化,才是能一直卓越的根本。有很多工程师比较热衷于学习架构,工具,框架层面的东西,见过很多工程师,还没写三五年代码就转做架构师,不写代码了,到处忽悠,很不好,互联网信息如此透明,不同的人去做同一个项目,其实最后设计出来的架构,功能大约都差不多,最后大家都能把这个系统实现,但有些人做出来的系统,bug很多,性能很差,扩展性也不好,最多能叫个POC。

      高手之间的竞争还是在于细节,一个算法够不够优化,数据存取的效率高不高,内存是否够节省等等,这是累积起来决定了一个系统是不是够优秀。

      当然并不是说框架,工具,架构设计这些方面的学习不重要,关键是有深度,希望是实践中锻炼得来的,而不是到处看微信公众号,博客得来的。

      国内工程师普遍深度不够,做几年技术就转管理或者纯架构设计不写代码了,而国外不一样,大龄码农很多,所以国外的优秀开源项目比较多,而国内很少。

      8. 工欲善其事必先利其器

      代码中的很多低级质量问题不需要人工去审查,java开发有很多现成的工具可以使用,比如:checkstyle,findbugs, pmd, jacaco, sonar等。

      Checkstyle,findbugs,pmd是静态代码分析工具,通过分析源代码或者字节码,找出代码的缺陷,比如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。三者都可以集成到gradle等构建工具中。

      Jacoco是一种单元测试覆盖率统计工具,也可以集成到gradle等构建工具中,可以生成漂亮的测试覆盖率统计报表,同时Eclipse提供了插件可以EclEmma可以直观的在IDE中查看单元测试的覆盖情况。

      Sonar Sonar 是一个用于代码质量管理的平台。可以在一个统一的平台上显示管理静态分析,单元测试覆盖率等质量报告。

      最后,总结

      以上所有的这些方法论应该都没啥新奇的,也没有葵花宝典似的杀手锏,说出来感觉都很简单的,现在互联网这么发达,信息都很透明,所以大方向大家都知道,具体的策略和架构各家也都差不多,最后谁做的好,关键在于执行和细节,经常听到有人说我们做了单元测试啊,我们做了性能测试,可最后还是一堆性能问题一堆bug,那就要去考虑一下到底做的够不够好,是否做到了具体问题具体分析,不生搬硬套,从决策到执行再到考核是否形成了闭环,很多时候只是空喊口号,口号喊得100分,落实到执行只能得50分,最后又完全没考核,好坏大家也都不知,切记敏于言而讷于行。


            链接:https://juejin.im/post/5c88ac2b5188257dda56c87e
     

    展开全文
  • 代码质量工具总结

    万次阅读 2018-10-13 11:59:02
    代码质量 代码质量检测工具 PMD FindBugs checkstyle SonarLint/SonarQube alibaba coding guiding 仅仅有质量检测工具还不够,还需要代码审查工具,加以人工审查辅助 代码审查工具简介 Review Board ...

    概述

    说到代码质量,这个是程序员职业生涯,至少是编码生涯的永久性话题;不同时期,见解也有不同。个人认为,不存在什么绝对错误和绝对正确,当然那种写出明显的空指针异常排除在外。有时候编码质量是一个见仁见智,个人的习惯问题。但是,编码也是群体活动,有个共同遵守的规范是必须的,也是必要的。
    写在前面,本文所述的所有的工具,基本上都是考虑到Java语言层面,当然这些工具也可能适用其他语言。

    代码质量检查工具

    PMD

    代码库一直在持续更新的代码质量检查工具,通过静态分析获知代码错误,即无需运行Java程序的情况下就报告错误。提供各大 IDE 插件,提供 maven-pmd-pluginmaven插件。最新版的 Java 语言质量检查规则。支持用户自定义规则。下面列出一些检查规则:

    检查规则:

    • If、While、IfElse、For表达式必须使用{},无论有多少语句;
    • 如果方法返回boolean,那么注意避免不必要的if…then…else语句;
    • 避免if语句嵌套过深(降低代码可读性);
      解决办法:建议if嵌套不要超过2层。使用工具方法封装更多的if语句或者把嵌套的if表达式放到同一个层次中;
    • 忽略大小写进行字符串比较时,使用String.equalsIgnoreCase,不要使用String.toLowerCase。前者有更好的性能,而且还可以避免后者带来的本地化问题;
    • 避免方法级的同步,块级别的同步可以确保内含真正需要同步的代码;
    • 使用集合类的isEmpty方法;
      java.util.Collection类的isEmpty方法提供判断一个集合类是否包含元素。不要是使用size()和0比较来重复类库已经提供的方法。原则:尽量复用,充分利用已有的资源,不要重复造轮子。
    • 没有使用的就去掉,保持代码的干净、整洁,包括:没有使用的私有成员、本地变量、私有方法、方法参数(参数定义,但方法内没有使用此参数)
    • 构建StringBuffer或StringBuilder时,如果知道长度,请指定,这样性能更好。不指定,则默认长度是16,这样当长度不够时,就会有扩容的动作。
    • 如果本地变量只被赋值一次,或者方法参数从来不会被重新赋值,可以把它声明为Final;
    • 如果想由数组构建List,请使用Arrays.asList;
    • 数组复制,请使用System.arraycopy,别用循环;
    • "" + 123 的方式把数字转换为String,不够高效;
    • 避免代码中出现各种"空"的语句:空Catch,If,while,try,finally,switch,Synchronized,static块;
    • 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs;
    • 循环体创建新对象:尽量不要再for或while循环体内实例化一个新对象;
    • 资源关闭:Connect,Result,Statement等使用之后确保关闭掉;
    • 还有很多。。。

    用户还可以自定义规则,检查Java代码是否符合某些特定的编码规范。例如可以编写一个规则,找出所有创建Thread和Socket对象的操作。

    基本使用

    命令行方式:java -jar pmd-6.8.0.jar /your_project/src text rulesets/unusedcode.xml,更详细的命令行参数使用-help查看即可得知。
    idea集成pmd,搜索插件安装即可。

    工作原理

    PMD的核心是JavaCC解析器生成器。PMD结合运用JavaCC和EBNF(扩展巴科斯-诺尔范式,ExtendedBackus-Naur Formal)语法,再加上JJTree,把Java源代码解析成抽象语法树(AST,Abstract SyntaxTree)。不过,为了让解析器承认这些普通的文本是合法的Java代码,它们必须符合某种特定的结构要求。这种结构可以用一种称为EBNF的句法元语言表示,通常称为“语法”(Grammar)。JavaCC根据语法要求生成解析器,这个解析器就可以用于解析用Java编程语言编写的程序。
    实际运行中的PMD还要经过JJTree的一次转换。JJTree是一个JavaCC的插件,通过AST扩充JavaCC生成的解析器。AST是一个Java符号流之上的语义层。有了JJTree,语法分析的结果不再是System, ., out, ., .println之类的符号序列,而是一个由对象构成的树型层次结构。

    FindBugs

    官网
    最后一次更新是06 March, 2015,不算太过时。

    简介

    FindBugs是一个java byte code静态分析工具,检测出Java程序中上百种潜在的不同类型的错误。不注重style及format,注重检测真正的bug及潜在的性能问题,尤其注意尽可能抑制误检测(false positives)的发生。除了作为单独的组件安装,还可以集成IDE,以及maven。其检测输出结果可以是XML或文本形式的。支持自定义配置检查规则(做哪些检查,不做哪些检查),校验规则(用户自定义特定的bug模式需要继承它的接口,编写自己的校验类)。

    规则

    FindBugs检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。根据最新的页面bugDescriptions,自带88种Bad practice,149种Correntness,3种Experimental,2种Internationalization,18种Malicious code vulnerability,46种Multithreaded correntness,29种Performance,11种Security,80种Dodgy code。
    这个页面能看到很多缩写,缩写的意义,以及不规范的和建议的规范的代码的解释。多看几遍,对于规范自己的coding style非常有帮助。

    IDEA安装FindBugs非常容易。安装完之后,可能需要设置提高检查的级别,因为可能检查规则过于严格。

    checkstyle

    CheckStyle检查代码是否符合制定的规范。CheckStyle 检查是基于源码的,所以不需要编译,执行速度快。
    CheckStyle的主要流程是:

    1. 对Java文件进行词法语法分析,生成语法树。
    2. 载入配置文件(checkstyle-metadata.xml以及自定义的配置文件)register check事件。
    3. 按照深度优先遍历对语法树进行解析,按照注册的事件,在到达某些节点( AST ) 时进行style检查(AST,A child-Sibling Tree,是语法树中的某个节点,其类型在TokenTypes类中定义。)
    4. 自定义Style的检查,就是在第二步设定的。实现com.puppycrawl.tools.checkstyle.api.Check类,重载其中的两个方法:public int[] getDefaultTokens()public void visitToken(DetailAST ast)。这两个方法的含义为,在遍历语法树的过程中,每当到达getDefaultTokens函数所返回的AST类型,程序就进入visitToken进行具体的检查和分析,即真正的分析检查过程是在visitToken中实现的。

    CheckStyle有针对不同IDE和构建工具的各种插件,如 maven-checkstyle-plugin 插件,其简单的参考配置:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
        	<!--内置4种规范:config/sun_checks.xml、config/maven_checks.xml、config/turbine_checks.xml、config/avalon_checks.xml、其中sun_checks.xml为默认值。修改默认配置-->
            <configLocation>config/maven_checks.xml</configLocation>
            <!--启用自定义规范文件-->
            <!--<configLocation>${basedir}/src/config/custom_checkstyle.xml</configLocation>-->
        </configuration>
        <executions>
            <execution>
                <id>checkstyle</id>
                <phase>validate</phase>
                <goals>
                    <goal>check</goal>
                </goals>
                <configuration>
                    <failOnViolation>true</failOnViolation>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    定义在maven lifecycle的validate阶段执行check task,并且如果发现有违反标准的情况就会fail当前的build。运行checkstyle检查:mvn checkstyle:checkstyle

    跳过对指定文件的某些检查
    方法一:suppression:忽略指定文件的问题检查,不推荐;
    方法二:新建一个checkstyle-suppressions.xml文件,增加suppressions配置项:

    <?xml version="1.0"?>
    <!DOCTYPE suppressions PUBLIC
            "-//Puppy Crawl//DTD Suppressions 1.0//EN"
            "http://www.puppycrawl.com/dtds/suppressions_1_0.dtd">
    <suppressions>
        <suppress checks="LineLengthCheck"
                  files="SessionMessageSource.java"/>
    </suppressions>
    

    <suppressionsLocation>${basedir}/src/config/checkstyle-suppressions.xml</suppressionsLocation>
    然后在配置文件里面可以定义一系列可用的模块,每一个模块提供严格程度(强制的,可选的…)可配置的检查规则。规则可以触发通知(notification),警告(warning)和错误(error)。
    附:google-checkstyle

    特点:

    1. 它可以有效的帮助我们检视代码以便更好的遵循代码编写标准,特别适用于小组开发时彼此间的样式规范和统一。
    2. Checkstyle提供高可配置性,以便适用于各种代码规范,所以除了使用它提供的几种常见标准之外,你也可以定制自己的标准。
    3. Checkstyle提供支持大多数常见IDE的插件,大部分插件中就含有最新的Checkstyle。
    4. Checkstyle可以检查代码的很多方面,从传统观点看,它主要是用来检查代码层面的,自从第三版以后,它的内部架构作了重大改变,很多其它意图的检测加了进来,现在Checkstyle可以检查像类设计的问题,重复代码,如锁的双重检查的bug模式。

    SonarLint & SonarQube

    官网:https://www.sonarqube.org/
    slogan: Continuous Inspection

    简介

    必须要指出 SonarQube 是开源的代码质量管理平台,以 web 页面形式(即Sonar Dashboard)可视化形式检查代码质量;SonarLint 是 SonarQube 提供的插件,可以安装在各个 IDE 工具。
    后来者居上,SonarQube是一个集大成者,允许配置安装插件,比如前文提到的 Findbugs, PMD 和 CheckStyle,基于这些插件的代码质量检查规则多达上千条,已经可以覆盖代码质量的绝大多数方面,更新版本的功能更多。
    在这里插入图片描述
    Sonar 可以从七个维度检测代码质量:

    1. 代码规则——sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写;
    2. 潜在的缺陷——通过PMD,CheckStyle,Findbugs 等代码规则检测工具检测出潜在的缺陷;
    3. 复杂度——无论对于类还是方法,都不宜过长,长意味着复杂,问题丛生……。
    4. 重复——sonar会检查重复片段,此时需要重构并提取共有逻辑;
    5. 注释不足或者过多——关键的代码片段不能没有注释,注释得简洁有意义,且需要及时更新;
    6. 单元测试——sonar可以很方便地统计并展示单元测试覆盖率;
    7. 架构与设计——通过sonar可以找出循环,展示包与包、类与类之间相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测耦合。

    特性:

    • 通过插件扩展
      支持新的编程语言、添加规则引擎、计算更复杂的度量指标,这些都可以借助强大的插件扩展机制。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd、check-style、find-bugs、Jenkins。通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。
    • 支持多种编程语言
      借助插件,支持各种主流编程语言;
    • 集成CI
      同时 Sonar 还对大量的持续集成工具提供接口支持,可以很方便地在持续集成中使用 Sonar
    • 代码质量周边
      提供插件,规则、告警、例外……都可以在线配置。通过自己的数据库,SonarQube不仅仅是展示各项指标的综合结果,同时也结合历史质量数据。
    • 国际化
      对国际化以及报告文档化也有良好的支持。

    IDEA 安装插件 Sonar Lint

    安装 Sonar Lint 插件需要重启,然后打开other setting——SolarLint——General Settings,输入sonarqube的地址,一般公司会搭建内网平台,在 Server URL 里面添加这个地址,按需输入用户名/密码,测试连接,连接成功即可使用。

    sonar平台搭建

    非常类似于Jenkins,sonar提供war包,下载解压,配置一下数据库(默认MySQL,本地或者远程都行),然后启动脚本(bat或sh)。

    Alibaba coding guiding

    提供 IDEA 插件 Alibaba java coding guideline,方便集成在IDEA,实时发现并修改不规范代码。有一份详细的 pdf 文档《码出高效:阿里巴巴 Java 开发手册》解释编码规范;比较好的是:针对插件检查出来的不规范,有详细的解释。最近还有一本书《码出高效:Java开发手册》,纸质书定价99元,抢钱啊;土豪可忽视。
    链接:阿里巴巴编码规范(JAVA)认证考后感

    JArchitect

    JArchitect,一款静态分析工具,使用一种基于Linq(CQLinq)的代码查询语言,像查询数据库那样来查询代码。最新版v2019.1下载地址,可以把许多其他静态分析工具的输出结果包含进来,然后使用CQLinq做查询,提供CI/CD工具集成功能,提供报表功能。付费工具,功能很强大。
    在这里插入图片描述
    简单使用:
    解压缩,双击VisualJArchitect.exe,新建工程,选择一个想要被分析的项目,然后点击开始分析即可。
    在这里插入图片描述
    从分析结果面板可见其功能强大。

    CQLinq:
    类似SQL语法,有智能提示,并且给出近乎实时的语法检查和查询结果;

    Simian

    官网
    下载
    冗余代码检查工具,非免费,支持语言: C#,C,C++,,COBOL,Ruby,JSP,ASP,HTML,XML,Visual Basic等。
    支持Windows。

    命令行模式:
    java -jar simian.jar [options] [files]
    simian-2.3.33.exe -includes="D:\code\**\*.java" -threshold=3 -formatter=xml:e:\result.xml "*.rb"

    集成

    1. 和 IDE,如 VS 集成
    2. 和 Jenkins 集成
    3. 和 Ant 集成
    4. 和 Checkstyle 集成

    SourceMonitor

    官网
    代码度量工具,免费,针对不同的语言(包括但不限于 C、C++、C#、Java、VB、Delphi和HTML),输出不同的代码度量值。SourceMonitor从几个不同的视图层次,如项目视图、检查点(checkpoint)视图和函数视图,展示如下度量值:

    1. 总行数(Lines):包括空行在内的代码行数;
    2. 语句数(Statements):在C语言中,语句是以分号结尾的。分支语句if,循环语句for、while,跳转语句goto都被计算在内,预处理语句#include、#define和#undef也被计算在内,对其他的预处理语句则不作计算,在#else和#endif、#elif和#endif之间的语句将被忽略;
    3. 分支语句比例(Percent Branch Statements):该值表示分支语句占语句数目的比例,分支语句 指的是使程序不顺序执行的语句,包括if、else、for、while和switch;
    4. 注释比例(Percent Lines with Comments):该值指示注释行(包括/* *///形式)占总行数的比例;
    5. 函数数目(Functions):指示函数的数量;
    6. 平均每个函数包含的语句数目(Average Statements per Function):总的函数语句数目除以函数数目得到该值;
    7. 函数圈复杂度(Function Complexity):指示一个函数可执行路径的数目,以下语句为圈复杂度的值贡献1:if/else/for/while语句,三元运算符语句,if/for/while判断条件中的"&&“或”||",switch语句,后接break/goto/return/throw/continue语句的case语句,catch/except语句;
    8. 函数深度(Block Depth):函数深度指示函数中分支嵌套的层数
    9. 类个数(Classes):包括class,struct和template在内的个数
    10. 平均每个类方法数(Methods per Class):包括内联和非内联的,template函数在内的类方法数除以所有类的个数

    代码审查(code-review)工具

    上面的工具仅仅只是编码规范的自动化检查工具;但是事实上,业务开发,仅仅只有这些规范检查工具是远远不够的,毕竟代码是写给人看的,写给同事,写给离职后的维护者看的。所以,还需要在此基础之上添加一道代码审查工具,帮助人工审查代码,检查可以优化的编码块。

    • Review Board
    • jArchitect
    • RhodeCode
    • Codebrag
    • Crucible
    • Malevich
    • Gerrit

    Review Board

    Review Board起源于VMware的一些开发者。它基于Django,你可以把它安装在自己的服务器上,工作流和Rietveld极为类似。提供在diffs里进行语法彩色编码,使得代码阅读变得简便。此外,它还实现基于Lucene的搜索来帮助管理较大的diffs组。提供 IDEA 插件、邮件支持,有 web 端,使用体验良好。
    Review Board在审查补丁(Patch)方面表现完美。一个叫做“提交审查”的工具被用来和SCM系统进行连接(支持各大VCS 如 SVN,DVCS 工具如 Git 等),可以允许你请求一个将被提交的修改的审查。用户基础页面将这个过程描述如下:

    1. 你在本地检出的代码上做些修改。
    2. 你通过公布diff、编写描述和选择一些审查者来创建一个审查请求。
    3. 你在审查请求中点击“发布”并等待你的审查者看到它。
    4. 审查者或者其他人看到你的审查请求,提出改进意见。
    5. 根据他们的评论更新你的代码。
    6. 公布更新后的diff,以及对他们评论的解答以指明你修改什么(或者你要说明为什么你不打算按照他们的建议修改代码)。
    7. 将修改提交到仓库中。
    8. 在审查请求中点击“设置为已提交”来从其他人的面板中移除你的审查请求。

    Gerrit

    Gerrit 实际上一个Git服务器,它为在其服务器上托管的Git仓库提供一系列权限控制,以及一个用来做Code Review (核心功能)的Web前台页面。实际上此处讲解的 Gerrit 的 code review 以及 GitLab Changes 的 code review 功能,都是基于 git hook 原理实现的。留坑:有时间,好好研究一下 Git hook。
    登录Gerrit后在Projects–>List,选择工程,进入该工程的General界面。
    在这里插入图片描述
    clone 就是常规的 GitHub 页面的 git clone,此处推荐使用后者,即 clone with commit-msg hook;后面是协议,一般选择 SSH:
    git clone ssh://awesome.me@code.awesome.com:2018/Qyhj/Service/PaymentService && scp -p -P 2018 awesome.me@code.awesome.com:hooks/commit-msg PaymentService /.git/hooks/
    拷贝以上命令在自己本地 Git 命令行窗口执行即可拉取库代码。

    todo

    GitLab Changes

    Changes 是一种类似 gerrit changes 的code review方式。使用方法如下:

    1. 需要在git clone时选择 with commit-msg,如图:
      在这里插入图片描述
      会将commit-msg hook文件一起 clone 到本地;
    2. 随后通过git addgit commit命令修改 & 提交代码到本地,push时记住需要执行git push origin HEAD:refs/for/master
    3. 上面的git push会给出此次提交的git diff,即change页面地址,打开页面一目了然地查看 diff 。
    4. review代码,同意可以通过点Accept按钮将代码合并到远端仓库,不同意可以点击close按钮关闭掉change;
    5. 如果review代码需要多个人review后才能合并,可以在project settings页面配置;
    6. 如果review不通过,即close 掉之后,需要继续修改本地文件,然后执行同样的 git push 命令产生新的change,并打开链接,需要 approver 执行 approve 后才可以进行Accept操作;
    7. 合并后如果发现不对劲,可以通过revert功能进行回退。

    其他还有一些细节,可以自己去摸索。
    总结:Gitlab 的 changes功能是仿照gerrit的code review功能引入的,其中 related_changes、patch_sets 的概念和gerrit基本一致,rebase、revert等功能用法也类似。注意:如果change进行rebase操作,本地更新代码时需添加–rebase参数,具体为:git pull --rebase
    参考来源:内网类 blog 系统;

    实施

    上面讲了不少工具,可是规范毕竟是规范,不实施起来,强硬提交(--force或者--hard)也是无奈。所以有必要设置一个关卡,不满足则不让提交或者失败;可以从两个地方加以控制实施。

    VCS 服务端

    在 version control system 服务端(如git,svn服务端)实施,如果不达标则拒绝提交(允许提交到其他分支以便保留工作成果,但是不能 merge 到 master 或者 release branch)。提交代码前自动执行检查,想到Git commit hook,比如 pre-commit hook

    #!/bin/sh
    # From gist at https://gist.github.com/chadmaughan/5889802
    # stash any unstaged changes
    git stash -q --keep-index
    # run the tests with the gradle wrapper
    ./gradlew clean build
    # store the last exit code in a variable
    RESULT=$?
    # unstash the unstashed changes
    git stash pop -q
    # return the './gradlew build' exit code
    exit $RESULT
    

    将该脚本拷贝到项目.git/hooks/下,在执行git commit时自动触发检查,检查失败则提交失败。.git隐藏文件夹并不能提交到远程代码仓库,除非人工分发和拷贝外,有没有更好的方式在团队中共享这个机制呢?

    可以把pre-commit纳入版本控制(如config/pre-commit),再使用构建工具的扩展机制来自动完成拷贝工作,这样可以间接实现git hooks的团队间共享。缺点:没有使用 gradle,使用 maven 怎么做?

    # build.gradle
    task installGitHooks(type: Copy) {
        // 将pre-commit拷贝到指定位置
        from new File(rootProject.rootDir, 'config/pre-commit')
        into {
            new File(rootProject.rootDir, '.git/hooks')
        }
        fileMode 0755
    }
    // 设置执行build任务时会自动触发installGitHooks任务
    build.dependsOn installGitHooks
    

    CI/CD 服务端

    利用 CI/CD 服务端,在 Jenkins 构建(Jenkins 集成 checkstyle 或者 sonarqube)或者随后的部署阶段检查代码质量,不满足则触发失败。或者如果使用 maven-checkstyle-plugin,则可以随时触发检查。

    参考
    拯救Java Code Style强迫症
    如何更好地利用Pmd、Findbugs和CheckStyle分析结果

    展开全文
  • Java基础学习总结(148)——如何提高代码质量

    千次阅读 多人点赞 2019-09-04 17:48:31
    人跟人的能力千差万别,所以写出来的代码质量,肯定是不同的。有的人,写一个小逻辑,可能需要100行,而有的人,可能仅仅需要10行。代码永远会有Bug,在这方面没有最好只有更好。模块化与面向对象是实现高效无错代码...

    前言

    人跟人的能力千差万别,所以写出来的代码质量,肯定是不同的。有的人,写一个小逻辑,可能需要100行,而有的人,可能仅仅需要10行。代码永远会有Bug,在这方面没有最好只有更好。模块化与面向对象是实现高效无错代码的方法。高效无错代码需要思想与实践的不断反复。如何做到代码高效无错,提高代码质量的方法有哪些?又有哪些经验和技巧呢?

    一、代码质量

     软件是交付给用户,并由用户体验的产品;代码则是对软件正确且详细的描述,所以代码质量关系到软件产品的质量。虽然软件质量不等于代码质量,但是代码上的缺陷会严重的影响到软件产品的质量。因此,为提高代码质量的投入是值得的。

    二、衡量软件产品质量的六个方面

    1.  功能性,即软件是否满足了客户业务要求;
    2. 可用性,即衡量用户使用软件需要付出多大的努力;
    3. 可靠性,即软件是否能够一直处在一个稳定的状态上满足可用性;
    4. 高效性,即衡量软件正常运行需要耗费多少物理资源;
    5. 可维护性,即衡量对已经完成的软件进行调整需要多大的努力;
    6. 可移植性,即衡量软件是否能够方便地部署到不同的运行环境中;

    三、提高代码质量的具体经验

    1、永远不要复制代码

    不惜任何代价避免重复的代码。如果一个常用的代码片段出现在了程序中的几个不同地方,重构它,把它放到一个自己的函数里。重复的代码会导致你的同事 在读你的代码时产生困惑。而重复的

    展开全文
  • 代码质量定性评估

    千次阅读 2018-10-28 20:08:31
    提到“质量”二字时,我们的第一反应往往是...但是,如果直接拿出一段源代码放在我们面前,问这段代码质量好坏时,我们又该如何作答呢?   有人说:“好的代码就像好的笑话一样,它不需要解释(Good code is...

    提到“质量”二字时,我们的第一反应往往是“有多少BUG?”“性能好不好?“这样的问题。我们对软件产品或服务的质量定义看其能不能满足用户的需求,包括功能、性能和体验等维度的指标,我们可以通过各种类型的检测手段来给出其质量高低的度量。但是,如果直接拿出一段源代码放在我们面前,问这段代码的质量好坏时,我们又该如何作答呢?

     

    有人说:“好的代码就像好的笑话一样,它不需要解释(Good code is like a good joke: It needs no explanation)”。有编码经验的人对代码都有一定的“鉴赏力”,能凭感觉给出代码好坏的主观评价,看到所谓的“意大利面条式代码”都会感到不舒服,但是这样凭感觉的方式太个性化、太随意了,有没有一种公认的标准来鉴定代码质量呢?

     

    Bob大叔在其著作《代码整洁之道》的前言中引用了这样一幅漫画:

     

    图1代码质量的唯一有效度量指标

     

    使用漫画中的“每分钟爆粗数量”来衡量代码质量是个很有趣的玩笑,强调了代码的可读易懂等这样的“内在”质量属性。相对于满足需求规范这样的“外在”质量属性,“内在”的代码质量属性强调的是支持实现功能需求的代码内部结构的质量。《Sonar code quality testing essential》一书中从七个维度定义了代码的这种内在质量,Sonar开发团队上纲上线的戏称为开发人员七宗罪:

     

    • 编码规范:是否遵守了编码规范,遵循了最佳实践。

    • 潜在的BUG:可能在最坏情况下出现问题的代码,以及存在安全漏洞的代码。

    • 文档和注释:过少(缺少必要信息)、过多(没有信息量)、过时的文档或注释。

    • 重复代码:违反了Don’tRepeat Yourself原则。

    • 复杂度:代码结构太复杂(如圈复杂度高),难以理解、测试和维护。

    • 测试覆盖率:编写单元测试,特别是针对复杂代码的测试覆盖是否足够。

    • 设计与架构:是否高内聚、低耦合,依赖最少。

     

    Martin Fowler在其著作《重构:改善即有代码的设计》中生动形象的使用“代码坏味道(Bad Code Smells)”来比喻低质量的代码设计和实现所显现的“症状”。书中罗列了22种代码坏味道以及对应的重构手法。

     

    参照这些资料,现在我们可以用可测性,可读性,可理解性,容变性等代码可维护性维度的质量属性来衡量代码质量。代码质量指的是代码内在的非功能性的质量,用户不能直接体验到这种质量的好坏,代码质量不好,最直接的“受害者”是开发者或组织自身,因为代码质量好坏直接决定了软件的可维护性成本的高低,例如重复代码会造成维护成本的成倍增加;不规范的代码、不良注释和复杂度过高的代码会增加阅读和理解代码的难度,复杂度过高也会极大增加测试覆盖的难度,耗费过多人力,而缺少测试覆盖的代码会使得定位问题和修复问题的难度加大;结构不良、低内聚高耦合的代码则会使得哪怕是微小的需求变更或功能扩展都无从下手,修改的代价很可能超过了重写的代价。

     

    至此,我们得到了一些定性的办法来衡量代码的质量,我们可以借助一些代码扫描工具来暴露代码的质量问题,也有了相应的重构方法和技巧来应对这些问题。但是,我们还是难以回答某段代码有多好或多差,两段代码相比哪个更好这样的问题,因为我们仍然没有完全解决代码质量的量化问题:同样都是代码质量问题,重复代码和过多注释的危害肯定是不一样的;同样都是方法太复杂,圈复杂度为10的方法和圈复杂度为20的方法相比,危害和修改难度也差别很大。所以我们不能直接用问题的数量来衡量质量,需要找到更精细合理的量化度量方法。

    展开全文
  • 如何提高你代码质量

    千次阅读 2019-01-18 15:56:26
    人跟人的能力千差万别,所以写出来的代码质量,肯定是不同的。有的人,写一个小逻辑,可能需要100行,而有的人,可能仅仅需要10行。代码永远会有Bug,在这方面没有最好只有更好。模块化与面向对象是实现高效无错代码...
  • SonarQube代码质量管理

    千人学习 2019-05-17 15:06:42
    Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd、checkstyle、findbugs、Jenkins。通过不同的插件...
  • 如何提高代码质量

    千次阅读 2019-07-12 15:49:15
     对靠谱程序员来说,代码质量,以及一颗能够洞悉高质量软件编写之道的大脑弥足珍贵。  本文从产品,接口,指标,日志,代码清晰度,代码复杂度等方面,谈谈如何提高代码质量。  产品和接口  好的产品经理未.....
  • 代码质量有哪些评判标准?

    千次阅读 2020-07-01 21:09:20
    描述代码质量的词: 灵活性(flexibility) 可扩展性(extensibility) 可维护性(maintainability) 可读性(readability) 可理解性(understandability) 易修改性(changeability) 可复用(reusability...
  • 如何保障前端项目的代码质量

    千次阅读 2018-09-10 11:05:49
    对于中大型前端项目,项目规范与代码质量尤为重要。当功能需求变更或需要重构时,随心所欲的(糟糕的)代码可能带来比重新开发还麻烦的问题。 1 前端项目代码中的常见问题 1.1 凌乱的书写风格,阅读体验差 这个问题...
  • 代码质量管理平台SONAR分析代码质量

    万次阅读 2018-09-10 09:39:21
    介绍 Sonar是一个用于代码质量管理的开源...通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。同时 Sonar 还对大量的持续...
  • 好的代码一定是整洁的,并且能够帮助阅读的人快速理解和定位。好的代码可以加快应用的开发迭代速度,不必花过多的时间来修复 bug 和完善代码。好的代码不但能够使得新的项目成员更容易加入项目,...
  • 它们由您的同事开发人员Dave编写。...你可以让Dave来到你的办公桌前,对他大喊大叫,你从未见过如此蹩脚的代码,诅咒他和他的家人。 但是,既然你是一个尊敬的人,你知道这不是一个好的解决方案。教...
  • 14个提高代码质量的好问题

    万次阅读 多人点赞 2020-04-17 08:07:51
    阅读本文大概需要 2.6 分钟。并不是代码写的越多,代码质量就越高。思考才是。解决一个问题,打开电脑就手撕代码,最终的结果往往是各种代码问题,经过一系列迭代后,代码积重难返,最终的结果...
  • 代码规范和架构设计是软件的灵魂所在,代码质量偏低,就像是人失去了三魂七魄中的一魄,就会丧失活力,影响正常运行,增加软件交付后维护成本,出现推迟完成、超出预算、特性缺失等现象。 任何语言都需要强调编码...
  • 在项目开发的过程中,代码质量管理是非常重要的一个环节,项目中代码质量的高低直接影响着整个开发团队的工作效率。虽然代码质量本身并没有特别明确的量化指标,而且根据公司发展的不同阶段,团队规模的不同大小,...
  • SonarQube代码质量检查工具简介

    千次阅读 2020-03-12 14:37:14
    Sonar (SonarQube)是一个开源平台,用于管理源代码的质量 Sonar 不只是一个质量数据报告工具,更是代码...Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题。 不遵循代码标...
  • IDEA插件【代码质量保证】

    千次阅读 2020-03-20 07:38:57
    IDEA插件【代码质量插件】
  • 你的研发团队是否存在如下问题 程序bug不断 好好的功能换个姿势使用就出bug ...从上面的分析可以看出,可以从5个维度分别控制研发代码质量,博主将分别以这5个维度讲解提升研发质量的方法。其中 “研发规范”、...
  • 分享一个Vue前端代码质量检查方案

    千次阅读 2020-05-05 10:30:00
    什么导致的代码质量降低 不在意代码质量, 只关注业务的产出 破窗效应 对好代码没概念 初步方案 从oms bms项目开始初步尝试 代码风格要遵循Vue风格指南(主要规范) 引入Ts技术栈(待定) 引入单元测试,保证组件...
  • 如何评估开发代码质量

    千次阅读 2018-02-28 09:54:52
    总体思路:如何评估开发代码质量--&gt;千行代码Bug率--&gt;StatSVN工具统计代码量情景小A所在的项目组,每个项目版本都bug数都在400-500之间,每次项目测试期间都要给验证Bug单独安排2-3天的时间进行Bug验证...
  • 如何保证代码质量

    千次阅读 2018-12-28 14:02:00
    代码质量评价:低耦合,高内聚(功能,元素除了职责任务,没有其他工作) 高质量代码三要素:可读性,可维护性,可变更性 可读性: 1、不要编写大段代码2、将段落封装成一个又一个函数3、在编写代码的工程中养成...
  • Java代码质量检查工具

    万次阅读 2018-05-13 08:27:00
    在现在的软件开发中,由于软件的复杂度...这几天在研究代码质量管理,根据在网上搜集的资料及跟前辈学的一点经验整理一下,有需要的同学们可以查看,也便于以后自己回顾。 主要对下面的七块进行分析编码格式规范...
  • SonarQube:开源的代码质量管理工具

    千次阅读 2018-04-17 15:00:04
    SonarQube是一个开源的代码质量管理工具,如下图所示,它覆盖了代码质量的7个方面:SonarQube的主要特性:通过插件扩展支持新的编程语言、添加规则引擎、计算更复杂的度量指标,这些都可以借助强大的插件扩展机制。...
  • 代码质量的重要性 在我们日常完成需求中,常常因为时间紧迫,项目紧急上线,总想着先实现再说,然后等日后上线之后再慢慢优化,我相信,你可能看过很多祖传代码,各种//TODO,然而往往随着项目的上线,TODO就变成...
  • 从五个维度考察java代码质量

    千次阅读 2016-09-25 20:54:51
    代码质量概述 怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍。也请有代码质量管理经验的...
  • 三年无bug,提升代码质量的秘诀

    千次阅读 2017-02-25 14:24:21
    对我代码质量影响最大的是在一家外资企业,在这家公司我觉得有以下几个方面做的很不错。 团队编码风格统一 统一到什么程度? 不看代码作者,你很难区分代码是谁写的(在目前公司一些团队也能达到这个标准)。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 521,239
精华内容 208,495
关键字:

代码质量