Ruby on Railsのモジュラーモノリス化 ~PackwerkとPacksRailsの導入~

こんにちは。エムスリーキャリアでエンジニアをしているakitoshigaです。

 

近年、疎結合アーキテクチャの選択肢としてモジュラーモノリスに注目が集まっていますが弊社では保有するプロダクトの1つであるM3Career Primeでモジュラーモノリス化に取り組んでいます。

 

今回はモジュラーモノリスの概要や採用に至った背景、モジュラーモノリス化における具体的な取り組みの1つであるPackwerkとPacksRailsを導入した話について紹介したいと思います。

 

M3Career Primeとは

M3career Primeとは、弊社で保有するプロダクトの1つであり医療機関を対象にした医師の採用支援SaaSです。

enzine.m3career.com

 

モジュラーモノリスとは

疎結合アーキテクチャの1形態であり、単一のコードベースで構成されていますが内部的には機能やビジネスコンテキストの単位で論理的に分割されています。

マイクロサービスと比較して個別のスケーリングやデプロイができないデメリットがあ

りつつも構築や運用コストが低いメリットがあります。

 

モジュラーモノリスアーキテクチャのイメージ図

 

なぜモジュラーモノリス化なのか?

M3Career PrimeはRuby on Railsで構築されています。

当プロダクトはサービスオープン以降度重なる機能の追加や既存機能の改修、さらには本来の機能とは無関係なLP等のサービスも単一のコードベースに追加されるようになってしまい「巨大な泥団子」と化してしまっておりました。

それにより、以下の問題を抱えていました。

  • 潜在的な依存関係
  • モデルと実装が乖離
  • 低凝集・密結合なコード
  • 属人化しており、秩序のないコード

その結果として保守性が著しく低下、仕様の調査・見積もり工数の増加、改修に時間がかかるという開発・運用上の課題を抱えていました。

さらに、当プロダクトの構想として今後新たなサービス展開が打ち出されることが予見されていました。

この構想はモジュラーモノリスアーキテクチャと相性が良く、課題解決と今後のサービス展開を見据えて当プロダクトのモジュラーモノリス化を決断しました。

 

しかし、この決定の前に葛藤もありました。

TechRachoさんが公開されている「素のRailsは十分に豊かである(翻訳)」にもある通り、大規模なサービスでも素のRailsで書かれている事例は存在しています。

techracho.bpsinc.jp

 

個人的にも、前述の問題は非アーキテクチャ依存でありリアーキテクティングまでせずともよりミクロなレベルのリファクタと「Rails Way」の徹底で開発上の課題は解決するのではないかとの思いもありました。

 

しかし、以下の理由から最終的にはモジュラーモノリスへのリアーキテクティングを実施することを決定しました。

  • 個人の経験から、アーキテクチャによる制約を設けた方が保守性を保つことができるのではないかと仮説を立てた。
  • 当プロダクトのビジネス的スピード感を考慮した時に、前述の構想に追従するためにはこのタイミングでリアーキテクティングを行うことが最適だと判断した。

 

Railsのモジュラーモノリスの実装方法にいはくつか種類があるのですが、インクリメンタルに移行出来る点と、前例の多さからPackwerk(+PacksRails)に決定しました。

 

Packwerkとは

Shopifyが開発しているパッケージ間の依存の静的解析ツールです。

Railsアプリケーション内で論理的な境界を定めることでモジュール化を支援します。

github.com

PacksRailsとは

通常のRailsから離れたディレクトリ構成にすることが可能になり、主に物理的なコードベースのモジュール化を支援します。

Packwerkと組み合わせて使用します。

github.com

 

導入した所感

リアーキテクティングにエンジニアの全リソースを注ぎ込めないため、PackwerkとPacksRailsのインクリメンタルに移行出来る点はかなり取り組みやすいと思いました。

 

PacksRailsを利用すると通常のディレクトリ構成と異なる形で開発をする必要が生じますが、そこまで大きい負荷にはなっていないと感じています。

 

最後に

現在は試験的に一部の機能を物理的にパッケージ分けした段階であり、これから本格的にモジュラーモノリス化に向けた取り組みを行っていくことになります。

 

また、モジュラーモノリスアーキテクチャの実現のためにPackwerkとPackRailsの導入以外にもいくつかの施策を実施・検討しています。

 

これらの取り組みについて、また別の機会でご紹介できればと思います。

エンジニア組織でLT大会を開催しました

こんにちは。BDEチームの近藤(atkondo)です。今月からエムスリーキャリアにてTechblogを始めさせて頂きます。

狙い、概要

 当社のエンジニア組織では、年に1回3月にLT大会を行っています。狙いとして、「エンジニア同士の活躍を讃えるとともに、役割/業務/人となりについての相互理解を深める」ということで実施しています。

  • 内容:以下についてを基本的には一人一人が発表しています。
    1. 事業に高く貢献した案件、
    2. 主に取り組んで来た案件や技術、
    3. プライベートを含めて頑張ったこと
  • 参加者:全体で60名の参加、発表は4月予定の新卒の方や入社後一定期間が経過していない方等を除く、46名の発表でした。一人基本4分の持ち時間で、全体で5時間半のイベントとなりました。
  • 表彰:当社では年に2回全社表彰と部門表彰が行われています。LT大会の内容をアンケートを取りその結果で、社表彰では次の3項目で1〜3位を全員のアンケートで推薦しています。
    •  M3Cの事業への貢献度(1〜3位)  
    •  エンジとして見習いたい(1〜3位)
    •  興味ある・面白いプロジェクトや技術(1〜3位)

  部門表彰では以下の3項目で全員のアンケートで選出しています。これはエンジニアの行動指針としても定めている内容となります。

    •  技術力を持って事業に踏み込む
    •  誰よりも当事者意識を持つ
    •  挑戦し続ける道を選ぶ

 

どのような発表があったか?①戦略推進チームの活躍ぶり

 Techblogということで社外の皆さんにお届けしたいと思ったのが、戦略推進チームの活躍振りです。

 戦略推進チームとは社内のキャリアコンサルタント/営業を支えるSFA/CRMシステムを担当しているチームです。SFASalesforceで構築して、SFAを中心にAI、DWHなどを連携させています。

 当社の募集要項では社内システムエンジニアという枠で募集させて頂いているメンバーが所属しているチームとなります。社内システムエンジニアというと各社で内容が異なりが大きいと思いますので、一例としてその活動内容をお伝えさせて下さい。

 

 例えば、西村さんからは「事務長の方向けのメルマガの改善」の発表を頂きました。

今年度、お客様にかなり評価を頂いた施策で、定量、定性面双方で大きな効果があったという話がありました。

 詳細は避けますが、お客様へどういった内容を届けるべきなのか?、また、その障害となり得る業務フローをどう見直すべきなのか?といったところに着目したことで成果に繋がったと言える施策であったかと思います。

 さらに、エンジニアとしての対応として以下の成果を発表されていたのが印象的でした。  

  •  開発時の工夫としてモジュール分割
  •  過去の振り返りを各工程での課題を改めて整理した上で開発に取り組む

 こまめに進めて行くことは大切だと思いました。

 

どのような発表があったか?②事業へのコミット

 もう1つお届けしたいのが、事業へコミットを行うエンジニアの活動です。

 例えば、当社では産業保険・健康経営サービスを手掛けています。その中で、「産業保険Plus+」というサービスを展開させて頂いています。

 以前からMVPとして構築していたサービスを本格展開しました。

 

 このプロジェクトの主要メンバーである苗床さんからプロジェクトの振り返りの発表を頂きました。

 体制、スケジュール、要件詰め、デザイン、開発、インフラ構成、アプリケーション構成、その他の発表とともに、無事リリースに向けて上手くいったことの発表がありました。

  • 途中ふりかえり
  • 連携・フィードバック 

 こまめに関係者間でコミュニケーションを取ることの重要性を改めて認識した発表でした。 



振り返って 

 毎年ですが当社のエンジニア組織の活躍ぶりを知ることができる貴重な場所となっています。また、メンバー同士のリアクションも頻繁で雰囲気の良い場となっています。

 

 当社は引き続き採用活動を行っています。こうしたエンジニア組織の雰囲気を知りたい方はぜひカジュアル面談でお話させて下さい。

  • エンジニア採用ページ

https://career.m3career.com/midcareer/engineer