麺のように絡み合ったワイヤー

スパゲッティー・コードとは

スパゲッティー・コードの定義

スパゲッティー・コードとは、構造が複雑で、変更や理解が難しいソフトウェア・コードを指します。皿の上で麺が複雑に絡み合ったスパゲッティーのように、スパゲッティー・コードではロジックが迷路のように入り組んでいるため、開発者がコードの動作を理解することが難しくなります。

従来、スパゲッティー・コードは、プログラム内で実行の流れを予測できない形で飛ばすことができる「goto文」の多用と関連付けられていました。最新のプログラミング言語ではこの手法は推奨されていませんが、入り組んだ制御フローは別の形で生じることがあり、現在でも開発者は整理されていないソースコードを指してこの用語を使用しています。

スパゲッティー・コードが問題となる理由

コードベースやアプリケーションには数百万行ものコードが含まれることがあり、それらが適切に整理されていないと保守が困難になります。スパゲッティー・コードは技術的負債の一形態です。コードは手を加えなければ意図どおりに動作するかもしれませんが、更新するには複雑に絡み合ったコードを読み解かなければなりません。何十年にもわたり異なるチームによって保守されてきたレガシー・ソフトウェアは、スパゲッティー・コードに陥りやすくなります。

開発者が新機能の実装ではなく既存のコードの理解に時間を費やすようになると、開発のスピードが低下し、ソフトウェア・エンジニアリングのリソースも余計に消費されます。整理されたアプリケーションであればバグの原因を突き止めるのは容易かもしれませんが、スパゲッティー・コードでは複雑な実行経路をたどる必要があります。さらに、小さな変更でもアプリケーションの他の場所に意図しない影響を与える可能性があるため、新たなバグが生じるリスクが高くなります。

新しいメンバーのオンボーディングにも支障を来します。新しいチーム・メンバーはコードを理解するまでに大幅に時間を要し、壊れやすいコードを変更することにもためらいを感じる場合があります。

スパゲッティー・コードの特徴

スパゲッティー・コードは通常、時間の経過とともに生じます。ソフトウェアが最初に構想されるとき、開発者は通常、シンプルで整理されたコードを作成します。しかし、時間の経過とともにソフトウェアが進化するにつれ、その場しのぎの修正や差し迫った納期、要件の変更によって、不必要な複雑さや混乱が生じます。

リソースが限られた状況で開発を行う開発者は、長期的なソフトウェア保守よりも目先の機能実装を優先することがあります。その結果として採られる場当たり的な回避策が、コードを複雑でエラーが発生しやすい状態にしてしまいます。

スパゲッティー・コードには、次のような特徴も見られます。

複雑な制御フロー
:実行の流れが単純な構造に従わず、プログラム内を予測できない形で飛び回ります。

責務の分離がない:無関係なロジックや機能が、1つのファイルや巨大なコードブロックに混在しています。

過度な依存関係:ある箇所の変更が、予期せずアプリケーションの他の部分に影響を及ぼします。

モジュール性の欠如:プログラムを小さな再利用可能なコンポーネントに分割する代わりに、モノリシックなファイルや長く複雑な関数を使用します。

グローバル変数への過度の依存:関数のパラメーターを通じてデータを明示的に受け渡すのではなく、多くの異なるメソッドで同じグローバル変数を変更するため、状態の追跡が困難になります。

重複したロジック:コードブロックがプロジェクト全体で重複しているため、1つのバグを修正するにも、同じロジックを複数箇所で探し出して修正する必要があります。

一貫性のないスタイル:異なるチームが異なる時期に同じプロジェクトへ携わると、それぞれ異なる書式規則が持ち込まれ、コードが読みにくくなることがあります。

ドキュメンテーションの不足:スパゲッティー・コードはドキュメンテーションが不足していることが多く、他の開発者だけでなく、元の作成者であっても、コードが本来どのように動作するよう設計されていたのかを理解するのが難しくなります。

スパゲッティー・コードを防ぐ方法

慎重なシステム設計と規律あるソフトウェア開発の実践に加え、コードが目先で正しく動作することだけを重視するのではなく、将来にわたって理解しやすく保守しやすいコードを書くという考え方へ転換することが、スパゲッティー・コードを回避する鍵となります。

目的を意識した設計

アプリケーションの各コンポーネントには、明確に定義された責務を持たせる必要があります。関数やクラスは、複数の問題を解決しようとするのではなく、1つの主要な役割だけを担うようにする必要があります。関心の分離が明確な、より小さなコード単位を用いることで、コードの可読性、デバッグ性、再利用性、テスト性が向上します。

小さく疎結合なコンポーネントはコーディングのベスト・プラクティスとされていますが、行き過ぎると「ラビオリ・コード」と呼ばれる状態になります。これは、コードベースが小さく独立した自己完結型のモジュールやオブジェクトへ過度に分割された状態を指すアンチパターンであり、皮肉にもスパゲッティー・コードと同様の問題を引き起こすことがあります。また、「ラザニア・コード」という用語もあり、抽象化レイヤーを過剰に積み重ねたアーキテクチャーを指します。過度に階層化すると、不必要な複雑さが生まれます。スパゲッティー・コードは構造が不足していることで生じる一方、ラザニア・コードやラビオリ・コードは構造が過剰であることで生じます。

目標は、コンポーネントやアーキテクチャー・レイヤーの数を増やすことではなく、コードの他の部分に混乱を招くことなく個々のコンポーネントを更新できるモジュール型ソフトウェアを構築することです。

最後に、コードのコピー・アンド・ペーストは避けてください。重複したロジックは管理を複雑にし、アプリケーションの規模が大きくなるにつれて、その複雑さはさらに増していきます。

わかりやすさ

わかりやすさが何よりも重要です。明確で説明的な名前は、コードの目的を伝えるのに役立ちます。一貫した命名規則により、読みやすさが全般的に向上します。目標は、新しく参加した開発者でもコードがどのように動作しているのかをすぐに理解できるようにし、コードの理解に苦労するのではなく、その改善に時間を費やせるようにすることです。

定期的なメンテナンス

定期的なコード・レビューはコーディング標準の徹底につながるだけでなく、過度に複雑なロジックやその他のアーキテクチャー上の欠陥がコードに深く組み込まれる前に、開発者がそれらを特定するのに役立ちます。また、このプロセスは、チーム全体でコードに責任を持つ文化を育み、すべての開発者がクリーンなコードの作成と保守に責任を持つようになります。

自動テストは、コードを変更またはリファクタリングした後も、正しく動作することを確認するのに役立ちます。

AIでスパゲッティー・コードを修正する方法

スパゲッティー・コードが生じてしまった場合、それを解きほぐすには時間をかけて段階的に進める必要があります。大規模な全面書き換えにはコストがかかるため、開発チームは新機能や修正を追加するたびに、少しずつコードを改善していくことが一般的です。

開発者は、大きな関数をより小さなメソッドへ分割し、重複したロジックを削除し、コンポーネント間の結合を疎にし、わかりにくい識別子の名前を変更します。

最新のAIコーディング・アシスタントは、構造化されていないスパゲッティー・コードの解消に非常に役立ちます。

スパゲッティー・コードの見分け方

スパゲッティー・プログラミングは、一見しただけでは気付きにくいかもしれません。プログラムは、詳細な分析がなければ正しく機能するように見えるかもしれません。開発者は、不必要な複雑さや整理不足、高い結合度を示す設計パターンを手掛かりに、スパゲッティー・コードを見つけることがよくあります。しかし、そのような「コードの臭い」と呼ばれる兆候を見つけるには時間がかかります。

IBM BobのようなAIコーディング・アシスタントは、コードを素早く分析し、問題のある箇所を特定することで、数千行ものコードを手作業で確認する負担を大幅に軽減できます。AIアシスタントは、コードの特定の箇所が保守しにくい理由を説明したり、改善案を提案したり、その改善を実際に適用したりすることもできます。

コードの説明

開発者はしばしば、もうそのソフトウェアプロジェクトに参加していない人が書いたソフトウェアを継承します。仕組みを理解するために、コードを精査し、パターンを探す必要があります。AIコーディング・アシスタントは、コードを自然言語で説明することで、この学習期間を短縮できます。開発者は「これは何をするのか?」や「このモジュールに依存しているファイルはどれか?」と質問するだけで、すぐに回答を得られます

リファクタリング

コードリファクタリング もAIが支援できる部分です。大きな関数をより小さなメソッドへ分割したり、重複したコードを削除したり、条件分岐ロジックを簡素化したり、命名を改善したりすることは、いずれもAIによるコード・リファクタリングの代表的なユースケースです。たとえば、IBM Bobは自動化されたリファクタリング提案をリアルタイムで提供します。

防止

AIはコード作成時に、小さく単一目的の関数を推奨したり、再利用可能な抽象化を提案したり、新しいコードが過度な複雑さをもたらした際に警告したりすることで、コード品質の向上にも役立ちます。チーム全体でベスト・プラクティスの徹底を支援し、新機能とともにユニット・テストを生成することもできます。

執筆者

Cole Stryker

Staff Editor, AI Models

IBM Think

関連ソリューション
IBM Bob

セキュリティーで保護された意図認識型の開発を実現するAIパートナー、IBM®  Bobにより、ソフトウェア・デリバリーを加速します。

IBM Bobはこちら
開発者向けAIソリューション

企業向けツールを活用し、AIアプリケーションの開発、デプロイ、管理をより迅速に実行します。

開発者向けAIの詳細はこちら
アプリケーション・モダナイゼーション・サービス

インテリジェントなAIモダナイゼーションにより、レガシー・システムを再構築します。

アプリケーション・モダナイゼーション・サービスの詳細はこちら
次のステップ

生成AIと高度な自動化を活用し、企業向けのコードをより迅速かつ一貫性を持って提供します。Bobモデルは開発者のスキルを拡張し、モダナイゼーション・ワークフローの効率化や複雑な開発タスクの簡素化を実現します。

  1. AIコーディング・エージェントの紹介
  2. 開発者向けAIソリューションの詳細はこちら