コード品質の測定と改善

Agile Practitioners 2016カンファレンスでBoris Modylevsky氏が,コード品質の測定と改善をテーマとした講演を行なった。

InfoQは氏にインタビューして,コード品質を測定することの重要性,その測定結果を品質改善に利用する方法,継続的インテグレーションへの静的コード解析の統合,テストカバレッジとテストの自動化,統合型コード解析とテストカバレッジを継続的インテグレーションと組み合わせることのメリットについて聞いた。

InfoQ: コード品質を測定することの重要性について,詳しく説明して頂けますか?

Modylevsky: ソフトウェア開発者である私たちには,ソフトウェア製品に関して語るべきことがたくさんあります。特定のシナリオに沿って動作するか,特定の制限下で正しく動作するか,障害からの回復は可能か,などです。ですが,こういった質問はどれも,コードが良いか悪いかという疑問に答えるものではありません。コードの品質を決定する定義はたくさんありますが,“品質のよいコード”という場合,通常は柔軟性やテスト性,可読性といったものを備えたコードのことをいいます。コードの良さを評価することができれば,次のタスクをより正確に見積ることができます。コード品質改善の技術的負債を軽減する,十分な時間を確保することが可能になるのです。このように,内部コードの品質を測定することで外部的な品質が改善されて,結果的としてソフトウェア製品の品質が向上します。

InfoQ: コードの品質をどのように測定したのか,それを品質向上にどのように役立てたかなど,具体的な例はありますか?

Modylevsky: 私が以前,レガシコードと新しいコードの混在するプロジェクトに取り組んでいた時のことです。レガシコードはリファクタリングが必要で,ユニットテストも行なわれていませんでした。一方で,新しいコードはゼロから書かれていたため設計もよく,コードもクリーンで,十分にテストされていました。問題だったのは,新しいコードとレガシコードが混在することでした。どの部分を改善する必要があるかを見分けるのも容易ではなかったのです。しかしコードの品質を測定し始めると,どの部分のコードに改善が必要なのか,はっきりと分かってきました。コード品質の測定によって技術的負債の評価が容易になり,リファクタリングにリソースを割り当てることが可能になったのです。

InfoQ: 継続的インテグレーションやツールに対して,静的コード解析をどのように組み入れたのですか?

Modylevsky: 静的コード解析ツールは市場にたくさん出回っていますから,自分自身のニーズに最も適したものを選ぶことが大切です。私は現在,QualiSystems CloudShellとVMWare VCenterを統合するオーケストレーションソリューションを開発しています。言語としてPythonを使用して,GitHub上の公開リポジトリにホストされています。このプロジェクトは次のリンクから入手可能です: https://github.com/QualiSystems/vCenterShell.

このプロジェクトのために私は,最小限の設定でアズ・ア・サービスを提供可能で,GitHubとの相性のよいツールを探していました。静的コード解析に選択したのは,重複するコードや潜在的なバグを即時に指摘可能なCodeClimateというツールです。コンフィギュレーションが完全にシームレスで,公開リポジトリで自由に利用できることは言うまでもありません。

InfoQ: テストカバレッジとテストの自動化についてはどうでしょう – あなたの経験について教えてください。

Modylevsky: コードカバレッジが有効なのは,一般的にはユニットテストに適用された場合です。テストされていない境界条件を見つけたり,カバーの不十分なコードの多くを指摘することが可能になります。ですが,エンドツーエンドテストのような自動化テストで使った場合には,これほどの価値は期待できません。自動化テストのカバレッジが高くても,境界条件が十分にテストされているとは必ずしも言えないからです。

InfoQ: 継続的インテグレーションを,統合型コード解析やテストカバレッジと組み合わせることで,どのようなメリットが期待できるのでしょう?

Modylevsky: 継続的インテグレーション内でコード解析やコードカバレッジ測定を行なうことには,多くの意味があります。それぞれの測定値の経時的傾向が分かることがまずひとつ,前回のビルドと比較して何らかの指標が減少している場合にビルドを中断できることがひとつです。例えば,GitHubとCoveralls.ioをうまく統合すれば,プルリクエストのマージ要件のチェックとしてコードカバレッジを構成することが可能になります。この方法によって継続的改善を確実にすると同時に,経時的なコードの劣化を回避することも可能になります。

InfoQ: 製品の品質を向上する方法を模索している人たちに対して,アドバイスすることがありますか?

Modylevsky: 開発チームに,一種のゲームとしてこれらのツールを提供してください。指標値の向上をスコアアップにするのです。スコアを測って,開発者同士で競争できるようにしてください。トップスコアを表示するダッシュボードを用意して,社内の大きなスクリーンに表示しましょう。

皆が自分のコードに誇りを持つようにするのです!