Slide 1

Slide 1 text

rubocop-daemon 裏話 OSS の苦悩 Omotesando.rb #95 2024-03-07 - Hayato Kawai (@fohte)

Slide 2

Slide 2 text

あなた誰 名前: @fohte (ふぉーて) 川井 颯人 (Hayato Kawai) 所属: ウォンテッドリー株式会社 趣味: 🎮 🎹

Slide 3

Slide 3 text

持ち帰ってほしいこと ● 世の中の OSS owner はすごい ○ OSS は面白いが大変なこともある

Slide 4

Slide 4 text

話すこと ● rubocop-daemon gem を作りました ● そこで感じた OSS 特有の苦悩を話します

Slide 5

Slide 5 text

中身の話は昨日の LT でしました https://speakerdeck.com/fohte/rubocop-server-mode-noshi-zu-mi

Slide 6

Slide 6 text

rubocop-daemon gem を作りました (2018 年) (再掲)

Slide 7

Slide 7 text

RuboCop 本体に 取り込まれました 🎉 (2022 年) https://github.com/ruboco p/rubocop/pull/10706 Big Thanks to @koic (再掲)

Slide 8

Slide 8 text

(再掲) rubocop-daemon の高速化アプローチは単純 ● require 'rubocop' したプロセスを サーバーとして用意 (デーモン化) ○ このサーバーにリクエストする ○ アプリケーションサーバーを起動し続け、リクエストを待ち受けて処理するのと同じ rubocop-daemon (server) $ rubocop-daemon exec … ターミナル $ rubocop-daemon exec …

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

ブログで紹介され バズっている様子

Slide 12

Slide 12 text

OSS 面白い期

Slide 13

Slide 13 text

OSS 面白い期 (〜2019 年) ● バズって嬉しい! ○ RuboCop の third-party gem として RuboCop に認知されるのは嬉しい

Slide 14

Slide 14 text

OSS 面白い期 (〜2019 年) ● issue や PR も盛んに来て楽しい! ○ ちゃんと使われていて嬉しい! ○ issue/PR に対応して感謝されると嬉しい!

Slide 15

Slide 15 text

OSS つらくなってきた期

Slide 16

Slide 16 text

OSS つらいポイントまとめ ● 英語がつらい ● スパゲッティと化した rubocop-daemon-wrapper ● セットアップガイドが大変 ● issue/PR 対応が大変

Slide 17

Slide 17 text

😇 英語がつらい 😇

Slide 18

Slide 18 text

OSS つらくなってきた期 (2019 年〜): 英語がつらい ● 英語がつらい ○ 議論できるほどの英語力がない ■ 当時は ChatGPT もなかった… ■ 今なら ChatGPT でやり取りはできるので楽になっていそう ○ 語彙や文法に誤りがないか調べながら書くのは時間がかかる ■ 普段の業務では、英語を読むことはあっても書くことはない ■ 1 コメント書くのに 1 時間くらいかかる… ○ 認知されるにつれて issue/PR も多くなる ■ 時間がめちゃくちゃかかる

Slide 19

Slide 19 text

スパゲッティと化した rubocop-daemon-wrapper

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

🔥 シェルスクリプト 🔥

Slide 23

Slide 23 text

シェルスクリプトはつらい ● nc コマンドが OS によって 若干違う ○ 条件分岐の嵐

Slide 24

Slide 24 text

シェルスクリプトの特に nc コマンドがつらい ● 分岐はつらい ○ 差異を吸収するための分岐が大量に発生 ● テストも難しい ○ 手元に OS があるわけではない ■ Docker でやるという手もあるが、再現できているのか分からない ● すべての OS を網羅するのは現実的ではない ○ 自分が使う OS ではないのでモチベーションが高くない ■ ニッチなものだと特に …

Slide 25

Slide 25 text

😇 セットアップガイドが大変 😇

Slide 26

Slide 26 text

OSS つらくなってきた期 (2019 年〜): セットアップガイドが大変 ● rubocop-daemon はエディタから使われがち ○ 高速化の目的がコーディング中のフィードバックを速くしたいため ● ユーザーとしてはセットアップガイドがあってほしい ○ 最初に「導入したいけどどうやって導入すればいいんだろう ?」となる

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

OSS つらくなってきた期 (2019 年〜): セットアップガイドが大変 ● エディタはたくさんある ○ Vim (Neovim), VSCode, JetBrains IDE, … ● エディタのプラグインもたくさんある ○ VSCode だと RuboCop を実行するプラグインは複数ある ■ vscode-ruby-rubocop, vscode-ruby, …

Slide 29

Slide 29 text

OSS つらくなってきた期 (2019 年〜): セットアップガイドが大変 ● エディタの数 × プラグインの数だけ セットアップガイドが生まれる ○ ただし、自分が使っているエディタとプラグインはそれぞれ 1 つずつ ○ 自分が使っていないエディタ・プラグインのガイドを メンテナンスする必要がある

Slide 30

Slide 30 text

😇 Issue/PR 対応が大変 😇

Slide 31

Slide 31 text

OSS つらくなってきた期 (2019 年〜): issue/PR に対応するのは大変 ● せっかく立ててくれた issue/PR は対応したい ○ ただし英語が… ○ PR の場合はより考えることが多い

Slide 32

Slide 32 text

PR は全部 merge したいが難しい ● せっかく PR 作ってくれたのだし merge したい ○ レビューどうする? ■ 英語つらい問題 ■ merge して気になったところは自分で修正してしまうという手もある ● ただし merge のたびに修正するのも自分が大変 …

Slide 33

Slide 33 text

PR は全部 merge したいが難しい ● merge すると自分がメンテナンスの責務を負うことに なる ○ merge したものに対してさらに別の PR が来ることもある ○ これは誰がレビューする? 自分しかない ■ つまり分かってないといけない ● 使ってない OS、エディタ、プラグインは … ● merge しないのが一番簡単ではある ○ でも善意を無下にしたくない

Slide 34

Slide 34 text

仕事以外の時間でこれをやるのは大変 ● 前提として、コード書くのは楽しいし、 他の人に使ってもらえることもとても嬉しい ○ ただし前述のことには時間も MP も使う ○ しかもそれを仕事以外の時間でやる ■ 🤯

Slide 35

Slide 35 text

結果としてメンテナンスせずに放置してしまうことに ● これらの苦悩があり、issue/PR を放置してしまった ○ ごめんなさい 🙇 ○ OSS owner を移譲する or commiter を増やすという手もあった ■ が見知らぬ人に権限を渡して大丈夫なのか ? という心配が勝った

Slide 36

Slide 36 text

rubocop-daemon は archive します ● RuboCop 本体に取り込まれたことで、 多くのケースで RuboCop 単体で十分になった ○ rubocop-daemon は役目を果たした ● リポジトリは archive します (近いうちに)

Slide 37

Slide 37 text

OSS は素晴らしい ● OSS は素晴らしい文化 ○ 利用するソフトウェアの中身が自由に見れ、変更し、あわよくば利用者の変更が 本体に取り込まれる。これは OSS のとても大きな魅力 ● 一方で OSS owner として苦悩を感じることもある ○ ユーザーとしてはリスペクトの心を忘れずにいたい (自戒)

Slide 38

Slide 38 text

(再掲) 持ち帰ってほしいこと ● 世の中の OSS owner はすごい ○ OSS は面白いが大変なこともある