「怠惰・短気・高慢」であれ、ChatGPTを使って業務効率化しよう(要件定義編)

2023/03/15に公開

ChatGPTで業務効率化してこう

基本的なWeb開発の流れに沿って、ChatGPTと共に0からWebアプリをつくることで、ChatGPTをどのように使うのか、どこまで効率化してくれるかを解説します。
記事が長いので、自分の興味のある項目だけ読み飛ばして読むことをお勧めします。

効率化度合いの評価まとめ

🌟...いまいち
🌟🌟...使える
🌟🌟🌟...ChatGPT最高!!

要件定義に関する項目 評価
要件定義 🌟🌟🌟
ユースケース図 🌟🌟
シーケンス図 🌟🌟🌟
状態遷移図 🌟🌟
正規化 🌟
ER図 🌟🌟🌟

例として読書記録アプリをつくります!

筆者が欲しいサービスを作ろうと思い、今回は「読書記録アプリ」をつくります。
最低限の要件は、次のように設定しました。

デモアプリの要件(読み飛ばしてOK)

読書記録アプリを作る目的
読書が苦手なエンジニアが読書記録をし、記録を共有することで、継続して技術本を読めるようになること

ターゲット
新人、中堅のWebエンジニア

おおまかな要件

  • ユーザーは新規登録することで、読書記録アプリにログインできる
  • ユーザーは読む本を登録できる
  • ユーザーは本を何ページ読み終えたかを記録できる
  • ユーザーは本を読み終わったら次の本を登録できる
  • ユーザーは他の人がどの本を読んでいるのか、また何ページ読み終えたかを閲覧できる

質問する前に...

また、ChatGPTに業務で使用するコードを渡す場合、環境キーやサービスを特定できる情報を送信しないでください。入力内容が他の人に渡ってしまう危険性があります。

「あなたはプロのWeb開発エンジニアとして回答してください。」

まず初めに、ChatGPTのロールを設定します。今回はプロのエンジニアになりきってもらうことで、より精度の高い提案をしてもらうようにします。

要件定義

「機能要件をまとめてください。」

機能仕様書を作成する際に使えます。同じ質問をしても、違う回答が返ってくることがあるため、回答が気に入らなかったら新しいスレッドを作成するのが有効です。

機能要件が多い場合
「機能が多いので最低限の機能要件をまとめてください」

機能要件が少ない場合
「◯◯について、さらに詳しい機能要件を提案してください」


1から考えるより、出力結果から修正する方がはるかに楽

1から全て自分でつくるとなると、「ググる→中身を考える→まとめる」の3STEPが必要ですが、ChatGPTを使うと「ChatGPT→修正」の2STEPなので手間が省けます。

必要な項目をあらいだしてくれた
Webアプリに必要と思われる次の項目を提案してくれました。新規登録時の項目は必要十分です。

  • ユーザー名
  • パスワード
  • Eメールアドレス
  • プロフィール画像

考慮してなかった機能を提案してくれた
そういう需要もあるのかなぁ・・・。という参考になります。取捨選択は自分で行う必要があります。

2.読書記録機能
読了済みの本についても、読み返した際には、ページ数を更新することができる

爪が甘いところもある

3.他の人の読書記録閲覧機能
他のユーザーのプロフィール画像、ユーザー名、Eメールアドレス、パスワードは、閲覧できない

一見問題ないように見えますが、ユーザーのプロフィール画像、ユーザー名は他のユーザーも閲覧できていいです。

「機能要件は次に修正してください。」

修正を加えた機能要件をChatGPTに教えます。次の質問から修正した機能要件を前提に回答してくれます。以下は修正後の内容です。

1.新規登録機能
- ユーザーは、アカウント作成時に、ユーザー名とパスワード、Eメールアドレスを登録することができる
- ユーザー名、パスワード、Eメールアドレスは、必須項目である
- ユーザーは、登録時にプロフィール画像をアップロードすることができる
2.読書記録機能
- ユーザーは、読んでいる本の情報を登録することができる
- 登録する情報は、書籍名、ページ数、URL、読書状況(未読、読書中、読了)とする
- 読了状態に変更した場合は、読了日を自動的に登録する
- ユーザーは、読書中の本に対して、進捗状況を更新することができる。更新する情報は、読み終えたページ数である
- 読了済みの本はページ数を更新できない
- ユーザーは、読了済みの本を登録することができる。登録時には、感想や評価を入力することができる
3.他の人の読書記録閲覧機能
- ユーザーは、他のユーザーの読書記録とユーザー情報を閲覧することができる
- 他のユーザーが登録した読書情報(書籍名、ページ数、URL、読書状況、感想、評価)を閲覧することができる
- 他のユーザーが登録したユーザー情報(プロフィール画像、ユーザー名)を閲覧することができる

「ユースケース図を作成して」

ユースケース図は、「ユーザー目線で」システムができることを表現する図です。
PlantUML形式でコード出力をお願いすることで、ユースケース図を作成できます。


(よさげな雰囲気ですが、間違っています)

ユースケース図の出力結果を確認

それっぽい結果を出力してくれましたが、図にするとぐちゃぐちゃでした。

ユースケース図(ChatGPT)
@startuml
left to right direction
actor User
rectangle "読書記録アプリ" 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から作成するよりは時短できたと思います。

ユースケース図(修正版)
ユースケース図(修正版)
' 修正版
@startuml
left to right direction
actor User
rectangle "読書記録アプリ" 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からつくるよりは早いはずです。

「シーケンス図を作成して」

シーケンス図とは「プログラムの処理の流れや概要」を把握するための図です。
バリデーションの条件も上手に作成してくれました。

シーケンス図(ChatGPT)
@startuml
actor User
User -> app : アプリを開く
activate app

User -> app : 新規登録をクリック
app -> app : 新規登録画面を表示
User -> app : ユーザー情報を入力
app -> app : 入力された情報をバリデーション
alt バリデーションOK
  app -> db : ユーザー情報を登録
  db --> app : 登録完了メッセージを返す
  app -> User : 登録完了メッセージを表示
else バリデーションNG
  app -> User : エラーメッセージを表示
end

User -> app : ログインをクリック
app -> app : ログイン画面を表示
User -> app : ユーザー情報を入力
app -> app : 入力された情報をバリデーション
alt バリデーションOK
  app -> db : ユーザー情報を検索
  db --> app : ユーザー情報を返す
  app -> User : ログイン成功メッセージを表示
else バリデーションNG
  app -> User : エラーメッセージを表示
end

User -> app : 書籍情報登録をクリック
app -> app : 書籍情報登録画面を表示
User -> app : 書籍情報を入力
app -> app : 入力された情報をバリデーション
alt バリデーションOK
  app -> db : 書籍情報を登録
  db --> app : 登録完了メッセージを返す
  app -> User : 登録完了メッセージを表示
else バリデーションNG
  app -> User : エラーメッセージを表示
end

deactivate app
@enduml


図にするとこんな感じ

「状態遷移図を作成して」

大体あっていますが、要件と異なる箇所があります。

状態遷移図(ChatGPT)

@startuml
[*] --> 未読
未読 --> 読書中 : 開始
読書中 --> 読書中 : 読書進捗更新
読書中 --> 読了 : 読書完了
読了 --> 読了 : 感想と評価を更新
読了 --> 読書中 : 再開
読書中 --> 未読 : 中止
@enduml

なんとなくあってるけど、なんとなく違う

機能要件に設定していない「中止」という遷移や要件にあるのに足りない遷移もあります。

読書をはじめたら、その本を読まなくなっても「未読」にはなりません。

読書中 --> 未読 : 中止

読了済みの本を登録する際は、「未読→読了」の遷移が必要です。

2.読書記録機能

  • ユーザーは、読了済みの本を登録することができる。登録時には、感想や評価を入力することができる

こちらも自分で修正しました。

状態遷移図(修正版)
@startuml
left to right direction
actor User
rectangle "読書記録アプリ" as app {
  usecase user_mgmt as "ユーザー管理
  --
  登録,ログイン"
  usecase record_mgmt as "読書記録管理
  --
  進捗状況の更新,感想と評価の登録
  "
  usecase "他のユーザーの読書記録閲覧" as view_records

  User -> user_mgmt
  User --> record_mgmt
  User --> view_records
}
@enduml

DB設計

「第三正規化まで行い、テーブルを作成して」

テーブルを「カラム名、データ型、制約」の3種類に分類し、見やすく表示してくれました。


しかし、これらのテーブルは第三正規化できていません。
booksテーブル内にuser_idが含まれており、依存リレーションシップが発生しているため、本の重複が発生する可能性があります。

booksテーブルを正規化したテーブルは次になります。
ユーザーと本の多対多テーブルを作成することで、本の重複を避けます。

2.booksテーブル

カラム
book_id
title
page_count
url

5.読書本テーブル

カラム
user_id
book_id
status

「テーブルからER図を作成して」

出力結果はこちら。
素晴らしい出来ですね。色も付けてくれて見やすいです。依存関係もバッチリ!

ER図(ChatGPT)
@startuml
!define ENTITY  entity
!define TABLE   table
!define PRIMARY_KEY PK
!define FOREIGN_KEY FK
!define UNIQUE   UK

skinparam 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_id
reading_book }--|| books : book_id
progress }--|| books : book_id
review }--|| 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/

Discussion