一、背景说到读码器,大多数技术人员都耳熟能详。无论你是刚开始学习代码的新手还是经验丰富的代码高手,无论你是学习优秀的开源项目还是重构老项目,阅读代码都是技术人必备的技能之一。在当前业务迭代快速的环境下,高效梳理代码可以大大提高开发人员的工作效率,进一步为业务创造新的价值。笔者收集了业界常用的几种读码方案,从效率、易用性、成本、是否可调试四个角度进行了比较。读者可以根据自己的喜好选择合适的读码方案,也可以在评论区留言。代码梳理经验欢迎讨论。评分仅代表个人意见IDE阅读效率:??易用性:??????费用:????(部分IDE需要付费使用)是否可调试:是一类软件。虽然不同的语言有不同的IDE,但它们都指向同一个目标。IDE的核心功能是代码编辑。许多IDE还优化了代码编辑级别的性能。虽然各种IDE通过各种方式实现了代码阅读和代码整理的功能,但是由于其作为编辑器的本质属性,从代码阅读的角度来看,很多大型项目的易用性和效率都比较低,而且它很难快速阅读代码。以Java为例,目前业界比较常见的IDE有IntelliJIDEA和Eclipse等,笔者对IDEA比较熟悉,所以这里以IDEA为例。就IDEA而言,除了通过鼠标点击跟踪阅读代码(Tips:mac下默认快捷键Command+B,windows下默认快捷键Ctrl+B),还有很多辅助阅读的插件代码,包括RainbowBrackets(多彩Brackets,多嵌套代码分析),Statistic(代码行数统计),SequenceDiagram(时序图绘制)等。使用SequenceDiagram自动解析fastjson(1.2.84)中的核心链接JSON.parseObject方法,可以看到大概的链接情况,但是由于lambda表达式解析困难,链接显示不够直观。IDE虽然可以覆盖日常工作中的大部分场景,但是对于大型项目(比如Android源码或者linux源码)的分析还是比较困难的。其效率和易用性较低的主要原因如下:大多数IDE对代码的分析速度较慢。由于大多数IDE都在代码编辑层面进行了优化,加载代码的过程需要消耗更多的资源(识别代码之间的关系等)。同时,在加载大代码时,会造成严重的卡顿,影响用户体验;对于代码的阅读,很多IDE都要求编译代码,否则会出现大量的“闪红”,导致无法阅读代码。大型项目往往编译时间非常长,环境配置难度极大,降低代码阅读效率;常用的IDE往往专门针对某种语言(当然也有像CLion这样的跨平台IDE)。对其他语言的支持程度不高。如果项目中存在跨平台问题,往往很难通过单一IDE读取代码。微软的VSCode推出后,众多开源作者相继推出了魔法级的代码阅读插件(CodeRunner、PartialDiff、TODOTree等),提升代码阅读体验。代码梳理法。SourceInsight效率:??????????易用性:????成本:??????????是否可调试:支持第三方命令官网(地址:https://www.sourceinsight.com/)有世界上只有两种人,用过SI的人和没用过SI的人,SI的出现让很多开发者第一次感受到代码阅读的乐趣(相信很多Android开发者都用过这个神器来阅读Android源代码)。如果说IDE是专注于代码编写的平台,那么SI就是专注于代码分析的神器。SI为开发者提供以下核心功能:快速代码分析:SI可以通过内置引擎快速分析代码,形成继承树和函数调用树,占用资源极少。准确的代码查找:SI支持快速查看函数和变量使用位置的能力,几乎立即自动显示对函数、变量、类等的引用。多语言支持:SourceInsight内置了C/C++、C#、Java、Objective-C等语言的动态分析工具。SI几乎可以完成代码链接分析中的所有工作,但它也有一个不可忽视的缺点:成本高。SI是收费软件,需要支付高额费用才能使用其全部功能。SI只支持Windows平台,如果要使用Mac平台,必须安装虚拟机(推荐CrossOver)。界面风格陈旧,没有官方中文插件,导致易用性低。了解效率:????????易用性:??????????成本:??????????是否可调试:支持第三方命令官网(https://www.scitools.com/)了解是aniche代码阅读工具国内用户不多(主要是太贵,没有SourceInsight那么神奇可用),但是国外很多公司用这个软件做日常代码分析和缺陷发现。Understand的核心功能与SourceInsight类似,包括:强大的图形绘制能力,包括继承图、函数调用图、包含图等丰富的标识符信息,具有强大的代码信息库,能够存储与相关的各种符号信息代码。便捷的搜索功能可以快速查找定位到指定的标识符。使用Understand通过代码直接生成流程图。相比之下,我个人更喜欢Understand生成的各种图形。风格比SourceInsight更优雅。与SourceInsight相比,Understand支持在Mac和Linux平台上运行,但从用户反馈来看,代码分析时存在资源消耗过大的现象。和SourceInsight一样,Understand也是需要付费的,而且没有免费试用版,也不支持中文。OpenGrok效率:??????易用性:??成本:无(开源)是否可调试:无官网(https://oracle.github.io/opengrok/?)OpenGrok是一个高效的源码搜索写的在Java和交叉引用查询引擎中,可以帮助开发人员深入理解代码。主要有以下核心功能:强大的依赖分析能力。分析并生成索引文件,用于快速搜索源代码的变量/对象、结构/类、函数/接口、宏等。快速高效的代码搜索功能,支持不同类别的搜索和直接代码。OpenGrok提供专门的代码管理工具支持,让您可以快速方便地查看对应代码行的提交信息和提交历史。相对而言,OpenGrok相对于同类产品有一定的优势。它的搜索速度和文件加载速度比较快,但是使用方法比较复杂,学习成本比较高,没有强大的可视化能力。由于OpenGrok的核心依赖Tomcat或其他Web容器服务,用户需要根据系统环境进行配置(官方配置文档,地址:https://github.com/oracle/opengrok/wiki/How-to-setup-OpenGrok),总体而言,在易用性方面,还是要根据实际需要谨慎使用。Sourcetrail效率:??????易用性:????????成本:无(开源)是否可调试:支持IDE调试一款代码分析工具,支持跨平台代码分析。Soucetrail提供了以下功能:函数调用链接以思维导图的形式展示。在分析代码的同时,Sourcetrail提供了一个优雅的图形化界面来展示项目中的各种标识信息和链接图,让人更直观的了解整个项目的链接信息。出色的跨平台支持,提供Linux、Mac、Windows等多平台安装包。为自定义语言分析提供了一个扩展接口。Sourcetrail是一个非常强大的代码分析工具,使用起来非常简单灵活,还可以与IDE关联。但其软件拓扑分析有一定的局限性,笔者已宣布不再更新,需要根据使用场景慎重选择。实战测试在本模块中,我们将通过上述读码方案,对一款开源软件的核心环节进行分析,从而比较各种工具在实际运行中的效果。由于SourceInsight和Understand都需要收费,所以这次只使用IDE阅读方式,OpenGrok和Sourcetrail对核心环节进行简要分析。目标代码:fastjson(代码地址:https://github.com/alibaba/fastjson)代码版本:1.2.76代码语言:JavaIDE阅读由于阅读目标是java代码,所以计划使用IntelliJIDEA进行代码阅读.?核心代码定位我们在阅读代码的时候,往往会从一个核心方法入手,然后逐层分析代码。本次代码阅读,以JSON.parseObject方法作为代码分析的入口。JSON.parseObject方法的主要作用是将一个JSON字符串解析成JSONObject的形式。JSONObject相当于fastjson中的基本操作单元,代表一个具体的JSON块。可以看出parseObject有很多重载的方法。为了找到核心方法,需要一步步寻找,过程繁琐。?核心代码链接分析在链接分析层面,可以先分析核心类对应的继承关系,初步分析各个类之间的关系。然后可以使用各种插件来实现初步的代码分析,绘制时序图,UML图等,但是如果想深入理解代码结构,就需要深入阅读源码,可视化程度支持度不高。OpenGrokOpenGrok的安装过程比较繁琐。有web开发经验的同学建议按照官方文档的安装方式进行安装配置。?核心代码定位OpenGrok具有强大的代码搜索功能,支持正则表达式和各种多条件表达式,并且由于预索引分析,代码搜索速度比常规IDE快很多,可以快速定位到核心代码。?核心代码链接分析OpenGrok的一大缺点是不支持代码的可视化分析,开发者在阅读代码时需要手动整理链接。但是,它添加了链接以支持快速搜索代码中的各种标识符(符号)。与IDE相比,可以显着提高阅读依赖关系更复杂的代码的效率。sourcetrail阅读Sourcetrail官方提供了支持各种平台的二进制安装包,支持一键安装,速度非常快。?核心代码定位Sourcetrail还集成了高效的代码搜索功能,用户可以在搜索栏中全局搜索代码。与OpenGrok相比,Sourcetrail的界面设计更清晰,但索引速度相对较慢,无法查看代码的历史提交信息。这个工具的一个优点就是以脑图的形式展示了各个方法之间的调用关系,链接比较清晰,可以让用户快速找到核心代码所在的位置。?核心代码链接分析在代码链接分析方面,Sourcetrail不分析代码的拓扑关系,而是通过点击脑图结合代码阅读,梳理代码链接。Sourcetrail可以通过IDE插件的形式与IDE关联,可以有效的提高我们阅读代码的效率。总结技术学习是一个不断积累和沉淀的过程。优秀的代码阅读工具可以提高我们学习和积累的效率。相信每个技术人心里都有自己的学习技术的方法。希望作者的文章以后能对大家有所帮助。在学习和工作中提高效率,勇攀高峰。团队介绍我们是大淘宝平台的会员技术团队,负责整个淘宝天猫平台会员的成长和运营,肩负着大市场GMV成长的重要责任。其会员体系丰富多样。例如,88VIP会员体系连接整个阿里巴巴经济体,吸引众多外部生态合作伙伴加入,真正帮助用户实现“吃、玩、听、看、买、行”的一站式服务;钱卡:通过全网通用的红包福利刺激,构建了更加灵活的权益型会员体系,为全网消费者提供最直接有效的省钱方式。同时,我们围绕会员成长的生命周期,构建了完整的会员成长体系。在支持整个淘宝天猫平台会员业务快速发展的同时,我们也横向赋能天猫会员店、行业卡、商户付费会员等新会员。形成,并构建了一个可以为整个行业赋能的会员体系。
