Upgrade to Pro — share decks privately, control downloads, hide ads and more …

デフォルト値を変えたいだけなのに ~ ストラングラーパターンの実践 ~

デフォルト値を変えたいだけなのに ~ ストラングラーパターンの実践 ~

More Decks by コドモン開発チーム

Transcript

  1. 11 CONFIDENTIAL - © 2022 CoDMON Inc. 11 プロジェクト概要 1.

    どんな負債を抱えていたか • toBtoCで写真販売の機能を提供している • 写真サイズごとに原価が決まっている • 写真サイズごとに施設が販売価格を決めることができる 写真の原価の高騰などを受け、デフォルトの最低販売価格などを改定した い   その上で…
  2. 13 CONFIDENTIAL - © 2022 CoDMON Inc. 13 1. どんな負債を抱えていたか

    技術面の高い壁 • デフォルト価格 = マスタデータのはず……   だが顧客ごとのデータとしてDBに保存されている • 価格が保存されているテーブルがいわゆるEAV(Entity Attribute Value)に  なっていて、価格以外のデータも一緒に保存されている • アプリケーションコードが適切にレイヤ分けされておらず、   Controllerが直接クエリを発行することも。 • 手続型のソースになっていて、変更の影響範囲がわかりにくい
  3. 14 CONFIDENTIAL - © 2022 CoDMON Inc. 14 1. どんな負債を抱えていたか

    ビジネス面の高い壁 • 価格のパターンが複雑で、全部で最大16パターン * nサイズ • 顧客のトランザクションデータの状態も様々。  どのデータをどの値に更新すればいいのかすぐにわからない……  
  4. 18 CONFIDENTIAL - © 2022 CoDMON Inc. 18 2. どうやって負債を返すことにしたのか

    返済計画 ① 現行プロダクトをリファクタリングし、   価格取得・更新ロジックのインターフェースを作成する  
  5. 19 CONFIDENTIAL - © 2022 CoDMON Inc. 19 2. どうやって負債を返すことにしたのか

    返済計画 ① 現行プロダクトをリファクタリングし、   価格取得・更新ロジックのインターフェースを作成する ② 新規マイクロサービスを構築し、価格取得・更新ロジックのリプレイスと   DBの再設計・マイグレーションを行う
  6. 20 CONFIDENTIAL - © 2022 CoDMON Inc. 20 2. どうやって負債を返すことにしたのか

    返済計画 ① 現行プロダクトをリファクタリングし、   価格取得・更新ロジックのインターフェースを作成する ② 新規マイクロサービスを構築し、価格取得・更新ロジックのリプレイスと   DBの再設計・マイグレーションを行う ③ 現行プロダクトからマイクロサービスへの実装の切り替え
  7. 21 CONFIDENTIAL - © 2022 CoDMON Inc. 21 2. どうやって負債を返すことにしたのか

    返済計画 ① 現行プロダクトをリファクタリングし、   価格取得・更新ロジックのインターフェースを作成する ② 新規マイクロサービスを構築し、価格取得・更新ロジックのリプレイスと   DBの再設計・マイグレーションを行う ③ 現行プロダクトからマイクロサービスへの実装の切り替え ④ (マイクロサービスでデフォルト価格を変更する!)
  8. 22 CONFIDENTIAL - © 2022 CoDMON Inc. 22 2. どうやって負債を返すことにしたのか

    返済計画 ① 現行プロダクトをリファクタリングし、   価格取得・更新ロジックのインターフェースを作成する ② 新規マイクロサービスを構築し、価格取得・更新ロジックのリプレイスと   DBの再設計・マイグレーションを行う ③ 現行プロダクトからマイクロサービスへの実装の切り替え ④ (マイクロサービスでデフォルト価格を変更する!)
  9. 23 CONFIDENTIAL - © 2022 CoDMON Inc. 23 2. どうやって負債を返すことにしたのか

    返済計画 Step1   現行プロダクト (モノリス) 価格取得・更新 価格取得・更新 価格取得・更新
  10. 25 CONFIDENTIAL - © 2022 CoDMON Inc. 25 2. どうやって負債を返すことにしたのか

    Step1. ドメインモデルの整理 • そもそもドメインモデル図がどこにもなかった • メンバーで認識を揃えて、正しいインターフェースを決めるために   ドメインモデルを整理  
  11. 26 CONFIDENTIAL - © 2022 CoDMON Inc. 26 2. どうやって負債を返すことにしたのか

    Step1. 一部価格パターンの廃止 • 価格パターンの複雑度を下げたい話はビジネス側とも共通認識があった • 現状のモデルを整理した結果、実際に廃止できそうなパターンが見つかった • 廃止しても良さそうなパターンについてビジネス側の意思決定をサポート   する数字を出して (ex: 対象はn施設で売り上げベースだとm円くらい差額が出る)、   一部パターンを廃止
  12. 28 CONFIDENTIAL - © 2022 CoDMON Inc. 28 2. どうやって負債を返すことにしたのか

    返済計画 Step1   現行プロダクト (モノリス) 価格取得・更新 価格取得・更新 価格取得・更新
  13. 29 CONFIDENTIAL - © 2022 CoDMON Inc. 29 返済計画 Step1

      2. どうやって負債を返すことにしたのか 現行プロダクト (モノリス) 価格取得・更新 価格取得・更新 価格取得・更新 現行プロダクト (モノリス) 価格取得・更新
  14. 30 CONFIDENTIAL - © 2022 CoDMON Inc. 30 2. どうやって負債を返すことにしたのか

    Step1. 実際のリファクタリングイメージ(Before)   Controllerで設定テーブルの 中身を全部取って…… 設定レコード分ループ 設定レコードのnameが価格の labelかどうかをチェック…… 価格の設定レコードだったら 価格の配列を作る! その他、価格以外の設定 レコードについても同様
  15. 31 CONFIDENTIAL - © 2022 CoDMON Inc. 31 2. どうやって負債を返すことにしたのか

    Step1. 実際のリファクタリングイメージ(Before)   価格以外の設定については 変わらないけど…… 価格のDBの事情は リポジトリ層に閉じ込められた! 価格取得のロジックも リポジトリ内に集約できた
  16. 32 CONFIDENTIAL - © 2022 CoDMON Inc. 32 2. どうやって負債を返すことにしたのか

    Step1. リファクタリングのリリース • DBにフィーチャーフラグを管理するテーブルを用意 • リリース対象の顧客idを順次テーブルにinsertしていく • 十分な数の顧客にリリースして、その時点で問い合わせや不具合が  なさそうであれば全開放
  17. 33 CONFIDENTIAL - © 2022 CoDMON Inc. 33 2. どうやって負債を返すことにしたのか

    返済計画 Step1   現行プロダクト (モノリス) 価格取得・更新 価格取得・更新 価格取得・更新 現行プロダクト (モノリス) 価格取得・更新
  18. 36 CONFIDENTIAL - © 2022 CoDMON Inc. 36 2. どうやって負債を返すことにしたのか

    返済計画 ① 現行プロダクトをリファクタリングし、   価格取得・更新ロジックのインターフェースを作成する ② 新規マイクロサービスを構築し、価格取得・更新ロジックのリプレイスと   DBの再設計・マイグレーションを行う ③ 現行プロダクトからマイクロサービスへの実装の切り替え ④ (マイクロサービスでデフォルト価格を変更する!)
  19. 37 CONFIDENTIAL - © 2022 CoDMON Inc. 37 2. どうやって負債を返すことにしたのか

    返済計画 Step2   現行プロダクト (モノリス) 価格取得・更新
  20. 38 CONFIDENTIAL - © 2022 CoDMON Inc. 38 2. どうやって負債を返すことにしたのか

    返済計画 Step2   現行プロダクト (モノリス) 新規 マイクロ サービス 価格取得・更新
  21. 39 CONFIDENTIAL - © 2022 CoDMON Inc. 39 Step2. 新規マイクロサービスの構築とDBのリモデル

    • 今後もし価格周りのビジネス的変更があってもすぐに対応できるように、   DBレイヤーを再設計   2. どうやって負債を返すことにしたのか
  22. 41 CONFIDENTIAL - © 2022 CoDMON Inc. 41 2. どうやって負債を返すことにしたのか

    Step2. サーバー側のロジックのリプレイス • 現行プロダクトはPHPで書かれた巨大なモノリス • デプロイを高頻度で行うことができない、   リリースやロールバックを独立して行えない等々の理由から、   マイクロサービスとして切り出すことに
  23. 42 CONFIDENTIAL - © 2022 CoDMON Inc. 42 2. どうやって負債を返すことにしたのか

    返済計画 Step2   現行プロダクト (モノリス) 新規 マイクロ サービス 価格取得・更新 価格取得・更新
  24. 45 CONFIDENTIAL - © 2022 CoDMON Inc. 45 2. どうやって負債を返すことにしたのか

    返済計画 ① 現行プロダクトをリファクタリングし、   価格取得・更新ロジックのインターフェースを作成する ② 新規マイクロサービスを構築し、価格取得・更新ロジックのリプレイスと   DBの再設計・マイグレーションを行う ③ 現行プロダクトからマイクロサービスへの実装の切り替え ④ (マイクロサービスでデフォルト価格を変更する!)
  25. 46 CONFIDENTIAL - © 2022 CoDMON Inc. 46 2. どうやって負債を返すことにしたのか

    返済計画 Step2   現行プロダクト (モノリス) 新規 マイクロ サービス 価格取得・更新 価格取得・更新
  26. 47 CONFIDENTIAL - © 2022 CoDMON Inc. 47 2. どうやって負債を返すことにしたのか

    返済計画 Step2   現行プロダクト (モノリス) 新規 マイクロ サービス 価格取得・更新 価格取得・更新 データ 同期 バッチ
  27. 48 CONFIDENTIAL - © 2022 CoDMON Inc. 48 2. どうやって負債を返すことにしたのか

    Step3. マイクロサービスへのマイグレーション • まずは新しく作成したDBへのマイグレーション • マイグレーションバッチの構成自体は、   社内にすでにナレッジがあったのでそれを再利用  (参考に弊社のDevelopers Summit登壇時の記事にQRコードから飛べます!) • 現行プロダクトはそのままに、  新しく作成したサービスにいったんデータを流す
  28. 49 CONFIDENTIAL - © 2022 CoDMON Inc. 49 2. どうやって負債を返すことにしたのか

    返済計画 Step2   現行プロダクト (モノリス) 新規 マイクロ サービス 価格取得・更新 価格取得・更新 データ 同期 バッチ
  29. 50 CONFIDENTIAL - © 2022 CoDMON Inc. 50 2. どうやって負債を返すことにしたのか

    返済計画 Step2   現行プロダクト (モノリス) 新規 マイクロ サービス 価格取得・更新 価格取得・更新 データ 同期 バッチ OK!
  30. 51 CONFIDENTIAL - © 2022 CoDMON Inc. 51 2. どうやって負債を返すことにしたのか

    返済計画 Step2   現行プロダクト (モノリス) 新規 マイクロ サービス 価格取得・更新 価格取得・更新 データ 同期 バッチ
  31. 53 CONFIDENTIAL - © 2022 CoDMON Inc. 53 3. 学びと反省

    学びその1 • 負債が重すぎるとついつい「全部作り直し!」したくなるけど、   コアな場所を部分的に置き換えていくほうが結果として  価値提供と負債の返済を両立できる ※ ただし、システム全体としてのあるべきなコンテキストマップは先に作っておいた方   が良さそう。部分的な作り直しの積み重ねで結果コンテキスト境界間違ってた……   なんてことにならないために
  32. 54 CONFIDENTIAL - © 2022 CoDMON Inc. 54 3. 学びと反省

    学びその2 • ビジネス的な負債も技術負債の一部 • ビジネスサイドと一緒に技術負債に向き合えると、   よりシンプルに負債を返済できる(こともある) • ドメイン整理は絶対にビジネスサイドと一緒にやるべき! ※ もちろん、紆余曲折あってビジネスが複雑化してしまっているだけ。   その時その時の最適解の結果が今「負債」化しているに過ぎない
  33. 55 CONFIDENTIAL - © 2022 CoDMON Inc. 55 3. 学びと反省

    学びその3 • 現行の安全なリファクタを経るには、   テストピラミッドが変な形になってしまうのは仕方ない? • E2Eテストが多いとCIの不安定化やテストのメンテナンス工数の増加に   つながりそうなので、リファクタリングや置き換えに伴って   徐々に単体テストに役割を寄せていければ良さそう  
  34. 56 CONFIDENTIAL - © 2022 CoDMON Inc. 56 3. 学びと反省

    反省 • 技術負債、どこまで返す? のプランはいくつか持っておいたほうが良い • プラン1つで突き進んだ結果、   プロジェクトの期日を踏まえた戦略切り替えにバタついてしまった……