ゲーム以外の雑記(井上明人)

最近は、ほとんどキーボードの話をしています。

LLMまかせっぱなしコーディング(vibe coding)覚書:求められる要素と支援環境

(下記のテキストは gemini 2.5 proに提案してもらったものに修正をくわえたものです)
このメモはなんのメモか:LLMまかせっぱなしコーディング(vibe coding)は、めちゃ便利だけど、まあまあ行き詰まるポイントがあるので、そのメモです。このメモの作成者はプログラマーではない人間なので、そういう人間の備忘録以上のものではありません。主にやっているのはブラウザベース2Dゲームの開発とかです。「LLMに任せるにしても、とはいえ、ある程度のリテラシーはやっぱり必要」の「ある程度」がどこらへんにあるのかを手探りで確認していくためのメモです。

1. AI支援でプログラムを作る人に求められる要素

1.1 そもそも何をつくりたいか

あたりまえなので省略。

1.2 技術に対する理解に基づいた作成手順(ある程度複雑なものの場合)

簡単なプログラム(500行ぐらいまで)だと、o1 proとかgemini 2.5 proならあまり悩まずにお願いできる。ただ、それを超えて、ある程度複雑な仕組みを作る場合には、いろいろとて考える必要が出てくる。実際に動く、ある程度しっかりしたプログラムを作るためには、技術的な部分を意識する必要はやはりある。
1.2.1 要求仕様の明確化(何を作るか具体的に決める):
  • 要求仕様の明確化自体も「雑な案」をLLMに投げて、案をつくってもらうことができる。ただ、そこで出てきた仕様がいきなり長大で細かすぎると、読むのがダルくなるので、いきなり「雑な案」→「めっちゃ細かい仕様」にいくのではなく、「もう少しだけ細かい仕様の案に落としてみてくれる?」みたいな手順を踏むとよいかもしれない。
1.2.2 段階的な実装(少しずつ作る):
中心的な機能や、まずは簡単な部分から少しずつ作り始め、試しながら改善を繰り返していく方法(反復開発)がベター
1.2.3 既存技術とツールの活用(便利な部品や道具を使う):
プログラムの動き(物理演算)、画面操作、ネットワーク通信など(後述)はライブラリ、フレームワークに頼ったほうがよい。HTML5 Canvasやゲーム作成を助けるPhaser.js。※UnityやGodot Engineなどの「使い方」をAIに教えてもらうというのもありだが、ゲームエンジン利用は言うほどLLM丸投げにはならないので、ライブラリやPhaser.jsなどのほうがLLM丸投げ感がある。
1.2.4 全体構造の設計(プログラム全体の骨組みを考える)
  • 機能を適切な単位(部品=モジュール)に分け、それらの関係性を整理する必要があるが、正直、技術的なリテラシーがないと、その設計自体がいま一つ謎なので、この設計もLLMに相談しながらすすめるほかない。設計内容をLLMに伝える際には、MermaidやPlantUMLといったフォーマットでUML図などを表現する書き方を使うと、構造を分かりやすく示せ、より具体的な相談がしやすくなるはず。

2. 環境と道具

  • 高機能なLLM/APIとの契約GoogleないしOpen AIに金を払うべし
  • AI機能付きコードエディタ: Cursor, Clineもいいらしい。これも金がいる。
  • テキストによる作図ツール: MermaidやPlantUML
  • 変更履歴の管理(バージョン管理): Git(およびGitHub/GitLabなどの関連サービス
Claude Codeがいいらしいがまだ試してない。

3. ライブラリやフレームワーク等の活用が推奨される機能例リスト

下記の項目を無理にLLMにやらせるとやるにはやってくれるけど「ライブラリなしで」とか言うとまあまあバグる。(ライブラリとか、フレームワーク前提でもまあまあバグる)
  • 画面表示・グラフィックス関連
    • 高度な2D/3Dグラフィックス描画 (影、光、特殊効果など)
    • 複雑なユーザーインターフェース部品 (表計算のようなグリッド表示、ファイルツリー表示など)
    • グラフやチャートの描画 (棒グラフ、折れ線グラフ、円グラフなど)
    • ウィンドウや要素の配置を自動調整する仕組み (レイアウト管理)
    • 滑らかなアニメーション (キャラクターの動き、画面の切り替わりなど)
    • マウスなどによるドラッグ&ドロップ操作
  • 動きの計算・シミュレーション
    • 物体のリアルな衝突や跳ね返り (物理演算)
    • 水や煙などの流体の動き
    • 布やロープのような、柔らかい物体の動き
  • データの扱い
    • データベースとのやり取り (データの保存、読み出し、検索など)
    • 入力されたデータが正しいかどうかのチェック (バリデーション)
    • データを特定の形式(JSONXMLなど)に変換したり、元に戻したりする処理 (シリアライズ/デシリアライズ)
    • 大量のデータを効率よく扱ったり、検索したりする仕組み
    • 特定の形式を持つファイル(画像、音声、Excelファイルなど)の読み書き
  • ネットワーク・通信
    • リアルタイムでの双方向通信 (チャット、オンラインゲームの同期など - WebSocket等)
    • WebサーバーやWeb APIとの通信 (データの送受信、ログイン認証など)
    • 他のWebサービスや機能との連携 (API連携)
  • AI・機械学習関連
    • 画像の内容を認識する (画像認識)
    • 人の言葉を理解したり、処理したりする (自然言語処理)
    • データから学習して予測などを行う (機械学習モデルの利用)
    • ゲームキャラクターの賢い動き (経路探索、行動決定AI)
  • セキュリティ関連
    • ログイン認証や権限管理の仕組み (本人確認、アクセス制御)
    • データの暗号化や、パスワードを安全に保存するための処理
    • 不正な入力からシステムを守るための処理 (セキュリティ対策)
  • その他
    • 複数の処理を同時に、または効率よく進めるための制御 (並行処理・非同期処理)
    • 多言語対応や、国・地域ごとの表示形式の違いに対応する処理 (国際化・地域化)
    • プログラムが正しく動くかを確認するためのテストコード作成や実行の仕組み (テストフレームワーク)
    • プログラムの動作記録(ログ)を効率よく収集・管理する仕組み

4.現時点までで困ったこととその対策

  • ワーキングメモリーの限界(よくある)
    • 例:Chat GPT o1 proでも、ブラウザベースでの質問だと、ソースコードが500行超えたあたりから徐々に「ここは省略します」みたいな答えを返してきて、コピペがだるくなる。
    • 対策:
      • (1)500行超えたらせめてCanvas
      • (2)もっと規模がでかくなってきたら、cursorとか、clineに移行
      • (3)でかい規模のプログラムになったら、そもそもVibe codingを諦めて見切りをつける。
      • (4)諦めないなら、プログラムの全体設計をある程度きちんとやってモジュールの切り分けを考える。
  • 機能別モジュール切り分け失敗(よくある)
    • 例:Stage 1が完全にできたので、このままStage 2をつくろうと思ったら、Stage 2のプログラムをゼロベースで構築しはじめられて困った
    • 対策:
      • (1)共通化する部分としない部分の機能の切り分けをちゃんと設計する
      • (2)設計に基づいて、共通化できる部分を切り分ける実装をする(Stage 1ができた段階で、いったん共通化可能なUI関係と、レベルデザイン用のデータをファイルとして切り分ける指示を出すなど)
      • (3)そのうえで、ちゃんとUI部分と、切り分けられているかどうかを検証(ファイル別の役割をLLMに書き出してもらう。Stage 2がちゃんとつくれるかどうかの検証をする)
  • エラーがループ(よくある)
    • 例:何度エラーコードを貼って、修正してもらっても同じエラーがでる。
    • 対策:
      • (1)うまくいっていたところまで戻って、モジュールに切り分ける
      • (2)用いる技術自体を別のものにする 
      • (3)自分でソースコードを読む
      • (4)デバック用に問題を切り分けて、問題が発生している部分を特定する
      • (5)利用するLLMを変える
      • (6)複雑な実装ではなく、愚直で着実な実装にする
      • (7)「YES」「ACCEPT」ばっかりおさずにLLMが言っていることをちゃんと読む。
  • 明らかに実現してほしい状態ではないのに完璧だと言い張られる(よくある)
    • 例:JavaScriptで座標が反転した状態で表示されてしまうが、LLMにいくら修正をお願いしても「バグはない」とつっぱねられる。
    • 対策:
      • (1)生じているバグをなるべく細かく具体的にLLMに述べる
      • (2)生じているバグの原因となっているかもしれないものについて、可能な限り推測をめぐらしてLLMに相談する(推測をめぐらす脳みそを使うのをLLMに相談してもよい)
      • (3)実装環境ごとに起こり得るバグについて勉強する・経験を積む

5.Vibe Codingの限界

  • 柔軟性の限界:つくることを指示した人間が中身の構造を理解していないので、特に大規模なものになってくると「ちょっとした変更」がうまくいかないことが多い
  • 不正確、安全性に欠ける、パフォーマンスの低いコード

6.リンク