Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 は面白いが大変なこともある