最近
ClaudeやAntigravity、Github Copilotなど様々なAIエージェントやらツールなどを使って、
過去にやってきた案件の内容を多少改変したものをどれぐらいの粒度の指示で、
どれぐらいのアウトプットを出してくれるのかをちょいちょい調査しています。
※ちゃんと本業も有るけど、後輩が優秀すぎて手伝うことが少なってきて寂しい。。。
「AIあるし、とりあえずコード書かせればなんとかなるでしょ」
なんとかならないし、色々と終わっとる\(^o^)/オワタ
むしろ設計をサボると、AI使っても普通に詰む詰む。
起きたこと
ある機能を実装しようとして、雑にAIにこう投げた
「ユーザー管理機能を作って」
返ってきたコードはそれっぽく動く。
「コレ、いけるじゃん」と思った。
数日後
- 仕様追加 → 破綻
- 画面増加 → カオス
- API変更 → 全体修正
気づいたら
何がしたいのかわからないカオスなコード
が完成していた。
しかもそれをチャットでちょっとずつ直してると、
直ぐに使用リミットが来て作業ができなくなる悪循環。
※リミット解除まで5時間とか1週間とか、もう手で直したほうが早いと感じるレベル
な~ぜな~ぜ
① 前提が曖昧だと、AIも曖昧なものを返す
AIは優秀だけど、与えられた情報の範囲でしか考えられない
- データ構造が曖昧
- 責務が曖昧
- 命名が曖昧
この状態で出てくるのは、それっぽく動くけど長く使えないコード
② 局所最適の積み重ねになる
AIは「今聞かれたこと」に対して最適化する
- この画面
- このAPI
- この関数
それぞれは成立していても、全体として見ると整合性が崩れる
結果として、機能追加のたびに崩れていく構造になる
チャットで通常会話のようなやり取りでの指示だと、マジでそのソースのその部分のコードしか見ないので、
一応そこに関しては修正はできていたりするんだけど、全体で見ると整合性が取れなくなったりする場合などもあり、
そこで見切るを付けてしまうと 「AIって、雛形クリエーターでしか使えないね」 ってなっちゃう。
③ 設計の責任は人間にある
AIは
- 方針を決めない
- 責務を定義しない
- 境界を引かない
ここをやるのが設計
つまり、設計が曖昧なままAIに任せると、その曖昧さがそのままコードになる
そのためのMDファイルを事前に作って(ココもAIと作って)、AIにモグモグさせるのが重要
よくあるダメなパターン
とりあえずAIに聞く
「〇〇作って」と投げて、出てきたコードを継ぎ足す
その結果、統一感のないコードが積み上がる
よくやるよね You 試しにちょっといい感じに作っちゃてYO!! 的なアレ。
命名をAIに丸投げ
一見それっぽいが、微妙にズレた名前が増える
結果、読めないコードになる
文言の辞書MDとかを作っておくと良いよ。
論理名、物理名(キャメル型)、メモみたいなヘッダーで作っておくと、
人が介入したときにも命名とかのルールが目に見える形になるため。
設計なしで画面から作る
見た目はできるが、データ構造が破綻する
後から直そうとすると、ほぼ作り直しになる
ただ、これで作業するとマジで効率は良い。。。
DrawIOやExcelオブジェクトみたいなので、画面のザックリレイアウトを作成してスクショが画像として保存したものを、
「こんな感じの画面をVueで作って」 で割と再現度高めで作成してくれて、
モック作成とかお客様に見せるためだけの物を作る時にめっちゃ高速で作れるので、
ダメなパターンと分かっていてもやめられない自分がいるのは事実。。。
じゃあどうりゃええんや?
最低限これだけ決める
- データ構造
- APIの責務
- コンポーネントの役割
これだけでも決めてからAIに投げると、精度は大きく変わる
プロンプトも設計する
悪い例
「ユーザー管理作って」
良い例
「ユーザーはroleを持ち、管理画面では一覧・詳細・編集が可能。
APIはRESTで、一覧はページングあり。この前提でAngularで実装して」
前提が具体的になるほど、返ってくるコードの質も上がる
AIは“実装担当”として使う
- 設計は人間がやる
- 実装をAIに任せる
- 最終判断は人間がする
この役割分担が一番安定する
要は
- AIは強い(使い手次第)
- ただし設計は代わりにやってくれない
- 設計をサボると、AIでも普通に破綻する
最後に
AIを使えば楽になる、というのは間違いではない
ただしそれは、設計ができている状態で使った場合の話
設計をサボるために使うと、あとで必ずそのツケを払うことになるので、
キチンと設計を考えたうえで使うと、AIはかなり強い味方になるってお話でした。
実際に作って・使ってみたプロンプトの雛形などの紹介などそのうち出来たら良いなと思っている。