Skip to content

AI支援開発ワークフロー

これまでの章で、AI IDEを使ってコードを書く方法、Gitでコードのバージョンを管理する方法、APIインターフェースを設計・実装する方法を学んできました。しかし、実際の開発タスクに直面すると、次のような疑問にぶつかるかもしれません:

  • 「このプロジェクトには何千ものファイルがある。どこから始めればいいの?」
  • 「上司から新機能の追加を頼まれたけど、この部分のコードベースに詳しくない」
  • 「このバグがどこにあるのか全く分からない。コードが多すぎる」
  • 「このコードの山をリファクタリングしたいけど、何かを壊すのが怖い」

これらの疑問の本質は、実際の開発シナリオでAIツールをどう効率的に活用して仕事を進めるかということです。

このレッスンでは、体系的なAI支援開発ワークフローを構築する方法を学び、さまざまな開発シナリオでAIを効率的に活用できるようにします。具体的な例を通じて、新機能開発、バグ修正、コードリファクタリングなどでAIを使う方法を示します。

💡 前提条件

このセクションを学ぶ前に、まず以下を理解しておくことをお勧めします:

📚 この章で学ぶこと

  1. 開発プロセスにおけるAIの役割とその能力の境界を理解する
  2. 異なるプロジェクトタイプに応じたAI支援開発戦略をマスターする
  3. 新機能開発、バグ修正、コードリファクタリングなどのシナリオでClaude Codeを使う方法を学ぶ
  4. プロジェクトのナレッジベースを構築し、Claude Codeとの協業効率を向上させる
  5. AIとの協業効率を高める実践的なテクニックをマスターする

1. AIの能力の境界を理解する

AIを使って開発を支援し始める前に、まずAIにできることとできないことを理解する必要があります。そうして初めて、適切な協業モデルを構築できます。

1.1 AIが得意なこと

AIを、明確な指示を必要とする非常に賢いアシスタントと考えてください。記述に基づいてコードの骨組みを素早く生成でき、数千行のコードを数秒で読んで必要な部分を見つけることもできます。明らかな構文エラーや一般的なセキュリティ脆弱性があれば、それらを発見するのにも役立ちます。変数の一括リネーム、コードのフォーマット、ドキュメントコメントの生成といった反復的なタスクは、特にAIに任せるのに適しています。

簡単に言えば、AIは明確なルールがあり自動化できる作業が得意です。

1.2 AIが苦手なこと

しかし、AIにも限界があります。ビジネスロジックを理解していません。詳しく伝えない限り、あなたの会社の注文フローがどうなっているかは分かりません。また、技術選定やアーキテクチャ設計のような、トレードオフを考慮する必要がある意思決定もできません。それらはあなたの経験とプロジェクトへの理解に依存するからです。さらに、「すべてのAPIにロギングが必要」「エラーコードはenumを使う必要がある」といったチームの特別なルールも知りません。それらのルールを設定するか、明示的に伝える必要があります。

最も重要なのは、AIが生成したコードをそのまま使ってはいけないということです。必ずレビューしてテストする必要があります。正しく見えるが実際には問題があるコードを生成する可能性があり、特定のエッジケースを見落とすこともあります。

1.3 AIとの協業方法

AIの能力の境界を理解すると、協業モデルが明確になります:何を作るかを決め、意思決定を行い、品質を確保するのはあなたの責任;具体的なコーディング作業の実行、情報の検索、明白な問題の発見はAIの責任です。

これはジュニア開発者と仕事をするのに似ています。何をすべきかを伝え、彼らが実装し、その後コードをレビューします。違いは、AIの実行速度ははるかに速いですが、判断力は人間より劣るということです。

2. 異なるプロジェクトタイプの開発戦略

プロジェクトのタイプによって、開発スタイルとAIの活用戦略は異なります。適切な戦略を選ぶことで、開発効率を大幅に向上できます。

2.1 新規プロジェクト(ゼロから始める場合)

プロジェクトの特徴:

  • 過去の負債がなく、自由に設計できる
  • プロジェクト構造とコード規約を確立する必要がある
  • 高速なイテレーションと試行錯誤に適している

推奨されるワークフロー:

ステップ1:プロジェクト構造を計画する

コーディングを始める前に、まずAIにプロジェクト構造と技術選定の計画を手伝ってもらいます:

text
タスク管理アプリを構築したい。機能は以下の通り:
- ユーザー登録とログイン
- タスクの作成、編集、削除
- タスクのカテゴリとタグ
- タスクリマインダー

以下を手伝ってほしい:
1. 適切な技術スタックの推奨
2. プロジェクトのディレクトリ構造の設計
3. データベーススキーマの計画

ステップ2:基本フレームワークを構築する

計画に基づいて、AIに基本的なプロジェクト構造を作成してもらいます:

text
先ほどの計画に基づいて、以下を手伝ってほしい:
1. プロジェクトのディレクトリ構造を作成
2. 設定ファイル(package.json、.envなど)を初期化
3. 基本的なサーバーコードを作成

ステップ3:機能を一つずつ実装する

優先順位に従って機能モジュールを一つずつ実装します:

text
次はユーザー登録機能を実装する。要件は以下の通り:
- メールアドレスとパスワードで登録
- パスワードを暗号化して保存
- メール認証

ポイント:

  • 早い段階でコード規約を確立し、AIがそれに従ったコードを生成するようにする
  • 各機能モジュールが完成したらすぐにテストして検証する
  • プロジェクトのドキュメントを適時に更新する

2.2 成熟したプロジェクト(大規模な既存コードベース)

プロジェクトの特徴:

  • 大規模なコードベースで歴史的な規約がある
  • コーディングスタイルの一貫性を保つ必要がある
  • 変更は影響範囲を考慮する必要がある

推奨されるワークフロー:

ステップ1:プロジェクト構造を理解する

コードを変更する前に、まずAIにプロジェクトの理解を手伝ってもらいます:

text
これはECプロジェクトで、クーポン機能を追加する必要がある。
以下を手伝ってほしい:
1. プロジェクト全体の構造を分析
2. 注文関連のコードを見つける
3. 他の類似機能がどのように実装されているか確認する

ステップ2:参考コードを見つける

プロジェクト内の類似実装をAIに見つけて参考にしてもらいます:

text
プロジェクト内の他のプロモーション機能(満額割引や割引など)がどのように実装されているか見つけてほしい

ステップ3:既存のスタイルに従う

既存のコードのスタイルで新機能を実装するようにAIに依頼します:

text
満額割引プロモーションの実装方法を参考にして、クーポン機能を実装してほしい。
同じコードスタイルとディレクトリ構造を維持してほしい。

ポイント:

  • まず理解してから変更し、既存のアーキテクチャを損なわないようにする
  • コーディングスタイルの一貫性を保つ
  • 変更後に関連機能をテストする

2.3 ラピッドプロトタイプ(アイデアの検証)

プロジェクトの特徴:

  • スピードが最も重要で、コード品質はそれほど重要ではない
  • 製品アイデアや技術アプローチの検証に使用する
  • 後で破棄または書き直す可能性がある

推奨されるワークフロー:

要件を直接記述して素早く実装する:

text
シンプルなTodoアプリを構築する。要件は以下の通り:
- タスクの追加、削除、完了マーク
- データをローカルに保存
- UIはシンプルに、動けばよい

素早くイテレーションする:

text
検索機能を追加
ダークテーマに切り替え
タスクカテゴリを追加

ポイント:

  • コード品質や規約をあまり気にしない
  • アイデアを素早く検証し、適時に方向を調整する
  • プロトタイプが成功した場合、後でリファクタリングが必要になる

2.4 メンテナンスプロジェクト(主にバグ修正)

プロジェクトの特徴:

  • コードはすでに安定しており、主なタスクは問題の修正
  • 問題を素早く特定する必要がある
  • 新しい問題を引き起こさないよう慎重に変更する必要がある

推奨されるワークフロー:

ステップ1:問題を特定する

text
ユーザーからのフィードバック:「注文を送信」ボタンをクリックした後、ページがフリーズする
コンソールエラー:TypeError: Cannot read property 'id' of undefined

以下を手伝ってほしい:
1. 考えられる原因を分析
2. 関連するコードを見つける

ステップ2:根本原因を分析する

text
このエラーがどのような状況で発生するか確認してほしい
データフローを調査してほしい

ステップ3:修正を適用する

text
この問題を修正してほしい。また以下も行ってほしい:
1. 類似の問題を回避するための防御的コードを追加
2. ユーザー体験を向上させるエラーメッセージを追加

ポイント:

  • 修正後、他の機能に影響がないことを徹底的にテストする
  • システムの堅牢性を向上させる防御的コードを追加する
  • 将来の参考のために問題と解決策を記録する

3. 一般的な開発タスクのワークフロー

日常の開発では、さまざまなタイプのタスクに遭遇します。以下に、最も一般的なAI支援ワークフローをいくつか紹介します。

3.1 新機能の開発

シナリオ: プロダクトマネージャーから新しい要件が渡され、新機能を実装する必要がある。

完全なワークフロー:

ステップ1:要件を理解する(自分で行う)

コーディングを始める前に、まず以下を明確にする:

  • どのような機能を実装する必要があるか?
  • 入力と出力は何か?
  • エッジケースと例外ケースは何か?
  • パフォーマンスとセキュリティの要件は何か?

ステップ2:既存のコードを理解する(AIに手伝ってもらう)

text
ユーザーコメント機能を実装する必要がある。以下を手伝ってほしい:
1. プロジェクト内に類似するものがあるか確認
2. ユーザーデータと記事データがどのように保存されているか確認
3. このプロジェクトのデータベース操作の規約を理解

ステップ3:実装計画を作成する(AIと一緒に)

text
先ほどの分析に基づいて、コメント機能の実装には以下が必要:
1. コメントデータモデルの作成
2. コメントのCRUD APIの実装
3. フロントエンドにコメントの表示と投稿機能を追加

この計画が合理的か、何か抜けているか確認してほしい

ステップ4:機能を実装する(AIが生成、自分がレビュー)

text
計画に従って、まずコメントデータモデルを実装してほしい。
要件:
- コメント内容、著者、記事ID、作成時間を含める
- ネストされたコメント返信をサポート
- 必要なインデックスを追加
text
次にコメントのAPIエンドポイントを実装してほしい。
要件:
- コメントを投稿
- コメントを削除(自分のコメントのみ削除可能)
- 記事の全コメントを取得
- ページネーションをサポート
text
最後にフロントエンドのコメントコンポーネントを実装してほしい。
要件:
- コメントリストの表示
- コメント投稿フォーム
- コメントへの返信をサポート

ステップ5:テストと検証(自分で行う)

  • メインフローを手動テスト
  • 空の内容や長すぎる内容などのエッジケースをテスト
  • 他人のコメントを削除できないなどの権限制御をテスト
  • AIに自動テストの作成を手伝ってもらう

実際の対話例:

text
あなた:ユーザーが記事にコメントできる機能を追加したい

AI:承知しました。まずプロジェクトの構造を理解させてください。
    [AIがプロジェクトのコードを分析]
    プロジェクトにはすでにユーザーシステム(models/user.js)
    と記事システム(models/article.js)があることが分かりました。

    コメント機能の実装には以下が必要です:
    1. コメントデータモデルの作成(models/comment.js)
    2. コメント関連APIの追加(routes/comment.js)
    3. 記事詳細ページにコメントの表示と投稿機能を追加

    実装を始めてもよろしいですか?

あなた:はい、始めましょう。まずデータモデルを作成して

AI:[models/comment.jsを生成]
    コメントデータモデルを作成しました。フィールドは以下の通り:
    - id:コメントID
    - content:コメント内容
    - userId:著者ID
    - articleId:記事ID
    - parentId:親コメントID(ネストされた返信用)
    - createdAt:作成時間

    次にAPIを実装しましょうか?

あなた:はい、APIを実装して

3.2 バグの修正

シナリオ: ユーザーから問題が報告され、素早く特定して修正する必要がある。

完全なワークフロー:

ステップ1:情報を収集する(自分で行う)

以下の情報を記録する:

  • エラーメッセージは何か?
  • この問題をどのように再現できるか?
  • いつから発生し始めたか?
  • 影響範囲はどの程度か?

ステップ2:問題を特定する(AIに手伝ってもらう)

text
ユーザーからのフィードバック:「注文を送信」ボタンをクリックした後、ページがフリーズする
ブラウザコンソールエラー:TypeError: Cannot read property 'id' of undefined
エラーはcheckout.jsの45行目で発生

以下を手伝ってほしい:
1. 考えられる原因を分析
2. 関連するコードを見つける
3. データフローを確認

ステップ3:根本原因を分析する(AIと一緒に)

text
このuserオブジェクトがどこから来ているか確認してほしい
userがundefinedになるのはどのような状況か調査してほしい

ステップ4:修正を実装する(AIが生成、自分がレビュー)

text
以下の要件でこの問題を修正してほしい:
1. userが存在するか確認する防御的コードを追加
2. userが存在しない場合、ログインページにリダイレクト
3. わかりやすいエラーメッセージを追加

ステップ5:修正を検証する(自分で行う)

  • 元の手順で問題を再現し、問題が解決されたことを確認
  • 関連機能をテストし、新しい問題が発生していないことを確認
  • 他の場所に同様の問題がないか考える

実際の対話例:

text
あなた:ログイン後にページを更新するとログアウトされるというユーザー報告がありました

AI:これは通常、トークンの保存または検証の問題です。確認させてください:
    1. トークンはlocalStorageとcookiesのどちらに保存されていますか?
    2. ページ更新時にトークンは再読み込みされますか?

    トークン関連のコードがどのファイルにあるか教えてください

あなた:utils/auth.jsです

AI:[utils/auth.jsを分析]
    問題を発見しました:トークンはsessionStorageに保存されており、
    sessionStorageはページが更新されるとクリアされます。

    解決策:localStorageを使用するように変更する

    変更しましょうか?

あなた:はい、変更して

AI:[コードを修正]
    変更が完了しました。トークンはlocalStorageに保存されるようになり、
    ページ更新後も失われなくなりました。

    以下のテストをお勧めします:
    1. ログインしてページを更新し、ログイン状態が維持されることを確認
    2. ブラウザを閉じて再度開き、ログイン状態が維持されることを確認

3.3 コードのリファクタリング

シナリオ: コードの保守が難しくなり、コード品質を向上させるためにリファクタリングが必要。

完全なワークフロー:

ステップ1:リファクタリングの目標を定義する(自分で行う)

以下を明確にする:

  • どのような問題を解決したいか?(重複コード?構造の混乱?パフォーマンスの問題?)
  • リファクタリングの範囲はどの程度か?
  • 許容できるリスクレベルはどの程度か?

ステップ2:リファクタリング計画を作成する(AIと一緒に)

text
これら3つの関数(getUserList、getArticleList、getCommentList)には
ページネーション、ソート、フィルタリングの重複コードがたくさんある。

以下を手伝ってほしい:
1. 重複している部分を分析
2. リファクタリングの計画を提案
3. リファクタリングのリスクを評価

ステップ3:セーフティネットを準備する(AIに手伝ってもらう)

text
リファクタリングの前に、まずテストケースを作ってほしい
リファクタリング後も動作が変わらないようにするため

ステップ4:段階的にリファクタリングする(AIが実行、自分が検証)

text
先ほどの計画に従って、まず共有関数を抽出してほしい
text
次にデータ構造を最適化してほしい
text
最後に呼び出し箇所を更新してほしい

ステップ5:結果を検証する(自分で行う)

  • すべてのテストを実行し、合格することを確認
  • 主要な機能を手動テスト
  • コード品質が向上したか確認

実際の対話例:

text
あなた:これら3つの関数には重複コードがたくさんある。リファクタリングを手伝ってくれる?
    [3つの関数のコードを貼り付け]

AI:分析しました。主な違いは:
    - getUserList:ユーザーリストを取得
    - getArticleList:記事リストを取得
    - getCommentList:コメントリストを取得

    共通のロジックはページネーション、ソート、フィルタリングです。

    リファクタリング計画:
    1. 汎用的なgetList関数を抽出
    2. 異なる部分をパラメータとして渡す

    これで重複コードの80%を削減できます。

    実装しましょうか?

あなた:はい、でもまずテストケースを作ってほしい

AI:[テストを生成]
    3つの関数すべてのテストを作成しました。
    主要なユースケースをカバーしています。

    リファクタリングを始めてもよろしいですか?

あなた:はい、リファクタリングを始めて

AI:[コードをリファクタリング]
    リファクタリングが完了しました。汎用的なgetList関数を作成し、
    元の3つの関数はすべてその共有関数を呼び出すようになりました。

    テストを実行してすべてが動作することを確認してください:npm test

3.4 コードレビュー

シナリオ: チームメイトがコードを提出し、レビューする必要がある。

完全なワークフロー:

ステップ1:変更内容を素早く理解する(AIに手伝ってもらう)

text
このPRで何が変更されたか要約してほしい
主にどのファイルが修正されたか

ステップ2:一般的な問題を確認する(AIに手伝ってもらう)

text
この変更について以下を確認してほしい:
1. セキュリティの問題(SQLインジェクション、XSSなど)
2. パフォーマンスの問題(N+1クエリ、メモリリークなど)
3. 明らかなバグ
4. コーディングスタイルがプロジェクトの規約に従っているか

ステップ3:詳細なレビュー(自分で行う)

  • ビジネスロジックが正しいか
  • エッジケースが考慮されているか
  • より良い実装方法がないか
  • テストを追加すべきか

ステップ4:フィードバックを提供する(自分で行う)

  • 変更が必要な箇所を指摘
  • なぜ変更すべきか説明
  • 改善の提案を提供

実際の対話例:

text
あなた:このPRのレビューを手伝って
    [PRのリンクまたはコードを提供]

AI:変更をレビューした結果、以下の問題を見つけました:

    1. セキュリティの問題:
       - 23行目:ユーザー入力がエスケープされておらず、XSSのリスクがある可能性
       - 45行目:SQLクエリが文字列連結で構築されており、インジェクションのリスクがある

    2. パフォーマンスの問題:
       - 67行目:ループ内でデータベースクエリがあり、N+1問題が発生している

    3. コード品質:
       - handleSubmit関数が長すぎる(200行);分割を検討してほしい
       - エラーハンドリングが欠けている

    これらについて詳しく説明しましょうか?

あなた:SQLインジェクションの問題について詳しく説明して

AI:45行目について:
    ```javascript
    const query = `SELECT * FROM users WHERE name = '${userName}'`;
    ```

    これはユーザー入力をSQL文に直接連結している。
    ユーザーが `' OR '1'='1` と入力した場合、次のようになる:
    ```sql
    SELECT * FROM users WHERE name = '' OR '1'='1'
    ```
    これですべてのユーザーデータが返されてしまう。

    正しいアプローチはパラメータ化クエリを使用すること:
    ```javascript
    const query = 'SELECT * FROM users WHERE name = ?';
    db.query(query, [userName]);
    ```

    修正しましょうか?

4. プロジェクトのナレッジベースを構築する

AIがプロジェクトをよりよく理解できるように、プロジェクト内にナレッジベースを構築することをお勧めします。そうすることで、AIはあなたの規約や習慣に従って作業できるようになります。

4.1 プロジェクト記述ファイルを作成する

プロジェクトのルートにCLAUDE.mdまたはAGENTS.mdファイルを作成し、プロジェクトの重要な情報を記録します:

markdown
# プロジェクト概要

## プロジェクトサマリー
これはオンライン学習プラットフォームで、コース管理、ユーザー学習、課題提出などの機能を提供する。

## 技術スタック
- フロントエンド:React 18 + TypeScript + Vite
- バックエンド:Node.js + Express + PostgreSQL
- デプロイ:Vercel(フロントエンド) + Railway(バックエンド)

## プロジェクト構造

src/ ├── components/ # Reactコンポーネント ├── pages/ # ページコンポーネント ├── api/ # API呼び出し ├── utils/ # ユーティリティ関数 └── types/ # TypeScript型定義


## コード規約
- ESLintとPrettierを使用してコードをフォーマット
- コンポーネントファイルはPascalCase(例:UserProfile.tsx)
- ユーティリティ関数はcamelCase(例:formatDate.ts)
- 定数はUPPER_SNAKE_CASE(例:API_BASE_URL)

## 開発フロー
1. mainブランチから機能ブランチを作成
2. 開発完了後、PRを提出
3. コードレビュー通過後にマージ

## 一般的なタスク
- 開発サーバーの起動:`npm run dev`
- テストの実行:`npm test`
- プロダクションビルド:`npm run build`
- コードのフォーマット:`npm run format`

## 注意事項
- すべてのAPI呼び出しにはエラーハンドリングを含める必要がある
- ユーザー入力は検証およびエスケープする必要がある
- データベース操作にはパラメータ化クエリを使用し、SQLインジェクションを回避する
- 機密情報(パスワード、トークン)をログに書き込まない

## データベーススキーマ
- users:ユーザーテーブル(id、email、password_hash、created_at)
- courses:コーステーブル(id、title、description、teacher_id)
- enrollments:登録テーブル(id、user_id、course_id、enrolled_at)

4.2 一般的な問題と解決策を記録する

プロジェクト内にdocs/troubleshooting.mdを作成し、一般的な問題を記録します:

markdown
# 一般的な問題

## 開発環境の問題

### 問題:npm installが失敗する
**原因:** Nodeのバージョンが互換性がない
**解決策:** Node.js 18以上を使用する

### 問題:データベース接続が失敗する
**原因:** 環境変数が設定されていない
**解決策:** .env.exampleを.envにコピーし、データベース接続情報を記入する

## 機能の問題

### 問題:ログイン後にページを更新するとログアウトされる
**原因:** トークンがsessionStorageに保存されている
**解決策:** localStorageに切り替える

### 問題:画像のアップロードが失敗する
**原因:** ファイルサイズが制限を超えている
**解決策:** フロントエンドにファイルサイズチェックを追加し、5MBに制限する

4.3 技術的決定の記録を維持する

docs/decisions/ディレクトリを作成し、重要な技術的決定を記録します:

markdown
# ADR-001:PostgreSQLをデータベースとして選択

## ステータス
承認済み

## 背景
プロジェクトではリレーショナルデータベースを選択する必要がある。候補はMySQLとPostgreSQL。

## 決定
PostgreSQLを選択する

## 理由
1. JSONサポートが優れており、コースコンテンツの保存に適している
2. 全文検索が強力
3. チームがPostgreSQLに慣れている

## 影響
- PostgreSQL固有の機能を学ぶ必要がある
- デプロイにPostgreSQL環境が必要

5. AIとの協業効率を向上させるテクニック

いくつかの実践的なテクニックをマスターすることで、AIとの協業をより効率的にできます。

5.1 問題の記述は明確かつ具体的に

悪い記述:

text
この機能に問題がある
最適化してほしい

良い記述:

text
ユーザーが「送信」ボタンをクリックした後、フォームが送信されない
ブラウザコンソールのエラー:Uncaught TypeError: Cannot read property 'value' of null
エラーはform.jsの23行目で発生

このリストの読み込みが遅く、1000件のアイテムがある
ページネーションを追加してほしい、1ページあたり20件

ポイント:

  • 具体的なエラー情報を提供する
  • 期待される結果を説明する
  • 関連するコンテキストを提供する

5.2 一度に一つのことだけ行う

悪いアプローチ:

text
ログイン、登録、パスワードリカバリー、プロフィールセンター、
パスワード変更、メール認証を実装してほしい

良いアプローチ:

text
まずログイン機能を実装してほしい。要件は以下の通り:
- メールアドレスとパスワードでログイン
- ログイン状態を保持
- エラーメッセージの表示

(完了後)次に登録機能を実装してほしい

(完了後)次にパスワードリカバリー機能を実装してほしい

ポイント:

  • 大きなタスクを小さなタスクに分割する
  • 各タスクの完了後にテストして検証する
  • 問題がないことを確認してから次に進む

5.3 結果を適時に検証する

悪いアプローチ:

  • AIに10個のファイルを連続して修正させる
  • 最後に最初の変更がすでに間違っていたことに気づく
  • 多くの時間を無駄にする

良いアプローチ:

  • 1つのファイルを修正し、すぐにテストする
  • 問題がないことを確認してから続ける
  • 問題が見つかったらすぐに修正する

ポイント:

  • 小さなステップで進み、素早いフィードバックを得る
  • AIを盲信しない
  • コードのコントロールを維持する

5.4 コンテキストを上手に活用する

テクニック1:前の会話を参照する

text
先ほど話し合った計画に従って実装してほしい
前のgetUserList関数を参考にしてほしい

テクニック2:関連するコードを提供する

text
これが既存のユーザーモデルのコード:
[コードを貼り付け]

同じスタイルで記事モデルを実装してほしい

テクニック3:プロジェクトの背景を説明する

text
これはReact + Node.jsを使ったECプロジェクト
すでにユーザーシステムと商品システムがある
ここにショッピングカート機能を追加したい

5.5 有用な会話を保存する

シナリオ: 複雑な問題を解決した

方法:

  1. プロジェクトのドキュメントに解決策を記録する
  2. 次に同様の問題が発生したときに参照する
  3. 他のチームメンバーと共有する

例:

docs/solutions/にドキュメントを作成する:

markdown
# N+1クエリ問題の解決

## 問題の説明
記事リストを取得する際、記事ごとに著者情報をクエリしており、
パフォーマンスの問題が発生している。

## 解決策
JOINクエリを使用してすべてのデータを一度に取得する:

```sql
SELECT articles.*, users.name as author_name
FROM articles
LEFT JOIN users ON articles.author_id = users.id

結果: クエリ時間が2000msから50msに短縮

5.6 質問の技術を学ぶ

テクニック1:まず「なぜ」と聞く

text
このコードはなぜメモリリークを引き起こすのか?
普通の関数の代わりにuseCallbackを使うべきなのはなぜ?

テクニック2:複数の選択肢を求める

text
ユーザー認証を実装するにはどのような方法がある?
それぞれの長所と短所は何?

テクニック3:説明を求める

text
このコードはどのように動作するのか?
このアルゴリズムについて詳しく説明してくれる?

6. よくある質問

Q1:AIが生成したコードをそのまま使ってよいか?

A: いいえ、そのままでは使えません。レビューとテストが必要です。

AIが生成したコードには以下の問題がある可能性があります:

  • 論理エラーやエッジケースの処理が不十分
  • プロジェクトのコーディング規約に合致していない
  • セキュリティリスク
  • パフォーマンスの最適化が不十分

必要な対応:

  • 生成されたコードを注意深く読む
  • そのロジックを理解する
  • さまざまなシナリオでテストする
  • プロジェクトの規約に従っていることを確認する

Q2:AIが意図を誤解した場合はどうすればよいか?

A: 適時に修正し、要件を再度記述する。

text
そういう意味ではありません。私が言いたいのは...
この理解は正しくありません。正しくは...
要件をもう一度説明させてください...

数回修正してもまだ間違っている場合は:

  • より多くのコンテキストを提供する
  • 具体的なコード例を示す
  • タスクをより小さく分割する

Q3:AIが解決できない問題に直面したらどうすればよいか?

A: AIは万能ではありません。一部の問題は自分で解決する必要があります。

AIが解決できない可能性のある問題:

  • 非常に新しい技術(AIの知識には期限がある)
  • あなたのチーム固有のビジネスロジック
  • 外部システムへのアクセスが必要な問題
  • 複雑なパフォーマンス最適化の問題

その場合は:

  • 公式ドキュメントを読む
  • 関連する解決策を検索する
  • 経験豊富なチームメイトに聞く
  • コミュニティで質問する

Q4:AIの提案が合理的かどうかをどう判断すればよいか?

A: 自分の経験と知識で判断する。

評価基準:

  • ベストプラクティスに従っているか
  • エッジケースが考慮されているか
  • 潜在的なセキュリティリスクがないか
  • プロジェクトの技術スタックに合っているか
  • パフォーマンスが許容範囲内か

確信がない場合は:

  • AIにそのアプローチを勧める理由を説明してもらう
  • 代替案を求める
  • チームメンバーに相談する

Q5:チームでAIをどのように協業して使うべきか?

A: 共有の規約と共有のナレッジベースを確立する。

チーム協業の推奨事項:

  • プロジェクトのCLAUDE.md設定を共有する
  • コード規約とスタイルを統一する
  • 一般的な問題の解決策を記録する
  • 有用なプロンプトを定期的に共有する
  • コードレビューでAI生成コードをチェックする

Q6:AIへの過度な依存を避けるにはどうすればよいか?

A: 学習と思考を続ける。AIはアシスタントであり、代わりではない。

推奨事項:

  • AIが生成したコードを盲信せず、理解する
  • 分からない概念を積極的に学ぶ
  • 定期的に基礎知識を見直す
  • まず自分で問題を解決しようとし、その後AIで検証する
  • コードレビューに参加して他者の経験から学ぶ

7. まとめ

この章を通じて、以下をマスターしました:

  1. AIの能力の境界:AIが得意なことと苦手なことを理解し、適切な協業モデルを構築する
  2. プロジェクトタイプ別の戦略:新規プロジェクト、成熟したプロジェクト、ラピッドプロトタイプ、メンテナンスプロジェクトに対する異なる開発戦略
  3. 一般的なタスクのワークフロー:新機能開発、バグ修正、コードリファクタリング、コードレビューの完全なワークフロー
  4. プロジェクトのナレッジベース:AIがプロジェクトをよりよく理解できるようにプロジェクトドキュメントを構築する方法
  5. 協業テクニック:AIとの協業効率を向上させる実践的な方法

重要なポイント:

  • 役割の明確な分担:自分が意思決定と品質確保を行い、AIが実行と支援を担当する
  • 明確なコミュニケーション:具体的に記述し、一度に一つのことを行う
  • 適時の検証:盲信せず、テストして検証する
  • 学び続ける:AIの能力の境界を理解し、協業モデルを継続的に改善する

覚えておいてください:AIはツールであり、代替ではありません。AIはあなたをより効率的にできますが、最終的なコード品質はあなたの判断にかかっています。簡単なタスクから始め、徐々に信頼を築いてください。AIが多くの時間を節約し、より価値のある仕事に集中できるようになることがわかるでしょう。

💡 次のステップ

次の章では、AIを使ったコードレビューと品質保証について学び、コードの保守性とセキュリティを確保する方法を学びます。