YAGNI

You Aren't Gonna Need It - 今必要でない機能を先回りして実装しない原則

設計原則設計

YAGNI とは

YAGNI (You Aren't Gonna Need It) は、今必要でない機能を先回りして実装しない原則である。エクストリームプログラミング (XP) の Ron Jeffries が提唱した。「将来必要になるかもしれない」という推測に基づく実装は、ほとんどの場合使われずに技術的負債になる。

違反の例

// ❌ YAGNI 違反: 今は JSON しか使わないのに複数フォーマットに対応
interface Serializer<T> {
  serialize(data: T): string;
  deserialize(raw: string): T;
}
class JsonSerializer<T> implements Serializer<T> { /* ... */ }
class XmlSerializer<T> implements Serializer<T> { /* ... */ }
class CsvSerializer<T> implements Serializer<T> { /* ... */ }
class SerializerFactory { /* ... */ }

// ✅ YAGNI: 今必要な JSON だけ
function toJson<T>(data: T): string { return JSON.stringify(data); }
// ❌ YAGNI 違反: 今は 1 つの DB しか使わないのに抽象化
class AbstractRepository<T> { /* ... */ }
class DynamoDBRepository<T> extends AbstractRepository<T> { /* ... */ }
class PostgresRepository<T> extends AbstractRepository<T> { /* ... */ }

// ✅ YAGNI: DynamoDB を直接使う
async function getUser(id: string) {
  return db.get({ TableName: 'users', Key: { id } });
}

YAGNI vs 拡張性

YAGNI は「拡張性を考えるな」ではなく「今使わない拡張ポイントを実装するな」という原則だ。

判断
✅ 今必要 バリデーション、エラーハンドリング、ログ
✅ 設計で考慮 インターフェースの安定性、データ構造の拡張性
❌ 今実装しない 使う予定のない API エンドポイント
❌ 今実装しない 要件にない管理画面

KISS・DRY との関係

原則 問いかけ
YAGNI 「今それは本当に必要か?」
KISS 「もっとシンプルにできないか?」
DRY 「同じことを 2 回書いていないか?」

YAGNI は機能の取捨選択、KISS は実装の複雑さ、DRY はコードの重複に焦点を当てる。3 つは補完関係にある。

AWS アーキテクチャでの YAGNI

❌ 初期段階で: API Gateway → Lambda → SQS → Lambda → SNS → Lambda → DynamoDB
✅ 初期段階で: API Gateway → Lambda → DynamoDB
   → 負荷が増えたら SQS を追加
   → 通知が必要になったら SNS を追加

マイクロサービスやイベント駆動アーキテクチャは強力だが、トラフィックが少ない初期段階では過剰設計だ。

判断基準

  • 「将来必要になるかも」→ 必要になってから実装する
  • 「念のため」→ 念のための実装は大抵使われない
  • 「汎用的にしておこう」→ 3 回目の重複が出てから汎用化する

より深く学ぶには関連書籍が役立つ。

関連用語