生成AIを活用したコーディング
2024-12-30
はじめに
- 2024年は1年を通してAIを活用したコーディングを行ってきた
- どのように活用してきたのか、まとめてみる
書くことと書かないこと
- 書くこと
- 生成AIを活用したコーディング
- 書かないこと
- 生成AIを活用した技術的な調査
- 生成AIを活用した恒久的なドキュメントの作成
適切な情報を伝えるため
箇条書きで情報を伝える
- プロンプトは箇条書きにして、できるだけ簡潔に伝える
- 以下は、Laravelのサービスクラスを生成するプロンプトの例
以下の要件を満たすLaravelのサービスクラスを生成してください - JWT形式のIDトークンの検証を行なってください - 公開鍵を使った検証を行なってください - 公開鍵の取得にはHTTPファサードを利用してください - ペイロード内のexpireの検証を行なってください - 変数名はスネークケースで命名してください - PHP83で動作するようにしてください - PSR-12に準拠したコーディングを行なってください
- 箇条書きにすることで、行の追加や削除がしやすくなるという利用側のメリットもある
markdownで伝える
- 強調したい部分は太字にする
- **JWT形式のIDトークンの検証**を行なってください
- コードはコードブロックで囲む
- 以下のコードを参考にしてください ```php <?php // ここにコードを記述 ```
モジュール構成
- 1つのファイルに多くの機能(関数)があると、AIが情報を正確に解釈できない
- 1つのファイルには1つの機能(関数)を記述するようにするに意識している
- たとえばコントローラは、CRUDの各機能ごとにファイルを分割する
適切でない例
controllers/ - UserController.php - PostController.php - CommentController.php
適切な例
controllers/ - User/ - IndexController.php - CreateController.php - UpdateController.php - DeleteController.php - Post/ - IndexController.php - CreateController.php - UpdateController.php - DeleteController.php - Comment/ - IndexController.php - CreateController.php - UpdateController.php - DeleteController.php
エラー調査
- エラーが発生した際に、スタックトレースとエラーメッセージをAIに伝える
- 以下のエラーが発生しました。原因を特定して修正してください
コードリーディング
- 複雑なコードを読む際に、AIに機能を説明してもらう
- 一度に大量の回答が返されると、こちらが情報を正確に解釈できないため、
解説はステップバイステップで行なってください
という指示をAIに伝える - PlantUMLの記法で図を出力してもらう。
- このモジュールをPlantUMLのシーケンス図で出力してください
- テキスト解説と図を出力してもらうことで、より効果的にコードリーディングができる
テストコードの自動生成
- テストコードの自動生成もAIに依頼している
- このモジュールのテストコードを生成してください - テストケースは最低N個作成してください - 外部依存はモック化してください - セッターとゲッターのテストは不要です - サードパーティのライブラリやフレームワークの機能のテストは不要です - 言語やフレームワークが提供する機能のテストは不要です
課題
- 現状、生成AIを活用したテストコード生成では、先に実装を行い、作成したコードを元にテストコードを生成している
- 実装を元にテストコードを生成しても、それが正しい仕様のテストコードであるとは限らない
- 先にテストコードを生成し、そのテストコードを元に実装を行うテスト駆動開発の手法を生成AIとのコーディングに取り入れることが課題
生成AIによるリファクタリングやコードレビュー
- 一度に多くの情報をAIに伝えると、AIが情報を正確に解釈できない
- 異なる観点の指示を別々にAIに伝え、AIがより正確にコードをレビューできるようにする
- たとえば、以下のように指示を分割してAIに伝えている
- パフォーマンスの低下を招く可能性のある箇所を特定してください - 冗長な処理や同じ処理が複数回行われている箇所を特定してください - メモリリークの可能性がある箇所を特定してください - SOLID原則の観点から、このモジュールをリファクタリングしてください