『Gradual Modularization for Ruby and Rails』を読んだ
Railsアプリケーションを徐々にモジュラーモノリスに移行するための戦略と戦術についての本『Gradual Modularization for Ruby and Rails』を読んだ。
概要
Railsアプリケーションを徐々にモジュラーモノリスアーキテクチャへ移行するためのテクニックから、継続的に移行を進める戦略まで幅広く解説している。技術的にはPackwerk周辺のエコシステムを中心に取り上げている。モジュラーモノリスを採用しているGustoのエンジニアStephan Hagemannさんによる本。
サンプルコードとしてshageman/package-based-rails-applications-bookが公開されている。
コンポーネントベース vs Packwerk
著者はコンポーネントベースRailsアプリケーション(Component-Based Rails Application: CBRA)をもともと提唱していた。CBRAでは、モジュールをすべてgemとして扱い、アプリケーションがgemに依存するように作る。このアイデアはRubyGems/Bundlerをある種濫用することで実現しているので、バージョン制約や設定の観点でうまくいかないところがあったらしい。
この本は、CBRAの改善案として、Packwerkを用いたRailsアプリケーションのモジュール化のしかたにフォーカスしている。
Packwerkを用いた漸進的なモジュール化
Packwerkを用いて、アプリケーションを徐々にモジュール化していく方法が説明されている。具体的には次のような内容。
- 大きな泥だんご的モノリスを徐々にPackwerkを用いたモジュラーモノリスに移行するための設定や戦略
- パッケージ群に課すルール(dependencyに加えてrubyatscale/packwerk-extensionが提供するprivacy、layers、visibility)についての詳細
- Packwerkを実行した結果として検出されるルール違反を解消していくためのリファクタリングパターン
また、上述のpackwerk-extensionのような、GustoのオープンソースプロジェクトRuby at Scaleで開発しているツール群についても一通り解説がある。
モジュラーモノリス移行の組織的な戦略
モジュラーモノリスに漸進的に移行する取り組みは組織横断になりやすい。そのような取り組みをどうやって進めるかについても触れられている。
具体的には、rubyatscale/pack_statsを使ってモジュラーモノリス化の進捗を計測する方法や、DORAメトリクス(いわゆるFour Keys)やSPACEの活用について説明されている。また、どうやって協力を得ていくかなど、組織として活動を進める戦略についても触れられている。
感想
過去にモジュラーモノリスを調べたときから何年も経ち、環境やプラクティスに大きな変化があったという実感がある。そのとき紹介したのはCBRA的手法だったし、エンジニアリングに関するメトリクスを取るのも今ほど一般的ではなかった。
Packwerk自体に加えて、周辺にpackwerk-extensionをはじめとする関連ツールが多く存在するので、どのツールがどのような用途のためにあるのか、どう使っていくのがいいのかを概観できたのがよかった。
ルール違反解消のためのリファクタリングについては、DIの箇所で一般にアンチパターンとされるサービスロケータも(『なぜ依存を注入するのか』であったような調子での注意はなく)紹介されていたりする。一般的な設計パターンも参照しつつ、どうパターンを適用するのがよいか考えながら読むのがよさそうだ。
組織的・戦略的にリアーキテクチャを進めていくためのメトリクスの使い方や、長期にわたって各チームにもパッケージのオーナーシップを持ってもらいながら移行するような取り組みについては、この本を参考に引き続き考えてみたい。
本としては10章構成で、分量が結構多いので読むのは時間がかかった。また、編集はそこまで効いていないと思われ、原稿のTODOが残ってたりする箇所も後半に多く見られたので、そのあたりは注意。