Slide 1

Slide 1 text

1 READYFORにおける複雑なドメインとレガシーシステムとの戦い方 Object-Oriented Conference 2020 ランチスポンサーセッション 伊藤博志 @itohiro73

Slide 2

Slide 2 text

2 自己紹介 伊藤博志 @itohiro73 READYFOR株式会社 VP of Engineering 「思いの乗ったお金の流れを増やす」ために、主にエンジニア組織作 りとアーキテクチャー設計全般に関わる。 #ooc_2020 #ooc_a

Slide 3

Slide 3 text

3 READYFORのVision・Mission Vision 誰もがやりたいことを実現できる世の中をつくる Mission想いの乗ったお金の流れを増やす #ooc_2020 #ooc_a

Slide 4

Slide 4 text

4 READYFORのクラウドファンディング #ooc_2020 #ooc_a

Slide 5

Slide 5 text

5 READYFORステートメント #ooc_2020 #ooc_a クラウドファンディングの枠を超え て、「想いをつなぐ金融機関へ」

Slide 6

Slide 6 text

6 READYFORにおける複雑なドメインとは #ooc_2020 #ooc_a

Slide 7

Slide 7 text

7 READYFORのクラウドファンディング #ooc_2020 #ooc_a ■ ぱっと見普通のWebサービス ■ どこにドメインの複雑さが隠れているのか?

Slide 8

Slide 8 text

8 READYFORのクラウドファンディング #ooc_2020 #ooc_a ■ ぱっと見普通のWebサービス ■ どこにドメインの複雑さが隠れているのか? 「プロジェクト」というキー ワードを起点に考えてみる

Slide 9

Slide 9 text

9 プロジェクトのライフサイクル #ooc_2020 #ooc_a READYFORシステム プロジェクト実 行者 プロジェクト支 援者 プロジェクトをはじめる プロジェクトを探す

Slide 10

Slide 10 text

10 「READYFORシステム」の中身は...? #ooc_2020 #ooc_a READYFORシステム 様々なワークフローが複雑に絡み合っている ・ ・ ・ ・ ・ ・

Slide 11

Slide 11 text

11 「プロジェクト」をめぐるさまざまなコンテキスト #ooc_2020 #ooc_a プロジェクト はじめる 支 援 審査 プロジェクト ページ作成 入出金・売上管理 契約書作成 データ分析 *実際よりも単純化してい ます

Slide 12

Slide 12 text

12 サービス開始以来9年間、プロジェクトという概念が さまざまなコンテキストで少しずつ育った結果 #ooc_2020 #ooc_a

Slide 13

Slide 13 text

13 こうなりました #ooc_2020 #ooc_a project.rbは、3700行に及 ぶ巨大なmodelコード

Slide 14

Slide 14 text

14 よく聞くやつだ! #ooc_2020 #ooc_a

Slide 15

Slide 15 text

15 巨大モデルのつらみ #ooc_2020 #ooc_a さまざまなコンテキストの、さまざまなロジックが「プロジェクト」モデルに丸投げ 状態 ■ 責務の分離ができていない ■ 凝縮度が低く、密結合 ■ 変更を加えるのが非常に難しく、バグの温床

Slide 16

Slide 16 text

16 境界づけられたコンテキストを理解する #ooc_2020 #ooc_a 境界づけられたコンテキストとは ■ ドメイン駆動設計(DDD)の戦略的設計の概念のうちのひとつ ■ ユビキタス言語のスコープは境界づけられたコンテキスト内となる ■ 境界づけられたコンテキスト間はコンテキストマップで結びつける

Slide 17

Slide 17 text

17 現在は全てのコンテキストがモノリシックなシステムに載っているが... #ooc_2020 #ooc_a プロジェクト はじめる 支 援 審査 プロジェクト ページ作成 入出金・売上管理 契約書作成 データ分析 *実際よりも単純化してい ます

Slide 18

Slide 18 text

18 READYFORシステムを境界づけられたコンテキストから整理する #ooc_2020 #ooc_a SoE 実行者コン テキスト 支援者コン テキスト SoC 審査・業務 オペレーション コンテキスト SoR 決済・会計 コンテキスト データ分析 コンテキスト それぞれのコンテキストで必要とされる「プロジェクト」モデルの責務を整 理していく SoE = System of Engagement ■ ユーザーエンゲージメントのため のシステム ■ UXが大事 SoR = System of Record ■ 記録のためのシステム ■ データ設計が大事 SoC = System of Control ■ 状態遷移を伴う様々なワークフロー ■ *READYFOR内で共有している独自の概念

Slide 19

Slide 19 text

19 これでプロジェクトモデルも責務分割可能か...! #ooc_2020 #ooc_a

Slide 20

Slide 20 text

20 概念は整理できたが、どうやって進めていく? (新規開発案件山積みです\(^o^)/) #ooc_2020 #ooc_a

Slide 21

Slide 21 text

21 ここで技術的負債の説明を試みる #ooc_2020 #ooc_a

Slide 22

Slide 22 text

22 #ooc_2020 #ooc_a ■ ソフトウェアとしての価値(技術的資産) = 技術的純資産 + 技術的負債 あくまでアナロジーなので「純資産」や「負債」といった完璧なラベル付けができる わけではないことに注意 技術的純資産 技術的負債 ソフトウェア としての価値 (技術的資産) そのソフトウェアが生み 出す価値すべて - Webサービスの機能 - 新しいユーザー体験 - 新規事業 - 人的コスト削減 - 等々 新たな機能開発を阻害するような設計や実 装等 例 - 3000行を超える巨大なモデル - 複雑な画面遷移実装 - 複雑なAdmin… - テストがない... 等々 開発を促進するような設計や実装等 例 - 複雑な概念をシンプルに表現した実装 - 再利用可能なモジュール - 適切な粒度とカバレッジをもった自動テス ト 等々 BS(バランスシート)のアナロジーとしての技術的負債

Slide 23

Slide 23 text

23 ここで注意 技術的負債とは、先人たちがビジネス価値を 築き上げてきたソフトウェア資産の一部なので、 絶対悪というわけではない! #ooc_2020 #ooc_a

Slide 24

Slide 24 text

24 特性を理解するのが大事 #ooc_2020 #ooc_a

Slide 25

Slide 25 text

25 #ooc_2020 #ooc_a 技術的負債に対して技術的純資産が多い場合の成長速度 技術的純資産 技術的負債 技術的純資産 技術的負債 技術的純資産 技術的負債 技術的純資産 技術的負債 初 速 は 少 し か か る 開発スピードに加速度がついていく

Slide 26

Slide 26 text

26 #ooc_2020 #ooc_a 技術的純資産に対して技術的負債が多い場合の成長速度 技術的純資産 技術的負債 技術的純資産 技術的負債 技術的純資産 技術的負債 技術的純資産 技術的負債 初 期 に 生 み 出 す 価 値 は 大 き い 利子を支払うかのごとく開発スピードは一気に逓減していく *技術的負債(Technical Debt)というアナロジーは、初期の大きな借り入れによる大きな資産形成ができる が、時間軸に沿って利子を支払い続けなければいけないということを表現している

Slide 27

Slide 27 text

27 どうすればよいのか #ooc_2020 #ooc_a

Slide 28

Slide 28 text

28 リファクタリングという概念があります #ooc_2020 #ooc_a

Slide 29

Slide 29 text

29 #ooc_2020 #ooc_a リファクタリングという概念 技術的純資産 技術的負債 技術的純資産 ソ フ ト ウ ェ ア の 価 値 リファクタリング ソフトウェアとしてのの価値は変えずに内 部の負債を返却 技術的負債 技術的純資産 技術的負債 技術的純資産 技術的負債 その先の開発スピードに加速をつける

Slide 30

Slide 30 text

30 リファクタリングの軸に添えるのはドメイン駆動設計 #ooc_2020 #ooc_a

Slide 31

Slide 31 text

31 ドメインエキスパートと対話できる土壌は育っている #ooc_2020 #ooc_a

Slide 32

Slide 32 text

32 あとは、一緒に推し進めていく仲間が必要です #ooc_2020 #ooc_a

Slide 33

Slide 33 text

33 本日は、戦術的設計や 実装にまつわる話はしませんでした #ooc_2020 #ooc_a

Slide 34

Slide 34 text

34 今日これを見ているあなたに 事例をつくっていっていただきたいから #ooc_2020 #ooc_a

Slide 35

Slide 35 text

35 READYFORでは、先人たちが築き上げた レガシーシステムにリスペクトを持ちながら、 複雑なドメインを再設計し、 さらなる成長のためのリファクタリング を推し進めてくれる仲間を大募集しています #ooc_2020 #ooc_a

Slide 36

Slide 36 text

36 #ooc_2020 #ooc_a 新しいお金の流れを作る、リードバックエンドエンジ ニア募集! 【必須要件】 ・コンピューターサイエンスの基礎知識 ・Ruby on Rails を用いた Web アプリケーションの開発/運用経験 ・DDDの実践的な理解と開発現場に適用した経験 【歓迎要件】 ・モノリシックに実装されている SoEとSoRの分離・リファクタリング経験 ・Java/Scala/Go/Rustなど、静的型付けを持った言語の利用経験 ・Webフロントエンド (SPA) の知識 ・機械学習/データサイエンス領域の知識 ・OSSコントリビュート、カンファレンス登壇、書籍執筆等の技術発信経験 https://www.wantedly.com/projects/414310

Slide 37

Slide 37 text

37 #ooc_2020 #ooc_a 新たな資金流通エコシステムの基盤をつくる、決済 ・会計エンジニア募集! 【必須要件】 ・コンピューターサイエンスの基礎知識 ・決済、会計、銀行口座管理等、お金の動きにまつわるシステム開発経験 ・要件定義、設計、実装、テスト、リリースまでのシステム開発工程全てに関わった 経験 【歓迎要件】 ・アジャイル開発経験 ・Java/Scala/Go/Rustなど、静的型付けを持った言語の利用経験 ・Webフロントエンド (SPA) の知識 ・自動テストの実装経験 ・OSSコントリビュート、カンファレンス登壇、書籍執筆等の技術発信経験 https://www.wantedly.com/projects/414299

Slide 38

Slide 38 text

38 #ooc_2020 #ooc_a 資金調達の新たなスタンダード、READYFORフロ ントエンドエンジニア募集! 【必須要件】 ・HTML/CSS/JavaScriptの知識を有する方 ・セマンティックを意識した HTML5によるマークアップ経験がある方・ CSS3を用い たWebデザインの実装・実務経験 ・React/Vue.js/AngularJSなどを用いたSPA/SSR開発経験 ・Git を用いたチームでの開発経験 【歓迎要件】 ・Atomic Design を活用した UI コンポーネント開発 ・TypeScriptなどの型システムを持った言語の利用経験 ・UI/UXデザインへの知識 ・スクラムなどアジャイル開発手法を用いたチーム開発経験 ・Ruby on Rails を用いた Web アプリケーションの開発経験 ・OSSコントリビュート、カンファレンス登壇、書籍執筆等の技術発信経験 https://www.wantedly.com/projects/411396

Slide 39

Slide 39 text

39 #ooc_2020 #ooc_a 急成長中のベンチャーで品質管理をお任せする、 一人目のQAエンジニア募集! 【必須要件】 ・ソフトウェア品質保証の基礎知識 ・QAの実務経験 ・検証項目の設計、実施経験 【歓迎要件】 ・QAチームの立ち上げ経験 ・アジャイル開発経験 ・金融機関のシステム開発経験 ・Autify等e2eの自動テストSaaSの利用経験 ・e2e、Integration Test、Unit Test等レイヤー問わず自動テストの実装経験 https://www.wantedly.com/projects/414292

Slide 40

Slide 40 text

40 We are Hiring! ビジョンを実現するために推し進めていきたいことはたくさんありますが、今いる 人員だけではまだまだ足りません。「誰もがやりたいことを実現できる世界をつく る」ためにも強いエンジニア達に参画していただきたいと思っています!! #ooc_2020 #ooc_a

Slide 41

Slide 41 text

41 ご興味をもっていただいた方は、セッション後でも懇親会 でもお気軽にお声がけください!! TwitterでDMいただいても、Wantedlyからご応募いただ いてもOKです! #ooc_2020 #ooc_a @itohiro73