专栏首页量子位重新定义程序员职业,Facebook推出代码推荐工具Aroma

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

乾明 发自 凹非寺 量子位 出品 | 公众号 QbitAI

解放程序员,Facebook是认真的。

这一社交网络巨头在其官方博客上宣布,推出面向程序员的工具Aroma

直击程序员想实现功能,而不知道如何写代码的痛点。

它能帮助程序员轻松地找到可以“参考使用”的代码,节省他们日常开发工作流程中的时间和精力。

比如,一个安卓程序员想要了解其他人如何解码手机中的bitmap,他可以使用下面的这些代码直接进行搜索:

Bitmap bitmap = BitmapFactory.decodeStream(input);

然后,Aroma会给出一些代码推荐:

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
// ...
Bitmap bmp = BitmapFactory.decodeStream(is, null, options);

这段代码来自与五个实现类似功能的代码,但是去除了相关细节,以便程序员更好地参考。

除此之外,Aroma也能够集成在编码环境中。

Facebook表示,使用这一工具,程序员再也不用像原来那样,自己手动浏览几十个代码搜索结果了。

哪怕代码库非常大,它也能在几秒钟内给出推荐,并且不需要提前进行模式挖掘。

现在,Facebook已经将其用到了自己内部代码库中,并为其一些开源项目创建了Aroma版本。

这一工具亮相之后,便引发了巨大的关注。

甚至有人在Twitter上评论称,可以重新定义程序员这一职业。

Facebook是如何做到的?

给程序员推荐代码

用Aroma给程序员推荐代码,主要分为3个阶段:

第一,基于特征的搜索。

首先,Aroma会解析语料库中的每个代码,并创建其解析树,并将代码集索引为稀疏矩阵。

然后,从每个代码的解析树中提取一组结构特征。这些结构特征都是经过精心选择的,可以捕捉每个代码的用法、调用方法和结构信息。

进而根据每个代码的特点,为其创建稀疏向量。

最后,所有代码的特征向量构成索引矩阵,用于搜索检索。

当一个程序员编写新的代码时,Aroma会以上述的方式创建一个稀疏向量,并将该向量与包含所有现有代码的特征向量的矩阵相乘。

点积最高的前1000个代码会被检索出来,作为推荐代码的候选。

尽管代码语料库可以包含数百万种代码,但由于稀疏向量和矩阵的点积能够非常高效的实现,这种检索的速度会很快。

第二,重新排序和聚类。

通过检索得到推荐代码的候选集之后,接下来就是对其进行聚类。为了做到这一点,Aroma要先根据候选的各个代码和查询代码的相似性来对它们进行重新排序。

因为稀疏向量只包含关于存在哪些特征的抽象信息,所以点积分数低估了代码之间的实际相似性。

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

在获得了最后的排序列表之后,Aroma会运行一个迭代的聚类算法来寻找相似的代码片段,并在创建代码时推荐额外的代码语句。

第三,用交叉算法创建代码进行推荐。

交叉算法的工作原理,是将所有推荐代码中的第一个代码片段作为“基础”代码,然后与其余的代码进行对比,迭代地对其进行“修剪”。

比如下面的这几段代码,每一个都有特定于其项目的代码,但都包含公共的代码。

第一段代码:

InputStream is = ...;
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bmp = BitmapFactory.decodeStream(is, null, options);
ImageView imageView = ...;
imageView.setImageBitmap(bmp);
// some more code

第二段代码:

BitmapFactory.Options options = new BitmapFactory.Options();
while (...) {
  in = ...;
  options.inSampleSize = 2;
  options.inJustDecodeBounds = false;
  bitmap = BitmapFactory.decodeStream(in, null, options);
}

基于上述的方法,Aroma会对第一段代码和第二段代码进行比较,来找到公共代码。第一段代中关于ImageView的代码,没有出现在第二段代码中,因此将被删除。结果如下所示:

InputStream is = ...;
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bmp = BitmapFactory.decodeStream(is, null, options);

然后,将得到代码与第三段代码,第四段代码进行比较……

修剪之后剩下的代码,就是所有方法中常见的代码,它将成为最后被推荐的代码。

其他被推荐的代码,也是以这样的过程创建出来的。

此外,Aroma的算法也可以确保这些推荐彼此之间有很大的不同,因此程序员可以看到几个不同的代码,来学习各种各样的编程模式。

程序员们的担忧

虽然这一工具受到了不少程序员的好评, 但也有一些程序员表达了不一样的观点。

有人在Hacker News上表示,这也许就是自己作为程序员职业生涯结束的开始。

也有人说,这个工具似乎是试图强迫机器学习解决实际上没有人有问题的例子。

他说,很多人搜索习惯用法的主要用例,就是知道如何进行高级别的重构,而不是获得相似的代码。

此外,也有人担忧有人写错了代码,它会不会在其他代码库中大肆传播……

你觉得呢?这一工具,对于程序员来说,影响几何?欢迎在评论区给出你的看法。

传送门

Aroma论文链接:

Aroma: Code Recommendation via Structural Code Search https://arxiv.org/abs/1812.01158

本文分享自微信公众号 - 量子位(QbitAI),作者:关注前沿科技

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 中国团队首次夺冠FPS游戏AI竞赛VizDoom,清华腾讯AI联手

    在荷兰刚刚结束的 IEEE CIG 计算智能与游戏大会上,清华大学张钹院士领导的人工智能创新团队 TSAIL 在第一人称射击类游戏《毁灭战士》(Doom)AI竞...

    量子位
  • GitHub遭攻击!黑客给出十天限期:不交比特币赎金,就公开用户私有代码

    就在五一假期的最后一天,一些程序员查看自己托管到GitHub上的代码时发现,他们的源代码和Repo都已消失不见,取而代之的是黑客留下的一封勒索信!

    量子位
  • AI创业者的“英雄联盟”,腾讯AI加速器二期项目招募开启

    2017年7月21日,腾讯AI加速器首期正式启动,上千个AI创业项目经过为期3个月的选拔,最终正式入选汇医慧影等25个优秀项目。在为期6个月的加速期中,25个项...

    量子位
  • 怎样编写高质量的Java代码

    代码质量概述 怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍...

    用户1257393
  • 所有程序员都应该遵守的11条规则

    我是一个倾向于生活在规则下的人。 现在,这些规则大部分是我本人为自己设立的-但它们依然是规则。 我发现为自己创建规则可以让我过得更好,因为这样做可以提前决定一些...

    用户1667431
  • 淘宝重磅开源代码质量检测工具!

    来源:github.com/ice-lab/iceworks/tree/master/

    开发者技术前线
  • 改和看别人的代码是一种什么感受

    工作里面可能会沉淀下来很多的东西,比如文档,代码/脚本,或者图片,甚至你留下的趣事或者“案底”。 对于修改代码,我很多年前就体验过一次,是修改自己写的代码,记...

    jeanron100
  • 顶尖程序员的五种思维模式,你具备吗?

    转自:程序人生(coder_life) 《THe Effective Engineer》的作者Edmond Lau采访了很多硅谷顶级科技公司的顶尖软件工程师。...

    顶级程序员
  • 微软发布代码智能新基准数据集CodeXGLUE,多角度衡量模型优劣

    编者按:代码智能(code intelligence)目的是让计算机具备理解和生成代码的能力,并利用编程语言知识和上下文进行推理,支持代码检索、补全、翻译、纠错...

    AI科技大本营
  • 斐波那契数列是一个递归计算

扫码关注云+社区

领取腾讯云代金券