アンチパターンとは何か?プロジェクトを失敗に導く事例を解説

2021年4月15日

アンチパターンの概要

アンチパターンとはソフトウェア開発における失敗事例をまとめたものです。
アンチパターンに当てはまるプログラムは解析や改修が難しく、プロジェクトは失敗する可能性が高くなります。
「アンチパターン」という言葉はプログラマのアンドリュー・ケーニッヒによって1995年に作り出されました。

ソフトウェア開発において「こうあるべき」という概念がデザインパターンであるのに対し、「こうあってはならない」という概念がアンチパターンとなります。

補足:デザインパターンとは何か?

デザインパターンとは、再利用可能なソフトウェア設計のパターンをまとめたものです。
GoF(Gang of Four:エーリヒ・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディーズの4人の愛称)による『オブジェクト指向における再利用のためのデザインパターン』によって広く世に知られました。
デザインパターンを用いることで、ソフトウェアの成功事例を踏襲した設計を行うことができます。

なぜアンチパターンが必要なのか

アンチパターンを正確に定義する目的は失敗の再発を防ぐことです。
また、アンチパターンが発生した際に復旧・対応できるよう準備しておくという目的もあります。
アンチパターンを知っていれば、プログラムが複雑になる前にリファクタリングを行い、プロジェクトが失敗に陥る前に回避できる可能性が高くなります。

デザインパターンがスキルの高い開発者から生まれたものであるのに対して、アンチパターンは誰の身にも起こりうるあらゆる場面で見られるものです。
アンチパターンを把握しておいて、早めに対策を打つことが重要です。

代表的なアンチパターン

アンドリュー・ケーニッヒがアンチパターンという言葉を生み出した3年後、『アンチパターン』という書籍がウィリアム・ブラウン、ラファエル・マルボー、スキップ・マコーミック、トム・モーブレーによって出版されました。『アンチパターン』にはプログラムやプロジェクトを失敗に導くパターンと、失敗に対処するための手段が提供されています。

ブロブ

ブロブとは、特定のクラスに処理が集められ、他のクラスはデータを持っているだけのような構造です。
関連性のないフィールドやメソッドが混在した状態となってしまっています。
当然、特定のクラスが肥大化していきます。このようなクラスは再利用性が低くなってしまうでしょう。

リファクタリングによって、関連性のあるフィールドとメソッドを分離し、クラス間の結びつきを見直す必要があります。

コピーアンドペーストプログラミング

コピーアンドペーストプログラミングとは、同一のソースコードを複数の箇所で使い回すことをいいます。
コピーアンドペーストで簡単に複製されるためこのように呼ばれています。
ソースコードに変更を加えようとした場合、コピーアンドペーストで複製されたすべてのソースコードの影響を確認しなければいけません。

同一の処理はサブルーチンを切り出して、サブルーチンを呼び出す手法を使用するべきです。

スパゲティコード

スパゲティコードとは、まるでスパゲティのように複雑に絡み合ったソースコードです。
プログラムを書いた本人でさえ解読が困難なものもあります。
こうしたスパゲティコードで構築されたシステムは、改修を行う際に予想していなかった箇所に不具合が発生する可能性があるため、保守性が著しく低くなります。

スパゲティコードが生まれてしまう原因としては、無条件に指定した場所へ移動させるgoto文の乱用などが挙げられます。
スパゲティコードは積極的にリファクタリングされるべきでしょう。

スパゲティコードについては以下の記事でも解説していますので、ご参照ください。

デスマーチ

デスマーチはプログラミングというよりはプロジェクト管理のアンチパターンといえます。
残業や休日出勤などの長時間勤務の常態化で、プロジェクトメンバーが死への行進を行っている様子から「デスマーチ」と呼ばれます。
しかも、それだけの過酷な状況を強いられながらプロジェクトが成功する保証はありません。

「デスマーチ」という言葉を広めたエドワード・ヨードンは、デスマーチを回避するためには「トリアージ」が必要であるとしています。
トリアージとは、すべてを完璧にこなそうとするのではなく、優先順位の高いものだけをリリースしていく手法です。
これを顧客との合意のうえで行うことが重要であると述べています。

参考