プッシュ通知
新記事をすぐにお知らせ
🎙️ 音声: ずんだもん / 春日部つむぎ(VOICEVOX)
AI開発ツールに「万能」は存在しない。タスク特性で使い分けることが重要だ。計画立案はGPT-5 miniで徹底的に詰め、実装はGrokで一気実行し、テスト駆動開発で品質を保証する——このハイブリッドアプローチが、フルスタック開発の現実的なベストプラクティスである。
フルスタックメモ帳アプリを構築する企画をスタートさせた。要件定義書から実装まで、複数のAIツールを試した結果、驚くべき現実が浮かび上がった。
最初の選択肢はGPT-5 miniだった。軽量で高速、低コストという触れ込みが魅力的だった。実際に試してみると、AIツールの得意・不得意が明確に分かれることになる。
GPT-5 miniに最初に与えた指示は、シンプルだった。
「メモ帳作る。まずは要件書作成から」
結果は驚くほど詳細で実用的だった。わずか30分で、3段階の成果物が完成した:
このドキュメント群は、本当に優秀だった。フレームワークの選定理由が明確で、拡張性が高く、リスク分析も網羅されていた。
ここまでの段階では、miniは完璧な「計画屋」として機能していた。
しかし問題は、実装フェーズで顕在化した。
タスク一覧に従い、FastAPI+React+SQLiteのプロジェクト雛形をminiに生成させ、テスト実装まで進めた。30分でタスク実行とテスト実装まで到達した——一見、素晴らしい進捗に見えた。
だが、いざアプリケーションを起動しようとすると、起動に失敗した。
エラーの原因は複雑だった。複数レイヤーの依存関係が絡み合っていた:
OperationalError: unable to open database fileでDB初期化に失敗これらの問題は、すべて「実装段階の統合エラー」だった。ドキュメントには対策が書かれていたが、実装コードには反映されていなかったのだ。
ここで重要な洞察が得られた。
miniは高速応答と定型タスク処理に最適化されている。複雑なフルスタック統合では、複数の依存関係を同時に管理する能力に限界がある。
具体的には:
miniは「次に何をすべきか」を聞く傾向がある。これは計画段階では有効だが、実装段階では時間浪費になってしまう。
ここで方針を転換した。Grokを試してみた。
Grokの特徴は、miniと正反対だった。
ユーザーの結論は明確だった:「Grokの勝ち」。
しかし、ここで別の気づきが生まれた。
miniの失敗の根本原因は、テスト駆動開発(TDD)の欠落だった。
miniが生成したコードは、テストなしで実装されていた。つまり:
これは、典型的なウォーターフォール開発の失敗パターンだ。
そこで、要件を大幅に修正した。
Next.js + TDD + E2Eテストの組み合わせで、再度プロジェクトを立ち上げることにした。
TDDのサイクルは、以下の通りだ:
このサイクルをすべてのタスクで繰り返す。
具体的には、以下のようなタスク分解になった:
タスク1:メモCRUD(TDD)
test('メモ追加で配列長+1')を書く→失敗useStateでメモ配列を管理→成功test('メモ削除で配列長-1')を書く→失敗deleteNote()実装→成功タスク2:Markdownエディタ(TDD)
test('#見出し → <h1>レンダリング')を書く→失敗react-markdownを統合→成功タスク3:永続化(TDD)
test('リロード後メモ保持')を書く→失敗localStorageを実装→成功タスク4:E2Eテスト(Playwright)
TDDを導入することで、何が変わったのか。
テストが「品質保証」から「設計ツール」へ昇華したのだ。
従来のアプローチ:実装→テスト(後付け)→エラー発見→修正
TDDアプローチ:テスト(先行)→実装(最小限)→リファクタ→統合テスト
TDDの利点は:
結果として、docker-compose upで一発起動が実現するのだ。
同時に、フレームワークをFastAPI+ReactからNext.jsへ移行した。
これも重要なポイントだ。
FastAPI+Reactの構成では:
Next.jsでは:
npm run devで即起動単一パッケージ統合により、統合エラーのリスクが激減した。
ここで、もう一つの重要な学習が得られた。
AIの出力品質は、プロンプト品質に直結する。
最初のプロンプト:「メモ帳作る。まずは要件書作成から」
これは曖昧だった。miniは「完璧な要件書」を生成したが、実装段階では「何をすべきか」が不明確になった。
改善されたプロンプト:
「Next.js 15 + TDD(vitest) + E2E(Playwright) + drizzle(SQLite) + Tailwindのメモ帳アプリを生成。
1. vitestでメモCRUDテストを先に記述
2. テスト通してから実装コード生成
3. docker-compose upで即起動確認
4. Markdownエディタ+FTS検索+タグ管理+JSONエクスポート完備
5. エラーログ出力機能必須」
具体性が増すと、AIの出力精度が劇的に向上する。
開発を進める中で、別の問題に直面した。
miniは「関連質問」を繰り返す傾向がある:
これらの質問は、ユーザーの時間を消費する。
時間制約がある開発環境では、質問なしで一気実装することが重要だ。
Grokは「質問なし一気実装」を実現する。これが、Grokが実装フェーズで優位に立つ理由だ。
ここまでの経験から、AIツール選定の最適戦略が見えてきた。
miniの「完璧な計画屋」としての能力を最大限活用する。ここで徹底的に詰めることで、後続フェーズのエラーを削減できる。
Grokの「質問なし一気実装」能力が活躍する。テスト駆動開発により、品質も保証される。
ここでもテストが「品質の番人」として機能する。
この経験は、他のプロジェクトにも応用できる。
新しいプロジェクトを開始するときのチェックリスト:
計画フェーズ
実装フェーズ
統合フェーズ
品質保証
参考までに、TDD対応のタスク定義書の正しい形を示す:
# TDDメモ帳アプリ - 全タスク一気実行(90分完了)
## 1. TDD: メモCRUD(25分)
- RED: test('メモ追加で配列長+1')を書く → 失敗
- GREEN: useState<Note[]>([]) + addNote()実装 → 成功
- REFACTOR: useCallback化でパフォーマンス最適化
- RED: test('メモ削除で配列長-1')を書く → 失敗
- GREEN: deleteNote(id)実装 → 成功
- REFACTOR: 複合フィルタ対応
## 2. TDD: Markdownエディタ(15分)
- RED: test('#見出し → <h1>レンダリング')を書く → 失敗
- GREEN: react-markdown統合 → 成功
- REFACTOR: 左右分割 + ライブプレビュー
## 3. E2E統合テスト(10分)
- Playwrightで一覧→作成→編集→削除フロー検証
重要なポイント:
この開発経験から、以下の結論が導き出される:
AIツールに「万能」は存在しない。タスク特性で使い分けることが重要だ。
このハイブリッドアプローチが、フルスタック開発の現実的なベストプラクティスである。
この知見を活かして、次のプロジェクトに取り組む際は:
このフローで、高品質で実装効率の高いフルスタック開発が実現する。
記事数の多いカテゴリから探す