プロジェクトの状況なんだけど、
っていうところでモノレポやってみましたみたいな感じです。
今時ね、この人はフロントだけ、この人はバックエンドだけってしないよね結構。
みんな全部書こうぜって流れだよね。
特に事業会社って、
そんなにでかい組織にもなりにくい場所によるんだと思うんだけど、
うちの場合は1個のチームがすごい小さくて、
1個のプロダクト、内室事業になってることが多いので、
チーム全員で全てのことをやりましょうみたいな、
果て付けのことが多いですね。
っていうので、そういう背景もあって、
じゃあもう全てのことをやるんだったら、
1つのリポジトリにコードがまとまっていて、
必要に応じて参照できるような形にしておいた方が便利なんじゃないの?
と思ってやってみたっていうのが考え方って感じですね。
僕が実際にこのモノレポ、3ヶ月くらいモノレポでやってるんだけど、
実際にやってみた感じと、
もともとモノレポっていうものに対して抱いてたイメージみたいなのの、
現実とかギャップとか、これはこうだったみたいな話、
ちょっとしていこうかなと思っていて、
最初に、例えばアプリケーション、
例えばRailsのアプリケーションを書いていて、
何かしらインフラ触んなきゃいけないみたいな、
例えばSQSとかSNSとか、GCPだとPubSubとかね、
そういうものを触んないといけないようなケースにおいて、
結構IDEをまたいだり、エディターをまたいだりして、
例えばRubyMineでアプリケーションコードを書いて、
VSコードでテラフォームを書き回すみたいな作業が発生したときに、
ツールをそもそもスイッチしなきゃいけないっていう、
ちょっとの手間あるし、
検索、この構成って今どうなってんだっけみたいなときに、
アプリケーション側からその構成を見たいときと、
インフラ側からアプリケーションどういうふうに設定を参照してんだっけって見たいとき、
いくつかあるじゃないですか、みたいなことをするときに、
手間が減るのでハッピーになりそうだなと思ってて、
確かに減るんですよ、すごい楽なんですよね。
一方で、これはコードが一個のリポジトリにまとまっている弊害なんだけど、
BuzzyFinderとかRubyMineとかIntelliJだと、
Shift2回押すと何でも検索ってあるじゃないですか、
あれとかでバックエンドのコードみたいのに同じ行為を使っているフロントエンドのコードをヒットしたりして、
これじゃない、これじゃないって言ってまた検索し直すみたいなことがあったりとかっていうので、
ちょっとそういう検索の難しさはあるなみたいなのが、
実際やってみると出てきたりとかっていうのがあって、
確かに便利だけど、考えなきゃいけないことは増えるなみたいなのが、
自分たちのプロダクトを作るときのモノレフォーマーしか。
でもそうね、確かに、
JetBrains IDEだけに絞った話で言うと、
多分JS書くことそのものって全部のエディターでできるじゃん、ちゃんと。
できるね。
RubyMineでPythonを書くのはちょっと大変なんだけど、
なのでPython書くときはPyCharm使うけど、
でもJS書くときはWebStormを起動するかって言うと僕はそうではなくて、
WebStormにイメージ的にはRubyMineとかPyCharmとかって、
WebStormにその言語特有のいろんな機能が乗った感じになってんじゃん。
だからRuby書くときはRubyMineで、
JS書くときはRubyMineでそのまま書けるなっていう感じがあって、
そのときにモノレフォーだと別ウィンドウで開く必要がなくてめっちゃ便利だな。
マルチェラフォームとかはプラグインでれば書けるから、
そうだね。
っていうのができて便利だよなっていう気はする。
そうですね。
私最近のエディターツール、VS Codeに始まりCursorとか、
VS Codeベースのエディターツールとかっていうのは大体マルチランゲージサポートで、
一個のプロジェクトの中にいくつの言語があってもちゃんと機能するようになってるので、
そこら辺はツールのこれこれっていうのはあんまり影響なく便利に使えてよかったなみたいなのがありますね。
あとはこのモノレフォーの記事とかをいくつか見ていて、
LMのコンテキストを渡しやすいんですみたいな話をよく見てて、
確かにそうだなって思うし、実際やりやすかったんですよ。
例えばバッジ処理とかをStep FunctionっていうAWSのプロダクト使って、
こういうふうにやりたいですとか、このデータはこういうふうに渡ってきますよみたいな構成の情報を
いちいち与えなきゃいけないみたいなパターンの時に、
これはこのStep Functionから実行される想定なので、構成を参照してデータ構造を分析して、
入力がどうなってるのかみたいなことまで踏まえてこういう仕様で処理してくださいってやると、
結構その通りに素直にRailsのバッジ処理を書いたりしてて、
そういう意味でやりたいこととか関連するコードとかを含めて、
LLMに渡しやすいっていうのはめちゃめちゃモノレポのメリットだなと思いながらそれを享受してやってたし、
初回のプロンプトである程度のコンテキスト渡したらその依存をちゃんと辿ってくれることが多くて、
LLMが、というかAIエージェントが暴走して何か変なことをするみたいなのが結構少なかったなっていうのが初感としてあって、
今までだとNotionとか社内のドキュメントツール使ってやってたんだけど、
今回は思い切ってリポジトリの中に全部まとめるっていう判断をしてみましたというのがあって、
これもいろいろ世の中にあるモノレポに対する言及のあるテックブログとかから見て、
リポジトリまとめの方がいいなと思ったんでやってみたんですけど、
実装とドキュメントの内容が常に一致してて、
それを参照すればシステムの全体像であったり、
例えばインフラだったりインフラはこの構成でとか、
フロントエンドはこういう戦略でみたいなところがキャッチアップしやすいっていうのがあるなと思ってたんで、
その効果を狙ってやってみましたという感じです。
結果から言えばそれは言えると言えるし、そうとも言えるしそうとも言えない。
なあと思ったっていうのがあって、
新規メンバーが途中から参加してくれるっていうタイミングが2回あって、
1人は復帰してくるタイミングで、もう1人はヘルプで入ってくれるってタイミングだったんですけど、
確かにその人にお願いする領域の参入コストというかキャッチアップコストみたいなところは明らかに低い。
コードを見ながら、ドキュメントを見ながら方針を理解できるんでいいなと思いつつ。
ただ一方でそのキャッチアップに必要なドキュメントを常にメンテナンスし続けることが非常に難しい。
俺はどんなドキュメントツールを使っていようとやっぱ同じなんだなっていうふうな感想を持ったんだけど、
少人数で実装もドキュメントも調整もいろいろしなきゃいけないっていうところがあるので、
常に正しい状況を作りながら実装を進めて、何か仕様が変わったり方針が変わったときにそこをアップデートしてっていうのを、
いろんなところでコミュニケーションしたり、ビジネス側とコミュニケーションするときにはGoogleDocs使ってコミュニケーションしますってことも結構あったので、
そういうものをディポジトリの中で同期させるっていうのがすごいコストのかかることだったし、
それがやりきれてないっていうのが一個あるなーっていうふうに思っていて、
単純なそういう抜け漏れもあるし、細かな語彙とか表現による不一致で誤解を生んでしまって、
あれ実はこう思ってたんだけどみたいなのがチーム内で生まれてしまったみたいな課題もあったし、
あとは配線の部分で、小人数で結構厳しめの納期を目の前にして、
何かが変わったときにドキュメントをメンテナンスしながら同時に実装も変えてテストやってデプロイしてみたいなことをやってる体力がもはやない、
そういうことをやってられる状況ではないみたいなことも状況としてはあって、
というので、ドキュメントのメンテナンスっていうのがやはり課題なのかなっていうのがあるなと思っています。
これっていうのは、例えばAIの力借りるっていうので解決できるのかなと思ったけど、
今まだ導入できてないんでやっていきたいなっていうのが振り返りと、今後やるならこうしたいっていうので、
GitHub Actionsとクロードコードの組み合わせだったりとか、クロードコードのスキルズだっけ、
フックとかそこら辺のガードレール機能をうまく使って、
ドキュメントとうまく一致させにいくとかっていうのはやれるんだったりやったほうがいいなっていうのが振り返りというか反省というか、
ありますなーっていうのがこの話ですかね。
そうね、なんかさ、AIがガツガツ実装を変えてきてそれにドキュメントが追いつかないというか、
AIじゃなくて人間が実装しててもそれはそうなんだけど、
結構あれだよね、クロードMDとかにドキュメントちゃんと更新してくださいとか、
コミットある程度まとまったらコミットしてくださいみたいなって書いてるんだけど、
ちょくちょく無視されるから、
ちょっとスキルズっていうのが、スキルズもあれだよね、クロードMDと同じっちゃ同じだよね。
そのはずかな。
支援読み込みしてくれるみたいな感じだっけ、違ったっけ、スキルズちょっと俺まだ解像度が低いんだけど、
スキルズとかあとはフックス、フックスは強制でやらせることだからフックスかあるいはアクションズ、
そもそもクロード構造の外のどこかで強制の仕組みを使ってガードレールを整備するっていうのは確かになってのは思ったのと、
あとなんかさ、そのドキュメントでいうとちょっとモノレポとかAIの話からずれちゃうけど、
最近なんかADRっていうのが流行ってんじゃん。
アーキテクチャーディシジョンレコードかな。
そうそうそうアーキテクチャーの意思決定の、だからなんかこうレコードって言ってるのが何かこうミソなんじゃないかなと思うんだけど、
結構世の中のADRの例を見るとADR00に何々をするコンテキスト何々決定何々みたいな。
それを残すことを何かクロードにフックスとかで強制しつつ、
ADRだとなんかこうさ、ADR積み重ねだからさ、多分。
俺書いたことないからちょっと全然違うこと言ってたら申し訳ないんだけど、ADRっていうのは積み重ねであるから、
なんかこうADR、全ADRを踏まえた最新の設計ドキュメントっていうのを例えばGitHub Actionsで回して作るとか、
だからちょうどNailsのデータベースのマイグレーションファイルとスキーマRBみたいな。
そうだね。
そういうのとかにするといいのかなっていう妄想はした今。
確かにADR積み重ねて個々のADRに関連する場所をいじるときは、
そこが一致しているかアップデートされているかのチェックをすればいいし、
全体像のドキュメントが変わるケースがあるんであればそっちも変えて、
普通に全体のドキュメントの情報が実装と一致しているみたいな状況を作れそうだよね。
だんだんADRなんて大げさなものじゃなくてもGitHubのプルリクエストのディスクリビションがそれっぽいやつだから、
例えばあるプルリクエストがマスターに回避されたときにディスクリビションとかコードのDiffを参考にして、
この設計書を更新するプルリクを自動で作るとか、なんかそういうのがあるんかな。
確かに。
僕が直近に3ヶ月くらいやってたプロジェクトはNotionでドキュメントやってて、
クロードコードのNotion MCP使って、クロードコードにNotion MCPを認識させて、
この設計ドキュメントの通りにやってとかっていう、そのNotionからクロード側に情報インプットはしたんだけど、
その逆を全然してなかったから。
今Notionのドキュメント腐ってるんだよな。
僕らも3人で開発してて、ハドルとか繋いで毎朝連携しながら話してたから、
もうみんなの頭の中では完璧に認識あってんだけど、
この間一通り開発終わって一息ついて設計書見たら嘘しか書いてなくて。
起きるよね。
いやこれしかもさ、もう納期間に合ったーっつってさ、もう肩の力抜けてるタイミングだから今からドキュメント更新しようってならんって。
そうなんだよね。もう達成感とさ、その終わったーという開放感で、
ドキュメントを更新して今の実装に合わせるような形で整理し直そうっていうのができないよね。
なかなか難しいわ。人間の心理的にもそうなんだろうとは思うんだけど。
まあでもその更新したドキュメントが未来の自分を含む他人に迷惑をかけることになるからね。
それを何とかしてから年を越そうとは思ってるけどね。
いや本当にそうなんだよね。なんか行動はさ、HowとWhatであるみたいな話あるじゃないですか。
HowとWhatだっけ?何を表現してるのか。
それTワラさんのコミットメッセージには怖いよみたいな文脈の話?
そうそう。
そうなんだ。それドキュメントもあるんだ。
ドキュメントにはWhyを書いて、なぜこうしなきゃいけないのかみたいな背景と、
そのなぜを解決するためにはこういう方針を取るみたいなのを書いて、
その実装がCodeであるからみたいなのがどっかで議論されてたなと思ってて、議論というか言われてたなと思ってて、
やっぱそのWhyの部分がずれてたというか、実装とずれてると、
これなんでこうなってんだろうみたいな、実装の背景をちゃんと構成に伝えられないみたいなのが結構あって、
それを僕はこのプロジェクトはリプレイスプロジェクトというか既存のものを新しく作り直すプロジェクトだから、
作り直すものがどういう背景から作られていたのかみたいなのを結構調べなきゃいけないことが多くて、
ちょっとWhyというかなぜなのかの部分がなかなかキャッチアップしにくい環境とかがあったんで、
そういうのはすごく思いながらドキュメントをリポジトリに加えたんだけど、
結局自分もWhyを残せていないというのが悔しい部分だなと思ってます。
これ最後に思ってたのがCIが遅いってよく言われるなと思ってたんだけど、
実際には僕らGitHubにホストしてるから、
アクションを使うんですけど、GitHubアクションを使うんですけど、
その場合パスパターンとかでどのアクションこれは実行する、これは実行しないっていうのがチェックできるので、
全然困らなかったなっていうのがありましたと。
例えばフロントエンドのコードを変更したらテラフォームのチェックも走るし、
レールズのRスペックも全部走るみたいなことは起きないってことだね。
そうだよね、GitHubアクションでのワークフローの山手ファイルのオンとかでいろいろ書けばそうやってできるよね。
パスパターンだったかファイルだったかな、パスパターンかなみたいな項目で設定できるので全然課題にはならなかったなと。
リポジトリが小さいっていうのもあるんだけど、あるかなと思いつつ。
ただじゃあ他のCIツール使ったりしてるところは同じくできるのかって言われるとちょっと分からないので、
もしかしたらこの製品はこれができないみたいなので同じ問題が顕在化するかもしれないなっていうのはちょっと一個思ったくらいですかね。
はい。
なんかリリースの単位は、モノレポでリリース単位とかを結構気にするというか、なんだろうな。
話とかもあるみたいなんだけど、ちょっと僕の知らない世界なんで。
プロトコルバッファーでデータのシリアライズの仕方を定義しておいて、
リモートプロシージャーコール的な実装を置いておけば、
もうそのプロトコルバッファーの定義に従ってクライアント側はデータを受け取れるし、
アプリケーション側は呼ばれる関数を実装すれば、APIの実装になるんですっていう。
その乖離値がAPIのレスポンスとして使えますっていう世界観かな。
それをプロトバッフ使ってるのか、タイプスクリプトの型使ってるのかちょっと分かんないけど、
それでもクライアントとか関連するマイクロサービスなら、
マイクロサービス同士の通信がそれで全て定義できるので、
すごく便利に使えますっていう言葉と睨んだ。
大体そうだけど、多分プロトコルバッファーは使ってなくて、
普通のHTTPとJSONでやっててって話ぐらいかな。
GRPCだとプロトコルバッファーって、逆に俺GRPCは本当に全然知らないんだけど、
あれって多分HTTP2じゃないと動かないよね。
動かないかも。
あんまりWebのフロントエンドとバックエンドの通信では使わないイメージがあって、
バックエンド間のシステム連携で使われるイメージが僕はあって、
なぜかっていうと、別にフロントエンドとかでも使えようと思えば使えるのかもしれないけど、
なんでフロントエンドとバックエンドの通信でGRPCってあんまり使わないイメージなんだろう。
僕の理解だとGRPCってHTTP2じゃないと動かないんだけど、
CDNとか、あとはALBとELBってどっちが新しいんだっけ。
ロードバランサーとかSSLの終端をやるようなやつらがのきなみにHTTP2対応してなくて、
なんでGRPC使えないっていう理解を僕は知るんだけど、
それを置いといて、GRPCは普通にWebのフロントエンドとバックエンドを通信するのにも全然使えて、
それもあって、そのレイヤーの話で言うと単なるJSONを通信してるだけで、
多分型を共有できて嬉しいぐらいの話だった気がするの。
なるほどな。
で、あとグラフQL的な感じで、エンドポイント1つじゃなかったかな。違うかな。それは嘘かも。
いや、でもRPCだから多分そういうことだよね。
そうな気がします。
なんか、昔、多分僕がKiitaに書いた記事で一番読まれてるであろう記事であるところの、
Dales 5 APIモード、グレープたすグレープエンティティで作るWeb APIっていう記事と、
それの続きとしてのグレープスワッガー、グレープスワッガーエンティティで
Web APIのドキュメント自動生成みたいな記事があるんだけど、
それの現代版だね。
なるほど。
もう多分グレープ使ってる人、今あんまりいないと思うから、
普通にDalesのコントローラーで直書きして、で、スキーマは長らくあれかな、
直接OpenAPIのYAMLファイル直書きするしかないのかなっていうふうに思ってたんだけど、
なるほど、ちゃんとあるんですね、Rスワッグ。
そうなんです。あるんですよ、Rスワッグめっちゃ便利。
一個欠点があるなと思っているのは、Rスペック書くんですけど、
DSLが独自なんですよね、Rスワッグの。
そうだね、見た感じめっちゃ独自だね。
パスとかポストとかゲットとかっていうので、ディスクライブとかコンテキスト内部的に生成してるんですけど、
これがRubyMineとかのIDツールと結構相性が悪くて、
悪そう。
ジャンプできなかったり、ロボコップのリントとかも正しく反応してくれなかったりみたいなのが結構あって、
その辺はね、ちょっとあんまり自分も正しく整備できていなくて、課題がまだまだあるなと思いつつも、
APIのスキーマを常に最新にするという一点においては最強だと思ってます。
これでも、これなんだっけ、RスワッグのReadMeにあるGetting Startedの3番を今僕読んでるんだけど、コードを。
スペックリクエストブログズスペックっていうのがあって、ディスクライブブログズAPIのブログは普通のRスペックだよね。
そこからいきなりパススラッシュブログズっていうのがあって、これDSLで。
で、ポストなんちゃらっていうのがあって、レスポンスレスポンスレスポンス201レスポンス422ってあるんだけど、
これはだから、このDSLを読み込んでこいつを元にOpenAPIのスキーマが生成されるっていうのはわかるんだけど、
これは何かをテストしてるとかなわけ?
例えば認証が必要なAPIとかだったらそう?
認証っぽいところはbefore設に変えたりするの?これ追加で。そういうわけではないの?
します。できます。
するんだ。
で、AuthorizationヘッダーとかをAPIのスキーマでセキュリティ属性かな、セキュリティコンポーネントみたいなの指定しておくと、