AI協働
7

AIの思考パターンの癖:なぜスケーラビリティに気づきにくいのか

NEWSとTIPS実装時の経験から学ぶ、AIがスケーラビリティの問題を見逃しやすい理由と、より良い設計を引き出すための対策を解説します。

AI開発スケーラビリティ設計パターンClaudeChatGPT

NEWSとTIPSコーナーの実装時、興味深い現象が起きました。AIは最初、すべての記事を1つのJSONファイルに格納する設計を選択したのです。これは「動く実装」としては正しいですが、コンテンツが増え続ける前提を考慮していませんでした。

この経験から、AIの思考パターンの特徴と、より良い設計を引き出す方法について考察します。

なぜAIはスケーラビリティを見逃すのか

1. コンテキストの限界

AIは与えられたタスクを「今すぐ動かす」ことに集中する傾向があります。

json
// AIが最初に提案した構造
{
  "articles": [
    { "id": 1, "title": "記事1", "content": "..." },
    { "id": 2, "title": "記事2", "content": "..." },
    // 100件、1000件と増えたら...?
  ]
}

この設計は10件程度なら問題ありませんが、記事が増えるたびにファイルサイズが肥大化し、以下の問題が発生します:

  • メモリ使用量の増加: 一覧表示のためだけに全記事を読み込む
  • パフォーマンス低下: JSONファイルが大きくなるほど解析時間が増加
  • 開発効率の低下: 複数人で編集時にコンフリクトが頻発

2. 最適化の優先順位

AIは「シンプルで理解しやすい」実装を優先します:

javascript
// AIが考える「シンプル」な実装
const articles = await fetch('/data/news.json').then(r => r.json());
const latest = articles.slice(0, 10);

確かにシンプルですが、1000件の記事があったら?

3. 実装時の思考の違い

人間の開発者は「将来どうなるか」を自然に考えますが、AIは「今のタスクを解決する」ことに集中します。

人間の思考: 「ニュース記事は毎日追加されるから、いずれ数百件になるな...」

AIの思考: 「記事を表示する機能を実装します。JSONファイルに配列として保存すれば簡単です」

より良い設計を引き出すための対策

1. 明示的な制約を与える

markdown
# ❌ 曖昧な指示
「ニュース機能を実装してください」

# ✅ 明確な制約
「ニュース機能を実装してください。
- 記事は時間とともに増え続けます(目標: 1000件以上)
- ページネーションで10件ずつ表示
- 記事の追加・編集が頻繁に行われます
- 複数人での同時編集を考慮してください」

2. 設計レビューを要求する

実装前に設計案を提示してもらい、スケーラビリティをチェック:

markdown
「実装前に以下を含む設計案を提示してください:
1. データ構造
2. ファイル構成
3. 100件、1000件規模でのパフォーマンス考察
4. 運用時の課題と対策」

3. ベストプラクティスを参照させる

markdown
「以下のベストプラクティスに従って実装してください:
- 大量のコンテンツは個別ファイルに分割
- インデックスと詳細データを分離
- 必要なデータのみを読み込む設計」

正しい実装例

ファイル構造

/public/data/news/
├── index.json          # メタデータのみ(軽量)
└── articles/           # 個別記事ファイル
    ├── 2025-06-16-001.json
    ├── 2025-06-16-002.json
    └── ...

インデックスファイル(軽量)

json
// index.json - メタデータのみ
{
  "articles": [
    {
      "id": "2025-06-16-001",
      "date": "2025-06-16",
      "title": "記事タイトル",
      "excerpt": "概要文"
      // contentは含まない
    }
  ]
}

個別記事ファイル

json
// articles/2025-06-16-001.json
{
  "id": "2025-06-16-001",
  "title": "記事タイトル",
  "content": "本文の内容...",
  "author": "著者名",
  "tags": ["AI", "開発"]
}

実装コード

typescript
// 一覧表示(軽量なインデックスのみ読み込み)
export async function getNewsList(): Promise<NewsIndex> {
  const res = await fetch('/data/news/index.json');
  return res.json();
}

// 詳細表示(必要な記事のみ読み込み)
export async function getNewsDetail(id: string): Promise<NewsArticle> {
  const res = await fetch(`/data/news/articles/${id}.json`);
  return res.json();
}

// ページネーション対応
export async function getNewsPage(page: number, limit: number = 10) {
  const index = await getNewsList();
  const start = (page - 1) * limit;
  const end = start + limit;
  
  return {
    articles: index.articles.slice(start, end),
    totalPages: Math.ceil(index.articles.length / limit),
    currentPage: page
  };
}

メリットの比較

単一ファイル方式

- ✅ 実装が簡単 - ❌ スケーラビリティの問題 - ❌ メモリ使用量が増大 - ❌ 編集時のコンフリクト

分割ファイル方式

- ✅ 高いスケーラビリティ - ✅ 効率的なメモリ使用 - ✅ 並行編集が容易 - ✅ CDNキャッシュの最適化 - ❌ 初期実装がやや複雑

AIとの協働のコツ

1. 「なぜ」を説明する

markdown
「記事を個別ファイルに分割してください。
理由:将来的に1000件以上の記事を扱う予定で、
単一ファイルではパフォーマンスが低下するため」

2. 具体的な数値を示す

markdown
「このシステムは以下の規模を想定してください:
- 記事数: 1000件以上
- 月間追加数: 30-50件
- 同時編集者: 3-5名」

3. トレードオフを議論する

markdown
「実装の複雑さとスケーラビリティのトレードオフについて、
あなたの意見を聞かせてください」

まとめ

AIは優れたコーディングパートナーですが、長期的な視点やスケーラビリティについては人間が補完する必要があります。

    重要なポイント
  1. AIは「今動く」実装を優先する傾向がある
  2. スケーラビリティは明示的に要求する必要がある
  3. 設計段階でのレビューが重要
  4. 具体的な制約と数値を提示する

AIの特性を理解し、適切にガイドすることで、より良い設計と実装を実現できます。この経験を活かして、次のプロジェクトではより良い協働ができるでしょう。