2017 年哪个公司对开源贡献最多?


在这篇分析报告中,我们将使用 2017 年度截止至当前时间(2017 年 10 月)为止,GitHub 上所有公开的推送事件的数据。对于每个 GitHub 用户,我们将尽可能地猜测其所属的公司。此外,我们仅查看那些今年得到了至少 20 个星标的仓库。以下是我的报告结果。



顶级云服务商的比较


2017 年它们在 GitHub 上的表现:

  • 微软看起来约有 1300 名员工积极地推送代码到 GitHub 上的 825 个顶级仓库。

  • 谷歌显示出约有 900 名员工在 GitHub 上活跃,他们推送代码到大约 1100 个顶级仓库。

  • 亚马逊似乎只有 134 名员工活跃在 GitHub 上,他们推送代码到仅仅 158 个顶级项目上。

  • 不是所有的项目都一样:在超过 25% 的仓库上谷歌员工要比微软员工贡献的多,而那些仓库得到了更多的星标(53 万对比 26 万)。亚马逊的仓库 2017 年合计才得到了 2.7 万个星标。



红帽、IBM、Pivotal、英特尔和 Facebook


根据这个排名来看,红帽、Pivotal 和英特尔在 GitHub 上做出了巨大贡献:

注意,下表中合并了所有的 IBM 地区域名。

Facebook 和 IBM(美)在 GitHub 上的活跃用户数同亚马逊差不多,但是它们所贡献的项目得到了更多的星标(特别是 Facebook):

接下来是阿里巴巴、Uber 和 Wix:

以及 GitHub 自己、Apache 和腾讯:

百度、苹果和 Mozilla:

甲骨文、斯坦福大学、麻省理工、Shopify、MongoDb、伯克利大学、VmWare、Netflix、Salesforce 和 Gsa.gov:

LinkedIn、Broad Institute、Palantir、雅虎、MapBox、Unity3d、Automattic(WordPress 的开发商)、Sandia、Travis-ci 和 Spotify:

Chromium、UMich、Zalando、Esri、IBM (英)、SAP、EPAM、Telerik、UK Cabinet Office 和 Stripe:

Cern、Odoo、Kitware、Suse、Yandex、IBM (加)、Adobe、AirBnB、Chef 和 The Guardian:

Arm、Macports、Docker、Nuxeo、NVidia、Yelp、Elastic、NYU、WSO2、Mesosphere 和 Inria:

Puppet、斯坦福(计算机科学)、DatadogHQ、Epfl、NTT Data 和 Lawrence Livermore Lab:



我是怎样将 GitHub 用户关联到其公司的


在 GitHub 上判定每个用户所属的公司并不容易,但是我们可以使用其推送事件的提交消息中展示的邮件地址域名来判断。

  • 同样的邮件地址可以出现在几个用户身上,所以我仅考虑那些对此期间获得了超过 20 个星标的项目进行推送的用户。

  • 我仅统计了在此期间推送超过 3 次的 GitHub 用户。

  • 用户推送代码到 GitHub 上可以在其推送中显示许多不同的邮件地址,这部分是由 GIt 工作机制决定的。为了判定每个用户的组织,我会查找那些在推送中出现更频繁的邮件地址。

  • 不是每个用户都在 GitHub 上使用其组织的邮件。有许多人使用 gmail.com、users.noreply.github.com 和其它邮件托管商的邮件地址。有时候这是为了保持匿名和保护其公司邮箱,但是如果我不能定位其公司域名,这些用户我就不会统计。抱歉。

  • 有时候员工会更换所任职的公司。我会将他们分配给其推送最多的公司。



我的查询语句


  1. #standardSQL

  2. WITH

  3. period AS (

  4.  SELECT *

  5.  FROM `githubarchive.month.2017*` a

  6. ),

  7. repo_stars AS (

  8.  SELECT repo.id, COUNT(DISTINCT actor.login) stars, APPROX_TOP_COUNT(repo.name, 1)[OFFSET(0)].value repo_name

  9.  FROM period

  10.  WHERE type='WatchEvent'

  11.  GROUP BY 1

  12.  HAVING stars>20

  13. ),

  14. pushers_guess_emails_and_top_projects AS (

  15.  SELECT *

  16.    # , REGEXP_EXTRACT(email, r'@(.*)') domain

  17.    , REGEXP_REPLACE(REGEXP_EXTRACT(email, r'@(.*)'), r'.*.ibm.com', 'ibm.com') domain

  18.  FROM (

  19.    SELECT actor.id

  20.      , APPROX_TOP_COUNT(actor.login,1)[OFFSET(0)].value login

  21.      , APPROX_TOP_COUNT(JSON_EXTRACT_SCALAR(payload, '$.commits[0].author.email'),1)[OFFSET(0)].value email

  22.      , COUNT(*) c

  23.      , ARRAY_AGG(DISTINCT TO_JSON_STRING(STRUCT(b.repo_name,stars))) repos

  24.    FROM period a

  25.    JOIN repo_stars b

  26.    ON a.repo.id=b.id

  27.    WHERE type='PushEvent'

  28.    GROUP BY  1

  29.    HAVING c>3

  30.  )

  31. )

  32. SELECT * FROM (

  33.  SELECT domain

  34.    , githubers

  35.    , (SELECT COUNT(DISTINCT repo) FROM UNNEST(repos) repo) repos_contributed_to

  36.    , ARRAY(

  37.        SELECT AS STRUCT JSON_EXTRACT_SCALAR(repo, '$.repo_name') repo_name

  38.        , CAST(JSON_EXTRACT_SCALAR(repo, '$.stars') AS INT64) stars

  39.        , COUNT(*) githubers_from_domain FROM UNNEST(repos) repo

  40.        GROUP BY 1, 2

  41.        HAVING githubers_from_domain>1

  42.        ORDER BY stars DESC LIMIT 3

  43.      ) top

  44.    , (SELECT SUM(CAST(JSON_EXTRACT_SCALAR(repo, '$.stars') AS INT64)) FROM (SELECT DISTINCT repo FROM UNNEST(repos) repo)) sum_stars_projects_contributed_to

  45.  FROM (

  46.    SELECT domain, COUNT(*) githubers, ARRAY_CONCAT_AGG(ARRAY(SELECT * FROM UNNEST(repos) repo)) repos

  47.    FROM pushers_guess_emails_and_top_projects

  48.    #WHERE domain IN UNNEST(SPLIT('google.com|microsoft.com|amazon.com', '|'))

  49.    WHERE domain NOT IN UNNEST(SPLIT('gmail.com|users.noreply.github.com|qq.com|hotmail.com|163.com|me.com|googlemail.com|outlook.com|yahoo.com|web.de|iki.fi|foxmail.com|yandex.ru', '|')) # email hosters

  50.    GROUP BY 1

  51.    HAVING githubers > 30

  52.  )

  53.  WHERE (SELECT MAX(githubers_from_domain) FROM (SELECT repo, COUNT(*) githubers_from_domain FROM UNNEST(repos) repo  GROUP BY repo))>4 # second filter email hosters

  54. )

  55. ORDER BY githubers DESC



有的公司有 1500 个仓库,为什么只统计了 200 个?有的仓库有 7000 个星标,为什么只显示 1500 个?


我进行了过滤。我只统计了 2017 年的星标。举个例子说,Apache 在 GitHub 上有超过 1500 个仓库,但是今年只有 205 个项目得到了超过 20 个星标。



这表明了开源的发展形势么?


注意,这个对 GitHub 的分析没有包括像 Android、Chromium、GNU、Mozilla 等顶级社区,也没有包括 Apache 基金会或 Eclipse 基金会,还有一些其它项目选择在 GitHub 之外开展起活动。



这对于我的组织不公平


我只能统计我所看到的数据。欢迎对我的统计的前提提出意见,以及对我的统计方法给出改进方法。如果有能用的查询语句就更好了。


举个例子,要看看当我合并了 IBM 的各个地区域名到其顶级域时排名发生了什么变化,可以用一条 SQL 语句解决:

SELECT *, REGEXP_REPLACE(REGEXP_EXTRACT(email, r'@(.*)'), r'.*.ibm.com', 'ibm.com') 
domain

当合并了其地区域名后, IBM 的相对位置明显上升了。



英文原文:https://medium.freecodecamp.org/the-top-contributors-to-github-2017-be98ab854e87


推荐阅读

我偷看了老板的微信分组,然后……

最骚气的APP更新文案盘点



小编喵喵个人微信号:itmiao520 懒人回复"喵喵"扫码添加。


点击左下角阅读原文查看更多长知识文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值