Vibe Codingの"ストレス"を軽減した体験談
初めまして!トグルホールディングス株式会社で新卒エンジニアをしている菊池です。
※こちらはtoggle Advent Calendar 2025の11日目の記事です。
「どうやったらVibe Codingを現実的にフル活用できるだろうか?」という問いをもとに書いていこうと思います!
「現実的に」というところが大事だと思っていて、「Vibe Codingをフル活用するためにはものすごく頑張らなければいけません」だと本末転倒ですし、正直腰が重いです。
そこで、まずは「Vibe Codingにまつわる"ストレス"を軽減することで、将来的なフル活用に繋げていきたい」という気持ちで記事を書きます。
概要
昨今、Vibe Codingの勢いが凄まじいです。というか、凄まじくないですか。
ただ、現場でエンジニアリングしていると「こんなことまでできるの!」と驚く一方、「全然思った通りに行かないじゃん、、、」とネガティブな印象も受けます。
Vibe Codingに寄った開発の、満足度の振れ幅が大きいわけです。今回は「どうやったらこの振れ幅を小さくできるか?🧐」という問題意識から、現実的なコストでVibe Codingをフル活用する1st ステップとして、「どうやったらVibe Coding関連の"ストレス"を軽減できるだろうか?🤩」という点についてお気持ち表明していこうと思います。
※この記事はNext.js/ Hono(Typescript)のコンテナ開発(devcontainer)の中で感じたことを書いています。そのため、他の仕様にも当てはまるかはわかりません、ご容赦ください🙏
Vibe Codingの落とし穴
当たり前のことですが、「私たち人間の目線」と「AIの目線」の違いについてまず整理します。
1. 見えているものの違い
- 🙋♂️(人間):「エディタ、ブラウザ、そしてデプロイ環境のコンソールもすべて見れます!」etc...
- 🤖(AI):「エディタ上のプログラムと、かろうじて標準出力(claude codeやcodexを開いているターミナル)が見れます、、、」etc...
例えば、web開発の場合人間はconsole.logとかを使いながらデバッグができますが、AIにコンソールは見れません。
詳細は次章「じゃあ、どうすれば。」で書きますが、この違いは
- そもそもAIが見えていなくても大丈夫な工夫をする
- 可能な限りAIが見えるところに色々置いてあげる
という工夫が有効だと思っています。
2. 前提知識の違い
- 🙋♂️(人間):「環境はARMのlinuxで、コンテナ開発をしていて、、」etc...
- 🤖(AI):「環境のOSは?CPUはAMD?わからん!」etc...
例えば、コンテナ開発をする場合、AIは「今いる環境がコンテナの中なのか外なのか」ということがわかりません。
こちらも詳細は次章ですが、
- そもそもAIが知らなくてもいい工夫をする
- 可能な限りAIにお知らせする
という工夫で対応ができると思っています。
じゃあ、どうすれば。
思想として、
- ✅ AIができないことについて、『できなくても大丈夫な環境』を作る
- ✅ 可能な限り、AIが確認可能なところで、必要な情報が完結するようにする
の2つが指針になると思います。以下、具体例で前章の「違い」について順番に書いていきます。
1. 見えているものの違い
AIに見えているのは、エディタ上のプログラムと、claude codeやcodexが開かれているターミナルのみです。
📕具体例1. やっぱりzodをフル活用しよう
「人間は瞬時に確認できるのに、AIにはそれが難しい」というギャップの出現例として、
- エディタエラー(Typescriptの型エラーなど)

こういうやつ - クライアント(ブラウザ側)のエラー

ここではこういうやつ
が、少なくともあると思っています。zodはどちらにもアプローチ可能です。
まず、エディタエラーについて。こちらは「見えていなくても大丈夫な工夫をする」に該当します。zodを使うと実行時にエラーをチェックすることができるため、型定義をz.inferを通じて行っておくと、AIはエディタエラーを見ることができなくても、実行時のzodErrorを通じて「何かしらおかしいことが起きている」ということを知ることができます。
気持ちとしては、「エディタエラーを見ることができなくても、zodErrorが見れていれば大丈夫だよ」という気持ちです。zodErrorは標準出力に吐き出すことができます。
次に、クライアントサイドのエラーについて。こちらは「可能な限りAIが見えるところに色々置いてあげる」に該当します。と言ってもとてもシンプルで、サーバー側でzodを通じたスキーマチェックを行っておけば、標準入出力を使ったデバッグでAIがエラーを直接確認することができます。
サーバー側(標準出力に色々吐き出してくれる側)に責任を寄せるイメージです。もちろん、サーバー側の関数をターミナルから実行するテストなどは用意しておく必要があります。
📕具体例2. 自作CLIを使おう
こちらは「可能な限りAIが見えるところに色々置いてあげる」に該当します。
nodejs開発の場合は、package.jsonがありますね。そして、package.jsonに書かれたコードはAIも確認可能です。
そして、例えばCommander.jsというパッケージがあります。
このパッケージを使うと、任意のコマンドを標準入力から実行することができます。
よって、
- 🙋♂️(人間):「@package.jsonを確認して、
bun <所望の自作コマンド>を実行して、エラーを確認して」
みたいにしてあげると、AIが自身のセッションターミナルから指定の処理を実行 & 結果の確認をすることができます。GUIがなくてもいいところは、CLIで完結するようにする‼️という気持ちです。
テストコードを書くことも同様の取り組みだと思いますが、テストコードはそれだけで肥大化してしまうので、「CLIも準備しておくと都合が良かった」という体験談です。
📕具体例3. サーバーサイドを活用しよう
これについては特に思想が分かれるところかと思うので簡潔に。
「全てHTMLをサーバー側で生成してしまえばいいじゃない」という発想です。そうすれば、エディタ上に現れるエラーを減らし、標準出力から確認できるエラーを増やすことができます。
とは言え、これによって他の種類のエラーが出たりするので、バランスが大事だと思います😅 あくまで選択肢として。
2. 前提知識の違い
📕具体例4. 少なくともCIを整備しよう
「そもそもAIが知らなくてもいい工夫をする」に該当します。
いくらVibe Codingがすごいとは言え、Vibe Codingで頑張るのは現状マイクロサービスや駆け出しプロジェクトが多い印象です。
そしてこれらは、「規模が小さい」という理由からCI/CDを組まない(例えば手元でdocker build & pushして、デプロイ環境で手動デプロイなど)ことが往々にしてある気がします。あくまで私の主観です。
さて。AIは自身のいる環境を確認する術がありません。CIの文脈では主にARMとAMD、どちらのアーキテクチャのマシンに乗っているのかわかりません。これがわからないと、コンテナビルドで永遠にこけ続けるという事態になりかねません。
こうしたケースはCIを組み、「build環境をgithub actionsに統一する」という対策が有効でした。
もちろん、AGENTS.mdなどにこれらの事情を書いてもいいのですが、「いつかは組まなきゃいけないCIを序盤に組む」だけでVibe Coding上のかなりの煩わしさから解放されました。
📕具体例5. Docker開発の場合、設定を明記しよう
「可能な限りAIにお知らせする」に該当します。
- ポートマッピングを明記する
- ポートとアプリケーションをリンクさせる(vscodeの場合)
などが効果的でした。vscodeなどを利用していると、ポートマッピングはよしなにやってくれます。それが便利でもあるのですが、「よしなにやってくれている」ということをAIは知ることができないので、明記しておくと安全です。デバッグの際の検証事項が減ります。
「ポートとアプリケーションをリンクさせる(vscodeの場合)」については、例えばdevcontainer.jsonに
"portsAttributes": {
"3001": {
"label": "API Service",
"onAutoForward": "notify"
}
}
このように記述すると、「どのポートでどのようなサービスが立ち上がるのか」という点をプログラムに含めることができ、AIへの情報提供が可能となります。
人間にとっても、以下のような表示になって視認性がいいような気がします。

視認性には個人差あり
📕具体例5. Docker開発の場合doodに対応しよう
「そもそもAIが知らなくてもいい工夫をする」です。
コンテナ環境からdockerコマンドを使うとお馴染みの「デーモン動いてないよ」エラーに遭遇してしまいますが、AIは自身が「コンテナの中にいるのかいないのか」を確認することができません。
doodが全ての解決にはなりませんが、少なくとも「dockerコマンドを使うとき、コンテナの中か外かは知らなくていいよ」とAIをサポートすることにはつながります。
devcontainerの場合はfeatureでdoodがサポートされていて、 devcontainer.jsonのfeaturesに
"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {}
のように記述するだけで、簡単にdoodに対応することができます。
最後に
もちろん上記の具体例でVibe Coding固有のつまずきを全て解消することはできませんが、
- ✅ AIができないことについて、『できなくても大丈夫な環境』を作る
- ✅ 可能な限り、AIが確認可能なところで、必要な情報が完結するようにする
この2つの思想は、指針として今のところ有用だと感じています。
もはや、私は「ベストプラクティスの網羅性」についてAIに及ばないです。あくまで私の話ですが。
また、頑張ってAIとプランを練ってAIに書かせてみたら、自分でもびっくりするくらい美しいコードが出来上がったという体験が以前ありまして、これをきっかけに「AIをフルで活用すればもっといいコードに出会えるかもしれない!」と思うようになりました。
最終的な品質保証はまだまだ人間の仕事だと思いますが、「保証すべき品質の、そもそもの高低」はAIの影響が十分にあるところだと思います。
はい。以上です!最後までお読みいただきありがとうございます!AIを使うのも大事ですが、エンジニアとしての「基礎筋力」をつける努力を怠らずに邁進していこうと思います。
Discussion