画面上のソフトウェア・コードを見ている2人

コード品質とは?

コードの品質とその向上方法

コードの品質とは、単にコードが実行され、望ましい機能を実行するかどうかだけでなく、コードの堅牢性を指します。高品質のコードは、効率性、保守性、読みやすさ、再利用性によって差別化されますが、低品質のコードは脆弱で解析が困難で、時間の経過とともに技術的負債が蓄積される傾向があります。

高いコーディング標準は、ソフトウェア開発プロセスにとって、業務用厨房のオペレーションにおける適切な配置「清潔な作業」のようなものです。コードの品質を高める実践は、短期的にはより良い機能をもたらしますが、より重要なメリットは、長期的には問題が減り、進歩が速くなり、保守コストが削減されることです。

高品質なコードの長期的なメリットは、プログラマーにとって、ソフトウェア開発ライフサイクルの細部に精通していない経営陣に伝えるのが難しい場合があります。最適なコードの全体的なメリットとビジネスの優先順位による差し迫ったプレッシャーのバランスを取るには、多くの場合、複雑なトレードオフが必要になります。そうは言っても、2022年に39の独自の本番コードベースを対象とした調査では、次のようなことが主張されています。1

  • 急いで出されたコードによる技術的負債は、開発者の時間の最大42%を浪費します。

  • 低品質なコードは、高品質なコードよりも15倍多くの欠陥を引き起こします。

  • 低品質なコードでの問題解決は、高品質なコードでの問題解決よりも(平均)124%多くの時間がかかります。

より高品質なコードは、コードベースの理解、リファクタリングデバッグ、新しい機能の追加を容易にし、スピードを向上させます。明確で一貫性のある、適切に記述されたコードは、開発チーム間の調整をスムーズにし、コード変更の複雑さと難しさを軽減します。それは、強力なソフトウェア品質だけでなく、強力な開発者エクスペリエンスユーザーエクスペリエンスを推進します。

コードがコンパイルされ、ランタイムにその目的が正常に実行されるかどうかだけでは、全体的な品質を判断するのに十分ではありません。コードを書くことは、クロスワードパズルを完成させるようなものではありません。タスクを正しく完了するための1つの方法が存在します。つまり、特定のコーディング問題に対して無数の解決策が存在することがよくあります。したがって、機能性は、単に受け入れ可能なコード向けのものであることを表します。高品質なコードの価値は、それを取り巻くコンテキストへの二次効果によって現れます。

The DX Leaders

AI活用のグローバル・トレンドや日本の市場動向を踏まえたDX、生成AIの最新情報を毎月お届けします。登録の際はIBMプライバシー・ステートメントをご覧ください。

ご登録いただきありがとうございます。

ニュースレターは日本語で配信されます。すべてのニュースレターに登録解除リンクがあります。サブスクリプションの管理や解除はこちらから。詳しくはIBMプライバシー・ステートメントをご覧ください。

高いコード品質を定義するものは何か?

高品質なコードとは、比較的抽象的な概念です。コードの全体的な品質は、そのコードの作成方法と、そのコードベースが存在する大きなコードベースとのやり取りによって決定され、個別の客観的なコード品質メトリクス(ただし、そのようなメトリクスは数多く存在します)によって決まります。

高品質なコードの一般的な特徴は、次のとおりです。

  • 読みやすさ:コードの可読性は、保守、デバッグ、チーム間および時間間の調整に不可欠です。別のチーム・メンバーがあなたのコードを簡単に理解できますか?数年後、別のプログラマーは、コンテキストを提供しなくてもコードを正確に解釈できますか?

  • 保守性:コードの複雑さと保守性はしばしば反比例します。あなたのコードは簡単にテスト可能で、チームがセキュリティー上の脆弱性や最適化の機会を効率的に評価できるようになっていますか?コア機能を壊すことなく新しい機能を追加できるほど堅牢ですか。それとも、脆弱すぎて大規模なリファクタリングを必要とせずに調整できますか。保守しやすいコードを優先すると、初期の手間が増える可能性がありますが、将来的には時間とエネルギーを大幅に節約できます。

  • 効率:適切に書かれたコードは、システムのレイテンシーとリソースの消費を削減できます。例えば、慎重に選択されたデータ構造を用いることで、特定の機能に必要なCPUオペレーション回数を最小限に抑えることができます。入念なデータキャッシング戦略により、冗長なデータベースクエリやネットワークリクエストを排除することで、コストのかかるインプット/アウト(I/O)オペレーションを削減し、未使用メモリを速やかに解放することで、不必要なRAMの肥大化を回避します。

  • 信頼性:欠陥やコードの変更に耐える構造が少ないということは、障害やダウンタイムの頻度が低いことを意味します。信頼性は、ユーザーエクスペリエンスと信頼、そして企業が依存するクリティカルなシステムの健全性にとって不可欠です。

2023年にHarvard Data Science Review誌に寄稿したカルバン大学、アマースト大学、コロンビアの研究者たちは、優れたコードのための規定的フレームワーク「4つのC」2を提案しました。

  • 正確性:コードが意図したとおりに動作します。著者らは、この明らかな包含の2つの系譜を強調しています。「まず、正確さは優れたコードには必要だが不十分な指標です。第二に、その他の目標は正確性をサポートし促進することです」

  • 明瞭性:コードを読み書きする人は誰でも、そのコードが何を意図しているかを理解し、必要に応じて直感的に修正を加えることができます。

  • 封じ込め:無秩序な広がり、冗長性、不要な依存関係を回避します。適切な封じ込めには、「関数を使用して再利用可能なコードを含め、ファイルまたはプロジェクト全体で使用されるコードをモジュールまたはパッケージに保持する」ことが含まれます。

  • 一貫性:コードベースは、スタイル、命名規則、解説、インデント、その他の慣例の内部一貫性を維持する必要があります。

現代のソフトウェア開発は、IBM Bobのようなエージェント型コーディング・アシスタントによってますます推進され続けているため、封じ込め一貫性は、自動化ツールの有効性と正確性を最大化するために特に有用です。とはいえ、IBM Bobのような次世代プラットフォームがAIのリファクタリングの機会をリアルタイムで特定できるようになれば、そのレベルの文体規律を強制するのに必要な労力を削減できます。

高品質なコード作成のためのベスト・プラクティス

各プログラミング言語やユースケースにはそれぞれ独自のニュアンスや細かな考慮事項がありますが、どのようなシナリオでも品質の高いコードを生み出すための普遍的なベスト・プラクティスがいくつか存在します。

高いコード品質を概念化するための1つのアプローチは、不良コードのマーカーをできるだけ多く回避したコードと考察することです(これについては、この記事の後半で説明します)。

より規範的なアプローチについては、前述のHarvard Data Science Review(HDSR)の論文では、コードの品質を確保するための一連のガイドラインを概説しています。これらのガイドラインは、表向きはデータサイエンティストのニーズに合わせて最適化されていますが、ほとんどはあらゆるコーディング分野に適用できます。

良い名前を選ぶ

コードの可読性と一貫性には、強力な命名規則が不可欠です。著者は、次のようなプラクティスを提案しています。

  • 名前の長さは、その範囲に比例する必要があります。時間、コード行数、組織構造など、用語の最初の定義とその使用までの距離が長いほど、名前がその役割を明確に伝えていることがより重要になります。

  • 略語のダイジェストを保持します。短い変数名や1文字の変数名はコードの整理に役立ちますが、プロジェクトにあまり詳しくない人にとっては理解しにくくなる可能性もあります。ある種の「用語集」を維持することで、そのトレードオフが軽減されます。

  • 一貫して大文字を使用します。また、2つの名前が大文字のみによって区別されるようなインスタンスを避けることも賢明です。

  • 説明的でない名前は避けましょう。これらは、コード解釈の難易度を大幅に向上させます。

  • 自然に分類されるファイル命名規則を選択します。例えば、日付と時刻にはISO 8601規格を採用したり、数字を0で埋めて桁数を揃えたりすることができます。

明確で一貫性のある命名規則は、AIコーディング・アシスタントへのプロンプトを簡素化し、そのアウトプットの精度を高めるのにも役立ちます。例えば、エージェントに特定の種類の変数を検査したり、特定の日付範囲のすべてのファイルを検索したりするようにプロンプトするのではなく(AIエージェントがコンテキストからどの変数またはファイルが基準を満たすかを確率的に推測する必要がある場合があります)、エージェントに明示的にプロンプトすることができます。特定の番号で始まるすべてのファイル、または特定の名前のすべての変数を検索します。

スタイル・ガイドに一貫して従う

強力な命名規則を体系化することに加えて、包括的なスタイル・ガイドによって、空白とインデント、コメント、データ型、「コーディング方言」の使用などのフォーマット要素を理想的に標準化する必要があります。GitHubには、さまざまなプログラミング言語用の実績のあるスタイル・ガイドがこのキュレーション・リストに多数掲載されています。

スタイル・ガイドは、AIコーディング・アシスタントにとって非常に貴重なリファレンスでもあり、特定のタスクのコンテキストとして、あるいはAIエージェントのシステム・プロンプトの一部として機能することもあります。

一貫性のある最小限の(しかし十分な)ツールキットを選択する

ツールキットとライブラリーを活用すると、コードの再利用性と効率性が向上し、さまざまなチーム間でワークフローとアウトプットを標準化し、コード作成を大幅に加速できます。これらは、コードが複雑なサードパーティ・システムとのやり取りを仲介したり、反復的な「解決された」問題を処理したりする必要がある場合に特に役立ちます。

しかし、ツールキットに依存しすぎると、不必要な冗長性が生じ、外部依存関係が生じる可能性があり、コードの堅牢性と保守性が低下する可能性があります。また、コードの基盤となるロジックを抽象化する傾向があり、可読性が低下します。HDSRの著者は、理想的なバランスをシンプルな言葉で説明しています。「私たちはツールキットをできるだけシンプルにしたいのですが、それ以上シンプルではないようにしたいのです」

同じことを繰り返さないでください(DRY)

同じコード・ブロックを頻繁にコピー、ペースト、変更する場合は、繰り返しのあるコードを1か所にカプセル化する機能の方が適している可能性があります。その関数のパラメーターは、インスタンスごとに変化する要素を反映できます。これにより、(コード・ブロックの重複を個別に調整するのではなく)関数のすべてのインスタンスを1つのステップと場所で調整できるため、コードがクリーンアップされ、保守が簡素化されます。

一貫性チェックの採用

整合性チェックは、潜在的なデータまたはシステムの状態が事前に定義された論理ルールおよび規則に準拠しているかどうかを検証する自動検証であり、コード内の予期せぬ競合や矛盾を回避・考慮するのに役立ちます。これらの自動テストは通常、CI/CDパイプライン(継続的統合/継続的デプロイメント)の標準的でクリティカルなコンポーネントです。

これは、コードのテスト可能性の重要性を示す典型的な例です。コードが複雑すぎる場合や、密結合された依存関係が多すぎる場合、すべての機能を網羅的に検証する単体テストを設計することは困難または不可能です。

バージョン管理の適用

バージョン管理システムは、チーム間の一貫性、品質管理、調整、コード・レビュー・プロセスを促進するのに役立ちます。AI駆動型コーディング・フレームワーク(特に、コードベースを自律的に調整できるフレームワーク)を使用する場合、望ましくない変更や有害な変更を簡単にロールバックできる手段を確保する必要があります。例えば、IBM Bobは、ワークスペースファイルをチェックポイントとして自動的にバージョン管理し、必要に応じてコード変更を簡単にロールバックできるようにします。

不良コードの定義

大まかに言えば、悪いコードは、読むことや保守するのが困難で、変更や新しい機能に対して脆弱で、非効率的で信頼性が低くなります。多くの場合、不要な依存関係が特徴で、異なるモジュールが相互に関連しており、一方への変更には、他方のモジュールが壊れないように追加の作業が必要になります。適切なドキュメンテーションがなく、まとまりもなく、一貫した論理構造が欠如しており、よく「スパゲッティ・コード」と呼ばれる状態です。

悪いコードは多くの場合、コーディング・スキルが低いだけでなく、インセンティブや組織構造も不十分です。機能リリースを過度に優先してコードの品質を犠牲にすると、市場投入までの時間は短縮されるものの、将来的な複雑さや技術的負債が増大します。

悪いコードはしばしば、少なくとも一時的には機能することを覚えておくことが重要です。そうでない場合は、間違いなく壊れたコードに対処する必要があるため、技術的負債が蓄積することはありません。1999年に初めて発行されたMartin FowlerとKent Beckによる代表的な書籍『Refactoring: Improving the Design of Existing Code』は、悪いコードを説明する際にコード臭いという用語を使用しました。これらは通常はバグではなく、本質的にプログラムの機能を妨げることはありませんが、将来的に開発を遅らせたり、バグを引き起こしたりする可能性のある設計の弱点やコード品質の問題を示しています。

FowlerとBeckの注意すべきコード臭いリストには、次のような例が含まれています。

  • ロング関数(longメソッド):コード行数が多すぎるメソッド。

  • 大規模クラス:多くのことを実行しようとしすぎて、変数が多すぎる、一貫性が欠けたクラス。

  • プリミティブな固執:特殊な小さなオブジェクトの代わりにプリミティブなデータ型を使用します。

  • 名前がミステリアス:関数または変数の名前が不十分で、実際の意図が隠されている状態。

  • データの塊:どこにでも頻繁に一緒に現れる変数のグループ。

  • 遅延要素:ほとんど存在しないクラスまたは関数。

  • 長いパラメーター・リスト:関数が正しく動作するためには、多すぎる引数が必要です。

  • ショットガン手術:1つの変更では、多数の分散したモジュールを同時に変更する必要があります(これは、基本的に大規模クラスの逆です)。

  • 重複したコード:同一または非常によく似たコード構造が複数の場所にある状態。

説明、例、引用を含むコード臭さの包括的なリストは、こちらで参照できます。それらの存在は通常、リファクタリングが必要であることを示しています。これらの問題とそこから生じる複雑さを組織全体で徹底的に理解することで、開発チーム全体で品質基準の共通の概念を確立するのに役立ちます。

AI Academy

ビジネス向け生成AIの台頭

生成AIの発展と現在のビジネスへの影響について学びます。

コードの品質の測定

コードの品質を測定するには、定性的評価と定量的評価の両方が常に伴う必要があります。循環的な複雑度のような客観的なメトリクスは便利ですが、適切なコンテキストがなければ誤解を招く可能性もあります。

例えば、チームが自動テスト・スイートを書き、一連の単体テストで100%のコード・カバレッジを達成するかもしれません。しかし、コードが必要なとおりであることを完全に検証するために必要な意味のあるアサーションがテスト・スイートに欠けている場合、そのテスト・カバレッジによる誤った信頼は、良い面よりも害を及ぼす可能性があります。

同様に、堅牢なレビュー構造には、手動によるコード・レビューとAIによるコード・レビューの両方を含める必要があります。IBM Bobのような最新のエージェント型コーディング・ツールは、広範な静的コード解析とリファクタリングをリアルタイムで実行できるが、開発者の特定のニーズと意図を伝えるカスタムルールカスタムモードから大きなメリットを受けます。人間は網羅的ではなく、AIは確実ではありませんが、相互に対処することで、すべての潜在的な問題が適切なコンテキストで調査済みであることを確認する最も確実な方法です。

コードの品質は文脈に依存することを常に忘れないでください。チームのプログラマーが、意図した機能を見事に実現する、流暢で効率的、完璧に明確化されたアルゴリズムまたはコード・ブロックを作成したと想像してください。もし問題が、誰もがすでに使い慣れている標準の組み込みライブラリー関数を使って効果的に解決できたとしたら、その流暢なコードは不必要な複雑さと精神的オーバーヘッドを増大させるため、実際には品質の問題です。

執筆者

Dave Bergmann

Senior Staff Writer, AI Models

IBM Think

関連ソリューション
IBM Bob

安全で意図を認識した開発を実現するAIパートナーであるBobと連携して、ソフトウェア・デリバリーを加速させましょう。

IBM Bobはこちら
AIコーディング・ソリューション

信頼性の高いAI駆動型ツールを活用することで、コード作成、デバッグ、リファクタリング、コード補完に費やす時間を最小限に抑え、イノベーションに集中できる余地を広げます。

AIコーディング・ソリューションはこちら
AIコンサルティングとサービス

AIの導入によって重要なワークフローと業務を再構築し、エクスペリエンスの最大化、リアルタイムの意思決定、ビジネス価値の向上を実現しましょう。

AIコンサルティング・サービスはこちら
次のステップ

生成AIと高度な自動化を活用して、企業向けのコードをより迅速に作成Bobモデルは開発者のスキルセットを強化し、開発とモダナイゼーションの取り組みを簡素化、自動化します。

  1. IBM Bobの詳細
  2. AIコーディング・ソリューションはこちら
脚注

1. 「Code red: the business impact of code quality – a quantitative study of 39 proprietary production codebases」Proceedings of the International Conference on Technical Debt (Association for Computing Machinery Digital Libtaryを通じてアクセス)、2022年8月16日

2. 「Fostering Better Coding Practices for Data Scientists」Harvard Data Science Review、2023年7月27日