你应该见过不少对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,facebook/react-native
25479,apple/swift
24344,sindresorhus/awesome
22917,facebook/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-8require 'json'
require 'net/http'
require 'set'def get_language_ingredient(repo)url = "https://api.github.com/repos/#{repo}/languages"# 请改成你自己的 client_id 和 client_secretclient_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)elseputs res.msg{}end
enddef sum_star_number_per_language(result, repo, star)ingredient = get_language_ingredient(repo)puts "The language ingredient of #{repo}: #{ingredient}"return if ingredient.length == 0sum = 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']returnendend# 剩下的按比例分了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).roundend
enddef 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)endoutput + "\n"
endresult = {}
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 + 1star, repo = line[0...-1].split(',')star = star.to_iputs 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

注意两点:

  1. 获取了每个项目的语言成分后,去掉占比不到1%的语言,剩下的语言按比例分掉star数。之所以不直接把star分到占比最大的语言,是因为有些项目用到多种语言且比例相当,如facebook/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提供的数据归档,没有这些数据就没有本篇分析。

GitHub Archive分析 - 2015最受瞩目的项目们相关推荐

  1. 2006年最受瞩目的七大IT技术

    2006年最受瞩目的七大IT技术 出至www.okajax.com 计世网消息 即将来临的一年似乎会大大改变人们使用技术工作和娱乐的方式.预计在2006年出现的令人兴奋的技术进步包括:高级网络应用和工 ...

  2. GitHub上25个最受欢迎的开源机器学习库

    作者 | Khoa Pham 译者 | Shawn Lee 编辑 | Jane 出品 | AI科技大本营 在过去的几年里,机器学习为各行各业开创了新纪元,诞生了许多成功的案例: Facebook 的面 ...

  3. 2006年最受瞩目的七大IT技术(转)

    2006年最受瞩目的七大IT技术(转)[@more@]即将来临的一年似乎会大大改变人们使用技术工作和娱乐的方式.预计在2006年出现的令人兴奋的技术进步包括:高级网络应用和工具将进一步模糊桌面系统与互 ...

  4. 美国科技界最受瞩目华人高管沈向洋官宣!微软之后他去哪儿了?

    热点追踪 / 深度探讨 / 实地探访 / 商务合作 去年11月,时任微软集团执行副总裁.微软AI+研究部负责人的沈向洋博士宣布离职微软,"美科技巨头再无华人高管" 的报道刷爆全网. ...

  5. 2017年上半年最受瞩目的黑客事件,你知道几个?

    本文讲的是2017年上半年最受瞩目的黑客事件,你知道几个?, "旧患新伤"加重网络安全隐患 2016年的数据泄露趋势报告显示,被泄露的记录数量呈爆炸性增长,从2015年的8.22亿 ...

  6. 2022 年最受瞩目的新特性 CSS @layer 到底是个啥?

    步入 2022,CSS 的新特性层出不穷,而最近在 CSS 圈最受瞩目的新特性,非 CSS @layer 莫属. 本文,将用最简洁的语言,快速让读者们搞懂,到底什么是 CSS @layer 新规范. ...

  7. 分析型数据库受大数据市场追捧

    文章讲的是分析型数据库受大数据市场追捧,近期,大数据领域有一些值得关注的动向.首先,EMC和VMware正式公布成立新公司Pivotal.其次,Actian公司宣布收购大规模并行处理(MPP)分析数据 ...

  8. 2020年GitHub上50个最受程序员欢迎的PHP开源项目

    GitHub上50个最受欢迎的PHP开源项目[2019] 1.Laravel Laravel是一个为Web开发者打造的PHP开发框架. GitHub Stars: 43.5k+ 网址:https:// ...

  9. 世界首富比尔·盖茨面湖而建的6000万美元豪宅被誉为美国除白宫外最受瞩目的名人官邸

    世界首富比尔·盖茨面湖而建的6000万美元豪宅,被誉为美国除白宫外最受瞩目的名人官邸.而今,比尔·盖茨的新邻居中出现越来越多的中国人.受楼市调控的影响,海外置业一年多来轮番掀起高潮.和国内类似,中国人 ...

最新文章

  1. 系统科学丨钱学森:我对系统学认识的历程
  2. MyBatis多数据源配置(读写分离)
  3. 【MM模块】Report 标准报表简介
  4. Socket is closed 可能原因
  5. 【Python】8000字:Python时间系列之datetime模块
  6. 克里斯蒂安贝尔_克里斯蒂安贝尔和乌云背后的幸福线导演合作神秘“大片”
  7. 网络协议之:一定要大写的SOCKS
  8. 如何在ubuntu上安装virtualbox的driver module vboxdrv
  9. Cocos2dx实现象棋之布局
  10. 随笔-jsp 利用jstl标签分页
  11. 杭电acm2034 人见人爱A-B
  12. 让我康康,是谁进了 Hack for wuhan 初赛?
  13. java水彩画效果滤镜,把动物照片转成水彩画效果的PS滤镜教程
  14. Linux 下的桌面指针时钟
  15. Advanced Installer Architect创作工具
  16. 上传文件到到大数据平台
  17. 微信小程序车辆登记+后台管理系统
  18. ubuntu 8000端口被占用
  19. uniapp一键登录功能
  20. 岗位po是什么意思_通信公司中PO和PM分别是什么意思?

热门文章

  1. 翻译翻译,什么是滑动窗口
  2. 计蒜客- 蒜头君的工厂
  3. JJWT 实现JWT
  4. 【JVM】JVM01(概述-程序计数器-栈-堆)
  5. 取各位数字c语言程序,取出数字的每一位
  6. 【教程】JQuery+css制作焦点图
  7. CSS学习(第四天)(浮动,常见网页布局,清除浮动,PS切图)
  8. 苹果设备类型对照表----支持iPhone、iPad、Apple Watch
  9. 易班php,易班PHP-认证sdk解析
  10. promis:异步编程