2026.03.25【絶望を希望へ】スパゲッティコードを最短で解読するリバースエンジニアリング実践術TECH BLOG

  • HOME
  • TECH BLOG
  • 【絶望を希望へ】スパゲッティコードを最短で解読するリバースエンジニアリング実践術

「システムは動いている。しかし、中身は誰も触りたくないスパゲッティ状態…。」

そんな絶望的な状況を引き継いだとき、律儀にコードを1行ずつ読んでいくのは時間の無駄です。迷路のようなコードを効率よく解読し、影響範囲を特定するための「時間をかけないリバースエンジニアリング」の戦術を解説します。


1. 「静的解析」より「動的解析」を優先する

スパゲッティコードの特徴は、関数がどこで呼ばれているか、データの流れがどうなっているかが静的なコード(文字面)だけでは追えない点にあります。

  • 静的解析(罠): 関連ファイルを全部開いて脳内でつなぎ合わせる → 脳がパンクします。
  • 動的解析(推奨): 実際に動かして、データの「足跡」を追う。

まずは、Xdebug(PHP)VS Codeのデバッガを活用し、ステップ実行で「今どのファイルを通過したか」をリアルタイムで追いましょう。これだけで、読むべきコードが全体の10%程度に絞り込めます。


2. ツールを使って「地図」を自動生成する

迷路を歩く前に、空からドローンで撮影して地図を作りましょう。手作業で図解するのは時間がかかりすぎます。以下のツールを使って視覚化を自動化します。

手法 おすすめツール 得られるもの
コールグラフ Doxygen, PHPCallGraph 関数同士の呼び出し関係図
ER図自動生成 MySQL Workbench, DBeaver データベースのテーブル関連図
プロファイリング New Relic, XHProf 処理に時間がかかっている箇所の特定

3. AIを「翻訳機」として酷使する

今や、解読の最大の味方はAI(ChatGPT, Claude, GitHub Copilot)です。ただし、「全部読んで」と頼むのではなく、パーツごとに要約させるのがコツです。

効果的なプロンプト例:
「この300行の関数の中で、最終的にDBを更新している箇所と、その条件分岐だけを箇条書きで抜き出して」

意味不明な変数名($data1, $tmp_arrayなど)をAIに渡し、「まともな命名にリファクタリングしたコードを書いて」と頼むことで、元のコードが何をしようとしていたのかが驚くほど明確になります。


4. 「仕様書」の代わりに「テストコード」を書く

ドキュメントがないなら、今現在の動きを「仕様」として固定してしまいます。これをキャラクタライゼーションテスト(現状維持テスト)と呼びます。

  1. ある入力に対して、今のシステムが何を返してくるかを記録する。
  2. その動きをそのままテストコードにする(例:PHPUnit)。
  3. リファクタリングした際、テストが通れば「挙動を変えずに整理できた」ことが証明される。

これが、壊すリスクを最小限にして「中身を触れる状態」にする最短ルートです。


5. ログの「仕分け」でブラックボックスを暴く

どうしても処理の流れが追えないときは、主要な関数の入り口と出口に、これでもかというほどログを仕込みます。

logger("DEBUG_POINT_1: " . json_encode($params));
// ... 謎の処理 ...
logger("DEBUG_POINT_2: " . json_encode($result));

実行後にログを時系列で眺めるだけで、どの条件分岐を通って、どこでデータが化けたのかが浮き彫りになります。


まとめ:完璧を目指さないのがコツ

スパゲッティコードの解読で一番やってはいけないのは、「すべてを理解しようとすること」です。

  1. 影響範囲だけを知る。
  2. データの入り口と出口だけを押さえる。
  3. 変更したい箇所の周りだけを固める。

「動いている」という事実を最大限に利用し、ツールの力を借りて、賢く省エネで攻略していきましょう。