劉琪琪
(四川大學(xué)計算機學(xué)院,成都 610065)
在今天的數(shù)字世界中,開源軟件幾乎是現(xiàn)代社會和經(jīng)濟(jì)的全部賦能。任何對于開源社區(qū)項目的貢獻(xiàn)都是至關(guān)重要的,尤其是依賴于開源社區(qū)所提供的關(guān)鍵服務(wù)以及技術(shù)支持的用戶群體。
GitHub是一個面向開源及私有軟件項目的托管平臺,因為僅支持Git作為唯一的版本庫格式進(jìn)行托管,故名GitHub。其作為全球最大的代碼托管平臺,平均每小時都有成千上萬個項目產(chǎn)生,它為開源社區(qū)做出了不可磨滅的貢獻(xiàn)。已經(jīng)有研究人員開始嘗試挖掘GitHub上龐大的數(shù)據(jù)信息,試圖理解GitHub用戶群體如何使用GitHub開發(fā)開源軟件。GitHub引入了一個“fork&pull”模型,開發(fā)人員可以通過fork創(chuàng)建自己的拷貝存儲庫,當(dāng)他們想要在項目修改后可以并入主分支時,便可以通過pull提交一個請求。除了代碼托管、協(xié)作代碼審查和集成問題跟蹤之外,GitHub還集成了社交功能。用戶可以關(guān)注某個用戶,隨時關(guān)注其關(guān)注用戶的項目,及時將用戶感興趣的信息推送給用戶。用戶還可以擁有自己的站點,通過自動識別可以顯示出他們最近的活動。GitHub已經(jīng)變得越來越受歡迎,目前已經(jīng)有超過3500萬的項目。如此受歡迎程度、社會和協(xié)作功能以及其源數(shù)據(jù)的可用性使得數(shù)據(jù)挖掘領(lǐng)域的研究人員把GitHub作為一個完美的數(shù)據(jù)挖掘?qū)ο蟆?/p>
開源軟件項目的成功很大程度上依賴于積極的團(tuán)隊參與,包括計劃、開發(fā)、維護(hù)和文檔化。參與者通常使用一個或多個共享軟件存儲庫進(jìn)行協(xié)作,以存儲和管理源代碼、文檔和bug報告。GitHub平臺的開源軟件項目的完成主要是來自團(tuán)隊的貢獻(xiàn),然而對于此類項目的軟件資源庫訪問通常是嚴(yán)格控制的,GitHub上這些項目的合作更傾向于以修復(fù)程序或者pull request的形式請求外部參與[1]。
學(xué)術(shù)界是指學(xué)術(shù)或?qū)W院式的環(huán)境。在GitHub中超過千萬的項目中,有很大一部分來自于學(xué)術(shù)界,這些項目與科研工作者的研究息息相關(guān)。而且,使用數(shù)據(jù)挖掘技術(shù)能夠從GitHub龐大的數(shù)據(jù)中挖掘并分析這類信息。將GitHub用戶群體進(jìn)行分類,其中隱含著學(xué)術(shù)界、工業(yè)界以及個人用戶的數(shù)量及其所占比例。通過分析挖掘的信息,能夠知曉用戶使用這個產(chǎn)品的目的和習(xí)慣,從而得出開源項目的發(fā)展趨勢。
本文首次提出分析學(xué)術(shù)界對開源社區(qū)所做的貢獻(xiàn),結(jié)合現(xiàn)在最受歡迎的開源項目平臺GitHub,通過平臺提供的API挖掘到的一定量的大數(shù)據(jù)進(jìn)行整理分析,從學(xué)術(shù)界人員所占比例、人員的分布、所參與的項目以及使用語言的偏好著手,通過運用對比分析法、結(jié)構(gòu)分析法等對數(shù)據(jù)進(jìn)行分析,再運用杜邦分析法分析原因,實驗結(jié)果反映出了學(xué)術(shù)界對于開源平臺重視程度以及開源平臺在一定程度上對科學(xué)研究有引領(lǐng)作用。
GitHub對外提供開放應(yīng)用編程接口(API),可以使用其獲取整個平臺的數(shù)據(jù),借助GitHubarchive和GHTorrent工具以及GoogleBigquery查詢到自己需要的數(shù)據(jù)。也可從現(xiàn)有各個渠道搜索查找相關(guān)數(shù)據(jù),例如中文網(wǎng)站GitHuber。
GitHub Archive網(wǎng)站是通過GitHub的API,定期抓取GitHub的事件數(shù)據(jù),并上傳到Google Big Query進(jìn)行分析。GitHubarchive中根據(jù)時間線存儲著從GitHub上獲取的數(shù)據(jù),數(shù)據(jù)分為 yeardataset,monthdataset,daydataset。通過查詢GitHub的API文檔,我們了解到用戶star一個項目時會觸發(fā)一個WatchEvent。因此,程序可以遍歷去年所有的WatchEvent事件,按repo_name進(jìn)行分組,計算每組的數(shù)目。最終截取前7000條數(shù)據(jù),用來分析去年最受關(guān)注的項目。
SELECT COUNT(*)AS star,repo.name
FROM[GitHubarchive:year.2016]
WHERE type='WatchEvent'
GROUP BY repo.name ORDER BY star DESC LIMIT 7000
由此可挑選出去年最受歡迎的100個項目,從而篩選出這些項目中的參與用戶,有多少來自學(xué)術(shù)界,評比學(xué)術(shù)界在這些項目中的貢獻(xiàn)。
表1 按star值排名靠前的部分項目
GHTorrent中的數(shù)據(jù)也是源于GitHub API獲取的JSON數(shù)據(jù),數(shù)據(jù)以bson的形式保存在MongoDB里,在解析后得到Schema不僅可以將其保存在MySQL里還可以導(dǎo)出SQL[3]。使用GoogleBigQuery即可進(jìn)行SQL查詢。篩選數(shù)據(jù)庫中表users里的company,可以得到包 含 有“university”,“institute”,“college”,“school”,“academy”,“學(xué)院”,“大學(xué)”,“學(xué)?!?,“研究所”,“研究院”,“中科院”的用戶。意味著這些用戶隸屬于學(xué)術(shù)界。通過projects表,可查出相關(guān)用戶所做的項目情況。
圖1 GHTorrent數(shù)據(jù)庫表
對所得數(shù)據(jù)進(jìn)行預(yù)處理整合,去除重復(fù)項,共3543人的company來自于學(xué)術(shù)界。經(jīng)過學(xué)術(shù)界的用戶匹配項目后,可以得到一共4983個項目。
圖2 部分學(xué)術(shù)界用戶的公司和地理位置
圖3 部分學(xué)術(shù)界用戶的項目和項目描述
GitHuber是基于GitHub數(shù)據(jù)平臺的一個中文網(wǎng)站,可直接通過關(guān)鍵字搜索相關(guān)機構(gòu)的用戶,選擇關(guān)鍵字“學(xué)院”,即可查出所有中國的學(xué)術(shù)界用戶。部分?jǐn)?shù)據(jù)如下:
圖4 中國學(xué)術(shù)界按聲望排行榜
通過調(diào)用 GitHub的 API,抓取 followers排名前1000的用戶,再使用如下公式計算Score值。本文提出的計算公式是受到了業(yè)界對followers的排名認(rèn)可度的啟發(fā)。業(yè)界普遍認(rèn)為followers在前期的增長含金量比較高,而之后的增加主要是影響力因素。
通過計算,分別找到了中國地區(qū)和世界地區(qū)排名前1000的人。部分排名如下:
圖5 GitHub用戶聲望計算方式
圖6 中國地區(qū)排名
圖7 世界地區(qū)排名
數(shù)據(jù)處理包含數(shù)據(jù)清洗、數(shù)據(jù)轉(zhuǎn)化、數(shù)據(jù)提取、數(shù)據(jù)計算等過程。
數(shù)據(jù)清洗主要包含刪除重復(fù)項,填充缺失項以及檢測邏輯錯誤項等。由于公司名字存在多個模糊匹配字段,所以在數(shù)據(jù)量足夠多的情況下,得到的總?cè)藬?shù)中必然有重復(fù)存在的數(shù)據(jù),因此需要將重復(fù)項刪除。在3543名學(xué)術(shù)界的用戶信息中,去除location填寫為空的用戶,有2559名用戶顯示了其地理位置。而匹配的目標(biāo)字段存在很多空白的缺失數(shù)據(jù),需將其補齊。當(dāng)缺失值是以錯誤標(biāo)識符形式出現(xiàn)的時候,本文的做法是將其全部替換成0。
當(dāng)數(shù)據(jù)表現(xiàn)為某些數(shù)據(jù)字段不滿足我們的數(shù)據(jù)分析需求時,需要對現(xiàn)有字段進(jìn)行抽取、計算或者轉(zhuǎn)換等處理,生成符合本文分析所需要的一系列新數(shù)據(jù)字段。如抽取的項目參與人員commit次數(shù)的數(shù)據(jù),得到的是數(shù)字加上人名的形式,而本文只需要參與人員姓名即可,則通過檢測空格把數(shù)據(jù)進(jìn)行字段分列,去除掉commit字段后,再將人名用“&”進(jìn)行字段合并。
從Bigquery上直接導(dǎo)出的數(shù)據(jù)中文字段會存在亂碼情況,是由于CSV文件編碼引起的。因而需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換而得到相應(yīng)的字段。
在3543名學(xué)術(shù)界的用戶信息中,去除location填寫為空的用戶,得到了帶有明確地理位置信息的2559名用戶。利用ArcGIS軟件導(dǎo)入位置數(shù)據(jù),可以得到一個如下圖的學(xué)術(shù)界用戶群體分布圖。
圖8 學(xué)術(shù)界地理位置分布圖
由圖可知,GitHub上的學(xué)術(shù)界用戶群體大多分布在美國、英國、中國、印度、韓國等國家,且一線城市的居多。
通過獲取的2016年最火的前100個項目,使用基于git的后臺并配置ssh key可下載獲得這些項目的源代碼。在命令窗輸入git log--pretty='%aN'|sort|uniq-c|sort-k1-n-r,可以獲得每個項目的參與人員commit的次數(shù)。
圖9 學(xué)術(shù)界所在城市排名
圖10 獲取參與人員commit詳情
選取學(xué)術(shù)界前10的項目一一進(jìn)行研究分析后,將所有用戶匯總到同一個表格內(nèi),去重處理后可知共有3179名用戶參與,再與先前獲取的學(xué)術(shù)界用戶群體數(shù)據(jù)進(jìn)行比對可知,學(xué)術(shù)界人員有15名,占總?cè)藬?shù)的0.5%。
學(xué)術(shù)界的項目類型主要分為三大類,一是龐大人群共同參與的工程類項目開發(fā),二是個人所在科研項目的研發(fā)討論,三是個人生活學(xué)習(xí)類的小型項目。
通過對學(xué)術(shù)界項目的抽樣調(diào)查,可得到所有項目使用的語言詳情。
圖11 學(xué)術(shù)界所做項目分類
圖12 項目語言詳情
由此可得偏好語言的排序:
圖13 項目語言排行
開源社區(qū)有近一半的貢獻(xiàn)者表示,他們關(guān)于開源社區(qū)所做的一些工作對于他們當(dāng)前所從事的工作有或多或少的幫助,甚至有一些具有重大意義的工作也放在開源社區(qū)的平臺上。開源工作有助于開發(fā)者建立自己的專業(yè)信譽。
從參與的總?cè)藬?shù)和總項目來看,學(xué)術(shù)界的用戶在開源平臺的用戶群體中所占的比例不大。通過分析排名靠前的用戶信息所知,這些用戶幾乎都是國內(nèi)外頂尖的互聯(lián)網(wǎng)公司人才。但是通過學(xué)術(shù)界所做的項目數(shù)據(jù)信息進(jìn)行分析可知,大部分學(xué)者在開源平臺的項目大都和自己研究方向相關(guān)。
參考文獻(xiàn):
[1]Padhye R,Mani S,Sinha V S.A Study of External Community Contribution to Open-Source Projects on GitHub[C].Proceedings of the 11th Working Conference on Mining Software Repositories.ACM,2014:332-335.
[2]Gousios G,Pinzger M,Deursen A.An Exploratory Study of the Pull-Based Software Development Model[C].Proceedings of the 36th International Conference on Software Engineering.ACM,2014:345-355.
[3]Gousios G.The GHTorent Dataset and Tool Suite[C].Proceedings of the 10th Working Conference on Mining Software Repositories.IEEE Press,2013:233-236.
[4]Cosentino V,Izquierdo J L C,Cabot J.Findings from GitHub:Methods,Datasets and Limitations[C].Mining Software Repositories(MSR),2016 IEEE/ACM 13th Working Conference on.IEEE,2016:137-141.
[5]Dyer R,Nguyen H A,Rajan H,et al.Boa:A Language and Infrastructure for Analyzing Ultra-Large-Scale Software Repositories[C].Proceedings of the 2013 International Conference on Software Engineering.IEEE Press,2013:422-431.