通过Stack Overflow分析编程语言大势

jopen 10年前

Stack Overflow 是世界各地开发者交流技术的地方,不但有各路高手回答问题分享经验,而且还提供对所有帖子的检索,绝对是一个知识宝库。每每看到别人动辄几万而我刚刚过千 的声望,总希望投资一个有潜力的编程语言方便混分。心动不如行动,让我们借助 Power BI 分析一下。

        思路很简单,只要对 Stack Overflow 帖子进行统计,一定能够找到一些端倪,能够让我们一窥编程的大势走向。比如,Stack Overflow 本身是基于 C# 以及 SQL Server 开发运营的,这点让许多 Java 粉丝扼腕。那么到底是 C# 还是 Java 在 Stack Overflow 上更火爆呢?好在 Stack Overflow 允许用户对帖子上打的标签,我们只需要累加一下即可。

        首先建立数据模型。在这里可 以下载到 Stack Overflow 往年的帖子,解压缩之后是一个 26GB 的 xml 文件。这个文件是由过往所有的帖子组成,每个帖子还有具体的时间、标题、标签、正文、评论等等。可惜 Power Query 不能很好地以流模式处理这个 xml 文件,直接导入将会导致内存不够的异常,囧。

        为今之计,只有通过代码简化这个 xml 了:

  1. 我们关心的只是时间和标签之间的关联,其他信息完全可以跳过。
  2. 由于时间和标签有相当的重复,对时间和标签进行范式化便可以大大节约空间。简而言之,就是用字典对时间和标签建立序列号到字符串的映射,时间和标签的关系是建立在序列号之上的。

        很快就可以用 C# 实现以上需求,源代码可以在 https://github.com/qisamuelzhang/soanalytics 找到。第一次写 C# 代码,特此感谢 Ben 同学的代码审阅。

        程序将会生成三个文件:Tags 是标签字典,Times 是时间字典,而 Posts 是标签序列号到时间序列号的映射,三个文件合起来不过 192MB,对于 Power BI 就是小菜一碟。分别导入这三个文件,建立数据模型如下:

通过Stack Overflow分析编程语言大势

        现在可以显示结果了!从 2008 年至今,C#以微弱优势力压 Java 成为状元,相关的 ASP .Net、.Net 以及 SQL Server 分列 12、16 以及 21 位。看样子 C# 在企业软件开发领域仍然举足轻重。榜眼 Java 实力不俗,不过只有相关的 Android 进入前 20,貌似大家都拿 Java 搞 Android 了?探花是这几年高调奢华的 JavaScript,相关的 jQuery、HTML、CSS、Ajax 分列6、9、13、22,潜力巨大。移动设备开发方面,Android、iOS、iPhone、Objective C 分5、11、15、17 位。其他上榜的还有 PHP、Python 以及 Ruby 和 RoR,轻量级的网络应用开发语言。总体而言,网络应用以及移动开发是 Stack Overflow 帖子的核心,Cloud First Mobile First 的口号与大势还是很契合的,我软威武!

通过Stack Overflow分析编程语言大势

        下图统计了发帖的时间,可以看出这几年 Stack Overflow 的发展还是比较迅猛的。同时,开发者们都是相当勤奋的,每年只有圣诞节前后有个巨大的滑落稍事休息,其他时候都是生命不息编码不止:

通过Stack Overflow分析编程语言大势

        除了简单的趋势,我们还可以通过 Power Pivot 的 measure 功能对比标签个数。比如可以定义 Java 标签个数如下:

Count of Java:=COUNTROWS(FILTER(Posts, RELATED(Tags[Tag])="java"))

        这样我们可以进行 Java 与 C# 对比,如下。虽然 C# 总数仍然占优,但是 Java 在这几年反超了 C# 而且优势在继续扩大。当然,其中的主要原因之一还是 Android 的火爆:

通过Stack Overflow分析编程语言大势

        iOS 与 Android 相比总量还是有差距,不过涨势相当(咦,Windows Phone 去哪儿了):

通过Stack Overflow分析编程语言大势

        最后看一下 Hadoop。虽然总数不高,但是涨幅迅猛,绝对是潜力股:

通过Stack Overflow分析编程语言大势

        你决定好了如何投资了吗?

        Excel 文件可以从这里下载。

来自: qizh.me