有沒有可能讓計算機去理解代碼,從而寫代碼?
提問者一定是產品經理,
竟然覺得代碼難以理解……
其實大多數時候的代碼比需求容易理解多了……
認圖片、辨聲音、下圍棋、玩德州撲克、開卡車……似乎越來越多人能玩的事情AI也能玩而且玩得比人還溜。但暫時有一部分人還是自我感覺安全的——程序員的工作AI還是很難勝任的對吧?畢竟這個東西需要邏輯思考,需要框架和流程設計,哪裡是AI能一下子勝任的事情。但Google等公司認為,AI現在可以開始學習一些AI專家做的事情了,那就是寫AI程序。
Google Brain人工智慧研究小組的研究人員最近就進行了這樣的嘗試。他們在一次試驗中讓軟體設計了一套機器學習系統,然後對這套系統進行測試語言處理方面的測試。結果發現該系統的表示超過了人類設計的軟體。
Google Brain團隊首先用遞歸神經網路生成神經網路的描述,然後利用強化學習對該RNN進行訓練。其方法可以讓AI從零開始設計出一個新穎的神經網路架構,在利用CIFAR-10數據集(含6萬張32x32的彩圖,涉及10類對象,每一類各6000張。其中5萬張為訓練圖像,1萬張為測試圖像)進行圖像識別測試時,其識別的精度甚至比人類設計的最好架構還要高,錯誤率僅為3.84%,與目前最先進的神經網路模型相比,其錯誤率僅低0.1個百分點,但速度快了1.2倍。而在用於自然語言處理的Penn
Treebank數據集上,其模型構造出來的一種遞歸神經單元也超越了被廣泛使用的LSTM神經單元等最新基準指標,在複雜度方面比後者好3.6倍。類似地,Google的另一個AI團隊DeepMind最近也發表了一篇名為《學會強化學習》的論文。其研究同樣針對的是深度學習所需的訓練數據量大且獲取成本高的缺點。他們提出了一種名為deep
meta-reinforcement
learning的強化學習方法,利用遞歸神經網路可在完全有監督的背景下支持元學習的特點,把它應用到了強化學習上面。從而將用一個強化學習演算法訓練出來的神經網路部署到任意環境上,使得AI在訓練數據量很少的情況下具備了應用於多種場景的元學習能力。或者用DeepMind團隊的話來說,叫做「學會學習」的能力,或者叫做能解決類似相關問題的歸納能力。Google Brain團隊的負責人Jeff Dean最近在回顧AI進展情況時,就曾經表態說機器學習專家的部分工作其實應該由軟體來負責。他把這種技術叫做「自動化機器學習」,並認為這是最有前途的AI研究方向之一,因為這將大大降低AI應用的門檻。
當然,創建學會學習的軟體這個想法由來已久,蒙特利爾大學的Yoshua
Bengio早在1990年代就提出了這個想法。但之前的試驗結果並不理想,因為AI做出來的東西還是比不上人類想出來的模型。但近年來隨著計算能力的不斷增強,以及深度學習的出現,AI學會學習的能力終於取得了突破。
儘管AI的自學能力取得了突破,但是在近期內還不能大面積推廣。因為事先這種能力需要龐大的計算資源。比方說Google Brain那個設計出識別率超過人類所開發系統的圖像識別系統的AI就需要800個GPU。
但這種情況將來可能會發生變化。最近MIT Media Lab也開發出了設計深度學習系統的學習軟體,其所開發出來的深度學習系統的對象識別率也超過了人類設計的系統。MIT Media Lab計劃將來把它的這套AI開源出來,讓大家繼續這方面的探索。
除了Google和MIT以外,據報道最近幾個月有好幾個小組也在讓AI軟體學習編寫AI軟體方面取得了進展。其中包括了非盈利的AI研究組織OpenAI (其他的非盈利AI組織可參見這裡)、MIT、加州大學、伯克利分校等。
一旦這類自啟動式的AI技術具備實用性,機器學習軟體在各行業應用的節奏無疑將大大加快。因為目前機器學習專家極為短缺,各家企業組織都需要高薪供養這批人。
事實上「生成代碼」這個事真是不難,比如你用一款表單工具、問卷系統,你也可以理解為當你設置完一份表單時它「生成」了代碼,當然實際情況他並不需要生成什麼代碼,同樣能辦到基本的數據存儲、統計、報表等工作,也可以解決某類特定的需求。
還有以前比較熱門的 UML 工具,那離「生成代碼」這一目標已經非常非常接近了,他真的可以生成實際可用的基礎代碼;現在的程序員可能僅僅用其圖例作為分析工具了。
但無論這些工具做得有多好,能自動整合多少資源,仍無法完美解決需求,人們總是想各種方式去干預機器,所以才會有各種稀奇古怪的操作界面、運作流程。
而 AI 的目的正是逐步的減少人的干預,你提出問題他給你結果,諸如人類指令其實都是「想要什麼」的問題。儘管目前來看似乎看到最多的 AI 都是些廢材的智能助理和沒多少親見的自動駕駛,事實上通用型的 AI 可能還要很漫長的路要走,會先在各特定領域解決特定問題,最終匯聚成一張龐大的智能網路。可以的,而且也不是特別難實現,只不過到時設計書又會變成一種新的「語言」
請參見俺的文章《消滅程序員需要百年嗎?http://www.ituring.com.cn/article/346》http://www.ituring.com.cn/article/details/346
這要解決的問題是如何跟從甲方的業餘口述中自動生成unit test,其實跟理解代碼沒什麼關係。
自動寫代碼的AI搞出來肯定也是去寫外包軟體,不可能去寫系統軟體的。計算機會一個東西不需要先理解...
比如機器學習,比如神經網路...代碼么直接當字元扔進循環神經網路(RNN)練練就好了...------------------------------------------------果然我想到什麼都有人干過了,查了下真有:The Unreasonable Effectiveness of Recurrent Neural NetworksGithub:karpathy/char-rnn超好玩!喂它LaTeX就能生成類似LaTeX的代碼...
基本能通過編譯....喂它Linux內核就能得到看上去像C的代碼:會聲明函數寫循環...還會寫注釋...就是有點前言不搭後語...........
--------------------------------------------------------------------------所以寫代碼不難,難的就是寫有意義的代碼...把需求轉化成代碼...DSL干過這事...不過顯然沒成功,成功的話就像深度學習一樣家喻戶曉了...
要懂得遞歸先要懂得遞歸...寫代碼是把一個過程說清楚的過程...不可能,因為產品的需求誰都無法理解,包括產品本人。
我能怎麼辦,我也很絕望啊。-------------當AI遇上了神經病一樣的產品
現在已經在進化了,以前面向過程時代你需要研究演算法研究實現過程,現在面向對象時代你只需要告訴計算機你要做什麼就好了。沒準以後的某一天會更簡便,直接告訴計算機需求,計算機就能自己寫程序了。(原來你寫個開車的程序,你需要寫進去每一步,而現在你只需要調用開車的類就可以了)
當封裝性到達一定境界的時候誰說不行呢?
def machine(requirement):
understand(requirement)
return write_code()
然後AI被產品經理逼成了天網╮(╯_╰)╭
參見《clean code》:
扯淡!我們永遠拋不掉代碼,因為代碼呈現了需求的細節。在某些層面上,這些細節無法被忽略或抽象,必須明確之。將需求明確到機器可以執行的細節程度,就是編程要做的事。而這種規約正是代碼。
而需求是不斷變化的,不可能全部滿足!
從另一方面看,即使計算機實現了人工智慧,和人一樣聰明,你能信任它,給它一個模糊指令,讓它選擇如何明確需求嗎?即使是人,也需要和你接觸很長時間,受過訓練,才能正確理解你的模糊指令。而這訓練過程,是不是也能認為是某種「編程」?
當然從字面意義上,計算機一直是理解代碼,並生成代碼的,(且不論DSL),除了機器語言,其他所有的代碼不都是要編譯或者解釋成機器碼才能執行嗎?計算機當然可以理解代碼。
問題是,寫代碼需要的是構思。
就目前來看,計算機恐怕不能合理地構思。
當然,如果以後技術進步了,需求提的夠規範,計算機應該能快速轉換出代碼來。講道理,程序員「把用戶需求翻譯成計算機能識別的指令」的工作,不會有任何變化……
而現在很多開發環境已經能在代碼編寫層面幫助程序員解決一些問題了。學習編程的目的很多時候也只是「理解電腦到底能幹什麼」和「我怎麼才能讓電腦知道我想幹什麼」而已……
除非人工智慧識別自然語言有新的突破。嗯。不知道提問者的專業背景,但這個問題確實讓我覺得很不專業,當然,是指問得不專業。 現在我們人類寫的代碼,或者說高級語言,都是不是計算機真正執行的東西。都是需要對應的編譯器,將其翻譯成最底層的機器語言,然後讓機器執行的(連彙編都不能說是最底層,當然,彙編那樣的程度已經大部分人的極限了)。所以從一開始,編譯器就已經扮演了提問者提到的一部分功能,就是讓機器生成代碼。好吧,我知道我這樣曲解問題,會引來很多不滿。 實際上,假如將來有一日真正的可以完全讓機器自己生成代碼,那麼最有效的方法也不是生成人類比較容易接受的高級語言,因為這對於計算機來說相當於繞了一個大彎,除非你還要求計算機自己寫的代碼之後還要交由人去審核歸檔,但既然如此,如其非費這麼大的力氣,還不如開發一套更友好的IDE或者類似UML的強化版,甚至是開發一門語法更傻瓜,自帶了包羅萬有的函數庫的語言更來得實際。真正要讓機器寫代碼的難點不在於讓其寫出實現功能的代碼,而是作為用戶,如何將需求,以計算機能理解的方式告訴計算機,這才是最bug的。這方向一旦要專研下去,最終和自己寫編譯器沒多少區別,已經不是常人能及的了。
另外,本人也做過自助分析工具,在後台數據入庫層面上,讓程序自動生成可以直接在資料庫上執行的SQL語句,實現數據的自我載入。在前台實現報表查詢的自動拼寫查詢SQL語句的代碼,實現自動查數。某種程度上,也算是讓計算機自己寫代碼吧·····雖然完全不是提問者想要的方向就是了
計算機理解代碼並且寫代碼,BDD就算是一個。這東西叫DSL,但是規則都是寫死的,需求本身成了一種代碼。我看了@趙丹 JJ的文章,我才疏學淺,無法反駁,但是到處copy-paste代碼的人也能叫牛人?UML生成代碼,不算啥新技術,但是其實大部分時間,我們的工作不是計算機生成代碼-&>修改代碼-&>測試-&>上線,我們的工作是迭代式的,需要不停的在前一種環境中循環,這其中,計算機生成代碼只能作很少一部分的工作,大部分工作需要程序員運用腦中的知識,以及手邊合適的工具來「手動」解決問題。這期間計算機幫人的不多。
代碼的核心不是代碼,而是邏輯。
代碼的編寫也就是邏輯編寫,如果一台計算機可以根據需求自己編寫邏輯代碼,那麼這不就是人工智慧了嗎?評論區好多提到:大多數時候的代碼比需求容易理解多了……
說到產品需求,我想到一個梗。(^ω^)自動生成代碼在計算機科學中已經有相關研究了, 見Program synthesis。
MSR的大牛Sumit Gulwani 就是program synthesis的權威。
至於計算機能不能先理解代碼,再生成代碼,我覺得是可能的,畢竟GitHub上有海量的代以及注釋可以做training data。
可能短期內讓計算機寫出完美的代碼不太容易,但是做一些簡單的programming assist還是很可能的。
比如:
x = 5
y = 10
z = x + ?
補全問號中應添加的代碼。
推薦閱讀:
※有哪些圖片你第一次看見就毫不猶豫的改成了電腦桌面?
※C語言中「.」與「->」有什麼區別?
※導出音頻的時候如何做到音量最大化?
※CMU 計算機選課上有什麼特別好的課程推薦?
※二本學生如何獲得微軟的實習機會?