はじめまして、AGESTクオリティマネージメント部の坂本です。
今回は弊社が新たに開始するコード解析サービスについてご紹介したいと思います。
QA for Development
QA for Developmentとは「開発のための品質保証」を実現するAGESTの新しいソリューションです。「不確実性が高い時代のモノづくり」の品質課題にオールインワンで向き合うため、AGESTは開発×テストの二刀流のノウハウを持った”次世代QAエンジニア”による新しい価値提供を行います。
今回ご紹介するコード解析サービスは、こちらの新ソリューション「QA for Development」のサービスのひとつです。どのようなものか、どのようなメリットがあるのか、また具体的な進め方や成果物についてご紹介します。QA for Developmentについての詳細は下記のページをご覧ください。
コード解析サービス
サービス概要
コード解析サービスとは、コード品質にお悩みのお客さまのソースコードを様々な観点から解析、品質を計測し、改善点を検出・作成するサービスです。
当サービスにより問題(指摘事項)やコード量の傾向等が可視化され、コードの問題箇所が見えてきます。また、問題箇所への最適な対応もご提案するため、結果として問題が減少し、クリーンなコードになることが期待できます。また継続的なコード品質の維持についても考えますので、一度受けて終わり、ではなく受けたあともコード品質をあげる仕組みができます。
(※1)
コード品質とは
一言にコード品質といっても様々な観点が存在します。
たとえば下記の観点があります。
1.保守性
コードのメンテナンスのしやすさを表します。
a.可読性
変数やメソッド、クラス等への適切な命名、シンプルなロジックを作成する等で向上します。
b.テスト容易性
クラス、メソッドへの適切な責務の割り当てをする等で向上します。
c.変更しやすさ
定数を利用する、コードを重複させない、グローバル変数を使わない等で向上します。
2.再利用性
コード(モジュール、クラス)の再利用のしやすさを表します。適切な責務の割り当て、モジュール分割によって向上します。適当にクラスやメソッドを作成しているといらない機能が入っていたり、変に特化している部分があったりして再利用できないことがよくあります。
3.効率性
CPU利用やメモリ消費の多寡を表します。無駄なファイル入出力、メモリ確保をなくしたり、DBであればインデックスが効くようにクエリを発行する等で向上します。多くの場合プログラム実行速度に直結します。
4.移植性
プログラムを異なる環境に移植した際に動作させる容易さを表します。CPUやOS、ミドルウェア等に依存したコード(改行コードのべた書き、特定のDBにしか存在しない命令等)を減らすことで向上します。
5.信頼性
エラーへの強さを表します。具体的には例外的な入力があってもデータが壊れない、エラーが発生した場合フェイルセーフな動作をする等があります。例外的な場面に備えた処理を実装することで向上します。このようにコード品質には様々な面があり、プロジェクトによって注力するべきところも変わってきます。
低品質コードのリスク
前項で記載したなかでプロジェクトに必要な観点を満たしている割合が低いものを品質の低いコードということができます。それではそもそもコードの品質が低いと、誰がどう困るのでしょうか。
例えば下図のような、作業への影響、その結果として起こりうるリスクがあげられます。
- テスタビリティの低下
テストがしにくくなることで、コードカバレッジやテストケースの漏れが発生し、欠陥検出率が低下します。その結果、市場不具合が発生し、顧客に損害が発生する、自社の信頼を失う等の影響が発生します。またプロジェクトもテストがスムーズに実施できないことで進捗遅れが発生します。
- メンテナンス性の低下
メンテナンスがしにくくなることで、不具合修正の難易度が上がり、デグレードの発生確率が上がります。また機能追加・変更をする際にも影響範囲の広さや再利用性の低さからコストが増えます。
- 移植性の低下
移植性が低下すると異なる環境でソフトウェアを利用したいとなった際、修正が必要な箇所が増え、コストが増大します。
- 可読性の低下
可読性が低下するとコード解析の難易度が上がります。結果として不具合修正や改修時のコストが増えます。また意図を理解できずにロジックを修正した結果、欠陥を埋め込んでしまうリスクもあります。
対策
低品質コードは様々な工程で問題を引き起こします。そのため低品質コードを生み出さないことが大切です。対策も様々ですがたとえば下記のようなものが考えられます。
- コードレビューを実施する
有識者によるコードレビューを行うことで、問題のあるコードを検知し、修正することが可能です。ただしすべてを見るにはコストが高く、プロジェクトの状況によっては難しいことも多々あります。またレビューアのスキルに依存するため、効果はその時々で大きく変わってきます。
- 静的コード解析を実施する
Linterといわれる静的コード解析ツールやSonarQubeを利用した解析を行い、コードの問題箇所をリストアップできます。リストアップされた指摘を精査していき、問題箇所を修正することでコードの品質を向上させることが可能です。ただし環境・言語によっては導入が難しいことがあります。また警告の量が多く、些細な指摘に埋もれてクリティカルなものに気づかないことも起きえます。
- コードメトリクスを計測する
コードメトリクスを計測し、その結果をもとにレビューを実施したり、クオリティゲートを設定したりすることで、効率よくコード品質の低下を防ぐことができます。メトリクスにはステップ数、循環的複雑度(Cyclomatic Complexity)、継承の深さ、クラス結合度等、様々なものが存在します。プロジェクトの特性や言語によって利用するものを選定します。
静的コード解析とは
静的コード解析 (せいてきコードかいせき、static code analysis) または静的プログラム解析 (static program analysis)とは、コンピュータのソフトウェアの解析手法の一種であり、実行ファイルを実行することなく解析を行うこと。
静的コード解析 – Wikipedia
コーディング規約違反やリソースの解放忘れ、到達不能コード等数多くの問題を指摘してくれるものです。CIに組み込んで違反コードをマージさせないような仕組みにすることもあります。
コードメトリクスとは
コード メトリックスとは、開発者が開発中のコードをより理解できるようにする、ソフトウェアの一連の基準です。
コード メトリックを計算する – Visual Studio (Windows) | Microsoft Learn
LOC(コード行数)、循環的複雑度(Cyclomatic Complexity)、CKメトリクス(オブジェクト指向言語用のメトリクス群)等、数多くのメトリクスが存在します。
コード上の複雑な箇所を見つけたり、多くの箇所から利用されているものを見つけたりするようなことが可能です。
コード解析サービスを利用するメリット
低品質コードの対策としては前項であげたものがありますが、それまでやっていなかった場合は実際にやるとなるとどうすればいいのかわからず、とりあえずやってみたけど特に得るものもなく徒労に終わるといったこともあります。
そういった場合にはノウハウを持った専門家に依頼することが有効です。
弊社のコード解析サービスはまさにこの対策を提供するものです。
サービスを利用するメリットとしては下記があげられます。
- 専門家がコード解析、それを受けた改善点のご提案するため、効果をあげやすい
- 外部の目が入ることで、新しい観点のレビューが実施される
- 自社で実施した場合にかかる工数が大幅に削減される
- 静的解析の結果は些細なものがフィルタリングされるため、重要なものにのみ集中できる
- メトリクスの閾値に適切なものが設定できる
- プロジェクトにマッチしたCI/CDへの導入方法がわかる(※1)
- 一度サービスを受けた後は実施した作業・メトリクス計測・閾値設定を継続、改良するだけでコード品質維持が可能になる。他のプロジェクトにも適用しやすくなる。
特に下記のようなことにお悩みのお客さまにおすすめです。
- 上流工程で品質を担保していきたい
- 静的コード解析を導入したいが方針が決まらない、導入したが成果が見えない
- コードメトリクスによるクオリティゲートを設定したいが何をどんな基準で設定すればいいかわからない
- 不具合が大量に発生してしまっていて手を打つ必要がある
- 今後もコード品質を向上させていきたい
下図は改善後イメージです。
コード解析サービスの進め方
それでは実際にコード解析サービスがどのように進められていくのかご紹介します。
おおまかなフローとしては下図のようになります。
1.事前準備
まずは対象プロジェクトの状況、課題のヒアリング、目標ヒアリング・設定をします。その後プロジェクト環境に適用可能な商用ソフトウェア、OSS等の調査、インストールを実施していきます。実はここが一番大変だったりします。OSSも玉石混交で、思うように動作しないものも多くあり、利用するソフトの調査に時間と手間がかかります。またお客さまのビルド環境が特殊だったりすると急激に適用できる商用ソフトウェア、OSSが減り、どうしようもないときはOSSをカスタマイズしたりちょっとした補助ツールを作成したりといったこともあります。
2.ソースコードの受領
git等のリポジトリからcloneしたり、プロジェクトフォルダをコピーいただいたり、基本的にはビルド可能なプロジェクトの全ソースをご連携いただきます。解析の中にはビルドしないと解析できないものも存在するためです。
ここでまずはビルド、テストが通るかの確認をします。
3.各解析の実施
下記を実施します。
a.コードリーディング
メトリクス計測の結果や、ヒアリング結果から要注意の箇所を確認していきます。コーディングルールがどうなっているか、重複コードがないか、バッドプラクティスのコードがないか等を確認します。
b.静的コード解析
SonarQubeやlinter等を利用し静的コード解析を実施します。独自環境であればそれに組み入れられるよう手順を構築します。
c.メトリクス計測
各言語ごとに利用可能なOSSや弊社ツールを利用し、必要なメトリクスを計測します。こちらも環境にあわせて手順を構築します。
4.解析結果の分析
解析結果を分析し、重要な指摘をリストアップ、整理していきます。指摘の傾向からどのようなところに注意が必要かを判断します。メトリクス計測した結果からはコードの状態をレポートします。複雑度等が事前に設定した閾値を超えている場合は何が問題なのかを分析します。また各メトリクスから不具合の発生しやすい要注意スポットを割り出します。ここもナレッジがないと難しいポイントとなります。
5.改善点、対応案の作成
指摘や具体的なコードの問題、メトリクスから改善点、対応案を作成し、レポートします。いま存在する問題点の解消と今後コード品質を維持するための施策を含めてご提案します。
6.CI/CDへの導入提案・支援(※1)
CIにツールを導入する必要があると考えられる場合にはそこへの導入提案・支援を実施します。継続的にコード品質を上げていく仕組みづくりを考えます。
レポート例
プロジェクトごとに内容は変わりますが、一例として下図のようなレポートを出します。
- 対象プロジェクトに合わせて設定したメトリクスと閾値にしたがって閾値を超えている箇所を可視化
- プロジェクトのコード品質を可視化、またコード内の具体的な問題箇所についても整理し、改善案作成
まとめ
低品質コードは様々なリスクを発生させます。もしリスクが顕在化した際のダメージは甚大になりうるものです。それを避けるためには低品質コードを生み出さないことが重要です。コードレビューや静的コード解析、メトリクス計測等を実施し、コード品質を向上させていきましょう。上流工程の品質向上は後工程のコスト削減や市場不具合の減少につながっていきます。
もしコード品質が低く困っているがノウハウがなくどうすればよいかわからないというようなことがありましたら、ぜひ弊社へご相談ください。エキスパートがお客さまに最適な改善案をご提案します。
※1 既存のCI/CDへの組み込み対応のみとなります。新規のCI/CD構築支援につきましては別途サービス開始予定となっております。