張 翔,周 健
(安徽大學(xué) 計算機科學(xué)與技術(shù),合肥 230000)
近年來,隨著網(wǎng)絡(luò)科技持續(xù)不斷的迅猛發(fā)展和計算機技術(shù)的廣泛普及,獨立開源軟件開發(fā)者們?nèi)粘S靡院献鏖_發(fā),信息共享的虛擬社區(qū)也在蓬勃壯大,這種快速發(fā)展的線上合作生產(chǎn)模式引發(fā)了研究人員的熱切關(guān)注.伴隨著海量開源軟件的發(fā)布和風(fēng)靡,愈來愈多的相關(guān)人員希望能夠了解開源軟件的成功因素是由哪些要素構(gòu)成[1,2],是否能從數(shù)據(jù)化的角度考量一款開源軟件的魯棒性和成功的可能性,從而為商業(yè)上的技術(shù)可行性,軟件安全性及項目開發(fā)人的專業(yè)性考量等提供準(zhǔn)確的決策標(biāo)準(zhǔn).
開源社區(qū)由于其門檻較低,代碼開源,支持開發(fā)者自由的參與等特性,引來了數(shù)以千萬計的軟件開發(fā)者,然而正因為這些易于上手的特性,使得很多開源軟件的開發(fā)效率低下,極易發(fā)生項目提前終止,或者完成的軟件質(zhì)量根本無法達到預(yù)期等.在當(dāng)今開源社區(qū)中,Github集成了版本控制,代碼托管,團隊協(xié)作以及社區(qū)問答,是當(dāng)之無愧的領(lǐng)袖級社區(qū),其社區(qū)包含了項目開發(fā)者信息,代碼庫信息,提交信息,合并信息以及bug信息等等.為了方便人們更深入的研究,Github開放了名為REST API[3]的接口,使得開發(fā)人員可以直接調(diào)用接口來獲取相應(yīng)的信息,其原理是通過GET等http請求向接口發(fā)出請求命令,而后服務(wù)器返回結(jié)果.然而沒過多久研究人員們就發(fā)現(xiàn)該API的局限性,對于單個賬號,每小時只能調(diào)用5000次.而Github社區(qū)平局每小時的事件(event)處理次數(shù)高達8000余次,這就意味著單個賬號無法獲取完成的數(shù)據(jù)集鏡像,基于此種情況,2013年,荷蘭的Delft 科技大學(xué)軟件工程組的Gousios在MSR發(fā)表論文[4],開發(fā)出 GHTorrent 工具,該工具通過緩存和并行處理成功地將調(diào)用次數(shù)超越了每小時5000次的瓶頸.GHTorrent項目旨在通過Github REST API提供的數(shù)據(jù)創(chuàng)建一個可擴展,可查詢且可脫機的數(shù)據(jù)鏡像.GHTorrent會監(jiān)察記錄Github中公共事件的時間表.針對所有事件,均會精確地檢索其內(nèi)容及事件之間的依賴性,并以JSON格式存儲到MongoDB數(shù)據(jù)庫,并同步提取其結(jié)構(gòu)到MySQL數(shù)據(jù)庫中.
通過對復(fù)雜網(wǎng)絡(luò)的深層分析和挖掘,研究人員就不同網(wǎng)絡(luò)之間的相互依賴性是如何影響負載從而導(dǎo)致級聯(lián)故障的發(fā)生,得出了新的結(jié)論[5],基于Agent模型建立了“故障-擴散-恢復(fù)-免疫”的級聯(lián)故障模型[6],結(jié)合加權(quán)無標(biāo)度網(wǎng)絡(luò)模型[7],以此提高相應(yīng)網(wǎng)絡(luò)的魯棒性[8],以及級聯(lián)故障下的耦合網(wǎng)絡(luò)的魯棒性[9],并且在此基礎(chǔ)上測量網(wǎng)絡(luò)的可靠性和可修復(fù)性[10].
目前,國內(nèi)外的研究人員已經(jīng)做出許多相關(guān)的工作,例如開源社區(qū)中開發(fā)者與源代碼的協(xié)調(diào)性,開源社區(qū)開發(fā)者的提交行為挖掘以及不同開發(fā)者之間的集體合作關(guān)系等.Chen等人[11]基于Github社區(qū)的commit提交行為作為導(dǎo)向,提出開發(fā)者的提交行為受成員的組織來源和規(guī)模大小影響,大多commit行為主要源于少數(shù)核心人員的貢獻.He等人[12]以SourceForge社區(qū)的數(shù)據(jù)研究,構(gòu)建了管理者-項目的二分網(wǎng)絡(luò)模型,并在此基礎(chǔ)上提出了核心-邊緣網(wǎng)絡(luò)結(jié)構(gòu)的管理者合作網(wǎng)絡(luò)模型.Choi等人[13]以網(wǎng)絡(luò)調(diào)研的方式發(fā)現(xiàn)了開發(fā)者參與社區(qū)軟件開發(fā)的動機與參與人員的需求導(dǎo)向,工作經(jīng)歷,個人興趣等皆有不同程度的關(guān)系,表明了動機的多樣性.Ma等人[14]指出對于單個項目,commit的行為時間間隔始終近似呈現(xiàn)冪律分布且連續(xù)性的commit操作的時間間隔都不長.除此之外,一部分研究人員也試著訊在對軟件定量分析的屬性包括哪些,Hofmann等人[15]調(diào)查發(fā)現(xiàn)軟件的貢獻程度可以由commit的數(shù)量多寡表現(xiàn)出來.
綜上所述,開源社區(qū)中無論是對開發(fā)者本身還是其相關(guān)行為的研究始終是該領(lǐng)域的熱點,而與已有工作不同,本文嘗試以GHTorrent下的數(shù)據(jù)集鏡像為基礎(chǔ),通過分析技術(shù)關(guān)聯(lián)與合作關(guān)聯(lián)這兩種開源項目之間風(fēng)險傳遞關(guān)系構(gòu)建網(wǎng)絡(luò)模型,基于支持向量機對設(shè)置好特征的項目成敗數(shù)據(jù)進行訓(xùn)練,經(jīng)過數(shù)據(jù)治理后得出的訓(xùn)練模型來預(yù)測相應(yīng)開源社區(qū)的風(fēng)險指數(shù)和發(fā)展趨勢.
復(fù)雜網(wǎng)絡(luò)模型是指用來描述社會科學(xué),自然科學(xué)工程技術(shù)上互相關(guān)聯(lián)系統(tǒng)的模型,并引入了數(shù)學(xué)中圖的概念,即復(fù)雜網(wǎng)絡(luò)可以看作是由一些具有獨立特征且與其他獨立單元相互連接的節(jié)點的集合,因此可以把每個單元看作圖中的一個節(jié)點,節(jié)點間互相連接視作圖中的邊.從理論上講,任何由大量單元組成的網(wǎng)絡(luò),都可以將其中的單元視為一個節(jié)點,單元之間的相互作用視為邊,以此轉(zhuǎn)化為復(fù)雜網(wǎng)絡(luò)的研究.
復(fù)雜網(wǎng)絡(luò)的級聯(lián)崩塌是指一個至幾個節(jié)點或邊發(fā)生的故障會同通過節(jié)點之間的耦合關(guān)系引發(fā)其他節(jié)點的故障,這將出現(xiàn)連鎖反應(yīng),進而引發(fā)大規(guī)模的節(jié)點乃至整個網(wǎng)絡(luò)的崩塌.
在此類代碼托管平臺中,各種相關(guān)數(shù)據(jù)不斷更新傳輸,項目與項目之間存在密切的關(guān)聯(lián),使得Github組成了一個典型的復(fù)雜網(wǎng)絡(luò)模型.然而,這種網(wǎng)絡(luò)的關(guān)聯(lián)形式通常會帶來一系列的負面影響.當(dāng)某個項目在開發(fā)進程中遇到阻礙時,都將使其他相關(guān)項目產(chǎn)生一些潛在的影響.由于網(wǎng)絡(luò)的正反饋作用,細微的故障也會演變成意想不到的大型突發(fā)事件.作為一個復(fù)雜的社區(qū)網(wǎng)絡(luò),它具有關(guān)聯(lián)性和層次性的特點.由于項目或者開發(fā)人員之間的長期互動促使了團體的逐漸形成.在社區(qū)團體中,成員們通常會保持價值觀和開發(fā)理念的一致性質(zhì)[16].因此,當(dāng)團隊成員受到一些外部因素的影響時,級聯(lián)效應(yīng)會在相關(guān)的項目團體中擴散,使整個網(wǎng)絡(luò)變?yōu)閬喎€(wěn)定狀態(tài).這種影響一旦超過閾值,網(wǎng)絡(luò)的狀態(tài)就會進一步崩塌,從而導(dǎo)致雪崩現(xiàn)象的發(fā)生.
如圖1所示,以Github上某一個項目為例解釋崩塌級聯(lián)的具體發(fā)展過程.“SOUI”,“OsmSharp”,“NetDimension”,“tinyantstudio”,“FlaUI”,“Panuon”是Github上的6個開源項目.“SOUI”項目是在DuiEngine的基礎(chǔ)上全面重構(gòu)完成的開源DirectUI庫,2017年2月開始研發(fā),3月首次commit,其兩位核心開發(fā)成員ID分別為“Bing”和“LK”.“LK”是項目的管理者,不僅如此,這位用戶還一并參與和管理著 “OsmSharp”,“NetDimension”,“tinyantstudio”,“FlaUI”,“Panuon”等多個項目.我們在對“SOUI”項目進行詳細調(diào)研后,發(fā)現(xiàn)由于技術(shù)攻關(guān)失敗,項目在沒有完工的情況下,在14個月后不再有任何更新和提交.受此影響,“LK”獨立開發(fā)的“tinyantstudio”和參與合作的“OsmSharp”、“FlaUI”、“Panuon”等項目也都停止開發(fā),繼而引發(fā)項目“Panuon”的更新也完全停滯至今.至此為一個完整的社區(qū)項目發(fā)生級聯(lián)崩塌的過程,在整個崩塌歷程中,核心成員“LK”起著舉足輕重的作用.
圖1 項目的崩塌級聯(lián)效應(yīng)
阻礙項目發(fā)展的因素是研究雪崩動力過程的核心點.開源社區(qū)通過郵件以及論壇等形式為用戶和開發(fā)者提供了可以交流的平臺,憑借這些媒介,無論是開發(fā)者之間還是用戶之間,亦或二者之間都可以就關(guān)鍵性問題進行探討.圖2所示為某項目的崩塌級聯(lián)效應(yīng)和發(fā)展因素分析.
圖2 項目發(fā)展的驅(qū)動和限制因素
由此可得,開源項目發(fā)展是否順利與兩個因素息息相關(guān):即技術(shù)因素和用戶因素.軟件本身具有高度互依存性,大量軟件要依賴其他各種支持環(huán)境才能運行.另一些也需要特定的中間件來輔助以才能提供所需的功能.因此,從技術(shù)因素來看,沒有環(huán)境支持的項目很難長期生存和發(fā)展.所以,當(dāng)這些環(huán)節(jié)中的任何一個環(huán)節(jié)出現(xiàn)問題時,其他相關(guān)的軟件或系統(tǒng)都會受到一定程度的影響,從而存在故障的風(fēng)險.另一方面,軟件開發(fā)通常由許多人協(xié)同完成.在長期的合作開發(fā)過程中,不同風(fēng)格的開發(fā)人員會逐漸走向相同的設(shè)計理念和知識體系,形成相似或統(tǒng)一的框架或程序風(fēng)格.當(dāng)受到會員流失、開發(fā)商轉(zhuǎn)讓等外部因素的影響時,可能會直接導(dǎo)致開發(fā)進度的停擺.在現(xiàn)實生活中,由用戶合作問題引起的項目失敗是最為常見的現(xiàn)象.開發(fā)過程中產(chǎn)生意見分歧是項目開發(fā)中最為常見的障礙,此外,核心開發(fā)成員的離開會對項目開發(fā)造成毀滅性的打擊.在上述兩方面因素的影響下,軟件項目構(gòu)成的復(fù)雜網(wǎng)絡(luò)級聯(lián)崩塌關(guān)系會呈現(xiàn)出技術(shù)關(guān)聯(lián)和合作關(guān)聯(lián)兩種模式.
由上述內(nèi)容可知,軟件項目之間由技術(shù)關(guān)聯(lián)而產(chǎn)生一個軟件群體.群體一般將某個特定的核心項目當(dāng)作中心,以環(huán)境配套支持件為輔助,形成軟件網(wǎng).通常來說,處于核心地位的項目是市面上比較認(rèn)同的程序,其他外圍項目均以該項目為核心,提供運行環(huán)境以及額外的擴展功能.圖3為以eMule為例的技術(shù)關(guān)聯(lián)模式展示.
圖3 項目的技術(shù)關(guān)聯(lián)網(wǎng)絡(luò)
開源軟件項目一般由多人共同協(xié)作研發(fā).然而多數(shù)開發(fā)者又會同時參與幾個不同的項目,因此出現(xiàn)了合作關(guān)聯(lián)關(guān)系.例如兩個項目A和B分別由3個開發(fā)者合作開發(fā);而開發(fā)者c一并加入項目A和B的開發(fā)進程,如圖4所示.假設(shè)在某個時間,c由于缺乏動力而離開社區(qū),導(dǎo)致這個事件將分別對A和B項目開發(fā)團隊產(chǎn)生影響.若c為這兩個項目的核心開發(fā)者或管理者,那他的離開大概率會讓這兩個項目的其他開發(fā)者失去后續(xù)的動機和信心,乃至最終直接或間接導(dǎo)致項目的失敗.圖4顯示c的離開對a、b和d、e有影響.由于此種影響產(chǎn)生于項目內(nèi)部,故命名為內(nèi)部效應(yīng).在這種效應(yīng)的影響下,A、B項目都停止開發(fā)工作,由此表現(xiàn)出此次崩塌過程的級聯(lián)效應(yīng).項目A和項目B相繼失敗.值得注意的是,團隊合作是導(dǎo)致連鎖效應(yīng)的另一個重要因素.項目A和項目B中的開發(fā)人員b和c在合作過程中存在沖突或分歧,勢必會影響到兩個項目的后續(xù)進展,其結(jié)果就表現(xiàn)為項目A和B的級聯(lián)崩塌.
圖4 合作關(guān)聯(lián)時核心開發(fā)者離去引發(fā)的級聯(lián)失效傳遞
除此之外的另一種由合作關(guān)聯(lián)所產(chǎn)生的級聯(lián)效應(yīng)是源自群體行為模式的解體.長期的工作和交互會促使人們自發(fā)形成一定的群體規(guī)范和行為模式.此等包含共性特征的項目會形成緊密聯(lián)系的團體結(jié)構(gòu)[17],團體內(nèi)的項目在研發(fā)技術(shù)和設(shè)計模式等方面具有明顯的一致性[18],當(dāng)受到來自外部的技術(shù)亦或不同的設(shè)計理念等因素影響時,便會造成團體內(nèi)的連鎖反應(yīng).
現(xiàn)實中,級聯(lián)崩塌在傳播時通常不會區(qū)分其技術(shù)關(guān)聯(lián)模式和合作關(guān)聯(lián)模式,更普遍的是基于兩種關(guān)聯(lián)模式的混合.如圖5所示,項目D由a,b共同開發(fā),項目E則為b,c共同開發(fā),而b是兩個項目的聯(lián)合參與者.項目F由d單獨開發(fā),它與E存在技術(shù)關(guān)聯(lián)(如圖5(a)).若開發(fā)者b由于某些因素中斷了開發(fā)進程,并先后影響項目D和E,導(dǎo)致兩個項目進度均被終止;
圖5 混合關(guān)聯(lián)模式下的級聯(lián)效應(yīng)
而F的技術(shù)層面受到E的影響,因此E的終止又導(dǎo)致F的失敗.由此便引發(fā)了D,E,F(xiàn) 3個項目相繼失敗的連鎖反應(yīng).在該級聯(lián)崩塌中,D,E級聯(lián)屬于合作關(guān)聯(lián),E,F(xiàn)級聯(lián)屬于技術(shù)關(guān)聯(lián).從整體上看,D,E,F(xiàn)級聯(lián)則對應(yīng)于混合關(guān)聯(lián)(如圖5(b)).
支持向量機(Support Vector Machine,SVM)常用于線性可分的情況,通過學(xué)習(xí)得到分類超平面,使樣本點到支持向量的距離最大化.SVM是通過在高維空間構(gòu)建一個用于分類的超平面,以改善傳統(tǒng)模式識別方法在訓(xùn)練過程中的造成過擬合以及局部最優(yōu)的問題,顯著提高了訓(xùn)練得到模型的泛化能力.SVM對于采集訓(xùn)練數(shù)據(jù)集的訓(xùn)練過程實質(zhì)上是目標(biāo)模型的優(yōu)化求解過程,如式(1)所示:
(1)
式中:ω、b分別為超平面的法向量矩陣、截距向量.通過引入拉格朗日乘子,針對參數(shù)求其偏導(dǎo),再以求解原問題的對偶問題求解,詳細求解如公式(2)所示:
(2)
式(2)中:a為超參數(shù)矩陣.這樣的問題轉(zhuǎn)化過程具有兩方面優(yōu)勢,首先,這樣使得目標(biāo)對偶問題求解更方便;其次,在處理線性不可分問題時,能夠進而使用核函數(shù)方法使得維度空間發(fā)生改變.
由于非邊界樣本對應(yīng)的參數(shù)ai都是0,因此在進行測試時,僅需要計算測試樣本與支持向量的內(nèi)積即可:
f(x)=wTx+b=∑aiyi〈x,xi〉+b
(3)
式中:〈x,xi〉代表內(nèi)積運算.
實際問題中,待分類問題一般是線性不可分的,此時需要借助懲罰函數(shù)提高模型對噪聲的敏感度,避免模型訓(xùn)練的過擬合.對于線性不可分,可以增加核函數(shù)的使用,使得訓(xùn)練樣本的特征空間從低維映射到高維.此外,核函數(shù)的使用替代了原始低維空間的內(nèi)積計算,使得內(nèi)積計算和超平面分類可以在不同維度空間進行,最終使問題變?yōu)榫€性可分.目前常用的核函數(shù)包括基于高斯的核函數(shù)、基于線性變換的核函數(shù),以及基于多項式的核函數(shù),其通用數(shù)學(xué)表達式如式(4)所示:
K(x,z)=〈σ(x),σ(z)〉
(4)
式中:σ為原本數(shù)據(jù)向高維空間的映射.
本文采用Github開源社區(qū)里抓取的110萬條項目數(shù)據(jù)作為分析和分類器設(shè)計的基礎(chǔ).數(shù)據(jù)主要包括:用戶在某一時間訪問項目的id,用戶id,項目id,用戶訪問項目的時間.數(shù)據(jù)處理分為兩部分,第一部分是針對數(shù)據(jù)進行標(biāo)準(zhǔn)化處理,使得不同數(shù)值以及不同量綱之間的數(shù)據(jù)可以進行混合分析.數(shù)據(jù)的標(biāo)準(zhǔn)化處理主要解決不同性質(zhì)數(shù)據(jù)問題對不同性質(zhì)的數(shù)據(jù)直接處理不能得出有效的結(jié)果.本文所采用的數(shù)據(jù)標(biāo)準(zhǔn)化的方法如下:
1)min-max標(biāo)準(zhǔn)化
(5)
式中:x*為標(biāo)準(zhǔn)化之后的樣本;x為標(biāo)準(zhǔn)化之前的樣本;xmax和xmin為采集的Github數(shù)據(jù)集中對應(yīng)特征里的最大值和最小值.
2)正則化標(biāo)準(zhǔn)化
(6)
式中:μ為樣本集的均值;σ為樣本集的標(biāo)準(zhǔn)差.
數(shù)據(jù)處理的第二部分是清洗原始采集樣本,異常數(shù)據(jù)的剔除,無效項目的樣本剔除,定義并提取有效持續(xù)項目以及失敗項目.其中無效項目的樣本剔除的判斷依據(jù)為采集樣本中的相關(guān)條目數(shù)量小于10條或者參與者數(shù)量為1.失敗項目的判斷依據(jù)為順序排序下該項目的連續(xù)登陸時間間隔大于365天,即視為項目失敗,相反,其余項目視為有效持續(xù)項目(成功項目).數(shù)據(jù)集樣本清洗前后統(tǒng)計數(shù)據(jù)如表1所示.
表1 數(shù)據(jù)集樣本清洗前后統(tǒng)計表
根據(jù)前述項目級聯(lián)崩塌現(xiàn)象的驅(qū)動力以及崩塌關(guān)聯(lián)模式,本文認(rèn)為合作關(guān)聯(lián)模式在開源社區(qū)項目的發(fā)展演變中,扮演著更加重要的角色,并且技術(shù)關(guān)聯(lián)模式在某種程度上,其在合作開發(fā)鏈條中最終仍然是以項目參與人合作并輸出貢獻的方式得以體現(xiàn),技術(shù)關(guān)聯(lián)反應(yīng)在某項目參與者參與項目的深度及廣度中,如圖6所示.
圖6 參與者深度與廣度和各關(guān)聯(lián)模式的層級關(guān)系
因此,本文通過設(shè)計提取若干與項目自身、參與者參與項目有關(guān)的特征參數(shù),通過統(tǒng)計分析,最終確定以5類特征用于分類器的訓(xùn)練,特征提取及定義如表2所示.
表2 訓(xùn)練特征設(shè)計
項目id的條目總數(shù)總體反映了項目活躍程度,按照社區(qū)開源項目歷史經(jīng)驗,項目活躍程度與項目的有效持續(xù)性密切相關(guān);另一個至關(guān)重要的要素就是項目參與者的數(shù)量,本文將參與者劃分為兩類,分別為單一參與者和復(fù)用參與者,項目中包含這兩種作者的數(shù)量與項目成敗有內(nèi)在聯(lián)系;最后增加了項目中參與項目最多的參與者所參與的項目總數(shù).
最后通過訓(xùn)練SVM分類器,實現(xiàn)對開源項目發(fā)展健康程度的預(yù)測.流程如圖7所示.
圖7 算法流程圖
實驗程序采用Matlab編寫,構(gòu)建SVM分類器,核函數(shù)采用徑向基函數(shù)(Radial Basis Function,RBF),優(yōu)化方法使用序列最小優(yōu)化(Sequential Minimal Optimization,SMO),徑向基函數(shù)σ參數(shù)選取為1.0.訓(xùn)練的有效持續(xù)項目和失敗項目按照90%和10%的比例生成訓(xùn)練數(shù)據(jù)及和測試數(shù)據(jù)集,隨機生成10次并進行分類器訓(xùn)練和預(yù)測,結(jié)果取平均值(如表3所示);并與多元線性回歸(Multiple Linear Regression,MLR)算法進行結(jié)果對比(如表4所示).
表3 基于SVM的項目預(yù)測準(zhǔn)確率結(jié)果
表4 基于MLR的預(yù)測準(zhǔn)確率結(jié)果
以上實驗結(jié)果表明,MLR算法對于有效可持續(xù)項目的預(yù)測準(zhǔn)確率不佳,對于失敗項目幾乎無法進行正確的預(yù)測;基于SVM和級聯(lián)崩塌關(guān)聯(lián)模式所設(shè)計的特征可以更有效的用于分類器訓(xùn)練,訓(xùn)練得到的分類器對失敗項目預(yù)測準(zhǔn)備率達到了89.8%,同時對于有效持續(xù)項目的預(yù)測準(zhǔn)確率也達到了76%,兩者結(jié)合可以有效用于開源社區(qū)項的項目可持續(xù)性預(yù)測及失敗風(fēng)險評估.
Github社區(qū)作為一個典型的自組織演化系統(tǒng),其產(chǎn)生與發(fā)展是多種因素共同作用的結(jié)果.不同的因素共同推動著社區(qū)不斷走向成熟直至達到臨界狀態(tài),使社區(qū)呈現(xiàn)出豐富的多樣性特征以及充滿激情的創(chuàng)作活力.對此類系統(tǒng)而言,通過外部檢測其健康程度對于系統(tǒng)的演變和風(fēng)險提示具有積極意義.本文基于對復(fù)雜網(wǎng)絡(luò)下開源社區(qū)崩塌級聯(lián)模式的詳細分析,提出基于SVM的開源項目風(fēng)險評估方法,通過設(shè)計特征提取對不同項目進行可持續(xù)性和和失敗風(fēng)險預(yù)測,通過采集數(shù)據(jù)訓(xùn)練模型和測試驗證,結(jié)果表明,提出的方法可以有效的對失敗項目進行評估和預(yù)測,并適用于開源項目的健康監(jiān)測管理等應(yīng)用領(lǐng)域.