段子
正式开始前,我们先来个段子:文艺程序员写代码追求让别人看懂,普通程序员追求让自己看懂,2B程序员则追求让编译器能看懂;半年后再看自己当初写的代码,文艺程序员不知道是自己写的但很容易看懂,普通程序员知道是自己写的但是不太容易看懂,2B程序员埋头看了半天后拍着桌子吼到:“这是哪个SB写的程序!”
相信每个程序员都经历过阅读凌乱代码的那梦魇般的痛苦,不时发出“难道自己真的就不是这块料子,不行的话,就回家跟村里的二傻去种地好了”的概叹和无奈。然而绝大部分事实是:真正好的老师都是这样要求自己的“不是你没有听懂,是我没有讲清楚。”,你可以完全自信的在这一行里继续折腾下去,还没有到转行不可的山穷水尽。
每个有抱负的程序员都以写优雅的代码为自己的目标。但理想很丰满,现实太骨感,当产品经理催促上线时间点快到了,测试还提了一堆发版前必须改掉的Bug,以及“前人”留下的各种坑时,高效、优雅就成了奢侈品,求佛祖保佑天亮前改掉导致上线失败的Bug才是人生的最大心愿。
为什么你总是一直在这种恶性循环中死循环呢?
作为一名程序员,我们的工作就是为终端用户将过程自动化;然而,我们当中有很多人却忽视了将我们自己的开发过程自动化的机会。
在本专题的上一篇(高效研发之——工具篇(4):Jenkins)中介绍了持续集成的概念,其中也已经提到了代码质量检查和评估工具checkstyle, findbugs和pmd。实际上,持续集成(CI)不应该只是一种软件开发实践,而是一种方法论和思维方式,即要尽早找到缺陷。而通过代码质量检查和评估工具与CI工具的有效结合,正是这种思维方式的最佳实践。
代码质量检查和评估工具
-
CheckStyle:用于编码标准
-
FindBugs:潜在Bug分析
-
PMD :检查Java源文件中的潜在问题
-
Coverlipse:测量代码覆盖率
-
JDepend:提供依赖项分析
-
Eclipse Metric 插件:有效地查出复杂度
下面主要介绍checkstyle, findbugs和 pmd
工具 | 目的 | 检查项 |
FindBugs检查.class | 基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug | 主要检查bytecode中的bug patterns,如NullPoint空指针检查、没有合理关闭资源、字符串相同判断错(==,而不是equals)等 |
PMD检查源文件 | 检查Java源文件中的潜在问题 | 主要包括:空try/catch/finally/switch语句块未使用的局部变量、参数和private方法空if/while语句过于复杂的表达式,如不必要的if语句等复杂类 |
CheckStyle检查源文件主要关注格式 | 检查Java源文件是否与代码规范相符 | 主要包括:Javadoc注释命名规范多余没用的ImportsSize度量,如过长的方法缺少必要的空格Whitespace重复代码 |
以上工具都提供Eclipse、intelliJ IDEA和Jenkins插件,可以非常方便地集成到编码过程和CI过程。在Eclipse中都可以通过在项目上点右键,选相应菜单执行,执行后都会以列表形式展示检查结果。操作非常方便,就不在文中过多介绍。
CheckStyle
CheckStyle(官网:http://checkstyle.sourceforge.net/)是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要但是枯燥的任务中解脱出来。
CheckStyle定义了一系列可用的模块,每一个模块提供了严格程度(强制的,可选的…)可配置的检查规则。规则可以触发通知(notification),警告(warning)和错误(error)。
CheckStyle检验的主要内容
·Javadoc注释
·命名约定
·标题
·Import语句
·体积大小
·空白
·修饰符
·块
·代码问题
·类设计
·混合检查(包活一些有用的比如非必须的System.out和printstackTrace)
Eclipse 中 CheckStyle 的代码冲突列表
详细检查规则可参见(http://blog.csdn.net/yang1982_0907/article/details/18086693)
FindBugs
FindBugs(官网:http://findbugs.sourceforge.net/)是一个能静态分析源代码中可能会出现Bug的静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式。
Findbugs自带检测器,其中有60余种Bad practice,80余种Correctness,1种 Internationalization,12种Malicious code vulnerability,27种Multithreaded correctness,23种Performance,43种Dodgy。我们还可以自己配置检查规则(做哪些检查,不做哪些检查),也可以自己来实现独有的校验规则(用户自定义特定的bug模式需要继承它的接口,编写自己的校验类,属于高级技巧)。
Eclipse 中 Findbugs 检查的Bug列表
FindBugs详细规则参见(http://findbugs.sourceforge.net/bugDescriptions.html),
中文解释的参见:(http://blog.csdn.net/jdsjlzx/article/details/21472253/)
PMD
PMD(官网:https://pmd.github.io/)是一款采用BSD协议发布的Java程序代码检查工具,扫描java源代码,查找潜在的问题,如:
-
可能的bugs,如空的try/catch/finally/switch声明
-
死亡的代码,没有使用的本地变量,参数和私有方法
-
不合标准的代码,如String/StringBuffer用法
-
过于复杂的表达式,如不必要的if表达式
-
重复的代码,拷贝、粘贴的代码
使用PMD进行代码检查
PMD的详细规则参见:(https://wenku.baidu.com/view/362fbadf50e2524de5187e33.html)
写在后面
工具是为思维和方法论服务的,类似的工具还有很多,安装使用都很方便,难的是每个用到恰到好处。引用本人在高效研发之——工具篇(2):禅道中写的一句话:任何工具都只是实现想法的工具,如果你的想法不明确、不清晰,那这些工具到你手里,就好比一把锋利的刀,却被当作锄头来使用,结果:挖的全是坑。
“高效研发之----工具篇”系列文章将对下图所列的研发各阶段的工具进行介绍。因每个工具在互联网上的介绍都很多,笔者不会对工具做过多详细的描述,而是将重心放在介绍工具在整个研发流程中的作用和价值。同时,由于笔者水平有限,所选工具主要是笔者所在团队使用的,每个工具都有不少替代者,对未列入的其他优秀工具,也欢迎大家推荐给笔者学习和补充。
网友评论