GitHub Archive分析 - 2015最受矚目的項目們

jopen 8年前發布 | 21K 次閱讀 HTML Github

你應該見過不少對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_20150101githubarchive: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_idclient_secret ,才能有足夠的調用數量。注冊地址見 https://github.com/settings/applications/new ,里面的數據不需要審核,我當時是亂填一通的=_=

GitHub提供了查詢某個項目的編程語言使用情況的 API ,借此寫出了下面的腳本,統計前5000個項目中編程語言的占比:

#!/usr/bin/env ruby

encoding: UTF-8

require 'json' require 'net/http' require 'set'

def get_language_ingredient(repo) url = "

請改成你自己的 client_id 和 client_secret

client_id = '05500dd030f3a5690d8e' client_secret = 'b8ba63550e07dd3bf7b5b467824ee9ced1c61192' url += "?client_id=#{client_id}&client_secret=#{client_secret}" res = Net::HTTP.get_response(URI(url)) if res.code == '200' JSON.parse(res.body) else puts res.msg {} end end

def sum_star_number_per_language(result, repo, star) ingredient = get_language_ingredient(repo) puts "The language ingredient of #{repo}: #{ingredient}" return if ingredient.length == 0 sum = ingredient.reduce(0){|total, pair| total += pair[1]}

去掉占比不到1%的語言

ingredient.reject!{|_, bytes| bytes < sum * 0.01}

如果剩下的語言正好是 JavaScript/CSS/HTML,

則表示它很可能是代碼無關的項目,直接忽略掉

if Set.new(ingredient.keys) == Set.new(['JavaScript', 'CSS', 'HTML'])

# CSS框架除外。考慮到有些靜態網站也是CSS比JS多,這里要求CSS比JS和HTML多得多。
# 下面的公式隨手寫的,沒有什么特殊意義,只是強調CSS一定要占大多數。
unless ingredient['CSS'] > 2 * ingredient['JavaScript'] + ingredient['HTML']
  return
end

end

剩下的按比例分了star數

sum = ingredient.reduce(0){|total, pair| total += pair[1]} ingredient.each_pair do |language, bytes| result[language] = result.fetch(language, 0) + (bytes.fdiv(sum) * star).round end end

def output_star_number_per_language(result) sum = result.reduce(0){|total, pair| total += pair[1]} output = '' result.sort {|a, b| b[1] <=> a[1]}.each_with_index do |e, idx| output += format("%-4d %-40s %.2f%\n", idx+1, e[0], e[1].fdiv(sum).round(4) * 100) end output + "\n" end

result = {} output = {} checkpoints = [50, 100, 200, 500, 1000, 2000, 5000] f = File.new('github-star-2015.csv').each f.next f.each_with_index do |line, idx| step = idx + 1 star, repo = line[0...-1].split(',') star = star.to_i puts format("%-4d %-40s %d", step, repo, star) sum_star_number_per_language(result, repo, star) puts "The result after #{repo}: #{result}\n\n" if checkpoints.include?(step) output[step] = output_star_number_per_language(result) puts "first #{step}" puts output[step] end end puts ''

output.each_pair do |step, rank| puts "first #{step}" puts rank end</code></pre>

注意兩點:

  1. 獲取了每個項目的語言成分后,去掉占比不到1%的語言,剩下的語言按比例分掉star數。之所以不直接把star分到占比最大的語言,是因為有些項目用到多種語言且比例相當,如非死book/react-native.

  2. 去掉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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!