【Android】初心者がボードゲーム管理アプリをリリースした話

#概要
対象読者
・プログラミング未経験でこれからスマホアプリ開発を始めたい方

内容
・公開したアプリの説明
・アプリ開発未経験が個人アプリをリリースするまでに行ったこと
・開発で気をつけていたこと

プログラミング歴半年くらいの自分がスマホアプリをリリースしたので、そこから得たことをまとめました。
初投稿なので、拙い内容ですが読んでいただければ幸いです。

# リリースしたアプリ

###作ろうと思ったきっかけ
私はボードゲームが好きでよく遊ぶのですが、遊んだ記録の方法に困っていました。
いつもスマホのメモ帳を利用していたのですが、管理が手間で見返しにくく不便でした。
「所持しているボードゲームの管理や、プレイ履歴を簡単に作成できるアプリがあればいいのに」と
自分が欲しいという動機で、プログラミングの学習がてら自身で開発することにしました。

###作ったアプリ
「ボドメモ」というボードゲームを管理するアプリです。
自分の欲しい機能をもりもり詰め込みました。
主な機能としては以下の3つです。
・ToDo機能
・ボードゲーム検索（ゲームの評価、持っているゲーム、お気入り等で検索可能）
・遊んだプレイ履歴の作成、管理


GitHub↓
https://github.com/taratara10/bodomemo
![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704986/8f3935d6-3801-2e9a-f92d-b1374167f331.gif)

<img width="600" alt="mockup" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704986/f7cd6415-2f5c-46a6-d519-1c29b72e929b.png">
<img width="200" alt="mockup" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704986/f1bbeaec-2193-11ed-d089-af30d04ed0a7.png"> <img width="200" alt="mockup" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704986/231356ad-542d-810f-987a-7433b44bfb5c.png"> <img width="200" alt="mockup" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704986/a496b16d-46b7-7a1a-3c27-b6e0b838650e.png">

ダウンロード↓

https://play.google.com/store/apps/details?id=jp.co.bodomemo

# アプリを開発する前にやったこと
・書籍でアプリ開発を学ぶ（1ヶ月）
・簡単なオリジナルアプリの開発&リリース（1週間）　


プログラミングは、半年前にProgateを触ったり、Pythonでスクレイピングをかじった程度でした。
スマホアプリについてはまったく無知だったので、まずは1ヶ月かけて書籍を利用してアプリ開発の基礎を学びました。
サンプルアプリが豊富で、RecyclerViewやSharedPreferences、Fragment等の基本を理解できました。
[基本からしっかり身につくAndroidアプリ開発入門](https://www.amazon.co.jp/%E5%9F%BA%E6%9C%AC%E3%81%8B%E3%82%89%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FAndroid%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-Android-Studio-3-x%E5%AF%BE%E5%BF%9C-%E9%BB%92%E5%B8%AF%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B07D71LZGS)

書籍を学んだ後は、1週間で簡単なオリジナルアプリを作成して、公開しました。
電子レンジのワット数を変換する「レンジタイマー」というアプリです。
シンプルな機能ですが、やんわり実用性があったりなかったりして個人的には気に入ってます。

公開したアプリ↓
[レンジタイマー](https://play.google.com/store/apps/details?id=com.tarashuu.ovenTimer)
<img width="200" alt="mockup" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704986/3c2e2af3-b0f2-1979-51a2-ea9a4a9b8cec.png">


# 開発
期間は2.5ヶ月程度で、開発の流れとしては以下の順番で行いました。

1.モックアップの作成 
2.ライブラリの選定、アーキテクチャの理解
3.単一機能の実装
4.完成まで走り抜ける

### 1. モックアップの作成
主に2つの理由から最初にモックアップを作成しました。
・実装する画面と機能の明確化
・後からレイアウトを修正する手間を省く

Adobe XDを使用しましたが、直感的に操作できて使いやすかったです。
また、コンポーネントを実際に配置することで、画面遷移の方法など実装すべき機能が明確になりました。
完成品のイメージが具体的になってテンション上がります。
<img width="400" alt="mockup" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704986/2219e875-fbe9-1354-53ba-0bdf94ac77bd.png">


### 2.アーキテクチャの理解、ライブラリの選定
いざコードを書こうとしても、どういった構成にすれば良いか、DBはどう実装するのか等、全く見当がつきませんでした。
そこでアプリのアーキテクチャについて学びました。
Android Developerを参考にするとMVVMが推奨されているようなので、
MVVMのサンプルアプリのコードを参考にしながら、理解を深めました。

https://developer.android.com/jetpack/guide



MVVMについて学んでいる中で、様々なライブラリがあることを知ったため、
主要な機能については下記のライブラリを利用することにしました。
・Room
・ViewModel
・LiveData
・Navigation

RecyclerViewの並べ替え、スワイプは下記のライブラリで解決しました。めちゃくちゃ便利です。

https://github.com/ernestoyaquello/DragDropSwipeRecyclerview

ライブラリについては下記の記事が参考になります。

https://qiita.com/gericass/items/64e68189a21fea7caa7c#navigation




###3.単一機能の実装

まずは、簡単そうなToDo機能を実装しました。
初心者が0→1でコードを書くのは死ぬほど辛いので、GitHubでMVVMで作られたTodoアプリのコードを参考にして、
自分のアプリに沿うような実装をしました。
下記のコードが、MVVMで作られたTodoアプリで、シンプルにまとまっていて非常に理解しやすく大変参考になりました。

https://github.com/Naveentp/MVVM-To-Do-App/tree/master/app/src/main/res





###4.完成まで走り抜ける
<img width="300" alt="mockup" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704986/325b38ef-00da-d9ea-f266-383d3121dd25.jpeg">


基礎の骨格ができれば、あとはそれを参考に、よしなに実装していきました。
完成させる事を優先にして多少妥協しつつ、技術的に難しいことは避けました。
エラーにバキバキぶつかりながら、登山していけばそのうち辿り着きます。

ただ、個人開発では相談できる環境が少ないので「エラーにぶち当たった時に乗り越えられる力」が重要です。
再現性があって、汎用的なソフト面を伸ばす事を意識していたので、そのうちのいくつかを紹介します。


#####モチベーションの維持
1億回言われてることですが、一番は自分の作りたいものを作ることです。
強烈な動機があれば、後はノリでどうにかなります(根性論)

モチベーションの維持には「みんチャレ」というサービスを利用しました。
同じ目標を立てた5人のグループで、毎日成果を報告してモチベーションを高めあう最強の習慣化アプリです。
小さなコミュニティに入るので、積極的に反応がもらえて非常に良いです。
エラーで躓いた時にチームのメンバーに相談できたのが、非常にありがたかったです。
運動、ダイエット、睡眠、プログラミングなど色々なチームがあるので、全人類利用して欲しい。


https://minchalle.com/

#####英語で検索する
日本語の情報は思っているより少ないので、英語で検索する習慣をつけてから開発スピードが格段に上がりました。
「how to + 動詞 + 名詞」で検索すれば、大抵Stack Overflowとかの記事がヒットします。
コードを見て目的としている内容っぽかったら、あとはDeepLにぶち込んで解決です。
ChromeでWeblioのポップアップで翻訳してくれる拡張機能が便利。

https://qiita.com/zizynonno/items/9a0788539db2492b5189

#####公式ドキュメントを読む
初心者あるあるで、関数に適当な引数を入れてエラーが出ることが多々ありました。
最初の頃はそれっぽい変数を入れて「あーでもない、こーでもない」ってガチャを引いてい時間を無駄にしてました。
迷ったときは、公式ドキュメント(Android Developer)でパラメーター確認するようにしましょう。

#####こまめにcommitする
gitでバージョン管理をする際に、commitの頻度は出来るだけ細かくした方が良いです。
最初は1日の最後にまとめてcommitするみたいなクソデカ粒度だったので、gitの良さを全く活かせていませんでした。
頻度については下記の記事が参考になりました。

https://qiita.com/kozyty@github/items/87fa95a236b6142f7c10

######粒度を細かくする
機能を実装するときは次の流れを意識しています。
①実装したい機能の具体化（細分化）
②それを実現するために利用できるコンポーネント、メソッドを調べる
③サンプルコード等を見ながら実装（必要に応じて公式リファレンスを参照）

例えば、
①ボタンをクリックしたら、RecyclerViewのアイテムをプレイ回数が多い順に並べ替える。
②リストを並べ替えるには`MutableList#sortBy`を使えばできそう。
③記事のコードを見ながら、実装する

非常に単純な事ですが、自分が何に迷っているのか分からない状態で、闇雲にあがく時間を減らせます。
②でどの関数を使えばよいか方針が立たないときは、①の実装したい機能がクソデカ粒度の可能性があるので、
より細かく問題を分割できないか考えて見ることが大事です。

#####エラーを乗り越える
ざっくり2ステップです。
①原因コードの特定
　　・エラーメッセージを読む
　　・怪しい所を、Logでメッセージ出して確認する
　　・過去のコミットに遡って、コードの差分から原因箇所を特定する
②仮説、検証のサイクルを繰り返して、修正する

次の記事が大変参考になりましたので、そちらを読むことをおすすめします。

https://qiita.com/cannorin/items/eb062aae88bfe2ad6fe5

https://qiita.com/y_tom/items/1b54d4e1a9a5f3fab402#%E7%9F%A5%E8%AD%98%E3%81%8C%E8%B6%B3%E3%82%8A%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8C%E3%83%8F%E3%83%9E%E3%81%A3%E3%81%9F%E3%82%B1%E3%83%BC%E3%82%B9

#最後に

初めてアプリを作って公開して最初は分からない事だらけでしたが、
自分の作りたいものを作る体験はめちゃくちゃ楽しかったです。
これからも個人開発は続けていきたいと思いますので、応援よろしくおねがいします！
[Twitter](https://twitter.com/chronotrg)もよろしくお願いします！