重新定义程序员职业,Facebook推出代码推荐工具Aroma

乾明 发自 凹非寺 EYs每天发布大量与生活相关的资讯平台

解放程序员,Facebook是认真的。EYs每天发布大量与生活相关的资讯平台

这一社交网络巨头在其官方博客上宣布,推出面向程序员的工具AromaEYs每天发布大量与生活相关的资讯平台

直击程序员想实现功能,而不知道如何写代码的痛点。EYs每天发布大量与生活相关的资讯平台

它能帮助程序员轻松地找到可以“参考使用”的代码,节省他们日常开发工作流程中的时间和精力。EYs每天发布大量与生活相关的资讯平台

比如,一个安卓程序员想要了解其他人如何解码手机中的bitmap,他可以使用下面的这些代码直接进行搜索:EYs每天发布大量与生活相关的资讯平台

Bitmapbitmap = BitmapFactory.decodeStream(input); EYs每天发布大量与生活相关的资讯平台

然后,Aroma会给出一些代码推荐:EYs每天发布大量与生活相关的资讯平台

finalBitmapFactory.Options options = newBitmapFactory.Options(); EYs每天发布大量与生活相关的资讯平台

options.inSampleSize = 2; EYs每天发布大量与生活相关的资讯平台

// ...EYs每天发布大量与生活相关的资讯平台

Bitmap bmp = BitmapFactory.decodeStream( is, null, options); EYs每天发布大量与生活相关的资讯平台

这段代码来自与五个实现类似功能的代码,但是去除了相关细节,以便程序员更好地参考。EYs每天发布大量与生活相关的资讯平台

除此之外,Aroma也能够集成在编码环境中。EYs每天发布大量与生活相关的资讯平台

EYs每天发布大量与生活相关的资讯平台

Facebook表示,使用这一工具,程序员再也不用像原来那样,自己手动浏览几十个代码搜索结果了。EYs每天发布大量与生活相关的资讯平台

哪怕代码库非常大,它也能在几秒钟内给出推荐,并且不需要提前进行模式挖掘。EYs每天发布大量与生活相关的资讯平台

现在,Facebook已经将其用到了自己内部代码库中,并为其一些开源项目创建了Aroma版本。EYs每天发布大量与生活相关的资讯平台

这一工具亮相之后,便引发了巨大的关注。EYs每天发布大量与生活相关的资讯平台

甚至有人在Twitter上评论称,可以重新定义程序员这一职业。EYs每天发布大量与生活相关的资讯平台

EYs每天发布大量与生活相关的资讯平台

Facebook是如何做到的?EYs每天发布大量与生活相关的资讯平台

给程序员推荐代码 EYs每天发布大量与生活相关的资讯平台

EYs每天发布大量与生活相关的资讯平台

用Aroma给程序员推荐代码,主要分为3个阶段:EYs每天发布大量与生活相关的资讯平台

第一,基于特征的搜索。EYs每天发布大量与生活相关的资讯平台

首先,Aroma会解析语料库中的每个代码,并创建其解析树,并将代码集索引为稀疏矩阵。EYs每天发布大量与生活相关的资讯平台

然后,从每个代码的解析树中提取一组结构特征。这些结构特征都是经过精心选择的,可以捕捉每个代码的用法、调用方法和结构信息。EYs每天发布大量与生活相关的资讯平台

进而根据每个代码的特点,为其创建稀疏向量。EYs每天发布大量与生活相关的资讯平台

最后,所有代码的特征向量构成索引矩阵,用于搜索检索。EYs每天发布大量与生活相关的资讯平台

EYs每天发布大量与生活相关的资讯平台

当一个程序员编写新的代码时,Aroma会以上述的方式创建一个稀疏向量,并将该向量与包含所有现有代码的特征向量的矩阵相乘。EYs每天发布大量与生活相关的资讯平台

点积最高的前1000个代码会被检索出来,作为推荐代码的候选。EYs每天发布大量与生活相关的资讯平台

尽管代码语料库可以包含数百万种代码,但由于稀疏向量和矩阵的点积能够非常高效的实现,这种检索的速度会很快。EYs每天发布大量与生活相关的资讯平台

EYs每天发布大量与生活相关的资讯平台

第二,重新排序和聚类。EYs每天发布大量与生活相关的资讯平台

通过检索得到推荐代码的候选集之后,接下来就是对其进行聚类。为了做到这一点,Aroma要先根据候选的各个代码和查询代码的相似性来对它们进行重新排序。EYs每天发布大量与生活相关的资讯平台

因为稀疏向量只包含关于存在哪些特征的抽象信息,所以点积分数低估了代码之间的实际相似性。EYs每天发布大量与生活相关的资讯平台

因此,Aroma对方法语法树进行修剪,去掉方法主体中不相关的部分,只保留与查询片段最匹配的部分,并根据候选代码片段与查询的实际相似性对其重新排序。EYs每天发布大量与生活相关的资讯平台

在获得了最后的排序列表之后,Aroma会运行一个迭代的聚类算法来寻找相似的代码片段,并在创建代码时推荐额外的代码语句。EYs每天发布大量与生活相关的资讯平台

EYs每天发布大量与生活相关的资讯平台

第三,用交叉算法创建代码进行推荐。EYs每天发布大量与生活相关的资讯平台

交叉算法的工作原理,是将所有推荐代码中的第一个代码片段作为“基础”代码,然后与其余的代码进行对比,迭代地对其进行“修剪”。EYs每天发布大量与生活相关的资讯平台

比如下面的这几段代码,每一个都有特定于其项目的代码,但都包含公共的代码。EYs每天发布大量与生活相关的资讯平台

第一段代码:EYs每天发布大量与生活相关的资讯平台

InputStream is= ...; EYs每天发布大量与生活相关的资讯平台

finalBitmapFactory.Options options = newBitmapFactory.Options(); EYs每天发布大量与生活相关的资讯平台

options.inSampleSize = 2; EYs每天发布大量与生活相关的资讯平台

Bitmap bmp = BitmapFactory.decodeStream( is, null, options); EYs每天发布大量与生活相关的资讯平台

ImageView imageView = ...; EYs每天发布大量与生活相关的资讯平台

imageView.setImageBitmap(bmp); EYs每天发布大量与生活相关的资讯平台

// some more codeEYs每天发布大量与生活相关的资讯平台

第二段代码:EYs每天发布大量与生活相关的资讯平台

BitmapFactory.Options options = newBitmapFactory.Options(); EYs每天发布大量与生活相关的资讯平台

while(...) { EYs每天发布大量与生活相关的资讯平台

in= ...; EYs每天发布大量与生活相关的资讯平台

options.inSampleSize = 2; EYs每天发布大量与生活相关的资讯平台

options.inJustDecodeBounds = false; EYs每天发布大量与生活相关的资讯平台

bitmap = BitmapFactory.decodeStream( in, null, options); EYs每天发布大量与生活相关的资讯平台

} EYs每天发布大量与生活相关的资讯平台

基于上述的方法,Aroma会对第一段代码和第二段代码进行比较,来找到公共代码。第一段代中关于ImageView的代码,没有出现在第二段代码中,因此将被删除。结果如下所示:EYs每天发布大量与生活相关的资讯平台

InputStream is= ...; EYs每天发布大量与生活相关的资讯平台

finalBitmapFactory.Options options = newBitmapFactory.Options(); EYs每天发布大量与生活相关的资讯平台

options.inSampleSize = 2; EYs每天发布大量与生活相关的资讯平台

Bitmap bmp = BitmapFactory.decodeStream( is, null, options); EYs每天发布大量与生活相关的资讯平台

然后,将得到代码与第三段代码,第四段代码进行比较……EYs每天发布大量与生活相关的资讯平台

修剪之后剩下的代码,就是所有方法中常见的代码,它将成为最后被推荐的代码。EYs每天发布大量与生活相关的资讯平台

其他被推荐的代码,也是以这样的过程创建出来的。EYs每天发布大量与生活相关的资讯平台

此外,Aroma的算法也可以确保这些推荐彼此之间有很大的不同,因此程序员可以看到几个不同的代码,来学习各种各样的编程模式。EYs每天发布大量与生活相关的资讯平台

程序员们的担忧 EYs每天发布大量与生活相关的资讯平台

虽然这一工具受到了不少程序员的好评, 但也有一些程序员表达了不一样的观点。EYs每天发布大量与生活相关的资讯平台

有人在Hacker News上表示,这也许就是自己作为程序员职业生涯结束的开始。EYs每天发布大量与生活相关的资讯平台

EYs每天发布大量与生活相关的资讯平台

也有人说,这个工具似乎是试图强迫机器学习解决实际上没有人有问题的例子。EYs每天发布大量与生活相关的资讯平台

他说,很多人搜索习惯用法的主要用例,就是知道如何进行高级别的重构,而不是获得相似的代码。EYs每天发布大量与生活相关的资讯平台

EYs每天发布大量与生活相关的资讯平台

此外,也有人担忧有人写错了代码,它会不会在其他代码库中大肆传播……EYs每天发布大量与生活相关的资讯平台

EYs每天发布大量与生活相关的资讯平台

你觉得呢?这一工具,对于程序员来说,影响几何?欢迎在评论区给出你的看法。EYs每天发布大量与生活相关的资讯平台

传送门 EYs每天发布大量与生活相关的资讯平台

Aroma论文链接:EYs每天发布大量与生活相关的资讯平台

Aroma: Code Recommendation via Structural Code SearchEYs每天发布大量与生活相关的资讯平台

https://arxiv.org/abs/1812.01158EYs每天发布大量与生活相关的资讯平台

EYs每天发布大量与生活相关的资讯平台

订阅AI内参,获取AI行业资讯EYs每天发布大量与生活相关的资讯平台

喜欢就点「好看」吧 !EYs每天发布大量与生活相关的资讯平台

也许你还喜欢

Win 11市占率持续下滑!CQ9游戏用户

尽管微软早已预告明年淘汰Windows 10,但用户升级至Windows 11的意愿却持续偏低

steam账号能改吗怎么改 steam找不

steam账号能改吗 steam账号不能改。但用户可以更改账号的昵称,即加好友时显示的账号

steam自我锁定解锁代码在哪 steam

steam自我锁定解锁代码在哪 1、打开Steam客户端,并登录您的账户。 2、点击右上角的

steam怎么离线登录图文详解 steam

steam怎么离线登录图文详解,steam怎么关闭离线状态,steam离线登录能玩游戏吗,steam离线模

电脑有网但steam进不去图文教程 有

电脑有网但steam进不去图文教程,有网steam打不开怎么办,怎么解决steam无法打开的问题,ste

steam账号被盗人工客服解决方法图

steam账号被盗人工客服解决方法图文详解,steam账号被盗了如何找回,steam账号怎么找回,ste

steam导入本地游戏图文详解 怎么添

steam导入本地游戏图文详解,怎么添加非steam的本地游戏,steam怎么备份和恢复游戏,steam打

steam无法下载游戏解决方法步骤详

steam无法下载游戏解决方法步骤详解,steam下载游戏为什么会失败,为什么我的steam下载不

steam老是错误代码解决方法图文教

steam老是错误代码解决方法图文教程,steam错误代码102怎么解决,Steam错误代码118最新解

steam钱包充值自定义金额图文介绍

steam钱包充值自定义金额图文介绍,steam钱包怎么充值,steam钱包充值码怎么获得,steam钱包