村上春树(日本后现代主义作家)有一本书,《当我跑步时,我谈些什么》,Felipe 这篇文章的统计数据和这本书有点类似,周末的时间我们会使用什么语言进行编程,看了他的文章,我们会知道在办公室里使用的语言,不过是谋生工具而已,私底下大家并不喜欢它们。
下面这张表格的内容是 2016 年度排名前 20 位的周末编程语言,根据 GitHub(全球领先的软件开发平台)、GHTorrent(监控着 GitHub 上的每一次更改,并将每一次更改的更新内容,以 JSON 字符串形式存储在 MongoDB 数据库)、BigQuery(谷歌的cangku.html" target="_blank">数据仓库)等三个平台数据作为分析数据源。
从上面这张表格我们可以看到,排名前二十位的分别是:
这个排名很清晰地告诉我们,2016 年属于 Functional Languages(函数型语言),以及 3D 世界的脚本语言。另外学习 Java 的朋友可以发现,Java 没有入选,但是很多函数型语言可以基于 JVM 运行,这给了我们一个提示,即未来 JVM 将会包容更多的语言,而不仅仅是 Java 语言本身。
再来看看后 20 位语言,你会发现很多我们日常谋生的语言都在这里呢,包括:
让我们看看这些 2016 年流行的周末“Happy Hour”语言的变化趋势,如图所示:
我们解释一下上面这张图所表达的含义:
那么其他语言是如何按照流行程度排序的?请看下面这张图:
作者列举了一些来自 reddit 和 HN 的问题,并作出回复。
/u/techmidrop 说:“我妈妈说了,我只能在星期天的下午 4 点到 6 点使用 Rust”。
很多人和你一样!Rust 这几年来都位居周末语言榜首。但是回到 2010 年,它也是工作日语言之一。
/u/mooglinux 说:“我现在需要 GitHub 出一份报告,报告中需要说明哪些语言分别在周末、工作日被提交的次数最多”。
放心,会有的。
/u/MasterRaceLordGaben 说:“谁在周末玩 Assembly?”
也许是学生做家庭作业?Assembly 这门语言在这里其实不是很知名,也许是有人在 Stack
Overflow 里搜索问题答案,其实并不是真的想写代码。
作者使用 BigQuery 快速地分析了这些数据集,只用了 5 分钟时间。
对 2016 年流行语言进行排名,代码如下:
#standardSQL SELECT lang , ROUND(weekend/weekday,2) ratio , weekday, weekend , repos[OFFSET (0)].value sample_repo, repos[OFFSET (1)].value sample_repo_2 FROM ( SELECT lang, month , MAX(IF(weekday,c,null)) weekday, MAX(IF(NOT weekday,c,null)) weekend , ANY_VALUE (repos) repos FROM ( SELECT language lang, TIMESTAMP_TRUNC (created_at, YEAR) month , EXTRACT (DAYOFWEEK FROM a.created_at) BETWEEN 2 AND 6 weekday , COUNT(DISTINCT committer_id) c , APPROX_TOP_COUNT (repo, 3) repos FROM `ghtorrent-bq.ght_2017_01_19.commits` a JOIN `fh-bigquery.github_extracts.ght_project_languages` b ON a.project_id=b.project_id WHERE b.percent>0.25 AND EXTRACT (YEAR FROM a.created_at) BETWEEN 2016 AND 2016 GROUP BY 1,2,3 HAVING c>100 ) GROUP BY 1,2 ) WHERE (weekend+weekday)>1450 ORDER BY ratio DESC
对 2010-2016 年的数据画图,代码如下:
#standardSQL SELECT * FROM ( SELECT *, 40-rn inv_rank, ROW_NUMBER () OVER(PARTITION BY month ORDER BY ratio) weekend_rank, MAX(month) OVER(PARTITION BY lang) max_month FROM ( SELECT lang, month , ROUND(weekend/weekday,2) ratio , weekday, weekend, weekday+weekend total , repos[OFFSET (0)].value sample_repo , ROW_NUMBER () OVER(PARTITION BY month ORDER BY weekday+weekend DESC) rn FROM ( SELECT lang, month , MAX(IF(weekday,c,null)) weekday, MAX(IF(NOT weekday,c,null)) weekend , ANY_VALUE (repos) repos FROM ( SELECT language lang, TIMESTAMP_TRUNC (created_at, YEAR) month , EXTRACT (DAYOFWEEK FROM a.created_at) BETWEEN 2 AND 6 weekday , COUNT(DISTINCT committer_id) c , APPROX_TOP_COUNT (repo, 3) repos FROM `ghtorrent-bq.ght_2017_01_19.commits` a JOIN `fh-bigquery.github_extracts.ght_project_languages` b ON a.project_id=b.project_id WHERE b.percent>0.25 AND language IN UNNEST (SPLIT ('rust,haskell,c,clojure,arduino,ruby,python,go,r,puppet,xml')) AND EXTRACT (YEAR FROM a.created_at) BETWEEN 2010 AND 2016 GROUP BY 1,2,3 ) GROUP BY 1,2 ) ) WHERE rn<=40 ) ORDER BY 2,3 DESC
外部查询语句:
SELECT lang , EXTRACT (DAYOFWEEK FROM date) BETWEEN 2 AND 6 weekday , COUNT(DISTINCT email) c , APPROX_TOP_COUNT (repo, 3) repos FROM ( SELECT author.email, LOWER(REGEXP_EXTRACT (diff.new_path, r'\.([^\./\(~_ \- #]*)$')) lang, author.date, repo_name[OFFSET (0)] repo FROM `bigquery-public-data.github_repos.commits`, UNNEST (difference) diff WHERE EXTRACT (YEAR FROM author.date)=2016 ) WHERE lang IS NOT null AND LENGTH (lang)<8 AND REGEXP_CONTAINS (lang, '[a-zA-Z]') GROUP BY 1,2 HAVING c>100 ORDER BY c DESC
如何衡量数据:
SELECT lang , MAX(IF(weekday,c,null)) weekday, MAX(IF(NOT weekday,c,null)) weekend , ANY_VALUE (repos) repos FROM ( SELECT JSON_EXTRACT_SCALAR (payload, '$.pull_request.head.repo.language') lang , EXTRACT (DAYOFWEEK FROM created_at) BETWEEN 2 AND 6 weekday , APPROX_TOP_COUNT (repo.name, 3) repos , COUNT(DISTINCT actor.id) c FROM `githubarchive.year.2016` WHERE type='PullRequestEvent' GROUP BY 1,2 ) GROUP BY 1
备注:这个帖子中,作者主要使用了最新的 GHTorrent import on BigQuery,也许这些资料对读者也有用,GitHub Archive、GitHub repos on BigQuery、Stack Overflow on BigQuery。
原文地址:The top weekend programming languages — based on GitHub’s activity
40: https://medium.com/google-cloud/github-on-bigquery-analyze-all-the-code-b3576fd2b150#.4wpjnqty9http://ghtorrent.org/gcloud.html