レガシー化するコードベースとの戦い:なぜPhpStormの静的解析を極めるべきか
プロダクトの成長に伴い、コードベースが「肥大化という名の負債」を抱えていくスピードは、私たちが想像するよりもはるかに速い。数年間にわたるアジャイル開発、頻繁な仕様変更、アサイン・離脱を繰り返すエンジニアたち。その歴史の爪痕として、「誰も使っていないが、怖くて消せないクラスやメソッド」がコードの奥底に静かに眠りにつく。
「この古いサービスクラス、本当にどこからも呼ばれていないか?」
「リファクタリングで浮いたメソッドを消したら、どこかの動的ディスパッチ(`__call`やコンテナ解決)で死なないか?」
この恐怖感から、開発者は不要なコードを放置し、ビルドサイズを膨らませ、IDEのオートコンプリート汚染を許容し、メンテナンステストの実行時間を無駄に引き延ばしている。
世の中には「使われていないコードを手動でgrepする」「coverageレポートを無理やり流し込む」といった原始的な手法が溢れているが、これらは時間泥棒であり、ヒューマンエラーの温床だ。
JetBrains PhpStormは、単なるテキストエディタではない。プロジェクトのAST(抽象構文木)をメモリ上に完全に構築し、すべてのシンボル間の参照グラフをリアルタイムで追跡する「超高精度な静的解析エンジン」である。
今回は、このPhpStormのポテンシャルを極限まで引き出し、プロジェクトのデッドコードを完全に駆逐するための実践的戦略を、テックリードの視点から授けよう。
—
1. 開発スピードを極限まで高める隠れたキーボードショートカット
マウスに手を伸ばした瞬間から、フロー状態は途切れる。PhpStormの真骨頂は、キーボードアプローチによる圧倒的なスピードにある。デッドコード検出と安全な削除のプロセスを、指先の迷いなく遂行するためのショートカットを体に叩き込んでほしい。
圧倒的スピードをもたらすキーアサイン
| アクション名 | Mac ショートカット | Windows/Linux ショートカット | テックリードの解説 |
| :— | :— | :— | :— |
| Run Inspection by Name | `Cmd + Shift + Alt + I` | `Ctrl + Alt + Shift + I` | 本記事の核心。 インスペクション名(「Unused declaration」等)を直接インクリメンタルサーチして即座に全体スキャンを実行する。 |
| Safe Delete | `Cmd + Delete` | `Alt + Delete` | 単なる `rm` や `Del` ではない。「参照関係を完全に担保した上で、壊れるなら警告を出し、壊れないなら一括で関連ファイルやuse文まで掃除する」神の機能。 |
| Find Usages | `Alt + F7` | `Alt + F7` | カーソル下のシンボルがどこで使われているかをツリー構造で可視化。削除前の最終防衛ライン。 |
| Recent Files / Recent Locations | `Cmd + E` / `Cmd + Shift + E` | `Ctrl + E` / `Ctrl + Shift + E` | デッドコード削除の前後で、確認していたファイル間を瞬時にジャンプする。 |
—
2. デッドコード検出の心臓部:`Run Inspection by Name` の実戦投入
リアルタイムのインソール警告(エディタ上のグレーアウト)は非常に便利だが、数万行を超える巨大なプロジェクトにおいて、ファイルを開かずに全容を把握することは不可能だ。ここで使うのが `Run Inspection by Name` である。
ステップ1: スキャンの実行
1. `Cmd + Shift + Alt + I` (Win: `Ctrl + Alt + Shift + I`)を押す。
2. ポップアップが表示されたら、`Unused declaration` と入力してエンター。
3. スコープを選択するダイアログが出るため、通常は `Whole Project`(プロジェクト全体)を選択する。
これで、PhpStormのASTパーサーがプロジェクト全体を走査し、「定義されているが、どこからも参照されていないクラス、メソッド、プロパティ、関数」のリストを数秒で弾き出す。
ステップ2: 動的呼び出し(フレームワーク特有の魔法)の除外
Laravel、Symfony、WordPressなどのフレームワークでは、DIコンテナ経由のインスタンス化や、イベントリスナー、ルーティング定義など、静的解析器が「参照されていない」と誤認しやすい動的コードが存在する。
誤ってこれらを削除対象に含めないために、PhpStormの設定でインスペクションのスコープをチューニングする。
- `Settings / Preferences` -> `Editor` -> `Inspections`
- `PHP` -> `General` -> `Unused declaration`
ここで、Framework特有のアノテーション(例: Doctrineの `@ORM\Entity` や Laravelのファサード、PHPUnitのテストメソッドなど)を「エントリポイント(Entry point)」としてマークする設定が自動、あるいは手動で行われていることを確認する。アノテーションや属性(Attributes)を付与することで、PhpStormは「これはフレームワークから呼ばれる前提のコードだ」と認識し、デッドコード判定から除外する。
—
3. 依存関係を1ミリも壊さない:『Safe Delete』の徹底活用
デッドコードリストを手に入れた後、絶対にやってはいけないのが 「手動でのファイル削除 + Gitでの確認」という泥臭い作業 だ。これをやると、消してはいけないトレイトを消したり、残された無駄な `use` 宣言(Imports)でコンパイルエラーを踏んだりする。
ここで `Safe Delete` (`Cmd + Delete` / `Alt + Delete`) の登場である。
Safe Delete が内部で行っている処理
1. 参照グラフの逆引き検証: 選択された要素に対して、プロジェクト全体から再度参照がないかを厳密にチェック。
2. 安全性の判定:
- 安全な場合: 一瞬で削除完了。
- 依存がある場合: 「Safe Delete Conflict」ダイアログがポップアップし、「どこから参照されているか」をリストアップした上で、「本当に削除を強制しますか?」とエンジニアに問う。
3. カスケードクリーンアップ: クラスを削除する場合、そのクラスを読み込んでいた他のファイル内の 無駄になった `use` 文(Namspace Imports)や、コンストラクタインジェクションの記述まで自動で巻き取って削除 してくれる。
この「自動クリーンアップ」こそが、開発スピードを劇的に高める最大の理由である。手動で `use` 文を掃除する時間は、エンジニアのキャリアにおいて完全に無駄な時間なのだ。
—
4. チーム開発で役立つ設定の共有化ルール
個人がローカルでいくら綺麗にコードを保っても、チーム全体のインスペクション設定がバラバラであれば、すぐにコードベースは腐敗する。PhpStormの設定は、プロジェクトルートに配置する `.idea` ディレクトリ配下の XML ファイルとしてバージョン管理システム(Git)にコミットできる。
これにより、「チーム全員が同一の静指標・同一のデッドコード基準」で開発できる環境が整う。
共有すべきインスペクション設定ファイル構成
プロジェクトルートの `.idea/inspectionProfiles/` ディレクトリに、チーム共通のプロファイル(例: `Team_Strict_Standard.xml`)を配置する。
以下は、厳格なデッドコード検知と品質維持を行うためのインスペクション設定ファイルのベストプラクティス構成例である。
この設定をチーム強制する運用ルール
1. 上記のXMLを `.idea/inspectionProfiles/Project_Default.xml` としてコミットする。
2. メンバー全員がプロジェクトを開いた際、自動的にこのプロジェクトプロファイルがロードされる。
3. CI/CDパイプライン(GitHub Actions等)側でも、PhpStormのヘッドレスモードや、PHPStan / Psalm などの静的解析ツールと組み合わせることで、「デッドコードが含まれるプルリクエストはマージさせない」鉄壁のガードを構築できる。
—
5. 絶対入れるべき神プラグイン:PhpStormの限界突破
標準機能だけでも強力だが、エコシステムを活用することで、デッドコード検出とコードクリーンアップの精度はさらに次元が変わる。
1. SonarLint for PhpStorm
- 概要: 世界標準のコード品質プラットフォーム「SonarQube」の解析エンジンをPhpStorm上でリアルタイムに動かすプラグイン。
- なぜ神なのか: PhpStorm標準のインスペクションよりもさらに深い、複雑度の高いコードの重複や、セキュリティ脆弱性、保守性を下げる「ゾンビコード(到達不能コード)」を高精度で炙り出す。デッドコード削除と同時に「保守性の向上」を担保したい現場の必須装備。
2. Key Promoter X
- 概要: マウス操作を行った際に、「今の操作、このショートカットキーでやれば○秒速かったよ」とポップアップで優しく、かつ厳しく教えてくれるプラグイン。
- なぜ神なのか: デッドコード削除やリファクタリングをマウスで行う悪癖を強制矯正し、チーム全体の指の迷いを消し去ることで、結果的に開発スピードを爆発的に高める。
—
6. テックリードからの提言:デッドコード削除を「文化」にせよ
デッドコードの削除は、一度やって終わりではない。それはコードベースの「健康診断」であり、継続的な運動なのだ。
1. 機能開発のついでに消す(Boy Scout Rule):
コードを触った際、その周辺にある使われていない変数やメソッドを見つけたら、その場で `Safe Delete` を走らせる。
2. 定期的な一斉インスペクションの実施:
スプリントの切れ目やリファクタリングデーを設け、`Run Inspection by Name` による全体スキャンと一括クリーンアップをチームイベントとして行う。
PhpStormを単なる「コードを書くためのエディタ」として使っているうちは、ライセンス代の数分の一しかバリューを引き出せていない。ASTを操り、参照を完全に制御するこの巨大な開発プラットフォームを飼い慣らしたとき、あなたのチームの生産性は、競合他社が追いつけない領域へと飛躍する。
今すぐ `Cmd + Shift + Alt + I` を押し、あなたのプロジェクトに眠る不要なコードの山を目の当たりにせよ。そして、`Safe Delete` の心地よい手応えと共に、美しく研ぎ澄まれたコードベースを取り戻すのだ。