なぜコードの関係を可視化するのか
数千クラス・数万メソッドを抱えるJavaシステムに初めて入ったとき、 あるいは長年稼働してきたレガシーシステムを改修するとき、 「このクラスを変更したら何に影響が出るか」を把握するのは容易ではない。
ドキュメントが古い、存在しない——という状況は珍しくない。 IDE の Find Usages や Call Hierarchy は手元の1クラスを起点に辿るには便利だが、 システム全体のホットスポットや循環依存を一目で把握する手段にはなりにくい。
⚠️ こんな場面で可視化が助けになる
・変更の影響範囲が読めずリファクタリングに踏み出せない
・「神クラス」が存在することは分かっているが規模感が掴めない
・デッドコード(呼ばれていないメソッド)が埋もれている
・モジュール間の依存が複雑に絡み合いアーキテクチャが崩壊しかけている
構造と振る舞いを分けて見る意義
コードの関係には大きく2つの側面がある。
| 視点 | 見えるもの | 代表的な可視化 |
|---|---|---|
| 構造 | クラスの継承・実装・集約関係。「何が何を知っているか」 | UMLクラス図・PlantUML |
| 振る舞い | メソッドの呼び出し連鎖。「誰が誰を呼ぶか」 | Call Graph・シーケンス図 |
どちらか一方だけでは全体像が掴めない。 構造図でクラスの依存関係を把握し、Call Graph で実行時の呼び出しフローを追い、 最終的に Jarviz の3Dマップで全体を俯瞰する——という3段階のアプローチが有効だ。
このシリーズのゴール
このシリーズを読み終えた後、以下ができるようになることを目指す。
✅ シリーズ終了後にできること
1. JavaのClassおよびMethod関係を複数の手法で抽出できる
2. ASM / JavaParser を使って依存関係情報をプログラムで取り出せる
3. Jarviz の JSONL フォーマットを理解し、Java 以外の言語(Python・Kotlin・TypeScript 等)でも同フォーマットを生成して3Dマップを表示できる
4. 3Dマップからホットスポット・デッドコード・循環依存を発見できる
特に JSONL フォーマットの理解と他言語への応用はこのシリーズの目玉である。
Jarviz 自体は Java の JAR を直接解析するツールだが、
内部で使用する jarviz-graph(可視化エンジン)はシンプルな JSONL を受け取るだけでよい。
この事実を理解すれば、どの言語でも同じ3Dマップを活用できる。
シリーズ全体マップ
前提知識と環境
| 項目 | 内容 |
|---|---|
| Java | Java 11 以上(バイトコード解析のため JDK が必要) |
| Maven / Gradle | ビルドツールの基本操作が分かること |
| Node.js | jarviz-graph の実行に必要(v18 以上推奨) |
| Python(オプション) | PART 05 で他言語応用のサンプルとして使用 |
💡 記事中のコードについて
解析対象サンプルとして order-service(受注)・inventory-service(在庫)・payment-service(決済)という架空のマイクロサービスを想定する。
実際のプロジェクトのコードで試す場合は、パッケージ名・クラス名を適宜読み替えてほしい。