作者 麦克周
,译者村上春树(日本后现代主义作家)有一本书,《当我跑步时,我谈些什么》,Felipe这篇文章的统计数据和这本书有点类似,周末的时间我们会使用什么语言进行编程,看了他的文章,我们会知道在办公室里使用的语言,不过是谋生工具而已,私底下大家并不喜欢它们。
下面这张表格的内容是2016年度排名前20位的周末编程语言,根据GitHub(全球领先的软件开发平台)、GHTorrent(监控着GitHub上的每一次更改,并将每一次更改的更新内容,以JSON字符串形式存储在MongoDB数据库)、BigQuery(谷歌的数据仓库)等三个平台数据作为分析数据源。
从上面这张表格我们可以看到,排名前二十位的分别是:
- Rust
- Glsl(以C语言为基础的高阶着色语言,它是由OpenGL ARB建立)
- D(类似于C语法的静态类型编程语言)
- Haskell(函数型编程语言)
- Common Lisp(Lisp语言的分支)
- Kicad(开源的电路自动设计语言)
- Emacs Lisp(Lisp语言的分支)
- Lua(轻量级的可扩展脚本语言)
- Scheme(函数式编程语言,是Lisp的两种主要方言之一,另一种为Common Lisp)
- Julia(针对数值计算的高性能动态编程语言)
- Elm(编译为JavaScript的函数型语言)
- Eagle
- Racket(LISP家族中的一员)
- Dart(分布式编程语言,谷歌的很多应用程序都依赖于这个语言)
- Nsis(全称Nullsoft Scriptable Install System)
- Clojure(Lisp语言的一种,可以运行在Java虚拟机上)
- Kotlin(针对JVM、安卓和浏览器设计的一种静态类型语言)
- Elixir(运行在Erlang VM,低延时语言)
- F#(微软发展的为.NET语言提供运行环境的程序设计语言,属于函数型语言)
- Ocaml
这个排名很清晰地告诉我们,2016年属于Functional Languages(函数型语言),以及3D世界的脚本语言。另外学习Java的朋友可以发现,Java没有入选,但是很多函数型语言可以基于JVM运行,这给了我们一个提示,即未来JVM将会包容更多的语言,而不仅仅是Java语言本身。
再来看看后20位语言,你会发现很多我们日常谋生的语言都在这里呢,包括:
- Nginx(高性能的HTTP和反向代理服务器,也是IMAP/POP3/SMTP服务器)
- Matlab(美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境)
- Processing(具有革命前瞻性的新兴计算机语言,是Java语言的延伸,并支持许多现有的Java语言架构,不过在语法(syntax)上简易许多,并具有许多贴心及人性化的设计)
- Vue(前端开发库,通过简洁的 API 提供高效的数据绑定和灵活的组件系统)
- Fortran(世界上最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域)
- Visual Basic(这是我上大学时候最常用的语言,一种高级语言,具备可操作的GUI界面)
- Objective-C++(主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统)
- Plsql(是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL))
- Plpgsql
- Web Ontology Language(W3C推荐的语义互联网中本体描述语言的标准)
- Smarty(使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一)
- Groovy(基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码)
- Batchfile
- Objective-C
- Powershell(命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用.Net Framework的强大功能)
- Xslt(扩展样式表转换语言 的外语缩写,这是一种对XML(标准通用标记语言的子集)文档进行转化的语言,XSLT中的T代表英语中的“转换”(Transformation))
- Cucumber(能够理解用普通语言 描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用Ruby编写,支持Java和·Net等多种开发语言)
- Hcl
- Puppet(Linux、Unix、Windows平台的集中配置管理系统,使用自有的Puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等)
- Gcc Machine Description(GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等))。
让我们看看这些2016年流行的周末“Happy Hour”语言的变化趋势,如图所示:
我们解释一下上面这张图所表达的含义:
- Rust语言过去只在工作日使用,最近6年呈现爆发性增长,成为一门“周末”语言;
- 越是流行,越是会成为一门“周末”语言;
- Puppet语言周末大家用得很少,一直都很少;
- Ruby正在逐渐和日常工作脱离,转而进入编程爱好者的周末乐园;
- R语言看得出来前两年(2014、2015)很火,但是2016年又回归到了中等热度;
- Haskell、Clojure,谁让人工智能这么火呢,这两门语言自然在周末也得多练习;
- Arduino语言正在逐渐火起来;
- Python和C,这几年还是有很多开发人员在使用,保持着持续流行状态。
那么其他语言是如何按照流行程度排序的?请看下面这张图:
作者列举了一些来自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