重新定義程式設計師職業,Facebook推出程式碼推薦工具Aroma
解放程式設計師,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