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
590
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
350
RubyKaigi で LT 初登壇したきっかけと感想
fohte
1
920
Datadog Logs を活用して SLO 監視基盤を構築する
fohte
3
1.1k
The Journey of rubocop-daemon into RuboCop
fohte
1
1.1k
Ruby as Shell script
fohte
1
500
RuboCop Server Mode の仕組み
fohte
1
290
Ruby を使ったプロダクト開発を支えるオブザーバビリティ基盤
fohte
2
140
インシデントコマンダーやってみた
fohte
5
1k
Ruby でもなんとかなる - ISUCON13 公式反省会
fohte
0
150
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
44
13k
Building Adaptive Systems
keathley
38
2.3k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
Documentation Writing (for coders)
carmenintech
67
4.5k
Fireside Chat
paigeccino
34
3.1k
A Tale of Four Properties
chriscoyier
157
23k
YesSQL, Process and Tooling at Scale
rocio
169
14k
The World Runs on Bad Software
bkeepers
PRO
66
11k
Facilitating Awesome Meetings
lara
50
6.1k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
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 は面白いが大変なこともある