本文经AI新媒体量子比特(公众号ID:QbitAI)授权转载,转载请联系出处。自由程序员,Facebook是认真的。这家社交网络巨头在其官方博客上宣布推出面向程序员的工具Aroma。直击程序员想实现功能却不会写代码的痛点。它可以帮助程序员轻松找到可以“引用”的代码,从而节省他们在日常开发工作流程中的时间和精力。比如Android程序员想知道别人怎么解码手机里的位图,可以直接用下面的代码搜索:Bitmapbitmap=BitmapFactory.decodeStream(input);然后,Aroma会给出一些代码推荐:finalBitmapFactory。Optionsoptions=newBitmapFactory.Options();options.inSampleSize=2;//...Bitmapbmp=BitmapFactory.decodeStream(is,null,options);这段代码来自与五实现类似功能的代码,但去掉了相关细节,以供程序员更好的参考。此外,Aroma还可以集成在编码环境中。Facebook表示,使用这个工具,程序员不再需要像以前那样手动浏览几十个代码搜索结果。它可以在几秒钟内提出建议,即使代码库非常大,也不需要提前进行模式挖掘。现在,Facebook已经在自己的内部代码库中使用它,并为其一些开源项目创建了Aroma版本。该工具出现后,引起了极大的关注。甚至有人在推特上评论说,程序员这个职业可以被重新定义。脸书是怎么做到的?向程序员推荐代码使用Aroma向程序员推荐代码,主要分为3个阶段:***、基于特征的搜索。首先,Aroma解析语料库中的每个代码,创建其解析树,并将代码集索引为稀疏矩阵。然后,从每个代码的解析树中提取一组结构特征。这些结构特征经过精心挑选,以捕获每个代码的用法、调用方法和结构信息。然后,根据每个代码的特点,为其创建一个稀疏向量。***,所有编码的特征向量组成一个索引矩阵,用于搜索检索。当程序员编写新代码时,Aroma以上述方式创建一个稀疏向量,并将该向量与包含所有现有代码的特征向量的矩阵相乘。点积***的前1000个代码将被检索作为推荐代码的候选。尽管一个代码语料库可以包含数百万个代码,但这种检索可以很快,因为可以非常有效地实现稀疏向量和矩阵的点积。第二,重新排序和集群。通过检索得到候选推荐码集后,下一步就是对它们进行聚类。为此,Aroma首先根据候选代码与查询代码的相似性对其进行重新排序。因为稀疏向量只包含关于存在哪些特征的抽象信息,所以点对点分数低估了代码之间的实际相似性。因此,Aroma对方法语法树进行剪枝,去除方法体中不相关的部分,只保留与查询片段最匹配的部分,并根据候选代码片段与查询的实际相似度重新排序。在获得最佳排序列表后,Aroma运行迭代聚类算法来查找相似的代码片段,并在创建代码时推荐额外的代码语句。第三,使用交叉算法创建推荐代码。交叉算法的工作原理是将所有推荐代码的第一个片段作为“基本”代码,然后将其与其余代码进行比较,并迭代地“修剪”它。例如,下面的代码片段,每个都有其项目特定的代码,但都包含通用代码。***代码段:InputStreamis=...;finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();options.inSampleSize=2;Bitmapbmp=BitmapFactory.decodeStream(is,null,options);ImageViewimageView=...;imageView。setImageBitmap(bmp);//somemorecode第二段代码:BitmapFactory.Optionsoptions=newBitmapFactory.Options();while(...){in=...;options.inSampleSize=2;options.inJustDecodeBounds=false;bitmap=BitmapFactory.decodeStream(in,null,options);}基于上述方法,Aroma会比较第一段代码和第二段代码,找出共同的代码。***段关于ImageView的代码在第二段代码中没有出现,所以删掉。结果如下:InputStreamis=...;finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();options.inSampleSize=2;Bitmapbmp=BitmapFactory.decodeStream(is,null,options);然后,会得到代码和第三段代码,第四段代码进行对比……剪枝后剩余的代码是所有方法中的公共代码,会成为最推荐的代码。其他推荐代码以相同方式创建。此外,Aroma的算法还可以确保这些推荐彼此之间有很大的不同,因此程序员可以看到几个不同的代码来学习各种编程模式。程序员的顾虑虽然这个工具受到了很多程序员的好评,但是也有一些程序员表达了不同的看法。有人在HackerNews上表示,这可能是他程序员生涯结束的开始。也有人说,该工具似乎是试图迫使机器学习解决实际上没有人遇到的问题的一个例子。他说,很多人搜索习语的主要用例是知道如何进行高级重构,而不是获得类似的代码。还有,有人担心有人写错了代码,会在其他代码库中疯狂传播……你怎么看?这个工具对程序员有什么影响?欢迎在评论区发表你的看法。传送门Aroma论文链接:Aroma:CodeRecommendationviaStructuralCodeSearchhttps://arxiv.org/abs/1812.01158
