2017年哪個公司對開源貢獻最多?讓我們用GitHub的數據分析下
在這篇分析報告中,我們將使用2017年度截止至當前時間(2017年10月)為止,GitHub上所有公開的推送事件的數據。對于每個GitHub用戶,我們將盡可能地猜測其所屬的公司。此外,我們僅查看那些今年得到了至少20個星標的倉庫。
以下是我的報告結果,你也可以在我的交互式 Data Studio 報告上進一步加工。
***云服務商的比較
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:
(LCTT 譯注:很高興看到國內的***互聯網公司阿里巴巴、騰訊和百度在這里排名前列!)
甲骨文、斯坦福大學、麻省理工、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 和其它郵件托管商的郵件地址。有時候這是為了保持匿名和保護其公司郵箱,但是如果我不能定位其公司域名,這些用戶我就不會統計。抱歉。
- 有時候員工會更換所任職的公司。我會將他們分配給其推送最多的公司。
我的查詢語句
- #standardSQL
- WITH
- period AS (
- SELECT *
- FROM `githubarchive.month.2017*` a
- ),
- repo_stars AS (
- SELECT repo.id, COUNT(DISTINCT actor.login) stars, APPROX_TOP_COUNT(repo.name, 1)[OFFSET(0)].value repo_name
- FROM period
- WHERE type='WatchEvent'
- GROUP BY 1
- HAVING stars>20
- ),
- pushers_guess_emails_and_top_projects AS (
- SELECT *
- # , REGEXP_EXTRACT(email, r'@(.*)') domain
- , REGEXP_REPLACE(REGEXP_EXTRACT(email, r'@(.*)'), r'.*.ibm.com', 'ibm.com') domain
- FROM (
- SELECT actor.id
- , APPROX_TOP_COUNT(actor.login,1)[OFFSET(0)].value login
- , APPROX_TOP_COUNT(JSON_EXTRACT_SCALAR(payload, '$.commits[0].author.email'),1)[OFFSET(0)].value email
- , COUNT(*) c
- , ARRAY_AGG(DISTINCT TO_JSON_STRING(STRUCT(b.repo_name,stars))) repos
- FROM period a
- JOIN repo_stars b
- ON a.repo.id=b.id
- WHERE type='PushEvent'
- GROUP BY 1
- HAVING c>3
- )
- )
- SELECT * FROM (
- SELECT domain
- , githubers
- , (SELECT COUNT(DISTINCT repo) FROM UNNEST(repos) repo) repos_contributed_to
- , ARRAY(
- SELECT AS STRUCT JSON_EXTRACT_SCALAR(repo, '$.repo_name') repo_name
- , CAST(JSON_EXTRACT_SCALAR(repo, '$.stars') AS INT64) stars
- , COUNT(*) githubers_from_domain FROM UNNEST(repos) repo
- GROUP BY 1, 2
- HAVING githubers_from_domain>1
- ORDER BY stars DESC LIMIT 3
- ) top
- , (SELECT SUM(CAST(JSON_EXTRACT_SCALAR(repo, '$.stars') AS INT64)) FROM (SELECT DISTINCT repo FROM UNNEST(repos) repo)) sum_stars_projects_contributed_to
- FROM (
- SELECT domain, COUNT(*) githubers, ARRAY_CONCAT_AGG(ARRAY(SELECT * FROM UNNEST(repos) repo)) repos
- FROM pushers_guess_emails_and_top_projects
- #WHERE domain IN UNNEST(SPLIT('google.com|microsoft.com|amazon.com', '|'))
- 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
- GROUP BY 1
- HAVING githubers > 30
- )
- 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
- )
- ORDER BY githubers DESC
FAQ
有的公司有 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 的相對位置明顯上升了。
回音
接下來
我以前犯過錯誤,而且以后也可能再次出錯。請查看所有的原始數據,并質疑我的前提假設——看看你能得到什么結論是很有趣的。
- 用一下交互式 Data Studio 報告
感謝 Ilya Grigorik 保留的 GitHub Archive 提供了這么多年的 GitHub 數據!