天天看點

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

作者 | 梧忌
什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

毫無疑問,人工智能将改變軟體開發的方式 —— 我們已經看到了一些嘗試将人工智能應用到軟體開發所帶來的好處,例如“程式代碼自動生成”:根據圖像生成代碼、通過資料模型生成代碼……今天我感興趣的是,一個普通的開發者是否已經有了一些有用的工具,這些工具使用人工智能技術提高了他的生産力。

我将目光放到了常見的程式設計領域,搜尋了一些稱之為「智能程式設計」的工具,并嘗試在它們的幫助下完成一個簡單的實驗:編寫一個具有輸入框和内容的界面,内容的會随着輸入框的輸入而發生變化。由此來觀察這些工具提供了哪些能力,是否對我們的程式設計工作産生了實際性的幫助。

實驗示例代碼如下:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
筆者完全認同人工智能可以幫助軟體開發的所有階段,而不僅僅是在代碼級别。

VS Code 所帶來的啟發

VS Code 是目前最受前端開發者歡迎的編輯器,它預設提供了一些智能化的功能,普通開發者可以快速上手體驗這些功能。我們從它入手來介紹編輯器領域的一些概念和專有名詞。

智能提示(IntelliSense)

IntelliSense 是 VS Code 内置的一系列功能,包含了代碼補全(Code Completion)、概況資訊顯示(Quick Info)、函數簽名顯示(Parameter Info)等。

VS Code 預設為為 JavaScript/TypeScript、HTML、CSS/SCSS/Less 等語言提供了智能提示,也可以通過安裝語言插件為更多的語言添加智能提示功能。

代碼補全(Code Completion)

VS Code 智能提示功能由 VS Code 的語言服務提供支援。語言服務提供了基于語言語義和源代碼分析的代碼補全能力。具體來說,如果語言服務知道可能完成輸入,則建議的補全清單将在你鍵入後彈出:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

如果繼續鍵入字元,則補全清單(變量、方法等)将被篩選,僅包含包含鍵入字元的清單:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

VS Code 智能提示提供了豐富類型的補全提示,包括語言服務的建議、代碼片段(Snippet)和簡單的基于單詞的文本補全。

補全清單内,它們的排序優先級(Sorting of Suggestions)如下:

  • 語言服務的建議
  • 代碼片段
  • 全局辨別符
  • 簡單的基于單詞的文本
在單項内以字母順序進行排序

幾點特殊的說明:

就近原則
什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

在上面的圖檔中,你可以看到 count、context 和 colocated 是根據它們出現的範圍(loop、function、file)進行排序的。

就近原則的上下文提示預設是不開啟的,你可以通過 editor.suggest.localityBonus 設定來開啟。
代碼片段的優先級

你可以使用 editor.snippetSuggestions 設定代碼片段在代碼補全清單中是否顯示及優先級。要從代碼補全清單中删除代碼片段,請将值設定為“none”。如果你想檢視代碼片段,可以指定其在代碼補全清單上的順序:在頂部(“top”)、在底部(“bottom”)或按字母順序内聯(“inline”)。預設值為“inline”。

代碼補全清單的建議完成項

預設情況下,VS Code 在代碼補全清單中預先選擇以前使用的項目。如果你想要不同的行為,例如,總是選擇建議清單中的第一項,你可以使用 editor.suggestSelection 設定。

可用的值包括:

  • first:始終選擇頂部清單項。
  • recentlyUsed:(預設)除非字首(要選擇的類型)選擇其他項目,否則将選擇以前使用的項目。
  • recentlyUsedByPrefix:根據以前補全的建議的字首來選擇項目。

清單項的概況顯示(Quick Info)

在代碼補全清單上,你可以通過單擊清單項右側的圖示來檢視每個補全項的概況資訊,該補全項的附帶文檔将擴充到側面。展開的文檔将保持不變,并在你浏覽清單時更新。你可以通過單擊“關閉”圖示來關閉此視窗:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

函數簽名資訊(Parameter Info)

當你在代碼補全清單上選擇了一個函數(方法)後,将顯示有關函數簽名的資訊。當有多個參數時,突出顯示(下劃線高亮)目前正在補全的參數:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

智能操作(Code Actions)

除提示外,VS Code 還内置提供了一些可由開發者主動操作的智能編碼手段。

代碼重構(Refactoring)

代碼重構提供了諸如提取函數和提取變量等功能。在 VS Code 代碼編輯中,隻需選擇你要提取的源代碼,然後單擊槽中的燈泡或按(⌘)即可檢視可用的重構方式:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

代碼重構的能力是由語言服務提供的,是以,不同的語言所能做的代碼重構不盡相同。VS Code 通過 TypeScript 語言服務内置了對 TypeScript 和 JavaScript 的代碼重構支援。

更多關于代碼重構的功能,可參考 TypeScript 語言服務的重構章節。

快速修複(Quick Fixes)

快速修複是由語言服務提供的診斷程式,可以用來查找常見的程式設計問題。例如,它可以分析你的源代碼并檢測出永遠都不會執行的代碼,這些代碼在編輯器中顯示為灰色。如果你将滑鼠懸停在這樣源代碼行上,你可以看到一個懸停說明,如果你将光标放在該行上,你将得到一個快速修複燈泡:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

不同語言所能做的快速修複不盡相同,VS Code 對 TypeScript 和 JavaScript 内置的快速修複有:

  • 向成員通路添加缺少的 this
  • 修複拼寫錯誤的屬性名稱
  • 删除無法通路的代碼或未使用的導入

開發者可以通過安裝語言插件添加更多快速修複功能。

實驗示範

在沒有安裝任何外部插件的情況下,我嘗試通過 VS Code 完成示例中的代碼,效果如下:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
  • 介紹章節羅列的功能大部分都在示範中觸發了
  • 代碼補全提示類型不多,有語言關鍵字、名稱表達式和屬性表達式的類型補全
  • 代碼補全的正确率不高,多為單詞和全局變量提示
  • 我嘗試安裝了 @types/react,有了語言語義的支援後,React API 的代碼提示的效率明顯變高了

業界有哪些産品?

Visual Studio IntelliCode

Visual Studio IntelliCode(以下簡稱 VS IntelliCode)是微軟官方 2018 年 7 月 推出的智能代碼插件,在 2019 年 8 月釋出正式版本,最近一次更新是今年 6 月底。IntelliCode 支援多種程式設計語言(JavaScript/C++/Python),它在 VS Code 插件市場有高達六百萬的下載下傳量。

IntelliCode for VS Code

IntelliCode 号稱能基于對代碼上下文的了解和機器學習的結合提供智能輔助開發功能。具體來說,提供了以下幾個功能。

第一個功能是更智能的代碼補全。常見的代碼補全是根據字母順序來進行排序的,VS IntelliCode 則根據上下文和「了解你的使用習慣」的來對一些方法進行了排序提取,供開發者使用的最可能正确的 API。在下面顯示的示例中,可以看到 IntelliCode 提升的預測 API 出現在清單頂部的一個新部分中,成員字首為一個星形圖示:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

這樣的功能還能運用在寫 React 元件屬性時:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

第二個功能是參數的智能補全。具體來說,即當你輸入函數閉合後,将提示你以哪個變量來作為函數的參數。

例如下面的代碼:

try {
 // do something...
} catch (error) {
 // do something...
 console.error(); 
 // 當你輸入了 console.error() 後,編輯器光标會在 error 方法内
 // 并出現補全清單,第一項便是 catch 裡傳入的 error 變量。
}           

可惜該功能對 TypeScript 和 Javascript 不可用,官網列出了在 C+ 中的示例:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

第三個功能是代碼重建構議。官網給出的示例是當我們用同樣的方法更新了多處代碼:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

插件會在代碼插槽處顯示更新燈泡圖示,點選更新燈泡圖示将告知我們還有哪些可以以同樣方式更新的代碼:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

點選清單項即可定位到可執行建議更新的代碼處,在代碼旁的插槽處可以應用建議的更改:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

這個功能似乎用處不大,畢竟在我們進行代碼重構的時候可以通過使用正規表達式搜尋替換的方式一次性更新所有代碼。也許其強大之處在于你是在「不自覺中」更新了兩處一樣的代碼(它會在本地跟蹤你的編輯過程和内容并檢測可重複應用的内容),然後插件給予你還可以更新更多類似代碼的提示吧。

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

IntelliCode 主要是豐富了屬性表達式的補全,在我們的實驗中,其補全效率與原生 VS Code 并無明顯差異。

Kite

Kite 是由一家矽谷的創業公司于 2017 年 3 月推出的代碼智能編輯輔助工具,支援在多個 IDE 中以插件的方式嵌入,其提供的 VS Code 插件最近一次更新是今年 7 月中。Kite 起初隻适用于 Python,目前部分功能已支援 Javascript。它在 VS Code 插件市場有高達一百萬的下載下傳量,是 Python 社群最受歡迎的 VS Code 插件之一。

Kite 母公司在 2019 年初獲得了 A 輪 1700 萬美元的融資,目前提供了免費版本和付費方案。

Kite for VS Code

Kite 官網介紹了其 智能代碼補全 功能,Kite 提供的代碼補全與典型的代碼補全方式不同的地方有:

1、為幾乎所有 JavaScript 代碼提供補全,比如語句、函數、對象等等,例如在空格後:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

2、與隻有單詞補全相比,Kite 提供了整行或多行的代碼補全:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

3、Kite 可以猜測你當下最有可能進行的輸入,提供智能的推薦:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
Using the VS Code plugin for JavaScript

除了代碼補全,Kite 還提供了智能代碼片段、智能代碼搜尋、文檔搜尋等功能,但這些功能目前僅支援 Python 語言。

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
  • Kite 的代碼補全類型更加豐富,補全效率也明顯比前兩者要高
  • Kite 的代碼補全清單選項不多,我猜想是為了提高正确率。從實際效果來看,觸發的補全項普遍是正确的
  • Kite 的代碼補全響應速度與 VS Code 原生功能相比,沒有感受到明顯的差異

TabNine

TabNine 的第一個版本于 2018 年底推出,支援在多個 IDE 中以插件的方式嵌入,其提供的 VS Code 插件最近一次更新今年 7 月底。TabNine 的程式設計語言的覆寫度非常高,支援大多數常用的程式設計語言(JavaScript/Java/Python……),其在 VS Code 插件市場有高達三十萬的下載下傳量。

TabNine 最早是社群的開源軟體,今年年初被 Codota 收購,Codata 今年四月份宣布獲得了 1200 萬美元的融資,目前提供了免費版本和付費方案。

TabNice for VS Code

比 VS IntelliCode 提供 API 自動補全更進一步, TabNine 提供了全方位的代碼補全。隻要你在編輯器中鍵入,TabNine 就會給予自動補全提醒。TabNine 官網用了三個示例來描述自己的能力。分别是:

1、基于注釋推導可能編寫的代碼,例如根據函數的注釋推導能使用的函數名、參數和傳回值類型

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

2、基于上下文推導出可能使用的 API 和傳遞的參數:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

3、了解常用庫的使用模式(最佳實踐),并根據上下文給出代碼補全的建議:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
  • TabNine 實作了全類型補全,可以看到在每一次輸入 TabNine 都會出現代碼補全清單提示我們可能進行的輸入
  • 由于提示頻率高,是以正确率則不如 Kite,但 TabNine 比較讨喜地在在右側面闆用百分比顯示可能的比對度,對使用者程式設計體驗沒有感受到有太大的幹擾
  • TabNine 的代碼補全響應速度與 VS Code 原生功能相比,沒有感受到明顯的差異

aiXcoder

aiXcoder 的第一個版本于 2018 年中旬推出,2019 年底推出了 VS Code 插件,該插件最近一次更新是今年 5 月初。aiXcode 支援多種主流 IDE (IntelliJ IDEA/Eclipse/VS Code)和主流程式設計語言(JavaScript/Java/Python),主打 IntelliJ IDE 和 Java 語言。可能是由于推出時間不久,而且個人版本僅支援 Java ,是以它在 VS Code 插件市場下載下傳量不高,隻有 3k+ 的下載下傳量。由于是國産軟體且功能文檔較為全面,是以也在此次調研清單裡。

aiXcoder 創始團隊來自北京大學實驗室,負責人是北大的副教授李戈老師,是一個是校企合作項目,其母公司矽心科技 18 年獲得了百萬人民币的天使投資。aiXcoder 提供了個人版本和企業版本。

aiXcoder for VS Code

aiXCode 官網對自己提供的功能進行了較為完整體系的介紹,根據其分類,提供的功能有:

代碼智能補全

  • 單 Token 補全:即變量名、對象屬性、對象方法等輸入的補全;
  • 多 Token 補全:記得鍊式調用嗎?如果有必要,會出現多個鍊式 API 的推薦補全,例如:document.getElementById('foo').style.top
  • 整行補全:即輸入 f,補全提示 for (let i =0, j = foo.length; j >= i; i++)
  • 多行補全:一次性補全多行代碼
什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
  • 連續多次補全:當戶确認了 aiXcoder 的推薦結果後,aiXcoder 随即給出接下來的推薦代碼
  • 函數參數自動補全:即當使用者在調用某個函數(方法)時,提示可能輸入的參數
什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

代碼智能搜尋

  • 文檔搜尋,輸入關鍵字可以搜尋出相應的文檔和示例;
  • 相似代碼搜尋,選中一部分代碼,在 Github 中搜尋出相似的代碼,點選進行替換;在自己倉庫中搜尋出功能實作相似度高的代碼;
  • 推薦代碼搜尋,輸入要實作的功能描述(中文),推薦出可供使用的代碼。
什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

程式設計智能質效

通過智能分析,得出項目的品質和效率情況,幫助開發者持續進行提高。

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

由于 aiXcode 的個人版本僅支援 Java 語言,是以無法就我們的示例來進行實驗。

大公司

Facbook

Facebook 人工智能實驗室在 2019 年四月釋出了 Aroma。Aroma是一個代碼搜尋和推薦工具,它使用機器學習技術使得從大型代碼庫中獲得有效的代碼進行程式設計輔助變得更容易和有效。通過展示與開發者正試圖編寫的代碼類似的示例(并假設這些示例對應于作為公司代碼庫一部分的高品質代碼),這個建議可以幫助開發者更快地完成功能,也可以幫助開發者盡早發現可能的錯誤或重構機會,如示例中缺少異常的處理:

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

Google

我沒有從公開的資料和新聞中找到 Google 關于人工智能自動程式設計或輔助程式設計的工具。但發現了 Google 對于這方面有一些研究成果。例如,Google Brain 的一個團隊層發表了一篇名為《用于模組化源代碼編輯的神經網絡》的論文,他們在該論文中訓練了一個網絡,其中包含來自數千名 Python 開發人員的數百萬次細粒度編輯,用來預測未來的編輯。在這篇論文中,Google 并不關注靜态代碼,而是更關注代碼編輯作為一個随時間演變的動态對象。

其他

除了上面這些提供整體性智能化解決方案的工具,我還發現了一些專注于對某一單項的能力進行智能化的工具,它們或不成規模,但探索的方向依然有趣:

  • DeepCode:幫助發現項目中的代碼缺陷、安全漏洞、性能和 API 使用問題的插件。下圖示範了 DeepCode 使用“問題”頁籤和文法突出顯示檢查所有問題時的表現:
    什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
  • Intelli Refactor:該插件是對 VS Code 内置代碼重構功能的增強。

能力和體驗對比

最後,讓我們用表格的形式橫向對比這些工具的能力覆寫和體驗,其中能力部分以工具官網介紹為依據,體驗部分以我的實驗的個人感受為依據。

由于實驗使用的是前端代碼,且受限于代碼的設計、我個人的機器情況和程式設計習慣,是以不能作為科學的依據,僅供參考。

主要能力對比

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
  • 離線使用:不依賴于網絡即可使用。部分軟體使用深度學習技術,是以需要較大的計算資源,是以使用雲端資源,依賴網絡環境。
  • 領域定制:使用企業或團隊的私有代碼訓練「專用的智能化引擎」,提供更符合企業或團隊程式設計習慣的建議。

智能提示對比

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
  • 補全類型:即能觸發補全提示的情況
  • 屬性表達式:object.${api}
    什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
  • 名稱表達式:
    什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
  • 多 Token 補全:如下圖所示,encode是單 Token 補全,encode('utf8') 即是多Token 補全
    什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
  • 整行補全:如下圖所示,post 是單 Token 補全,post(my_url, data=my_data)是整行補全
    什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
  • 多行補全:如下圖所示,一次性補全了多行的代碼
    什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

使用體驗對比

什麼是人工智能自動程式設計?它隻是一個噱頭嗎?
  • 補全效率:即對于同一段代碼,需要多少次鍵入才能完成輸入,鍵入越少,補全效率越高;
  • 準确率:即對于同一段代碼,補全提醒首選項的正确的次數與補全提示出現的總次數的比例,比例越高說明準确率越高;
  • 相應速度:即在使用者輸入後多久出現補全提示清單,可通過同一段代碼來測試補全提示的出現平均值;
  • 硬碟資源:離線使用需依賴機器學習模型,是以模型會占用硬碟資源;

隻是噱頭嗎?

通過這個簡單的實驗,可以說,到目前為止,人工智能「自動程式設計」更多的是市場營銷。我相信這些工具在未來幾年會有很大的進步,并可能成為開發者真正的虛拟助手,但我們離這一步還有些距離。同時不可否認的是,當下使用這些工具讓開發者在程式設計效率上得到了一定的提升。

  • 對于初級開發者來說,智能程式設計工具對于程式設計效率和體驗的提升是明顯的,它能提供有效的建議,幫助初級開發者更快地寫出更好的代碼;
  • 對于進階開發者來說,智能程式設計工具對于效率的提升則較小,但依然能帶給我們一些愉悅的程式設計體驗。進階開發者熟練其領域的技能和知識,程式設計的主觀性較強,且有自己的代碼品味,代碼提示有時候會是一種幹擾,是以智能程式設計工具應該需要具備個性化設定的能力;
  • 與任何使用機器學習方法一樣,智能程式設計工具的效果取決于訓練資料的品質。如果不使用 GitHub 資料來訓練系統,而是使用内部/私有存儲庫對其進行訓練,則會獲得更好的效果;

另外起初,我隻關注到了自動程式設計對于提高生産效率的效益,但在調研的過程中我發現,人工智能自動程式設計對于生産品質和程式設計教育也會有廣闊的前景。

在将來,我想我們還會看到一些程式設計機器人,我們可以與他們進行一些配對程式設計,并讨論特定方法的目标是什麼,讓機器人為我們找到最好的解決方案。

參考資料

作者是 Iceworks 核心開發者, Iceworks 是面向多端應用開發的研發套件,幫助開發者和研發團隊更快更好地建構多端應用,歡迎使用。
什麼是人工智能自動程式設計?它隻是一個噱頭嗎?

關注「Alibaba F2E」

把握阿裡巴巴前端新動向