生成AIとAndroidApp開発をやってみて分かったこと

# 0. はじめに
「何か新しいことに挑戦したいけど、専門外だし何から手をつければ…」  
「個人でアプリ開発してみたいけど、一人じゃ心細いな…」  

そんな風に感じているあなたへ。この記事は、ソフトウェア開発の経験はあるものの、スマートフォンアプリ開発や特定のプログラミング言語（Kotlin）は全くの未経験だった私が、**LLM（GoogleのGemini）をプロジェクトリーダー兼相棒**として、アイデアを形にし、MVP（実用最小限の製品）として「RenQ 〜計画苦手さんの先取り連休アラート〜」というAndroidアプリを開発した記録です。  

## この記事のターゲット読者
- LLMをソフトウェア開発やプロジェクト進行のパートナーとして活用することに強い関心を持つ方
- 個人開発者、またはこれから個人開発を始めたいと考えている方
- 新しい技術分野（今回はAndroid/Kotlinだったが、他の分野でも応用可能）に挑戦したいと考えている方  

## この記事から得られること
- 個人開発プロジェクトにおけるLLMの多角的な活用方法（壁打ち、情報収集、設計支援、コード生成・デバッグ支援、ドキュメント作成支援など）。
- アイデア創出からMVPリリース（またはその準備段階）までの、AIと二人三脚で進める開発プロセスの実例。
- 開発中に遭遇するであろう典型的な課題と、AIを活用した（あるいはAIの限界を踏まえた）解決アプローチ。
- AIを「プロジェクトリーダー」や「有能なアシスタント」として捉えた場合の、新しい開発スタイルの可能性。

## 筆者の簡単な自己紹介
- プラグラミング経験：業務で組み込みソフトウェア開発(C言語)、商用レベルではないがpythonは使用経験あり(簡単な作業の自動化のためのツール作成やPoC作成レベル)
- Androidアプリ開発/Kotlinは未経験(App開発を始める前にUdemyでAndroidアプリ開発の入門コースを1周)

## 作成したアプリの紹介
![feature_graphic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687592/fc9899da-8206-4e32-86fc-61d4c94ba01f.png)
<table>
  <tr>
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687592/0051fc1f-49d4-4c9f-aac1-ccb25763c16e.png" width="250">
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687592/087f9f8f-1476-4840-ba12-ee89094cdf3f.png" width="250">
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687592/759c1ee1-8aad-497a-a6cb-765c3dba200a.png" width="250">
  </tr>
</table>  

**「RenQ 〜計画苦手さんの先取り連休アラート〜」**（デバイス表示名: RenQ）は、  
「大型連休の旅行計画、いつも出遅れちゃうんだよな…」という私自身の悩みから生まれたアプリです。  
日本の祝日と週末を自動で判定し、大型連休の計画を開始すべき最適なタイミング（例: 3ヶ月前）にプッシュ通知でお知らせ。  
計画が苦手な方でも、余裕をもって楽しい旅行の準備ができるようサポートすることを目指しています。    
個別の有給情報登録や、好みに合わせた旅行先紹介などまだまだ搭載したい機能はありますが、まずはMVPとして最小限の機能のみとしています。


# 1. プロジェクト始動
## なぜ生成AIをプロジェクトリーダーにしたか？
未知の領域であるスマホアプリ開発。右も左も分からない状態では、膨大な情報の中から何を選び、どう進めれば良いのか途方に暮れてしまいます。  
業務での経験を振り返ってみると
1. 研修/座学
2. OJT with メンター/プロジェクトリーダー(PL)
3. PL

の流れで教育をしているところがほとんどだと思います。(1,2を丁寧にやっている会社は少ないかもしれませんが。。)  
そこでLLMを使って
1. Udemyでの座学研修
2. OJT with LLM
3. PL with LLM as a member

の流れで実施することで、プライベートでも同様の経験ができるのではないかと考えました。  
今回　メンター/PL役として選んだのは、Googleの**Gemini**にしました。  
PLという役割上、長期間の会話を行なっていくことになることが想定されたので、ロングコンテキストに長けているGeminiにしました。  
また、ところどころでOpenAIの**ChatGPT**も併用しています。

## 最初のアイデアの相談
「RenQ」の基本的なアイデア（「計画が苦手な人に、連休の計画タイミングを事前に通知するアプリ」）をGeminiに伝え、ニーズがあるかを確認しました。  

**プロンプト**:
> Androidのアプリ開発をします。  
> 長期的な計画を立てることが苦手な人をターゲットにし、連休の数ヶ月前に旅行の提案を実施するアプリです。  
> このアプリに対して、どう思いますか?  
 
**Gemini**: 
>  素晴らしいアイデアだと思います！  
> 「長期的な計画が苦手な人」という明確なターゲット設定と、「連休の数ヶ月前に旅行を提案する」という具体的な解決策は、特定のニーズに応える可能性を秘めています。  
>  以下省略

Geminiさんによると特定のニーズはありそうとのこと。(ニーズがなくても私が欲しい機能なので開発をしますが。)

## 開発計画の作成
KotlinのJetpack composeを学んでみたかったので、以下のようにプロンプトを入力し、開発計画を立ててもらいました。  

**プロンプト**:
> 技術スタックとしてKotlinのJetpack composeを使用します。  
> アプリの開発計画を作成してください。  
> まずはmvpとして最も簡単な構成で作成してリリースまで行います。  

これに対してGeminiはMVPに搭載する機能の決定、搭載しない機能の決定、技術スタック、開発フェーズを出力してくれました。  
MVPに搭載する機能は本当にMinimumだったため、追加機能の要望などは行いました。

## PLへの任命
Geminiに対してPLとして動いてもらうように任命します。  

**プロンプト**:
> この計画で開発を進めます。  
> これからあなたはプロジェクトリーダーとして行動してください。  
> 実施するタスクは全て初心者が実施することと考え、具体的に指示をしてください。  
> 指示は1日ぶんの指示を出した後、次の指示を求められたら次のステップに進みます。  
> 1日分の指示に対する質問が来た場合は、次のステップに進まず、質問に回答してください。  

# 2. アプリ開発
## 開発環境構築
先ほどのプロンプトを受けてGeminiは開発環境構築の指示を出力しました。

**Gemini**:
> はい、承知いたしました。本日からプロジェクトリーダーとして、開発タスクを具体的にお伝えしていきます。開発は初めてとのことですので、焦らず一つずつ進めていきましょう。  
> 【Day 1】プロジェクトの基礎を固めよう！  
> 本日の目標は、Android Studioで新しいプロジェクトを作成し、基本的な設定と、今後必要になる重要なライブラリ（部品）を追加することです。  
> 本日のタスク:  
> Android Studioの起動とプロジェクト作成:  
> Android Studioを開いてください。  
> 「New Project」を選択します。  
> 「Phone and Tablet」タブで、「Empty Activity」を選び、「Next」をクリックします。  
> 以下の項目を設定してください。  
> Name: アプリケーション名です。例えば PlanBTravel と入力しましょう。  
> 以下省略

環境構築の中で、基本的なライブラリの追加まで求められましたが、  
そのライブラリが必要になった段階で追加をしたかったため  
追加は後回しにしてもらうようにしました。  

**私**:  
> プロジェクトへのライブラリの追加はそのライブラリを実装する際に追加することにしてください。  
> 本日はまず実装を進めるタスクにしてください。

かなり生意気な新人ですね。


また、指示の意図がわからない場合は、都度質問を行なっています。  

**プロンプト**:  
> dependencies { ... }ブロックに追加した内容について、追加する理由をもう少し詳しく教えてください。  
> dependenciesについて詳しく解説しているWebページがある場合、そのリンクを教えてください。  

## コア機能実装
コア機能実装については、Geminiが指示するタスクを実施→「次のタスクを指示して」の繰り返しです。  
祝日情報の取得にGoogle Calendar APIを利用していますが、**APIの制限(GCP側)やKeyのGitへの登録禁止指示、Keyのソースコードへの埋込禁止指示**なども指示してくれます。  
またファイル分割やディレクトリ分割も指示してくれます。特にデザインパターンに沿った設計(Repositoryパターン/インターフェースと実装クラスの分離など)などもしてくれます。  
ただし、適切な粒度ではないと感じる場合もありました。  
その場合はファイル分割を指示します。  

**プロンプト**:
> ...  
> calendarId: String,  
> apiKey: String  
> ): Result<List<Holiday>>  
> }  
> となっています。  
> 適切なファイル分割にするにはどうすればいいですか？  

今回のアプリでは通知機能が必要なのですが、Hilt利用時のWorkManagerの設定に苦労しました。  
WorkManagerのWorkerクラスにHiltで依存性注入を行っているのですが、ビルドは成功するのに、Worker処理がうまく動かないエラーに遭遇しました。  
大体のエラーはGeminiにエラー内容を貼り付けることで対応策を提案してくれるのですが、このエラーに関してはなかなか解決しませんでした。  
最終的には、Webで情報を探し、公式ドキュメントの該当部分をGeminiに渡すことでエラーが解消されました。  

**プロンプト**:
> Https://developer.android.com/develop/background-work/background-tasks/persistent/configuration/custom-configuration?authuser=1&hl=ja  
> でmanifestを編集して通常のWorkerプロセスを停止する必要があると記載がありますがこれをする必要はありますか?

## UI実装
アプリUIは最初はGeminiが提案してきたJetpack Composeでの実装をそのまま採用していました。  
提案されていたUIはMVPを意識しているのか、シンプルな構成となっていました。  
個人的にもシンプルな見た目の方が好きだったので、あまり気にしていなかったのですが、  
ChatGPTで画像生成ができることを知り試してみたところ、今よりも好みのUIが生成されたので、このUIに変更することにしました。  
(ChatGPTには、アプリの説明をinputしてMVP案の作成、アプリのメインUIをデザインを依頼していました。)

Geminiに対して、画像を添付しながら下記のように指示を出しました。

**プロンプト**:
> コンテンツ提供の前にUIの見直しを行います。  
> メインページではこのようなUIを考えています。  
> UIの上部に次の連休の表示をこのように実施したいのですが実装方法を教えてください。  
> 連休表示の下のカレンダーは不要です。  

ほぼほぼイメージ通りのUI実装を提案してくれました。  
変更したい部分が見つかれば、都度指示を出します。(例：日付表示に曜日を加えたいです。)

また、実現したい機能を教えることで、UIを考えてもらうようなこともしました。

**プロンプト**:
> 連休カードがスワイプできることが分かりにくいです。何か良い方法はありますか？

# 3. テスト戦略
## テストコード
LLMが指示するタスクの中には、動作確認や、テストをしてくださいといったタスクも含まれていました。  
ただし、テストの実施方法については、エミュレータ上で確認、ソースコードのレビューといった内容になっており、  
単体テスト可能なロジック部分に対してテストコードを作成する指示は出されませんでした。  
(MVPのためリリースを優先されたのかもしれませんが。)  
ロジック部分に関しては、テストコードで実施したかったため、次のようなプロンプトでテストコード作成をタスクに含めてもらいました。

**プロンプト**:
> テストに関して、単体テストコードの作成を計画に入れてください。  
> 次のタスクは単体テストコードの整備です。  


# 4. リリース準備
## アイコン準備
Androidアプリのアイコンの準備です。  
私はデザインセンスが皆無なため、これもLLMに実施してもらうことにしました。

**プロンプト**:
> アプリケーションのアイコン画像は生成AIを使って作成したいと考えています。  
> 上記を実施できる生成AIサービスのリサーチおよび  
> アプリ名、アプリ機能から適切なアイコンが作成できるようなプロンプトを考えてください。  

最終的に「Recraft.ai」というサービスを使ってアイコンの生成は行いました。

## 表示名
表示名ももちろんLLMに考えてもらいます。

**プロンプト**:
> このアプリに適切な名前を考えてください。  
> ただし、キャッチーかつターゲットユーザーに刺さるようなアプリ名にしてください。  

## フィーチャーグラフィック
フィーチャーグラフィックもLLMでできないかと相談しましたが、適切なサービスが見つからず、これだけは自作しました。

## GooglePlayへのアップロード
GooglePlayへのアップロードなども全てLLMに確認しています。  
Release鍵での署名を行ったaabファイルの作成方法や、プライバシーポリシーの作成などです。  
プライバシーポリシーの作成などは生成されたものが正しいかのチェックは行なっています。  

# 5. おわりに
今回のMVPアプリ開発を行うにあたり、約40日間(1〜3h/日)の開発を行いました。  
完全未経験の状態から形になるアプリ開発をすることができたのは、LLMがあったおかげです。

## LLMがプロジェクトで果たした役割と、そのメリット
以下はGeminiが作ってくれましたが、その通りだと感じています。
- **超高速な情報検索・知識提供**: Android開発の基本的な概念、Kotlinの文法、Jetpack Composeのコンポーネントの使い方、各種ライブラリの設定方法など、私が直面するであろうあらゆる疑問に対して、Geminiは驚くほど迅速に情報を提供してくれました。公式ドキュメントを読む時間はもちろん重要ですが、まずはAIに質問して概要を掴み、方向性を示してもらってから詳細を調べる、という進め方は非常に効率的でした。
- **設計・仕様検討の壁打ち相手**: アプリの機能、UIのアイデア、データ構造、キャッシュ戦略、通知ロジックの優先順位付けなど、設計の初期段階から細部の実装に至るまで、AIは良き相談相手となってくれました。「こういう場合はどう思う？」「もっと良い方法はない？」といった問いかけに対し、複数の選択肢や考慮点を提示してくれたことで、思考を深めることができました。
- **コード雛形生成とエラー解決の時短**: 新しいクラスや関数を作成する際の基本的なテンプレート、あるいは複雑なロジックの骨子となるコードをAIが生成してくれたことで、大幅な時間短縮に繋がりました。特に、ProGuardのルールやAndroidManifest.xmlの設定など、慣れていないと時間がかかる部分での支援は大きかったです。また、発生したエラーメッセージをそのまま入力すれば、原因の推測や具体的な修正案を提示してくれるため、デバッグ作業も効率化されました。
- **ドキュメント作成支援**: プライバシーポリシーの草案作成や、今回のブログ記事の構成案作成など、コーディング以外の部分でもAIはその能力を発揮してくれました。

## 現状のLLMでは足りないこと
以下もLLM生成です。
- **情報の正確性と最新性**: AIが提供する情報は、必ずしも常に正確で最新であるとは限りません。特に新しいライブラリや、頻繁に更新されるAPIの仕様については、AIの情報が古かったり、誤りを含んでいたりすることもありました。最終的には公式ドキュメントで裏付けを取る、あるいは実際に試して検証する作業が不可欠です。
- **文脈理解の限界と指示の具体性**: 複雑な要件や、暗黙的な前提条件をAIが完全に理解するのはまだ難しいようです。「よしなにやってくれる」という期待は禁物で、できるだけ具体的かつ明確な指示（プロンプト）を出す必要がありました。
- **「最適解」の提案とは限らない**: AIは複数の選択肢を提示してくれますが、それが必ずしもその状況における「最適解」であるとは限りません。提示された情報を元に、メリット・デメリットを比較検討し、最終的な技術選定や設計判断を下すのは、やはり開発者自身の役割です。WorkManagerのエラー解決のように、AIの提案だけでは解決せず、自分で調査して得た情報をAIに与えることで道が開けたケースもありました。
- **技術的負債を生む可能性**: AIが生成したコードや提案した設計が、必ずしも長期的な保守性や拡張性を考慮したものではない場合もあります。安易にAIの提案をそのまま採用し続けると、気づかぬうちに技術的負債を抱え込むリスクも感じました。

以下は人間の追記です。
- **設計の確からしさへの不安**: 上記で「保守性や拡張性を考慮したものではない場合もある」と記載していますが、保守性を考慮した実装にしてなどの指示である程度は従ってくれます。ただし、その実装が**本当に**保守性が考慮されているのかは**完全な初心者には分かりません**。(業務でプログラムをしているので関数レベルでは分かりますが、ViewModelなどのアーキテクチャレベルでは自信が持てませんでした。)
- **セキュリティ面への不安**: セキュリティ面も同様に一定はそれらしいことを指示してくれますが、本当に正しいかは不明です。  

ソフトウェアエンジニアの職がなくなるなどとも言われていますが  
細かな調整をプロンプトで実施するのは非常に大変で、依然としててコードを読める必要があるとは感じています。  
また、アーキテクトやセキュリティの専門家など出力されたコードの良し悪しを判断する能力を持った人も当然ながら必要です。

## 未経験分野の開発におけるAI活用のコツ (私見)
- 質問は具体的に、エラーメッセージは正確に。
- 時々プロジェクト全体を振り返る
- 小さなステップで進捗を共有し、対話を繰り返す。

## クローズドテストご協力のお願い
作成したアプリ「RenQ」は現在クローズドテスト中です。  
Googleの規約により、製品版としてリリースするために、「クローズド テストを 12 人以上のテスターで、14 日間以上実施する」といった条件があり、  
これを満たすのに苦労しています。  
クローズドテストにご協力いただける方は、  
X（旧Twitter）アカウント([@Mtaku_001](https://x.com/Mtaku_001))にDMいただけますでしょうか？  
追って、テスト参加に必要な情報をお送りいたします。  
クローズドテストにご協力いただける場合は、Geminiのチャット履歴の共有なども可能です。