株式会社TIMEWELLの濱本です。
ソフトウェア開発の世界は、AIの進化とともに劇的な変化の時を迎えています。かつてはSFの世界の話だった「AIがコードを書く」という概念は、今や「Vibe Coding」という新たな潮流として現実のものとなりつつあります。これは単なる自動化ツールではなく、開発者とAIが協調し、これまでにないスピードと効率でアイデアを形にする新しい開発スタイルです。Y Combinator(YC)のパートナーであるTom氏も、このVibe Codingの可能性に注目し、自ら実験を重ねています。彼の発見によれば、Vibe Codingは驚くほど高性能であるだけでなく、試行錯誤とベストプラクティスの習得によって、誰もがそのスキルを向上させられる実践的な技術だと言います。まるで数年前のプロンプトエンジニアリングのように、毎週新しい発見があり、開発コミュニティはその知見を共有し合っています。
この記事では、Tom氏の知見とYCの最新バッチに参加する創業者たちのリアルな声をもとに、Vibe Codingを最大限に活用し、ソフトウェア開発の生産性を飛躍的に向上させるための具体的な方法論と実践的なヒントを、ビジネスパーソンの皆様に向けて詳細に解説していきます。AI時代における開発の未来を、共に探求しましょう。
AIコーディング「Vibe Coding」とは?YC創業者たちが明かす最新活用術 Vibe Codingを成功させるための実践戦略:計画、テスト、バージョン管理の重要性 バグ修正から応用まで:AIコーディングの可能性を最大限に引き出すTips まとめ AIコーディング「Vibe Coding」とは?YC創業者たちが明かす最新活用術
Vibe Codingとは、大規模言語モデル(LLM)をはじめとするAIツールを駆使してソフトウェア開発を行う新しいアプローチを指します。これは単にコードを自動生成させるだけでなく、AIとの対話を通じてアイデアを具体化し、設計、実装、デバッグといった開発プロセス全体を加速させることを目指します。Tom氏が指摘するように、Vibe Codingの最適なテクニックは、経験豊富なソフトウェアエンジニアが日頃から実践している原則や手法と重なる部分が多くあります。「それはもうVibe Codingではなく、単なるソフトウェアエンジニアリングではないか?」という意見もあるかもしれませんが、重要なのは、これらの強力なAIツールをいかに活用して最高の結果を出すか、という点です。ツールの進化は目覚ましく、数年前のプロンプトエンジニアリングがそうであったように、Vibe Codingの分野でも日々新しいテクニックやベストプラクティスが発見され、共有されています。
YCの最新バッチに参加している創業者たちは、まさにこの最前線でAIツールを駆使しています。彼らが共有してくれた実践的なヒントは、Vibe Codingの効果を最大限に引き出す上で非常に示唆に富んでいます。例えば、AI統合開発環境(IDE)が特定の実装やデバッグでループに陥ってしまった場合、一度そのコードをコピーし、ChatGPTのようなLLMの公式ウェブサイトのUIに直接貼り付けて同じ質問を投げかけると、IDEでは得られなかった解決策が見つかることがある、という声がありました。これは、環境による制約やAIモデルの特性の違いが影響している可能性を示唆しており、行き詰まった際の有効な代替手段となり得ます。
また、複数のAIコーディングツールを併用する戦略も有効です。CursorとWindsurfというツールを例に挙げると、Cursorは比較的動作が速く、フロントエンドの細かな調整やフロントエンドとバックエンドの連携といったフルスタックな作業に向いている一方で、Windsurfはより時間をかけて深く思考するため、複雑なエージェントの構築やプロンプトの修正に適している、という意見がありました。以前はAIの応答を待つ間にスマートフォンを眺めているだけだった時間も、今ではWindsurfに複雑な処理を任せている間にCursorでフロントエンドの改修を進める、といった並行作業が可能になり、開発のダウンタイムを大幅に削減できます。さらに、同じコンテキストを与えて両方のツールに同時に指示を出し、生成された複数のバリエーションから最適なものを選択するという使い方もあります。これにより、多様なアプローチを短時間で比較検討できるようになります。
ある創業者は、AIを単なるツールではなく、「新しい種類のプログラミング言語」と捉えるべきだと語ります。従来のコードによるプログラミングに対し、Vibe Codingは自然言語によるプログラミングです。そのため、良い結果を得るためには、人間が他の開発者に指示を出す際と同様に、必要なコンテキストや背景情報、意図を詳細かつ明確に伝えることが不可欠になります。曖昧な指示では、AIも期待通りの動作をすることはできません。
テスト駆動開発(TDD)のアプローチを取り入れている創業者もいます。彼らはまず、LLMを使わずに手動で詳細なテストケースを作成します。これらのテストケースが、LLMがコードを生成する際の厳格な「ガードレール」となります。このガードレールさえ守られていれば、LLMは自由にコードを生成してよい、というわけです。テストケースがすべてパスすれば(グリーンになれば)、細かなコード実装に過度に干渉する必要はなく、コードベース全体のモジュール性や構造といった大局的な視点に集中できると述べています。
さらに、本格的にAIにコーディングを任せる前に、まずは純粋なLLM(ChatGPTなど)との対話を通じて、開発する機能のスコープ(範囲)やアーキテクチャ(構造)を徹底的に練り上げることの重要性を強調する声もありました。これを怠ると、AIがコードベース内で場当たり的に機能を追加し、結果的にうまく動作しない、あるいはメンテナンス困難なコードを生み出してしまうリスクがあります。まず人間が「何を」「どのように」作るのかを明確に理解し、その設計図をAIに渡すことが、成功への鍵となります。
最後に、AIがコード生成やデバッグの過程で「迷走」し始めた、つまり非効率なループに陥っていると感じた場合の対処法も共有されました。何度も同じようなコードを生成し直したり、生成されるコードがどうもおかしいと感じたり、エラーメッセージを何度もコピー&ペーストする必要がある場合は、何かが間違っているサインです。その際は一度立ち止まり、LLMに対して「一歩引いて、なぜ失敗しているのか原因を考えてみよう」と促すことが有効です。コンテキストが不足しているのか、あるいは単に運悪く難しい問題に直面しているのかを分析し、アプローチを修正する必要があります。これらの創業者たちの実践的な知見は、Vibe Codingが単なる夢物語ではなく、日々の開発業務に組み込むことができる現実的な技術であることを示しています。
Vibe Codingを成功させるための実践戦略:計画、テスト、バージョン管理の重要性
Vibe Codingの世界に足を踏み入れる際、どこから始めるべきかは個々の経験によって異なります。もしプログラミングの経験が全くないのであれば、RepletやLovableのようなツールから試してみるのが良いでしょう。これらのツールは、視覚的に分かりやすいインターフェースを提供し、特にユーザーインターフェース(UI)の試作を迅速に行うのに適しています。実際、多くのプロダクトマネージャーやデザイナーが、Figmaのようなデザインツールでモックアップを作成する代わりに、これらのツールを使って直接アイデアをコードで実装し始めています。そのスピード感は驚異的です。ただし、Tom氏の経験によれば、LovableのようなツールはUIの変更には強いものの、バックエンドのロジックを精密に修正しようとすると、意図しない箇所が変更されてしまうなど、限界が見られる場合があるとのことです。
一方、少しでもプログラミング経験があれば(たとえブランクがあったとしても)、Windsurf、Cursor、Claude Codeといった、より本格的なAIコーディングツールに直接挑戦することができます。これらのツールは、既存のコードベースと連携し、より複雑な開発タスクに対応可能です。
さて、使用するツールを選んだら、すぐにコーディングに取り掛かるのではなく、まず最初にLLMと協力して包括的な開発計画を立てることが極めて重要です。この計画は、プロジェクトフォルダ内にマークダウンファイルとして保存し、開発プロセス全体を通じて常に参照するようにします。これは、AIと共に段階的に進めていくためのロードマップであり、一度に全てを完成させようとするアプローチ(ワンショット)とは対照的です。
計画立案と段階的実装の具体的なステップは以下の通りです。
計画の初稿作成:LLMと対話し、実装したい機能、技術的な要件、大まかなアーキテクチャなどを盛り込んだ計画の初稿を作成します。
レビューと洗練:作成された計画を注意深くレビューし、不要な項目を削除したり、優先順位をつけたりします。複雑すぎる機能は「実装しない(Won't Do)」と明記し、将来的なアイデアは「今後の検討事項」として分けておくのも良いでしょう。これにより、LLMに対して現在のスコープを明確に伝えることができます。
セクションごとの実装:計画を論理的なセクションに分割し、LLMに対して「まずはセクション2だけを実装しよう」のように、一度に実装する範囲を明確に指示します。
検証とコミット:実装されたコードが期待通りに動作するかを確認し、テストを実行します。問題がなければ、変更内容をGitにコミットします。
計画の更新:AIに指示して、完了したセクション(この場合はセクション2)を計画ファイル上で「完了」とマークしてもらいます。
現時点では、特に複雑なプロダクト全体をAIに一度に作らせることは現実的ではないかもしれません。このように、計画に基づいて段階的に実装を進め、各ステップで動作確認とコミットを行うことで、開発プロセスを安定させ、問題が発生した場合でも容易に以前の状態に戻せるようになります。ただし、AIモデルの進化は非常に速いため、この「段階的実装」のアドバイスも数ヶ月後には変わっている可能性があることは念頭に置くべきでしょう。
次に、バージョン管理の徹底です。Gitのようなバージョン管理システムは、Vibe Codingにおいて極めて重要な役割を果たします。AIコーディングツールには独自の「元に戻す」機能が搭載されていることもありますが、まだ完全に信頼できるとは言えません。そのため、新しい機能の実装に取り掛かる前には、必ずGitでクリーンな状態(コミットされていない変更がない状態)にしておくことが推奨されます。これにより、もしAIが予期せぬ動作をしたり、コードベースを破壊してしまったりした場合でも、「git reset --hard HEAD」のようなコマンドを使って、確実に動作していたバージョンに瞬時に戻ることができます。AIが期待通りの結果を出さない場合に、何度もプロンプトを修正して試行錯誤を繰り返すのは、多くの場合、悪い結果につながります。AIは根本的な原因を理解するのではなく、場当たり的な修正を積み重ね、結果として質の低いコードが蓄積されてしまう傾向があるからです。もし何度も試行錯誤してようやく解決策が見つかった場合、その解決策だけをメモしておき、一度Gitでリセットしてクリーンな状態に戻してから、その解決策を改めてAIに指示して実装させる方が、最終的にクリーンなコードベースを維持できます。
テストの作成も不可欠です。LLMはテストコードの生成も得意ですが、デフォルトでは個々の関数を対象とした低レベルな単体テスト(ユニットテスト)を生成しがちです。しかし、Vibe Codingにおいては、より高レベルな統合テストやエンドツーエンドテストを作成することが推奨されます。これは、ユーザーが実際にサイトやアプリをクリックして操作するシナリオをシミュレートし、機能全体が意図した通りに連携して動作するかを確認するテストです。個々の関数の正しさよりも、機能としての価値が実現できているかを保証することが重要になります。特に、LLMは指示された箇所以外の、関連性のないロジックを予期せず変更してしまう悪癖があります。高レベルなテストスイートを用意しておくことで、こうした意図しない変更(リグレッション)を早期に検出し、問題が大きくなる前にGitリセットしてやり直すことができます。
さらに、AIはコーディング以外のタスクでも強力な助っ人となります。Tom氏は、自身が苦手としていたDNSサーバーの設定や、Herokuへのデプロイ設定などをClaude Sonet 3.7に任せた経験を語っています。AIがまるでDevOpsエンジニアのように振る舞い、開発プロセスを10倍も加速させたと感じたそうです。また、サイトのファビコン(ブラウザのタブに表示される小さなアイコン)画像をChatGPTに生成させ、さらにその画像を様々なプラットフォームで必要とされる6種類のサイズとフォーマットにリサイズする簡単なスクリプトをClaudeに書かせた例も紹介しています。このように、AIはデザイナーやインフラ担当者の役割も担うことができるのです。計画性、バージョン管理、テスト、そしてコーディング以外のタスクへの活用。これらを意識することで、Vibe Codingのポテンシャルを最大限に引き出すことができるでしょう。
バグ修正から応用まで:AIコーディングの可能性を最大限に引き出すTips
ソフトウェア開発にバグはつきものですが、Vibe Codingにおいても効率的なバグ修正のテクニックが存在します。まず試すべき最も基本的な方法は、遭遇したエラーメッセージをそのままコピーし、LLMにペーストすることです。サーバーのログファイルやブラウザのJavaScriptコンソールに出力されたエラーメッセージだけで、AIが問題の原因を特定し、修正コードを提案してくれるケースは少なくありません。何が問題なのか、どう修正してほしいのかを詳細に説明する必要さえないのです。この方法は非常に強力であり、将来的には、人間がコピー&ペーストする手間すら不要になり、AIコーディングツールが自動的にログファイルを監視したり、ヘッドレスブラウザを起動してJavaScriptエラーを検出し、修正提案を行ったりするようになるだろうとTom氏は予測しています。
より複雑なバグに直面した場合は、すぐにコードの修正を試みるのではなく、まずLLMに対して「考えられる原因を3つか4つ挙げてみて」と指示し、仮説を立てさせることが有効です。そして、それぞれの仮説に基づいて修正を試みますが、重要なのは、各試行が失敗した場合、その都度Gitでリセットしてクリーンな状態からやり直すことです。これを怠ると、前述の通り、場当たり的な修正コードが積み重なり、問題がさらに複雑化してしまう可能性があります。「失敗したらリセットし、再度試す」。そして、必要であればデバッグのためのログ出力コードを追加する(「Logging is your friend」)ことを忘れてはいけません。
また、一つのAIモデルでうまくいかない場合は、積極的に他のモデルを試してみることも重要です。Claude Sonet 3.7、OpenAIのGPTシリーズ、GoogleのGeminiなど、モデルによって得意不得意があります。あるモデルでは解決できなかった問題が、別のモデルではあっさりと解決することもあります。そして、もし厄介なバグの原因を突き止めることができたなら、それまでの試行錯誤で加えた変更はすべてリセットし、クリーンなコードベースに対して、その特定の問題を修正するための非常に具体的な指示をLLMに与えるのが最善です。これにより、「ジャンクコード」の蓄積を防ぎ、健全なコードベースを維持できます。
LLMの挙動をより制御し、期待通りの結果を得るためには、「指示(Instructions)」を明確に記述することが不可欠です。Cursorの「Rules」、Windsurfの「Rules」、あるいはClaudeに渡すマークダウンファイルなど、ツールによって呼び方は異なりますが、LLMに対する基本的な動作原理やコーディング規約、プロジェクト固有のルールなどを記述しておく機能があります。数百行にもわたる詳細な指示を記述している創業者もいるほどで、これによりAIコーディングエージェントの効率性と精度が劇的に向上します。どのような指示を記述すべきかについては、オンライン上に多くの情報が出回っているので、参考にすると良いでしょう。
外部のライブラリやAPIのドキュメントを参照させる場合、現在のAIエージェントはまだウェブ上のドキュメントを直接参照するのが苦手な場合があります。MCPサーバーを使うといった高度な方法もありますが、Tom氏はよりシンプルな方法として、必要なドキュメント一式をダウンロードし、プロジェクトフォルダ内のサブディレクトリに配置することを推奨しています。そして、LLMへの指示の中に「この機能を実装する前に、ローカルのdocsディレクトリにあるドキュメントを読んでください」と含めるのです。これにより、より正確な情報を基にコードを生成させることが可能になります。
LLMは、単にコードを書かせるだけでなく、「教師」としても活用できます。特に新しいプログラミング言語やフレームワークを学んでいる場合、AIが生成したコードについて、「この実装を一行ずつ解説してほしい」と頼むことができます。Stack Overflowを延々とスクロールするよりも、はるかに効率的で対話的な学習体験が得られます。
通常AIに任せるには複雑すぎると考えられる新機能に取り組む場合は、いきなり既存の大きなプロジェクトに組み込むのではなく、まず完全に独立したクリーンなコードベースで、その機能だけの小さな参照実装(リファレンス実装)を作成することをお勧めします。自分で作成するか、あるいはGitHubなどで公開されている同様の実装を探してダウンロードしても良いでしょう。そして、その参照実装をLLMに示し、「この実装を参考に、メインのプロジェクト内に再実装してください」と指示します。このアプローチは驚くほど効果的です。
コードの構成においては、「小さなファイル」と「モジュール性」がこれまで以上に重要になります。これは人間の開発者にとっても良い習慣ですが、LLMにとっても同様です。巨大なモノリシックリポジトリで、内部の依存関係が複雑に絡み合っているコードベースは、人間にとってもLLMにとっても理解が困難です。ある箇所の変更が、予期せず他の箇所に影響を与えてしまうリスクが高まります。そのため、明確なAPI境界を持つモジュールやサービスベースのアーキテクチャへの移行が、今後さらに進む可能性があります。外部インターフェース(API)が安定していれば、内部の実装は(テストがパスする限り)自由に変更できるため、LLMによる改修も容易になります。
開発に使用する技術スタックの選択も、AIコーディングの効率に影響を与える可能性があります。Tom氏は、自身がかつて使っていたRuby on Railsでプロジェクトを構築した際、AIのパフォーマンスの高さに驚いたと述べています。これは、Railsが20年の歴史を持ち、確立された多くの規約(Convention)を持つフレームワークであるためだと考えられます。多くのRailsプロジェクトは似た構造を持ち、特定の機能をどこに実装すべきか、どのような方法で実装するのが「Rails way」なのかが比較的明確です。その結果、オンライン上には一貫性のある高品質なRailsのトレーニングデータが大量に存在し、AIが学習しやすかったのではないかと推測しています。一方で、RustやElixirのような比較的新しい言語では、トレーニングデータがまだ少ないため、AIのパフォーマンスが期待ほどではないという友人の話も紹介しています。ただし、これも急速に変化していく可能性があります。
スクリーンショットや音声入力といった、新しいインタラクション方法も活用できます。UI上のバグを視覚的に示したり、他のサイトのデザインを参考にさせたりする場合、スクリーンショットをAIエージェントに直接貼り付けるのは非常に便利です。また、Aquaのような音声入力ツールを使えば、タイピングよりも速い速度(毎分140語程度)で指示を与えることが可能です。AIは多少の文法や句読点の誤りには寛容なため、完璧な文字起こしでなくても問題なく機能します。
最後に、頻繁なリファクタリングの重要性を忘れてはいけません。コードが動作し、テストも実装されていれば、安心してリファクタリングに取り組むことができます。テストがリグレッション(意図しない機能低下)を検知してくれるからです。LLMに「コードベースの中で繰り返しが多い箇所や、リファクタリング候補となりそうな箇所を特定してほしい」と依頼することも可能です。これは、プロのソフトウェア開発者であれば当然行うべき習慣であり、ファイルを小さくモジュール化しておくことで、人間にとってもLLMにとってもコードの理解が容易になります。そして何よりも、常に実験を続ける姿勢が重要です。AIコーディングの最先端は週単位で変化しています。新しいモデルがリリースされるたびに試し、デバッグ、計画、実装、リファクタリングといった各タスクでどのモデルが優れているかを確認しましょう。例えば、現時点(動画公開時)では、Geminiはコードベース全体のインデックス作成や実装計画の立案に優れ、Sonet 3.7は実際のコード変更の実装において有力だとTom氏は感じています。常に新しいツールやモデルを試し、最適なワークフローを探求し続けることが、Vibe Codingをマスターするための鍵となります。
まとめ
Vibe Codingは、ソフトウェア開発の風景を一変させる可能性を秘めた、エキサイティングな新しいフロンティアです。YCのパートナーや創業者たちが示すように、AIコーディングツールはすでに驚くべき能力を発揮しており、計画的なアプローチ、バージョン管理の徹底、テストの重視、そして継続的な実験といったベストプラクティスを取り入れることで、その効果を最大限に引き出すことができます。AIを単なるコード生成機としてではなく、設計の相談相手、デバッグの trợ lý、DevOpsエンジニア、さらには教師として活用することで、開発プロセス全体の生産性を飛躍的に向上させることが可能です。
重要なのは、AIを魔法の杖のように捉えるのではなく、強力な新しい「ツール」あるいは「プログラミング言語」として理解し、その特性を活かすためのスキルを磨くことです。詳細な指示を与え、コンテキストを共有し、段階的に作業を進め、常に検証を行うといった、優れたソフトウェアエンジニアリングの原則は、Vibe Codingの時代においても変わらず重要です。
AIモデルの進化は止まることなく、今日最先端のテクニックが明日には古くなっているかもしれません。だからこそ、常に新しい情報を収集し、様々なツールやモデルを試し、自分自身のワークフローを最適化し続ける探求心が求められます。この記事で紹介したヒントや戦略が、皆様のAIコーディングへの取り組みの一助となり、より効率的で創造的なソフトウェア開発を実現するきっかけとなれば幸いです。AIと共に、未来の開発を切り拓いていきましょう。
