292 Views
April 03, 26
スライド概要
2026/04/02 スパイダープラス Tech Talk(PHPerKaigi 2026 非公式アフターイベント)
https://spiderplus.connpass.com/event/384905/
で話した内容です。
“⽣成AI活⽤だけ“では済まない! ⾼速なバージョンアップの実現奮闘記 2026/04/02 merutin
⾃⼰紹介 公官庁向けシステム開発 → ERPパッケージベンダー → DELTA 特定の技術にこだわらず、お客さんに合わせて何でもやっています。 直近1年くらいの仕事 - VersionUp Booster - CakePHP - Laravel - Ruby on Rails - コスト削減
サービスラインナップ 技術負債解消⽀援 ⽣産性向上⽀援 開発⽀援 システム受託開発 完全成果報酬型インフラコスト削減代⾏サービス エンジニア特化型の採⽤⽀援AIエージェント 要求仕様に合わせたシステム開発〜納品までを実⾏ DELTAの請求代⾏ ⽣成AIエージェント開発 技術アドバイザー 主要クラウドサービスに対応した 法⼈向けの請求代⾏サービス 組織/業務課題の解決に最適な ⽣成AIエージェントを構築‧導⼊サービス 技術顧問でエンジニアリング課題の解決をサポート VersionUp booster クラウドマイグレーション ⾔語やフレームワークの 格安‧⾼速バージョンアップ⽀援サービス 既存システムのクラウド移⾏を計画‧実⾏し、 最適な運⽤環境へ移⾏ Ops booster 24時間365⽇体制でシステム運⽤負担を減らす 包括的システム運⽤⽀援サービス IaC booster IaCコードの実装を格安‧最短2週間で代⾏するサービス FinOps booster クラウド利⽤状況の分析を⾏い、コスト状況の可視化するサービス
プロジェクトの前提 - Cake2 → 最新バージョン - 平⾏で機能開発もどんどん進めている - UTはない。リリース前に決まった⼿順を実⾏している - phploc - 700ファイル以上 - 約30万⾏ - 8000⾏を超えるクラスがちょいちょいある - Fat Model / Fat Controller
プロジェクトの前提 - CakePHP、 PHPを最新まで上げていく - 処理は極⼒変更しない - 並⾏で開発が⾛っていて、順次取り込みが必要 - デグレは許されない
当初の想定 MCPサーバーにChangesの⼀覧をまとめて、該当のソースコードをいったん置換し たら、⼤体バージョンアップできるでしょ
CakePHPの差分について - 件数を数えるのがいやになるくらいは修正が⼊っている - removedで検索すると150個出てくる
CakePHPの差分について
CakePHPの差分について
現実 - そもそもChangesがありすぎる - 単純置換とかそういう問題じゃない - xxは全⾯的に書き換えられました。っていう1⾏のみが書いてあったりする
現実 ⽣成AIに任せてみたところ ## TODO: あとで実装 動きますって⾔って動かない修正ばかりで、絶対に動作しないものが出来上がった
ここからが本当のスタート - CakePHPを触ったことがないので、仕組みを理解するところから始める - 2系、3系、最新 - 余談ですが、⽇本語ドキュメントが最新に追従してなかったので、ちょいちょ いDocにPRしています。
フェーズ - 試⾏錯誤 - 混乱 - ⼤量の修正と保証 - 画⾯の確認
試⾏錯誤 - ⽣成AIに聞いても正しさの判断ができないのでまずはひたすらInput。 - CakePHPのソースもちょいちょい読んだり - ⼿っ取り早く移⾏できるよって⾒せたかったので、特定の画⾯を移⾏してみる - 共通処理の依存が多すぎて⾝動きが取れない - 意図のわからないコードが⼤量にある - AppControllerの処理が10以上のModelに依存している - いったん不要そうな処理はコメントアウトしつつ、ログインまで動くように
試⾏錯誤 - ログインだけ動くようになったものの、次の処理にたどり着けるイメージがわ かない - Sessionにあらゆる値を書き込みしていて、どの値がどのタイミングで利⽤され るのかがわからない - Controller、Model、ViewなどすべてのレイヤーでSession::Readがある - ベースとなるModelのレイヤーをきれいにするように修正を始める
混乱 - Modelの数は⼤体140。UTなし。全くなし。 - いったん動くっぽいもののPRを作ってみるが、何をもってして検証できている といえるのかがわからない謎のコードが⼤量に作成される
⼤量の修正と保証 - Modelの単位でSQLを⽐較できるような仕組みを作成して動的に実⾏できるよう にした - Sessionなどに依存しているため、Controllerを新しく作成した - 今考えると、テストにしてもよかったのかもしれない - SQL単位で違いがないかつ、出⼒が同じである = 移⾏前後で⼀緒の動き - Cake2とCake3ではSQLの出⼒が変わっているので単純⽐較はできない - alias - 複雑な条件の網羅はせずに1つのパターンで期待値が⼀緒なことを確認する - PRを⼤量⽣成
⼤量の修正と保証 - ここまでの情報をSkillsにして、並列で回して⼀気に消化できるようにする - 修正が全然駄⽬なパターンもあるので、全部⽬検でもチェック - Contextサイズが⼤きい = Modelがでかいと出⼒が安定しない - メソッドごとに分割をして、その単位での修正をする - parserを使って分割、メソッド単位でCake3⽅式に移⾏後、もとに戻す - コンテキストが⼤きくなった今では、分割しなくてもある程度動くような気も します
⼤量の修正と保証 - PRの確認も⼤変 - 画⾯での確認はできないこともあり、⽣成AIを使って作成したものを⽣成AI がレビューする - 不具合はめっちゃ出ていますが、1か⽉ちょっとで全部のModelの修正ができた
共通パーツの修正 - AppController, Application, bootstrap, app, AppTable(独⾃拡張)の修正をする - ここがModelに依存しまくっているのと独⾃拡張が多い
共通パーツの修正 - 認証はAuthComponentがdeprecatedになることがわかっていたので、現時点 で載せ替え - Cake2とCake3でセッションが共有できるような修正をする - Cake2側に設定が必要だが、そのくらいで修正はできた
共通パーツの修正 - 認証も独⾃拡張していたので、使えるようにちょっとずついじる - 条件によってusernameのカラムを変えるような処理をやっていた - Authenticationでは⼀度作成してしまうと、固定になるのでちょっと⾯倒な 対応が必要
共通パーツの修正 - Cake2っぽい動作をするConverterをいっぱい作成する - Request - Form - Model → Entity こんなの本当は作成したくない...
ClaudeCodeというか⽣成AIの現時点の限界 - FormのID⽣成ルールが変わったために、js側が盛⼤に壊れた。 - そう、JQueryを使っているのです - Claudeに修正してもらうと、formのID指定、jsの修正やformのデータ形式を修 正するような提案をしてくる - できないことはないけど、コストが⼤きくなりすぎるので、Formをwrapperし てCake2と同じ動きをするように修正をしていく 与えられた課題に対しての解決は賢くできるけど、全体を⾒たときに保守しやすい 仕組みだったり、ちょっとパターンを変えた解決⽅法が苦⼿
画⾯の確認 - 1つのエンドポイントで⼤量の分岐がある - E2Eも⼀部作成したが、更新系が特に動かない - ステータスが200だけど画⾯のエラーになっている - たまたまうまく動くデータだった - 1つのエンドポイントで数時間とける - 都度横展開しているとはいえ、全然つぶしきれない - int !== stringの⽐較 - array / Entity - 意図してなかったvalidation
画⾯の確認 - ちょっとの修正がModel, controller, viewのすべてに影響が出る - 今更だが、PHPStanで型のエラーは根絶する⽅向に - level5でめっちゃwarningが出てきた - array/Entityの部分の変なところは⼤体みつけてくれた - 修正したものがどのくらい動くのかなっていうのはこれから
まとめ - ⽣成AIを使っても、難しいものは難しい - テストないので⽣成AIの修正が正しいのかもわからない - ⼈がどこの責任を取るのかが重要であり、ボトルネックになる - PRのチェック、動作保証 - ⽅針さえちゃんとすれば、80点くらいまでは⽣成AIに全部任せても何とかなる - 残りの20点が⼤変 - 現時点のClaudeは与えた問題を解くのは得意だが、本来やりたいこととしては もうちょっと上段での修正なので、意識しないといけない