背景
谈起代码阅读,大部分技术人员都不会陌生。无论是刚开始学习代码的小白还是久经沙场的代码大神,不管是学习优秀的开源项目还是做老项目的重构,代码阅读都是技术人的必备技能之一。在目前业务迭代迅速的环境下,高效地梳理代码能够极大程度上提高开发人员的工作效率,进一步为业务创造新价值。
笔者搜罗了几种业内常用的代码阅读方案,并从效率,易用,成本以及是否可调试四个角度进行对比,读者可以根据自己的喜好选择合适的代码阅读方案,也可以在评论区留下代码梳理的经验,欢迎讨论。
评分仅代表个人观点
IDE 阅读
效率:⭐️
易用:⭐️⭐️⭐️
成本:⭐️⭐️(部分IDE需要收费使用)
是否可调试:是
IDE(Integrated Development Environment)应该是每个技术人员每天工作中接触时间最长的一类软件,尽管不同语言有不同的IDE,但殊途同归,IDE的核心功能是用来做代码编辑,很多IDE也在代码编辑层面做了性能上的优化。
尽管各类IDE都通过各种方式实现了代码阅读以及代码梳理的功能,但由于其作为编辑器的本质属性,从代码阅读的角度来讲面对很多大型项目易用性和效率比较低,难以快速阅读代码。
以Java为例,目前业界比较常见的IDE包括IntelliJ IDEA和Eclipse等,笔者比较熟悉IDEA,即以IDEA举例。
就IDEA而言,除了通过鼠标点击追踪(Tips: mac下默认快捷键Command+B,windows下默认快捷键Ctrl+B)的方式阅读代码外,还有很多辅助阅读代码的插件,包括RainbowBrackets(多彩括号,多重嵌套代码分析),Statistic(代码行数统计),SequenceDiagram(时序图绘制)等。
用SequenceDiagram自动化分析fastjson(1.2.84)中核心链路JSON.parseObject方法,可以看到大致的链路情况,但由于lambda表达式等比较难以解析,链路显示不够直观。
尽管IDE能够覆盖日常工作中的大部分场景,但面对大型项目的分析(如Android源码或者linux源码)就捉襟见肘,其效率及易用性较低的原因主要有以下几点:
- 绝大多数IDE对代码的分析速度较慢。由于大多数IDE在代码编辑层面做了优化,加载代码的过程需要消耗更多的资源(代码之间的关系识别等)。同时,在加载大型代码时,会造成严重的卡顿,影响用户体验;
- 针对代码阅读,很多IDE要求对代码进行编译,否则就会产生大量“飘红”,无法进行代码阅读。一个大型项目往往需要非常久的编译时间,并且环境配置的难度极大,降低了代码阅读的效率;
- 常用的IDE往往针对某种语言进行了特化(当然也有类似CLion的跨平台IDE),对其他语言的支持程度不高,如果项目中存在跨平台的问题往往难以通过单一IDE进行代码阅读。
微软的VSCode面世后,很多开源作者陆续推出了代码阅读的魔法级插件(CodeRunner,PartialDiff,TODOTree等等)以提升代码阅读体验,相信在各路大神的努力下,IDE阅读法终将成为最好的代码梳理方法。
Source Insight
效率:⭐️⭐️⭐️⭐️⭐️
易用:⭐️⭐️
成本:⭐️⭐️⭐️⭐️⭐️
是否可调试:支持第三方命令
官方网站(地址:https://www.sourceinsight.com/)
世界上只有两种人,用过SI的人和没用过SI的人,SI的出现让很多开发人员第一次感受到了代码阅读的快乐(相信很多Android开发者都用这个神器阅读过Android源码)。如果说IDE是专注于代码编写的平台,那么SI就是专注于代码分析的神器。SI为开发人员提供了以下核心功能:
- 快速的代码分析:SI能够通过内置引擎快速分析代码,并形成继承树以及函数调用树,占用资源量极小。
- 准确的代码查找:SI支持快速查看函数和变量使用位置的功能,几乎立即自动显示对函数、变量、类等的引用。
- 多种语言支持:Source Insight 内置了针对 C/C++、C#、Java、Objective-C 等语言的动态分析工具。
SI几乎能够完成代码链路分析中的全部工作,但它也有着不容忽视的缺点:
- 成本较高。SI是收费软件,需要缴纳高昂的费用才能使用其全部功能。
- SI仅支持Windows平台,Mac平台想要使用必须安装虚拟机(推荐下CrossOver)。
- 界面样式较老且没有官方中文插件,这导致了其易用性较低。
Understand
效率:⭐️⭐️⭐️⭐️
易用:⭐️⭐️⭐️⭐️⭐️
成本:⭐️⭐️⭐️⭐️⭐️
是否可调试:支持第三方命令
官网网站(https://www.scitools.com/)
Understand是一款小众的代码阅读工具,国内的使用人群不多(主要原因是太贵了,并且没有Souce Insight那么多魔法可用),但有很多外国公司利用该软件进行日常的代码分析以及缺陷查找工作。Understand的核心功能和Source Insight比较类似,包括:
- 强大的图形绘制能力,包括继承关系图,函数调用图,包含关系图等等。
- 丰富的标识符信息,具有强大的代码信息数据库,能够存储代码相关的各类符号信息。
- 方便的搜索功能,能够快速查找及定位指定的标识符。
利用Understand通过代码直接生成流程图,相比较而言个人更喜欢Understand生成的各类图形,样式而言比Source Insight更为优雅
相比Source Insight,Understand支持在Mac平台及Linux平台上运行,但从用户的反馈看在进行代码分析时存在着一定的资源消耗过多的现象。与Source Insight一样,Understand也是需要付费的,而且没有免费试用版本,同时也不支持中文。
OpenGrok
效率:⭐️⭐️⭐️
易用:⭐️
成本:无(开源)
是否可调试:否
官网网站(https://oracle.github.io/opengrok/)
OpenGrok是一款用 Java 编写的高效源代码搜索和交叉引用查询引擎,能够帮助开发人员深入了解代码,主要具有以下几个核心功能:
- 强大的依赖分析能力,借助内置的Analysis引擎,OpenGrok支持多种版本管理工具,能够根据代码的提交历史进行代码分析,并为源码的变量/对象、结构体/类、函数/接口、宏等生成可供快速搜索的索引文件。
- 快速高效的代码搜索功能,支持不同类别的搜索并直达代码。
OpenGrok对代码管理工具做了特化性的支持,能够便捷快速地看到对应代码行的提交信息以及提交历史。
相对而言,OpenGrok在同类产品中具备一定的优势,其搜索速度以及文件加载速度较快,但其使用方法比较复杂,学习成本相对较高,并且也没有强大的可视化能力。由于OpenGrok核心依赖于Tomcat或其他web容器服务,需要用户根据系统环境自行配置(官方配置文档,地址:https://github.com/oracle/opengrok/wiki/How-to-setup-OpenGrok),整体而言易用性较低,应根据实际需要谨慎使用。
Sourcetrail
效率:⭐️⭐️⭐️
易用:⭐️⭐️⭐️⭐️
成本:无(开源)
是否可调试:支持IDE调试
官网网站(https://github.com/CoatiSoftware/Sourcetrail)
和OpenGrok一样,Sourcetrail也是一款开源的代码分析工具,并支持跨平台代码分析。Soucetrail提供了以下几个功能:
- 以脑图的形式展示了函数调用链路。在分析代码的同时,Sourcetrail提供了优雅的图形化界面以展示工程项目中的各类标识符信息以及链路图,能够让人更为直观地了解整个工程的链路信息。
- 优秀的跨平台支持,提供了Linux,Mac以及Windows等多个平台的安装包。
- 提供了扩展接口,可用于自定义语言分析。
Sourcetrail是一款非常强大的代码分析工具,使用起来非常简单灵活,而且还可以关联IDE。但是其对软件拓扑的分析存在一定局限性,并且作者已经宣布不再更新,需要根据使用场景谨慎选用。
实战测试
在该模块,我们将针对一款开源软件的核心链路分别采用上述几种代码阅读方案进行分析,以对比各类工具在实际操作中的效果。由于Source Insight和Understand均需要收费,本次仅采用IDE阅读法,OpenGrok以及Sourcetrail进行核心链路的简要分析。
- 目标代码:fastjson(代码地址:https://github.com/alibaba/fastjson)
- 代码版本:1.2.76
- 代码语言:Java
IDE阅读
由于阅读的目标是java代码,拟采用IntelliJ IDEA进行代码阅读。
▐ 核心代码定位
我们在阅读代码时常常通过一个核心方法入手,接着逐层进行代码分析。针对本次代码阅读,以JSON.parseObject方法作为入口进行代码分析。JSON.parseObject方法主要功能在于将一个JSON的字符串解析成JSONObject的形式,JSONObject相当于fastjson中的基本运行单元,代表了一个具体的JSON块。
可以看到,parseObject存在很多重载方法,为了找到核心方法,需要逐级查找,过程比较繁琐。
▐ 核心代码链路分析
在链路分析层面,首先可以分析核心类对应的继承关系,以初步分析各个类之间的关联关系。
接着可以借助各类插件实现初步的代码分析,绘制时序图,UML图等等,但想要深入了解代码结构还需要深入源码进行阅读,可视化支持程度不高。
OpenGrok阅读
OpenGrok的安装过程比较繁琐,有web开发经验的同学推荐根据官方文档的安装方式进行安装及配置。
▐ 核心代码定位
OpenGrok有着强大的代码搜索功能,支持正则以及各类多条件表达式,并且由于预先进行了索引分析,代码搜索的速度比常规IDE迅速了很多,能够快速定位核心代码。
▐ 核心代码链路分析
OpenGrok的一大缺点在于其不支持代码的可视化分析,在进行代码阅读时需要开发人员手动梳理链路。但其对代码中的各类标识符(symbol)均增加了支持快速查找的链接,相比ide而言,在阅读依赖关系比较复杂的代码过程中能够起到比较显著的提效作用。
Sourcetrail阅读
Sourcetrail官方提供了支持各类平台的二进制安装包,支持一键安装,非常快捷。
▐ 核心代码定位
Sourcetrail同样集成了高效的代码搜索功能,用户可以在搜索栏全局搜索代码。相比OpenGrok,Sourcetrail的界面设计更为清晰,但建立索引的速度相对较慢,且不能查看代码的历史提交信息。
该工具的一大优点在于利用脑图的形式展示了各类方法之间的调用关系,链路梳理比较清晰,能够让用户快速找到核心代码所在位置。
▐ 核心代码链路分析
在代码链路分析上,Sourcetrail没有进行代码的拓扑关系分析,但能够通过点击脑图的形式结合代码阅读对代码链路进行梳理。通过IDE插件的形式可以将Sourcetrail与IDE关联,有效提高我们代码阅读的效率。
总结
方法 |
效率 |
易用 |
成本 |
是否可调试 |
IDE阅读 |
⭐️ |
⭐️⭐️⭐️ |
⭐️⭐️ |
是 |
Source Insight |
⭐️⭐️⭐️⭐️⭐️ |
⭐️⭐️ |
⭐️⭐️⭐️⭐️⭐️ |
支持第三方命令 |
Understand |
⭐️⭐️⭐️⭐️ |
⭐️⭐️⭐️⭐️⭐️ |
⭐️⭐️⭐️⭐️⭐️ |
支持第三方命令 |
OpenGrok |
⭐️⭐️⭐️ |
⭐️ |
无 |
否 |
Sourcetrail |
⭐️⭐️⭐️ |
⭐️⭐️⭐️⭐️ |
无 |
支持IDE调试 |
技术学习是一个不断积累和沉淀的过程,优秀的代码阅读工具能够提高我们学习和积累的效率,相信每个技术人内心都有一套自己学习技术的方法,希望笔者的文章能够帮助你在今后的学习与工作中提高效率,勇攀高峰。