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
kohii
October 06, 2023
Programming
1.5k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
モノレポ化、そしてその先へ 〜ヘンリーのRe-architecting戦略〜
モノレポへの移行 LT -生産性の高いアーキテクチャに向けた第一歩- の発表資料です。
https://findy.connpass.com/event/296339/
kohii
October 06, 2023
More Decks by kohii
See All by kohii
週4社員しながら個人開発にベットする / Betting on Personal Projects While Working a Four-Day Week
kohii00
4
3.4k
Kotlinの開発でも AIをいい感じに使いたい / Making the Most of AI in Kotlin Development
kohii00
6
5.3k
Kotlinを用いたDSL的な設計手法と使用上の注意
kohii00
5
4.1k
個人開発サービス「Moyuk」を Product Huntでローンチするまでの道のり
kohii00
1
160
Other Decks in Programming
See All in Programming
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.9k
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
120
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
180
What's New in Android 2026
veronikapj
0
260
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
690
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
490
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
470
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
110
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
840
プロポーザルを書いてもらう
pvcresin
0
490
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
Cloudflare is Agents
chimame
0
160
Featured
See All Featured
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
200
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
940
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
790
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
250
How to build a perfect <img>
jonoalderson
1
5.9k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
230
Into the Great Unknown - MozCon
thekraken
41
2.7k
Test your architecture with Archunit
thirion
1
2.3k
Mobile First: as difficult as doing things right
swwweet
225
10k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
エンジニアに許された特別な時間の終わり
watany
108
250k
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