僕は最近、膨大な量のソフトウェア開発が行われているGitHubのようなサイトにハマっています。
このデータを扱う最初のプロジェクトとして、GitHub上で各プログラミング言語を使用する人の数を数えて、すべての言語を順位付けすると面白いんじゃないかと思いました。
この分析のためのデータソースとして、GitHub ArchiveとGHTorrent projectを使用しています。GitHub Archiveは、2011年初めからGitHub上のすべてのパブリックイベントの記録を提供しています。これには、新しいコードをプッシュすること、リポジトリをフォークすること、リポジトリにスターを付けること、GitHubでイシュー(Issue)を作成することといったイベントが含まれています。全体として、GitHub Archiveは7,500万以上の異なるリポジトリで12億5千万以上のイベントを有しています。GHTorrentはさらに進んでいて、イベントごとにGitHub APIを収集しています。これにより、ほとんどのリポジトリの言語を突き止めることができます。
GHTorrentの素晴らしいところは、それぞれのイベントに関連付けられたユーザー名があることです。つまり、どれくらいの人が各言語を使用しているのかを数えることができるのです。ユーザーがリポジトリとやりとりするたびに、僕はそのリポジトリの言語を使用しているユーザーを数えています。そして毎月この数字を集計して、各言語の月間アクティブユーザー(MAU)数を計算しています。
7年前のデータまで遡れるので、各プログラミング言語の人気が時間の経過とともにどのように変わってきたかをプロットして、興味深いパターンを明らかにすることもできます。これらのトレンドラインを見ると、どのプログラミング言語に学習する価値があり、どのプログラミング言語を避けるべきなのかがわかります。
この記事のすべてのコードはGitHub上にアップされています。僕は、毎月この分析を行うことで、順位を最新の状態に保つ予定です。また、各リポジトリがどのプログラミング言語で書かれているかを突き止める方法についての詳細な説明文もメモとして載せています。やってみてわかったのですが、これが全体のプロジェクトの中で最も大変な作業でした。
リポジトリには各言語の全体的な順位がありますが、わざわざリンクをクリックするのは面倒くさいと思うのでここにも載せておきます。
全体的な順位はかなり興味深いですし、これらの言語が時間の経過とともにどの程度使用されてきたかを詳しく見てみるのも非常に面白いです。
主要な言語
主要なプログラミング言語を使用している人数は比較的安定しており、またそれは多くの人が予期していたことでしょう。
JavaScript、Python、Java、C ++、Cは、7年以上にわたる追跡データを見てみてもずっと人気を博しており、今後すぐに使用率が変わるとは思いません。
Javascriptは、GitHubで使用されている言語の中で首位を獲得し続けています。Javascriptは、基本的にすべてのプログラマーがどこかの段階で使用する必要のある言語の一つなので、この結果は腑に落ちると思います。
Pythonは成長を続けており、最近Javaを追い抜いてGitHubで2番目に人気の高い言語になりました。Pythonの人気の高まりは、機械学習に対する関心の高まりに依るところが大きいでしょう。ただ、実際には、Pythonの全体的な人気を過小評価しているかもしれません(理由は後述)。
またC ++もCを追い抜いているようです。GCC(GNUコンパイラコレクション)のようなプロジェクトでさえ、C ++の一部の機能にアクセスするためにCからC ++に変換されているため、この結果は納得できます。C ++は主にCの上位セットであるため、GCCのチームは、C ++の限定されたサブセットを使用すると、よりクリーンなコードを書くことができることを発見しました。
2018年に学習すべき言語
このようにプログラミング言語のトレンドを調べて最も役に立つことは、急速に拡大するユーザーベースを持つ有望な言語を特定できることです。
最も急速に成長しているユーザーベースを持つ言語は、Go、TypeScript、Kotlin、Rustです。
この分析に基づき、僕はここ数週間でGoとTypescriptを学習しました。僕はこの記事のほとんどのコードをGoで書いており、TypeScriptを使った生成的なアートプロジェクトにも取り組んできました。どちらの言語もニッチで素晴らしいです。Goは、サーバーサイドの並行プログラムを書くのに最適ですし、TypeScriptを数週間使用した今では、JavaScriptを使用したいと思うことは二度とないかもしれません。
Kotlinは、主にAndroidアプリの開発に使用されているようです。Googleが2017年初めにAndroid開発のためのファーストクラス言語としてKotlinを公式サポートすることを発表したときからグラフの傾きが変わったことがわかるかと思います。この言語に興味をそそられるので、僕はJVM(Java仮想マシン)上で作業しなければならない次のプロジェクトに向けてKotlinを使用することを検討しています。
Rustは、このグラフに載っている他の言語よりも成長のスピードが遅いですが、Rustで書かれた素晴らしいプロジェクトが多く存在します。ここ数週間で、僕は、両方ともRustで書かれたRuby用の新しいサンプリング型プロファイラと、新しい自動微分フレームワークを見てきました。Rustは数え切れないほどの興味深いプロジェクトで使用されています。
これらの言語に共通している興味深い点は、そのすべてが大企業の後援を受けていることです。GoogleがGoを、MicrosoftがTypeScriptを、JetBrainsがKotlinを、MozillaがRustを開発しています。新しいプログラミング言語の立ち上げを成功させるには、かなりの労力が必要です。エレガントな言語を開発するだけでは不十分で、言語の背後にあるコミュニティとエコシステム(収益構造)を成長させなければなりません。共通タスク、ツール、ドキュメントのためのIDE(統合開発環境)サポート、ライブラリ、パッケージといったものは、その言語を人々に使用してもらう上で非常に重要であり、これにはかなりの労力が必要です。
おそらく避けるべき言語
この基準に基づいて、人気が衰えている言語を見ても面白いです。
Ruby、PHP、Objective-C、CoffeeScript、Perlは、過去7年間でGitHubのユーザーの割合が大幅に減少しています。この結果を見ると、僕は新しいプロジェクトにこれらの言語を使用するのを若干躊躇します。
7年間で最も急激に減少しているのは、Rubyのユーザー数です。2011年には18%以上のユーザーが使用しており、2番目に人気の言語でしたが、現在は3.2%のユーザーしか使っておらず、人気も11番目に後退しました。これはショッキングな減少ですが、これらの統計が示しているのはGitHubユーザーベースの割合であり、GitHubが急速に成長しているため割合の減少も大きいということは指摘に値します。
パブリックタイムラインに表示されるGitHubのユーザーの総数は、過去7年間で爆発的に増加しました。
過去7年間で増加したGitHubのユーザー数は、なんと20倍以上です!2018年のとある日にGitHubを使用するユーザー数は、2011年のどの月のユーザー数よりも多いです。
これは、市場シェアが低下している言語であっても、ユーザーベースは依然として拡大している可能性があることを意味します。以下は、アクティブユーザー数で正規化しない場合のこれらの言語のデータです。
このような視点で見ると、Rubyを使用しているアクティブユーザーの数自体は、2011年と比べて3倍以上になっています。この分析では、Rubyは他の言語ほど成長率が高くなく、あまり人気が伸びていないだけであることがわかります。
他にもいくつかの要因があります。
第一に、GitHubが成長するにつれて、GitHubが自然とメインストリームになったということです。GitHubを開設したのはRubyコミュニティの有名なメンバーたちであり、そのコードの多くはRubyで書かれています。これにより、彼らは初期の段階で多数のRubyプログラマーを引き付けており、そのためRubyが大きな比率を占めていました。GitHubがユーザーベースを拡大するにつれて、他の言語のプログラマーも自然とGitHubを使うようになりました。このことは、Javaユーザーの数が2011年から2014年にかけてGitHub上でどのように増加したかでわかります。僕の考えでは、Javaがその後あまり伸びていないのは、JavaプログラマーがGitHubを使い始めるスピードほど、Javaの人気が高まらなかったからではないかと思います。
第二の留意点は、特定の新しい言語が、古い言語のユーザーシェアのカニバリゼーション(ある商品の売り上げがそれと類似した商品の売り上げを奪ってしまう現象)を起こしているということです。例えば、Objective-Cのユーザーの減少は、Swiftの台頭によるものです。またCoffeeScriptは、TypeScriptに取って代わられているようです。
Objective-Cは減少していますが、全体的なiOS開発向けの言語(Swift)は比較的安定しているようです。同様に、CoffeeScriptは、JavaScriptにトランスパイルする(ある言語で書かれたコードを元に別の言語のコードを生成すること)という考え方をプログラマーに浸透させたという意味で、TypeScriptのための道を開いたように思えます。
科学的言語
実は、調査結果には急速に成長している「言語」がもう一つ含まれていたのですが、意図的に外していました。
Jupyter Notebookは、ここ数年で著しくかつ着実に成長してきました。しかし、これは主に、データサイエンスを行うためのPythonの成長が原因であると考えられます。JupyterはPythonだけでなく他にも多くの言語をサポートしていますが、いずれの場合も、Jupyter NotebookはPythonで書かれていました。これは、この分析においてPythonの人気が潜在的に過小評価されたことを意味します。
またGitHubは、リポジトリに最も多くのバイトを持つ言語を調べて、リポジトリに言語を割り当てます。Jupyter Notebookには画像やその他のコード以外のものが含まれている可能性があるため、行数ではなくバイト数が最大のファイルはJupyter Notebookであることが多いです。これにより、いくつかのPythonリポジトリが、誤ってJupyter Notebookであるとラベル付けされることになってしまいました。
将来的には、この分析を実行するときにJuptyerとPythonの結果を統合するかもしれません。
関数型言語
最後に、GitHubで関数型言語がどのように使用されているかという興味深いデータを見てみます。
データが比較的小さい数字なので、順位には多くのノイズが含まれています。僕はまた、GitHubが時間の経過とともにメインストリームになったため、ClojureやHaskellのような言語が明らかに減少しているという理屈には納得していません。
それでも、Elixirは、上位25の言語にあと少しで入るので、注視し続ける価値があるように思えます。
その他のアプローチ
プログラミング言語の人気を時間の経過とともに追跡するには、他にも様々なアプローチがあります。以下の人気のあるアプローチをすぐに試してみようと思っています。
- プログラミング言語名の検索エンジン結果の数によるTIOBE Indexのプログラミング言語の順位付け
- StackOverflowで使用されているタグを時間の経過とともにグラフ化したStackOverflow Trends
- その言語のプルリクエスト数によるGitHub Octoverseのプログラミング言語の順位付け(ただし、時間の経過に応じたトレンドは示されない)
- ある言語から別の言語への移行について書いているブログ記事の固有ベクトルを計算することによるErik Bernhardssonのプログラミング言語の順位付け
- GitHubで言語を移行している人たちを調査するためにsource{d}(ブログの名前)のチームが拡張したErik Bernhardssonのアプローチ
これはプログラミング言語の使用状況を追跡する初めての試みではありませんが、僕は、言語のやりとりを行ったユニークユーザーの数を追跡する自分のアプローチが好きです。何かが発生した生の回数をそのまま追跡すると、少数のユーザーが多くの活動をしているものに偏ってしまう可能性があります。例えば、GitHubには1日に何千回もコミットできるボットがあり、生のアクティビティ数を見ると結果が歪んでしまいます。しかし、これはイベントの代わりにユーザーを数えることで簡単に解決できます。
この記事のすべてのコードと全体的な順位はGitHubに掲載しています。僕は、データを最新の状態に保ち続けようと考えており、興味を持ってくれる人がいる限り毎月更新する予定です。
2018年1月25日に公開
CREDIT:原著者の許諾のもと翻訳・掲載しています。
[原文]Ranking Programming Languages by GitHub Users (Posted Jan 25, 2018) by Ben Frederickson