人工智能在軟件開發(fā)領域應用現(xiàn)狀

江湖上一直流傳著這樣的傳聞:“程序員們很快就要失業(yè)了,因為人工智能馬上就能寫出完美的代碼了”。人工智能是以軟件形式存在的,編寫了這些強大軟件的碼農們,如果被自己編寫的代碼所取代,來寫出新一代的代碼,那會是一個神奇而又悲傷的故事。我們今天就來看看人工智能在軟件開發(fā)領域里的現(xiàn)狀,我們距離傳奇還有多遠?

有人說軟件開發(fā)是一種藝術,有人說軟件開發(fā)需要工匠精神,不管是哪一種說法,軟件開發(fā)都是一個創(chuàng)造性的工作,而機器曾被認為是缺乏創(chuàng)造力的,但是隨著深度學習的發(fā)展,人工智能在一些創(chuàng)造性的領域也得到了飛躍的發(fā)展。

現(xiàn)在的人工智能可以畫畫:

Trippy Artworks Created by Artificial Neural Networks

可以作曲:

musical.ai

可以寫作:

?? 2017年5月,機器人微軟小冰出版了詩集《陽光失了玻璃窗》。

?? 2017年,韓國某通訊社也測試使用人工智能進行足球比賽報道,幾秒鐘就可以稿件上線。

?? 2018年,阿里媽媽推出的AI智能文案。

下圖是我用最近世界足壇最出色的球星梅西(蹭一下煤老板轉會風波的熱度)的名字為種子讓AI創(chuàng)作的詩:

感覺這個詩做的不錯呀,把煤老板的轉會風波又推進了一個意境,你覺得呢?

同為創(chuàng)作,AI離寫代碼還有多遠?

上面提到的這些例子,大多是使用深度學習為基礎來進行創(chuàng)作,而用深度學習技術來進行軟件開發(fā),主要面臨著以下的一些挑戰(zhàn):

1.?? ?很難判斷

深度學習是一種監(jiān)督學習算法,需要大量標注的數(shù)據(jù),也就是說對數(shù)據(jù)的正確和錯誤打標簽。但是代碼很難用正確或者錯誤的標簽來標記。也很難用數(shù)值來量化。而可用于訓練的已標注的代碼也非常少。

2.?? ?容錯率低

對于谷歌的貓狗判別算法,能有個90%可能就算是不錯了,但是軟件代碼有99%都是對的,那可還是編譯不通過,軟件要求不能有任何錯誤。不同于自然語言,代碼對于噪聲非常敏感。

3.?? ?復雜的上下文

開發(fā)軟件需要大量的上下文知識,需求的分析,系統(tǒng)的非功能性要求等等,如何把這些知識融入到代碼,對于AI來說,挑戰(zhàn)頗高。

盡管如此,人工智能在軟件開發(fā)領域已經開始有所突破,那么我們就看看AI現(xiàn)階段都能做些什么?

代碼輔助

代碼輔助指的是輔助寫代碼的一些功能和過程。例如代碼自動補全,代碼搜索推薦,代碼轉換等。人工智能在這個領域大有可為,想想我寫代碼的時候,一大半的時間在查文檔,還有一大半的時間在搜google和stackoverflow,人工智能可以很好充當碼農的好助手。在這個領域里,已經有了不少的創(chuàng)業(yè)公司和相應的產品。

TabNine

TabNine是加拿大一位大四學霸開發(fā)的智能代碼補全工具,作者Jacob Jackson目前在滑鐵盧大學主修計算機科學與組合優(yōu)化專業(yè)。該工具支持23種語言,支持VS Code、Sublime Text、Atom、Emacs、Vim五種代碼編輯器。在VS Code的擴展商店里,TabNine已經被下載超過萬次,獲得全5星好評。2019年12月,被Codota收購。


Kite

Kite是硅谷創(chuàng)業(yè)公司,成立于2014年,A輪融資1700萬美元。Kite提供智能代碼補全,支持Python和JavaScript。

Kite目前支持以下的IDE:

Codata

以色列的創(chuàng)業(yè)公司,成立于2013年,融資260萬美元。

Codota是一家以色列AI編程助手,專注于用AI幫程序員寫代碼,基于從網上學習到的編程模式,它能實時地為程序員推薦最合適的代碼。它能無縫地接入程序員的集成開發(fā)環(huán)境中,幫助他們節(jié)約時間,減少人為錯誤。除了代碼補全,它提供了聚合搜索功能,覆蓋了包含github,stackoverflow等碼農喜聞樂見的代碼源。

Aroma

Facebook的Aroma是一款代碼到代碼型搜索與推薦工具。其采用機器學習(簡稱 ML)技術進行代碼推薦,旨在降低從大型代碼庫當中獲取洞察見解的難度。

在Aroma出現(xiàn)之前,各類原有工具一直無法徹底解決這個問題。文檔工具往往可用性較差且嚴重過時,代碼搜索工具通常會返回無數(shù)個匹配結果,而用戶卻很難立即從其中找到自己習慣的使用模式。通過 Aroma,工程師們現(xiàn)在能夠輕松發(fā)現(xiàn)常見的編碼模式,而不再需要手動瀏覽數(shù)十個代碼段,這將顯著節(jié)約日常開發(fā)工作所耗費的時間與精力。

Stage1:基于特征的搜索,將代碼語料庫索引為稀疏矩陣

??? ?Aroma分析代碼語料庫給每種method并為其創(chuàng)建解析樹;

??? ?從解析樹中提取相關變量的用法、method調用等關鍵的結構特征;

??? ?根據(jù)每種method的特征創(chuàng)建一個稀疏向量,成為索引矩陣,用于搜索檢索。

Stage2:重排和聚類

??? ?以相似性對候選代碼進行重排,相似性比較僅考慮與查詢代碼匹配的部分;

??? ?對重排候選代碼進行迭代聚類,查找用于生成推薦代碼的關鍵clusters。

Stage3:Intersecting生成代碼推薦

??? 以cluster中某一代碼為基準,與其他代碼進行比較迭代,得到最大公約數(shù)。

與傳統(tǒng)代碼搜索工具相比,Aroma代碼推薦具有如下優(yōu)勢:

??? 在語法樹上執(zhí)行搜索,可以查找語法上與查詢代碼相似的實例,而不是簡單的字符串/令牌匹配。修剪無關語法結構突顯匹配代碼。

??? 自動將相似的搜索結果聚類,生成代碼建議。這些建議反映了常用的編碼模式,比未聚類的搜索結果更易使用。

??? 足夠快,可以實時使用。即使對于非常大的代碼庫,也可以在幾秒鐘內生成推薦,并且不需要提前進行模式挖掘。

??? 核心算法與語言無關。已經在Hack,JavaScript,Python和Java的內部代碼庫中部署了Aroma。

詳情可參考:

https://ai.facebook.com/blog/aroma-ml-for-code-recommendation/

CodeBERT

微軟、哈工大在arxiv上聯(lián)合發(fā)表了一篇論文,標題為《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》,再次拓寬了BERT的應用,將BERT應用到了Python、PHP、Java、JavaScript、Go、Ruby等編程語言的代碼搜索和生成任務當中。整體方案仍然是傳統(tǒng)的預訓練+微調框架,模型規(guī)模不大。

BERT作為一種雙向Transformer的編碼器,其對預訓練方法的創(chuàng)新深受業(yè)界和學術界的喜愛,雖然其他大規(guī)模的預訓練模型例如ELMo、GPT等已經能夠在各種NLP任務中提升SOTA。

但是上述提到的模型基本上都是面向自然語言處理,例如掩蔽語言建模、從未標記文本學習上下文表示。相比以往的Bert的應用場景,作者另辟蹊徑,推出雙模態(tài)預訓練模型,即兼顧NLP任務和Python、Java等編程語言。

具體來說,CodeBERT抓住了自然語言和編程語言之間的語義聯(lián)系,能夠支持自然語言代碼搜索等NL-PL理解任務以及一系列像代碼生成這樣的生成任務。

整體方案:預訓練語言模型+下游任務微調

預訓練語言模型:結合NL-PL雙模態(tài)Masked Language Modeling和PL單模態(tài)Replaced Token Detection訓練目標的1.25億參數(shù)預訓練模型;訓練損失函數(shù)為min(LMLM+LRTD)。

下游任務

自然語言代碼搜索?:給定NL-PL對,檢測模型預測masked token的能力。被作者簡化為max, min, less, greater四選一問題,用NL-PL Probing方法評估。

代碼文檔生成:從代碼生成自然語言文檔,用smoothed BLEU方法評估。

預訓練數(shù)據(jù):210萬雙模態(tài)數(shù)據(jù),640萬單模態(tài)數(shù)據(jù)。

六種編程語言-Python,Java,JavaScript,PHP,Ruby,Go。

簡單總結,CodeBERT想解決從自然語言到編程語言的映射關系。有了這樣的映射關系,我們就可以用自然語言來查找對應的代碼,或者直接把自然語言翻譯為代碼。最終(當然這個還要等很久)碼農就不需要了,產品經理直接說要啥就好了。

詳情參考 https://arxiv.org/pdf/2002.08155.pdf

代碼翻譯轉換

記得我在德國某BI企業(yè)的時候,當時產品開發(fā)做了一件事,就是把一個之前用C++寫的產品用Java重寫了一遍,大公司就是這么任性,雖然功能完全沒有變化,但是我就是喜歡Java,因為Java代表著更先進的生產力。后來Java被競爭對手O記給收了,估計做此決策的人想死的心都有了。這個時候你需要的是一款代碼自動翻譯轉換工具。

Facebook Transcoder

https://github.com/facebookresearch/TransCoder

代碼翻譯的問題是,手工重新改寫不僅耗時,還很難找到懂多種編程語言的程序員,基于規(guī)則等方法轉換質量非常差,最新的無監(jiān)督神經轉換器能在某些特定范圍上很好的完成代碼翻譯任務。

Facebook最近開發(fā)的神經轉換編譯器TransCoder讓代碼轉換越過了新的篇章。該系統(tǒng)可以將代碼從一個高級語言轉換成另一個,比如 c + + 、 Java 和 Python。

這個系統(tǒng)是弱監(jiān)督的,可以在沒有標簽的數(shù)據(jù)集中尋找以前未檢測到的模式,只需要少量的人工監(jiān)督。研究人員稱,這比基于規(guī)則數(shù)據(jù)集的模型要高效得多。

從Java到C++,TransCoder轉換準確率超九成!

TransCoder是基于跨語言模型預訓練去做的模型初始化,這樣的訓練不著眼于編程語言的類型,而僅僅將表示相同指令的代碼段映射為相同的表示形式。

之所以TransCoder能進行跨語言模型的訓練,是因為系統(tǒng)的標記原理著眼于跨語言之間的共同關鍵字,如「if」,「for」等,以及數(shù)字、數(shù)學運算符和出現(xiàn)在源代碼中的英語字符串。這樣反向翻譯之后通過源-目標模型和并行訓練的目標-源模型耦合,從而提高了訓練的質量。

代碼生成

代碼生成聚焦在特定領域或特定任務的自動編程,即Domain-Specific Automated Programming(DAP)和Task-Specific Automated Programming(TAP)。目標是讓機器完成簡單的編程任務,解放開發(fā)者繁重的編程工作。

這個可能是目前最接近于取代碼農工作的AI。

DeepCoder

DeepCoder是微軟和劍橋大學聯(lián)合開發(fā)的一種計算機算法,可以用于自行編寫代碼并解決簡單的數(shù)學問題。該系統(tǒng)分成兩個組成部分:代碼編寫算法,以及搜索潛在代碼的機制。該算法發(fā)表于2016年11月的論文中。

DeepCoder所用的技術叫程序合成( program synthesis),通過截取已有軟件的代碼行來組成新的程序。通過學習一系列代碼片(code fragment)的輸入(inputs)和輸出(outputs)數(shù)據(jù),DeepCoder能自動摘取出對目標任務有用的代碼片。

DeepCoder 使用被稱作“程序組合”(program synthesis)的方法,只要給定系統(tǒng)輸入值和需要的輸出結果,DeepCoder 便可透過搜尋其他程序的程序代碼,挑出適合的程序代碼片段,再組合成可運作的程序,讓程序順利生成需要的結果。事實上,這個步驟就像許多工程師常做的事:在程序問答網站 Stack Overflow 上搜尋適合的程序代碼,再“復制貼上”他們認為可行的程序代碼片段。所以這個跟我們之前提到的代碼輔助很像。

SketchCode

Airbnb研發(fā)出了一種工具可以把下面的草圖直接轉換為HTML5的代碼。

但是Airbnb沒有開源,有位大神自己開源了sketch-code,可以完成類似的工作。

https://github.com/ashnkumar/sketch-code

經網友親測有效,當然還不是很完美。

手稿生成圖

可能會有小伙伴站出來挑戰(zhàn),html也算編程語言么?寫網頁能算寫代碼么?不急,看看最新的自然語言模型的威力吧!

GPT-3

OpenAI發(fā)布最新的NLP模型GPT-3使用的數(shù)據(jù)集容量達到45TB,參數(shù)個數(shù)1750億,一個訓練好的模型就要 700G的硬盤空間來存儲。充分反映了“大力出奇跡”的特點。GPT-3通過對大量文本進行預訓練,針對特定任務進行微調,模型的性能可以在許多 NLP 任務以及基準測試中獲得顯著提升。

近日有開發(fā)者根據(jù)GPT-3模型上線了一個能夠自動生成代碼的網站debuid(https://debuild.co/)。在這網站注冊后,用戶只要用英語描述需求,前端代碼會自動生成。

GPT3正成為新的AI基礎設施,巨大的新型圖數(shù)據(jù)庫,可以生成大段有意義的篇章,代碼可通過自監(jiān)督學習;以前代碼生成很難超過50-60行,現(xiàn)在有望得到突破;以前自動生成代碼很難通過測試,現(xiàn)在也有望突破。

代碼審查

代碼審查是現(xiàn)代軟件開發(fā)過程中的必要流程,代碼審查面臨著很多挑戰(zhàn)

??? 軟件系統(tǒng)正變得越來越復雜:更多模塊,更多執(zhí)行路徑,更大狀態(tài)空間,逐漸超過手工檢測的能力范圍

??? 資源有限,時間和人力都不夠用,碼農們需要996和007

??? 團隊中的專家不夠用

面臨這些挑戰(zhàn),利用人工智能來提高代碼審查的效率,是一個不錯的途徑。

AWS CodeGuru Reviewer

CodeGuru Reviewer 是AWS提供的代碼檢視服務,可發(fā)現(xiàn)九大類別的代碼質量問題:

?AWS 最佳實踐:正確使用 AWS API(如:輪詢、分頁)

???Java 最佳實踐:正確使用常用的 Java 語言和庫功能

?并發(fā):檢測導致功能不正確的缺少的同步,或導致性能問題的多余的同步。

???死鎖:檢查并發(fā)線程之間的協(xié)調

?資源泄露:正確處理資源(如,釋放數(shù)據(jù)庫連接)

???敏感信息泄露:個人身份信息泄露(如,記錄信用卡詳細信息)

?常見的代碼錯誤:難以發(fā)現(xiàn)的缺陷,例如,沒有為每次 Lambda 調用創(chuàng)建客戶端

?代碼克隆:識別可以整合的重復代碼,以提高代碼可維護性

?輸入驗證:檢查來自不受信任來源的格式錯誤的數(shù)據(jù)或惡意數(shù)據(jù)

DeepCode

DeepCode是靜態(tài)代碼監(jiān)視工具(和前面提到的DeepCoder不要搞混),使用機器學習分析代碼庫中的安全缺陷和潛在錯誤,領會代碼背后真實意圖。DeepCode是一家瑞士startup,成員主要來自ETH。與其他Code Review AI相比,它不僅能夠發(fā)現(xiàn)語法錯誤,而且能夠確定代碼的意圖,因此能夠識別更多潛在的重要錯誤和漏洞。

DeepCode實現(xiàn)了一種方法,可以在達到臨界安全級別之前分析用戶輸入處理。因此,當任何數(shù)據(jù)在沒有安全驗證或清除的情況下從一個點移動到另一個點時,該工具會將其標記為受污染的,并向您發(fā)出警告。該工具可以標記的問題包括跨網站腳本、SQL注入威脅、遠程代碼執(zhí)行以及路徑遍歷攻擊等。

快速精準理解代碼背后真實意圖,準確定位語法錯誤和漏洞

訓練流程:DeepCode的模型訓練分三步進行:

Step1:將各類編程語言寫成的代碼進行解析,生成解析樹;

Step2:通過線性復雜度數(shù)據(jù)求解器可在幾秒內完成代碼庫分析;

Step3:語義事實表示方法用于ML模型理解代碼結構及其背后意圖。

戰(zhàn)略簡要,覆蓋面廣和技術優(yōu)勢是DeepCode的制勝法寶:

戰(zhàn)略重點簡明扼要:讓機器code review可以提供盡可能多的、更廣泛且深入的代碼建議;

缺陷檢測覆蓋范圍廣:

其他現(xiàn)有靜態(tài)分析工具的缺陷檢測范圍僅為DeepCode的十分之一;

可以快速兼容來自其他工具的checkers/rules/patterns;

可與GitHub,GitLab集成。

程序分析、AI算法、特征工程和大數(shù)據(jù)多種能力互補,形成獨特技術優(yōu)勢:持續(xù)從開源項目在線學習的能力;

獨立于編程語言的平臺,可以在幾周內完成新語言添加;

無需編譯,大型代碼庫平均分析時間僅5秒(其他方案一般要通宵)。

代碼測試

人工智能在代碼測試的市場空間最大,通過大量規(guī)則和AI結合定制,解決測試領域的難題。

AI正在改變軟件測試:差異性、可視性、說明性、自動化…

??計算機圖形學協(xié)助UI測試:AI保證UI元素有正確的顏色、位置、尺寸等,傳統(tǒng)手工或基于規(guī)則的方法很難檢測差異性,難以自動化;

?API測試自動化:通過人工智能算法,讓API測試自動進行

??自動創(chuàng)建測試用例:AI可以學習應用程序,了解文檔模型的關系以及變化,自動生成用例。

??測試用例相關性檢測:任何代碼小改動,不需要重測整個代碼,通過AI分析,只運行相關的測試。這個相當于是推薦系統(tǒng),推薦需要運行的測試用例。

人工智能正在逐步改變整個軟件測試領域,可以大量節(jié)省測試時間,增加代碼質量,軟件測試正在從DevOps向AI過渡,由簡單的發(fā)現(xiàn)問題轉到根據(jù)上下文找到根因,從人工測試走向全自動化測。2019軟件測試市場126億美元,2024年288億美元。

利用人工智能輔助軟件測試的工具很多,下面列出幾個比較有特點的:

Mabl

首款基于機器學習的商用智能軟件測試工具,使用機器學習技術,開創(chuàng)了智能化軟件測試的先河。開發(fā)mabl的是一家位于波士頓的創(chuàng)業(yè)公司。共同創(chuàng)始人是Dan Belcher和Izzy Azeri。這兩位哥們是連續(xù)創(chuàng)業(yè)者。他們于2014年創(chuàng)辦了Stack Driver。這家公司為云平臺(例如谷歌GCP,亞馬遜AWS)上的應用程序提供監(jiān)測和診斷服務。后來這家公司被谷歌收購,這兩位就進入了谷歌工作。2017年初,他們又出來創(chuàng)業(yè),創(chuàng)辦了mabl。公司一經成立,便獲得了來自Charles River Ventures和Amplify Partners和1000萬美元首輪投資。不到一年,便發(fā)布了面向商業(yè)市場的mabl產品(https://www.mabl.com/)。mabl以SaaS(software-as-a-service)方式,為用戶提供智能軟件測試服務。軟件測試的全過程自動化,不再需要人工參與。自動創(chuàng)建和執(zhí)行測試,自動分析測試結果,同時還能根據(jù)需求的變化自動適配和維護測試。

mabl的口號非常響亮:You write code, mabl tests (你寫代碼,mabl來測試)。

mabl使用機器學習技術,自動創(chuàng)建和執(zhí)行測試(Tests),自動分析測試結果,同時還能根據(jù)需求的變化自動適配和維護測試。也就是說,mabl將軟件測試的全過程均自動化了。有了mabl,軟件測試將不再需要人工參與。

mabl已經脫離了自動化軟件測試的范疇,開創(chuàng)了智能化軟件測試(intelligent testing)的先河。

機器學習為軟件測試自動化的用戶體驗帶來質的飛躍,它提供:

??無腳本測試:測試人員無需創(chuàng)建和維護測試用例。測試工作由機器學習算法在沒有測試用例的情況下自主完成。

??無基礎設施:mabl以SaaS的方式提供服務,用戶無需安裝和維護任何本地基礎設施。

??自動維護測試:當產品發(fā)生改變時,機器學習算法自動適配這種變化。

??自動分析結果:mabl自動分析結果、定位問題原因。

??第三方集成:mabl與Jenkins,Slack,Jira等第三方工具均能很好的集成。

test.ai

Test.AI(前身為Appdiff)被視為一種將AI大腦添加到Selenium和Appium的工具,以一種類似于Cucumber的BDD語法的簡單格式定義測試。Test.AI在任何應用程序中動態(tài)識別屏幕和元素,并自動驅動應用程序執(zhí)行測試用例。它由Justin Liu和Jason Arbon創(chuàng)建。

這家初創(chuàng)公司剛剛在Gradient Ventures領投的A輪融資中獲得了1100萬美元的投資,Gradient Ventures是谷歌專注于人工智能的風險基金。參與此次投資的還有e.ventures、Uncork Capital和Zetta Venture Partners。成立于2015年Test.ai迄今為止已經融資1760萬美元。

該公司的技術不僅僅是利用人工智能來縮短應用測試所需的時間;當開發(fā)人員準備要測試的場景列表時,它有助于消除更加冗長的過程。Test.ai已經對他們的機器人進行了“成千上萬個應用”的訓練,以幫助它了解一個應用的樣子以及它們通常

diffblue

DiffBlue是一種非常有用而又簡單的用于代碼自動化的平臺。DiffBlue有幾個核心目的——測試編寫、bug定位、重構代碼以及發(fā)現(xiàn)和替換弱點的能力——這些都是通過使用自動化實現(xiàn)的。Diffblue專注于用AI技術為代碼提供數(shù)字模型,Diffblue正在研發(fā)三款產品,分別是用于發(fā)現(xiàn)bug,編寫測試代碼的測試產品;能夠自動標記bug并對其進行測試的安全產品;以及自動修改不合理代碼或過時代碼的重構產品。

在AI輔助自動化測試領域,還有很多產品,這里就不一一細說,它們有:

??? ?apptest.ai

AI輔助的移動應用自動化測試

??? ?Appvance IQ

根據(jù)應用程序的映射和實際用戶活動分析,使用機器學習和認知自動生成自動化測試腳本

??? ?Eggplant AI

使用AI和深度學習來從界面上尋找缺陷,能夠自動生成測試用例,大幅度提高測試效率和覆蓋率。

??? ?Sauce Labs

利用機器學習來針對測試數(shù)據(jù)進行分析,更好地理解測試行為,主動改進測試自動化。

??? ?Sealights

利用機器學習技術分析SUT的代碼以及與之對應的測試,不局限于單元測試,還包括系統(tǒng)級的業(yè)務測試和性能測試。它還基于機器學習呈現(xiàn)完整的質量Dashboard,幫助我們進行“質量風險”的評估。

??? ?Testim

專注于減少不穩(wěn)定的測試(flaky tests)和測試維護,試圖利用機器學習來加快開發(fā)、執(zhí)行和維護自動化測試。

總之軟件測試的自動化正在向著越來越智能的方向前進。

總結

機器會取代人類么?

人工智能會搶走碼農的飯碗么?

AI有想象力么?

這些問題,我沒有答案,當馬斯克推出他的腦機接口的時候,我在想,未來AI和人類的交互會變得更容易,AI可能不會取代人類,但是它會和人類融為一體,我和我的AI結對編程,那樣應該也不錯!

推薦閱讀

這屆智能客服有點優(yōu)秀

偏見:人工智能輔助決策的隱患

人體運動軌跡的人工智能動畫模擬

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容