📄

ChatGPTと仕様書駆動開発を行なって得られた知見の共有

2023/04/27に公開

はじめに

初めまして。すずきゆーだい(@szkyudi)です
まず、お断りとして、「仕様書駆動開発」とは僕が勝手に考えた開発手法なので、調べても何も情報は出てこないと思います。もしかしたら「AI駆動開発」と呼ばれているものと同じかもしれませんが、よくわからないので我流で進めさせていただきます。

どんな開発をしたかというと、あらかじめ仕様書を書き、ChatGPTに食べさせて対話的にFlutterでネイティブアプリ開発をしました。

バックエンドの実装

クリーンアーキテクチャを勉強したかったので、バックエンドはクリーンアーキテクチャで実装をしました。
具体的には以下のようなチャットをしながら開発を進めていきました。

  • 仕様書に従って、クリーンアーキテクチャで実装したいです
  • このアプリケーションではどの層から実装していくのが良いですか?
  • 仕様書に従ってエンティティを作成してください
  • エンティティの作成が終わったからリポジトリを実装してください
  • この機能はどの層に実装するのが良いですか?

時々、自ら提示したプロパティ名や型定義を忘れて、intStringとして出力してくることもありますが、そこはエディタ側がなんとかしてくれます。
ただ、間違えていることをChatGPTに伝えないまま続けると、それ以降もずっと間違えたまま回答してくるので、早めに訂正をお願いしましょう。

フロントエンドの実装

仕様書には、機能仕様や画面の仕様を明示していますが、基本的には書かれていることしか考慮してくれず、UI/UXに寄与するような気の利いた仕様追加などはしてくれません。
例えば、要素の追加や削除、状態が変更がされたときにリアルタイムでUIに反映されることなどの考慮は、明確に仕様書に組み込まないと実装してくれません。
そのため、仕様書をしっかりと作り込むか後述のように進めていくのが良いかなと思います。
個人的には、仕様書は考慮漏れが発生してしまうので、後述のようにアジャイル的に進めていくのが良いと感じています。

UI/UXの実装について

フロントエンドの実装において、気の利いた仕様追加をしてくれなかったですが、スコープを狭めて段階的に実装していけば確実に能力を発揮してくれました。
具体的には、「こういうユーザー体験のためにこのWidgetをこのように変更して」のように伝えると良質なコードをアウトプトしてくれました。「こういうユーザー体験のために画面を実装する」というような大雑把な仕様にしていると考慮漏れが多発する可能性があります。
そこで、一旦プロトタイプ的に必要な要素が揃ったページをざっくり作ってもらって、それらをWidgetごとに修正してもらうのが、最短距離で価値を生み出していく方法だと感じました。

開発の精度について

基本的には仕様書に従ってゴリゴリと実装を進めてくれるのでかなり捗りました。
ただ、若干コードの誤認があったり、パッケージの使い方を間違えていたりすることがありました。
このあたりはCopilotのほうが精度が高い印象があったので、動かないなぁと思ったら怪しい箇所をコメントアウトして、以下のようにするとCopilotが修正してくれたりします。

// 上記のコードのバグを修正しつつリファクタリングする

ただ、Copilotは以前の会話の履歴やバックグランドを把握していないので、ChatGPTの回答を訂正するくらいの使い方が適しているなと感じました。

まとめ

あくまでChatGPTは目的地までの近道を示してくれる「地図」のような立ち存在であって、目的地まですぐに案内してくれる「どこでもドア」ではないと改めて感じました。

Discussion