籠統(tǒng)地說,機器學(xué)習(xí)技術(shù)不僅可以用于加速傳統(tǒng)軟件開發(fā)生命周期(SDLC),而且還為創(chuàng)造技術(shù)提供了一種全新的范例。
傳統(tǒng)開發(fā)計算機程序的方式需要你事先確切地指定系統(tǒng)要執(zhí)行哪些操作,然后手動設(shè)計所有技術(shù)功能。因為在人工智能出現(xiàn)之前,計算機的功能仍然是非常強大的,因此可以用明確的方式來編碼許多任務(wù)。
然而,有許多任務(wù)和決定太過復(fù)雜,不能以嚴(yán)格的、基于規(guī)則的方式向計算機傳達(dá)。即使是識別互聯(lián)網(wǎng)上的照片或視頻是不是一個關(guān)于貓的照片或者視頻,這么一個看似簡單的活動,也是傳統(tǒng)軟件開發(fā)所無法企及的。考慮到不同的貓照片可能存在巨大的差異,所以沒有一個工程師團隊可以列舉出所有可以可靠地識別出是貓、而不是其他可能出現(xiàn)在照片或者視頻中所有物體的規(guī)則。
一方面,機器學(xué)習(xí)從根本上改變了軟件開發(fā)的范式。
引入人工智能技術(shù),例如機器學(xué)習(xí)和深度學(xué)習(xí)。在這些技術(shù)方法中,工程師不會給出關(guān)于如何做出決定和采取行動的計算機規(guī)則。相反,人工智能策劃并準(zhǔn)備了特定領(lǐng)域的數(shù)據(jù),并將這些數(shù)據(jù)輸入到學(xué)習(xí)算法中,這些算法經(jīng)過反復(fù)訓(xùn)練不斷地改進。機器學(xué)習(xí)模型可以從數(shù)據(jù)中推導(dǎo)出哪些特征和模式是重要的,不需要人類明確地編碼這些知識。機器學(xué)習(xí)模型的輸出甚至可以給人類帶來驚喜,突出我們沒有想到的一些觀點或者細(xì)節(jié)。
因此,人工智能對計算機編程最深刻的影響,是解開了人類如何感知、定義和執(zhí)行軟件開發(fā)的謎團。作者、科學(xué)家和谷歌研究工程師Pete Warden認(rèn)為,“隨著知識在開發(fā)人員社區(qū)中的擴散,我們還要等上相當(dāng)長一段時間,但我預(yù)測,10年內(nèi)大多數(shù)軟件工作將不涉及編程”。
前OpenAI研究科學(xué)家、現(xiàn)任特斯拉人工智能總監(jiān)的Andrej Karpathy表示認(rèn)同,他說“未來很大一部分程序員不會維護復(fù)雜的軟件庫,編寫復(fù)雜的程序或分析其運行時間。他們收集、清理、操作、標(biāo)記、分析和可視化提供給神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)?!盞arpathy用一種非常引人矚目的見解描述了這種巨大的變化:“神經(jīng)網(wǎng)絡(luò)不僅僅是另一個分類器,神經(jīng)網(wǎng)絡(luò)還代表了我們?nèi)绾螐母旧细淖兙帉戃浖姆绞剑@就是軟件2.0?!?/p>
他把軟件1.0的“經(jīng)典堆?!倍x為由程序員使用諸如Python或C 等語言編寫給計算機的明確指示。傳統(tǒng)的軟件開發(fā)生命周期通常始于需求定義(即技術(shù)規(guī)范),然后是設(shè)計和開發(fā)。一旦建立了可行的原型,就有質(zhì)保測試。最后,一旦產(chǎn)品通過審核,將被部署到生產(chǎn)中,而且得到持續(xù)的維護。敏捷流程可以讓這個循環(huán)加快速度,因為工程師會選擇一個較小的功能集,專門用2-4周的時間沖刺,而不是一次性構(gòu)建整個軟件。然而,無論是敏捷式還是瀑布式,過程本質(zhì)上都是相同的。
隨著時間的推移,這些系統(tǒng)變得非常復(fù)雜,需要多個依賴關(guān)系和集成,以及層層的功能和接口。所有這些組件必須由人工手動管理和更新,而這會導(dǎo)致不一致和無法解決的錯誤。
相比之下,機器學(xué)習(xí)模型可以推斷出數(shù)據(jù)中的重要特征和模式。用Karpathy的話來說,軟件2.0是以“神經(jīng)網(wǎng)絡(luò)權(quán)重”的形式編寫代碼,不是由人類編寫,而是由機器學(xué)習(xí)方法如反向傳播和隨機梯度下降編寫的。更新模型需要使用新數(shù)據(jù)重新訓(xùn)練算法,這將改變模型的行為方式和執(zhí)行方式。
盡管機器學(xué)習(xí)在開發(fā)和維護方面面臨挑戰(zhàn),但Karpathy強調(diào)了這一事實:軟件2.0正在變得高度可行且具有價值,因為“大部分現(xiàn)實世界的問題都具有易于收集數(shù)據(jù)的特性(或者更一般地說,確定一個理想的行為),而不是明確編程。”從軟件2.0中受益最大的領(lǐng)域包括計算機視覺、語音識別、機器翻譯、游戲、機器人和數(shù)據(jù)庫。
Karpathy還提到了這種新范式的好處:
更同構(gòu),更易于管理
然而,有得也有時失。很多機器學(xué)習(xí)方法的關(guān)鍵局限性,是我們?nèi)祟悷o法完全理解如此復(fù)雜的系統(tǒng)如何工作,導(dǎo)致這種機器學(xué)習(xí)方法在我們看來就是一些“黑盒子”。由于我們?nèi)狈斫夂涂刂贫鴮?dǎo)致的另一個挑戰(zhàn),是由于有缺陷的模型(例如算法偏差和機器人僵尸)而產(chǎn)生一些意外的、令人尷尬的后果。
另一方面,傳統(tǒng)軟件從機器學(xué)習(xí)技術(shù)中獲益。
傳統(tǒng)的軟件開發(fā)并未就此消失。訓(xùn)練一個高性能的機器學(xué)習(xí)模型,這只是人工智能技術(shù)產(chǎn)品化的一個步驟。正如谷歌的一篇論文所指出,只有一小部分真實世界的機器學(xué)習(xí)系統(tǒng)是由機器學(xué)習(xí)代碼組成的。
諸如數(shù)據(jù)管理、前端產(chǎn)品接口和安全等關(guān)鍵組件仍然需要由常規(guī)軟件來處理。然而,使用傳統(tǒng)SDLC開發(fā)的技術(shù)仍然可以通過以下途徑從機器學(xué)習(xí)方法中受益:
1、快速原型化。將業(yè)務(wù)需求轉(zhuǎn)化為技術(shù)產(chǎn)品通常需要幾個月的時間,但機器學(xué)習(xí)通過讓較少的技術(shù)專家使用自然語言或可視界面開發(fā)技術(shù)縮短了這一過程。
2、智能編程助理。開發(fā)人員大部分時間都在閱讀文檔和調(diào)試代碼。智能編程助手可通過提供即時支持和建議(如相關(guān)文檔、最佳實踐和代碼示例)縮短這部分時間,例如Kite for Python和Codota for Java。
3、自動分析和錯誤處理。編程助理還可以從過去的經(jīng)驗中學(xué)習(xí),以發(fā)現(xiàn)常見的錯誤并在開發(fā)階段自動標(biāo)記這些錯誤。某項技術(shù)一旦被部署,機器學(xué)習(xí)還可以用于快速分析系統(tǒng)日志,甚至主動標(biāo)記錯誤。未來,還可以在不需人工干預(yù)的情況下,讓軟件動態(tài)變化以應(yīng)對各種錯誤。
4、自動代碼重構(gòu)。對于團隊協(xié)作和長期維護來說,清除代碼至關(guān)重要。隨著企業(yè)逐步升級技術(shù),大規(guī)模重構(gòu)是不可避免的,而且往往是痛苦的過程。機器學(xué)習(xí)可用于分析代碼并自動優(yōu)化其可解釋性和性能表現(xiàn)。
5、精確估算。眾所周知,軟件開發(fā)常常遇到超出預(yù)算和超出時間表的問題。可靠的估算需要深厚的專業(yè)知識、對背景的了解以及對實施團隊的熟悉程度。機器學(xué)習(xí)可以訓(xùn)練過去的項目數(shù)據(jù),如用戶故事、特征定義、估算數(shù)據(jù)和實際數(shù)據(jù),更準(zhǔn)確地預(yù)測工作量和預(yù)算。
6、戰(zhàn)略決策。我們有相當(dāng)一部分時間花在討論哪些產(chǎn)品和功能需要優(yōu)先考慮,哪些功能需要削減掉。針對以往開發(fā)項目和商業(yè)因素訓(xùn)練的人工智能解決方案,可以評估現(xiàn)有應(yīng)用的性能,并幫助業(yè)務(wù)負(fù)責(zé)人和工程團隊確定如何最大限度地發(fā)揮影響以及降低風(fēng)險。
根據(jù)Forrester Research關(guān)于人工智能影響軟件開發(fā)的報告:企業(yè)將人工智能大量應(yīng)用于軟件開發(fā)的興趣,主要集中在自動化測試和缺陷檢測工具方面。
最后,一個終極問題是,人工智能能否創(chuàng)造人工智能,從而顛覆人類參與技術(shù)開發(fā)的需要。實際上,我們已經(jīng)看到AutoML解決方案的大幅增長,這種解決方案旨在實現(xiàn)機器學(xué)習(xí)模型訓(xùn)練流程各個部分的自動化,以減少數(shù)據(jù)科學(xué)家和工程師的工作量,讓領(lǐng)域?qū)<夷軌蛴?xùn)練出生產(chǎn)質(zhì)量模型。諸如H2O.ai的無人駕駛?cè)斯ぶ悄?,Google Cloud的AutoML和Amazon Sagemaker等解決方案,可自動化或精簡關(guān)鍵組件,如數(shù)據(jù)準(zhǔn)備、模型搜索和優(yōu)化、模型部署和擴展。