ハッカソンから始まってiOSアプリ、Androidアプリをリリースするまでの軌跡

**@kenmaro**です。
普段は主に**秘密計算、準同型暗号などの記事について投稿しています**。
秘密計算に関連するまとめの記事に関しては以下をご覧ください。

> - [秘密計算エンジニアを始めて２年半が経った。](https://qiita.com/kenmaro/items/48059dd60f79e80f5ef8)
> - [秘密計算エンジニアを始めて3年が経った。](https://qiita.com/kenmaro/items/a1d90a074d552b7bf886)


## 忙しい人のために最初に宣伝
**この度我々が個人開発する「YorimichiApp」はAndroid版を正式リリースしました。**

アンドロイドユーザの方は、ぜひこちらからアプリをダウンロードしてみてください。

https://play.google.com/store/apps/details?id=com.agrimetal.yorimichi2

また、iOSユーザの方でまだダウンロードしていない人は、ぜひこちらからどうぞ。

https://apps.apple.com/jp/app/yorimichiapp/id1596625712


また、アプリ紹介のためのランディングページはこちらから。

http://yorimichiapp.com/



## 概要
これは
Yahooハッカソンから本開発し、iOSアプリをリリースするまでの軌跡と、エンジニア人生について考えたこと。

https://qiita.com/kenmaro/items/149417e96c82e6ebe541

の続編となります。

思えばこの記事は11月末（5カ月くらい前）のものでした。
そこからAndroid バージョンの「YorimichiApp」をリリースする今日まで、
５カ月間開発にかかった（かかってしまった）ということになりました。

自分の中でiOSアプリをリリースしつつ、いろいろなアップデートを重ねながら、
Android アプリも並行して開発する期間は楽しくもあり、自身のモチベーションを奮い立たせ続ける期間でもありました。

そして本日、2022年4月17日、Google Play Store にて公式v1.0.0 の「YorimichiApp」をリリースすることができました。
せっかくなのでこれまでの開発の軌跡とその中で考えたことなどをまとめて記しておきたいと思います。


## リリースから５カ月間何をしていたのか
iOSアプリのリリースから約５カ月の間、
- iOSアプリのアップデート
- Android アプリの開発
- ビジネスモデルの再考
- マーケティング、PRでの迷走

をやっていました。これらはこれからも続けていくつもりですが、一つ一つ詳細を書き残していきたいと思います。

### iOSアプリのアップデート
iOSバージョンをリリースしてから、約１０回のアップデートを今まで行ってきました。
発表した最初のリリースはv1.0.0であり、現在の最新のバージョンはv1.4.2 となっています。

アップデートは大きく分けて２つのカテゴリに分かれました。
1. ユーザ体験の向上
2. ビジネスモデルの導入と試行錯誤


#### ユーザ体験の向上
これは、分かりにくい部分の改善、削除、新しい機能の追加、レイアウトの編集
などです。また、バグ修正なども含まれます。

ユーザがなかなか増えず、フィードバックが集まりにくかったことは非常に厳しかったです。
結局現在アクティブにアプリを使用してくれている人は私の友人などに留まっています。
そんな中、ほとんどの改善はチーム内で使っていて浮かんできた改善した方が良いことを潰していくこと
に終始しました。

自分の中では
- Explore 機能を拡充して検索項目が初期より充実したこと（最新の投稿、人気の投稿、周辺の投稿を一覧で確認できること）
- 投稿から「地図上で見る」ボタンのクリックによって位置を確認できる機能の追加

が自発的にあった方がよいと思い導入した機能でした。

#### 改修が入ることを考慮し真面目にバックエンドを開発用途本番用で切り分けた
また、少しユーザ体験の向上という面ではずれますが、開発用のバックエンドと本番用のバックエンドはリリース時は同じものを使っていたのですが、
細かい修正を加えるときにどうしてもデータ構造をいじらなくてはならない箇所があり、
そのようなところは本番用のバックエンドデータを編集しながら開発するわけにもいかなかったため、その環境を分けるような実装も導入しました。

結論からいうと、iOSはXcode を用いて開発環境を非常に簡単に切り替えてビルドできたのですが、Android studio では手動でfirebase  へのアクセスconfig を切り替える以外の方法が（あるとは思いますが）簡単に見つからなかったため、開発環境（iOSとAndroid ）によって使用が違うなあと考えました。
このあたりのiOSとAndroid での開発の違いについて、まだまだではありますがわかった気もするので、そこも後にまとめようと思います(おそらく別記事）。

### ビジネスモデルの導入と試行錯誤
２に関しては、ビジネスモデルの項目に詳しくまとめようと思いますが、
ビジネスモデルの一軸として広告収入の軸を考え、Google のAdmob のバナー広告を導入するときに発生したアップデートなどです。

また、ユーザに対してアプリを開いてもらうようにプッシュ通知を導入したり、アプリ上でのメッセージを表示するような機構もFirebase を用いて実装したりしました。

プッシュ通知はiOSに組み込もうとすると結構手間がかかり、Apple Developer にていろいろな認証鍵などを生成する必要があるのですが、
手順が多いゆえに自分が何をやっているのかわからず、一週間開発をしていないとどこまでやったのか忘れて１からなんどもやり直しました。

#### プッシュ通知とか広告とかはアプリ開発経験での必要作業

実際運用していくにあたって、このようなプッシュ通知などはiOS, Android 固有の手順が存在し、どちらもカバーしないといけなかったのはなかなか骨が折れました。
コーディング上の苦しみというわけではなく、マニュアル上の手順に従ってひたすら作業する、そのような泥臭いことを多くやる必要があり、アプリ開発においてコーディングは開発のあくまで一部であり、ほとんどはこのようなiOS, Android の彼らのプラットフォーム上での設定などに費やす時間もかなり多いことを学びました。


## Android アプリの開発
アンドロイドアプリを開発するにあたって、iOSアプリのアップデートと並行して開発時間を確保するのには苦労しました。
たぶんアンドロイドに集中できていれば２カ月は早くリリースまで持って行けた気がします。（当初は２月末にはアンドロイド版が完成している予定でした。）
iOSのアップデートに大きく時間を使う中で、アンドロイドアプリは二週間さわれなかったり、iOSの方がアップデートするたびにアンドロイド側でも同じような機能を実装して足並みを揃えてリリースしたかったので、やることが減るのではなく増えていく時期が多くあり、その辺でモチベーションを保つのが難しかったです。
最終的にはiOSの方のアップデートをストップし、アンドロイド開発に完全にフォーカスし時間を確保しました。
また、iOSバージョンにあるいくつかの機能をアンドロイド版では撤廃し、最低機能だけを揃えてリリースするという判断をしました。
そうしなければ、おそらくあと１、２カ月リリースまで時間がかかり、そこまでモチベーションが保てていたか分かりません。



## ビジネスモデルの再考
これは私が個人開発初心者だったこともあるのですが、本来なら最初から開発をしながら考えておくべきところでした。
SNSのようなソーシャルサービスであることから、結局のところ広告をつけてそこをビジネスモデルの軸にするという判断しかありませんでした。
あとから段々と現実を知り始めるのですが、広告収入は浮き沈みが大きく、小さなサービスでは収益を１万円/月ぐらいのレベルに持っていくのは難しいです。
ソーシャルサービスなので、ユーザが数回使うようになり、何気なく開いてしまうアプリの一つとして確立されアクティブなユーザが確保できる可能性としてはSNSは魅力的かと思います。別例としてツール系やネタ系はDL数は多くなっても１、２回アプリをネタとして使ったあとは開かないことが多いと考えます。SNSはその意味でユーザが好んでくれれば長く日常的にアプリを開いてくれる可能性はあるというわけです。


## マーケティング、PRでの迷走
これは、正直に言えば私個人としては貢献できませんでした。
iOSアプリの公開とともにツイッターを本格的に使用し、フォロワーを１６００人程度まで増やしてたまに宣伝を打つ、
くらいがこの５カ月で私にできた唯一のことでした。
アプリを他の人に周知するというところで、圧倒的にフォロワーがいるインフルエンサーやyoutuber になぜお金が集まるのか、
というところであったり、なぜ広告にこれほどまでに企業がお金を使うのか、といったところを身をもって体感しました。
結局のところgoogle で広告を出すとして、それが無作為な人を対象にした広告であるとすれば、全て簡単な計算で使うべきお金の大きさがわかります。
たとえば、アプリの収益を５万円/月とし、１００人のDAU（デイリーアクティブユーザ）が少なくとも必要だとわかったとします。
全ユーザの１０％がアクティブだとすると、DL数は１０００必要です。
もし広告を見た人に対して、そのなかでダウンロードをしてくれる人が１％だったと仮定すると、
我々がリーチするべき人数は最低でも１０万人となるわけです。
一般人でTwitterをやっている人、インスタグラムをやっている人たちは１０００人単位でしかフォロワーを持っていないわけですから、普通に発信するだけでは１０万人にリーチすることは不可能です。
従って、ここでインフルエンサーの知り合いを探したり、単純に案件としてお金をはらって周知を目標人数達成するために投資することになります。
この辺のすごく単純なことをわかったということ、それに対して少しずつ行動できていること、その辺りもアプリをリリースして運用していく中で非常に勉強になったことでした。


以上が基本的にiOSアプリをリリースした１１月末から５カ月間取り組んできた全てのことになります。



## AndroidとiOSはどちらが開発しやすかったか
開発当初からNative 言語(SwiftとKotlin)での開発を選択し、アップデートなども含んで半年くらいかけて個人開発のアプリをiOS, Android どちらでもリリースしました。
その中でどちらが開発しやすかったか、という点について言及したいと思います。
（完全に個人の意見となります。）

### Swift を使った感想

Swift での開発の方が私個人としてはどちらかと言えば好きでした。
いくつかSwift のいいと思ったところを挙げると、

- If let, guard let などが使いやすい
- Delegate が便利
- MVVM＋MVC形式の構成とより相性が良い（気がした）
- Storyboardを使用しない開発をしたときにやはり工数がかかった

詳細は書きませんが、Delegate はAndroidでinterface 関数を定義するよりは簡単で使いやすい気がしました。
Storyboardは、私が開発をする上で参考にしたiOS Academy という教材を提供するサービスで、Storyboard を一切用いずにcode 上でレイアウトを全て定義する手法を採用したため、総合時間としてはレイアウトの構築に時間がかかったように思います。
Storyboard をガンガン使っていればよかったのか、はまだそのような実装を試していないので謎ですが、
アンドロイドではlayout.xmlを用いてレイアウトを組んだため、比較的簡単にレイアウトを組めました。

### Kotlin を使った感想

- Activity と共にxmlファイルが紐つくところが分かりやすい（気がする）
- Fragment の理解に時間を使った割に、最終的にFragmentを全撤廃してActivity を使用したため、あまり良さがわからなかった
- iOSの開発での感覚に近いようにコーディングすることは意外と可能だった

上述しましたが、iOS開発ではstoryboard を使わずにコードベースでレイアウトを管理し、
アンドロイド開発ではxmlのレイアウト機能で視覚的に、もしくはxmlのコード機能でLinearLayout などを駆使し比較的コードをあまり書かずにレイアウトを整備しました。

同じことがstoryboard でできるかは分かりませんが、近いことができることを考えると、レイアウトは視覚的にある程度作った方がいい気がしました。（スピードを重視するのであれば）

一方で、Fragmentの良さについてはあまり理解できませんでした。レイアウトをどう組むかによるとは思うのですが、Activity とRecycleView などでほとんどのレイアウトは賄うことができ、ページの遷移（Androidにある戻るボタンとか）について考えてみても、Activity を基本的に使った方がわかりやすく感じました。

iOSの開発と似た感覚でコーディングすることはできたという意味ですが、iOSを開発する上で多用していたcompletion を用いたコールバックや、Dispatch Group を用いた複数処理の待機など、Kotlin でも似たようなコーディングをすることが可能でした。
RecyclerViewやAdapterなどを使用するAndroid では、それらをiOSと紐つけて考えることは難しく、そのあたりは慣れが必要でしたが、似たような感覚でコーディングできる部分もあることがわかりました。

## Native言語で開発して感じたこと
まず、アプリの公開をするまでに６カ月くらいかかったという点、iOS, Android を並行して開発する時の工数
を考えたときに、Flutterなどを選択しなかったことは少し後悔はありました。

ただ、それはiOSのリリースを終えAndroid 開発に着手してKotlinになれるまでの２カ月くらいのきつい時期に一番感じていたことであり、慣れた後はKotlinでの開発の方が楽しいと感じることもあったため、Nativeでの開発も悪くないなと思うことができました。

次またアプリを作るとすれば、Flutterを選択することも考えますが、経験としては一度Nativeを使って開発を遂行できてよかったと思っています


## 個人開発をする上で学んだこと
これは非常に大きな収穫があったと思っています。

- モバイル開発のNative言語に（ある程度）精通できた
- マーケティング、PRなどの仕事の重要性を身をもって体感できた
- アプリ開発に必要な工数や工程について経験に基づいた知識が得られた
- ビジネスモデル構築の難しさや重要性を身をもって体感できた
- 自己満足程度の収益を得られた
- モバイルだけではく、ランディングページなどの構築も行い、ウェブの知識も得られた


### モバイル開発のNative言語に（ある程度）精通できた
結局のところ、何かつくってリリースしたかったからNative言語を選んだのですが、
その当初の目標を達成できるくらいの理解は得ることができました。
これからも「YorimichiApp」のメンテナンス、他のアイディアを実現する個人開発を続けることのできるベースは獲得したと思っています。


### マーケティング、PRなどの仕事の重要性を身をもって体感できた
マーケティング、PRなどの難しさや楽しさなどについて体感できました。
これはひとえに、自分のサービスであるから主体的に取り組んだために得た知識が大きかったと思っています。
社会に届ける価値を最大化するための掛け算に、マーケティング、PRがとても重要であり、これからも勉強と発信を続けていくモチベーションをもらえました。


### アプリ開発に必要な工数や工程について経験に基づいた知識が得られた
上述しましたが、アプリを開発し運用するときには、コーディングも必要ですがそれぞれのiOS、Androidのサービスを理解し、
それらを運用するAppleとGoogle のサービスを理解し設定するような工程も「多大に」含まれています。
今後他のサービスを作るときなど、作りたいサービスの全容をイメージし、それから大体どのような工程が発生し、それぞれどのくらい工数が必要なのか理解できた気がします。
これは誰かに実装をお願いするようなときの発注の見積もりであったり、誰かから仕事をもらってマネジメントする時の請求見積もりに多大に貢献してくれると思っています。発注するときに工数がわからずにありえなく（低い）高い額を提示してしまったり、開発のことがわからないマネジメントをしてしまうことは個人的にも絶対に避けたいので、この経験は本当に良い経験でした。


### ビジネスモデル構築の難しさや重要性を身をもって体感できた
ビジネスモデルを描きながら開発を行うことは一番楽しく、難しい作業なのだと考えさせられました。
また、収益が出ていたり全く出ていない時の周りの自分及び周りのメンバーのモチベーションがどのように左右されるか、
ということもリアルですが身をもって経験しました。
ニーズがあれば強気に価格を設定してニッチな領域での収益性にチャレンジすることが必要な気がしました。
その意味で今回のアプリはユーザに区切りなどはないですし、ソーシャルネットワークアプリのため、ビジネスモデルと紐つけることが難しかったです。


### 自己満足程度の収益を得られた
自分が投下した時間、購入せざるを得なかったものを考えると、全く黒字にはなっていないのですが、
広告収益として雀の涙程度の収益が入っている、ということは、少しであってもとても嬉しい体験でした。
現在は自己満足にも届かない収益ですが、先述したビジネスモデルへの再考も通じてもっと収益の面でも成果を出したいと考えています。


### モバイルだけではく、ランディングページなどの構築も行い、ウェブの知識も得られた
モバイルアプリの周知のために、結局はランディングページなども自分たちで整備しました。
このあたりは、実際このプロダクトのオーナーは自分たちであり、自分たちの手でやったことが全てであるから、主体的にLPなどを整備することが必要であり、その過程でウェブ開発も行ったという経緯があります。
ランディングページは当初はノーコードを使って作成し、後にNextjs を用いました、その過程で学んだ知識というのも大きな財産になりました。



## これからどう活動していきたいか

初めてのモバイルアプリをリリースしたその後ですが、どのような開発、活動をしていきたいか、
ということは大体方向性が決まっています。

### YorimichiAppのメンテナンス、マーケティング活動
まずは、もちろんですが、このアプリのメンテナンスと、ユーザを増やすためのマーケティングをさらに行っていきたいと思っています。

### 他のアイディアのプロダクト化
次に、このようなプロトタイプの構築の経験をさらに積んでいきたいと思っています。
具体的には、モバイル、もしくはウェブアプリの高速開発を後数回自分で手を動かしてやってみたいと思っています。
今の所２つほどアイディアはあるので、そこでの収益化などを狙って開発を行おうと思います。

### 個人開発者向けへのアウトプットの強化

また、このような高速なプロトタイプ開発というテーマは、私がスタートアップ企業での経験と、個人開発を通して学んだすべてのことなので、
これらを発信することのできるプラットフォームを構築したいと考えています。
Rapid-prototype.com というプラットフォームを考えており、まずは個人ブログとしてスタートしようと思っていますが、
将来的にはたくさんのディベロッパーの高速プロトタイプ開発のノウハウが集まればいいなと思っています。


## 最後に
長々と私の半年以上に及んだ個人開発の一つの区切りとして、いろいろと考えたことを書き下しました。
これからも自分が楽しいと思えることに対して全力で開発を行ってみたいと思っていますし、いろいろなアイディアに対して寛容に、また、いろいろな分野にアンテナを貼ってそれらを実現できるかどうか試行錯誤してみたいと思います。


キータやツイッターでは同じような人の記事や投稿を見かけることも多いので、
モチベーションをいつももらっています。
これからもよろしくお願いいたします。


今回はこの辺で。



@kenmaro