齊 晴 曹 健 劉妍岑
(上海交通大學(xué)電子信息與電氣工程學(xué)院計算機系 上海 201100)(qi_ng616@sjtu.edu.cn)
英國生態(tài)學(xué)家Tansley[1]于1935年首先提出有關(guān)“生態(tài)系統(tǒng)”的概念,任何自然環(huán)境中的生物有機體和非生物成分在一段時間內(nèi)交互形成一個相對穩(wěn)定的動態(tài)平衡狀態(tài),這就是一個生態(tài)系統(tǒng)[2].作為一個沒有固定規(guī)模的開放系統(tǒng),生態(tài)系統(tǒng)是生態(tài)學(xué)中的主要結(jié)構(gòu)和功能單元.類似地,軟件生態(tài)系統(tǒng)也可以被視為軟件工程領(lǐng)域的主要結(jié)構(gòu)和功能單元[3-4].軟件生態(tài)系統(tǒng)是指在一個共同的技術(shù)平臺上,眾多的參與者協(xié)同合作,最終形成大量的軟件解決方案或服務(wù)[5-6].經(jīng)研究,軟件生態(tài)系統(tǒng)目前是在軟件平臺上結(jié)合內(nèi)部和外部參與者開發(fā)的組件來構(gòu)建大型軟件系統(tǒng)的有效方法[7].
隨著開源軟件開發(fā)平臺的快速發(fā)展,可用的開源軟件項目數(shù)量急劇增加,因此軟件系統(tǒng)不再孤立存在,而是存在于托管平臺上的不同軟件生態(tài)系統(tǒng)中.因此,自2005年Messerschmitt等人的工作[8]以來,對軟件生態(tài)系統(tǒng)的研究已成為一個熱門的研究領(lǐng)域.不同的研究為軟件生態(tài)系統(tǒng)提供了不同的定義.例如Bosch等人給出軟件生態(tài)系統(tǒng)的定義,討論其發(fā)展趨勢,并概述采用軟件生態(tài)系統(tǒng)方法的關(guān)鍵概念和意義[7].Lungu等人將軟件生態(tài)系統(tǒng)視為在同一環(huán)境中共同開發(fā)和發(fā)展的軟件項目的集合[9].目前,還有許多研究都聚焦于特定的生態(tài)系統(tǒng),例如Arm軟件生態(tài)系統(tǒng)[10]、Python軟件生態(tài)系統(tǒng)[11]、JavaScript包生態(tài)系統(tǒng)[12]和R統(tǒng)計計算開源生態(tài)系統(tǒng)[13]等.
演化過程是包括軟件生態(tài)系統(tǒng)在內(nèi)的所有生態(tài)系統(tǒng)的基本過程.個體參與者的動機或他們之間的交互行為可以導(dǎo)致演化過程[14].軟件生態(tài)系統(tǒng)的演化引起了研究人員的極大興趣[15-16].然而,迄今為止,還沒有大規(guī)模的關(guān)于軟件生態(tài)系統(tǒng)演化的研究.此外,與不同演化事件有關(guān)的因素還未確定.因此,本文回答了3個研究問題:
1) 如何識別GitHub中不斷演化的軟件生態(tài)系統(tǒng)?
2) GitHub軟件生態(tài)系統(tǒng)中主要存在哪幾種演化事件類型?
3) 哪些因素與軟件生態(tài)系統(tǒng)的長期存活密切相關(guān)?
本文選擇GitHub中的軟件生態(tài)系統(tǒng)進行研究是因為:GitHub是最流行的開源軟件開發(fā)平臺,提供了一種方便的代碼托管服務(wù),且其提供的API使得數(shù)據(jù)更加容易獲取.
項目(存儲庫)是GitHub中的主要組件.因此,確定項目之間的技術(shù)依賴性是識別軟件生態(tài)系統(tǒng)的有效方法[17].在一個通用的技術(shù)平臺上,一組項目在連續(xù)的時間段內(nèi)的動態(tài)交互最終形成了不斷演化的軟件生態(tài)系統(tǒng)[18].因此,為了檢測生態(tài)系統(tǒng)的演化行為,主要的挑戰(zhàn)是如何識別軟件項目之間的動態(tài)交互,進而發(fā)現(xiàn)不斷演化的軟件生態(tài)系統(tǒng).因此,本研究分為3個具體步驟:
1) 發(fā)現(xiàn)不斷演化的生態(tài)系統(tǒng)
近年來不同研究提出了多種識別軟件生態(tài)系統(tǒng)的方法.具體來說,項目之間的技術(shù)依賴可通過GitHub存儲庫之間的交叉引用關(guān)系來識別的[17].文中采用這種方法,根據(jù)項目之間的技術(shù)依賴關(guān)系來構(gòu)建技術(shù)依賴網(wǎng)絡(luò),然后,使用社區(qū)發(fā)現(xiàn)算法來檢測GitHub中的軟件生態(tài)系統(tǒng).
然而,發(fā)現(xiàn)不斷演化的軟件生態(tài)系統(tǒng)比發(fā)現(xiàn)靜態(tài)的生態(tài)系統(tǒng)更具挑戰(zhàn)性.首先,根據(jù)不同時期的數(shù)據(jù)發(fā)現(xiàn)的軟件生態(tài)系統(tǒng)是不一致的,因為生態(tài)系統(tǒng)隨著時間的推移而演化.其次,由于數(shù)據(jù)被分為不同的片段,數(shù)據(jù)稀疏性問題變得不可忽視,這將導(dǎo)致生態(tài)系統(tǒng)發(fā)生巨大的變化.因此,本文采用數(shù)據(jù)平滑方法來解決上述問題.
2) 識別演化事件
軟件生態(tài)系統(tǒng)的演化過程可以表示為一系列演化事件的變化過程.一旦發(fā)現(xiàn)了不斷演化的軟件生態(tài)系統(tǒng),每個生態(tài)系統(tǒng)上發(fā)生的特定演化事件就會被識別出來.文中將演化事件分為5類,并提出了識別算法.
3) 分析和演化行為相關(guān)的因素
我們試圖分析與軟件生態(tài)系統(tǒng)演化密切相關(guān)的因素.本文分別列舉了生態(tài)系統(tǒng)的結(jié)構(gòu)、生態(tài)系統(tǒng)的規(guī)模和生態(tài)系統(tǒng)的活躍度3個方面的特征.然后對不同因素進行多元線性回歸分析,最終找出了與生態(tài)系統(tǒng)演化密切相關(guān)的重要因素.
生態(tài)學(xué)研究生物群體與其環(huán)境之間的相互關(guān)系[3],生態(tài)系統(tǒng)是生態(tài)學(xué)中的基本結(jié)構(gòu)和功能單元.生物有機體和環(huán)境中的非生物成分相互作用,形成生態(tài)系統(tǒng)[1-3].擴展這一比喻,軟件生態(tài)系統(tǒng)可以看成是一組項目之間不斷協(xié)作,從而在一個共同的技術(shù)平臺上形成大量的軟件解決方案[6].關(guān)于軟件生態(tài)系統(tǒng)的研究始于2005年并引起了很多研究者的興趣[7],但它仍然處于起步階段.軟件生態(tài)系統(tǒng)具有廣泛的研究領(lǐng)域,包括軟件工程、社交網(wǎng)絡(luò)和技術(shù)管理[4].Franco-Bedoya等人[2]詳細介紹了開源軟件和軟件生態(tài)系統(tǒng)的關(guān)系,評估了開源軟件生態(tài)系統(tǒng)研究的現(xiàn)有技術(shù)水平.
目前,軟件生態(tài)系統(tǒng)研究在技術(shù)、業(yè)務(wù)和社會方面已經(jīng)形成了大量工作[2].然而,許多工作只針對某一個特定的生態(tài)系統(tǒng)進行研究,例如Ma等人[11]對Python軟件生態(tài)系統(tǒng)中的跨項目相關(guān)報錯進行了實證研究,揭示了開發(fā)人員的常見做法以及修復(fù)跨項目錯誤的各種因素,這些發(fā)現(xiàn)為生態(tài)系統(tǒng)范圍內(nèi)的未來軟件錯誤分析提供了啟示;Plakidas等人[13]檢查R統(tǒng)計計算開源生態(tài)系統(tǒng)的結(jié)構(gòu)和演變來推進對軟件生態(tài)系統(tǒng)研究的理解;Constantinou等人[15]對Ruby軟件生態(tài)系統(tǒng)中,社會和技術(shù)部分的永久性修改程度所帶來的影響進行了實證研究.然而,現(xiàn)有的工作都沒有對GitHub中軟件生態(tài)系統(tǒng)的演化過程進行大規(guī)模的研究.
許多復(fù)雜的系統(tǒng)可以表示為復(fù)雜的網(wǎng)絡(luò),系統(tǒng)的組件及其相互作用分別表示為節(jié)點和鏈接[19].軟件項目及其關(guān)系也可以表示為一個復(fù)雜的網(wǎng)絡(luò)[20],軟件生態(tài)系統(tǒng)的結(jié)構(gòu)由其技術(shù)依賴來定義[21].然而,基于源代碼發(fā)現(xiàn)技術(shù)依賴是非常復(fù)雜的[22-23],因此,這種方法不適合于大規(guī)模平臺項目.其他文章通過識別項目配置文件中的技術(shù)依賴,但這種方法并不總是可用或準確的[24-25].因此本文使用GitHub存儲庫之間的交叉引用關(guān)系[17]來表示項目間的技術(shù)依賴關(guān)系.
基于不同的網(wǎng)絡(luò)模型,社區(qū)發(fā)現(xiàn)方法可用于識別軟件生態(tài)系統(tǒng)并研究其內(nèi)部結(jié)構(gòu)和功能.根據(jù)不同的社區(qū)定義可以有不同的社區(qū)劃分方法.Girvan和Newman等人[26]提出了一種社區(qū)發(fā)現(xiàn)算法,該算法測量正確識別的節(jié)點的比例.Shen等人[27-28]提出了一種基于模塊化評估的社區(qū)發(fā)現(xiàn)算法.White等人[29]提出了2種頻譜聚類的社區(qū)發(fā)現(xiàn)算法.Rosvall等人[30]提出了一種基于信息理論框架的復(fù)雜網(wǎng)絡(luò)社區(qū)結(jié)構(gòu)解析方法.但是,這些模型都不適合大規(guī)模的社區(qū)發(fā)現(xiàn).本文使用一種流行的社區(qū)發(fā)現(xiàn)方法,Louvain社區(qū)發(fā)現(xiàn)方法,它可以有效地處理大規(guī)模網(wǎng)絡(luò)[31].
社區(qū)演化的許多工作都是基于時間來研究網(wǎng)絡(luò)模型的演化過程[32].Berger-Wolf等人將不斷演化的網(wǎng)絡(luò)轉(zhuǎn)換為不同快照的靜態(tài)圖,以模擬動態(tài)網(wǎng)絡(luò)中的結(jié)構(gòu)變化[33],但是,他們只考慮在2個連續(xù)快照中進行匹配,并主要關(guān)注給定個體成員.Asur等人在2個連續(xù)快照中定義檢測到的社區(qū)之間的重要演化事件[21],但是,這些事件并未涵蓋特定社區(qū)可能發(fā)生的所有變化.Takaffoli等人提出了一個用于建模和檢測社交網(wǎng)絡(luò)中社區(qū)演化的框架,并將其應(yīng)用于2個真實的數(shù)據(jù)集[34].在本文的研究中,生態(tài)系統(tǒng)首先在每個時間片段獨立檢測獲得,然后進行多階段比較以確定整個動態(tài)演化過程.為了使生態(tài)系統(tǒng)的演化行為更加平滑,實驗中還應(yīng)用了數(shù)據(jù)平滑方法[35].
基于回歸的分析是最廣泛使用的統(tǒng)計方法之一[36].多元線性回歸中可以存在多個自變量或自變量函數(shù),因此,文中通過多元線性回歸分析,找出影響生態(tài)系統(tǒng)演化過程的相關(guān)因素.
與以往大量的社交網(wǎng)絡(luò)工作不同,本研究主要關(guān)注GitHub中的軟件生態(tài)系統(tǒng)演化.為了清楚地顯示演化結(jié)果,我們將數(shù)據(jù)按照每半年進行劃分,一共獲得6個階段的數(shù)據(jù)來挖掘不斷演化的軟件生態(tài)系統(tǒng).此外,本文還通過多元線性回歸分析方法,分析了在軟件生態(tài)系統(tǒng)長期的演化過程中,與生態(tài)系統(tǒng)的生存和消亡密切相關(guān)的因素.
本文的目的是研究GitHub中軟件生態(tài)系統(tǒng)的演化.為了實現(xiàn)該目標,任務(wù)分為3個步驟.
1) 獲取GitHub中存儲庫之間的交叉引用關(guān)系.GitHub中存儲庫之間的交叉引用可用于表示項目之間的技術(shù)依賴關(guān)系[17].
GitHub提供一種代碼托管服務(wù),可以使軟件開發(fā)變得更加高效.GitHub鼓勵開發(fā)人員在項目內(nèi)和項目之間與他人合作.當用戶在一個項目的Pull Request操作、Issue操作或Commit Comment操作中提到另一個項目時,我們認為這2個項目之間存在一些技術(shù)依賴關(guān)系,并通過研究上述的交叉引用關(guān)系來發(fā)現(xiàn)軟件生態(tài)系統(tǒng).實驗的數(shù)據(jù)來自GH Archive項目,該項目記錄公開GitHub項目的操作,并且按小時存檔.本文選擇從GH Archive中的GitHub Events API記錄的2015-01-01至2018-06-30的數(shù)據(jù)中獲取交叉引用信息.
交叉引用關(guān)系主要分為2種模式:①“User/Project#Num”(例如tensorflow/tensorflow#61);②“User/Project@SHA”.文中對GH Archive數(shù)據(jù)集中的所有數(shù)據(jù)執(zhí)行模式匹配,以查找符合規(guī)則的交叉引用.其次,我們使用有向加權(quán)圖構(gòu)建GitHub軟件生態(tài)系統(tǒng)網(wǎng)絡(luò)圖,其中圖的節(jié)點V表示在GitHub中具有交叉引用關(guān)系的項目,邊E表示交叉引用關(guān)系,邊的權(quán)重表示項目間技術(shù)依賴關(guān)系的強度.因此,GitHub軟件生態(tài)系統(tǒng)網(wǎng)絡(luò)可以由一系列圖{G1,G2,…,Gn}表示,其中Gi=(Vi,Ei)表示由一組具有技術(shù)依賴關(guān)系的項目在階段i時期構(gòu)成的網(wǎng)絡(luò)圖.
圖1顯示了GitHub軟件生態(tài)系統(tǒng)中具有交叉引用關(guān)系的項目所形成的網(wǎng)絡(luò).每個節(jié)點代表一個項目,2個節(jié)點之間的連邊意味著它們有交叉引用關(guān)系.節(jié)點的顏色根據(jù)其度數(shù)從藍色到紫色再到紅色依次加深.同樣的,邊根據(jù)其權(quán)重不斷加深.此外,還可以觀察到,在GitHub生態(tài)系統(tǒng)內(nèi)交織的網(wǎng)絡(luò)非常復(fù)雜,而其外部被許多小型的網(wǎng)絡(luò)包圍,這表明許多項目僅與某些特定項目具有交叉引用關(guān)系,大規(guī)模的生態(tài)系統(tǒng)與小型生態(tài)系統(tǒng)共存.
Fig.1 The ecosystem network formed by GitHub repositories with cross-references圖1 GitHub中由交叉引用關(guān)系形成的軟件生態(tài)系統(tǒng)網(wǎng)絡(luò)
2) 數(shù)據(jù)平滑處理.為了展示軟件生態(tài)系統(tǒng)的演進,本文將2015-01-01—2018-06-30的數(shù)據(jù)集按照每半年進行劃分,最終獲得7個階段的數(shù)據(jù)來進行交叉引用關(guān)系的挖掘.然而,這一操作會帶來數(shù)據(jù)稀疏問題,可能導(dǎo)致生態(tài)系統(tǒng)的急劇變化.這是因為在每6個月的時間內(nèi)發(fā)現(xiàn)的交叉引用關(guān)系在數(shù)據(jù)分割之后是有限的.因此,文中使用數(shù)據(jù)平滑方法[37]來解決這個問題.數(shù)據(jù)平滑方法的核心思想是以不同的比例融合兩個連續(xù)階段的數(shù)據(jù),本文首先將每個階段的數(shù)據(jù)轉(zhuǎn)換成一個矩陣,矩陣中的每個對應(yīng)值表示2個對應(yīng)項目之間的交叉引用數(shù),假設(shè)來自上一階段的交叉引用不會消失,因此我們嘗試以特定比例融合來自上一階段的數(shù)據(jù).設(shè)B為某一階段的關(guān)系矩陣,A為其前一階段的關(guān)系矩陣,α為2個連續(xù)周期的平滑系數(shù),則平滑矩陣可表示為
αA+(1-α)B,
(1)
平滑系數(shù)α可以根據(jù)2個函數(shù)計算:
(2)
(3)
其中,n0表示頂點數(shù),wij是邊的權(quán)重,σ1是方差.
最終,可以獲得所有7個階段的6個平滑系數(shù),從而獲得6個平滑矩陣,本文將平滑矩陣重新轉(zhuǎn)換為項目之間的交叉引用關(guān)系來進行研究.
3) 發(fā)現(xiàn)不斷演化的生態(tài)系統(tǒng).在數(shù)據(jù)預(yù)處理之后,我們在每個時段運行生態(tài)系統(tǒng)發(fā)現(xiàn)算法.如上文所述,實驗使用適用于大規(guī)模網(wǎng)絡(luò)模型的Louvain社區(qū)發(fā)現(xiàn)算法[31].Louvain是一種貪婪的優(yōu)化方法,旨在將網(wǎng)絡(luò)劃分為密集連接的節(jié)點社區(qū),并不斷優(yōu)化網(wǎng)絡(luò)的模塊化.它首先通過尋找小型社區(qū)來優(yōu)化本地模塊化,然后聚合每個小社區(qū)中的節(jié)點并使用它們來構(gòu)建新的網(wǎng)絡(luò).然后,不斷迭代這兩個步驟,直到模塊化最大化.Louvain方法在模塊化實現(xiàn)和計算時間方面優(yōu)于所有其他社區(qū)發(fā)現(xiàn)方法.
一旦檢測到7個階段的軟件生態(tài)系統(tǒng),接下來的工作便是研究不同階段之間生態(tài)系統(tǒng)的演化過程.與之前的方法不同,本文通過比較每2個連續(xù)時期之間社區(qū)的相似性來檢測一個社區(qū)在7個階段內(nèi)可能經(jīng)歷的所有變化.
1) 相似度計算方法.實驗發(fā)現(xiàn)在GitHub中檢測到的軟件生態(tài)系統(tǒng)大小不同,其中最大生態(tài)系統(tǒng)成員的數(shù)量可以達到600個,而最小生態(tài)系統(tǒng)成員的數(shù)量只有2個.在計算相似性時,如果將這些小生態(tài)同大生態(tài)一樣對待,實驗結(jié)果表明小生態(tài)都趨向于消亡,這不能反映實際情況,因為小生態(tài)也可能合并成大生態(tài).因此,本文提出了一種依據(jù)條件判別相似度的計算方法.我們計算了7個階段的數(shù)據(jù),發(fā)現(xiàn)20%的生態(tài)系統(tǒng)規(guī)模大于或等于10,與此同時,80%的生態(tài)系統(tǒng)規(guī)模小于10,所以設(shè)立10為閾值.在計算生態(tài)系統(tǒng)的相似度之前,首先判斷生態(tài)的規(guī)模.設(shè)ei,ej分別為i階段和j階段檢測到的生態(tài)系統(tǒng),其中(i≠j,i∈[1,7],j∈[1,7]),k為相似度閾值,k∈[0,1].如果生態(tài)的規(guī)模都大于或等于10,則其相似性計算:
(4)
如果生態(tài)的規(guī)模存在小于10的,則其相似度計算:
(5)
相似度閾值k應(yīng)該基于生態(tài)網(wǎng)絡(luò)的特征來設(shè)置.具有許多活躍成員長期參與的穩(wěn)定生態(tài)往往具有較高的相似度閾值.然而,在本文所研究的高度動態(tài)的軟件生態(tài)網(wǎng)絡(luò)中,生態(tài)系統(tǒng)的結(jié)構(gòu)隨時間而變化,導(dǎo)致生態(tài)系統(tǒng)變得不穩(wěn)定.例如生態(tài)系統(tǒng)中的老成員逐漸離開,而新成員繼續(xù)加入,這種生態(tài)系統(tǒng)也將存活很長時間.因此,為了識別生態(tài)系統(tǒng)的演化,本實驗中的低相似度閾值將是優(yōu)選,故設(shè)置閾值k=0.2.
2) 演化事件定義.在軟件生態(tài)系統(tǒng)的動態(tài)演化過程中可能會發(fā)生不同的演化行為.本文主要定義了5種演化事件類型,即形成、生存、消亡、合并和分裂事件,其中合并事件可視為生存事件的特例,而分裂事件可視為消亡事件的特例.
這里分別給出了5種演化事件的定義.設(shè)i和j為兩個連續(xù)的階段(i 定義1.形成事件.如果在之前的任何階段沒有生態(tài)系統(tǒng)相匹配,則該生態(tài)系統(tǒng)是新形成的: ?i (6) 定義2.存活事件.如果在之后的階段j(j>i)至少存在一個生態(tài)系統(tǒng)與之相匹配,則該生態(tài)系統(tǒng)是存活的: ?j>i,ej?EJ,sim(ei,EJ)≥k. (7) 定義3.消亡事件.如果在之后的任何階段沒有生態(tài)系統(tǒng)相匹配,則該生態(tài)系統(tǒng)是消亡的: ?j>i,ej?EJ,sim(ei,EJ) (8) (9) (10) 在獲得7個階段軟件生態(tài)系統(tǒng)的演化事件后,我們嘗試分析哪些因素與生態(tài)系統(tǒng)在GitHub中的長期存活密切相關(guān). 本文從3個方面考慮可能的相關(guān)因素,包括生態(tài)系統(tǒng)的結(jié)構(gòu)、生態(tài)系統(tǒng)的規(guī)模以及生態(tài)系統(tǒng)的活躍度.每個方面都包含多個相關(guān)的特征,可以在表1中看到.生態(tài)系統(tǒng)的大小由其節(jié)點數(shù)和連邊數(shù)衡量.文中設(shè)定了5個特征來表征生態(tài)系統(tǒng)的結(jié)構(gòu),即平均度、簇系數(shù)、節(jié)點度中心系數(shù)、節(jié)點距離中心系數(shù)和節(jié)點介數(shù)中心系數(shù).生態(tài)系統(tǒng)的活躍度可以通過Pull Request和Release的數(shù)量來確定.分別使用F1到F9來表示這些特征. Table 1 Ecosystem Factors from Three Aspects表1 生態(tài)系統(tǒng)3個方面的特征 然后,進行多元線性回歸分析以研究與生態(tài)系統(tǒng)演化相關(guān)的因素.本文在SPSS Statistics的幫助下進行實驗,并獲得第3節(jié)中討論的結(jié)果. 本節(jié)展示了實驗的結(jié)果并嘗試回答引言中提出的3個研究問題. 為了回答引言中的研究問題1,我們將整個數(shù)據(jù)按照每半年劃分為7個時段來發(fā)現(xiàn)不斷演化的軟件生態(tài)系統(tǒng),數(shù)據(jù)的具體劃分結(jié)果如表2所示,其中,Period1指的是2015年上半年,Period2指的是2015年下半年,依此類推,一共可以得到7個階段. 文中應(yīng)用數(shù)據(jù)平滑方法來解決數(shù)據(jù)稀疏性問題,通過式(1)~(3)計算所得的每2個階段間的平滑系數(shù)α,如表3所示. 圖2顯示了數(shù)據(jù)平滑過程的具體細節(jié),清晰展示了每個階段的數(shù)據(jù).例如2015年上半年包含1 689個節(jié)點和4 006條邊,這意味著在此期間GitHub中有1 689個項目,它們之間有4 006條交叉引用關(guān)系.可以觀察到交叉引用的數(shù)量隨著時間的推移而急劇增加,因此研究其內(nèi)部的動態(tài)變化過程具有實際意義. Table 2 Data Partition Description表2 數(shù)據(jù)劃分描述 Table 3 Smoothing Coefficient Between Different Periods表3 不同階段間的平滑系數(shù) Fig.2 Data smoothing process procedure圖2 數(shù)據(jù)平滑處理過程 如第2節(jié)所述,本文使用Louvain社區(qū)發(fā)現(xiàn)算法來發(fā)現(xiàn)不斷演化的生態(tài)系統(tǒng).表4顯示了每個階段5個最大生態(tài)系統(tǒng)的結(jié)果.在表4中,列出了核心項目的名稱,即每個生態(tài)系統(tǒng)中度數(shù)最高的項目,并以該項目來代表相應(yīng)的生態(tài)系統(tǒng).通過GitHub API對生態(tài)系統(tǒng)中每個項目的標簽進行爬取,表3中還列出了頻率最高的5個標簽以更全面地描述生態(tài)系統(tǒng).表格中提供了每個階段中5個最大生態(tài)系統(tǒng)的詳細信息,包括生態(tài)系統(tǒng)規(guī)模、生態(tài)系統(tǒng)標簽和核心項目的度數(shù).從每個階段的標簽可以看出,Go,Python和Javascript是GitHub生態(tài)系統(tǒng)中最受歡迎的3種語言.容器(Container)技術(shù)一直受歡迎,以至于它在所有時期都能存活下來;Microsoft/vscode生態(tài)系統(tǒng)是一種流行的開發(fā)工具;也可以看出與人工智能相關(guān)的生態(tài)系統(tǒng)正在快速增長.2015—2018年期間每個階段的頂級生態(tài)系統(tǒng)規(guī)模急劇增加,這也表明許多生態(tài)系統(tǒng)在生態(tài)系統(tǒng)網(wǎng)絡(luò)中的各個項目之間有良好的交互關(guān)系,此外,這也從另一個方面揭示了GitHub的快速發(fā)展. 根據(jù)對結(jié)果的統(tǒng)計分析,每個階段的生態(tài)系統(tǒng) Table 4 Results of Typical Ecosystem Detection during Seven Periods表4 7個階段的典型生態(tài)系統(tǒng)挖掘結(jié)果 數(shù)量分別為311,322,428,408,425,485和432.表4僅列出了每個階段大型的生態(tài)系統(tǒng),但是,有大量小型的生態(tài)系統(tǒng)是孤立的,并沒有引起太多關(guān)注,如圖1所示. 通過觀察在不同時期檢測到的上述生態(tài)系統(tǒng),本文發(fā)現(xiàn)它們可以分為5個類別,即框架類、庫類、包管理器類、開發(fā)工具類和編程語言類,大多數(shù)生態(tài)系統(tǒng)旨在支持軟件開發(fā),表5列出了每個類別的一些典型示例以方便解讀. Table 5 Ecosystem Type and Some Examples表5 生態(tài)系統(tǒng)的類別以及一些例子 為了回答引言中所述的研究問題2,GitHub中5種類型的生態(tài)系統(tǒng)演化事件被識別和發(fā)現(xiàn).本文統(tǒng)計和分析這些事件,還提供了一些案例研究,以更好地證明生態(tài)系統(tǒng)演化分析的重要性. 生態(tài)系統(tǒng)演化事件的總體分布如圖3所示,圖3中橫坐標是以每半年為劃分形成的不同階段,縱坐標是演化事件的比例,圖3上的水平虛線用于記錄每個事件的平均值. 在GitHub中,最常見的進化事件是形成和消亡,如圖3所示,在每個演化階段內(nèi),平均的形成和消亡事件百分比可達到80%.這種現(xiàn)象表明,每半年就會形成許多新的生態(tài)系統(tǒng),相應(yīng)地,許多舊的生態(tài)系統(tǒng)也會消亡.這暗示著GitHub中的生態(tài)系統(tǒng)發(fā)展非常迅速,并且每半年都會不斷變化.這與當前的情況一致,近年來,IT技術(shù)發(fā)展非常迅速,導(dǎo)致GitHub生態(tài)系統(tǒng)的頻繁出現(xiàn)或消失. 在這些不斷發(fā)展的生態(tài)系統(tǒng)中,只有20%可以存活到下一個時期.每個時期的存活率如圖3所示.這證實了GitHub中的生態(tài)系統(tǒng)不穩(wěn)定. 在GitHub中,很少有生態(tài)系統(tǒng)與另一個生態(tài)系統(tǒng)合并,同樣,很少有生態(tài)系統(tǒng)分裂成其他生態(tài)系統(tǒng).如圖3所示,只有5%是合并事件,而分裂事件的占比更低,只有約2%,這可能是由于不同生態(tài)系統(tǒng)之間有明確的界限. 圖4顯示了不同周期之間的演變過程,本文選擇能夠存活至少4個連續(xù)周期的生態(tài)系統(tǒng)進行觀察.在此圖中,每列代表從2015-01-01—2018-06-30的半年,其寬度表示生態(tài)系統(tǒng)的大小,列之間的波形表示動態(tài)變化過程,波的寬度表示生態(tài)系統(tǒng)的規(guī)模.生態(tài)系統(tǒng)的演化過程可以在圖4中清楚地觀測到,可以看出,生態(tài)系統(tǒng)演化的動態(tài)過程非常復(fù)雜,文中定義的所有演化事件都可以在圖中找到,這表明依賴關(guān)系的快速變化. Fig.3 Proportion of evolution events圖3 演化事件比例 可以觀察到,很少有生態(tài)系統(tǒng)可以存活至少連續(xù)4個階段,前2個時期的生態(tài)系統(tǒng)規(guī)模很小.隨著時間的推移,一些生態(tài)系統(tǒng)會變大.大多數(shù)規(guī)模較大的生態(tài)系統(tǒng)具有較高的存活率,并且它們在下一個階段內(nèi)不斷增長.相反,小型生態(tài)系統(tǒng)傾向于消亡或合并到其他生態(tài)系統(tǒng)中.因此,與小型生態(tài)系統(tǒng)相比,大型生態(tài)系統(tǒng)更加穩(wěn)定.具體而言,分裂事件更可能發(fā)生在前幾個階段,然而,在最后幾個階段,合并事件更頻繁地發(fā)生.這表明GitHub中的生態(tài)系統(tǒng)發(fā)生了巨大變化,但隨著一些特定軟件技術(shù)的發(fā)展,一些大型軟件生態(tài)系統(tǒng)最終趨于穩(wěn)定. Fig.4 The evolution of ecosystem which survived for at least four consecutive periods圖4 至少存活4個階段的生態(tài)系統(tǒng)演化過程圖 為回答研究問題3),我們對收集的數(shù)據(jù)進行多元線性回歸分析,并確定與生態(tài)系統(tǒng)存活相關(guān)的重要因素. 本文從3個不同方面考慮因素,如式(11)所示多元線性回歸方程: Y=α1F1+α2F2+…+α9F9+C, (11) 其中,Y是因變量,表示生態(tài)系統(tǒng)的狀態(tài),0表示消亡,1表示存活.F1~F9是自變量,表示生態(tài)系統(tǒng)的不同特征,它們的系數(shù)是α1~α9,C是表示隨機誤差的常數(shù). 本文使用NetworkX[37]這一Python包來分析復(fù)雜網(wǎng)絡(luò)的結(jié)構(gòu)和功能,并計算生態(tài)系統(tǒng)的特征.然后,將特征值輸入SPSS統(tǒng)計分析軟件,進行多元線性回歸分析[36]. 表6列出了自變量的顯著性檢驗結(jié)果,該表顯示了模型的偏回歸系數(shù)B、標準誤差(Std.Error)、常數(shù)(Constant)、歸一化偏回歸系數(shù)β、回歸系數(shù)檢驗的統(tǒng)計觀察t和相應(yīng)的p值檢驗Sig.. 因此,從標準化系數(shù)可以觀察得到,因素F2,F(xiàn)3,F(xiàn)4,F(xiàn)5,F(xiàn)8和F9將促進生態(tài)系統(tǒng)的存活,而因素F1,F(xiàn)6,F(xiàn)7將使生態(tài)系統(tǒng)趨向于消亡.其中,生態(tài)系統(tǒng)的規(guī)模對生態(tài)系統(tǒng)的發(fā)展有較明顯的影響,這種現(xiàn)象表明了不是節(jié)點的數(shù)量而是連邊的數(shù)量決定了生態(tài)系統(tǒng)是否可以存活,連接越緊密的生態(tài)系統(tǒng)越可能存活.生態(tài)系統(tǒng)的結(jié)構(gòu)對生態(tài)系統(tǒng)的發(fā)展也具有一定的影響,具體表現(xiàn)為:擁有較高平均度和簇系數(shù)的生態(tài)系統(tǒng)將傾向于存活;與圍繞某些核心項目形成的生態(tài)系統(tǒng)相比,沒有中心成員的生態(tài)系統(tǒng)更有可能存活.此外,生態(tài)系統(tǒng)的活躍度對其生存有輕微的積極影響,越活躍的生態(tài)系統(tǒng)越趨向于存活. 當顯著性水平為α=0.05時,只有F1,F(xiàn)2,F(xiàn)3和F4通過顯著性檢驗.雖然回歸方程中的自變量非常重要,但在某些情況下,自變量F對Y并沒有顯著影響.因此,回歸方程應(yīng)該是替換為 Y=-0.539F1+0.716F2+0.366F3+0.133F4. (12) Table 6 Multiple Linear Regression Analysis Results表6 多元線性回歸分析結(jié)果圖 GitHub生態(tài)系統(tǒng)的演化行為非常復(fù)雜.本部分討論了3種典型生態(tài)系統(tǒng)的演化過程. 3.4.1 案例1:容器生態(tài)系統(tǒng)的演化 容器是目前最重要的IT技術(shù)之一.圖5中的生態(tài)系統(tǒng)與容器技術(shù)密切相關(guān),例如Kubernetes,容器相關(guān)的Go語言和Terraform.可以觀察到,前3個階段生態(tài)系統(tǒng)的數(shù)量迅速增加,然后生態(tài)系統(tǒng)逐漸發(fā)展成為一個更大的生態(tài)系統(tǒng).這種現(xiàn)象表明這項技術(shù)仍在蓬勃發(fā)展,生態(tài)系統(tǒng)正在變得越來越大. 3.4.2 案例2:Minecraft生態(tài)系統(tǒng)的演化 自2015年以來,Minecraft一直是一款非常受歡迎的游戲,擴展游戲內(nèi)容和優(yōu)化游戲體驗的生態(tài)系統(tǒng)至今仍然存在.Minecraft生態(tài)系統(tǒng)的演變可以在圖6中看到.可以看出,生態(tài)系統(tǒng)在開始時發(fā)展得非常迅速,在第3階段達到了最大規(guī)模,但隨后開始縮小.這種現(xiàn)象表明游戲的普及程度有所降低.如果不采取改進措施,該生態(tài)系統(tǒng)可能會消亡. 3.4.3 案例3:機器人生態(tài)系統(tǒng)的演化 圖7中的所有生態(tài)系統(tǒng)都與機器人相關(guān)聯(lián).值得注意的是:在第4階段,RobotLocomotion生態(tài)系統(tǒng)分為2個子生態(tài)系統(tǒng).根據(jù)統(tǒng)計分析,其中一個與機器人制造更相關(guān),而另一個與機器人工智能更相關(guān).這種情況可能歸因于近年來人工智能技術(shù)的迅猛發(fā)展. Fig.5 Evolution of Container Ecosystem圖5 容器生態(tài)系統(tǒng)的演化 Fig.6 Evolution of Minecraft Ecosystem圖6 Minecraft生態(tài)系統(tǒng)的演化 Fig.7 Evolution of Robotics Ecosystem圖7 機器人生態(tài)系統(tǒng)的演化 本文對GitHub中軟件生態(tài)系統(tǒng)的演化進行了檢測和分析.通過將數(shù)據(jù)分為7個階段并在每個階段中應(yīng)用社區(qū)發(fā)現(xiàn)方法,從而發(fā)現(xiàn)了不斷演化的生態(tài)系統(tǒng).然后,文中定義并發(fā)現(xiàn)出5種演化事件:形成、存活、消亡、合并和分裂事件.在對GitHub的演化事件進行統(tǒng)計分析后,本文分析了與生態(tài)系統(tǒng)生存相關(guān)的因素.本文的結(jié)論是:項目間具有高技術(shù)依賴的生態(tài)系統(tǒng)更有可能存活下來,而只圍繞某些核心項目形成的生態(tài)系統(tǒng)更趨向于消亡.本文最后描述了3個具體的研究案例,以更詳細地展示GitHub中生態(tài)系統(tǒng)的演化過程.本研究發(fā)現(xiàn)了一些與生態(tài)系統(tǒng)存活密切相關(guān)的因素.在未來,我們將嘗試開發(fā)一些模型來預(yù)測生態(tài)系統(tǒng)可能發(fā)生的演化行為,此外,還將把工作擴展到其他代碼托管平臺上.2.3 分析與演化行為相關(guān)的因素
3 研究結(jié)果與分析
3.1 GitHub中不斷演化的軟件生態(tài)系統(tǒng)
3.2 GitHub中生態(tài)系統(tǒng)演化事件
3.3 與生態(tài)系統(tǒng)存活相關(guān)的因素分析
3.4 案例分析
4 總結(jié)與展望