作为程序员的我们,在换工作的时肯定会经历这样的场景。
不满足现有公司的的情况,从原本自己熟悉的系统进入到新公司。
进入到新公司一看卧槽,这啥东西。
一句注释都没有,心里一万个草泥🐎,接手这样的系统那是非常难受的。
出现上面这种情况的一部分原因还是大家不太喜欢写注释。
有的时候业务忙起来的时候 心里只想着要实现某个功能。
解决某个 Bug,写啥注释啊,浪费时间。
不过话说回来,有的时候我们的工作大部分都是 CRUD, 都写注释 说实话是真的麻烦。
当出现有特别的场景需要特别注释以下的时候,但是因为可能以前我都没写,现在就更不想写了。
于是恶性循环,随着公司人员逐年替换,到最后真的是没有人能看懂这个庞然大物。
AI Doc Writer
看上图 GIF 该方法的自动添加了代码注释
这个就是我们今天介绍的工具 AI Doc Writer,
这是 Intellij IDEA 下的一个插件,可以根据方法自动生成注释。
第一次看到是在 Reddit 上看到,刚看到的时候我的两眼直放金光,感觉好东西。
所以下载下来试一下。就录制了一个上面的GIF。
不过我自己还蛮好奇这个插件所能提供什么样的能力。
所以我做了如下的「测试」。
我创建了一个 OrderController 的测试类,并创建了一个 purchase 方法。
执行 AI Doc Writer 插件 得到以下注释
It returns true if the name is "zhangsan"如果名称为“张三”,则返回true
卧槽,可以啊 感觉能直接生成这样的注释感觉很不错的呢。
然后我加了一点改进【忽略上面垃圾代码】,然后得到的结果是。
If the name is "zhangsan", then return true, otherwise return false.如果名称为“张三”,则返回true,否则返回false。
有意思,接着加料。
虽然后面我添加了一个支付方法,直接返回 true ,得到的结果是 It returns true。
这不是最惊艳的,往下看 name 的注释。
The name of the person who is paying
付款人的姓名
真牛逼啊,根据上下文生成注释咯,我真是爱上这个插件了。
然后我将上方的 购买方法 中调用 支付方法 得到的注释。请大家仔细阅读上面的注释。
Purchase a ticket for a given person, if they are old enough and have enough money.
The function is a bit long, but it's mostly just a lot of boilerplate code.
如果一个人足够大,有足够的钱,就给他买张票。
这个函数有点长,但大部分只是一些样板代码。
这个函数有点长,但大部分只是一些样板代码。???? 现在 AI 都能这样玩了吗,我人傻了
我还是有点不信邪,我心里突起一计,我记得之前看 RocketMQ 源码的时候注释特别少,我来看看这个插件能不能自动生成呢?
说干就干,直接 Clone 代码
git clone https://github.com/apache/rocketmq
Cloning into 'rocketmq'...
remote: Enumerating objects: 45842, done.
remote: Counting objects: 100% (1836/1836), done.
remote: Compressing objects: 100% (862/862), done.
remote: Total 45842 (delta 516), reused 1535 (delta 363), pack-reused 44006
Receiving objects: 100% (45842/45842), 12.23 MiB | 9.67 MiB/s, done.Resolving deltas: 100% (18358/18358), done.
哈哈哈哈哈,看上面自动生成的注释,应该是出现了 Bug陷入了某种循环
在实验了上面两种情况之后,我感觉 这个插件在生成代码的时候应该还是会扫描方法里面的代码。所以我决定来试试 Leetcode 上面的题目,第一个先来一个 两数之和。
我们来读一下上图中生成之后的结果
Given an array of integers, return indices of the tow numbers such that they add up to a specific target
给定一个整数数组,返回两个数的索引,使它们相加到一个特定的目标
不得不说这个翻译真的是非常准备的。不看代码,就只看这个注释 就能明白这个方法是什么意思了。
我在想会不会是我的方法名写了 twoSum 的原因,给了他提示,所以我尝试着原本的 twoSum 修改为 x,看下图,修改后的结果。
还是给我整出来了
我还是不相信,我又换了一个「动态规划」的题,去掉注释,生成一下,看下图
不仅生成了「注释」,居然还原的这么准确,其实尝试在这里 它给我的感觉就是非常的不错,甚至有点太不错了。
会想他是怎么生成的,我去看了下 Reddit 的作者说法。
实际上是OpenAI (基本上是GPT-3,但用于代码)自己试试看:)
虽然按照 「GPT-3」 协议所描述的那样,实现一个这样的 注释生成器应该不难。
但是毕竟是一个「本地」的插件,应该是不能就凭在本地就能完成这些操作的吧。
所以我猜测它在生成过程中应该是有「接口」调用的。
在 Intellij IDEA 中设置一下 HTTP 的「代理」,然后打开 Charles。
好家伙,果然是这样的。
通过抓包可以发现,每次的注释生成都会调用一次接口。
然后生成建议的注释,细想一下如果不是靠这样的方式,本地肯定不能生成的。
不过知道了还是感觉怪怪的,因为他在上传的参数里面,直接将整个类的内容全部上传了。
不得不说安全上的隐患还是有一点的,而且连电脑「用户名」都上传了。
总的来说 AIDoc 的这个插件 「利弊掺半」吧,利用 GPT-3 实现了注释自动生成。
而且准确率还是挺高的。在一定程度上可以帮助我们阅读源代码。
但是毕竟是要上传本地代码的,所以对于项目比较机密的情况,最好还好还是谨慎一点比较好。
不过如果是用来阅读源码,然后源代码里面也没啥注释的话,那么我认为这个还是挺好的,可以帮助我们理解代码。