GitHub Archive分析 - 2015最受矚目的項目們
你應該見過不少對GitHub上等等開源項目進行的分析文章。據說國外甚至有人靠分析Github上的項目解決了畢業論文……(要是我的畢業論文也能這么解決就好了XD) 借助于Google Big Query和來自于 GitHub Archive 的數據歸檔,對GitHub上的項目進行簡單的數據分析并不困難。下文我將試圖分析2015年GitHub上被收藏(starred)最多的5000個項目,進而求出2015年最受矚目的編程語言排行。
GitHub Archive 這個網站通過GitHub的API,定期抓取GitHub的 事件數據 ,并上傳到Google Big Query,供熱心群眾分析。它在官網上介紹了 如何用Google Big Query來分析數據 。
Google Big Query允許用戶創建項目,上傳數據歸檔,并通過SQL來查詢這些數據。下圖就是GitHub Archive在Big Query上,存儲著2016-02-01這一天數據的 項目 。
我們可以看到它的schema定義,基本上類似于GitHub 事件API 返回的數據格式。其中一些重要的字段如下:
-
type 事件類型。比如jeresig創建了項目processing-js,那么這個事件的類型就是CreateEvent。你可以上GitHub事件相關的文檔里查到各種事件對應的類型。
-
repo.name 項目名,在上面例子中,是jeresig/processing-js
-
actor.login 該事件的主人公,在上面例子中,是jeresig
于是我們小試牛刀,運行下面的Query,查詢jeresig去年一年push的次數:(這里用 TABLE_DATE_RANGE
函數用于匹配從 githubarchive:day.events_20150101
到 githubarchive:day.evnets_20151231
所有的表)
SELECT COUNT(*) FROM
TABLE_DATE_RANGE([githubarchive:day.events_],
TIMESTAMP('2015-01-01'),
TIMESTAMP('2015-12-31'))
WHERE type = 'PushEvent' and actor.login = 'jeresig'
得出的結果為
稍微復雜點,運行下面的Query,查詢jeresig去年一年內提了Pull Request的項目和各自提的次數:
SELECT COUNT(*) AS num, repo.name FROM
TABLE_DATE_RANGE([githubarchive:day.events_],
TIMESTAMP('2015-01-01'),
TIMESTAMP('2015-12-31'))
WHERE type = 'PullRequestEvent' and actor.login = 'jeresig'
GROUP BY repo.name ORDER BY num DESC
把關注點從人轉向項目,讓我們回歸主題,查詢去年一年間最受矚目的那些項目們,并粗略地分析下它們。通過查GitHub的API文檔,我們知道用戶star一個項目時會觸發一個 WatchEvent (對的,就是WatchEvent)。所以我們可以遍歷下去年所有的WatchEvent事件,按repo_name進行分組,計算每組的數目,并截取前5000名。寫出來的Query如下:
SELECT COUNT(*) AS star, repo.name FROM
TABLE_DATE_RANGE([githubarchive:day.events_],
TIMESTAMP('2015-01-01'),
TIMESTAMP('2015-12-31'))
WHERE type = 'WatchEvent'
GROUP BY repo.name ORDER BY star DESC LIMIT 5000
我把Big Query查詢到的數據保存成 github-star-2015.csv
,分享到百度網盤上,有需要的人可以下載: http://pan.baidu.com/s/1dElWKHr
現在,我宣布,2015年最受矚目的項目前十的名單新鮮出爐啦!(請腦補最應景的BGM)
~/doc head -11 github-star-2015.csv
star,repo_name
38318,FreeCodeCamp/FreeCodeCamp
25861,非死book/react-native
25479,apple/swift
24344,sindresorhus/awesome
22917,非死book/react
22093,jlevy/the-art-of-command-line
20401,NARKOZ/hacker-scripts
19736,twbs/bootstrap
17885,google/material-design-lite
17568,airbnb/javascript
初看這份名單,你會發現去年是React年。前十的名單里,React就占了兩。你也許會想起,swift在這一年里開源了(果粉的力量真強大,同樣也是去年搬到GitHub的golang就擠不進前十名~)。仔細分析下各個項目,你會發現,漲star最快的項目有不少是代碼無關的項目。比如第一名FreeCodeCamp,第四名awesome,第六名the-art-of-command-life,第十名airbnb/javascript(airbnb內部的javascript編程規范)等等,都是如此。另外,一個顯著的發現是,前十名中,前端的項目占了三個,這還不計算半個前端項目的react-native和前端編碼規范的airbnb/javascript。前端項目三分天下有其一,準確來講,已經接近撐起半邊天了。如果說前幾年的GitHub是Ruby開發者的GitHub,那么如今的GitHub無疑是前端的GitHub。
借助GitHub的API,我們來看看前5000名項目的編程語言使用情況。題外話,如果GitHub提供了項目所有者可以給自己的項目打標簽,那么我們除了分析下編程語言,還可以分析下更多方面的內容,比如去年哪一方面的項目最受矚目。要是有機會給GitHub產品部門提意見,我一定會寫上這一點。不過目前就只能分析分析下編程語言了。
由于GitHub設置了API調用限制,我們需要先注冊應用,獲取對應的 client_id
和 client_secret
,才能有足夠的調用數量。注冊地址見 https://github.com/settings/applications/new ,里面的數據不需要審核,我當時是亂填一通的=_=
GitHub提供了查詢某個項目的編程語言使用情況的 API ,借此寫出了下面的腳本,統計前5000個項目中編程語言的占比:
#!/usr/bin/env ruby
encoding: UTF-8
require 'json'
require 'net/http'
require 'set'
-
獲取了每個項目的語言成分后,去掉占比不到1%的語言,剩下的語言按比例分掉star數。之所以不直接把star分到占比最大的語言,是因為有些項目用到多種語言且比例相當,如非死book/react-native.
-
去掉1%之后,如果剩下的語言正好是JavaScript,CSS和HTML,那么該項目很可能是代碼無關的(比如一個收集各類資料的靜態網站)。顯然大家關注它的緣故跟任何一門編程語言無關,所以不列入統計之中。但是考慮到CSS框架也正好會有這三門語言,所以當CSS占比較高時可以豁免。
下面是最終的結果:
...
first 5000
1 JavaScript 26.38%
2 Java 13.33%
3 Objective-C 8.21%
4 Python 8.09%
5 Go 5.44%
6 Swift 4.63%
7 C 3.88%
8 HTML 3.84%
9 C++ 3.82%
10 Ruby 3.60%
11 CSS 3.28%
12 PHP 2.99%
13 Shell 2.67%
14 CoffeeScript 1.51%
15 C# 1.19%
16 VimL 0.90%
17 TypeScript 0.63%
18 Scala 0.59%
19 Lua 0.46%
20 Clojure 0.44%
21 Rust 0.39%
22 Haskell 0.28%
23 Makefile 0.22%
24 Objective-C++ 0.21%
25 Emacs Lisp 0.21%
26 Jupyter Notebook 0.21%
27 Perl 0.20%
28 TeX 0.17%
29 Elixir 0.16%
30 Groff 0.16%
31 Groovy 0.14%
32 R 0.12%
33 OCaml 0.11%
34 PowerShell 0.10%
35 Batchfile 0.10%
36 ApacheConf 0.08%
37 Erlang 0.08%
38 Cucumber 0.08%
39 Assembly 0.07%
40 Crystal 0.06%
41 PureBasic 0.05%
42 QML 0.05%
43 Visual Basic 0.04%
44 PLpgSQL 0.04%
45 Tcl 0.04%
46 Dart 0.04%
47 Vue 0.04%
48 CMake 0.03%
49 PLSQL 0.03%
50 XSLT 0.03%
...
一個顯而易見的結論:GitHub上不小一部分的熱門項目,是由JavaScript寫的。JavaScript一門語言的占比,比第二名和第三名加起來還多出個第六名。這還不包括第十四名的CoffeeScript和第十七名的TypeScript(它們可以編譯成JavaScript,嚴格來說也是JavaScript大家族的一員)。另外從每個checkpoint時輸出的數據可見,排名靠前的項目中,JavaScript占的比例要比全部項目中的高。如果我們選擇的樣本變小,JavaScript的占比還會升高(都穩拿第一名,排名就不可能升高了)。
另一個結論是,Go(第五名)和Swift(第六名)這兩門語言正處于快速發展的時期。雖然實際應用的情況不如前十名中其它語言廣泛,但是從star數中可見,開發者們非常看好這兩門語言,關注了許多這方面的項目,同時用這兩門語言編寫的高質量項目也越來越多。
前十名中其它語言的排名倒是一點也不出乎意料。Java和Objective-C分居榜眼和探花。剩下幾位自然包括了C/C++/Python等等。令人意外的是,C#(第十五名)居然沒能排進前十名。按理說,C#的使用量肯定能排在前十。也許C#生態圈里面主要使用的都是微軟的商業產品?
最后,我想感謝 GitHub Archieve 提供的數據歸檔,沒有這些數據就沒有本篇分析。
來自: http://segmentfault.com/a/1190000004401498