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

移行できそうでやりきれなかった 10年超えのシステムを葬るための戦略 / phper-kaig...

移行できそうでやりきれなかった 10年超えのシステムを葬るための戦略 / phper-kaigi-2025-ryu

プロポーザル: https://fortee.jp/phperkaigi-2025/proposal/0b6a029d-27d6-49c7-965e-beef885c0294

私はアドテクノロジーを扱う会社で、広告配信の制御や入稿を行うための管理システムの開発を行っています。そのシステムでは社内用の広告配信設定の管理、メディア用レポート閲覧、広告配信設定機能が行えます。

歴史的経緯から3つの管理システムが存在してます。

10年以上の歴史を持つ古い社内・社外向け管理システム(PHP + CodeIgniter)
社内向け新管理システム(PHP + Slim)
社外向け新管理システム(Go)
1番のシステムは10年以上保守運用されており、システムも運用も把握しきれない部分が多く、フレームワークの保守も厳しくなってきました。過去に何度も古い管理システムを葬ろうと挑んでは、志半ばで取り組みが終わることを繰り返してきていました。今回、古い管理システム の葬りが完了する目処が立ちました。

今回の発表では、 「過去、なぜ、移行しきれなかったのか」、「今回、なぜ、移行の目処が建てられたのか」、「今回の移行戦略」 をお話します。

具体的には以下の戦略を取りました。

ロードマップを作成
ステークホルダーに宣言
移行をやり切るためのサポート(ヒアリング、移行アナウンスや進捗の分かるシートへのリンクを表示)
旧管理画面の解像度を上げる工夫(Xdebug によるデバッガ、OpenTelemetry + Jaeger による SQL ログなど)
自動テストの拡充
聞いてほしい人

長年改修されてきたシステムのリプレイスや移行を考えている人
移行タスクが志半ばで終わった経験がある人
フルサイクル開発の仕事の進め方に興味がある人

CARTA Engineering

March 22, 2025
Tweet

More Decks by CARTA Engineering

Other Decks in Technology

Transcript

  1. • 2020年 ◦ 新卒でCARTA HOLDINGSに⼊社 ◦ ポイントメディアを扱うDIGITALIOに配属 • 2023年 ◦

    アドテクノロジーを扱うfluctに異動 ◦ 広告配信の設定などを⾏う管理画⾯の開発‧保守をしている 略歴 株式会社fluct 所属 ⽯河 ⻯太 fluct メディア 広告配信をする プラットフォームを提供 fluct経由で広告を表示 fluctのプロダクトの簡単な説明
  2. 10年超えの管理画面のCodeIgniter.php /** * CodeIgniter * * An open source application

    development framework for PHP 4.3.2 or newer * * @package CodeIgniter * @author ExpressionEngine Dev Team * @copyright Copyright (c) 2008 - 2010, EllisLab, Inc. * @license http://codeigniter.com/user_guide/license.html * @link http://codeigniter.com * @since Version 1.0 * @filesource */ // CI Version /** @noinspection PhpUnused */ const CI_VERSION = '1.7.3';
  3. 10年超えの管理画面のCodeIgniter.php /** * CodeIgniter * * An open source application

    development framework for PHP 4.3.2 or newer * * @package CodeIgniter * @author ExpressionEngine Dev Team * @copyright Copyright (c) 2008 - 2010, EllisLab, Inc. * @license http://codeigniter.com/user_guide/license.html * @link http://codeigniter.com * @since Version 1.0 * @filesource */ // CI Version /** @noinspection PhpUnused */ const CI_VERSION = '1.7.3'; 2003年リリース 2010年リリース バージョン 1系... 最新は4.6.0 (2025/03時点)
  4. 01. どうしてこうなった どうして管理画⾯が3つもあるのか 旧管理画面 現社内向け管理画面 現社外向け管理画面 作られた時期 2008年ごろ 2014年ごろ 2023年

    バックエンド PHP + CodeIgniter PHP + Slim Go フロントエンド twig React Next.js 補足: 社外向け = メディア向け。広告がどれくらい表示、クリック、収益があったかのレポートを見たり、配信に関する設定ができる。 冒頭のCodeIgniter 1.7.3の 管理画面 あとから生まれた管理画面
  5. DB 旧管理画面 現社内向け 管理画面 現社外向け 管理画面 PHP8.1 コンテナ Go コンテナ

    PHPはコンテナ共通 全部同じ DBを 見ている 01. どうしてこうなった どうして管理画⾯が3つもあるのか
  6. 01. どうしてこうなった 創⽴当初管理画⾯は1つだった(2008〜) 旧管理画面 作られた時期 2008年ごろ バックエンド PHP + CodeIgniter

    フロントエンド twig 社内も社外も この画面で操作していた 旧管理画面が 生まれた
  7. 01. どうしてこうなった 会社をまたいだ操作がしたくなった(2014ごろ) サイト1 サイト一覧 サイト2 サイト3 サイト4 サイト1 A社

    サイト2 サイト3 B社 サイト4 fluctに登録されている全てのサイトを 一覧したいというニーズが登場
  8. 01. どうしてこうなった 社内管理画⾯が⽣まれた(2014〜) 旧管理画面 現社内向け管理画面 作られた時期 2008年ごろ 2014年ごろ バックエンド PHP

    + CodeIgniter PHP + Slim フロントエンド twig React 社内のオペレーションは 「基本的に」ここで 行われるようになった 現社内向け管理画面が 生まれた 現社内向け管理画面が 生まれた
  9. 01. どうしてこうなった 社内管理画⾯が⽣まれた(2014〜) 旧管理画面 現社内向け管理画面 作られた時期 2008年ごろ 2014年ごろ バックエンド PHP

    + CodeIgniter PHP + Slim フロントエンド twig React 社内のオペレーションは 「基本的に」ここで 行われるようになった 一部の社内向け機能が 旧管理画面にまだある 社外ユーザ → 旧管理画面 社内ユーザ → 旧管理画面 + 現社内向け管理画面 現社内向け管理画面が 生まれた
  10. 01. どうしてこうなった 旧管理画⾯の限界がきた(2022年ごろ) 旧管理画面 現社内向け管理画面 作られた時期 2008年ごろ 2014年ごろ バックエンド PHP

    + CodeIgniter PHP + Slim フロントエンド twig React 旧管理画面が見づらい 多言語対応など新しく やりたいことが増えてきた
  11. 01. どうしてこうなった 旧管理画⾯の限界がきた(2022年ごろ) 旧管理画面 現社内向け管理画面 作られた時期 2008年ごろ 2014年ごろ バックエンド PHP

    + CodeIgniter PHP + Slim フロントエンド twig React 旧管理画面が見づらい アーキテクチャ 古すぎて辛い 多言語対応など新しく やりたいことが増えてきた
  12. 01. どうしてこうなった 社外向け管理画⾯が⽣まれた(2023〜) 旧管理画面 現社内向け管理画面 現社外向け管理画面 作られた時期 2008年ごろ 2014年ごろ 2023年

    バックエンド PHP + CodeIgniter PHP + Slim Go フロントエンド twig React Next.js 社外のオペレーションは 「基本的に」ここで 行われるようになった
  13. 01. どうしてこうなった 社外向け管理画⾯が⽣まれた(2023〜) 旧管理画面 現社内向け管理画面 現社外向け管理画面 作られた時期 2008年ごろ 2014年ごろ 2023年

    バックエンド PHP + CodeIgniter PHP + Slim Go フロントエンド twig React Next.js 一部の社外向け機能も 旧管理画面にまだある 社外のオペレーションは 「基本的に」ここで 行われるようになった 社外ユーザ → 旧管理画面 + 現社外向け管理画面 社内ユーザ → 旧管理画面 + 現社内向け管理画面
  14. 01. どうしてこうなった 管理画⾯が3つになってしまった 旧管理画面 現社内向け管理画面 現社外向け管理画面 作られた時期 2008年ごろ 2014年ごろ 2023年

    バックエンド PHP + CodeIgniter PHP + Slim Go フロントエンド twig React Next.js 社内、社外向けの機能が残っていため 使わざる得ない 本来はこの 2つで十分なはず
  15. 広告設定を更新する処理 // 旧管理画面の処理(配信される) $result = $this->oldRepository->update( $id, $name, $url, 1,

    ); // 現社内向け管理画面の処理(配信されない) $result = $this->newRepository->update( $id, $name, $url, null, ); • 本来値が入ってあるべきところに社内向け管理画面はnullになっていた • 広告配信に必須なパラメータだったため、配信ができなくなっていた こっちは 1 こっちは null
  16. 01. どうしてこうなった 旧管理画⾯を葬りたい 旧管理画面 現社内向け管理画面 現社外向け管理画面 作られた時期 2008年ごろ 2014年ごろ 2023年

    バックエンド PHP + CodeIgniter PHP + Slim Go フロントエンド twig React Next.js 旧管理画面の機能をあるべきところに移して 旧管理画面を葬りたい
  17. • 難易度が高い ◦ 旧管理画面のコードを読み解いて移植するのが大変 • そもそも、問題が山積みでその対応に時間がかかっていた ◦ CodeIgniter 1.7.2をベースにしているのでセキュリティの問題があり 本家のセキュリティパッチの取り込み

    ◦ オンプレからクラウドへの移行 ◦ 認証認可の仕組みの整備 ◦ テンプレートエンジンをクライアントとAPIに分離 01. どうしてこうなった なんで葬れなかったんだっけ? 志半ばでプロジェクトが終わっていた
  18. • 去年の10月くらいから計画が始まり12月から本格着手 ◦ 基本的には私を含めて2人で進めていた • 着手時点で旧管理画面に33の機能が残っていた • 2024/12 から 2025/03

    の間に私は 33,364行 追加して 32,688行 葬っていた 02. 旧管理画面を葬った 旧管理画⾯を葬れそう 補足: 自動生成と思われるコードをざっくり省いたら追加 29,624、削除18,866だった。 旧管理画面 現社内向け管理画面 現社外向け管理画面 作られた時期 2008年ごろ 2014年ごろ 2023年 バックエンド PHP + CodeIgniter PHP + Slim Go フロントエンド twig React Next.js
  19. • 実行した戦略 ◦ 計画を立てる ▪ スケジュールを決める ▪ WBSを作る ◦ 対話をする

    ▪ 運用者と開発者双方と対話をする ◦ デバッグ環境を整える • どういう課題があったのか、なにをしたか、どうだったかを話していく 03. 実行した戦略と振り返り 実⾏した戦略と振り返り
  20. 03. 実行した戦略と振り返り 締め切りを作った • 時間の荒ぶりを抑えることができた • 次はスコープが立ちはだかってくる 荒ぶる四天王[1] [1] JonathanRasmusson

    ; 西村直人; 角谷信太郎. アジャイルサムライ――達人開発者への道 (p.136). オーム社. Kindle 版. 抑えることができた 立ちはだかってくる
  21. • みんなが困っていた ◦ 運用コストも高いし、決まった担当者はもういない ◦ 現管理画面への移行コストも高い • その機能を適切な状態にしたかった ◦ また力を入れると決めて、担当者を決めて、移行をする

    ◦ もう力を入れないと決めて、機能自体を停止して、移行をしない 03. 実行した戦略と振り返り 課題感 ビジネスフローを見直す必要があり、自分だけでは決められなかった
  22. • ビジネスフローを変える判断ができるステークホルダーを巻き込んで    対話をした • 葬りたい旨を最初にステークホルダーに伝えた ◦ 「使います?」だと「使います」と回答されてしまいがち ◦ 「葬りたいです」とコミュニケーションをスタートした •

    集めた事実に加えて機能の代替案を用意した ◦ どうしてもやりたくなったら                    コストはかかるが同等のことはできる状況は残した 03. 実行した戦略と振り返り ステークホルダーを巻き込んだ
  23. • 塩漬けされていた旧管理画面の処理を愚直に追うのはつらすぎる ◦ テストコードから処理を逆算しようにもテストコードがない ◦ fatなController ◦ テンプレートエンジンなのも相まって、時代を感じるソースコード • 大事な機能が残っているので実装漏れを起こしたら一大事

    03. 実行した戦略と振り返り 課題感 どんな処理をしているかを 知りたいだけなのに … 補足: Controllerに直接SQLが書かれていたりもした。社外、社内共用の管理画面だったので権限の分岐もたくさんあった。
  24. 03. 実行した戦略と振り返り デバッグ環境を整えた • サービスやアプリケーションのテレメトリデータを計装、生成、収集、 送信するためのオブザーバビリティフレームワーク ◦ テレメトリデータ = トレース、メトリクス、ログなど

    • 受信して、加工して、送信するものなので、単体ではテレメトリデータを  可 視化できない • トレースを収集して、Webベースの分析UIを提供するOSS 補足: OTel+Jaegerの詳しい説明と導入は https://blog.shin1x1.com/entry/php-opentelemetry-primer が参考になりました
  25. 03. 実行した戦略と振り返り デバッグ環境を整えた PHPアプリケーション ② APIが呼ばれる ⑤ テレメトリデータの送信 ④ テレメトリーデータの送

    信 ③ テレメトリデータを 生成 ① 管理画面で操作 ⑥ テレメトリーデータをブラ ウザで確認 ① 管理画面で操作
  26. 03. 実行した戦略と振り返り デバッグ環境を整えた PHPアプリケーション ② APIが呼ばれる ⑤ テレメトリデータの送信 ④ テレメトリーデータの送

    信 ③ テレメトリデータを 生成 ① 管理画面で操作 ⑥ テレメトリーデータをブラ ウザで確認 ② APIが呼ばれる
  27. 03. 実行した戦略と振り返り デバッグ環境を整えた PHPアプリケーション ② APIが呼ばれる ⑤ テレメトリデータの送信 ④ テレメトリーデータの送

    信 ③ テレメトリデータを 生成 ① 管理画面で操作 ⑥ テレメトリーデータをブラ ウザで確認 ③ テレメトリデータを 生成
  28. 03. 実行した戦略と振り返り デバッグ環境を整えた PHPアプリケーション ② APIが呼ばれる ⑤ テレメトリデータの送信 ④ テレメトリーデータの送

    信 ③ テレメトリデータを 生成 ① 管理画面で操作 ⑥ テレメトリーデータをブラ ウザで確認 ④ テレメトリーデータの送 信
  29. 03. 実行した戦略と振り返り デバッグ環境を整えた PHPアプリケーション ② APIが呼ばれる ⑤ テレメトリデータの送信 ④ テレメトリーデータの送

    信 ③ テレメトリデータを 生成 ① 管理画面で操作 ⑥ テレメトリーデータをブラ ウザで確認 ⑤ テレメトリデータの送信
  30. 03. 実行した戦略と振り返り デバッグ環境を整えた PHPアプリケーション ② APIが呼ばれる ⑤ テレメトリデータの送信 ④ テレメトリーデータの送

    信 ③ テレメトリデータを 生成 ① 管理画面で操作 ⑥ テレメトリーデータをブラ ウザで確認 ⑥ テレメトリーデータをブラ ウザで確認
  31. 03. 実行した戦略と振り返り デバッグ環境を整えた(余談) PHPアプリケーション ② APIが呼ばれる ⑤ テレメトリデータの送信 ④ テレメトリーデータの送

    信 ③ テレメトリデータを 生成 ① 管理画面で操作 ⑥ テレメトリーデータを DATADOGで確認 最後のテレメトリーデータを扱う部分は 任意の分析ツールに置き換えることもできる
  32. • 葬るのは難しい ◦ 直接的なお金にならない ◦ 本当に葬って良いんだっけ? ◦ KIAIでやっていくしかない • 今、移行しきれなかったプロジェクトを持っている人たち

    ◦ 葬りプロジェクトを立ち上げて頑張ってほしい 04. 最後に 最後に 補足: KIAI(気合)はCARTAの社内用語(?)。気持ちをいれるときに単語を UPPERで表現をする。類義語 : YARUKI。
  33. • どうしてこうなった ◦ fluctは歴史的経緯で管理画面が3つになった ◦ 一番古い管理画面は10年以上まえに作られたもので、その管理画面を葬りたかった • 戦略を立てて旧管理画面葬った ◦ 計画を立てる

    ▪ 締め切りを作る ▪ WBSを作る ◦ 開発者と運用者双方と対話をする ◦ デバッグ環境を整える ▪ OpenTelemetry + Jaegerを導入 移行できそうでやりきれなかった 10年超えのシステムを葬るための戦略 まとめ