趙晨
(上海安鳴軟件科技有限公司 上海市 201112)
隨著人工智能的蓬勃發(fā)展,機(jī)器的智能化程度越來(lái)越高,在很多領(lǐng)域,基于大量樣本數(shù)據(jù)的自我學(xué)習(xí),計(jì)算機(jī)在某一功能領(lǐng)域能夠?qū)崿F(xiàn)自我完善,通過(guò)持續(xù)的大數(shù)據(jù)量學(xué)習(xí),執(zhí)行功能的能力會(huì)得到持續(xù)提升,究其本質(zhì),實(shí)質(zhì)上是一些重復(fù)性工作的持續(xù)優(yōu)化,機(jī)器學(xué)習(xí)本身就是學(xué)習(xí)這些重復(fù)性工作的數(shù)據(jù)(即樣本數(shù)據(jù)),然后優(yōu)化工作的過(guò)程。
在軟件開(kāi)發(fā)領(lǐng)域,如何通過(guò)引入人工智能提升開(kāi)發(fā)效率呢?首先思考機(jī)器學(xué)習(xí)的方式,由于編程工作本身,沒(méi)有可行的方案提供一致性的編程“數(shù)據(jù)樣本”,且不同的程序員實(shí)現(xiàn)的算法和過(guò)程有天壤之別,因此通過(guò)機(jī)器學(xué)習(xí)的方式讓計(jì)算機(jī)自動(dòng)編程將變得不可實(shí)現(xiàn)。
但是,通過(guò)對(duì)人工智能本質(zhì)的深入思考后發(fā)現(xiàn),機(jī)器學(xué)習(xí)只是人工產(chǎn)生智能的手段和過(guò)程,實(shí)際上,如果讓機(jī)器具有智能,可以通過(guò)更多其他手段來(lái)進(jìn)行。人工智能就是要用人工的方法使機(jī)器具有與人類(lèi)智慧有關(guān)的功能[1];另外,在《人工智能詞典》中,對(duì)人工智能的解釋是:使計(jì)算機(jī)模擬人類(lèi)的智能活動(dòng),完成人用智能才能完成的任務(wù)[2]。由此看來(lái),假定軟件構(gòu)造過(guò)程中,由機(jī)器識(shí)別并讀取軟件的各層次設(shè)計(jì)模型,從而自動(dòng)編程程序,由機(jī)器完成軟件編程工作,屬于人工智能在軟件編程領(lǐng)域的一部分。再例如專(zhuān)家系統(tǒng),專(zhuān)家系統(tǒng)是一種具有大量專(zhuān)門(mén)知識(shí)和經(jīng)驗(yàn)的智能程序系統(tǒng),也屬于一種人工智能,它能運(yùn)用領(lǐng)域?qū)<叶嗄攴e累的經(jīng)驗(yàn)和專(zhuān)門(mén)知識(shí),模擬領(lǐng)域?qū)<业乃季S過(guò)程,解決該領(lǐng)域中需要專(zhuān)家才能解決的復(fù)雜問(wèn)題[3]。我們發(fā)現(xiàn)在軟件開(kāi)發(fā)領(lǐng)域,構(gòu)建軟件的過(guò)程實(shí)質(zhì)上是在模擬真實(shí)世界的過(guò)程,理解和解釋模型需要軟件行業(yè)專(zhuān)家來(lái)進(jìn)行,這個(gè)過(guò)程類(lèi)似專(zhuān)家系統(tǒng)。例如,在設(shè)計(jì)和開(kāi)發(fā)軟件系統(tǒng)過(guò)程中,以面向?qū)ο箝_(kāi)發(fā)方法論舉例,首先是研究軟件系統(tǒng)所模擬的領(lǐng)域,其中包含了哪些實(shí)體對(duì)象,這些對(duì)象是如何通過(guò)互動(dòng)或協(xié)作來(lái)完成這些功能,從而通過(guò)軟件模擬這些功能進(jìn)而實(shí)現(xiàn)整個(gè)軟件系統(tǒng)。整個(gè)過(guò)程中,我們發(fā)現(xiàn),其中,從面向?qū)ο蠼嵌瓤?,?duì)象的抽取、對(duì)象表達(dá)、對(duì)象間協(xié)作、對(duì)象狀態(tài)管理、對(duì)象運(yùn)作權(quán)限、對(duì)象可視化展現(xiàn)等均可以通過(guò)歸納并抽象,形成模型,這是我們熟知的軟件建模;繼續(xù),如果進(jìn)一步,將這些模型轉(zhuǎn)化為代碼的過(guò)程歸納并抽象出來(lái),則通過(guò)模型直接轉(zhuǎn)化為代碼將變得可行,因此,將用人工編碼實(shí)現(xiàn)模型的算法和過(guò)程進(jìn)行抽象,讓計(jì)算機(jī)可以理解模型并進(jìn)行編程,這就是本文所述的機(jī)器編程的核心思想,因此機(jī)器編程就是基于深度抽象(非深度學(xué)習(xí))的人工智能,讓計(jì)算機(jī)理解設(shè)計(jì)模型并轉(zhuǎn)化為代碼,即機(jī)器編程,進(jìn)而實(shí)現(xiàn)軟件開(kāi)發(fā)過(guò)程不用或者使用較少的人工編程工作。
機(jī)器編程是計(jì)算機(jī)取代人類(lèi)程序員,由計(jì)算機(jī)理解設(shè)計(jì)模型并轉(zhuǎn)化為代碼的過(guò)程。通常軟件開(kāi)發(fā)步驟中,第一步架構(gòu)設(shè)計(jì)人員經(jīng)過(guò)需求采集并設(shè)計(jì)完成之后,第二步由程序員負(fù)責(zé)理解模型并實(shí)現(xiàn)編碼,機(jī)器編程完成的工作就是這個(gè)步驟中的第二步,取代程序員編程實(shí)現(xiàn)模型,而由計(jì)算機(jī)理解并實(shí)現(xiàn)模型完成編程工作。機(jī)器編程的核心要素是機(jī)器理解模型并轉(zhuǎn)變?yōu)榇a,而非由人類(lèi)程序員理解模型,并進(jìn)行實(shí)現(xiàn)的過(guò)程,因此軟件系統(tǒng)的模型化就是機(jī)器編程的輸入,可執(zhí)行代碼是機(jī)器編程的輸出。上文提到,軟件系統(tǒng)就是模擬真實(shí)世界,真實(shí)世界的模擬實(shí)質(zhì)上就是不同對(duì)象的交互,從面向?qū)ο蠼嵌?,可以從不同層?jí)對(duì)實(shí)體對(duì)象進(jìn)行建模,進(jìn)過(guò)分析與實(shí)踐,我們認(rèn)為從以下幾個(gè)分層的模型可以對(duì)軟件系統(tǒng)進(jìn)行全面的建模。
(1)領(lǐng)域模型:實(shí)體對(duì)象的種類(lèi)以及協(xié)作關(guān)系,可以直接轉(zhuǎn)化為存儲(chǔ)模型,例如可以直接轉(zhuǎn)化為關(guān)系數(shù)據(jù)庫(kù)的表達(dá)形式,存儲(chǔ)域關(guān)系數(shù)據(jù)庫(kù)中,或轉(zhuǎn)化為一般性對(duì)象數(shù)據(jù)庫(kù),領(lǐng)域模型通過(guò)持久化可以保存在領(lǐng)域模型倉(cāng)庫(kù)中,對(duì)于形成領(lǐng)域?qū)<覀}(cāng)庫(kù),從而衍生發(fā)展為領(lǐng)域模型專(zhuān)家系統(tǒng)。
(2)交互模型:表達(dá)對(duì)象間如何進(jìn)行實(shí)際交互,例如在創(chuàng)建A 對(duì)象時(shí),同時(shí)創(chuàng)建B 對(duì)象;或是創(chuàng)建A 對(duì)象完成后,將B 對(duì)象綁定到A 對(duì)象上。
(3)視圖模型:視圖模型理解為對(duì)象的展現(xiàn)模型,例如如果將對(duì)象展現(xiàn)到網(wǎng)頁(yè)上,這可以視為網(wǎng)頁(yè)模型。
(4)接口模型:接口模型表達(dá)系統(tǒng)輸入和輸出數(shù)據(jù)的模型。
(5)流程模型:表達(dá)數(shù)據(jù)的流轉(zhuǎn)規(guī)則和走向。
(6)權(quán)限模型:表達(dá)系統(tǒng)的使用者如何訪問(wèn)對(duì)象的范圍和系統(tǒng)功能的模型。
(7)對(duì)象加工模型:表達(dá)對(duì)象如何被加工和演變的模型,例如,一個(gè)報(bào)表對(duì)象,可能是由多個(gè)對(duì)象進(jìn)行組裝而來(lái)。
(8)系統(tǒng)間交互模型:表達(dá)系統(tǒng)之間的模型,例如通常所說(shuō)的不同系統(tǒng)間的數(shù)據(jù)集成工作,主要用于系統(tǒng)間信息轉(zhuǎn)換和傳遞。
以上模型中,所有模型處于不同的層級(jí)之上,關(guān)于“智能系統(tǒng)應(yīng)該是分層的”(Newell,1982)的思想已為計(jì)算機(jī)科學(xué)研究者和系統(tǒng)科學(xué)界所認(rèn)可[4]。
圖1:領(lǐng)域模型
圖2:交互模型
圖3:視圖模型
圖4:流程模型
機(jī)器編程注重模型的設(shè)計(jì),軟件生命周期中的程序編寫(xiě)環(huán)節(jié),并將模型直接轉(zhuǎn)化為可執(zhí)行代碼,人工編程僅在模型不易于表達(dá)或因設(shè)計(jì)模型不完善而無(wú)法表達(dá)時(shí)進(jìn)行人工編程,這部分代碼應(yīng)不占或僅占據(jù)整個(gè)系統(tǒng)很小的比例。
軟件生命周期貫穿了軟件工程工程的六個(gè)基本活動(dòng)[5],機(jī)器編程主要自動(dòng)實(shí)現(xiàn)其中的程序編寫(xiě)和程序測(cè)試2 個(gè)過(guò)程,將其交給機(jī)器自動(dòng)化完成。
同樣,與Outsystems,iVX,Salesforce,Mendix,Appian,Joget 等低代碼快速開(kāi)發(fā)平臺(tái)和技術(shù)的目的類(lèi)似,其目的都是加速軟件開(kāi)發(fā),減短軟件開(kāi)發(fā)過(guò)程中的迭代周期,提高開(kāi)發(fā)效率和質(zhì)量,降低開(kāi)發(fā)成本,能夠?qū)⒛P椭苯愚D(zhuǎn)化為可運(yùn)行應(yīng)用程序。但根本不同之處在于:機(jī)器編程將模型轉(zhuǎn)化為高級(jí)語(yǔ)言代碼,其轉(zhuǎn)換從編程結(jié)果和代碼角度審視,應(yīng)和人工編碼并無(wú)不同,通過(guò)編譯這些高級(jí)語(yǔ)言代碼,進(jìn)而執(zhí)行軟件系統(tǒng)。但Outsystems,iVX,Salesforce 等低代碼快速開(kāi)發(fā)平臺(tái)所采用技術(shù)開(kāi)發(fā)完成之后的系統(tǒng)僅能運(yùn)行在平臺(tái)自己架構(gòu)之上,不是以普通的高級(jí)語(yǔ)言代碼方式作為軟件開(kāi)發(fā)結(jié)果交付客戶(hù),雖然目的同樣能夠加速軟件開(kāi)發(fā),但不是以模仿人類(lèi)編程為目的,機(jī)器編程則是模仿人類(lèi)編程過(guò)程,其產(chǎn)出高級(jí)語(yǔ)言代碼作為結(jié)果是其主要特征,產(chǎn)出結(jié)果上看和人工編程并無(wú)不同,但編程效率卻大大提高。
機(jī)器編程概念最早源于本文作者2014年一種構(gòu)想,來(lái)表征軟件開(kāi)發(fā)中從模型向高級(jí)語(yǔ)言代碼轉(zhuǎn)換的過(guò)程,全部交由計(jì)算機(jī)完成,提出此構(gòu)想的另一背景是當(dāng)時(shí)由于客戶(hù)化項(xiàng)目較多,尤其較為復(fù)雜的大型項(xiàng)目,對(duì)項(xiàng)目進(jìn)度、項(xiàng)目管理形成挑戰(zhàn),且要求開(kāi)發(fā)出的項(xiàng)目能夠不依賴(lài)于開(kāi)發(fā)平臺(tái)而獨(dú)立運(yùn)行,同時(shí)項(xiàng)目代碼交付客戶(hù)后,客戶(hù)的編程人員能夠使用通用的高級(jí)編程語(yǔ)言例如Java,C#等進(jìn)行后續(xù)獨(dú)立升級(jí)開(kāi)發(fā)?;诖吮尘芭c構(gòu)想,彼時(shí),作者創(chuàng)立了上海安鳴軟件科技有限公司(Ulzin Software),將此概念付諸實(shí)驗(yàn)與實(shí)踐,項(xiàng)目代號(hào)ACB,此后幾年中,將領(lǐng)域模型、交互模型、視圖模型、接口模型、流程模型、權(quán)限模型均進(jìn)行了完整實(shí)現(xiàn),項(xiàng)目能夠通過(guò)可視化模型完整生成基于高級(jí)編程語(yǔ)言的程序代碼。
機(jī)器編程概念的核心要點(diǎn)是“模型設(shè)計(jì)一切,一切代碼源于模型”,模型類(lèi)型健全,交給計(jì)算機(jī)編程,計(jì)算機(jī)產(chǎn)出所有代碼,編程出的代碼應(yīng)和人類(lèi)程序員編寫(xiě)出的具有比擬性。
設(shè)計(jì)模型根據(jù)作用進(jìn)行分類(lèi)有六種:領(lǐng)域模型、業(yè)務(wù)交互模型、視圖模型(頁(yè)面模型)、接口模型、工作流模型、權(quán)限模型,本文以一個(gè)客戶(hù)關(guān)系管理系統(tǒng)為例描述相關(guān)模型
2.2.1 領(lǐng)域模型
領(lǐng)域模型表達(dá)對(duì)象(領(lǐng)域模型中的實(shí)體)的存儲(chǔ),同時(shí)表達(dá)面向?qū)ο笤O(shè)計(jì)中的實(shí)體對(duì)象,其關(guān)系可理解為關(guān)系數(shù)據(jù)庫(kù)中的1:1和1:N 以及N:N 關(guān)系,每個(gè)對(duì)象有其自己的屬性,例如字符串、整形、枚舉類(lèi)型等。本例中創(chuàng)建客戶(hù)、品牌、產(chǎn)品、行業(yè)4 種特種領(lǐng)域?qū)嶓w對(duì)象,每種實(shí)體中有相關(guān)屬性,例如客戶(hù)中有客戶(hù)姓名,營(yíng)業(yè)執(zhí)照等,如圖1所示。有很多因素會(huì)使軟件開(kāi)發(fā)復(fù)雜化,但最根本的原因是問(wèn)題領(lǐng)域本身的錯(cuò)綜復(fù)雜,控制復(fù)雜性關(guān)鍵是要有一個(gè)好的領(lǐng)域模型[6]。本系統(tǒng)設(shè)計(jì)的最頂層模型是領(lǐng)域模型,并且領(lǐng)域模型可以被持久化為領(lǐng)域模型倉(cāng)庫(kù)。
2.2.2 交互模型
交互模型主要設(shè)計(jì)業(yè)務(wù)實(shí)體間的協(xié)作關(guān)系,在本例中,要求在創(chuàng)建和修改客戶(hù)過(guò)程中,必須選擇行業(yè)和品牌,以及如果沒(méi)有行業(yè)和品牌的情況下,是否允許即時(shí)創(chuàng)建,或是隨同客戶(hù)創(chuàng)建時(shí)一并創(chuàng)建;在品牌的創(chuàng)建和編輯過(guò)程中必須設(shè)置產(chǎn)品的前提下才能進(jìn)行創(chuàng)建和編輯,這些不同對(duì)象的生存周期和協(xié)作過(guò)程會(huì)導(dǎo)致軟件具有不同的視圖模型,因此交互模型是視圖模型的前導(dǎo)模型,如圖2所示。
2.2.3 視圖模型
視圖模型是軟件系統(tǒng)在運(yùn)行時(shí)與用戶(hù)交互的GUI 模型,例如在創(chuàng)建、編輯、搜索、展示時(shí),分別有哪些屬性,以及屬性如何布局、以及樣式定義等。視圖設(shè)計(jì)用相同的數(shù)據(jù)綁定不同的用戶(hù)控件,豐富的用戶(hù)控件可以擁有更好的交互體驗(yàn),視圖模型是交互模型的后導(dǎo)模型,可以通過(guò)交互模型轉(zhuǎn)化成視圖模型,如圖3所示。
2.2.4 流程模型
流程模型主要設(shè)計(jì)事務(wù)處理過(guò)程中的流程邏輯,將流程用可視化的方式表達(dá)出來(lái),例如此例中客戶(hù)上傳的營(yíng)業(yè)執(zhí)照?qǐng)D片在不同條件下,存儲(chǔ)在不同的位置,這種邏輯可以用流程模型來(lái)進(jìn)行設(shè)計(jì)。由于流程的實(shí)質(zhì)是邏輯的抽象,因此,本文中提到的對(duì)象加工模型和系統(tǒng)交互模型實(shí)際上可以看作是流程模型的實(shí)例,因此,可以通過(guò)設(shè)計(jì)更詳細(xì)的流程模型來(lái)實(shí)現(xiàn)對(duì)象加工模型和系統(tǒng)交互模型,如圖4 流程模型所示。
2.2.5 接口模型
接口模型用于設(shè)計(jì)系統(tǒng)與其他系統(tǒng)進(jìn)行信息傳遞時(shí)的輸出和輸出接口規(guī)范,本質(zhì)上,視圖模型就是一種與用戶(hù)進(jìn)行交互的接口實(shí)例,因此可以將視圖模型用作接口模型,因此接口模型本文不再贅述。
2.2.6 權(quán)限模型
權(quán)限模型用于設(shè)計(jì)業(yè)務(wù)對(duì)象在運(yùn)行時(shí),當(dāng)前登錄用戶(hù)是否可以訪問(wèn),例如一個(gè)客戶(hù)列表,當(dāng)前用戶(hù)能夠訪問(wèn)哪些客戶(hù)數(shù)據(jù);或者某個(gè)功能是否可以訪問(wèn),例如頁(yè)面、按鈕。這種模型經(jīng)過(guò)抽象,通常可以固化為一個(gè)功能:在權(quán)限管理側(cè),設(shè)置軟件系統(tǒng)登陸用戶(hù)可以或怎樣管理哪些其他用戶(hù),這些用戶(hù)ID 稱(chēng)為“可管理用戶(hù)”,例如上級(jí)可以管理哪些下級(jí),以及設(shè)置軟件系統(tǒng)登陸用戶(hù)能否訪問(wèn)一些功能,例如頁(yè)面、按鈕控件;在業(yè)務(wù)模塊中,取出業(yè)務(wù)對(duì)象所關(guān)聯(lián)的所有用戶(hù)ID,例如客戶(hù)的創(chuàng)建者ID,這些用戶(hù)ID 稱(chēng)為“對(duì)象關(guān)聯(lián)用戶(hù)”。將“可管理用戶(hù)”和“對(duì)象關(guān)聯(lián)用戶(hù)”取交集,得到的結(jié)果,就是當(dāng)前登錄用戶(hù)可以管理哪些用戶(hù),取出這些交集用戶(hù)創(chuàng)建的客戶(hù)就完成了權(quán)限管理。這里的創(chuàng)建者只是一種常見(jiàn)對(duì)象關(guān)聯(lián)示例,實(shí)際中可能有更多種形式。權(quán)限模型在本項(xiàng)目的運(yùn)行時(shí)框架部分進(jìn)行了實(shí)現(xiàn)。
圖5:基于T4 文本引擎的轉(zhuǎn)換過(guò)程
圖6:源代碼(C#)
圖7:源代碼(Java)
圖8
表1
每種模型向代碼轉(zhuǎn)換的過(guò)程,由于是“編寫(xiě)代碼的代碼”,可以采用一種文本模板轉(zhuǎn)換引擎為工具,以提高轉(zhuǎn)換代碼得可讀性和調(diào)試得便利性,例如Mircosoft T4 Text Template Transformation Toolkit,圖5 是一個(gè)ComboBox 控件的前端模型到代碼的轉(zhuǎn)換源碼示例。
對(duì)于特殊代碼的部分,需要采用一種方式,將用戶(hù)的自定義代碼與系統(tǒng)生成的代碼相融合,將客戶(hù)化代碼融合進(jìn)系統(tǒng)生成的代碼,一種方案是采用事件機(jī)制,例如當(dāng)用戶(hù)點(diǎn)擊上傳按鈕上傳完畢一份營(yíng)業(yè)執(zhí)照時(shí),用自定義代碼提示營(yíng)業(yè)執(zhí)照上傳完成,完成此項(xiàng)任務(wù)可以在上傳按鈕上綁定onupload 事件,寫(xiě)上開(kāi)發(fā)者自定義的提示代碼。
系統(tǒng)由模型生成的代碼是業(yè)務(wù)范疇內(nèi)的功能,例如一個(gè)CRM客戶(hù)管理系統(tǒng),通過(guò)模型設(shè)計(jì),并利用機(jī)器編程得到的代碼實(shí)際上是業(yè)務(wù)對(duì)象交互的功能,一些其他業(yè)務(wù)無(wú)關(guān)的基礎(chǔ)功能代碼,例如調(diào)用底層的數(shù)據(jù)庫(kù)交互或是,需要一個(gè)通用的框架,這個(gè)框架被稱(chēng)為運(yùn)行時(shí)框架。將模型生成的代碼放入運(yùn)行時(shí)框架,共同編譯,得到的結(jié)果就是一個(gè)完整可運(yùn)行、二進(jìn)制軟件系統(tǒng)。
機(jī)器編程由于速度快,在設(shè)計(jì)時(shí)就可以隨時(shí)看到機(jī)器編程的結(jié)果代碼,本文給出兩種代碼類(lèi)型結(jié)果:C#、Java,如圖6 和圖7所示。
本例進(jìn)行編譯執(zhí)行后的運(yùn)行結(jié)果如圖所示,圖8 是一個(gè)將源代碼編譯通過(guò)后執(zhí)行的客戶(hù)關(guān)系管理系統(tǒng)。
圍繞模型到代碼的轉(zhuǎn)換還有很多有價(jià)值功能可以拓展,例如對(duì)象加工模型和系統(tǒng)集成模型可以通過(guò)流程模型來(lái)填補(bǔ),目前未進(jìn)行實(shí)現(xiàn),因此本論文不包含相關(guān)部分介紹。其次視圖模型設(shè)計(jì)的可視化部分最終目標(biāo)應(yīng)與系統(tǒng)運(yùn)行時(shí)效果保持一致,目前是一種抽象的視圖設(shè)計(jì)效果,設(shè)計(jì)時(shí)效果與運(yùn)行時(shí)效果保持完全一致是最佳結(jié)果。
另外,代碼種類(lèi)可以進(jìn)一步得到擴(kuò)展,目前已完整實(shí)現(xiàn)的代碼種類(lèi)C#和Java,代碼引擎如果能夠進(jìn)一步抽象,形成代碼引擎開(kāi)發(fā)規(guī)范,將更易于向其他語(yǔ)言進(jìn)行擴(kuò)展。
最后,由于設(shè)計(jì)模型的實(shí)際上是一個(gè)完整的系統(tǒng)知識(shí)庫(kù),是完成整個(gè)軟件項(xiàng)目的充要條件,因此模型的產(chǎn)出結(jié)果實(shí)際上可以更加豐富,例如,通過(guò)模型應(yīng)還能自動(dòng)產(chǎn)生軟件的介紹文檔、介紹視頻、演示視頻,以及自動(dòng)化測(cè)試腳本等。
按照本文定義的機(jī)器編程概念,所有設(shè)計(jì)模型,領(lǐng)域模型、業(yè)務(wù)交互模型、視圖模型、接口模型、工作流模型、權(quán)限模型,到代碼的轉(zhuǎn)換得到了完整實(shí)現(xiàn),并在作者所在的上海安鳴軟件科技有限公司目前核心業(yè)務(wù)所在廣告行業(yè)的DSP、DMP、SSP、CRM、SEM等系統(tǒng)中都成功得以成功應(yīng)用和上線(xiàn)。
最后,表1 將機(jī)器編程和人工編程的進(jìn)行對(duì)比。