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
モノレポ化、そしてその先へ 〜ヘンリーのRe-architecting戦略〜
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
kohii
October 06, 2023
Programming
3
1.4k
モノレポ化、そしてその先へ 〜ヘンリーのRe-architecting戦略〜
モノレポへの移行 LT -生産性の高いアーキテクチャに向けた第一歩- の発表資料です。
https://findy.connpass.com/event/296339/
kohii
October 06, 2023
Tweet
Share
More Decks by kohii
See All by kohii
週4社員しながら個人開発にベットする / Betting on Personal Projects While Working a Four-Day Week
kohii00
4
3.2k
Kotlinの開発でも AIをいい感じに使いたい / Making the Most of AI in Kotlin Development
kohii00
6
5.1k
Kotlinを用いたDSL的な設計手法と使用上の注意
kohii00
5
3.8k
個人開発サービス「Moyuk」を Product Huntでローンチするまでの道のり
kohii00
1
130
Other Decks in Programming
See All in Programming
TipKitTips
ktcryomm
0
150
RubyとGoでゼロから作る証券システム: 高信頼性が求められるシステムのコードの外側にある設計と運用のリアル
free_world21
0
210
CSC307 Lecture 14
javiergs
PRO
0
450
Go Conference mini in Sendai 2026 : Goに新機能を提案し実装されるまでのフロー徹底解説
yamatoya
0
520
今更考える「単一責任原則」 / Thinking about the Single Responsibility Principle
tooppoo
3
1.4k
受け入れテスト駆動開発(ATDD)×AI駆動開発 AI時代のATDDの取り組み方を考える
kztakasaki
2
530
NOT A HOTEL - 建築や人と融合し、自由を創り出すソフトウェア
not_a_hokuts
2
580
maplibre-gl-layers - 地図に移動体たくさん表示したい
kekyo
PRO
0
190
DevinとClaude Code、SREの現場で使い倒してみた件
karia
1
940
ふつうのRubyist、ちいさなデバイス、大きな一年 / Ordinary Rubyists, Tiny Devices, Big Year
chobishiba
1
320
2026年は Rust 置き換えが流行る! / 20260220-niigata-5min-tech
girigiribauer
0
220
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
2
320
Featured
See All Featured
Designing Experiences People Love
moore
143
24k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.2k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
230
Making the Leap to Tech Lead
cromwellryan
135
9.8k
My Coaching Mixtape
mlcsv
0
64
The Cost Of JavaScript in 2023
addyosmani
55
9.7k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Building AI with AI
inesmontani
PRO
1
760
Chasing Engaging Ingredients in Design
codingconduct
0
130
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
140
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
240
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Transcript
Copyrights(c) Henry, Inc. All rights reserved. モノレポ化、そしてその先へ 〜ヘンリーのRe-architecting戦略〜 モノレポへの移行 LT
@kohii 2023-10-06
Copyrights(c) Henry, Inc. All rights reserved. Kohei Ishikawa / @kohii
• 2021.08〜 Henry Inc. ◦ CTO室 Lead Architect ◦ 電子カルテチーム Developer • Indie Hacker • X: @kohii00 About Me
Copyrights(c) Henry, Inc. All rights reserved. Henryが作っているもの • レセコン一体型電子カルテ ◦
電子カルテ: 医療情報を記録・管理するソフトウェア ◦ レセコン: 診療報酬制度に基づいた会計情報を管理する ソフトウェア • ドメインがとんでもなく巨大かつ複雑かつ難解 ◦ うまく扱わないとカオス
Copyrights(c) Henry, Inc. All rights reserved. 今日話すこと 1. ヘンリーのバックエンドをモノレポ化した話 2.
モノレポ化後の打ち手 3. Re-architectingで大事にしていることとか
Copyrights(c) Henry, Inc. All rights reserved. 今日話すこと 1. ヘンリーのバックエンドをモノレポ化した話 2.
モノレポ化後の打ち手 3. Re-architectingで大事にしていることとか
Copyrights(c) Henry, Inc. All rights reserved. 今年4月にヘンリーのバックエンドをモノレポ化🚀 https://dev.henry.jp/entry/backend-monorepo-part-1
Copyrights(c) Henry, Inc. All rights reserved. モノレポ化前のバックエンド(想定) general-api (Accomplishment Team)
• 電子カルテ「Henry」のバックエンド本体 • SLOC: 13.9万 receipt-api (Receipt Committee) • general-api から呼び出され、診療報酬 制度に関する処理を行い結果を返す計 算エンジン • Accomplishment Team からの依頼を起 点に receipt-api をインクリメントする • SLOC: 14.6万
Copyrights(c) Henry, Inc. All rights reserved. モノレポ化前のバックエンド(実際) • Receipt Committee
はユーザー体験を 含めた医事会計業務全般の開発や問い 合わせ先を期待される ◦ general-api やときにはフロントエ ンドの開発も必要 • 逆に、Accomplishment Team も制度の ことを知らずに開発できない
Copyrights(c) Henry, Inc. All rights reserved. 1. サービスの切り方自体の問題 • 機能を作るのに仕事の引き継ぎや調整を必要とする構造
• チームの境界付近に非常に難しい問題が落ちている 2. サービス間の関係性の問題 • receipt-api は general-api の内部で定義されたモデルをそのまま受け取る(スタンプ結合。順 応者) • 一方で呼び出しの方向はgeneral-api → receipt-apiで、この方向の依存も当然ある • 双方向の依存 3. 1と2 から、1つの機能を作る上で両サービスを同時に修正する必要 • 分かれて無くていいものが分かれている • 実質はマイクロサービスではなく分散モノリス 課題
Copyrights(c) Henry, Inc. All rights reserved. 解決の方針: ドメインによる分割 • ヘンリーのドメインを分割して統治
◦ ビジネス機能のまとまりに基づいてチーム・システムを グループ化 • 極力チームをまたがずに自律して意思決定・行動し、 単独で価値をデリバリーできるようにする • システムの構造とチームの構造は基本的に一致するよ うにしたい
Copyrights(c) Henry, Inc. All rights reserved. 理想への移行の初手としてモノレポ化を選択 選択肢1. 既存サービスを一旦1つに統合した後にドメインによる整理を進める道 選択肢2.
理想的な切り方のサービスを作って既存のものを徐々に移行する道 💡選択肢2を選ばなかった理由: • 移行が完了しきるまでのカオス増大 • いつまで経ったも終わらないリスク • “理想的な切り方” が間違っているリスク 💡一方で選択肢1は: • サービスの境界面を含む変更がやりやすくなる(着実に目的に一歩近づける) • 元々密結合なので、アトミックに変更できるようになる利点は大きい(モノレポ化単体でも意味がある) • 容易に後戻りできるし、未来の選択肢が多い。低リスク。
Copyrights(c) Henry, Inc. All rights reserved. • 2つの Git リポジトリを1つにまとめる
◦ Git の履歴も統合 • サービスのデプロイメント単位はそのまま • ビルド等の設定を共通化 モノレポ化の内容
Copyrights(c) Henry, Inc. All rights reserved. モノレポ化までの道 1. 移行を実現するためのワーキンググループを発足 a.
計画の立案 b. モノレポの具体像の立案 c. モノレポ化のためのバックログの作成・管理 d. 週次でプラン&状況確認 2. ADRの記述 3. 作業日の決定とアナウンス 4. 準備と手順書の作成 5. やっていき → 入念な準備や便利スクリプトのおかげでスムーズに完了
Copyrights(c) Henry, Inc. All rights reserved. それはもううまくいった👏 今回は詳細は割愛します。詳しくはこちらを読んでみてください。 https://dev.henry.jp/entry/backend-monorepo-part-1 医療スタートアップのバックエンドをモノレポ
化した話 〜戦略・プロセス編〜 https://dev.henry.jp/entry/backend-monorepo-part-2 医療系スタートアップのバックエンドをモノ レポ化した話 〜技術編〜
Copyrights(c) Henry, Inc. All rights reserved. 今日話すこと 1. ヘンリーのバックエンドをモノレポ化した話 2.
モノレポ化後の打ち手 3. Re-architectingで大事にしていることとか
Copyrights(c) Henry, Inc. All rights reserved. • ドメインによる分割に向けて匍匐前進中 ◦ ゴールを再定義しすり合わせるのに多くの時間を使った...
• 徐々に道が見えてきた モノレポ化後〜今日まで
Copyrights(c) Henry, Inc. All rights reserved. やったこと1. モノリス化→整理 ではなく 整理→モノリス化
を 選択 一旦モノリスにしてからドメインの整理をする、という方向で議論を進めていた
Copyrights(c) Henry, Inc. All rights reserved. やったこと1. モノリス化→整理 ではなく 整理→モノリス化
を 選択 モノリス化を後回しにして、先に各サービス内でドメインの整理を進める方がいいと判断 (※まだ構想)
Copyrights(c) Henry, Inc. All rights reserved. 💡判断の意図: • ドメインの整理という本丸にすぐに着手できる •
巨大な泥団子の回避 ◦ 未整理のものを統合することで認知負荷増大 → 整理の邪魔になる • モノリス化によるデメリット (消費メモリやビルド速度の問題) に対処しやすい ◦ 今のうちにデメリットの回避のための準備ができる ◦ モノリスの期間を短くできる やったこと1. モノリス化→整理 ではなく 整理→モノリス化 を 選択
Copyrights(c) Henry, Inc. All rights reserved. やったこと2. 境界が明確なモジュールから括り出す 💡判断の意図: •
整理することで、整理しやすくなる ◦ 残ったコードも複雑度が減り整理しやすくなる ◦ 高凝集・疎結合なパーツを切り出せれば、他の部分との関係も再定義しやすい • ビルド速度向上も見込める ◦ 分けると並列ビルドしやすい、モジュール単位でビルドキャッシュが効く • shared … 特定のドメインによらない、ユーティリティ • master-data … 医療の各制度に基づくマスターデータにアクセスするためのモジュール ◦ データは外部からCSV等で配布される = ヘンリーがモデリングしていないドメイン
Copyrights(c) Henry, Inc. All rights reserved. DDDの “境界づけられたコンテキスト” は我々が目指している “ドメインによる分割”
のヒントに なりそう • 輪読会 ◦ エリック・エヴァンスのドメイン駆動設計 ◦ 実践ドメイン駆動設計 ◦ マイクロサービスアーキテクチャ • 議論して理解を深める ◦ 抽象的でわかりにくいところもあるので、議論を経て理解を補う ◦ 洞察を社内ブログで共有するメンバーも やったこと3. ドメイン駆動設計(DDD)に学ぶ
Copyrights(c) Henry, Inc. All rights reserved. やったこと4. コンテキストマップを描く計画 “境界づけられたコンテキスト” を定義し、俯瞰する見取り図(=コンテキストマップ)をゲットす
る • 「始めるためのスタートライン」としての境界を描く ◦ より確からしい境界はイテレーティブな取り組みの中で見出されていく ◦ その境界はどこまで行っても仮説 ◦ スタート地点として最初の仮説を描きたい • オフラインで集まってガッと描く作戦 ◦ 近々やる予定 ◦ 只今ワークショップのデザイン中(イベントストーミングをベースにした方法を検討)
Copyrights(c) Henry, Inc. All rights reserved. 今日話すこと 1. ヘンリーのバックエンドをモノレポ化した話 2.
モノレポ化後の打ち手 3. Re-architectingで大事にしていることとか
Copyrights(c) Henry, Inc. All rights reserved. 1. 段階的な移行を好む 2. 進化を前提にする
3. 必要十分なアーキテクチャ モノレポ化を含むRe-architectingで大事にしてる考え方
Copyrights(c) Henry, Inc. All rights reserved. • 大きな旅路をステップに分けて進む • トランジションのすべての段階でなるべくカオスを増やさない
• 一時的なカオスを許容する作戦 → そのカオス期間はだいたい想定よりも 長引く 考え方1. 段階的な移行を好む
Copyrights(c) Henry, Inc. All rights reserved. • アーキテクチャはいろいろなもの に影響を受ける •
これらはすべて時間と共に変化 する 考え方2. 進化を前提にする
Copyrights(c) Henry, Inc. All rights reserved. • 状況も変わるし、自分たちも進化する • 正解は先に進む中で見出されるもの
• 拘束力のある長期的な決定は、最終責任時点まで保留 ◦ e.g. マイクロサービスなど 考え方2. 進化を前提にする
Copyrights(c) Henry, Inc. All rights reserved. • 開発チームの営みを規定しすぎない • 主役は開発チームであり、適切な判断はそこで生まれる
• 権威的なアーキテクトは邪魔になるリスク 考え方3. 必要十分なアーキテクチャ
Copyrights(c) Henry, Inc. All rights reserved. • ヘンリーのモノレポ化の取り組みは、“ドメインによる分割” を目指すための 初手
• 只今絶賛匍匐前進中 ◦ もう少し歩みを速めたい... • すべてはドメインの課題にフォーカスするために まとめ
Copyrights(c) Henry, Inc. All rights reserved. Thank you We are
hiring! https://jobs.henry-app.jp/ 𝕏: @kohii00