基本的なWeb開発の流れに沿って、ChatGPTと共に0からWebアプリをつくることで、ChatGPTをどのように使うのか、どこまで効率化してくれるかを解説します。
記事が長いので、自分の興味のある項目だけ読み飛ばして読むことをお勧めします。
🌟...いまいち
🌟🌟...使える
🌟🌟🌟...ChatGPT最高!!
要件定義に関する項目 | 評価 |
---|---|
要件定義 | 🌟🌟🌟 |
ユースケース図 | 🌟🌟 |
シーケンス図 | 🌟🌟🌟 |
状態遷移図 | 🌟🌟 |
正規化 | 🌟 |
ER図 | 🌟🌟🌟 |
筆者が欲しいサービスを作ろうと思い、今回は「読書記録アプリ」をつくります。
最低限の要件は、次のように設定しました。
読書記録アプリを作る目的
読書が苦手なエンジニアが読書記録をし、記録を共有することで、継続して技術本を読めるようになること
ターゲット
新人、中堅のWebエンジニア
おおまかな要件
大前提として、ChatGPTの回答はあくまで一例です。
情報を精査し、正しい情報か確認することを意識してください。
また、ChatGPTに業務で使用するコードを渡す場合、環境キーやサービスを特定できる情報を送信しないでください。入力内容が他の人に渡ってしまう危険性があります。
まず初めに、ChatGPTのロールを設定します。今回はプロのエンジニアになりきってもらうことで、より精度の高い提案をしてもらうようにします。
機能仕様書を作成する際に使えます。同じ質問をしても、違う回答が返ってくることがあるため、回答が気に入らなかったら新しいスレッドを作成するのが有効です。
機能要件が多い場合
「機能が多いので最低限の機能要件をまとめてください」
機能要件が少ない場合
「◯◯について、さらに詳しい機能要件を提案してください」
1から全て自分でつくるとなると、「ググる→中身を考える→まとめる」の3STEPが必要ですが、ChatGPTを使うと「ChatGPT→修正」の2STEPなので手間が省けます。
必要な項目をあらいだしてくれた
Webアプリに必要と思われる次の項目を提案してくれました。新規登録時の項目は必要十分です。
考慮してなかった機能を提案してくれた
そういう需要もあるのかなぁ・・・。という参考になります。取捨選択は自分で行う必要があります。
2.読書記録機能
読了済みの本についても、読み返した際には、ページ数を更新することができる
爪が甘いところもある
3.他の人の読書記録閲覧機能
他のユーザーのプロフィール画像、ユーザー名、Eメールアドレス、パスワードは、閲覧できない
一見問題ないように見えますが、ユーザーのプロフィール画像、ユーザー名は他のユーザーも閲覧できていいです。
修正を加えた機能要件をChatGPTに教えます。次の質問から修正した機能要件を前提に回答してくれます。以下は修正後の内容です。
1.新規登録機能- ユーザーは、アカウント作成時に、ユーザー名とパスワード、Eメールアドレスを登録することができる- ユーザー名、パスワード、Eメールアドレスは、必須項目である- ユーザーは、登録時にプロフィール画像をアップロードすることができる2.読書記録機能- ユーザーは、読んでいる本の情報を登録することができる- 登録する情報は、書籍名、ページ数、URL、読書状況(未読、読書中、読了)とする- 読了状態に変更した場合は、読了日を自動的に登録する- ユーザーは、読書中の本に対して、進捗状況を更新することができる。更新する情報は、読み終えたページ数である- 読了済みの本はページ数を更新できない- ユーザーは、読了済みの本を登録することができる。登録時には、感想や評価を入力することができる3.他の人の読書記録閲覧機能- ユーザーは、他のユーザーの読書記録とユーザー情報を閲覧することができる- 他のユーザーが登録した読書情報(書籍名、ページ数、URL、読書状況、感想、評価)を閲覧することができる- 他のユーザーが登録したユーザー情報(プロフィール画像、ユーザー名)を閲覧することができる
ユースケース図は、「ユーザー目線で」システムができることを表現する図です。
PlantUML形式でコード出力をお願いすることで、ユースケース図を作成できます。
(よさげな雰囲気ですが、間違っています)
それっぽい結果を出力してくれましたが、図にするとぐちゃぐちゃでした。
@startumlleft to right directionactor Userrectangle "読書記録アプリ" as app { rectangle "ユーザー管理" as user_mgmt rectangle "読書記録管理" as record_mgmt rectangle "他のユーザーの読書記録閲覧" as view_records User -> user_mgmt : 登録\nログイン User --> record_mgmt : 読書記録の登録\n進捗状況の更新\n感想と評価の登録 User --> view_records : 他のユーザーの読書記録閲覧 user_mgmt --> User : アカウント情報の表示 record_mgmt --> User : 読書記録の一覧表示\n読書状況の更新\n感想と評価の表示 view_records --> User : 他のユーザーの読書記録一覧の表示\nユーザー情報の表示}@enduml
矢印の方向が間違っていたり、詳細項目が四角の外に出ている
こちらは自分で修正してしまいました。
しかし、1から作成するよりは時短できたと思います。
' 修正版@startumlleft to right directionactor Userrectangle "読書記録アプリ" as app { usecase user_mgmt as "ユーザー管理 -- 登録,ログイン" usecase record_mgmt as "読書記録管理 -- 進捗状況の更新,感想と評価の登録 " usecase "他のユーザーの読書記録閲覧" as view_records User -> user_mgmt User --> record_mgmt User --> view_records}@enduml
要件が複雑な場合、図の作成がうまくいかない可能性があります。そのときは、「簡潔に」や「最低限の」などの形容詞をつけることで、ChatGPTの負荷を減らしてあげます。
使えそうな図を出力してくれました。こちらを元に詳細を付け足すだけでも、0からつくるよりは早いはずです。
シーケンス図とは「プログラムの処理の流れや概要」を把握するための図です。
バリデーションの条件も上手に作成してくれました。
@startumlactor UserUser -> app : アプリを開くactivate appUser -> app : 新規登録をクリックapp -> app : 新規登録画面を表示User -> app : ユーザー情報を入力app -> app : 入力された情報をバリデーションalt バリデーションOK app -> db : ユーザー情報を登録 db --> app : 登録完了メッセージを返す app -> User : 登録完了メッセージを表示else バリデーションNG app -> User : エラーメッセージを表示endUser -> app : ログインをクリックapp -> app : ログイン画面を表示User -> app : ユーザー情報を入力app -> app : 入力された情報をバリデーションalt バリデーションOK app -> db : ユーザー情報を検索 db --> app : ユーザー情報を返す app -> User : ログイン成功メッセージを表示else バリデーションNG app -> User : エラーメッセージを表示endUser -> app : 書籍情報登録をクリックapp -> app : 書籍情報登録画面を表示User -> app : 書籍情報を入力app -> app : 入力された情報をバリデーションalt バリデーションOK app -> db : 書籍情報を登録 db --> app : 登録完了メッセージを返す app -> User : 登録完了メッセージを表示else バリデーションNG app -> User : エラーメッセージを表示enddeactivate app@enduml
図にするとこんな感じ
大体あっていますが、要件と異なる箇所があります。
@startuml
[*] --> 未読
未読 --> 読書中 : 開始
読書中 --> 読書中 : 読書進捗更新
読書中 --> 読了 : 読書完了
読了 --> 読了 : 感想と評価を更新
読了 --> 読書中 : 再開
読書中 --> 未読 : 中止
@enduml
機能要件に設定していない「中止」という遷移や要件にあるのに足りない遷移もあります。
読書をはじめたら、その本を読まなくなっても「未読」にはなりません。
読書中 --> 未読 : 中止
読了済みの本を登録する際は、「未読→読了」の遷移が必要です。
2.読書記録機能
- ユーザーは、読了済みの本を登録することができる。登録時には、感想や評価を入力することができる
こちらも自分で修正しました。
@startumlleft to right directionactor Userrectangle "読書記録アプリ" as app { usecase user_mgmt as "ユーザー管理 -- 登録,ログイン" usecase record_mgmt as "読書記録管理 -- 進捗状況の更新,感想と評価の登録 " usecase "他のユーザーの読書記録閲覧" as view_records User -> user_mgmt User --> record_mgmt User --> view_records}@enduml
テーブルを「カラム名、データ型、制約」の3種類に分類し、見やすく表示してくれました。
しかし、これらのテーブルは第三正規化できていません。
booksテーブル内にuser_idが含まれており、依存リレーションシップが発生しているため、本の重複が発生する可能性があります。
booksテーブルを正規化したテーブルは次になります。
ユーザーと本の多対多テーブルを作成することで、本の重複を避けます。
2.booksテーブル
カラム |
---|
book_id |
title |
page_count |
url |
5.読書本テーブル
カラム |
---|
user_id |
book_id |
status |
出力結果はこちら。
素晴らしい出来ですね。色も付けてくれて見やすいです。依存関係もバッチリ!
@startuml!define ENTITY entity!defineTABLEtable!define PRIMARY_KEY PK!define FOREIGN_KEY FK!defineUNIQUE UKskinparam class { BackgroundColor<<ENTITY>> YellowGreen BackgroundColor<<TABLE>> LightBlue BorderColor Black}entity"users"<<TABLE>> {+ user_id[PK]-- user_name password email user_icon}entity"books"<<TABLE>> {+ book_id[PK]-- book_name book_url total_pages start_date end_date}entity"progress"<<TABLE>> {+ progress_id[PK]--+ book_id[FK] progress_page update_date}entity"review"<<TABLE>> {+ review_id[PK]--+ book_id[FK] review rating submission_date}entity"reading_book"<<TABLE>> {--+ user_id[FK]+ book_id[FK] reading_status}reading_book }--|| users : user_idreading_book }--|| books : book_idprogress }--|| books : book_idreview }--|| books : book_id@enduml
要件定義では考慮していなかった機能や新しい機能をたくさん提案してくれました。
抜け漏れを防げるという点で、業務効率化に役立てそうですね。
また、シーケンス図やER図など、すでにある情報をまとめるのは得意なようです。
少し苦手なところとして、正規化や状態遷移図の作成など複雑な処理は芳しくない結果となりました。
特に正規化はシステムの根幹なので、間違った正規化をされると逆に非効率ですね。
納得いかない回答は、英文にすると精度が良くなるという話があるので、試してみてもいいかもしれません。
まぁ。。。結局、自分で勉強して、ChatGPTの出力が正しいか判断できるようにならないといけないなーという所感です。
https://medium.com/geekculture/5-chatgpt-features-to-boost-your-daily-work-404478fd70ca
https://aruva.medium.com/using-chatgpt-to-build-system-diagrams-part-i-69efc7603926
https://aruva.medium.com/using-chatgpt-to-build-system-diagrams-part-ii-a17d02f0dcb7
(スクレイピングで業務効率化もできるらしい)
https://www.codingthesmartway.com/how-to-use-chatgpt-to-fully-automate-web-scraping/
バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。