ドメインを分析し、設計に落とし込むには? 2つのSaaSをフルスクラッチで開発した経験から学んだこと

2K Views

August 16, 24

スライド概要

Developers Summit 2024 にメディカルフォース CTO 畠中が登壇した際の資料です。

# devsumi

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

ドメインを分析し、設計に落とし込むには? 2つのSaaSをフルスクラッチで開発した経験から学んだこと 株式会社メディカルフォース 取締役CTO 畠中 翔⼀

2.

⾃⼰紹介 株式会社メディカルフォース 取締役CTO 畠中 翔⼀ 1997年⽣まれ、⼤阪府出⾝学⽣時代からインフラの 構築やWebアプリの⽴ち上げを多数こなす。 2020年11⽉に株式会社メディカルフォースを設⽴。 現在のmedicalforceをフルスクラッチで開発。 開発の傍ら、深層⽣成学習を⽤いた研究が国際学会に採択 されるなど、機械学習(AI)や最先端の技術にも精通。

3.

本⽇の講演について

4.

本⽇の講演について どんな⼈向けか アーキテクチャ選定に迷いがある 開発組織の仕様変更のスピードをあげたい DDDの価値が分からない

5.

本⽇の講演について 話す内容 仕様変更のボトルネック オニオンアーキテクチャの旨み 採⽤する上で抑えておきたいこと

6.

私たちについて バーティカルSaaSのコングロマリットを⽬指すテックカンパニー ⾃由診療向けオールインワンSaaS 警備業向けオールインワンSaaS

7.

ビジョン Vision これからの産業の成⻑プロセスを合理化する このビジョンを達成するために、スピード感はとても重要

8.

スタートアップはスピード感は開発組織のスピード感から

9.

PMF ミッションクリティカルなプロダクト これを超えてくれるのがPMF。ミッションクリティカルなプロダクトは特に⼤変。 業務の⼤変さ 元システムが20年かけて できなく 開発しているシステム なること 元システム 普通にやったら5年はかかる できるように なること 新システム ⼤幅に短縮して実現するには

10.

これからのスピード感 機能は時間が経つにつれて、コモディティ化していく。 真の意味で競合優位性となるのは顧客に向き合って、独自のロードマッ プを作ることとそれをどこよりも速く実装していくスピード感になると思っ ている。

11.

スピード感とは ❌ 新しい機能を速く作っていくこと ⭕ 仕様の変更が素早くできること ⭕ カイゼンのスピードを速くすること

12.

仕様変更/カイゼンのスピード どこを変更するべきかが明確 変更した時の影響範囲が明確 ▶ カイゼンにも同じことが⾔える

13.

仕様変更/カイゼンのスピード どこを変更するべきかが明確 各関数やクラスの責務が明確 ⾒通しの良いコード 変更した時の影響範囲が明確 依存の関係が明確 依存の向きや向き先が限定的

14.

スピード感とは 結局、、⾼凝集‧低結合が⼤事!!! 仕様変更もカイゼンも⾼凝集‧低結合であれば安全に少ない変更量で⾏える

15.

アーキテクチャ

16.

これまでの三層アーキテクチャ プレゼンテーション層 ロジック層 データアクセス層 レイヤーの責務⾃体は明確で 依存の向きや向き先も明確という意味では⾼凝集‧低結合に⾒える ⼤体ぐちゃぐちゃになるのロジック層じゃないですか?

17.

ロジック A ロジック B ロジックAにも置くと 凝集度が下がる ロジックBから持ってくると 結合度が上がる ロジック Bの一部

18.

在庫アラートの例 在庫仕入れロジック 在庫減算 ロジック 在庫使用ロジック ⾊々なところで本来 関係のない通知周りの ロジックが出現 ▶ こちらを渋々採⽤ 在庫のアラート通知 ロジック アラートを出したくない処理 の時に、意図せずアラートが 出てしまう

19.

ロジック A ロジック B ロジックAにも置くと 凝集度が下がる ロジック Bの一部 ロジックBから持ってくると 結合度が上がる => 意図しない仕様が⽣まれや すく、バグが起きやすい

20.

名寄せの例 患者ロジック カルテロジック 名寄せロジックが巨⼤なため、 ⼤したことのない処理でも 名寄せのせいでコードが膨らむ ▶ 可読性も品質も落ちる 名寄せロジック

21.

ロジック A ロジックAにも置くと 凝集度が下がる => 変更漏れや毎度複 雑な処理を書くのでバ グが起きやすい ロジック B ロジック Bの一部 ロジックBから持ってくると 結合度が上がる => 意図しない仕様が⽣まれや すく、バグが起きやすい

22.

ユースケース B ユースケース A ロジック A ロジック B ロジック C ロジック D

23.

仕様変更/カイゼンのスピード どこを変更するべきかが明確 各関数やクラスの責務が明確 ⾒通しの良いコード 変更した時の影響範囲が明確 依存の関係が明確 依存の向きや向き先が限定的

24.

⼆種類のロジック アプリケーションロジック 頻繁に変更される アプリケーションごとに異なる ドメインロジック 知識として蓄積される どんなアプリケーションでも同じ

25.

これまでの三層アーキテクチャ プレゼンテーション層 アプリケーションロ ジック ドメイン ロジック データアクセス層 ビジネスロジックとドメインロジックをレイヤー分けすることで解決する問題が多い!!

26.

在庫アラートの例 在庫使用ビジネスロジッ ク 在庫使用ドメインロジック 在庫仕入れビジネスロ ジック アラート通知ドメイン ロジック 在庫仕入れドメインロ ジック アラート通知をするということは在庫使⽤のビジネスロジック だが、それぞれの処理は書かずに呼び出すだけ

27.

名寄せの例 患者ドメインロジック 会計ビジネスロジック カルテビジネスロジック (名寄せ) 患者ドメインロジック 会計ドメインロジック カルテドメインロジック (名寄せ) アラート通知をするということは在庫使⽤のビジネスロジック だが、それぞれの処理は書かずに呼び出すだけ

28.

名寄せの例 カルテビジネスロジック 患者ビジネスロジック カルテドメインロジック 患者ドメインロジック

29.

カイゼンについて

30.

カイゼン ▶ 関数のリファクタリングは⾼凝集‧低結合になると⾃ずとやりやすくなる フレームワークやORMの変更 DBの変更

31.

本当にそんなカイゼンすることあるの? フレームワークやORMなど変更することは滅多にないと思っていた。 が、実際(Node.jsでは)ORMのデファクトスタンダードが 変わってきていたり、良さげなフレームワークが登場したりなど ここ三年で変化が⼤きい。またDBについても実際に ⼀部DynamoDBからPostgresに置き換えたり、逆もある。

32.

データアクセス層 プレゼンテーション層 アプリケーションロ ジック ドメイン ロジック データアクセス層 データアクセス層は、エンティティの永続化と復元以外の責務を負ってはいけない!

33.

User Interface ⾼凝集‧低結合をとりあえず Application Service 守っておけばなんとかなりそう。 Domain Service だが実際にこれらをルール化して Domain Model st ru fra Web Service File In オニオンアーキテクチャの採⽤ ct ts s Te Application Core ur e みんなに守ってもらうのは難しい DB

34.

結果

35.

良かったこと ▶ 当然仕様変更は圧倒的にしやすくなった!! テストが書きやすくなった! コードの再利⽤性が⾼まって新規実装も速くなった! DBの変更 バグが出にくくなった!

36.

結論 今⽇伝えたかったこと とにかく⾼凝集‧低結合 ロジックの責任分けがとにかく重要 インフラレイヤーを作ることも重要

37.

アンケートご回答お願いします ごせいちょうありがとうございました!