有一定规模的 IT 公司,只要几年,必然存在大量的代码,比如腾讯,2019 年一年增加 12.9 亿行代码,现在只会更多。不管是对于公司,还是对于个人,怎么低成本的了解这些代码的对应业务,所提供的能力,都是非常有必要的!
今天,阿七就带大家破解这个难题,根据这个文档,你能使用 AI 编程技术,根据包含 Java 完整代码的项目实现可视化下面三个方面的内容:
- 模块和功能:应用内部的业务模块和功能,及相互间的关系,为用户提供应用的整体视图。
- 类和接口:应用模块提供的业务能力以及对应的类和接口,以及接口对应业务流程语义化。
- 方法实现语义化:方法实现逻辑的语义化和可视化;
一、先秀一下成果
一)Java 项目概览图
根据一个 Java 项目,可以生成下面这样的项目整体概览图,对于不需要了解实现细节的产品、运营同学,直接看这个图,就能够了解这个 Java 项目在干什么、能提供什么能力。
对于部分技术同学,不需要了解代码详情的,也可以直接看这个图即可。满足新入职同学对于接手不常变更项目的理解和全局业务的了解!
PS:由于保密需要,所有的成果图仅为示例图。实际的图会更好看、更震撼,因为一个 Java 项目的功能模块可能很多,提供的能力可能很多。
对于需要了解技术细节的同学,点击入口,能看到当前方法的流程图,快速了解当前方法提供的能力,具体的细节。还能迅速发现流程上可能存在的问题,快速纠正。
二)具体方法流程图
有了上面的两层可视化图表,不管是产品、技术、测试、运营以及小领导,都能快速的根据一个 Java 项目获取到他所需要的层级的信息,降低开发人员通过阅读代码梳理业务逻辑和代码逻辑的时间,尤其是新入职的同学。这个时间据统计,基本上在 25%-30%(百度、阿里等大公司调研数据更大,为 55%-60%),对于新同学,这个比例会更大!
二、实现步骤
一)整体概述图怎么生成?
一个 Java 项目所有对外接口在做的事情,就是一个 Java 项目的核心业务。这个对外接口包括:HTTP 接口、Dubbo 接口、定时任务。
1、获取一个 Java 项目所有对外接口
1)通过 Trace 平台
可以查询到一个 Java 项目所有对外的 HTTP 接口和 Dubbo 接口,通过注解可以查询一个 Java 项目所有定时任务。
优点:
- 数据准确,跑出来的数据,一定是还在用的接口;
缺点: - 需要依赖 Trace 平台数据,部分公司可能没有 Trace 平台。
2)通过 JavaParser 工具
可以通过 JavaParser 工具,扫描整个 Java 项目代码。找到所有的对外入口。
优点:
- 不依赖 Trace 数据;
缺点: - 可能不准确,因为有些接口已经不被使用了。
2、获取对外接口的方法内容
1)根据 HTTP 的接口 url 可以反解析出来这个 url 对应的方法的全路径。
具体来说,在项目中获取 Spring 上下文,Spring 上下文中有一个 Bean 叫 RequestMappingHandlerMapping,这个 Bean 中提供了一个方法 getHandlerMethods,这个方法中保存了一个 Java 项目中所有的对外 HTTP 方法。
这个方法返回一个 Map<T, HandlerMethod>对象,key 是 HTTP 接口的 URL,value 就是这个 URL 对应方法的全路径名称。
2)根据方法全路径,获取方法内容
根据上面的全路径名,使用 Spoon 框架我们能拿到对应方法的方法体。
java
<dependency>
<groupId>fr.inria.gforge.spoon</groupId>
<artifactId>spoon-core</artifactId>
</dependency>
我们让 ChatGPT 帮我们写代码,提示词:
写一个 Java 方法,使用 Spoon 框架解析 Java 方法的完整内容
其中入参是方法全路径名
PS:这个代码一会还有用,我们往下递归的话,能拿到这个 Controller 方法调用的所有方法体。
3、根据方法内容生成方法注释
就和 GitHub Copilot 和百度 Comate 代码助手一样,GPT 可以根据代码生成方法注释,提示词:
角色: 你是一个 Java 技术专家。
任务: # 号开头的是一个 Java 方法。请你逐行阅读代码,然后为这个 Java 方法生成一句话注释。
限制:不要超过 20 个字
举个例子,我有个工具方法,使用 GPT 为他生成注释,如下:
4、生成 Java 项目一句话描述
角色: 你是一个 Java 技术专家。
任务: --- 符号以上的是一个 Java 项目中所有对外方法的注释,请你逐行阅读这些注释,然后给这个 Java 项目生成一句话描述。
限制: 结果不要超过两句话。
这个利用的是 GPT 的总结概要的能力,GPT 能总结论文、总结文章,他也能总结一段描述 Java 项目的文字。这样就能获取对于一个 Java 项目的一句话描述,也就是项目概览图的第一层。
5、总结:生成项目概览图
我们要求 GPT 根据 Java 项目的一句话描述,和所有对完方法的方法注释,生成思维导图数据。为了项目概览图的层级更可读、更清晰,我们可以要求 GPT 根据方法注释的相似性进行分类,形成项目概览图的第二层。第三层就是所有项目中对外方法的注释。
生成思维导图,可以让 GPT 根据结构内容生成 puml 格式的思维导图数据,我们把 puml 格式的数据存储为 puml 文件,然后使用 xmind 或者在线画图工具 processOn 打开就能看到完整的思维导图。
参考提示词如下:
应用代码:appCodeValue
项目描述:appCodeDescValue
项目描述:appCodeDescValue
方法描述:methodDescListValue
角色:你是一个有多年经验的 Java 技术专家,在集成 Java 项目方面有丰富的经验。
任务:根据 Java 项目中所有公共接口的描述信息生成思维导图。
要求:思维导图只有四个层级。
详细要求:思维导图的中心主题是 appCodeValue,第一层分支是 appCodeDescValue;第二层分支是公共接口的分类;下层分支是每个分类下方法的描述信息。
返回正确格式的 opml 思维导图 xml 数据,并且内容是中文。
二)流程图怎么生成?
1、获取递归代码
直接问 GPT,让 GPT 改造上面的获取方法体的方法。
prompt;
{获取方法体的方法}
上面的 Java 代码是使用 Spoon 框架解析 Java 方法的完整内容
其中入参是方法全路径名
任务:现在要求你改造这个方法,除了打印当前方法的完整内容,还要求递归打印所有调用方法的方法体内容,包含被调用方法调用的方法
这样,我们能获取到一个 controller 方法所有递归调用的方法,每个方法生成自己的流程图,最后通过流程图嵌套的形式进行展示。
比如这个例子,当前能看到的是当前方法的流程图,带 + 号的内容,是当前方法调用方法的流程图。这样方便我们按照自己需要的深度去了解当前方法的具体实现流程!
2、无效代码剪枝
按照上面生成的流程图可能分支很多,还有一些无效的信息,影响用户判断,我们可以通过删除一些业务无关代码的方法,精简流程图。
比如,我们可以删除日志、监控等与业务逻辑无关的代码,删除没有调用的代码(现在市面上有些这种技术方案,可以检测当前项目中没有被实际调用的代码)。
3、生成流程图
先让 GPT 根据代码生成结构化的 Json 数据。
给你一段 Java 代码,请你使用 spoon 输出结构化的 Json 数据。要求:请你直接输出结构的 json 结果数据,不需要过程代码
然后,可以让 GPT 根据 Json 数据生成流程图数据,使用流程图工具打开即可。
给你一段 Spoon 结构化 Java 代码的 Json 数据,整理对应 Java 代码的意思,生成一个流程图数据,流程图使用 PlantUML。现在请输出能直接绘制 PlantUML 图的数据
三、改进方案
我们可以从下面几个方面改进这个项目,从而实现真正落地,解决实际公司需求:
- 获取代码,修改为从 gitlab 等代码仓库直接拉取,这样使用的时候不需要将工具包导入到具体的 Java 项目中。
- 优化生图,提前生成全量图标,通过浏览器的形式进行访问。
- 增加图表内容手动校正功能,生成不准确的,支持开发人员手动调整。
- 增加检索功能,可以按照自然语言进行检索。
- 把项目中的方法和类信息存起来,生成更准确的图标。
- 根据完整项目代码,反向生成项目概要图,可能能得到更准确的概要图。
- 递归方法流程图,可以使用流程图嵌套,如下进行展示。
四、总结
AI 在编程领域,除了大厂都在卷的代码助手,结合自己公司还有很多可探索的地方,比如本文说的可视化 Java 项目,还可以通过分析日志,进行异常、故障的根因分析,做到快速定位问题,帮助快速解决问题,减少影响。
如果故障根因分析这个工具做出来了,阿里云的 P0 故障,滴滴的 P0 故障,还有很多大中小厂的故障,是不是能更快恢复?减少声誉、金钱损失?
就说,项目可视化这个需求,据我了解的内部消息,有些互联网中大厂已经在使用这个方式进行落地了。另外,我陪伴群里也有同学接触到了类似不少甲方的类似的强需求,如果想深入这块技术的同学,不管是进互联网大厂还是做自己的副业产品都是不错的方向!