李真成
(天津交通職業(yè)學(xué)院, 經(jīng)濟管理學(xué)院, 天津 300110)
目前,高級語言編程開發(fā)平臺中,對高級語言進行預(yù)編譯或者試解析,從而發(fā)現(xiàn)其語法錯誤并給出報錯,已經(jīng)成為平臺軟件功能開發(fā)的必要技術(shù)。文獻[1]提出的技術(shù)僅可保障該平臺下開發(fā)的高級語言程序段的可用性,對其算法優(yōu)化過程和持續(xù)優(yōu)化結(jié)果并不能提供必要輔助。文獻[2]指出,近年來使用第三方插件對程序代碼做出基于人工智能的算法優(yōu)化成果評價,成為編程過程服務(wù)軟件開發(fā)中的重要任務(wù)。文獻[3]通過計算機編程技術(shù)對計算機編程代碼進行分析,以實現(xiàn)編程工作環(huán)境直接對編程代碼質(zhì)量的深度評價,而非傳統(tǒng)模式下僅對編程代碼的可編譯性進行評價,是當(dāng)前高級語言計算機輔助編程環(huán)境搭建工作的重要技術(shù)革新方向[4]。
以往程序員績效管理中,其代碼質(zhì)量評價標(biāo)準為代碼可編譯,可正常運行,導(dǎo)致大部分程序員的代碼質(zhì)量較差,大部分開發(fā)工時用于對代碼漏洞的修補工作,使開發(fā)成本激增。大部分程序開發(fā)工作面臨“技術(shù)綁架”的管理壓力[5]。
傳統(tǒng)模式下,計算機編程優(yōu)化的評價指標(biāo),主要包括以下三個方面。
第一,代碼本身的優(yōu)化。IT界將計算機代碼本身分為兩種[6]:一種只有編程者本人能看懂,如果間隔時間過長,其本人也很難看懂,這種代碼效率較低,縮進、注釋都較為混亂,但企業(yè)無法對該編程者取消合作關(guān)系;另一種所有編程者對照技術(shù)文檔都能看懂,這種代碼縮進、注釋等都實現(xiàn)了標(biāo)準化,技術(shù)文檔較為清晰,但每個編程者均不存在不可替代性。所以,對程序員來說,降低代碼優(yōu)化程度,或者說降低代碼質(zhì)量,可以獲得更穩(wěn)定的工作,延長開發(fā)時間,獲得更高的個人收益。這一利益趨向與開發(fā)公司的利益沖突。
第二,資源調(diào)用量的優(yōu)化。不論是個人電腦還是手機、平板電腦等設(shè)備,以及各種嵌入設(shè)備和工業(yè)設(shè)備,其自身具有的計算資源有限,在分布式計算、云計算等軟件運行環(huán)境下,網(wǎng)絡(luò)帶寬資源、內(nèi)存總線帶寬資源、顯示總線帶寬資源、其他總線帶寬資源等,也被用于資源調(diào)用量的考察。經(jīng)過充分優(yōu)化的數(shù)學(xué)算法,可以使用有限的資源調(diào)用量實現(xiàn)目標(biāo)功能。
第三,系統(tǒng)運行效率的優(yōu)化。高級語言的編程過程基本無須直接操作上述硬件資源,即便在C族語言中有ASM命令可以嵌入宏匯編語句,但大部分高級語言保留字均封裝了大量可編譯信息。優(yōu)秀的程序員可以充分利用高級語言的循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu)等構(gòu)件算法,有效壓縮程序執(zhí)行過程的計算次數(shù),使程序完成相同計算任務(wù)以及同樣計算機硬件資源支持條件的前提下,程序可以在最短時間完成計算[7]。
綜上,傳統(tǒng)評價模式主要包括表1中的評價指標(biāo)。
表1 計算機編程優(yōu)化成果評價因子匯總表
表1中,傳統(tǒng)模式下,對代碼段本身的優(yōu)化成果無法客觀定義,一般由項目經(jīng)理、產(chǎn)品經(jīng)理、測試工程師給出主觀評價,進而對各方意見給出加權(quán)平均。但因為在程序開發(fā)過程中,代碼段本身的優(yōu)化過程屬于人事績效管理中沖突最嚴重的部分,所以此處需要利用人工智能給出非主觀評價結(jié)果。
該研究的技術(shù)路徑為使用人工智能系統(tǒng)對代碼優(yōu)劣程度做出包含細節(jié)信息的整體評價。其中,人工智能的實現(xiàn)模式為模糊卷積神經(jīng)網(wǎng)絡(luò)。因為該研究設(shè)計的評價系統(tǒng)需要對大部分開發(fā)場景下的編程代碼做出評價,所以需要構(gòu)建計算機編程代碼的一般模式并在一般模式下進行數(shù)據(jù)挖掘分析。
對于軟件開發(fā)工程來說,計算機編程代碼一般分為兩個層次。
其一為面向機器編程的宏匯編語言體系(MASM),當(dāng)前可用的開發(fā)平臺包括IBM公司推出的ASM開發(fā)環(huán)境、Borland公司推出的C系列開發(fā)環(huán)境(TC、C++、VC等)、SUN公司推出的JavaBean開發(fā)環(huán)境[8]。
其二為面向?qū)ο蟮母呒壵Z言編程體系,該編程體系包含了運行在C語言編譯架構(gòu)上的GUI開發(fā)體系,解釋型代碼架構(gòu)上的偽編譯腳本開發(fā)體系(B語言架構(gòu)下的VBS腳本、C語言架構(gòu)下的C#腳本等),當(dāng)前開發(fā)環(huán)境中常用的JSP、PHP腳本代碼,部分服務(wù)器端開發(fā)任務(wù),也采用了這種偽編譯解釋性代碼體系[9]。
程序代碼文本雖然可以結(jié)構(gòu)化為可編譯或可解釋數(shù)字化代碼,但其中也包含各種自定義變量名、注釋文本等。所以,程序代碼文本屬于非標(biāo)準異構(gòu)數(shù)據(jù),應(yīng)設(shè)計數(shù)據(jù)模糊化算法對代碼段進行逐行分析。其分析流程如圖1所示。
圖1 模糊化算法的流程
圖1中,逐行讀入代碼文本,根據(jù)代碼行的注釋標(biāo)識,分析代碼行的分類,統(tǒng)計代碼行總字符數(shù)和注釋字符數(shù),另提取其非注釋部分,提取其保留字和變量名,同時分析變量的數(shù)據(jù)類型。經(jīng)過該模糊化過程,形成一個二維矩陣,矩陣的第一控制區(qū)間(行)為代碼段的總行數(shù),對每一行構(gòu)建一組評價值,作為第二控制區(qū)間(列),詳見表2。
表2 輸入矩陣第二控制區(qū)間定義表
表2中,共給出該輸入矩陣6列n行,n為代碼段的總行數(shù)。該輸入矩陣的所有元素,均為整型變量(Integer格式)。在輸入神經(jīng)網(wǎng)絡(luò)時,整型變量將強制轉(zhuǎn)化為雙精度浮點型變量(Double格式)進行輸入[10]。
將上述全部數(shù)據(jù)深度卷積的統(tǒng)一輸出結(jié)果,與逐行數(shù)據(jù)之間形成逐行優(yōu)化結(jié)果評價,而為了加強對逐行數(shù)據(jù)的評價,還需要將被評價行的向前5行和向后5行作為參照行。該神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)流模式詳見圖2。
圖2 神經(jīng)網(wǎng)絡(luò)架構(gòu)數(shù)據(jù)流圖
圖2中,共設(shè)計2個神經(jīng)網(wǎng)絡(luò)模塊。
一個為深度卷積模塊,用于對全部模糊化數(shù)據(jù)進行整體評價,其輸入節(jié)點量為6×n個。如果程序代碼段總行數(shù)為3萬行,則此處輸入數(shù)據(jù)量為18萬個。采用軟件自適應(yīng)法,根據(jù)輸入數(shù)據(jù)量構(gòu)建神經(jīng)網(wǎng)絡(luò)的節(jié)點量,節(jié)點采用六階多項式回歸函數(shù)進行節(jié)點設(shè)計,每層卷積率為35%,卷積至隱藏層末端確保節(jié)點數(shù)大于5個。
另一個為逐行評價分析模塊,其輸入節(jié)點量包括11×6的矩陣截取段輸入,共55個輸入項,同時包括上述深度卷積模塊輸出的參照模塊,即逐行評價分析模塊共輸入56個輸入項。該模塊分為兩段:第一段占用輸入層及前3層隱藏層,使用對數(shù)回歸函數(shù)進行節(jié)點設(shè)計,卷積率為75%;第二段為隱藏層后4層,采用二值化回歸函數(shù)進行節(jié)點設(shè)計,卷積率為55%。
神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)訓(xùn)練中,使所有結(jié)果收斂到[0,1]區(qū)間內(nèi),且評價結(jié)果越接近1.000,則認為代碼優(yōu)化程度越高;反之,評價結(jié)果越接近0.000,則認為代碼優(yōu)化程度越低。將輸出結(jié)果構(gòu)建直方圖,直觀顯示程序員的代碼編寫水平。
該算法最終輸出1個二值化評價序列,最大為1.000,最小為0.000,且絕大部分數(shù)據(jù)集中在1.000或0.000附近。該序列每個節(jié)點對應(yīng)代碼的每一行,節(jié)點數(shù)據(jù)本身并不能直接反映出代碼的優(yōu)劣,但對整體序列構(gòu)建直方圖后,可以直觀觀察代碼整體的開發(fā)質(zhì)量。
針對前文假設(shè)中提出的4個開發(fā)目標(biāo),該評價結(jié)果可以在唯一評價結(jié)果中給出統(tǒng)一評價。即該評價結(jié)果較高(接近1.000)的評價結(jié)果,表示代碼綜合滿足上述4個開發(fā)目標(biāo);反之,該評價結(jié)果較低(接近0.000)的評價結(jié)果,表示該代碼并不滿足上述4個開發(fā)目標(biāo)。某線上購物平臺真實開發(fā)項目團隊30人,其中開發(fā)組成員15人,代碼規(guī)模36萬行,分為72個功能文件進行開發(fā),開發(fā)模型為螺旋式開發(fā)模型。軟件試運行期間,使用上述開發(fā)團隊產(chǎn)出的代碼作為原始數(shù)據(jù)測試該系統(tǒng)執(zhí)行效果。
使用該算法在Python環(huán)境中運行,輸入不同程序員的代碼成果,對其進行評價,分別對其列出直方圖。其中,開發(fā)效率較高程序員與開發(fā)效率較低程序員的直方圖對比結(jié)果如圖3所示。
圖3中,程序員a為在所有程序員中使用深度卷積計算后評價結(jié)果最高的人,程序員b是所有程序員中使用深度卷積計算后評價結(jié)果最低的人。將開發(fā)組成員15人中直接深度卷積結(jié)果最低的程序員b(評價結(jié)果0.117)與直接深度卷積結(jié)果最高的程序員a(評價結(jié)果0.935)的直方圖結(jié)果進行對比,發(fā)現(xiàn)程序員a的整段代碼中除個別行評價結(jié)果小于1.000外,絕大多數(shù)行的評價結(jié)果均為1.000,反之程序員b的整段代碼中除個別評價結(jié)果大于0.000外,絕大多數(shù)行的評價結(jié)果均為0.000。
為了測試該系統(tǒng)在非特異性程序員的編程代碼評價中的表現(xiàn),在上述165個樣本中隨機選擇2個程序員的評價結(jié)果,如圖4所示。
圖4 非特異性程序員的評價結(jié)果對比圖
圖4中,程序員c和程序員d均為隨機選取的在所有程序員中評價結(jié)果中等的人。其中,程序員c的綜合評價結(jié)果為0.496,程序員d的綜合評價結(jié)果為0.358,系統(tǒng)均給出了較為折中的評價成績。但是,因為該算法使用了將數(shù)據(jù)落點推向[0,1]區(qū)間兩側(cè)的二值化模塊,其評價結(jié)果相對極端。
在上述2個程序員的評價結(jié)果中,部分代碼段給出了接近1.000的評價,部分代碼給出了接近0.000的評價。該結(jié)果難以對代碼段做出折中評價,但其優(yōu)勢是可以在直方圖中顯著表達程序代碼的主觀質(zhì)量。
綜合考察該軟件對開發(fā)組成員15人的評價結(jié)果與開發(fā)方技術(shù)人員對其代碼的人工審核結(jié)果。人工審核組包括甲方工程師、項目經(jīng)理、開發(fā)經(jīng)理、產(chǎn)品經(jīng)理等。人工審核組共12人,其中軟件工程師10人,行政管理人員2人,行政管理人員均有10年以上軟件開發(fā)工作經(jīng)驗。其審核方式為人工對其代碼進行打分,滿分10分,最低0分,對比15人的機器評價得分與人工評價得分的統(tǒng)計學(xué)關(guān)系,得到圖5。
圖5 人工打分與機器評價結(jié)果的關(guān)聯(lián)關(guān)系圖
圖5中,人工打分結(jié)果與機器評價結(jié)果的線性相關(guān)關(guān)聯(lián)度,以R2值評價,達到0.927,而當(dāng)R2值達到0.800以上時則認為其存在線性相關(guān)關(guān)系。其中,R2值的統(tǒng)計學(xué)意義是決定系數(shù)(coefficient of determination),代表回歸平方和與殘差平方和的比值。在此評價結(jié)果中,發(fā)現(xiàn)評價得分較低的程序代碼,其人工打分與機器打分的離散度更高,即對質(zhì)量較差的程序代碼,機器打分雖然與人工打分均給出了較低的打分,但二者的差異性較大??紤]到神經(jīng)網(wǎng)絡(luò)算法的基本原理,出現(xiàn)這一問題的主要原因為機器打分可以考慮到的質(zhì)量較差代碼的主觀因素較少。
本研究的評價系統(tǒng)是基于深度卷積模糊神經(jīng)網(wǎng)絡(luò)的編程算法優(yōu)劣的評價結(jié)果,與人工打分結(jié)果基本一致,且更具有客觀性。這一技術(shù)對程序開發(fā)項目管理的客觀績效模式搭建工作有積極意義。同時,針對編程代碼質(zhì)量進行人工打分過程可能帶入評價者的主觀因素,可能對質(zhì)量較低代碼給出比機器打分更低的分數(shù)。采用機器打分可以給編程能力稍差的編程工作人員更為客觀的評價,這也體現(xiàn)出純客觀評價對基層工作人員的基本尊重。后續(xù)研究中,通過增加神經(jīng)網(wǎng)絡(luò)復(fù)雜度提升評價精度,從而幫助程序員實現(xiàn)更高質(zhì)量的計算機編程代碼。