Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

3 Mission

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

5 技術負債あるある

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

16 どうやって???????

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

35 まだDBの問題が……

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

40 加えて

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

57 最後に

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

59 ちなみに

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

No content