[アプリ開発TIPs]新人エンジニアがFirebase使ってソーシャルアプリをつくった話

#はじめに

##書いた人
どもども、アプリエンジニアをしてるyokiと申します。24才です😆
2017卒で都内のit企業にエンジニアとして就職し、ちょうど一年が経ちました😏

もう２年目ですよ、、はやい、。

プログラミング歴は1年半ぐらいでまだまだエンジニアとして未熟者な小生です😋

##この記事の目的
🔼そんな僕ですが、プライベートでエンジニアのためのソーシャルアプリ（iOS）を開発しました！

iOS、Swiftが好きでエンジニアになった訳ですが、アプリエンジニアとして「これつくったよ！！」と言えるものが欲しいなとずっと思ってたので、作成してみました。　　
[作ったもの： Time To Hack](https://itunes.apple.com/jp/app/timetohack/id1360621908?mt=8)

<img width="1025" alt="スクリーンショット 2018-04-02 23.35.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/b6109b9a-c188-96a5-03b8-aea704b2eccd.png">


🔽アプリ概要   
<img width="700" alt="スクリーンショット 2018-04-15 21.22.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/c280c6a7-8fc5-7a9d-c028-8dabbdf4d9aa.png">



この記事では、その際に開発をどういう風に進めて行ったのかや、　どんなことを考えながら開発していったかのTIPsをまとめました😊

これからオリジナルアプリを作ろうと思っている人の参考になればと思います😁

ではでは、以下本題になります📝

#開発フロー
今回開発するにあたって以下のようなフローで開発していきました👀

1.　アイデアを考える
2.　機能書き出し
3.　FirebaseのDB設計
4.　（UI）アプリ画面書き出し
5.　（UI）画面遷移考える
6.　機能開発
7.　必要な画像用意
8.　デザイン当て込み
9.　申請準備

##アイデア出し
アプリ、サービスをつくる時のアイデアの作り方ですが、どうせ個人で作るならやっぱり作ってて楽しいものがいいですよね？✨
でも、じゃあ楽しく作れたらそれで良いやって訳でもなくてやっぱりみんなに使って欲しいわけですよ

そんなわけで自分は　

①「開発していて楽しいもの」
→ 好きな分野のもの、興味があるもの、はまっているものとかに関係がある、ものをつくる

かつ

②「需要があるもの」
→ ニーズがあることがわかっている、めんどくささを解決している、ものをつくる

という視点でアイデアを探していきました

<img width="300" alt="スクリーンショット 2018-04-01 22.31.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/da234c2f-332a-ec05-ea36-a7f8ac3909d6.png">


で、具体的なアイデアの出し方については「受動的な」アイデア発想と「能動的な」アイデア発想の２パターンで考えていきました

- 発想法  
 - ***「受動的」アイデア発想***   
いわゆるこういうのあったらいいなあ、めんどくさいなあと日常思っていること（課題）をアプリによって解決していこうとするパターンです⚡️  
日頃から「めんどくさい」、「だるい」、「またか」といったことを感じたらメモをとっておいて、この課題を解決するアプリ作れないかなーと考える感じですね  
例）  
課題：今日て何のゴミの日だっけ、確認するのめんどくせ、、  
解決：ゴミの日を設定しておくとプッシュ通知がくるアプリ  
<br>
 - ***「能動的」アイデア発想***  
アイデア出しの方法を利用してどんどんアイデアを出していくパターンです  
よく使っていたのは「組み合わせ法」です  
〇〇　×　〇〇  
に単語を当てはめて、「お、いいじゃんこれ」と思ったものをピックアップしていきます　


で今回作成したアプリに関しては後者の「能動的」アイデア発想法で生まれたアイデアを採用しました  

エンジニア　× Twitter（ソーシャルアプリ）  
という組み合わせが出てきて、

①エンジニア向けのソーシャルアプリ面白そう
→ 「エンジニア」という職業が好き、自分が作ったアプリでエンジニア界隈が盛り上がると嬉しい
→ 「開発していて楽しいもの」の条件を満たす


②プログラミングや開発に関するツイート 
→ twitterでProgateやAidemyなどを使ってプログラミング勉強してる関連のツイートや、技術関係のツイートはよく見る
→ twitterの「エンジニア」コミュニティの部分に焦点を当ててアプリ作ったら需要あるかも
→ あと、自分の開発データとか見れたら嬉しいかも
gitやQiitaでも、自分の活動を可視化できるけど、gitで草生やすのはスマホだけではむりだし、Qiitaは投稿しないといけない
そこそこハードル高いなと（課題）
→ twitterみたいに投稿して、その中に含まれる開発データが可視化されると良いよね（解決）


という風に、自分が作りたいもので上げていた2つのポイントに当てはまることと、エンジニアの課題を解決出来そうなイメージがついたので、

エンジニア × ソーシャル
＝『エンジニアのためのソーシャルアプリ』
というアイデアで進めていくことに決めました

##機能書き出し

アイデアが決まったので、
次は、実装が必要な機能を書き出していきます

で、まずソーシャルアプリなので、
・投稿機能
・タイムライン
・プロフィール
・投稿へのアクション機能
・フォロー機能

が必要


でもって、これだと 
エンジニア × ソーシャル
のソーシャル部分しか満たせてないので、エンジニア要素入れたいなと

そこで、上であげてたようにエンジニアのデータ可視化て以外とハードル高くなってるという課題を解決するために

・投稿データのグラフ化機能

を追加しました。  
エンジニア要素これだけでは少ないなと思ったので、デザイン面でもエンジニア要素を取り入れました（後述）


機能としては、あと「検索機能」とか「タグ機能」とか欲しかったんですが、とりあえずリリースしたかったので、最低限の機能のみを考えました。🔽

![done.jpg](https://qiita-image-store.s3.amazonaws.com/0/138735/b4b899ca-6d27-3505-0300-e3e4c6fca741.jpeg)

アプリに限らずですが、「なにか作って公開する」ということをするときは「カンペキなものを」目指してしまいがちです。ユーザーからのフィードバックを早く受けたいときは「とりあえず終わらせる」思考は大事です。




そんな訳で、機能書き出しについてまとめると、

・アイデアを要素分解してそれぞれの要素を満たせる機能、もしくはデザインがあるか（必ずしも個々の要素を機能に落とし込む必要はなくて、デザインに落とし込んでいってもいい）

・課題を解決する機能があるか

という点がポイントかと思います

##FirebaseのDB設計
今回のアプリのバックエンドには「Firebase」を使用しました🔥

機能が確定したので、Firebaseでどんなツリー構造をとるか考えていきました

今回のアプリでは、全体として「投稿」「ユーザー」「お気に入り（フォロー）」の３つのツリーがあります
具体的にはこんな感じになりました〜


・🔽投稿
<img width="400" alt="スクリーンショット 2018-04-02 23.45.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/ec964298-2b87-af1b-7a3b-7f968d2d27d9.png">

action:　他のユーザーからのアクション（いいね機能）
caption:　投稿内容
date:　投稿日時
develop:　作業項目
programmingLanguage:　使用言語
uid:　投稿者の固有ID

・🔽ユーザー
<img width="400" alt="スクリーンショット 2018-04-02 23.47.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/393d460c-a176-7c60-bd45-51c50a213ce9.png">

action:　どんなアクションをどの投稿にしているか
develop:　作業項目の累計
getActions:　獲得アクション数累計
git:　gitアカウントのユーザー名
name: 名前
posts:　自分の投稿の固有ID
profile:　プロフィール
programmingLanguage:　使用言語累計
provider:　何でログインしたか（今回はtwitterのみなのでなくてもよかったかも）
twitter:　ツイッターアカウント名

・🔽お気に入り
<img width="454" alt="スクリーンショット 2018-04-02 23.47.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/ee4d2470-d4b8-2e3b-5d10-c30236237109.png">

誰が、誰をお気に入り（フォロー）しているかをユーザーの固有IDとBool値で管理しています。


##（UI）アプリ画面書き出しと（UI）画面遷移考える

紙に書き出して実装のイメージをより具現化させます
ここはテーブルビューだなとか、ここはボタンじゃなくてイメージだなとか、、etc 

意外とフリーハンドでババーーーと書いてしまいがちですが、
スマホので型どったものの中に書いていくと良かったりします
というのも実際のサイズでデザインできるので、あとで「思ったより空白めっちゃあるやん、、」とか「これだと全部のアイテム入らないべ、、、」みたいなことが起きないです

ツール使うのもいいですね！
[Prott](https://prottapp.com/ja/)とか有名です💍
[アプリ](https://itunes.apple.com/jp/app/id917618029)もあります📱

色とかまでイメージできてると尚良いかとおもいます
→ 自分の場合はエンジニア感を出すデザイン要素がほしかったので、
[musicForProgramming](http://musicforprogramming.net/)というサイトのデザインを参考にして色とか、雰囲気を参考にしました。
<img width="500" alt="スクリーンショット 2018-04-07 1.37.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/6a709ed8-2cd0-02b8-a041-35c72b288bdb.png">
自分は非デザイナーな訳で、デザイン考えるにしても引き出しが限られてくるな、と思ったのでや 「Pinterest」で```UI```や```デザイン```を検索して🔼のような参考になるものを探してました。  
「Pinterest」はストック機能、関連検索が非常に優秀なのでUI探すときにおすすめです⭐️

##機能開発  

開発期間は3ヶ月ぐらいです（2017年の12月27日〜2018年4月1日）
仕事終わりと休日に1日平均2時間ぐらい書いてました

##必要な画像用意・デザイン当て込み
個人開発となると意外と面倒なのがアイコンなどの素材を用意することだったりします
自分もどうやって用意しようかと思い、自作とかしてみたりしたのですがイマイチ。。
で、商用で使えてフリーなものはないかと探して⬇️にたどり着きました

[商用可で無料！最強のフリーアイコン素材サイト14選](https://saruwakakun.com/design/tips/icon)

クオリティー高くて種類も多いガチパないサイトが見やすくまとめられています
自分は [ICOOON MONO](http://icooon-mono.com/) を使わせて頂きました

##申請準備
ロゴとか、スクショとかの用意です。自分で作っても良いのですがロゴやApp Storeでの見た目も含めてUXだと思うので、クオリティーは下げたくない。。
てことで、サービスを使って作成しました。🔽


・アプリのロゴ作成：
[ロゴメーカーショップ](https://itunes.apple.com/jp/app/%E3%83%AD%E3%82%B4%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%83%E3%83%97/id1190077343?mt=8)

<img width="164" alt="スクリーンショット 2018-04-02 23.33.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/f914bfa1-5f56-5399-dd33-4ac2f2d7cd3b.png">


・App Storeで使用するスクリーンショットの作成：
[APP SCREENSHOT BUILDER](https://theapplaunchpad.com/dashboard/ios/?platform=ios&template=above&device=iphone_white#)

<img width="1025" alt="スクリーンショット 2018-04-02 23.35.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/b6109b9a-c188-96a5-03b8-aea704b2eccd.png">

・プライバシーポリシー
今回はユーザーの投稿機能を含むアプリなので、プライバシーポリシーページの作成が必要でした。なので、[ペライチ](https://peraichi.com)を利用して作成しました

<img width="800" alt="スクリーンショット 2018-04-06 21.14.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/f7a18bcb-9516-996a-a1ec-901ee2cd97d2.png">


#開発環境・ツール
今回使用した開発環境・ツールについてまとめるとこんな感じです

・Swift 
・Xcode 
・Firebase 
・github
・アプリ内のアイコン作成：
 [ICOOON MONO](http://icooon-mono.com/) 

・アプリのロゴ作成：
[ロゴメーカーショップ](https://itunes.apple.com/jp/app/%E3%83%AD%E3%82%B4%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%83%E3%83%97/id1190077343?mt=8)

・App Storeで使用するスクリーンショットの作成：
[APP SCREENSHOT BUILDER](https://theapplaunchpad.com/dashboard/ios/?platform=ios&template=above&device=iphone_white#)

#反省点
Firebaseの良さをあまり生かせなかったなぁと。
もっとパフォーマンスの高い書き方、Firebaseの使い方できたなと今になって思います😷まあ、でもこれに気づけたのはよかったです。

あと、機能はまだまだ足りないところが多いですね。
今後少しずつ修正していければ良いかなと思ってます😆

#おわりに
正直作り終わってみると、あぁなんだこんなものか、て感じで世のイケてるアプリたちは凄いなと思いました🤔笑

もっと凄いもの作りたいし、もっとswiftとiOS勉強したいなと思ったよと😄

もっと精進します！！
ではでは！！


[作ったもの： Time To Hack](https://itunes.apple.com/jp/app/timetohack/id1360621908?mt=8)