重新定義程序員職業(yè),F(xiàn)acebook推出代碼推薦工具Aroma
本文經(jīng)AI新媒體量子位(公眾號(hào)ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)聯(lián)系出處。
解放程序員,F(xiàn)acebook是認(rèn)真的。
這一社交網(wǎng)絡(luò)巨頭在其官方博客上宣布,推出面向程序員的工具Aroma。
直擊程序員想實(shí)現(xiàn)功能,而不知道如何寫(xiě)代碼的痛點(diǎn)。
它能幫助程序員輕松地找到可以“參考使用”的代碼,節(jié)省他們?nèi)粘i_(kāi)發(fā)工作流程中的時(shí)間和精力。
比如,一個(gè)安卓程序員想要了解其他人如何解碼手機(jī)中的bitmap,他可以使用下面的這些代碼直接進(jìn)行搜索:
- Bitmap bitmap = BitmapFactory.decodeStream(input);
然后,Aroma會(huì)給出一些代碼推薦:
- final BitmapFactory.Options options = new BitmapFactory.Options();
- options.inSampleSize = 2;
- // ...
- Bitmap bmp = BitmapFactory.decodeStream(is, null, options);
這段代碼來(lái)自與五個(gè)實(shí)現(xiàn)類(lèi)似功能的代碼,但是去除了相關(guān)細(xì)節(jié),以便程序員更好地參考。
除此之外,Aroma也能夠集成在編碼環(huán)境中。

Facebook表示,使用這一工具,程序員再也不用像原來(lái)那樣,自己手動(dòng)瀏覽幾十個(gè)代碼搜索結(jié)果了。
哪怕代碼庫(kù)非常大,它也能在幾秒鐘內(nèi)給出推薦,并且不需要提前進(jìn)行模式挖掘。
現(xiàn)在,F(xiàn)acebook已經(jīng)將其用到了自己內(nèi)部代碼庫(kù)中,并為其一些開(kāi)源項(xiàng)目創(chuàng)建了Aroma版本。
這一工具亮相之后,便引發(fā)了巨大的關(guān)注。
甚至有人在Twitter上評(píng)論稱(chēng),可以重新定義程序員這一職業(yè)。

Facebook是如何做到的?
給程序員推薦代碼

用Aroma給程序員推薦代碼,主要分為3個(gè)階段:
***,基于特征的搜索。
首先,Aroma會(huì)解析語(yǔ)料庫(kù)中的每個(gè)代碼,并創(chuàng)建其解析樹(shù),并將代碼集索引為稀疏矩陣。
然后,從每個(gè)代碼的解析樹(shù)中提取一組結(jié)構(gòu)特征。這些結(jié)構(gòu)特征都是經(jīng)過(guò)精心選擇的,可以捕捉每個(gè)代碼的用法、調(diào)用方法和結(jié)構(gòu)信息。
進(jìn)而根據(jù)每個(gè)代碼的特點(diǎn),為其創(chuàng)建稀疏向量。
***,所有代碼的特征向量構(gòu)成索引矩陣,用于搜索檢索。
當(dāng)一個(gè)程序員編寫(xiě)新的代碼時(shí),Aroma會(huì)以上述的方式創(chuàng)建一個(gè)稀疏向量,并將該向量與包含所有現(xiàn)有代碼的特征向量的矩陣相乘。
點(diǎn)積***的前1000個(gè)代碼會(huì)被檢索出來(lái),作為推薦代碼的候選。
盡管代碼語(yǔ)料庫(kù)可以包含數(shù)百萬(wàn)種代碼,但由于稀疏向量和矩陣的點(diǎn)積能夠非常高效的實(shí)現(xiàn),這種檢索的速度會(huì)很快。

第二,重新排序和聚類(lèi)。
通過(guò)檢索得到推薦代碼的候選集之后,接下來(lái)就是對(duì)其進(jìn)行聚類(lèi)。為了做到這一點(diǎn),Aroma要先根據(jù)候選的各個(gè)代碼和查詢(xún)代碼的相似性來(lái)對(duì)它們進(jìn)行重新排序。
因?yàn)橄∈柘蛄恐话P(guān)于存在哪些特征的抽象信息,所以點(diǎn)積分?jǐn)?shù)低估了代碼之間的實(shí)際相似性。
因此,Aroma對(duì)方法語(yǔ)法樹(shù)進(jìn)行修剪,去掉方法主體中不相關(guān)的部分,只保留與查詢(xún)片段最匹配的部分,并根據(jù)候選代碼片段與查詢(xún)的實(shí)際相似性對(duì)其重新排序。
在獲得了***的排序列表之后,Aroma會(huì)運(yùn)行一個(gè)迭代的聚類(lèi)算法來(lái)尋找相似的代碼片段,并在創(chuàng)建代碼時(shí)推薦額外的代碼語(yǔ)句。

第三,用交叉算法創(chuàng)建代碼進(jìn)行推薦。
交叉算法的工作原理,是將所有推薦代碼中的***個(gè)代碼片段作為“基礎(chǔ)”代碼,然后與其余的代碼進(jìn)行對(duì)比,迭代地對(duì)其進(jìn)行“修剪”。
比如下面的這幾段代碼,每一個(gè)都有特定于其項(xiàng)目的代碼,但都包含公共的代碼。
***段代碼:
- 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會(huì)對(duì)***段代碼和第二段代碼進(jìn)行比較,來(lái)找到公共代碼。***段代中關(guān)于ImageView的代碼,沒(méi)有出現(xiàn)在第二段代碼中,因此將被刪除。結(jié)果如下所示:
- InputStream is = ...;
- final BitmapFactory.Options options = new BitmapFactory.Options();
- options.inSampleSize = 2;
- Bitmap bmp = BitmapFactory.decodeStream(is, null, options);
然后,將得到代碼與第三段代碼,第四段代碼進(jìn)行比較……
修剪之后剩下的代碼,就是所有方法中常見(jiàn)的代碼,它將成為***被推薦的代碼。
其他被推薦的代碼,也是以這樣的過(guò)程創(chuàng)建出來(lái)的。
此外,Aroma的算法也可以確保這些推薦彼此之間有很大的不同,因此程序員可以看到幾個(gè)不同的代碼,來(lái)學(xué)習(xí)各種各樣的編程模式。
程序員們的擔(dān)憂(yōu)
雖然這一工具受到了不少程序員的好評(píng), 但也有一些程序員表達(dá)了不一樣的觀點(diǎn)。
有人在Hacker News上表示,這也許就是自己作為程序員職業(yè)生涯結(jié)束的開(kāi)始。

也有人說(shuō),這個(gè)工具似乎是試圖強(qiáng)迫機(jī)器學(xué)習(xí)解決實(shí)際上沒(méi)有人有問(wèn)題的例子。
他說(shuō),很多人搜索習(xí)慣用法的主要用例,就是知道如何進(jìn)行高級(jí)別的重構(gòu),而不是獲得相似的代碼。

此外,也有人擔(dān)憂(yōu)有人寫(xiě)錯(cuò)了代碼,它會(huì)不會(huì)在其他代碼庫(kù)中大肆傳播……

你覺(jué)得呢?這一工具,對(duì)于程序員來(lái)說(shuō),影響幾何?歡迎在評(píng)論區(qū)給出你的看法。
傳送門(mén)
Aroma論文鏈接:
Aroma: Code Recommendation via Structural Code Search
https://arxiv.org/abs/1812.01158