摘要: 當軟件開發遇見機器學習,到底能碰撞出什麼樣的火花呢?
機器學習有望從根本上改變軟件開發的本質,這也許是自FORTRAN和LISP被髮明以來軟件開發領域改變最大的一次。這些變化對數百萬正在從事軟件開發的人而言,意味着什麼呢?失業?裁人?現有的軟件開發將變得面目全非?程序員
自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論證了,計算機在針對一個問題尋找最佳答案上表現出色。由於計算機的本質是計算工具。可是他們不是很擅長「找到一個值得回答的有趣問題」,這件事是人類作的。那麼,咱們須要提出哪些重要的問題呢?
這些重要的問題已經在不斷的被發現了,好比咱們剛剛開始認識到道德在計算中的重要性,纔開始考慮更好的用戶界面,包括會話界面:它們將如何運做?即便在人工智能的幫助下,咱們的安全問題也不會消失。先無論安全問題怎樣,咱們全部的設備都在變得「聰明」。這意味着什麼?咱們但願它們作什麼?人類不會編寫儘量多的低級代碼。可是正由於他們將不會去編寫那些代碼,因此他們能夠自由地思考代碼應該作什麼,以及它應該如何與人交互。須要解決的問題永遠不會少。
很難想象「人類再也不建立軟件」的將來,但很容易想象「將人歸入軟件研發的循環」中在將來將佔愈來愈多的比重。
本文爲雲棲社區原創內容,未經容許不得轉載。