深度揭祕:機器學習對軟件開發帶來哪些影響?

機器學習有望從根本上改變軟件開發的本質,這也許是自FORTRAN和LISP被髮明以來軟件開發領域改變最大的一次。這些變化對數百萬正在從事軟件開發的人而言,意味着什麼呢?失業?裁員?現有的軟件開發將變得面目全非?
![fractal_1280081_1920_crop_325b83619dd2106a199b87e2443c9aee]

(https://yqfile.alicdn.com/7c8b4d73b1fc7e2cf75f663b308885d2555d0066.jpeg)
自20世紀70年代以來,我們儘可能的構建了足夠多的軟件。我們有高級語言,低級語言,腳本語言以及用於構建和測試軟件的工具,但我們利用這些工具做的事情卻沒有發生太大變化。我們現在擁有的語言和工具比50年前要好得多,但它們本質上是一樣的。我們仍然使用代碼編輯器,但這些編輯器變得更花哨了:他們有彩色的高亮,變量名補全,它們有時可以幫助我們完成重構等任務,但他們仍然是emacs和vi的後代。面向對象編程代表了一種不同的編程風格,但從某種本質上而言並不是“全新”的事物,對於函數式編程我們可以一直追溯到50年代。
未來我們將專注於機器學習而不是人工智能。機器學習曾經被稱爲“AI最管用的那一部分”,更重要的是,“機器學習”這種提法可以避開類似“通用智能”這種叫法。因爲這樣的系統目前不存在,並且可能永遠不存在,目前來看只有人類才能做到這一點。而機器學習可能只比模式識別多一點點,但我們已經看到模式識別可以完成很多工作。實際上,手工編碼的模式識別是我們當前工具集的核心:這真的是現代優化編譯器所正在做的。
麥肯錫估計“使用現有技術,只有不到5%的職業可以完全自動化。然而,大約有60%的職業工作活動中,具有30%或更多的組成部分能夠被自動化。”軟件開發和數據科學不會成爲完全被自動化的職業之一。但優秀的軟件開發人員一直在尋求對於繁瑣,重複的任務的自動化,毫無疑問,軟件開發本身將日益變得可以被自動化。這並不是一個激進的願景,因爲我們在過去的半個世紀裏持續的爲了自動化工具而努力。編譯器對編寫機器代碼的過程進行了自動化。腳本語言通過將更大,更復雜的程序粘合在一起來自動執行許多枯燥無味的任務。軟件測試工具、自動部署工具、容器和容器編排系統等等,這些都是爲了對開發、部署、管理軟件系統的過程進行自動化的工具。而且這些都沒有利用機器學習,但這肯定是下一步它們要做的。
機器學習會不會吞併軟件?
畢竟,“軟件吞噬世界”是一個日益抽象和普遍化的過程。筆記本電腦,手機或智能手錶已經逐漸取代收音機,電視機,鎖和鑰匙,電燈開關,這是因爲我們並沒有將計算機僅僅看成數字計算器而是通用機器。從這個角度來看,很容易將機器學習想象成下一個抽象層次,這是我們迄今爲止發現的最通用的問題解決工具。當然,神經網絡已經證明了它們可以執行許多特定任務。由資深人士樂觀地表示,對於許多任務而言,收集數據比編寫程序更容易。對於一些非常有趣且困難的程序,這無疑是正確的,比如說收集圍棋或國際象棋的訓練數據很容易,但很難寫一個程序成功地玩這些遊戲。另一方面,數據收集並不總是那麼容易。我們無法設想自動標記圖片的程序,特別是在Facebook和阿里巴巴這樣收集了數十億張圖片的網站,而且其中許多圖片已被人類標記過。對於像人臉識別這樣的任務,我們不知道如何編寫軟件,而且很難收集數據。對於其他任務,例如計費,可以很容易地根據一些簡單的業務規則編寫程序。如果你能夠收集數據,你編寫的程序將更好地適應不同的情況,還能夠檢測異常,這一點當“將人類納入軟件迭代的循環”時,尤爲如此。
正在代替代碼的機器學習
機器學習正在使代碼變得高效:Google的Jeff Dean說,500行TensorFlow代碼已經取代了谷歌翻譯中的500000行代碼。雖然代碼行數是一個值得質疑的指標,但無論是從編程工作量角度來看還是從需要維護的代碼量來看,這個突破都是可稱讚的。更重要的是這段代碼是如何工作的:相比於五十萬行的代碼,這是一個經過訓練以用於翻譯的神經網絡。神經網絡可以隨着語言的變化和使用場景的變化,在新數據上被重新訓練,而且整個代碼都不需要重寫。雖然我們不應低估訓練任何複雜度的神經網絡的難度,但我們同樣也不應低估管理和調試一個巨大代碼庫帶來的問題。
研究表明,神經網絡可以通過組合現有模塊來創建新程序。雖然以這種方式構建的程序很簡單,但是讓單個神經網絡能夠學習執行幾個不同的任務是很重要的,每個任務通常都需要一個單獨的程序。
Pete Warden認爲:“開發人員必須成爲一名教師(教機器),一名訓練數據的策劃人。”我們發現,這種說法非常具有啓發性。軟件開發不會消失,但開發人員必須以不同的方式來思考自己。你如何構建一個解決一般問題的系統,然後教該系統解決一個特定的任務?這貌似聽起來像是一個風險很高又麻煩的場景。但這意味着我們的系統將變得更加靈活,具有很強的適應性。Warden設想的未來,更多是關於產出的,而不是關於撰寫代碼行數。Peter經過更加系統的思考,認爲機器學習可以從訓練數據中產生短程序,而不是很大的程序。
數據管理和基礎設施
早期的跡象表明,機器學習有着可以勝過傳統的數據庫索引的性能:它可以學習預測數據的存儲位置或者預測數據是否存在。機器學習明顯更快,並且需要更少的內存,但也有着相當大的限制性:當前基於機器學習的工具不包括多維索引,並假設數據庫不經常更新。重新訓練比重建傳統數據庫索引需要更長的時間。儘管如此,研究人員正在研究如何學習到多維索引,查詢的優化,重新訓練的性能。
機器學習已經進入了數據基礎設施的其他領域。數據工程師正在使用機器學習來管理Hadoop,從而可以更快地響應Hadoop集羣中的內存不足等問題。 Kafka工程師使用機器學習來診斷問題,從而簡化了管理許多配置的問題,這些配置會影響數據庫的性能。數據工程師和數據庫管理員不會過時,但他們可能需要發展一下他們的機器學習技能。機器學習將幫助他們使困難的問題變得更簡單,管理數據基礎架構這個工作,將不會像正確設置數百個不同的配置參數那樣,它會更像是在訓練一個系統,讓整個管理工作運行的更有條理。
使困難問題變得可管理是數據科學最重要的問題之一。數據工程師負責維護數據管道:提取數據、清理數據、特徵工程和模型構建。同時他們還需要負責在非常複雜的環境中部署軟件,一旦部署了這些基礎架構,還需要不斷監視它,以檢測(或防止)資源用盡,確保模型正確運行。這些都是非常適合用機器學習處理的任務,我們越來越多地看到像MLFlow這樣的軟件能夠被用於管理數據管道。
數據科學
在自動化編程的早期表現形式中,工具旨在使數據分析師能夠執行更高級的分析任務。Automatic Statistician是一種更新的工具,可自動進行探索性數據分析,併爲時間序列類型的數據提供統計模型,且附有詳細說明。
隨着深度學習的興起,數據科學家發現自己需要尋找合適的神經網絡架構和參數。讓神經網絡學着找到合適自己架構的過程,也可能被自動化。畢竟,神經網絡就只是單純的自動化學習工具:雖然構建神經網絡結構需要大量的人力工作,但是不可能手動調整模型的所有參數。未來的場景應該是使用機器學習來探索所有可能的神經網絡架構:正如一篇文章指出的,10層網絡可能就有10的10次方種可能性。已經有其他研究人員使用強化學習來讓神經網絡架構開發變得更加容易。
模型創建不是一勞永逸的事情:數據模型需要不斷進行測試和調整。我們開始看到的用於持續監控和模型調整的這些工具並不是特別新穎,比如用於A/B測試的老虎機算法已經存在了一段時間,對於許多公司來說,老虎機算法算是強化學習的第一步。機器學習同樣也可以用來查找軟件中的漏洞,有些系統會瀏覽代碼,並尋找已知的缺陷。這些系統不一定需要能夠修復代碼,也不承諾找到所有潛在的問題。但是他們可以很容易地對危險的代碼進行高亮顯示,並且他們可以允許在大型代碼庫上進行開發的程序員提出諸如“還有類似這樣的問題存在於其他地方嗎?”之類的問題。
遊戲開發者也正在探索利用機器學習來降低遊戲開發成本以及創造更多有趣的遊戲。機器學習可以用來製作看起來更逼真的背景和場景嗎?遊戲開發者都知道對逼真的場景和圖像進行繪製和建模又耗錢,又費時。目前,非玩家角色(NPC)所做的一切都必須明確編程。機器學習可以用來模擬NPC的行爲嗎?如果NPC可以學習到行爲,我們可以期待更有創意的遊戲玩法出現。
展望未來
軟件開發人員的未來是什麼樣的?軟件開發是否會同樣走上麥肯錫爲其他行業預測的演化路徑呢?在軟件開發和數據科學中所涉及的30%的工作是否會被自動化?也許,剛剛我們所談的只是對未來某種情況的簡單解讀。但毫無疑問,機器學習將改變軟件開發。如果未來我們現在所認爲的“編程”中很大一部分被自動化了,那也沒什麼好驚訝的。編譯器不進行機器學習,但他們通過自動生成機器代碼來改變軟件行業,這在未來可能並不是什麼新鮮事。
重要的問題是軟件開發和數據科學將如何變化。一種可能性,實際上是一種事實:軟件開發人員會在數據收集和準備方面投入更多精力。沒有數據訓練,機器學習就什麼都不是。開發人員必須做的,不僅僅是收集數據; 他們必須構建數據管道,以及構建管理這些管道的基礎設施,我們稱之爲“數據工程”。在許多情況下,這些管線本身將使用機器學習來監控和優化自己。
我們可以看到訓練機器學習算法成爲一個獨特的子專業;我們可能很快會有一個新職業-“訓練工程師”,就像我們目前談論的“數據工程師”一樣。Andrew Ng在他自己的《機器學習渴望》一書時中說:“這本書的重點不是教你ML算法,而是教你如何讓ML算法有效。沒有編碼,也沒有複雜的數學。本書幾乎完全側重於模型訓練過程,而不僅僅是編碼,訓練纔是讓機器學習有效工作的本質。”
我們提出的想法都涉及一種能力:它使人類能夠生產出更快、更可靠、更好的能夠生效的產品。開發人員將能夠將更多時間花在有趣且更重要的問題上,而不是把基本工作做好。那些問題可能是什麼問題呢?
在一篇關於智能增強的討論裏,Nicky論證了,計算機在針對一個問題尋找最佳答案上表現出色。因爲計算機的本質是計算工具。但是他們不是很擅長“找到一個值得回答的有趣問題”,這件事是人類做的。那麼,我們需要提出哪些重要的問題呢?
這些重要的問題已經在不斷的被發現了,比如我們剛剛開始認識到道德在計算中的重要性,纔開始考慮更好的用戶界面,包括會話界面:它們將如何運作?即使在人工智能的幫助下,我們的安全問題也不會消失。先不管安全問題怎樣,我們所有的設備都在變得“聰明”。這意味着什麼?我們希望它們做什麼?人類不會編寫儘可能多的低級代碼。但是正因爲他們將不會去編寫那些代碼,所以他們可以自由地思考代碼應該做什麼,以及它應該如何與人交互。需要解決的問題永遠不會少。
很難想象“人類不再創建軟件”的未來,但很容易想象“將人納入軟件研發的循環”中在未來將佔越來越多的比重。
本文由阿里云云棲社區組織翻譯。
文章原標題《what-machine-learning-means-for-software-development》作者:Ben Lorica,O'Reilly Media的首席數據科學家
譯者:虎說八道,審校:袁虎。
文章爲簡譯,更爲詳細的內容,請查看原文
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章