１か月半でAIゲーム作って展示まで持っていく裏技 〜納期が絶対に変えられないプロダクト作り〜

「生成AIなんでも展示会」という個人開発者向けのAIプロダクトの展示会に出展しました。
かなりタイトなスケジュールだったため普通にプロジェクト炎上しましたがギリ当日間に合ったので備忘録を置いておきます。作ったもの、メンバー、実際に起きたスケジュールを簡単に確認しつつ、なぜ間に合ったのかとなぜ炎上したかを見ていきます。

## 結論だけ見たい人向け
- LLMとの繋ぎこみは後半で良い
- 単体テストは雑にLLMにコードを放り込めば作ってもらえるから書くと良い
- インテグレーションは余裕がある時は良いが管理しきれなくなるリスクが高いからピラミッド型にしておくと良い
- 特にデモの展示なのであれば、最悪コードが汚くても良いから間に合わせて見せられる状態にすることが最優先である

https://x.com/sald_ra/status/1840022543429972293

## 作ったもの
AIが遊ぶ用のシミュレーションゲームを作り、キャラクター操作をAIがひたすらするのを人間が眺めるだけのソフトを作りました。pygameをベースにしています。
https://x.com/Aratako_LM/status/1857690019445747845

## 今回作らないといけないもの
今回は展示会に出すことが最終目的のため、デモとして見せられる状態であれば良く、デプロイやコンパイルは必要ありません。一方で展示会のテーマはAIであるためLLMとの繋ぎ込みは必須です。また、デモを見せるためのチラシや、席に掲示するポスターもあると理想なので以下の3つとします。

- LLMに遊ばせるためのゲーム
- LLMプレイヤー機能
- チラシ・ポスター
## 座組
- プログラミングはわからないがデザインがわかる。イベント展示経験あり
- プログラミングの実装ができる。夜に稼働可
- プログラミングの実装及び、サポートや助言ができる。11月上旬から夜と早朝のみ稼働可(自分)
上記3人で行いました。チームの相対的に見ると自分がエンジニアリード的なポジションにいる状態です。

## 実際のスケジュール
下記に大体起きたことを時系列で並べました。普通に当日朝まで実装してるのでプロジェクト炎上は起こっていますが、無事に完成までこぎつけることができました。
9/8 チーム結成
9/9 製作物の方針決定
9/20 大体の仕様作成
10/1 技術選定完了
11/5 実装メンバー増加(自分)
11/7 アセット完成(BGM)
11/8 アセット完成(画像)
11/15 印刷物入稿・納品
11/15 LLMとのつなぎこみ完了
11/17 04:00 完成
11/17 09:00 解説用カンペ完成
11/17 12:30 展示会当日(デッドライン)

## なぜ間に合ったのか
主にLLMを用いた実装にすることで、夜しか稼働できないプログラマ2人でなんとかなりました。しかも1人は子持ちであり夜しか稼働できず、1人は11月まで別タスクで埋もれていたので、まともな開発工数は取れていません。それでも下記方法でなんとかこぎつけることができました。インディーズ向けの展示公開が目的なので、商業プロダクトでやったら問題がある行動もあります。

### Cursorの導入
一番大きい要因です。GithubCopilotとくらべ、文字のカーソルの前後2行くらいの訂正が提案されること、コードを一部指定しつつ自然言語でコードを生成できます。また型も提案してもらえるため、型をつける時のストレスはほぼありませんでした。後述する単体テストを高速で書けたのもこれが理由です

 ### 単体テストの導入
 早めに単体テストは作っていました。クラスをそのままLLMに放り込みpytestコードを生成することで、最低限の動作確認を担保することができます。E2Eテストしてる暇がないのでここを堅牢にするしかありません。インテグレーションテストも作りましたが結構がっつりコケることが多かったので、作成コストが低い単体テストを多めにしたピラミッド型になりました。

 ### 期限に応じて機能要件を削る
 リリース延期が絶対にできないので、期限と進捗を定期的に見合わせて機能追加を見送りました。例えばゲーム内でAI同士が交渉したりする機能を最初は考えていましたが、AI同士が交渉するフェーズの作成や動作担保の実装コストを考えて見送りました。下記は戦略的撤退を宣言する図です。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632968/0eb67ed3-7e12-36d6-26ba-8f48f31ddf28.png)

### 各メンバーがやることない状態を防ぐ
常に誰かが動いている状態を維持し続けました。すでにできている部分のテスト作成やアセットを組み合わせた印刷物の作成などをやってもらいつつ、自分は実装に専念したり、作ってもらったテストのコケた理由の調査などを行うことで、3人チーム全員が常にやることがある状態になっていました。結果として無駄な時間は限りなく少なくできました。

https://x.com/hayakawagomi/status/1857684706889969681

https://x.com/yasun_ai/status/1855523925918441858

### LLMのつなぎこみを最後にする
LLMを主軸としていますが、LLMは自然言語を引数とした関数のようなものなので、adapter作って開発初期〜中期くらいまではモックで良いと思います。推論時間馬鹿にならないですし、別に後ででいいです。

### めっちゃ頑張る
きれいなコードや組織論でどうにかなることもありますが、工数も正義です。なんとか工数を確保してめっちゃ頑張ると意外となんとかなったりならなかったりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632968/835e62e0-096f-53aa-e865-afc7617fdca1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632968/cc55406d-0bba-bfb7-6175-a86752337338.png)

 ## なぜ炎上したのか
 基本的には「着手が遅かった」と「実装メンバーのアラートに気がつくことに遅れた」の２つになります。定期的にMTGはしていたものの、コードをガッツリ見れたのが本番2,3週間前、しかもコーディングの工数が取れるのが1週間前という状態でした。すくなくともコードをがっつり見る時間を定期的に時間を捻出すべきでしたし、「どこがわからなくてパニックになりそうか」をもっと気軽に相談できる仕組みがあったらなんとかなったかなと考えています。

## 個人的に学びになったこと
今回はこのプログラムで収益化することも考えておらず、「生成AIを用いたプロダクトを作って見せることで、どうやってプログラムに生成AIを組み込むかの参考にしてほしい」という思いが個人的にありました。できなければ展示ができず0点ですが、見せられるものがあれば、0点にはなりません。今回頑張れてよかったので、また今後やるときにも頑張ろうと思います。


## 参考
イベントのレポートを作ってくださった方がいるので、もし気になる方は確認してみてください。
https://note.com/kazuya_bros/n/n480329341d58