仕様書駆動開発をしてみる
はじめに
今回、Flutterでネイティブアプリ開発をしてみようと思います。そこで、あらかじめ仕様書を書き、ChatGPTに食べさせて対話的に開発して行きたいと思います。
バックエンドの実装
クリーンアーキテクチャを勉強したいので、バックエンドはクリーンアーキテクチャで実装をしていきます。
具体的には以下のようなチャットをしながら開発を進めていきました。
- 仕様書に従って、クリーンアーキテクチャで実装したいです
- このアプリケーションではどの層から実装していくのが良いですか?
- 仕様書に従ってエンティティを作成してください
- エンティティの作成が終わったからリポジトリを実装してください
- この機能はどの層に実装するのが良いですか?
時々、自ら提示したプロパティ名や型定義を忘れて、int
をString
として出力してくることもありますが、そこはエディタ側がなんとかしてくれます。
ただ、間違えていることをChatGPTに伝えないまま続けると、それ以降もずっと間違えたまま回答してくるので、早めに訂正をお願いしましょう。
開発の精度について
基本的には仕様書に従ってゴリゴリと実装を進めてくれるのでかなり捗りました。
ただ、若干コードの誤認があったり、パッケージの使い方を間違えていたりすることがありました。
このあたりはCopilotのほうが精度が高い印象があったので、動かないなぁと思ったら怪しい箇所をコメントアウトして、以下のようにするとCopilotが修正してくれたりします。
// 上記のコードのバグを修正しつつリファクタリングする
ただ、Copilotは以前の会話の履歴やバックグランドを把握していないので、ChatGPTの回答を訂正するくらいの使い方が適しているなと感じました。
フロントエンドの実装
仕様書には、機能仕様や画面の仕様を明示していますが、基本的には書かれていることしか考慮してくれず、UI/UXに寄与するような気の利いた仕様追加などはしてくれません。
例えば、要素の追加や削除、状態が変更がされたときにリアルタイムでUIに反映されることなどの考慮は、明確に仕様書に組み込まないと実装してくれません。
そのため、仕様書をしっかりと作り込むか後述のように進めていくのが良いかなと思います。
個人的には、仕様書は考慮漏れが発生してしまうので、後述のようにアジャイル的に進めていくのが良いと感じています。
UI/UXの実装について
フロントエンドの実装において、気の利いた仕様追加をしてくれなかったですが、段階的に実装していけば確実に能力を発揮してくれるようになります。
具体的には、「こういうユーザー体験のためにこのWidgetをこのように変更して」のように伝えると良質なコードをアウトプトしてくれました。前述したように、仕様書の段階で「こういうユーザー体験のために画面を実装して」というような指示をすると考慮漏れが多発する可能性があります。
そこで、一旦プロトタイプ的に必要な要素が揃ったページをざっくり作ってもらって、それらをWidgetごとに修正してもらうのが、最短距離で価値を生み出していく方法だと感じました。
まとめ
あくまでChatGPTは目的地までの近道を示してくれる「地図」のような立ち存在であって、目的地まですぐに案内してくれる「どこでもドア」ではないと改めて感じました。