🍱

生成AIにコードを書いてもらう時に「こうした方が良い」と感じたこと

2025/01/07に公開

はじめに

年末年始に生成AIとコワークして、ほぼ経験ゼロのFlutterアプリ(Android)を作ってみました。
この記事は作ったアプリの内容には特に触れず、生成AIにコードを書いてもらう時にこうした方が良さそうと感じたことを書いていきます。
なお、使用した生成AIはClaude 3.5 Sonnetで、Proプラン(月額20ドル)に課金しています。

生成AIがコードを書く時にやったほうがいいと思ったこと

マイクロサービス化して疎結合に構造にしよう

いきなり普通のことを言い出したぞという感じですが、これ非常に重要です。というのもマイクロサービス化することで生成AIが1度に把握していないといけないコードの範囲が少なくなります。すると、

  • 使用されるトークン数を節約できる
  • バグが減る

という効果があります。逆に、マイクロサービス化していないアプリを生成AIに理解させてコードを書かせようとすると、

  • 1回あたりのトークン数が増える上、バグが埋め込まれやすい
  • バグの修正の為に、更に大量のトークンが消費される

という悪循環に陥ります。生成AIを定額プランで使っているときは直ぐに利用制限がかかりますし、従量課金であれば無尽蔵に金額が増えていきます。

つまり、疎結合なアプリの構造にすることで、生成AIによるコーディングを効率化して必要な課金額を減らすことができます。

頻繁にリファクタしてきれいなコードを保とう

生成AIを活用した場合でも機能開発に集中しすぎると、コードが汚くなっていきます。そうなると前述のマイクロサービス化して疎結合を保つことができなくなるます。
ですので、1つの機能を開発したらとりあえずリファクタするくらいの感覚でコードの見直しをするのが良いかと思います。
リファクタをする場合、コードがきれいな状態でリファクタを依頼すると生成AIは比較的すぐにリファクタ案を出してくれます。
しかし、機能開発に集中しすぎて複雑なコードになってしまっているとリファクタの難易度が上がります。生成AIは、「どういう観点でリファクタすればいいのか?」などを聞いてきてなかなかコードを書いてくれない上に、提示されたコードがバグって動かなかったり挙動が変わっていたりします。そうするとリファクタに無駄に時間とトークンが必要になります。
ですので、なるべく頻繁にリファクタしてきれいなコードを保つことは重要です。

テストコードはしっかり書こう

生成AIにコードを書いてもらうと、自分が理解していないコードも簡単書けます。便利です。しかし、それが正常に動く場合はいいですが、バグったときに内容が理解できずに自分で直すにも生成AIに直してもらうのも苦労します。もちろん全部コードを理解するのが理想ですが、それはそれで生成AIを活用するメリットが薄れますよね。
ということで、完全に中身を理解するまではいかなくても、動作保証をする為のテストコードはしっかり書く(または生成AIに書かせる)ようにしましょう。特に前述のリファクタの際の動作確認では効果を発揮します。

エラーがでたら、エラーコードを貼り付けて直してもらうのがよさそう

生成AIに書いてもらったコードは、正直かなりの頻度でバグっています。見ただけでエラーになるコードを提示してくることも多々あります。ですがそういう場合に、「ここおかしいよね」みたいなことを手打ちで伝えるよりも、動かしてみてエラーコードを突きつけたほうが早く正確に修正してくれる傾向がありました。
なので、生成AIにコードを書かせる場合、とりあえずそのまま動かしてバグっていたらエラーコードを突きつけるのが効率が良さそうです。
そして、その為にもエラー処理とエラーログの出力は適切に行いましょう。

生成AIとチャットするスレッドは、頻繁にリセットしよう

生成AIを使って開発を始めた当初は「生成AIに過去履歴を覚えていてもらったほうがいいだろう」と1つのスレッドで長々とやり取りをしていたのですが、これをすると問題がでました。

  • トークンの消費が激しい
  • 生成AIが壊れる

前者は分かると思うのですが、後者に関しては、、、なんでなんですかね?
いきなり意味不明なことを言い出すんですよね。指示通りにコードが修正されてないのに「修正しました」と言い張ったり、一目で分かるバグを埋め込んでいるので「バグってない」と主張したりしてきました。そしてその押し問答にも大量のトークンが消費されます。
ですので、ある程度区切りの良いところでスレッドを作り直してイチからやり直したほうが全体の効率は良くなります。

まとめ

ということで、生成AIにコードを書いてもらう時のコードには以下を心がけると良さそうと感じました。

  • マイクロサービス化して疎結合にする
  • 頻繁にリファクタしてきれいなコードを保つ
  • テストコードをしっかり書く
  • 適切なエラー処理とエラーログの出力をしましょう
  • 詰め込みすぎて発狂したら、リセットしましょう

結局は、普通にやるべきことに落ち着きました(1個以外)

NCDCエンジニアブログ

Discussion