PHP 8.0で文字列と数値のあいまい比較の挙動が変更され、0 == "foo" は true から false を返すようになりました。
この変更に対し、20年以上開発が続く当社の巨大なコードベースでは影響範囲をコードレビューやテストだけで把握しきれませんでした。
そこでPHP本体のCソースコードを修正し、PHP 7.4と8.0の比較処理を同時に実行して結果の差異を検知する互換パッチを構築することで、安全にバージョンアップを進めました。
詳細は当社 akamah の過去の登壇資料をご覧ください: https://speakerdeck.com/akamah/20nian-mononoju-da-regasipurodakutowo-php-8-dot-0niatupudetositaji-nodui-ce-tode-raretazhi-jian?slide=38
しかし導入から3年、お世話になった互換パッチ自体が次のバージョンアップを阻む技術的負債になっていました。残ったあいまい比較を全件レビューするのは現実的ではありません。
そこで nikic/php-parser で数万箇所のあいまい比較を抽出し、両辺の型が静的に決まらないものや外部入力由来の変数を含むものをパターン分類し、アプリケーションのどこで使われているかと業務影響の大きさを軸にリスクを分類し、確認すべき数百件まで絞り込んで互換パッチを外していきました。
仕様変更のリスクをどう見極め、技術的負債を外していったか。
影響範囲が見えないとき、どう安全に前へ進むか。リスク分析で前へ進んだ実践をお話しします!!