Upgrade to Pro — share decks privately, control downloads, hide ads and more …

rubocop-daemon 裏話: OSS の苦悩

Hayato Kawai
March 07, 2024
380

rubocop-daemon 裏話: OSS の苦悩

「Omotesando.rb #95」で発表した LT スライドです。
https://omotesandorb.connpass.com/event/311351/

Hayato Kawai

March 07, 2024
Tweet

Transcript

  1. (再掲) rubocop-daemon の高速化アプローチは単純 • require 'rubocop' したプロセスを サーバーとして用意 (デーモン化) ◦

    このサーバーにリクエストする ◦ アプリケーションサーバーを起動し続け、リクエストを待ち受けて処理するのと同じ rubocop-daemon (server) $ rubocop-daemon exec … ターミナル $ rubocop-daemon exec …
  2. rubocop-daemon は自然流入で伸びた • 特に宣伝をせず、自然に認知されていった ◦ gem 作ったよ〜とツイートしたくらい ◦ 勝手に伸びたのは、ユーザーが本当に求めていたものだったから ?

    (推測) • @bbatsov (RuboCop 作者) のブログで取り上げられて 認知が一気に増えた ◦ "The Missing Ruby Code Formatter | Meta Redux" https://metaredux.com/posts/2019/03/30/the-missing-ruby-code-for matter.html
  3. OSS 面白い期 (〜2019 年) • バズって嬉しい! ◦ RuboCop の third-party

    gem として RuboCop に認知されるのは嬉しい
  4. OSS 面白い期 (〜2019 年) • issue や PR も盛んに来て楽しい! ◦

    ちゃんと使われていて嬉しい! ◦ issue/PR に対応して感謝されると嬉しい!
  5. OSS つらくなってきた期 (2019 年〜): 英語がつらい • 英語がつらい ◦ 議論できるほどの英語力がない ▪

    当時は ChatGPT もなかった… ▪ 今なら ChatGPT でやり取りはできるので楽になっていそう ◦ 語彙や文法に誤りがないか調べながら書くのは時間がかかる ▪ 普段の業務では、英語を読むことはあっても書くことはない ▪ 1 コメント書くのに 1 時間くらいかかる… ◦ 認知されるにつれて issue/PR も多くなる ▪ 時間がめちゃくちゃかかる
  6. OSS つらくなってきた期 (2019 年〜): rubocop-daemon-wrapper • rubocop-daemon サーバーに通信するための クライアントは rubocop-daemon

    実装が遅い ◦ サーバーは TCP/IP で実装されているので、nc コマンド (netcat) で実装できる • nc コマンドを手で叩きたくない => wrapper を用意 ◦ rubocop-daemon-wrapper というシェルスクリプトを用意 ◦ ついでに rubocop コマンドとして振る舞えるようなインターフェースに ▪ エディタ等からも利用しやすくする
  7. OSS つらくなってきた期 (2019 年〜): rubocop-daemon-wrapper • rubocop-daemon サーバーに通信するための クライアントは rubocop-daemon

    実装が遅い ◦ サーバーは TCP/IP で実装されているので、nc コマンド (netcat) で実装できる • nc コマンドを手で叩きたくない => wrapper を用意 ◦ rubocop-daemon-wrapper というシェルスクリプトを用意 ◦ ついでに rubocop コマンドとして振る舞えるようなインターフェースに ▪ エディタ等からも利用しやすくする
  8. シェルスクリプトの特に nc コマンドがつらい • 分岐はつらい ◦ 差異を吸収するための分岐が大量に発生 • テストも難しい ◦

    手元に OS があるわけではない ▪ Docker でやるという手もあるが、再現できているのか分からない • すべての OS を網羅するのは現実的ではない ◦ 自分が使う OS ではないのでモチベーションが高くない ▪ ニッチなものだと特に …
  9. OSS つらくなってきた期 (2019 年〜): セットアップガイドが大変 • rubocop-daemon はエディタから使われがち ◦ 高速化の目的がコーディング中のフィードバックを速くしたいため

    • ユーザーとしてはセットアップガイドがあってほしい ◦ 最初に「導入したいけどどうやって導入すればいいんだろう ?」となる
  10. OSS つらくなってきた期 (2019 年〜): セットアップガイドが大変 • エディタから rubocop-daemon を実行したい ◦

    エディタ本体には rubocop-daemon クライアントは実装されていない ◦ つまりエディタのプラグインを作る or 設定する必要がある ▪ 作るのは大変なので rubocop-daemon-wrapper の出番
  11. OSS つらくなってきた期 (2019 年〜): セットアップガイドが大変 • エディタはたくさんある ◦ Vim (Neovim),

    VSCode, JetBrains IDE, … • エディタのプラグインもたくさんある ◦ VSCode だと RuboCop を実行するプラグインは複数ある ▪ vscode-ruby-rubocop, vscode-ruby, …
  12. OSS つらくなってきた期 (2019 年〜): セットアップガイドが大変 • エディタの数 × プラグインの数だけ セットアップガイドが生まれる

    ◦ ただし、自分が使っているエディタとプラグインはそれぞれ 1 つずつ ◦ 自分が使っていないエディタ・プラグインのガイドを メンテナンスする必要がある
  13. PR は全部 merge したいが難しい • せっかく PR 作ってくれたのだし merge したい

    ◦ レビューどうする? ▪ 英語つらい問題 ▪ merge して気になったところは自分で修正してしまうという手もある • ただし merge のたびに修正するのも自分が大変 …
  14. PR は全部 merge したいが難しい • merge すると自分がメンテナンスの責務を負うことに なる ◦ merge

    したものに対してさらに別の PR が来ることもある ◦ これは誰がレビューする? 自分しかない ▪ つまり分かってないといけない • 使ってない OS、エディタ、プラグインは … • merge しないのが一番簡単ではある ◦ でも善意を無下にしたくない
  15. 結果としてメンテナンスせずに放置してしまうことに • これらの苦悩があり、issue/PR を放置してしまった ◦ ごめんなさい 🙇 ◦ OSS owner

    を移譲する or commiter を増やすという手もあった ▪ が見知らぬ人に権限を渡して大丈夫なのか ? という心配が勝った
  16. rubocop-daemon は archive します • RuboCop 本体に取り込まれたことで、 多くのケースで RuboCop 単体で十分になった

    ◦ rubocop-daemon は役目を果たした • リポジトリは archive します (近いうちに)