GitHubのorganizationのリポジトリの言語比率を取得する

GitHubのorganizationのリポジトリの言語比率情報を知りたい

ここでいう言語比率情報とは次のようなものです。

たとえば次のような状況のとき、前者はRuby: 2、後者はRuby: 0.5, JavaScript: 0.4, CSS: 0.1となります。

知りたい理由

  • 働いている会社のGitHubリポジトリでどの言語が多く使われているのか知りたい
    • 新しい部署で新しい言語を学ばなければいけない状況で、どのくらいその言語理解に時間を費やしてよいのか悩んでいる
    • 今後の技術選定に活かしたい
      • ころころ所属部署が変わる組織の場合、学習コストの負担が大きい。個人的には時間だけでなくメンタルもやられると思っている
        • Ruby楽しい」「PHP楽しい〜」「Symfony楽しくなってきたぞ〜」「理解を深めたいぜ」っていうときに新たな言語習得を"やらなきゃいけない"っていうのがつらい
        • 会社内であまり使われていない言語だとほかに頼る人がおらず、メンテナンスしにくい状態のコードになってしまいそうな気がして不安である

パワプロでいうと、オールE・Dのような選手になりたいのではなく、どれかのスキルはA・Bになりたいと思っています。
自分がスーパーマンじゃないことは自覚しているので、広く薄い理解に時間をかけることが自信につながらない、無駄な時間に感じるんだろうなと思っています。

実装

https://github.com/mfham/github_repos_analysis

試しに"github"に対して実行した結果は次のようになりました。

// 主要言語とリポジトリ数
// 実装のREADME.md要参照
{"Ruby"=>98, "JavaScript"=>70, "Go"=>25, "TypeScript"=>22, "C"=>16, "Shell"=>16, "HTML"=>13, "Objective-C"=>10, "Python"=>8, "Java"=>7, "C#"=>7, "CSS"=>6, "CoffeeScript"=>6, "Puppet"=>4, "CodeQL"=>3, "C++"=>3, "Swift"=>3, "Jupyter Notebook"=>2, "Haskell"=>2, "Scala"=>1, "Rich Text Format"=>1, "Handlebars"=>1, "PowerShell"=>1, "Clojure"=>1}

// 言語とバイトコード比率
// https://github.com/github/linguist要参照
{"Ruby"=>28.86, "JavaScript"=>19.63, "TypeScript"=>8.54, "Go"=>7.2, "Shell"=>5.09, "C"=>4.25, "HTML"=>4.08, "Objective-C"=>3.27, "Python"=>2.73, "Java"=>2.18, "CSS"=>2.1, "C#"=>2.08, "CoffeeScript"=>1.97, "Puppet"=>1.29, "C++"=>0.99, "CodeQL"=>0.92, "Swift"=>0.66, "Haskell"=>0.62, "Jupyter Notebook"=>0.48, "SCSS"=>0.35, "PowerShell"=>0.32, "Handlebars"=>0.31, "Rich Text Format"=>0.31, "Scala"=>0.3, "Makefile"=>0.24, "Dockerfile"=>0.23, "Clojure"=>0.17, "Gherkin"=>0.13, "Perl"=>0.12, "Inno Setup"=>0.11, "Vim script"=>0.08, "TeX"=>0.06, "Protocol Buffer"=>0.04, "Tcl"=>0.03, "Lua"=>0.03, "M4"=>0.02, "Groovy"=>0.02, "Batchfile"=>0.02, "Liquid"=>0.02, "Awk"=>0.01, "Yacc"=>0.01, "Common Lisp"=>0.01, "Objective-C++"=>0.01, "Smalltalk"=>0.01, "Prolog"=>0.01, "CMake"=>0.01, "Augeas"=>0.0, "Thrift"=>0.0, "UnrealScript"=>0.0, "ApacheConf"=>0.0, "Scilab"=>0.0, "Assembly"=>0.0, "Ragel in Ruby Host"=>0.0, "XS"=>0.0, "PHP"=>0.0, "Scheme"=>0.0, "Pascal"=>0.0, "Visual Basic"=>0.0, "ANTLR"=>0.0, "Logos"=>0.0, "Bison"=>0.0, "Erlang"=>0.0, "SystemVerilog"=>0.0, "Emacs Lisp"=>0.0, "Mathematica"=>0.0, "XSLT"=>0.0, "Perl 6"=>0.0, "SQLPL"=>0.0, "PLSQL"=>0.0, "Smarty"=>0.0, "RPC"=>0.0, "Jsonnet"=>0.0, "ASP.NET"=>0.0, "Lex"=>0.0, "RAML"=>0.0, "Vue"=>0.0, "F#"=>0.0, "Meson"=>0.0, "Raku"=>0.0, "Starlark"=>0.0, "Haml"=>0.0, "Slim"=>0.0, "HCL"=>0.0, "R"=>0.0, "Dart"=>0.0, "Mako"=>0.0, "sed"=>0.0, "Ragel"=>0.0, "GDB"=>0.0, "Kotlin"=>0.0, "AspectJ"=>0.0, "Roff"=>0.0, "DTrace"=>0.0, "Racket"=>0.0, "TSQL"=>0.0}

リファクタとRSpec実装は時間を見つけてやります。
実装を見てもAPIの戻り値や変数の中身がわからないので、こういうときにRSpecファイルが存在すると理解しやすいんだろうなと思いました。

最後に

APIのドキュメントやRubyライブラリの調査含めて、このボリュームで実装1人日くらいでした。
これが今の自分です。
実装しているときはとてもワクワクしていました。
おそらく自分がやりたいと思っていたことがやれているからだと思っています。
ちなみに実装ではちゃっかりRuby 3.0.0を使っています。