BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

周末的时间,我们在GitHub用什么语言编程?

| 作者 Felipe Hoffa 关注 0 他的粉丝 ,译者 麦克周 关注 22 他的粉丝 发布于 2017年4月5日. 估计阅读时间: 19 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

村上春树(日本后现代主义作家)有一本书,《当我跑步时,我谈些什么》,Felipe这篇文章的统计数据和这本书有点类似,周末的时间我们会使用什么语言进行编程,看了他的文章,我们会知道在办公室里使用的语言,不过是谋生工具而已,私底下大家并不喜欢它们。

下面这张表格的内容是2016年度排名前20位的周末编程语言,根据GitHub(全球领先的软件开发平台)、GHTorrent(监控着GitHub上的每一次更改,并将每一次更改的更新内容,以JSON字符串形式存储在MongoDB数据库)、BigQuery(谷歌的数据仓库)等三个平台数据作为分析数据源。

从上面这张表格我们可以看到,排名前二十位的分别是:

  1. Rust
  2. Glsl(以C语言为基础的高阶着色语言,它是由OpenGL ARB建立)
  3. D(类似于C语法的静态类型编程语言)
  4. Haskell(函数型编程语言)
  5. Common Lisp(Lisp语言的分支)
  6. Kicad(开源的电路自动设计语言)
  7. Emacs Lisp(Lisp语言的分支)
  8. Lua(轻量级的可扩展脚本语言)
  9. Scheme(函数式编程语言,是Lisp的两种主要方言之一,另一种为Common Lisp)
  10. Julia(针对数值计算的高性能动态编程语言)
  11. Elm(编译为JavaScript的函数型语言)
  12. Eagle
  13. Racket(LISP家族中的一员)
  14. Dart(分布式编程语言,谷歌的很多应用程序都依赖于这个语言)
  15. Nsis(全称Nullsoft Scriptable Install System)
  16. Clojure(Lisp语言的一种,可以运行在Java虚拟机上)
  17. Kotlin(针对JVM、安卓和浏览器设计的一种静态类型语言)
  18. Elixir(运行在Erlang VM,低延时语言)
  19. F#(微软发展的为.NET语言提供运行环境的程序设计语言,属于函数型语言)
  20. 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 ArchiveGitHub repos on BigQueryStack 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


感谢丁晓昀对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT