「システムは動いている。しかし、中身は誰も触りたくないスパゲッティ状態…。」
そんな絶望的な状況を引き継いだとき、律儀にコードを1行ずつ読んでいくのは時間の無駄です。迷路のようなコードを効率よく解読し、影響範囲を特定するための「時間をかけないリバースエンジニアリング」の戦術を解説します。
スパゲッティコードの特徴は、関数がどこで呼ばれているか、データの流れがどうなっているかが静的なコード(文字面)だけでは追えない点にあります。
まずは、Xdebug(PHP)やVS Codeのデバッガを活用し、ステップ実行で「今どのファイルを通過したか」をリアルタイムで追いましょう。これだけで、読むべきコードが全体の10%程度に絞り込めます。
迷路を歩く前に、空からドローンで撮影して地図を作りましょう。手作業で図解するのは時間がかかりすぎます。以下のツールを使って視覚化を自動化します。
| 手法 | おすすめツール | 得られるもの |
|---|---|---|
| コールグラフ | Doxygen, PHPCallGraph | 関数同士の呼び出し関係図 |
| ER図自動生成 | MySQL Workbench, DBeaver | データベースのテーブル関連図 |
| プロファイリング | New Relic, XHProf | 処理に時間がかかっている箇所の特定 |
今や、解読の最大の味方はAI(ChatGPT, Claude, GitHub Copilot)です。ただし、「全部読んで」と頼むのではなく、パーツごとに要約させるのがコツです。
効果的なプロンプト例:
「この300行の関数の中で、最終的にDBを更新している箇所と、その条件分岐だけを箇条書きで抜き出して」
意味不明な変数名($data1, $tmp_arrayなど)をAIに渡し、「まともな命名にリファクタリングしたコードを書いて」と頼むことで、元のコードが何をしようとしていたのかが驚くほど明確になります。
ドキュメントがないなら、今現在の動きを「仕様」として固定してしまいます。これをキャラクタライゼーションテスト(現状維持テスト)と呼びます。
これが、壊すリスクを最小限にして「中身を触れる状態」にする最短ルートです。
どうしても処理の流れが追えないときは、主要な関数の入り口と出口に、これでもかというほどログを仕込みます。
logger("DEBUG_POINT_1: " . json_encode($params));
// ... 謎の処理 ...
logger("DEBUG_POINT_2: " . json_encode($result));
実行後にログを時系列で眺めるだけで、どの条件分岐を通って、どこでデータが化けたのかが浮き彫りになります。
スパゲッティコードの解読で一番やってはいけないのは、「すべてを理解しようとすること」です。
「動いている」という事実を最大限に利用し、ツールの力を借りて、賢く省エネで攻略していきましょう。