0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ローカル開発環境なしで、ChatGPTに試験対策アプリを開発してもらった話

0
Posted at

この記事について

Python実践試験の対策アプリを、通勤電車の中でChatGPTに作らせた話です。

要するに、開発環境はiPhoneです(笑)

設計、開発、テスト、デプロイは、ほぼすべてChatGPTに任せました。
私が担当したのは、企画、仕様決定、実機テスト、ChatGPTへの修正指示です。

詳しい開発方法が気になる方は、続きをご覧ください。

はじめに

Pythonの資格試験対策として、スマートフォンで問題を解ける学習アプリが欲しくなりました。

既存の学習サイトには、地下鉄で電波が悪いとページが切り替わらない、広告が邪魔になる、といったストレスがありました。

そこで、次のように考えました。

  • iPhone上で静的サイトをローカル実行すれば、通信環境に左右されないのでは?
  • もしかすると、ChatGPTだけでもアプリを開発できるのでは?

そんな思いつきから、実際に作ってみることにしました。

欲しかった機能は次のとおりです。

  • Pythonの基礎・実践問題を繰り返し解ける
  • 間違えた問題だけを復習できる
  • 未回答の問題だけを出題できる
  • 章別・カテゴリ別に学習できる
  • 学習履歴から弱点を確認できる
  • iPhoneのホーム画面からアプリのように起動できる
  • 一度読み込めばオフラインでも利用できる

そこで、ChatGPTに相談しながら、Python学習用PWA「PyTrain」を開発しました。

リポジトリはこちらです。

今回の特徴は、自分のPCに開発環境を構築していないことです。

VS Code、Node.js、ローカルWebサーバーなどを使って自分でコードを書くのではなく、ChatGPTに要件を伝え、GitHub上のリポジトリを直接更新してもらいました。

また、CodexやClaude Codeのようなコーディングエージェントではなく、通常の対話型LLMを使って開発した点も特徴です。

私は主に企画、仕様決定、実機テストを担当し、ChatGPTが設計、実装、修正、テスト、デプロイ設定を担当しました。


作ったもの

PyTrainは、Pythonの資格試験対策問題をスマートフォンで学習するためのWebアプリです。

現在は400問を収録しており、実践試験対策を中心とした問題バンクとして利用しています。

主な機能

  • 10問、20問、40問、100問、200問、全問から出題数を選択
  • 章別・カテゴリ別の出題
  • 未回答問題のみ出題
  • 選択肢の順番をランダム化
  • 回答直後に正解と解説を表示
  • 前回間違えた問題だけを復習
  • 回答済み問題と未回答問題の管理
  • 正答率に応じたランク表示
  • 章別・カテゴリ別の学習実績表示
  • 正答率から弱点を自動判定
  • 実績を横棒グラフまたは表形式で表示
  • PWAとしてiPhoneのホーム画面へ追加
  • Service Workerによるオフライン利用

学習履歴はサーバーへ送信せず、ブラウザのlocalStorageへ保存しています。

そのため、ログイン機能、バックエンドサーバー、データベースはありません。


システム構成

PyTrainは、フレームワークを使用しないシンプルなWebアプリです。

分類 使用技術
UI HTML / CSS
アプリ処理 Vanilla JavaScript
問題データ JavaScriptオブジェクト
データ保存 Web Storage APIのlocalStorage
PWA Web App Manifest / Service Worker
ホスティング GitHub Pages
CI/CD GitHub Actions
検証処理 Python
ソース管理 GitHub
開発 ChatGPT

バックエンドを持たない静的サイトなので、GitHub Pagesだけで公開できます。

フォルダ構成

主要な構成は次のとおりです。

PyTrain/
├─ public/
│  ├─ index.html
│  ├─ manifest.webmanifest
│  ├─ sw.js
│  ├─ icons/
│  └─ data/
│     ├─ basic-1.js
│     ├─ basic-2.js
│     ├─ practical-1.js
│     ├─ practical-2.js
│     ├─ scope-fix.js
│     ├─ practical-only.js
│     ├─ level-scope-audit.js
│     ├─ choice-display-fix.js
│     └─ stats-dashboard.js
├─ tools/
│  └─ validate_project.py
└─ .github/
   └─ workflows/
      └─ pages.yml

publicディレクトリが、そのままGitHub Pagesへ公開されます。


ローカル開発環境を使わない開発フロー

今回の開発では、自分のPC上にリポジトリをクローンしていません。

開発の流れは、ほぼ次の繰り返しでした。

iPhoneでPyTrainを操作
        ↓
問題点や追加したい機能を見つける
        ↓
ChatGPTへ日本語で要件を伝える
        ↓
ChatGPTがGitHub上のコードを確認
        ↓
ChatGPTがコードを実装・修正
        ↓
mainブランチへ反映
        ↓
GitHub Actionsで自動検証
        ↓
GitHub Pagesへ自動デプロイ
        ↓
iPhoneで動作確認

一般的な開発では、ローカル環境でコードを書き、テストしてからGitHubへpushします。

今回は、GitHubをソースコード置き場としてだけでなく、開発環境、検証環境、デプロイ環境として利用しました。


ChatGPTに担当してもらったこと

今回、ChatGPTは「開発支援ツール」ではなく、実際の開発者として利用しました。

主に担当してもらった作業は次のとおりです。

アプリの初期実装

要望を自然言語で伝え、HTML、CSS、JavaScriptを使ったクイズアプリを作成してもらいました。

PWA対応

iPhoneのホーム画面からアプリとして起動できるように、以下を実装してもらいました。

  • manifest.webmanifest
  • PWA用アイコン
  • Service Worker
  • オフラインキャッシュ
  • iPhoneのセーフエリア対応
  • スマートフォン向けレスポンシブ表示

問題データの作成と整理

問題文、4択の選択肢、正解、解説、カテゴリを持つ問題データを作成しました。

問題データは、おおむね次の形式です。

{
  q: "問題文",
  choices: [
    "選択肢A",
    "選択肢B",
    "選択肢C",
    "選択肢D"
  ],
  answer: 0,
  explanation: "解説",
  category: "カテゴリ名"
}

正解位置が特定の選択肢へ偏らないように、AからDまでの正答数も調整しています。

学習履歴の実装

localStorageを使い、以下の情報を端末内へ保存しています。

  • 回答済み問題
  • 各問題の回答回数
  • 各問題の正解回数
  • 累計正答数
  • 最高正答率
  • 前回間違えた問題
  • 学習設定

実績ダッシュボードの実装

問題を解くだけでなく、自分の弱点を確認できるようにしました。

章別・カテゴリ別に、次の情報を表示できます。

  • 全問題数
  • 回答済み問題数
  • 未回答問題数
  • 学習進捗率
  • 累計解答数
  • 累計正解数
  • 正答率
  • 最も正答率が低い項目

当初はレーダーチャートを実装しましたが、項目数が増えると読みにくくなったため、横棒グラフへ変更しました。

さらに、グラフだけでなく、数値を確認しやすい表形式にも切り替えられるようにしています。


私が担当したこと

コードそのものはChatGPTが作成しましたが、人間側の作業がなくなったわけではありません。

私が担当したのは、主に次の部分です。

何を作るか決める

最初に「Pythonの問題を解けるアプリが欲しい」という目的を決めました。

その後、実際に使いながら、次のように仕様を追加していきました。

  • 間違いだけ復習したい
  • 未回答だけ出題したい
  • 章ごとに問題を選びたい
  • 成績をグラフで見たい
  • 自分の弱点を知りたい
  • 成績に応じてランクを表示したい

期待する動作を説明する

ChatGPTに「表示がおかしい」と伝えるだけでは、正確な修正はできません。

次のような情報を伝える必要がありました。

実行した操作:
期待した動作:
実際に起きた動作:
修正してほしい箇所:
維持してほしい既存機能:

これは通常のシステム開発における、要件定義や不具合報告と同じです。

iPhoneで実機テストする

GitHub Pagesへ反映されたアプリをiPhoneで操作し、次の点を確認しました。

  • ボタンを押しやすいか
  • 画面内に情報が収まっているか
  • ホーム画面から起動できるか
  • オフラインで問題を開けるか
  • 更新後に新しい画面が表示されるか
  • 学習履歴が正しく保存されるか
  • 問題数や出題条件が正しいか

今回の役割分担は、次のような形だったと思います。

私
├─ 企画
├─ 要件定義
├─ 仕様決定
├─ 受け入れテスト
└─ 改善点の判断

ChatGPT
├─ 設計
├─ コーディング
├─ GitHub上のファイル編集
├─ バグ修正
├─ リファクタリング
├─ 検証処理の実装
└─ デプロイ設定

私はプロダクトオーナー兼テスターで、ChatGPTが開発者という構図です。


GitHub Actionsによる自動検証

ローカル環境を使わないため、変更後の検証はGitHub Actionsで実行しています。

mainブランチへ変更が反映されると、次の処理が実行されます。

リポジトリをチェックアウト
        ↓
validate_project.pyを実行
        ↓
検証に成功したらpublicをアップロード
        ↓
GitHub Pagesへデプロイ

検証スクリプトでは、以下を確認しています。

  • 必須ファイルが存在するか
  • 問題数が正しいか
  • 各問題に必要な項目があるか
  • 選択肢が4件あるか
  • 同じ選択肢が重複していないか
  • 正解番号が0から3の範囲か
  • 問題文が重複していないか
  • 解説やカテゴリが空になっていないか
  • 正答位置が偏っていないか
  • ManifestやService Workerが存在するか
  • 必要なファイルがオフラインキャッシュ対象に含まれているか

つまり、ChatGPTがコードを変更しても、最低限のデータ構造やPWA構成を壊した状態では公開されないようにしています。


苦労した点

Service Workerのキャッシュ

PWAでは、一度読み込んだファイルが端末内へキャッシュされます。

これはオフライン利用には便利ですが、更新後も古いJavaScriptやHTMLが表示される問題が起きます。

対策として、キャッシュ名をバージョンごとに変更し、古いキャッシュを削除する処理を追加しました。

また、HTMLやJavaScriptはネットワーク上の最新版を優先し、取得できない場合にキャッシュを利用する方式へ調整しています。

問題データの品質

400問を収録すると、単純な構文エラー以外にも次の問題が発生します。

  • 問題文が重複する
  • 選択肢が重複する
  • 正答位置が偏る
  • 解説と正解が一致しない
  • 基礎問題と実践問題の難易度が合わない
  • カテゴリや章の分類が不適切になる

そのため、問題数だけでなく、問題の構造や重複を機械的に検証する仕組みが必要になりました。

仕様変更時の学習履歴

問題を別カテゴリや別レベルへ移動すると、問題IDが変わる場合があります。

問題IDが変わると、過去の回答履歴と新しい問題を関連付けられません。

そこで、問題バンクの構成を変更する際には、古いIDで保存されているlocalStorageのデータを新しいIDへ移行する処理も追加しました。

機能追加によるコードの複雑化

短期間で機能を追加したため、追加JavaScriptによって既存画面を拡張する構成が増えました。

この方法は、既存コードを大きく変更せず機能を追加できるメリットがあります。

一方で、長期的には次の問題が発生します。

  • 読み込むJavaScriptファイルが増える
  • 実行順序への依存が強くなる
  • どのファイルが画面を変更しているか分かりにくい
  • Service Workerのキャッシュ対象管理が複雑になる

今後さらに機能を増やす場合は、アプリ本体、データ管理、画面表示、実績管理をモジュール単位に整理する必要があります。


ChatGPTだけで開発して分かったこと

簡易Webアプリは実装できる

今回の開発によって、ChatGPTを使えば、用途を限定したWebアプリを実際に完成させられることが分かりました。

特に、次のようなアプリは相性が良いと思います。

  • 個人用学習アプリ
  • 社内向け簡易ツール
  • データ入力・集計ツール
  • チェックリスト
  • クイズアプリ
  • プロトタイプ
  • アイデア検証用アプリ

コーディング以外の能力が重要になる

コードをChatGPTが書く場合でも、人間側には次の能力が必要です。

  • 作りたいものを決める
  • 必要な機能を整理する
  • 期待する動作を言語化する
  • 不具合を再現する
  • 修正内容を評価する
  • どこまで作れば完成かを判断する

コードを書く比重が下がる一方で、要件定義、テスト、レビュー、優先順位付けの比重が上がります。

動いたことと、正しいことは別

ChatGPTが生成したコードがエラーなく動いても、仕様どおりとは限りません。

例えば、グラフが表示されていても、集計対象や計算式が間違っている可能性があります。

問題が400問表示されていても、重複問題や誤答が含まれている可能性があります。

そのため、最終的な確認は人間が行う必要があります。

ChatGPTは開発者になれるが、プロダクトオーナーは必要

今回、ChatGPTは設計やコーディングだけでなく、GitHub上の修正とデプロイ設定まで担当しました。

ただし、ChatGPT自身が「この機能は本当に必要か」「この状態で完成とするか」を決めるわけではありません。

人間が目的と優先順位を決め、ChatGPTが実装する形が、現時点では最も使いやすいと感じました。


今後の課題

PyTrainは、自分で学習するための簡易Webアプリとしては、ひとまず必要な機能が揃いました。

今後さらに改善する場合は、次のような対応が考えられます。

  • 問題データと画面処理の分離
  • 問題内容の継続的な精査
  • 学習履歴のバックアップ・復元
  • 複数端末間での履歴同期
  • アクセシビリティ改善

ただし、認証やクラウド同期を追加すると、バックエンド、データベース、セキュリティ設計が必要になります。

個人用PWAとしてシンプルさを維持するのか、複数端末対応のサービスへ発展させるのかは、分けて考える必要があります。


まとめ

PyTrainの開発では、自分のPCにローカル開発環境を作らず、ChatGPTとGitHubだけでWebアプリを実装しました。

使用した主な構成は次のとおりです。

ChatGPT
  ↓ コードを実装・修正
GitHub
  ↓ mainブランチへ反映
GitHub Actions
  ↓ 自動検証
GitHub Pages
  ↓ 自動公開
iPhone
  ↓ 実機テスト
ChatGPTへ改善内容を伝える

今回分かったのは、ChatGPTでも簡単なWebアプリの開発ができるということです。
正直、トークンを気にしなくていいのはかなり快適でした。

LLMがHTML、CSS、JSをここまで高精度に書けるのであれば、
人間には、何を作るかを決め、仕様を説明し、完成したものが正しいかを評価ことに集中できます。

今回の開発では、私はまったくコードを書いていません。

それでも、企画から実装、テスト、公開まで進め、実際に利用できるPWAを完成させることができました。

PyTrainそのものが完成したことに加えて、ChatGPTを開発者として使えば、個人でも簡易Webアプリを形にできると確認できたことが、今回の最も大きな成果でした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?