はじめに

「ジェンスパーク(Genspark)が書いたコードだから、完璧なはず」

多くの人がそう考えがちですが、これは大きな誤解です。私もWebサイトの開発初期は、AIが生成したコードをそのまま信じてデプロイしていました。その結果は...バグだらけのアプリケーションでした。

ジェンスパークは確かに高速にコードを生成してくれます。しかし、人間と同じように、AIもバグを埋め込みます。 今回は、前回の記事に続き、実際に遭遇したAI由来のバグと、その対策方法をご紹介します。

※2026年9月追記:この記事を書いた2025年当時と比べると、Gensparkの開発機能は大きく進化しています。当時のAI Developerは現在「Genspark Code」という名称になり、Genspark公式では、AIが計画、コーディング、テスト、デプロイまで行う自律型コーディングエージェントと説明されています。それでも、AIが自動でテストするからバグがなくなるわけではありません。この記事で紹介している「生成されたコードを検証する」という基本的な考え方は現在も変わらないと思います。

AIコーディングの現実:バグ発生率は意外と高い

AIが生成したコードにどの程度問題が含まれるかは、使用するモデル、プログラミング言語、タスク、評価方法によって大きく変わります。

以前この記事では「2025年の最新調査によると、AIが生成したコードの約15〜30%に何らかの問題が含まれる」と書いていました。しかし、この数字をAI生成コード全体の一律のバグ発生率として示せる根拠を現在確認できなかったため削除しました。

AI生成コードのセキュリティを調べた研究などでは実際に脆弱性が確認されていますが、「セキュリティ上の脆弱性」と「すべてのバグ」は同じものではありません。

特に以下のような問題には注意が必要です:

よくあるAI由来のバグ

1. ロジックエラー

  • 条件分岐の抜け漏れ
  • エッジケースへの対応不足
  • 非同期処理の競合

2. セキュリティ問題

  • 入力値の検証不足
  • SQLインジェクション脆弱性
  • 認証・認可の不備

3. パフォーマンス問題

  • 無駄なループ処理
  • データベースクエリの非効率
  • メモリリーク

AIツール開発企業Cursorは、AIによるコードレビュー機能「Bugbot」を提供しています。2026年現在も開発が続いており、プッシュ前にコードレビューを実行する機能なども追加されています。

AIが生成したコードを別のAIでレビューする仕組みが実際の開発ツールに組み込まれていることからも、AIがコードを書いた後に検証する工程は必要だと考えた方がよいでしょう。

実体験1: 無限ループを生成したAI

Webサイトで、ユーザーのWeb機能結果をキャッシュする機能を実装していた時のことです。

私の依頼:「キャッシュが存在する場合は再計算をスキップする関数を作成してください」

ジェンスパーク(Genspark)が生成したコード

async function getCachedResult(userId: string) {
  let result = await cache.get(userId);

  while (!result) {
    result = await calculateCompatibility(userId);
    await cache.set(userId, result);
  }

  return result;
}

一見問題ないように見えますが、この実装には問題があります。

問題点

  • calculateCompatibility()がnullやundefinedなどを返し続ける場合、whileループが終了しない
  • 再試行回数の上限がないため、異常時に処理を繰り返し続ける可能性がある
  • 「キャッシュがなければ1回計算する」という要件に対して、そもそもwhileを使う必要がない

なお、元の記事では「cache.get()が失敗した場合、whileループが永遠に続く」「キャッシュ保存に失敗してもループを抜けられない」と説明していましたが、この説明は正確ではありませんでした。

calculateCompatibility()が通常の値を返せば、このループは1回で終了します。また、cache.set()が例外を投げた場合は通常そこで処理が中断されます。

問題の本質は、1回だけ計算すればよい処理に終了条件の保証されていないwhile文を使っていたことです。

正しい実装

async function getCachedResult(userId: string) {
  let result = await cache.get(userId);

  if (!result) {
    result = await calculateCompatibility(userId);
    await cache.set(userId, result);
  }

  return result;
}

ジェンスパークは「キャッシュがない場合に計算する」という意図を理解しましたが、このケースではwhile文を使う必要がありませんでした。

実体験2: 非同期処理とエラーハンドリングの問題

当時のTwitter API(現在のX API)連携では、さらに別の問題に遭遇しました。

ジェンスパーク(Genspark)が生成したコード

async function postToTwitter(tweets: Tweet[]) {
  for (const tweet of tweets) {
    await api.post(tweet);
    console.log('Posted:', tweet.id);
  }
}

問題点

  • ループ内でawaitを使っているため、1件ずつ投稿するので処理は遅くなる
  • 途中のapi.post()で例外が発生すると、その時点で関数が停止し、残りの投稿が処理されない
  • エラー処理や再試行処理がない

ここも元の記事では、「1件ずつ投稿するためAPI制限に引っかかる可能性がある」と書いていましたが、これは正確ではありません。

むしろ逐次実行は同時リクエスト数を抑えられるため、レート制限に対しては安全側になる場合があります。

また、以前は改善版としてPromise.allSettled()で全件を並列実行するコードを掲載していましたが、APIによっては大量のリクエストを同時送信する方がレート制限に引っかかりやすくなります。

そのため、単純に「並列化すれば正解」とは言えません。

改善版

async function postToTwitter(tweets: Tweet[]) {
  const succeeded = [];
  const failed = [];

  for (const tweet of tweets) {
    try {
      await api.post(tweet);
      succeeded.push(tweet.id);
    } catch (error) {
      failed.push({
        id: tweet.id,
        error
      });
    }
  }

  console.log(`Posted: ${succeeded.length}, Failed: ${failed.length}`);
  return { succeeded, failed };
}

この例では速度よりも、1件失敗しても残りの処理を継続できることを優先しています。

大量のリクエストを高速に処理したい場合は、利用するAPIのレート制限を確認したうえで、同時実行数を制限した並列処理やリトライ、バックオフなどを設計する必要があります。

ジェンスパークが生成したコードが「動く」ように見えても、実際のAPI仕様まで含めて適切かどうかは別途確認する必要があります。

実体験3: データベースクエリの非効率

記事一覧表示機能で、ジェンスパーク(Genspark)がこんなコードを生成しました:

問題のあるコード

async function getArticlesWithCategories() {
  const articles = await db.query('SELECT * FROM articles');

  for (const article of articles) {
    article.category = await db.query(
      'SELECT name FROM categories WHERE id = ?',
      [article.category_id]
    );
  }

  return articles;
}

何が問題か

  • N+1問題:記事が100件あれば、合計101回のクエリが実行される
  • データベースへの負荷が非常に高い
  • レスポンスが極端に遅くなる

正しい実装(JOIN使用)

async function getArticlesWithCategories() {
  const articles = await db.query(`
    SELECT
      articles.*,
      categories.name as category_name
    FROM articles
    LEFT JOIN categories ON articles.category_id = categories.id
  `);

  return articles;
}

このときジェンスパークが生成したコードでは、基本的なSQLは動いていましたが、パフォーマンスを考慮した最適化まではできていませんでした。

N+1問題については、後に「N+1問題:ジェンスパーク(Genspark)が埋め込む典型的バグと完全解決法」でも詳しくまとめています。

なぜジェンスパーク(Genspark)はバグを埋め込むのか

AIがバグを生成する主な理由:

1. 文脈や要件を完全に把握できない場合がある

  • 必要な仕様がプロンプトに含まれていない
  • プロジェクト全体の情報を十分に参照できていない
  • 既存コードとの整合性を見落とすことがある

2. エッジケースやテスト条件が不足する

  • 正常系だけを考えたコードになることがある
  • null、空データ、通信失敗などが考慮されない
  • 実際に実行しないと分からない問題が残る

3. 最適化やセキュリティが自動的に保証されるわけではない

  • 「動くコード」と「良いコード」は同じではない
  • パフォーマンスやセキュリティまで確認する必要がある

2026年現在のGenspark Codeは、以前のAI Developerよりも開発作業を広く自動化し、計画、コーディング、テスト、デプロイまでAI自身が行うことを特徴としています。

そのため、以前よりも「コードを書いて終わり」ではなく、AI自身にテストや修正まで行わせやすくなっています。

それでも、テストケースそのものが不足していれば問題を見逃す可能性がありますし、仕様を誤解したまま正しく動くコードを作ることもあります。

人間のコーディング知識が重要な理由

では、コーディング初心者はAI開発を諦めるべきでしょうか?答えはNoです。

この記事を書いた当時は「最低限のコーディング知識は必要」と書いていました。

現在のGenspark Codeは、公式には「コーディングスキルがなくてもアプリを作れる」ことを特徴としているため、アプリを作ること自体にコーディング知識が必須とは言い切れなくなりました。

実際、Genspark公式のUser Storyでも、コード経験のない利用者がアプリや社内ツールを作っている事例が紹介されています。

ただし、本番環境で使うシステムを作るのであれば、以下の知識があるほどAIの問題に気づきやすくなります。

あると役立つスキル

1. 基本構文の理解

  • 変数、関数、条件分岐、ループ
  • データ型と型エラーの読み方

2. デバッグ基礎

  • エラーメッセージの読み方
  • console.logでの動作確認
  • ブレークポイントの使い方

3. 基本的なアルゴリズム

  • 配列操作
  • 非同期処理の基本
  • データベース操作の基礎

これらの知識があれば、ジェンスパーク(Genspark)が生成したコードの問題点に気づき、修正を指示できます。

非エンジニアがGensparkでアプリを作る場合につまずきやすいポイントについては、「Genspark AI Developerでノーコード開発、非エンジニアがつまずきやすい4つのポイント」でもまとめています。

実践的なデバッグ手法

1. AIコードレビューの習慣化

ジェンスパーク(Genspark)が生成したコードは、必ず以下をチェック:

  • ✓ エラーハンドリングはあるか?
  • ✓ エッジケース(null、空配列など)に対応しているか?
  • ✓ ループの終了条件は正しいか?
  • ✓ 非同期処理の競合はないか?
  • ✓ データベースクエリは効率的か?
  • ✓ セキュリティ上の問題はないか?

コードを修正させた後は、AIの「修正しました」という報告だけでなく、Gitのdiffなどで実際に何が変わったのか確認することもおすすめします。

特に本番公開するコードについては、「ジェンスパーク(Genspark)生成コードのセキュリティチェックリスト:本番投入前の必須検証項目」も参考にしてください。

2. 段階的なテスト実行

いきなり全機能を実装せず、小さく試す:

// ステップ1: 基本機能のテスト
console.log('Test 1: Basic function');
const result1 = await basicFunction();
console.log('Result:', result1);

// ステップ2: エッジケースのテスト
console.log('Test 2: Empty input');
const result2 = await basicFunction([]);
console.log('Result:', result2);

// ステップ3: エラーケースのテスト
console.log('Test 3: Invalid input');
try {
  const result3 = await basicFunction(null);
} catch (error) {
  console.log('Error caught:', error);
}

3. AIに「修正理由を説明させる」

バグ修正を依頼する際:

❌ 悪い例:「このコードを修正してください」

✅ 良い例:「このコードで無限ループが発生しています。原因を特定し、修正案と修正理由を説明してください」

理由を説明させることで、AIの理解度を確認でき、新たなバグの埋め込みにも気づきやすくなります。

4. 別のAIにもレビューさせる

この記事を書いた当時より、現在はこの方法をよく使うようになりました。

同じAIに、「自分が作ったコードをレビューして」と依頼すると、自分自身が作ったときと同じ思い込みを引き継いでしまうことがあります。

そこで私は、Claude Codeで作ったコードをCodexやAntigravityに確認させるなど、別のAIにも監査させるようになりました。実際に試すと、Claude Code、Codex、Antigravityで見つける問題が異なることがありました。

詳しくは「Claude Codeで作ったソースをCodex・Antigravityで監査 今は1つのAIだけで開発しない方がいい」で紹介しています。

Cursor BugbotとAIデバッグツール

Cursorの「Bugbot」は、AIを使ってコードレビューを行う機能です。

元の記事では「2025年8月にリリース」と書いていましたが、Cursor公式によるとBugbotがベータ版を終了したのは2025年7月です。

2026年現在もBugbotは継続してアップデートされています。2026年6月には、平均レビュー時間が約5分から約90秒へ短縮され、1回のレビューで見つけるバグも平均10%増えたとCursorが発表しています。

さらに現在は、コードをプッシュする前に/reviewからBugbotやSecurity Reviewを実行することもできます。

Bugbotの特徴

  • 論理エラーの検出
  • セキュリティ上の問題の検出
  • コードレビューの自動化

ただし、Bugbot自体もAIであるため、100%の精度は保証されません。最終的な判断は人間が行う必要があります。

Bugbotについては「Cursor Bugbotで変わるAIデバッグの未来:2025年最新動向」でも紹介しています。

まとめ:AIと人間の協働が理想

覚えておくべきポイント:
  1. ジェンスパーク(Genspark)は高速にコードを生成するが、完璧ではない - 一律の「バグ混入率」で判断せず、生成後に検証する
  2. 人間にコーディング知識があるほど問題を検証しやすい - 基本構文、デバッグ、アルゴリズムの理解
  3. コードレビューとテストを怠らない - AI生成コードこそ慎重にチェック
  4. 段階的な実装と検証 - 小さく作って、小さくテスト
  5. AIデバッグツールも活用する - ただし過信はしない

ジェンスパークは開発速度を大幅に上げてくれますが、バグチェックを省略すると、後で修正に多くの時間がかかることになります。

AIを信頼しつつ、人間がしっかり監督する—これは2026年現在でもAI開発の基本だと思います。

次回は「ジェンスパークは固まる・ループする」というテーマで、AIチャットのフリーズ問題と、データ消失を防ぐバックアップ戦略をご紹介します。

料金ページはこちら:Genspark公式料金ページ(ページ中ほどに料金が書いてあります)