👻

ChatGPT × Kiro × GitHub Copilot の連携 - 暗記カードiOSアプリを開発した記録

に公開

はじめに

暗記カード iOS アプリを子供が欲しいと言っていたので作ってみた。

iOSアプリの開発は、AIが得意とする分野じゃないはずなので、AIが一発でいい感じのアプリを生成できる気がしなかった(前に一回失敗している)。なので、Kirospec-kit が提唱している AI による Spec-Driven Development (SDD) の方法で開発してみることにした。

(そもそも SDD は、従来のソフトウェア開発の要件作成 → 設計 → タスク分割と進める方法なので、特に新しいものではなく、むしろ古典的なソフトウェア開発手法な気がするが、それを AI にもやらせるのが "新しい" のだと解釈している)

作ったもの

記憶定着には短期的に集中して復習するより、長期的に期間をあけて繰り返し復習すると効果的らしい。今回は、登録した問題と回答のセットを、当日 → 翌日 → 翌々日 → 4日後 → 7日後 → 15日後 → 30日後 と間隔をあけて復習できる記憶カードアプリを作った。

iOSアプリの UIは SwiftUI で構築し、登録したカードは JSON をiPhoneに保存することで永続化している。

開発には、ChatGPT / Kiro / GitHub Copilot (Agent Mode) を組み合わせて進めた。Kiroだけでもできそうだが、ChatGPTは構想の壁打ち相手として利用。さらに Kiro はコーディングに使うには使用量の制限が厳しいためコーディングは GitHub Copilot に担当させた。

AppStore に公開するにはデベロッパー登録費用がかかったり、審査があって面倒なので、iPhoneに直接インストールする形にした。

ソースコード

https://github.com/nshmura/memora

スクリーンショット

ホーム 回答 回答完了
ホーム 回答 回答完了
カード一覧 カード登録 設定
カード一覧 カード登録 設定

開発の流れ (全部で8時間くらい)

ChatGPT (30分くらい)

最初に ChatGPT とアイデアを壁打ちして、Kiroに渡せる具体的な仕様に通し込んだ。
ChatGPTに投げたプロンプトは下のようなもの。

試験勉強のためのwebアプリを作りたい。

- ユーザは問題と答えを登録できる。
- アプリは今日も問題を出し、ユーザはそれに答える。アプリは答えを出す。
- 正解していたら、次に問題を出すのは忘却曲線を考慮した間隔を空けたあと。
- 不正解だったら、明日からやり直しで忘却曲線の初日にリセットされる。
  
こんな仕様なんだけど、Kiroに設計書を作らせるために、もう少し精査したい。
壁打ち相手になって欲しい。

次にアプリ名や、WebアプリにするべきかiOSアプリにするべきかを相談(iOSアプリを選択)

最後に画面のワイヤーフレームを出力してもらって、それを調整した。ワイヤーフレームはアスキーアートで出力されていて、これでちゃんと作れるか不安だったが、GitHub Copilot はちゃんと解釈してSwiftUIのコードを生成してくれていた。

ワイヤーフレーム生成の様子

Kiro (15分くらい)

次に、ChatGPTで生成した仕様をコピペしてKiroに渡し、Kiroの Spec モードで仕様・設計・タスクリストを生成した。(生成したものはこちら

Reusable Prompt の生成

その後、GitHub Copilot で効率的に開発を進めるために、GitHub Copilot の Reusable Prompt を Kiro に生成させた。

生成させるためにKiroに指示したプロンプトは以下のようなもの

タスクを一つずつ実装させるような GitHub Copilot の Reusable Prompt を作って。
Reusable Prompt の仕様は https://docs.github.com/ja/copilot/tutorials/customization-library/prompt-files とそれ以下のドキュメントを参考にして。

生成された Reusable Prompt はこちら。ただしファイルを置くディレクトリ名やファイル名が Reusable Prompt の規則に反していたので修正した。

Reusable Prompt は GitHub Copilot Agent Mode で、以下のように入力して使う。

# iOSプロジェクトのセットアップ
/setup-project

# Kiro が作ったタスクを1つ実装
/implement-task

# 実装をレビュー
/review-task

# 不具合の修正
/debug-task

上記の Reusable Prompt を使うことで、Kiro のタスクを一つずつ 実装レビューiPhoneシミュレーターで動作確認git commit と一連の流れで実行することができた。これを繰り返すことで反復的な開発が実現できた。

さらに、Reusable Prompt が Kiro が生成した仕様書や設計書を参照しており、GitHub Copilot が意図通りに実装を進めてくれた。

GitHub Copilot Agent Mode (7時間くらい)

最初に /setup-project で iOS プロジェクトのセットアップをしてみたが、これはうまくいかなかった。どうも Xcode のプロジェクトファイルが複雑すぎて GitHub Copilot には生成が難しいらしい。結局、手動で Xcode を使ってプロジェクトを生成した。(ここに 30分くらいかけた)

続いて GitHub Copilot の Agent Mode でタスクリストを 1 項目ずつ /implement-task/review-task、実機での動作確認を往復して消化していった。

1タスクだいたい10分から30分かかった。コードの生成は2,3分で終わるのだが、それを xcode でビルドするのに1,2分、iPhoneシミュレーター上で単体テストするのに5分くらいかかっていた印象がある。ビルドやテストでエラーが見つかれば、それを修正してさらにビルド、テストするのでなかなか時間がかかる。

タスクが全部で22個あったので、実装はトータルで7時間くらいと、なかなか時間がかかってしまった。これは Vibe Coding 一発で生成するのに比べると時間がかかった方だと思うが、反復的な開発で確実に動くものを積み上げていったので、安心感がある開発方法だったと思う。

開発の振り返り

Good

  • Spec-Driven Development と1タスクずつの反復的な開発により確実に進捗できた。
  • Kiro に Reusable Prompt を生成させたことで、GitHub Copilot に開発を委譲することができた。
  • アスキーアートのワイヤーフレームを GitHub Copilot がほぼ正しく解釈していた。(凝った画面をイメージを作る手間が省けた)

Bad

  • AIに iOS プロジェクトを生成させるのは現時点では無理そうだった
  • Xcode のビルドと iPhone シミュレーター上でのテストに時間がかかった。
  • Xcode 上に出ているエラーや、シミュレーターで何が起きているかを GitHub Copilot が認識できればもっと開発が早く進みそうな感覚がある。Apple 公式 の Xcode MCP がぜひ欲しい。
  • GitHub Copilot はコンテキストの圧縮 (summarize) を頻繁にやるので、その待ち時間も多かった。

まとめ

iOSアプリ開発を本格的にやったことがない私が、1日でアプリ開発を完了できたのは、いい時代になったものだと思う。

Spec-Driven Development の効用も感じていて、以前 iOSアプリをVibe Coding的に生成したときには意図通りに動くものを生成するためにプロンプトの調整に苦労したが、今回はKiroに生成させた仕様書通りのものができた。

補足のメモ

今回はシンプルなスケジューリングにしたが、忘却曲線を利用した学習スケジューリングアルゴリズムにも色々あるらしい。

以下は ChatGPT の出力そのままでちゃんと確認してないが、

SM-2
- 開発者:SuperMemo というソフトの作者 Piotr Woźniak(1980年代後半)。
- 仕組み:
  - 各カードごとに「E-Factor(Ease Factor=覚えやすさの係数)」を持つ。
  - ユーザが「覚えやすさ」を 0〜5 で評価すると、その結果で E-Factor を調整。
  - 次の間隔は「前回間隔 × E-Factor × 調整」で決まる。

- 特徴:
  - 古典的で実装が簡単。
  - Anki という有名アプリもこの SM-2 をベースにしている。

- 弱点:
  - モダンな統計的最適化に比べると、個人差の学習曲線を反映しきれない。
FSRS (Free Spaced Repetition Scheduler)
- 開発者:2021年頃、中国の開発者が提案した新アルゴリズム。
- 仕組み:
  - 機械学習っぽいアプローチ。カードごとに stability(記憶の安定性) と difficulty(難しさ) を推定する。
  - 復習結果(正解/不正解/遅延など)を学習ログとして使い、統計的にモデルを更新。
  - 将来の「忘れる確率」を予測し、最適な間隔を出す。

- 特徴:
  - SM-2よりも柔軟で、ユーザごとの学習速度にフィットしやすい。
  - 近年のAnkiコミュニティで人気が急上昇。

- 弱点:
  - 実装が複雑(回帰式やパラメータ調整が必要)。
  - データが少ないうちは精度が出にくい。

復習タイミングの研究論文は以下をChatGPTに紹介された。
https://pmc.ncbi.nlm.nih.gov/articles/PMC5126970/?utm_source=chatgpt.com

Smolen, P., Zhang, Y., & Byrne, J. H. “The right time to learn: mechanisms and optimization of spaced learning” (Nature Reviews Neuroscience, 2016).
→ “The Right Time to Learn” では、記憶の強化や忘却に関する神経生物学的な機構を踏まえて、復習(spaced training)を使った学習が、かたまり学習(massed training)よりも記憶が長く残ることを示しています。
また、「最適な間隔(optimal intervals)」をどう設計するか、復習のタイミングが記憶の維持・忘却率にどう影響するか、という点を論じています。

Discussion