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

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

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

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

Transcript

  1. デフォルト値を変えたいだけなのに
    ~ ストラングラーパターンの実践 ~
    2023年06月08日
    浦中 佐保子

    View full-size slide

  2. 2
    経歴
    2021年コドモンに入社。技術負債に向き合ってもうすぐ2年。
    バックエンド開発と高校野球が好き。
    自己紹介
    浦中 佐保子 うらなか さおこ
    2021.07 コドモンに開発エンジニアとして入社
    2021.10 プロダクト開発チームのマネージャーになる

    View full-size slide

  3. 4
    すべての先生に 子どもと向き合う
    時間と心のゆとりを
    こんなプロダクトを開発しています
    メインプロダクトは、保育・教育施設向けWebアプリケーション。
    保護者と施設のやり取りを支えるモバイルアプリケーションや、施設職員向けモバイル版
    アプリケーション、外部サービスと連携するAPIなども開発しています。

    View full-size slide

  4. 5
    技術負債あるある

    View full-size slide

  5. 6
    システムのデフォルト値を変えたい!

    View full-size slide

  6. 7
    だけなのにめっちゃ大変

    View full-size slide

  7. 8
    今日話すこと
    どんな負債を抱えていたか
    どうやって負債を返すことにしたのか
    反省と学び
    1
    2
    3

    View full-size slide

  8. 9
    ● プロダクト全体の技術負債返済戦略
    今日話さないこと

    View full-size slide

  9. 10
    今日話すこと
    どんな負債を抱えていたか
    どうやって負債を返すことにしたのか
    学びと反省
    1
    2
    3

    View full-size slide

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

     
    その上で…

    View full-size slide

  11. 12
    OK! デフォルト値を変えればいいのね!

    View full-size slide

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

    View full-size slide

  13. 14
    CONFIDENTIAL - © 2022 CoDMON Inc. 14
    1. どんな負債を抱えていたか
    ビジネス面の高い壁
    ● 価格のパターンが複雑で、全部で最大16パターン * nサイズ
    ● 顧客のトランザクションデータの状態も様々。
     どのデータをどの値に更新すればいいのかすぐにわからない……
     

    View full-size slide

  14. 15
    OK! デフォルト値を変えれば……

    View full-size slide

  15. 16
    どうやって???????

    View full-size slide

  16. 17
    今日話すこと
    どんな負債を抱えていたか
    どうやって負債を返すことにしたのか
    学びと反省
    1
    2
    3

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  23. 24
    ロジックが散らばってて複雑! 整理したい!

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  26. 27
    ビジネスロジックの複雑度を下げて……

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  33. 34
    いったん既存ロジックは整理できた!

    View full-size slide

  34. 35
    まだDBの問題が……

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  38. 39
    CONFIDENTIAL - © 2022 CoDMON Inc. 39
    Step2. 新規マイクロサービスの構築とDBのリモデル
    ● 今後もし価格周りのビジネス的変更があってもすぐに対応できるように、
      DBレイヤーを再設計
     
    2. どうやって負債を返すことにしたのか

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  41. 43
    ロジックとDBをリプレイスできた!

    View full-size slide

  42. 44
    次は既存プロダクトと繋ぎたい……

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  50. 52
    今日話すこと
    どんな負債を抱えていたか
    どうやって返すことにしたのか
    学びと反省
    1
    2
    3

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  55. 58
    技術負債との戦い方
    ● 教科書に書いてあるような普通のことを
      地道にやっていく以外の魔法はない
    ● でも、地道にやれば元金を返すことは不可能じゃない
    ● テストを書いて、リファクタして、必要に応じて仕様変更する 
    一番伝えたいこと

    View full-size slide

  56. 59
    ちなみに

    View full-size slide

  57. 60
    コドモン採用ページ 開発ブログ
    コドモンでは一緒に働きたい仲間を募集しています!

    View full-size slide

  58. 61
    コドモンプロダクト開発チームが取り組む
    重要課題🐰2023年度ver🐰

    View full-size slide

  59. 62
    ご清聴ありがとうございました!

    View full-size slide