一人前エンジニア道場

AI活用開発演習 / 約25分

AIでコードを書く実践

なぜこれを学ぶか

「AIにコードを書かせる」サイクルは「要件の言語化 → プロンプト設計 → コード生成 → 動作確認 → 改善」の繰り返しです。このレッスンでは、AIが生成した「バグありコード」のレビューと修正を通じて、このサイクルの「確認」フェーズを重点的に訓練します。

AI活用開発の5ステップサイクル: ①要件言語化 — 「何が欲しいか」を具体的に書き出す(曖昧さをゼロにする)。②プロンプト設計 — 4要素(役割・コンテキスト・指示・制約)を揃える。③コード生成 — AIに投げて出力を得る。④動作確認 — テストを実行し、エッジケースを試す。⑤改善 — バグが出たら原因を伝えて再生成・手修正。

AIコードレビューの観点: ❶動作の正確さ — 指示した要件を満たしているか。❷エッジケース — 空配列・null・0・境界値で壊れないか。❸セキュリティ — SQLインジェクション・XSSなどの脆弱性がないか(L3で詳しく学ぶ)。❹可読性 — 変数名・コメントが分かりやすいか。❺既存コードとの整合性 — チームのコーディング規約・命名規則に合っているか。

よくある「AIコードの落とし穴」パターン: ▶ エラーハンドリングが省略されている(try-catchなし)▶ 非同期処理でawaitを忘れている ▶ 入力値の検証(バリデーション)がない ▶ ハードコードされた値(URLや設定値を直書き)▶ 古い書き方(deprecated APIの使用)

「コードが動いた≠完成」: AIが書いたコードは「ハッピーパス(正常系)」だけ動くことが多いです。「空配列を渡したら?」「nullが来たら?」「リクエストが失敗したら?」を試してこそ、本番コードと言えます。

重要ポイント

  • AIコード活用は「要件言語化→プロンプト→生成→確認→改善」の5ステップサイクル
  • AIはハッピーパスしか考えないことが多い。エッジケースのテストは自分でやる
  • エラーハンドリング・バリデーション・非同期のawait漏れに注意
  • 「動いた」はスタート。テスト済みになってはじめて「完成」

コードレビュー演習

以下はAIが生成した「ユーザーの年齢確認関数」のコードです。 プロンプト指示は「ユーザーオブジェクトを受け取り、18歳以上ならtrueを返すisAdult関数を書いて」でした。 このAI出力コードのレビューをしてください。

/* === AIが生成したコード(疑似出力)=== */

function isAdult(user) {
  return user.age >= 18
}

/* === AIが生成したテストコード(疑似出力)=== */
// テスト1: 20歳ならtrue
console.log(isAdult({ age: 20 }))  // → true ✅
// テスト2: 15歳ならfalse
console.log(isAdult({ age: 15 }))  // → false ✅

/* === あなたが追加検証したエッジケース === */
console.log(isAdult(null))          // → TypeError: Cannot read properties of null
console.log(isAdult({}))            // → false (undefined >= 18 は false になる)
console.log(isAdult({ age: '20' })) // → true  (文字列との比較が意図しない挙動を生む可能性)

このAI出力のコードに存在する最も重大な問題はどれ?

ヒントを見る

AIが書いたテストは「動く入力」だけです。実際の呼び出し元からはどんな値が来るか分かりません。

コーディング演習実際に書く

上のAI出力コードをレビューした結果、null・ageなし・ageが数値でない場合のエッジケースが未対応でした。 以下の要件を満たすよう isAdult 関数を修正してください。 要件: - userがnullまたはundefinedの場合はfalseを返す - user.ageが存在しない(undefined)場合はfalseを返す - user.ageが数値でない場合はfalseを返す - user.ageが18以上の場合はtrueを返す - それ以外(18未満)はfalseを返す

function isAdult(user)

スキルセルフチェック

このレッスンの内容をどの程度理解できましたか?