是成就還是削弱?AI代碼生成工具與程序員的糾葛
程序員注定要被取代嗎?自從 OpenAI 的大規模語言模型 GPT-3 展示其基于簡單的書面指令創建 HTML 網站這一驚艷的能力以來,計算機編程社區便一直被該問題籠罩著。
自那之后的幾個月里,更是出現了可以根據自然語言描述(口頭或書面人類語言)編寫簡單但完整的計算機程序以及加快程序員工作進程的自動編程助手。AI 會在多大程度上取代或增強程序員的工作呢?
IEEE Spectrum 就此咨詢了一些專家,得到的壞消息是編程或許注定要被取代。但也有好消息,即在可預見的未來,計算機編程和軟件開發似乎仍將是一項人類參與度極高的工作。與此同時,AI 賦能的自動代碼生成通過允許在更短時間里編寫更多代碼,從而越來越加速軟件開發。
亞馬遜 AI 服務副總裁 Vasi Philomin 表示,「我不相信 AI 會完全取代人類開發者。AI 工具可以將程序員從日常任務中解放出來,但計算機編程的創造性工作仍將繼續存在。」
如果有人想要成為一名開發者,但 10 年后,他們并不一定需要學習一種編程語言。相反,他們需要理解創建計算機程序的語義、概念和邏輯序列,這會將軟件開發開放給更廣泛的人群。
計算機編程的智能化、自動化程度越來越高
當 1940 年代電子計算機編程開始時,程序員使用數字機器碼編寫。直到 1950 年代中葉,美國杰出女性計算機科學家 Grace Hopper 及其 Remington Rand 公司的團隊開發了 FLOW-MATIC,它允許程序員使用有限的英語詞匯來編寫程序。
從那時起,編程語言越來越高效,程序員的工作也更加高效。
AI 編寫的代碼成為更廣泛改變的最前沿,它允許人們完全不用編碼也能編寫軟件。現在已經有了像 Akkio 這樣的無代碼 AI 開發平臺,人們可以通過簡單的拖放和單擊按鈕功能構建機器學習模型。微軟的 Power Platform 平臺包括了一系列低代碼產品,用戶只需描述就可以生成簡單的應用程序。
今年 6 月,亞馬遜推出了 CodeWhisperer 預覽版,這是一個基于機器學習的編程助手,類似于 GitHub 的 Copilot。這兩個工具都是基于大型語言模型(LLMs),這些模型已經在海量代碼庫中進行了訓練。當程序員編寫代碼時,CodeWhisperer 和 Copilot 都會提供自動補全建議,并根據簡單的自然語言短語給出可執行指令建議。
前幾天,GitHub 對 2000 名開發者展開了一項調研,結果發現,Copilot 將一些編碼任務的時間縮短了一半,并提升了開發者對自身工作的整體滿意度。
超越代碼自動補全并不容易
但如果想要超越自動補全,則問題在于將意圖(intent)教授給計算機。軟件需求通常是模糊的,自然語言的不準確也眾所周知。
英國人工智能初創公司 Diffblue 致力于使用 AI 檢查和糾正代碼,其聯合創始人之一 Peter Schrammel 對此表示,想要解決英文書寫規范中存在的歧義,則需要進行一些增量改進,在人與機器之間展開一些對話。
為了解決這些問題,微軟的研究人員最近提出像基于 LLM 的代碼生成中添加一種反饋機制,以便計算機在生成代碼之前要求程序員澄清任何歧義的地方。微軟的這一交互式系統名為 TiCoder,通過生成所謂的「測試驅動用戶意圖形式化」(TDUIF)來細化和形式化用戶意圖。
TDUIF 試圖使用迭代反饋來判斷程序員的算法意圖,然后生成與程序員所表達意圖一致的代碼。下圖為 TDUIF 的工作流。
論文地址:https://arxiv.org/abs/2208.05950
根據相關論文,當在 Mostly Basic Programming Problems(MBPP)基準上評估時,TiCoder 將自動生成代碼的準確率從 48% 提升到了 85%。MBPP 旨在評估機器生成的代碼,它包含大約 1000 個眾包 Python 編程問題,由入門級程序員來解決。
一個代碼單元可以長達幾百行,它是程序中可以獨立維護和執行的最小部分。一套單元測試通常由數十個單元測試組成,每個單元測試包含 10 到 20 行代碼,用來檢查單元是否按預期執行,以便當你將單元堆疊一起時,程序按預期工作。
單元測試對于調試單個函數以及手動更改代碼時檢測錯誤非常有用。此外,一個單元測試還可以用作代碼單元的規范,并用來指導程序員編寫干凈、無 bug 的代碼。雖然并沒有很多的程序員追求真正的測試驅動開發,其中首先要編寫單元測試,但單元測試與單元往往一起編寫。
專家認為:人類程序員不會因 AI 代碼生成失去工作
根據 2019 Diffblue 開發者調研的結果,開發者將大約 35% 的時間用來編寫質量控制測試,而不是編寫用于生產用途的代碼,因此實現這部分工作的自動化就可以顯著地提高生產力。
同時,Copilot、CodeWhisperer 以及其他 AI 編程助手包都可以用作編寫單元測試的交互式自動補全工具。程序員得到編碼建議,并選擇其中效果最好的。
今年 2 月份,DeepMind 進一步使用 AlphaCode 進行完全自動代碼生產。AlphaCode 是一種大型語言模型,可以根據自然語言指令編寫簡單的計算機程序。它使用編碼器 - 解碼器 Transformer 架構,首先對問題的自然語言描述進行編碼,然后將生成的向量解碼成解決方案所需的代碼。
AlphaCode 概覽。圖源:https://arxiv.org/pdf/2203.07814.pdf
該模型首先在 GitHub 代碼庫上進行訓練,直至它能夠生成看起來合理的代碼。同時為了對該模型進行微調,DeepMind 使用了 15000 對自然語言問題描述和以往編程競賽中成功的代碼解決方案,來創建一個關于輸入 - 輸出示例的專用數據集。
一旦 AlphaCode 經過了訓練和微調,它就能針對其以往未見過的問題進行測試。最后一步是生成大量解決方案,然后使用過濾算法選出最佳的。DeepMind 深度學習團隊負責人 Oriol Vinyals 認為,他們通過對該語言模型進行了近 100 萬次的采樣,創造了很多不同的程序。
為了優化樣本選擇過程,DeepMind 使用一種聚類算法將解決方案分組。聚類過程傾向于將可運行的解決方案組合在一起,使得更容易找到一小部分可能像程序員編寫的一樣工作的候選方案。
為了對系統進行測試,DeepMind 在流行的 Codeforces 平臺上向人類編程競賽提交了 10 個 AlphaCode 編寫的程序,其中解決方案排在前 54%。
在最近的一次采訪中,Oriol Vinyals 反問道,「為了生成一個程序,你是不是只要用自然語言編寫它而不需要編碼,然后解決方案就會在另一端出現呢?」Vinyals 與其他人對此持審慎態度,認為實現這一目標需要時間,可能是數十年。
Landing AI 創始人兼 CEO、AI 知名學者吳恩達表示,我們距離一個人能夠告訴計算機編寫任意復雜的計算機程序的要求并自動完成編碼,仍然很遙遠。
但是,考慮到 AI 代碼生成在短短幾年取得進展的速度,AI 系統最終能夠根據自然語言指令編寫代碼似乎是不可避免的演化趨勢。而手動編程軟件程序將越來越像手工編織毛衣。
為了給計算機提供自然語言指令,開發者仍然需要了解一些邏輯和功能的概念以及如何構造事物。即使開發者不學習特定的編程語言或者編寫計算機代碼,但仍需要學習基礎編程。反過來,這將使得更多的程序員創建越來越多樣化的軟件。
Vasi Philomin 表示自己不相信 AI 會取代人類開發者。AI 可以消除開發者不得不做的瑣碎的、程式化的工作,使他們專注于更高價值的事情。
Peter Schrammel 也同意 AI 自動代碼生成允許軟件開發者能夠專注于更困難和更具挑戰性的任務。不過他補充道,至少需要確認機器所理解的內容是不是人類的意圖。
他還表示,軟件開發者不會因自動化代碼工具取代他們而失去工作,總有更多的軟件需要編寫。