{
"$type": "site.standard.document",
"content": {
"$type": "app.wtr.content.markdown",
"markdown": "おはようございます。waturaです。この前iOSアプリ開発もCursorとかつかいたいよねーという記事を書きました。\n\n今回はその時に契約したWindSurfを使ってVibe Codingしてみました。\n\n## Vibe Codingとは\n\n> There's a new kind of coding I call \"vibe coding\", where you fully give in to the vibes, embrace exponentials, and forget that the code even exists. It's possible because the LLMs (e.g. Cursor Composer w Sonnet) are getting too good. Also I just talk to Composer with SuperWhisper…\n> \n> — Andrej Karpathy (@karpathy) [February 2, 2025](https://twitter.com/karpathy/status/1886192184808149383?ref_src=twsrc%5Etfw)\n\n1. 自然言語で作りたいものを説明し、作ってもらう\n \n2. 作ってもらったものを動かしたりして、エラーをフィードバックする\n \n3. コードなにそれおいしいの?ってする\n \n\nという感じで、プログラムを作ってもらう。AIに丸投げで開発することをVibe Codingと呼んでいるかんじですかね。\n\nなので、**Vibe Codingしてみた**は雑にAIに投げて開発してみた!ってことです。ClineみたいなやつもVibesだし、Cursor ComposeとかWindsurf CascadeとかもVibes!って感じですねぇ。\n\n## やったこと(やってもらったこと)\n\n前回の記事はお仕事開発を効率化しましたが、今回は完全に趣味プログラミングの方です。なので、生成されたものが動いてそうなら、基本🙆としてマージしまくりました。\n\n### 個人ブログの改修\n\nHugoを使って管理しているブログがあります。\n\n[**\\[わ\\]** _\\[わ\\] watura の ブログ_ _wtr.app_](https://wtr.app)[](https://wtr.app)\n\n今はnoteをメインに書いていますが、心の中のメインはいつも.appの方です。\n\n* noteの記事をインポートする\n \n* めっちゃ雑にhugo serveしているだけだったdocker imageにちゃんとnginxいれて配信するようにする\n \n* 短い投稿のためのScrapsをつくる\n \n * UI\n \n * 記事作成フロー\n \n\nという感じで、ちょこちょこやりたいなと思っていたことをやってみました。 \nCSSとかなんもわからんな3つ目以外は、時間もあるしじゃあやるか!ってなって重い腰を上げたらできるような内容ではありました。\n\nnote記事のインポートはGithub Actionsをつかって継続的に行なうようにしています。なので、私のnote記事は常に.appの方にもあるという状態になっています。 \nなお、中身の更新はチェックしていないので、差分が発生するんですが、それはいつかまたやりましょうというと思っています。\n\n### アプリの開発\n\nよくあるUIでAPI仕様も決まっており、まあやるだけだよね!みたいなアプリをちくちくつくってみました。 \niOSアプリなので完全Vibes!!とはいかないですけど、ほとんどコードを見ないでアプリの動作確認、Xcodeの出すエラーのフィードバックだけに近いレベルでだいたい作れました。\n\n## やってみて\n\n### 小さすぎると微妙\n\nブログの方は、ほぼ単発スクリプトレベルでした。単発スクリプトレベルだと、別のプロンプトで作ったスクリプトが全く別物という感じで作られるという問題がありました。 \n同じコードベースなのだから、同じように書いてくれよと思うのですが、ものとしては別物なので一緒に渡すものでもなさそうだし?という感じでちょっと統一感がないよなぁと感じました。\n\n### 再現性があまりない\n\n同じプロンプトを投げても全く同じコードを作ってくれませんでした。日本語的には大体同じでもちょっと違うと全然違うコードになったりしました。 \nこのあたりの再現性というのは本格運用だとちょい微妙かな?と思いました。\n\n### ビルドとテストできないと無限に試行錯誤する\n\n今作っているのはSwift Packageを使ったプロジェクトなのですが、iOS向けなので、macでは動作しません。Package.swiftにもiOSしか指定していません。\n\nなのに、swiftコマンドでビルドしようとしたり、swift testでテストを実行しようとしたりしてきます。\n\n* そして、エラーに遭遇\n \n* エラーを見たらmacが指定されていない\n \n* mac をpackage.swiftに追加する\n \n* UIKitまわりでエラーがでる\n \n* わけのわからない修正方法を取ろうとする\n \n* どんどん訳がわからなくなって諦める\n \n\nなんてことをちょくちょくやってきたりします。一応、windsurfのルールファイルにも正しいビルド方法とかを書いたりしたのですが、スルーされる場合がすごく多かったです。 \nなので、\n\n* ビルドしようとするな\n \n* テストしようとするな\n \n* SourceKit LSP以外気にするな\n \n\nみたいなことをルールの冒頭に書きておきました。わりとそのあとからは平和になりました。\n\n### ゴミコード\n\nコードなんて気にせず動いてるんだからいいでしょ?というノリで進めていました。動作的な不具合が発生したので、それをフィードバックしたのですが、不具合がどんどんひどくなって、もともとあった機能すら無くなって、ぐだぐだになっていくみたいなことがありました。Revertしてその機能追加を無かったことにする他ないみたいな状況になりました。\n\nRevertしてからコードを見てみると、**マジかよ。なんだこれ。**みたいなやばいグダグダコードになっていました。不具合が発生したのはグダグダしたコードをまともに変更できなかったからだと理解できました。 \nというわけで、コードレビューちゃんとしないと破滅に突き進んでいってしまうかもです。\n\n### 言語化が大切\n\nそのゴミコードをどうするか。というのを文章として説明してあげる必要がありました。が、言語化する能力が足りなくて、結局自分でやりました。\n\n* なにを\n \n* どこに\n \n* どうやって\n \n* 関連コード\n \n* 関連ドキュメント\n \n* 基本のルール\n \n\nとかを徹底して説明する必要がありました。これの手を抜くと、グダグダになったり、ちょっと違うことをやり始めたりします。\n\nそこまでするなら、俺がやったほうが早いってなる時もいっぱいありました。どうやってのところを説明しきれないこともありました。 \n\n## まとめ\n\n各ステップを別作業しながらやっていました。晩御飯作りながら、プロンプトを考えたり、通りすがりに入力したり、といった感じです。放置できるというところがAI丸投げコーディングのいいところかと思いました。 \n\nちゃんとやったら、もっとちゃんとできるのに出来ないのは、私の説明不足のせいです。実装できる実力があるのに、実力が発揮されないのは私のせいです。\n\nしかし、近い将来、拙い説明でも品質としてまあまあなアプリが出力がなされてくるようになるのではないかと思います。プログラマーとしては、まあまあからその先を作り出したり、最初からその先を出力できるようにしたりというところを目指していくのかなと思います。 \nたんに何も考えずにAIを使っていたり、もしくは、ゼロAIをしていると一瞬で置いて行かれてしまう気がしました。 \n言語化する力が今後一番必要なんだろうなと思います。\n\n「**顧客が本当に必要だったもの**」で、プログラマー側にいるのが常だったので、顧客側の気持ちがよくわかった気がします。\n\nとりあえず、次はここを目指して趣味プログラミングしてみたい。"
},
"path": "/blog/nfeb1d3d532a2",
"publishedAt": "2025-03-23T00:00:00.000Z",
"site": "at://did:plc:c656e4nvjol7kh35tfmzkgpu/site.standard.publication/3mmnvl6ln3226",
"title": "Vibe Codingしてみた",
"updatedAt": "2026-05-25T07:15:08Z"
}