READYFORにおける複雑なドメインとレガシーシステムとの戦い方

219da5cb087203869072a71b00f15484?s=47 Hiroshi Ito
February 16, 2020

 READYFORにおける複雑なドメインとレガシーシステムとの戦い方

Object-Oriented Conference 2020の、READYFORによるランチスポンサーセッションです。

219da5cb087203869072a71b00f15484?s=128

Hiroshi Ito

February 16, 2020
Tweet

Transcript

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

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

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

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

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

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

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

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

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

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

    ・ ・
  11. 11 「プロジェクト」をめぐるさまざまなコンテキスト #ooc_2020 #ooc_a プロジェクト はじめる 支 援 審査 プロジェクト

    ページ作成 入出金・売上管理 契約書作成 データ分析 *実際よりも単純化してい ます
  12. 12 サービス開始以来9年間、プロジェクトという概念が さまざまなコンテキストで少しずつ育った結果 #ooc_2020 #ooc_a

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

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

  15. 15 巨大モデルのつらみ #ooc_2020 #ooc_a さまざまなコンテキストの、さまざまなロジックが「プロジェクト」モデルに丸投げ 状態 ▪ 責務の分離ができていない ▪ 凝縮度が低く、密結合

    ▪ 変更を加えるのが非常に難しく、バグの温床
  16. 16 境界づけられたコンテキストを理解する #ooc_2020 #ooc_a 境界づけられたコンテキストとは ▪ ドメイン駆動設計(DDD)の戦略的設計の概念のうちのひとつ ▪ ユビキタス言語のスコープは境界づけられたコンテキスト内となる ▪

    境界づけられたコンテキスト間はコンテキストマップで結びつける
  17. 17 現在は全てのコンテキストがモノリシックなシステムに載っているが... #ooc_2020 #ooc_a プロジェクト はじめる 支 援 審査 プロジェクト

    ページ作成 入出金・売上管理 契約書作成 データ分析 *実際よりも単純化してい ます
  18. 18 READYFORシステムを境界づけられたコンテキストから整理する #ooc_2020 #ooc_a SoE 実行者コン テキスト 支援者コン テキスト SoC

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

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

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

  22. 22 #ooc_2020 #ooc_a ▪ ソフトウェアとしての価値(技術的資産) = 技術的純資産 + 技術的負債 あくまでアナロジーなので「純資産」や「負債」といった完璧なラベル付けができる

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

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

  25. 25 #ooc_2020 #ooc_a 技術的負債に対して技術的純資産が多い場合の成長速度 技術的純資産 技術的負債 技術的純資産 技術的負債 技術的純資産 技術的負債

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

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

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

  29. 29 #ooc_2020 #ooc_a リファクタリングという概念 技術的純資産 技術的負債 技術的純資産 ソ フ ト

    ウ ェ ア の 価 値 リファクタリング ソフトウェアとしてのの価値は変えずに内 部の負債を返却 技術的負債 技術的純資産 技術的負債 技術的純資産 技術的負債 その先の開発スピードに加速をつける
  30. 30 リファクタリングの軸に添えるのはドメイン駆動設計 #ooc_2020 #ooc_a

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

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

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

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

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

  36. 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
  37. 37 #ooc_2020 #ooc_a 新たな資金流通エコシステムの基盤をつくる、決済 ・会計エンジニア募集! 【必須要件】 ・コンピューターサイエンスの基礎知識 ・決済、会計、銀行口座管理等、お金の動きにまつわるシステム開発経験 ・要件定義、設計、実装、テスト、リリースまでのシステム開発工程全てに関わった 経験

    【歓迎要件】 ・アジャイル開発経験 ・Java/Scala/Go/Rustなど、静的型付けを持った言語の利用経験 ・Webフロントエンド (SPA) の知識 ・自動テストの実装経験 ・OSSコントリビュート、カンファレンス登壇、書籍執筆等の技術発信経験 https://www.wantedly.com/projects/414299
  38. 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
  39. 39 #ooc_2020 #ooc_a 急成長中のベンチャーで品質管理をお任せする、 一人目のQAエンジニア募集! 【必須要件】 ・ソフトウェア品質保証の基礎知識 ・QAの実務経験 ・検証項目の設計、実施経験 【歓迎要件】

    ・QAチームの立ち上げ経験 ・アジャイル開発経験 ・金融機関のシステム開発経験 ・Autify等e2eの自動テストSaaSの利用経験 ・e2e、Integration Test、Unit Test等レイヤー問わず自動テストの実装経験 https://www.wantedly.com/projects/414292
  40. 40 We are Hiring! ビジョンを実現するために推し進めていきたいことはたくさんありますが、今いる 人員だけではまだまだ足りません。「誰もがやりたいことを実現できる世界をつく る」ためにも強いエンジニア達に参画していただきたいと思っています!! #ooc_2020 #ooc_a

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