Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
rubocop-daemon 裏話: OSS の苦悩
Search
Hayato Kawai
March 07, 2024
2
560
rubocop-daemon 裏話: OSS の苦悩
「Omotesando.rb #95」で発表した LT スライドです。
https://omotesandorb.connpass.com/event/311351/
Hayato Kawai
March 07, 2024
Tweet
Share
More Decks by Hayato Kawai
See All by Hayato Kawai
巨大 tfstate に立ち向かう技術
fohte
1
250
RubyKaigi で LT 初登壇したきっかけと感想
fohte
1
850
Datadog Logs を活用して SLO 監視基盤を構築する
fohte
2
770
The Journey of rubocop-daemon into RuboCop
fohte
1
1k
Ruby as Shell script
fohte
1
470
RuboCop Server Mode の仕組み
fohte
1
270
Ruby を使ったプロダクト開発を支えるオブザーバビリティ基盤
fohte
2
130
インシデントコマンダーやってみた
fohte
5
1k
Ruby でもなんとかなる - ISUCON13 公式反省会
fohte
0
140
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Six Lessons from altMBA
skipperchong
27
3.5k
The Invisible Side of Design
smashingmag
297
50k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Code Reviewing Like a Champion
maltzj
520
39k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Navigating Team Friction
lara
183
14k
Imperfection Machines: The Place of Print at Facebook
scottboms
264
13k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Rails Girls Zürich Keynote
gr2m
94
13k
Transcript
rubocop-daemon 裏話 OSS の苦悩 Omotesando.rb #95 2024-03-07 - Hayato Kawai
(@fohte)
あなた誰 名前: @fohte (ふぉーて) 川井 颯人 (Hayato Kawai) 所属: ウォンテッドリー株式会社
趣味: 🎮 🎹
持ち帰ってほしいこと • 世の中の OSS owner はすごい ◦ OSS は面白いが大変なこともある
話すこと • rubocop-daemon gem を作りました • そこで感じた OSS 特有の苦悩を話します
中身の話は昨日の LT でしました https://speakerdeck.com/fohte/rubocop-server-mode-noshi-zu-mi
rubocop-daemon gem を作りました (2018 年) (再掲)
RuboCop 本体に 取り込まれました 🎉 (2022 年) https://github.com/ruboco p/rubocop/pull/10706 Big Thanks
to @koic (再掲)
(再掲) rubocop-daemon の高速化アプローチは単純 • require 'rubocop' したプロセスを サーバーとして用意 (デーモン化) ◦
このサーバーにリクエストする ◦ アプリケーションサーバーを起動し続け、リクエストを待ち受けて処理するのと同じ rubocop-daemon (server) $ rubocop-daemon exec … ターミナル $ rubocop-daemon exec …
None
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
ブログで紹介され バズっている様子
OSS 面白い期
OSS 面白い期 (〜2019 年) • バズって嬉しい! ◦ RuboCop の third-party
gem として RuboCop に認知されるのは嬉しい
OSS 面白い期 (〜2019 年) • issue や PR も盛んに来て楽しい! ◦
ちゃんと使われていて嬉しい! ◦ issue/PR に対応して感謝されると嬉しい!
OSS つらくなってきた期
OSS つらいポイントまとめ • 英語がつらい • スパゲッティと化した rubocop-daemon-wrapper • セットアップガイドが大変 •
issue/PR 対応が大変
😇 英語がつらい 😇
OSS つらくなってきた期 (2019 年〜): 英語がつらい • 英語がつらい ◦ 議論できるほどの英語力がない ▪
当時は ChatGPT もなかった… ▪ 今なら ChatGPT でやり取りはできるので楽になっていそう ◦ 語彙や文法に誤りがないか調べながら書くのは時間がかかる ▪ 普段の業務では、英語を読むことはあっても書くことはない ▪ 1 コメント書くのに 1 時間くらいかかる… ◦ 認知されるにつれて issue/PR も多くなる ▪ 時間がめちゃくちゃかかる
スパゲッティと化した rubocop-daemon-wrapper
OSS つらくなってきた期 (2019 年〜): rubocop-daemon-wrapper • rubocop-daemon サーバーに通信するための クライアントは rubocop-daemon
実装が遅い ◦ サーバーは TCP/IP で実装されているので、nc コマンド (netcat) で実装できる • nc コマンドを手で叩きたくない => wrapper を用意 ◦ rubocop-daemon-wrapper というシェルスクリプトを用意 ◦ ついでに rubocop コマンドとして振る舞えるようなインターフェースに ▪ エディタ等からも利用しやすくする
OSS つらくなってきた期 (2019 年〜): rubocop-daemon-wrapper • rubocop-daemon サーバーに通信するための クライアントは rubocop-daemon
実装が遅い ◦ サーバーは TCP/IP で実装されているので、nc コマンド (netcat) で実装できる • nc コマンドを手で叩きたくない => wrapper を用意 ◦ rubocop-daemon-wrapper というシェルスクリプトを用意 ◦ ついでに rubocop コマンドとして振る舞えるようなインターフェースに ▪ エディタ等からも利用しやすくする
🔥 シェルスクリプト 🔥
シェルスクリプトはつらい • nc コマンドが OS によって 若干違う ◦ 条件分岐の嵐
シェルスクリプトの特に nc コマンドがつらい • 分岐はつらい ◦ 差異を吸収するための分岐が大量に発生 • テストも難しい ◦
手元に OS があるわけではない ▪ Docker でやるという手もあるが、再現できているのか分からない • すべての OS を網羅するのは現実的ではない ◦ 自分が使う OS ではないのでモチベーションが高くない ▪ ニッチなものだと特に …
😇 セットアップガイドが大変 😇
OSS つらくなってきた期 (2019 年〜): セットアップガイドが大変 • rubocop-daemon はエディタから使われがち ◦ 高速化の目的がコーディング中のフィードバックを速くしたいため
• ユーザーとしてはセットアップガイドがあってほしい ◦ 最初に「導入したいけどどうやって導入すればいいんだろう ?」となる
OSS つらくなってきた期 (2019 年〜): セットアップガイドが大変 • エディタから rubocop-daemon を実行したい ◦
エディタ本体には rubocop-daemon クライアントは実装されていない ◦ つまりエディタのプラグインを作る or 設定する必要がある ▪ 作るのは大変なので rubocop-daemon-wrapper の出番
OSS つらくなってきた期 (2019 年〜): セットアップガイドが大変 • エディタはたくさんある ◦ Vim (Neovim),
VSCode, JetBrains IDE, … • エディタのプラグインもたくさんある ◦ VSCode だと RuboCop を実行するプラグインは複数ある ▪ vscode-ruby-rubocop, vscode-ruby, …
OSS つらくなってきた期 (2019 年〜): セットアップガイドが大変 • エディタの数 × プラグインの数だけ セットアップガイドが生まれる
◦ ただし、自分が使っているエディタとプラグインはそれぞれ 1 つずつ ◦ 自分が使っていないエディタ・プラグインのガイドを メンテナンスする必要がある
😇 Issue/PR 対応が大変 😇
OSS つらくなってきた期 (2019 年〜): issue/PR に対応するのは大変 • せっかく立ててくれた issue/PR は対応したい
◦ ただし英語が… ◦ PR の場合はより考えることが多い
PR は全部 merge したいが難しい • せっかく PR 作ってくれたのだし merge したい
◦ レビューどうする? ▪ 英語つらい問題 ▪ merge して気になったところは自分で修正してしまうという手もある • ただし merge のたびに修正するのも自分が大変 …
PR は全部 merge したいが難しい • merge すると自分がメンテナンスの責務を負うことに なる ◦ merge
したものに対してさらに別の PR が来ることもある ◦ これは誰がレビューする? 自分しかない ▪ つまり分かってないといけない • 使ってない OS、エディタ、プラグインは … • merge しないのが一番簡単ではある ◦ でも善意を無下にしたくない
仕事以外の時間でこれをやるのは大変 • 前提として、コード書くのは楽しいし、 他の人に使ってもらえることもとても嬉しい ◦ ただし前述のことには時間も MP も使う ◦ しかもそれを仕事以外の時間でやる
▪ 🤯
結果としてメンテナンスせずに放置してしまうことに • これらの苦悩があり、issue/PR を放置してしまった ◦ ごめんなさい 🙇 ◦ OSS owner
を移譲する or commiter を増やすという手もあった ▪ が見知らぬ人に権限を渡して大丈夫なのか ? という心配が勝った
rubocop-daemon は archive します • RuboCop 本体に取り込まれたことで、 多くのケースで RuboCop 単体で十分になった
◦ rubocop-daemon は役目を果たした • リポジトリは archive します (近いうちに)
OSS は素晴らしい • OSS は素晴らしい文化 ◦ 利用するソフトウェアの中身が自由に見れ、変更し、あわよくば利用者の変更が 本体に取り込まれる。これは OSS のとても大きな魅力
• 一方で OSS owner として苦悩を感じることもある ◦ ユーザーとしてはリスペクトの心を忘れずにいたい (自戒)
(再掲) 持ち帰ってほしいこと • 世の中の OSS owner はすごい ◦ OSS は面白いが大変なこともある