はじめに
こんにちは、CX開発グループでWeb開発を担当している德廣です!
本記事では、JetBrains社が開発した静的コード解析ツール「Qodana」をコード品質のモニタリングツールとして導入した時の話をまとめました。
弊チームでも「Qodana」の導入は試験段階でありますが、コードの品質管理を考えている方へ、何かしらの参考となれば思い記事にしたいと思います。
導入の目的
前提
リネットは10年以上続いているサービスで、レガシーコードがそれなりに存在しています。
コードベースの規模が大きくなってきて、人手だけに頼って品質を担保し続けるのは非効率で効率的な対応を検討していました。
コード品質を管理したい背景
- 弊チームでは「コードの品質を高くすることで、開発の速度を上げたい。」「開発体験を改善したい。」と考えています。
- チーム内で「開発速度や開発体験を妨げているものは?」と振り返った時に、直面している問題の一部として以下の2つが浮かび上がりました。
直面している問題2選
- レガシーコードの中で既にデッドコードが開発の影響調査や開発体験を阻害している。(デッドコードを効率的に見つけて削除したい)
- 例えばPHPStanでは「他ファイルからの依存がなくなったこと」が検出できない
- 反対にJetBrainsIDEでは前述の依存については検出できるが、「開いているファイルのみ」しか検出できない
- 全てのファイルをIDEで開いて確認するわけにはいかない
- そのため、どうしても人力でコードのリファクタリングや削除をしていると、クラス・関数の依存がなくなった時に削除漏れが起きてしまう
- どうにか削除が漏れたデッドコードを見つけて削除したいが、効率よく行いたい
- コード品質の経年劣化をキャッチしたい(品質を適宜保ちたい)
- IDEのサポートにより、新しい実装コードは高品質で実装できている
- しかしそれらのコードも数年経過すれば、言語やライブラリ・静的解析ツールなどの進化により相対的に品質は経年劣化してしまう
- 例えばPHP5時代のコードがPHP8においても想定通り動いてはいるが、型宣言や非推奨となった関数の置き換えがされずにいると、当時は高品質なコードでも数年が経過し環境が変化することでコード自体に変更は加えていなくても(加えていないからこそ)相対的に劣化して低品質なコードとなる
- 他にも静的解析ツールやIDEの進化によって「より良いコードの提案(改善)」がなされるようになり、それらの進化を受け入れる場合も同様でコードに変化はなくても環境の変化によって相対的に品質が劣化する
以上のような直面している問題を解決しつつ、様々な品質を効率よく管理してくれるツールを探しました。
↓は探している時の私の様子です
- いつも使っているPHPStromがコードチェックとしてはほぼ条件を満たしている事に気付く
- 「IDEのこのチェック機能を全ファイルにCIで定期的に検査できる仕組みがあれば……」とPHPStormをCLI利用できることに気付いて試す
- しかし「チェックはできるが検出結果が見づらく管理しづらいのが難点」でした。
- 「PHPStormのCLI結果のフォーマッターを作ろうかな?」と悩んでいた時に、その需要に気付いてくれたのか公式であるJetBrains社がそれらの問題点(見づらい・管理しづらい)を解決しつつ、やりたいこと(IDEのチェック機能を全ファイルに定期的に検査できる)を満たすツールに出会いました。
それが、今回紹介するQodanaです!
Qodanaの主な機能の紹介と、その機能の一部を利用して直面している問題の解決、その他良かった点や今後の展望についてお話します。
Qodanaとは
JetBrains社が開発した、開発者に慣れ親しんだJetBrainsIDEのコードインスペクションをプロジェクト全体で活用できるよう設計された静的コード解析ツールです。
また、QodanaのレポートをQodana Cloudというクラウドサービスに転送することで組織全体のプロジェクト毎のコード品質をモニタリングすることが可能です。
コードインスペクションとは
- コードインスペクションとはIDE上で異常なコードを検知し改善を提案してくれる機能です。
- 参考:PHPStormのコードインスペクション pleiades.io
Qodana Cloudとは
- 複数のプロジェクト、大規模開発チームのコード品質チェックをクラウドベースで一元管理できるツールです。
- Qodana Cloudを用いることで、以下のようなことが可能になります。
- 様々なプロジェクトを1か所に集約することができ、組織全体のコード品質状態をダッシュボードでモニタリングできる
- 個々のプロジェクトにおける問題をドリルダウンで確認できる
- 過去のレポートを履歴で確認できる
- 他(長くなるため、割愛します)
試験導入を通じて得た効果
デッドコード削除がしやすくなった
これまでは
前述の通り、デッドコードの削除はIDEの力を借りつつ人力で行っていたが、レビューも含め人力であるためどうしても漏れがありました。
PHPStan:「他ファイルからの依存がなくなったこと」が検出できない
JetBrainsIDE:「開いているファイルのみ」しか検出できない全ファイルをIDEで開く訳にもいかず、改めてデッドコードの棚卸しをするのも難しい状態でした。
これからは
- Qodanaは「プロジェクト全体に対しエントリポイントから参照されていないクラスや関数などを検出」してくれるようになりました。
- なので、Qodanaのレポートを用いて定期点検を実施していきたいです
問題点の解消がしやすくなった
リネットではCIでQodana Cloudにレポートを転送しています
- Qodana Cloudから、直接手元のJetBrainsIDEを開いて、更に問題のある箇所へ自動でジャンプしてくれるところがとても良いです。
- Qodana CloudのレポートからIDEが開き、問題点にジャンプされるためシームレスに問題点解消が行えるのは非常に快適です。
- JetBrainsIDEからQodana Cloudに接続することも可能で、直接JetBrainsIDE上から全ての問題点を参照することが可能になりました。
- 通常PHPStormのProblemタブは開いているファイルの問題点をIDEが解析して表示してくれますが、 IDE上で「(全てのファイルを開かなくても)全てのファイルの問題点が見えている状態」を作れているということです。
今後の展望
コード品質の経年劣化をキャッチしたい
- 前述の通り、新規実装時はIDEのサポートを受けることができますが、このサポートは「そのファイルを開いている間」のみ有効です。したがって、長期間人目に触れないコードは、実装後から劣化が進んでいきます。
- そのようなコードを改修しようとすると、「長期間保守されなかったコードの点検」のコストが一度にかかってしまいます。もしくは、その低品質を受け入れて改修され、さらに負債を残す可能性もあります。
- こうした問題を防ぐため、Qodanaのレポートを用いてこまめに品質劣化に対応する活用をしたいと考えています。
- 最近実装されたコードが、数年後に品質劣化が検出されることで効果が発揮されると考えており、今後の変化に注目しています。(劣化しないのが一番ではありますが……)
複数プロジェクトのコード品質を管理できるようにしたい
- Qodana Cloudでは複数のプロジェクトを管理できますが、現在は試験段階ということもあり1プロジェクトでしかQodanaを稼働できていません。
- 最終的には 「Qodana Cloudで各プロジェクトの健康診断ができる」 状態に持っていきたいです。
さいごに
リネットではLaravelを採用しております。
そのLaravel環境でQodanaを導入する際、不必要な問題点の検出など、何度か課題に直面しました。
しかしQodanaはつい先日までEAP版であったため、導入事例が少なく、特に日本語の記事はほんのいくつかしか見当たりませんでした。
Laravelは多くの方が採用されており、同じように導入で悩まれる方もいらっしゃると思います。そのため、私が直面した課題とその解決方法については、別の機会で記事にして共有したいと考えています。
我々も未だ導入したばかりで活用しきれているとは言えませんが、 コード品質をモニタリングする一つの手段として、Qodanaは良いツールだと感じています。
この記事が読者の方にとってQodanaを導入するきっかけになったり、 Qodanaの導入や設定といった記事が増えて、盛り上がることを願っています!
エンジニア募集中!
ホワイトプラスはリネットという宅配クリーニングのサービスを開発・運営している会社です。
www.lenet.jp
向上心の強いメンバーと一緒に成長したい方はぜひご応募ください。カジュアル面談も可能ですので、お気軽に! www.wh-plus.co.jp