1年前までプログラミング初心者だった人間が爆速でアプリリリースしたのでノウハウをまとめてみた

## 目次
-_対象者_
-_簡単な自己紹介_
-_アプリ紹介_
-_開発テーマ_
-_アイデア出し_
-_市場調査_
-_アプリ開発で意識した事_
-_開発過程_
-_デザイン_
-_工数期間_
-_技術的に意識した事_
-_開発環境_
-_ライブラリ_
-_ライブラリ管理ツール_
-_CI/CDツール_
-_ソースコード管理_
-_タスク管理_
-_アーキテクチャ_
-_運用_
-_参考書籍_
-_個人開発参考リンク_
-_最後に_
-_(余談)今まで作成したアプリ紹介_

## 対象者
- アプリ開発に興味がある方
- エンジニアを目指したい方
- 駆け出しエンジニアの方

## 簡単な自己紹介
今年1月から未経験としてエンジニア採用して頂き、開発会社で働いています。
プログラミング自体は2018年1月から本格的に開始し、それまではずっと営業をしてました。
当時のパソコンスキルは**完全素人**です。Youtube視聴とWord以外本当に使った事が無く、ファイルの意味も分かりませんでした。
そんな自分がアプリ開発を一人で完遂できたので、開発過程のノウハウなど共有出来たらと思っています。

## アプリ紹介
#### [『ReeMap』](https://apps.apple.com/us/app/reemap/id1478243688?l=ja&ls=1 "『ReeMap』")

目的地と、その場所に行った時に思い出したいメモを一緒に登録
時間でリマインドが来るのではなく、目的地に到着するとリマインドしてくれるアプリです！
![happy birthday.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309711/a5a7345e-5cfd-77a1-e23c-abbfd9cb816b.png)

<img width="752" alt="Screen Shot 2019-10-16 at 19.58.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309711/d9c56c89-f679-22a1-6662-4949249bd46f.png">
<img width="496" alt="Screen Shot 2019-10-16 at 19.58.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309711/458df71f-4d36-e384-32de-f56afdf2d08d.png">

##### _使い道例_

_目的地のスーパーを選択_
⬇︎
_買い物内容を登録_
⬇︎
_スーパーに到着_
⬇︎
_買い物内容リマインド！_

## 開発テーマ
- 実戦に近い形で行う
　ポートフォリオにもしたいという目的があったので、_ブランチ・CI/CD・PR・Issue_など活用し、実践を意識したい

- モダンなツールやアーキテクチャを学習する
　技術的な勉強も兼ねており、iOS界隈で流行っているMVVMやCleanArchitectureなど積極的に取り入れたい

- サービスをローンチ・グロースさせる
　***コードを書けるだけのエンジニア***にはなりたくないので、グロースを意識して改善保守を行いたい

## アイデア出し
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">作りたい物が決まらない人へ<br><br>まずそのプラットフォームで何が出来るのか知ることがオススメ<br><br>例えばiOSアプリ開発だと<br><br>・AR<br>・画像認識<br>・マップ<br>・センサー感知<br><br>などある<br><br>後は自分が興味ある機能を使って何を作るか？を考えるだけだが、&quot;使う機能&quot;が決まっているからアイデアが簡単に湧いてくる😎</p>&mdash; YUKI_個人アプリ開発⛅未経験からエンジニア (@yuking_0319) <a href="https://twitter.com/yuking_0319/status/1182165629412896768?ref_src=twsrc%5Etfw">October 10, 2019</a></blockquote>

## 市場調査
とにかく何かしらリリースがしたかったので、同じアプリがないかサクッと調べただけです。

## アプリ開発で意識した事
- ネイティブ開発なのでOSのリソースを活用する [Apple Dev](https://developer.apple.com/documentation/ "Apple Dev")

- 開発スピード重視(deploy or die)

- 必要なツールは先に調査しインポート

- アプリは小さく 
※前回失敗した経験を活かす[【アプリ開発】はじめての個人開発に意気込み過ぎたら色々しくじった](https://qiita.com/yukiomura0319/items/0c19a18a397addf212a2 "前回失敗した経験を活かす")

## 開発過程
- 実装したい事の書き出し
メモ帳などに簡単に実現したいことを箇条書き

- 実現出来るか簡単に調査
箇条書きした内容を実装に落とし込むために出来るだけ粒度を細かく分けて、実現可能性を簡単に調査

- 画面構成作成
必要な画面構成をメモ帳に簡単にまとめ

- データベース設計(Firestore使用)
画面構成まで終わればデータの書き込みや読み込み部分の設計を簡単に実装
[Cloud Firestoreを実践投入するにあたって考えたこと](https://qiita.com/1amageek/items/d606dcee9fbcf21eeec6 "Cloud Firestoreを実践投入するにあたって考えたこと")
_Firestoreを使う際、@1amageek さんの記事は必ず参考になります_

- 実装
2日程で上記の工程を終わらし、早々に実装に取り掛かりました

```text:実装したい事の書き出し例
・マップ画面
　初回起動時に(スプラッシュ画面)、端末のUUIDをkeychainに登録できるか → 可能
　横スライド → ライブラリで対応
　半モーダル → ライブラリで対応

・リマインド登録画面
　選択した座標を登録画面に持ってきて逆GeoCodingしてTableViewのHeaderに反映させれるか → 可能だが、文字サイズによりHeaderが可変するのでViewの調整にリソースが大きく割かれる可能性あり

・リマインド一覧画面
　一覧を削除(ユーザー任意)できるか → 可能

・アプリ全体
　Backgroundに入った時に一覧の情報を保持できるか → 可能
　Backgroundで位置情報を取得できるか → 可能
　Backgroundで取得し続けるデータをリモートに反映させ続ける → Apple規約的にグレー
　Backgroundで取得した位置情報とStructで格納している位置情報を比較できるか → 可能

etc...

```

## デザイン
##### 手書きデザイン (汚くてすみません)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309711/38d8e4cd-0c3c-266e-019c-ef19c5113977.jpeg" width="50%" />

##### アイコン
- [Flaticon](https://www.flaticon.com/ "Flaticon")

必要なアイコンは[Flaticon](https://www.flaticon.com/ "Flaticon")で全部調達できました！優秀！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">個人アプリ開発で重宝しているフラットアイコンサイト<a href="https://t.co/qQTgOKYQTa">https://t.co/qQTgOKYQTa</a><br><br>✅アイコン数が多い<br><br>✅ツイッターやFacebookアイコンなども利用できる<br><br>✅色や大きさの調節もできる<br><br>✅無料<a href="https://twitter.com/hashtag/%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA?src=hash&amp;ref_src=twsrc%5Etfw">#アプリ開発</a> <a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AD%A6%E7%BF%92?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング学習</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; YUKI_個人アプリ開発🌕未経験からエンジニア (@yuking_0319) <a href="https://twitter.com/yuking_0319/status/1182119518019047427?ref_src=twsrc%5Etfw">October 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##### アイコンサイズ生成
- [MakeAppIcon](https://makeappicon.com/ "MakeAppIcon")

##### アニメーション
- [Lottie](https://lottiefiles.com/ "Lottie")

##### App Store用Screenshot作成
- [APPLAUNCHPAD](https://theapplaunchpad.com/ "APPLAUNCHPAD")

## 工数期間
6週間 + アプリ申請(1週間)

作業時間としては、始業前・始業後 + 土日をフル活用しました。

## 技術的に意識した事
- 保守しやすいように[SOLID原則](https://postd.cc/solid-principles-every-developer-should-know/ "SOLID原則")は常に意識

- リソース(時間)の意識

- １つの実装やコードの書き方にこだわりすぎない

## 開発環境
IDE: Xcode 11.1
Lang: Swift5
OS: MacOS(Mojave)

## ライブラリ
- [MBProgressHUD](https://github.com/jdg/MBProgressHUD "MBProgressHUD") インジケータを簡単に実装
- [SwiftLint](https://github.com/realm/SwiftLint "SwiftLint") Swiftの静的解析ツール
- [RxSwift/RxCocoa](https://github.com/ReactiveX/RxSwift "RxSwift/RxCocoa") リアクティブプログラミング
- [RSwift](https://github.com/mac-cain13/R.swift "RSwift") Typesafeにリソースへのアクセス&多言語対応
- [Kingfisher](https://github.com/onevcat/Kingfisher "Kingfisher") 画像キャッシュ
- [Firebase/Authentication](https://firebase.google.com/docs/auth/?hl=ja "Firebase/Authentication") 認証機能提供
- [Firebase/Analytics](https://firebase.google.com/docs/analytics/?hl=ja "Firebase/Analytics") アクセス解析
- [Firebase/Crashlytics](https://firebase.google.com/docs/crashlytics?hl=ja "Firebase/Crashlytics") クラッシュ解析
- [Firebase/Firestore](https://firebase.google.com/docs/firestore/quickstart?hl=ja "Firebase/Firestore") NoSQLデータベース
- [ReachabilitySwift](https://github.com/ashleymills/Reachability.swift "ReachabilitySwift")  通信状況別のハンドリング可能
- [Lottie](https://lottiefiles.com/ "Lottie") アニメーションを簡単に実装
- [FloatingPanel](https://github.com/SCENEE/FloatingPanel "FloatingPanel") 半モーダルを簡単に実装

## ライブラリ管理ツール
- [Carthage](https://github.com/Carthage/Carthage "Carthage")
　

Firebase系のSDKはビルドが相当重いのでCocoapodは使用せず、Carthageのみの運用にしました。

※CarthageでFirebaseを導入する際は直接[Github](https://github.com/firebase/firebase-ios-sdk/blob/master/Carthage.md "Github")から指定して落とす必要あり

参考記事[【Firebase環境構築メモ】](https://qiita.com/kyo_nanba/items/4b617a9370228606dccc "【Firebase環境構築メモ】")

## CI/CDツール
- Fastlane
- Bitrise

## ソースコード管理
- Github

GithubのPrivateリポジトリが2019年1月から無料！！
[GitHubが無料でプライベートリポジトリを無制限に作れるようになったぞ☆](https://qiita.com/wagase/items/4ed3e9998848cfa733be "GitHubが無料でプライベートリポジトリを無制限に作れるようになったぞ☆")

## タスク管理
- Github Issue

Githubリポジトリ内で一元管理できるから重宝してます(初心者は使い慣れるのに少し時間が掛かるかも)。
[未経験がWeb系転職成功したいならgithubでissue管理して開発しよう](https://qiita.com/fukubaka0825/items/c7710b4e87d478c8ba3b "未経験がWeb系転職成功したいならgithubでissue管理して開発しよう")

## アーキテクチャ
- MVVM + CleanArchitecture

MVVM自体の導入は保守向上の観点で良かったが、アプリ規模的にModel層をCleanArchitectureで構成する必要はなかったと反省(工数がかさんでしまった.....)。

## 運用
- [GoogleForm](https://www.google.com/intl/ja_jp/forms/about/ "GoogleForm") お問い合わせフォーム
- [Firebase/Analytics](https://firebase.google.com/docs/analytics/?hl=ja "Firebase/Analytics") アクセス解析
- [Firebase/Crashlytics](https://firebase.google.com/docs/crashlytics?hl=ja "Firebase/Crashlytics") クラッシュ解析
- [Github Readme](https://github.com/ "Github Readme") 利用規約/プライバシポリシー

## 参考書籍
- [Swift実践入門](https://www.amazon.co.jp/%EF%BC%BB%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88%EF%BC%BDSwift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-WEB-PRESS-plus-ebook/dp/B07JWCXW4R/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80&qid=1571150394&s=digital-text&sr=1-1 "Swift実践入門")
- [詳解 Swift 第4版](https://www.amazon.co.jp/dp/B078ML9XZM/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1 "詳解 Swift 第4版")
- [Swiftデザインパターン](https://www.amazon.co.jp/Swift%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Programmers-SELECTION-%E3%82%A2%E3%83%80%E3%83%A0%E3%83%BB%E3%83%95%E3%83%AA%E3%83%BC%E3%83%9E%E3%83%B3/dp/4798142492/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Swift%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3&qid=1571150204&sr=8-1 "Swiftデザインパターン")
- [本気ではじめるiPhoneアプリ作り（ヤフー黒帯シリーズ）](https://www.amazon.co.jp/%E6%9C%AC%E6%B0%97%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BiPhone%E3%82%A2%E3%83%97%E3%83%AA%E4%BD%9C%E3%82%8A-Xcode-Swift-3-x%E5%AF%BE%E5%BF%9C-%E3%83%A4%E3%83%95%E3%83%BC%E9%BB%92%E5%B8%AF%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4797389826/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E6%9C%AC%E6%B0%97%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BiPhone%E3%82%A2%E3%83%97%E3%83%AA%E4%BD%9C%E3%82%8A%EF%BC%88%E3%83%A4%E3%83%95%E3%83%BC%E9%BB%92%E5%B8%AF%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%89&qid=1571150279&sr=8-1 "本気ではじめるiPhoneアプリ作り（ヤフー黒帯シリーズ）")
- [絶対に挫折しない iPhoneアプリ開発「超」入門](https://www.amazon.co.jp/%E7%B5%B6%E5%AF%BE%E3%81%AB%E6%8C%AB%E6%8A%98%E3%81%97%E3%81%AA%E3%81%84-iPhone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%80%8C%E8%B6%85%E3%80%8D%E5%85%A5%E9%96%80-%E7%AC%AC7%E7%89%88-%E3%80%90Xcode-%E5%AE%8C%E5%85%A8%E5%AF%BE%E5%BF%9C-ebook/dp/B07KQTQ5VJ/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA&qid=1571150429&s=digital-text&sr=1-1 "絶対に挫折しない iPhoneアプリ開発「超」入門")
- [よくわかるAuto Layout](https://www.amazon.co.jp/%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8BAuto-Layout-iOS%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B7%E3%83%96%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%92%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC-%E5%B7%9D%E9%82%89-%E9%9B%84%E4%BB%8B/dp/4865940324/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8BAuto+Layout&qid=1571150251&sr=8-1 "よくわかるAuto Layout")
- [Rx研究読本](https://booth.pm/ja/items/1076262 "Rx研究読本")

## 個人開発参考リンク
- [個人開発のすゝめ](https://qiita.com/masaibar/items/fdc1a7ee46de0edcd612 "個人開発のすゝめ")
- [個人でiOSアプリをリリースしました](https://qiita.com/prunzfrfx/items/75e38926a2673dec64c7 "個人でiOSアプリをリリースしました")
- [iOSアプリ個人開発で使ってるツールとかノウハウを公開してみる](https://qiita.com/shtnkgm/items/8d8d633be9e3ab1a504a "iOSアプリ個人開発で使ってるツールとかノウハウを公開してみる")
- [[Swift] iOSアプリ開発 学習の進め方とソース](https://qiita.com/y-some/items/200db9ac37150effc8ed "[Swift] iOSアプリ開発 学習の進め方とソース")
- [個人アプリ開発を支える技術と開発フロー](https://qiita.com/tattn/items/f1ad65d9d29c9d8b154d "個人アプリ開発を支える技術と開発フロー")
- [〜拝啓〜 アプリ開発を始める半年前の自分へ。アプリ公開初日に300ユーザーを獲得できるぞ!!!](https://qiita.com/yamatatsu10969/items/96a1462997b4478f9aea "〜拝啓〜 アプリ開発を始める半年前の自分へ。アプリ公開初日に300ユーザーを獲得できるぞ!!!")

## 最後に
最初にも言いましたが、プログラミング始めた当初は本当にファイルの意味も分からないレベルでした。
そんな自分が1年とちょっとでアプリリリース出来るまでに成長したのには正直ビックリです。
今後はReeMapのグロースを地道にやりながら、iOSの色んなSDKを試してアプリ開発を継続していきたいです。

***プログラミング学習継続の仕方や自分の成長過程などをツイッターでつぶやいたりしてますので、よければこちらもフォローして頂けると幸いです(いつでも質問受け付けてます)。***

Twitter: [YUKI_個人アプリ開発@未経験からエンジニア](https://twitter.com/yuking_0319 "YUKI_個人アプリ開発@未経験からエンジニア")

## (余談)今まで作成したアプリ紹介

##### これらはGithubでPublicで公開しているので、開発の参考にして頂ければ幸いです。
##### 分からない実装など有ればツイッター等でいつでも質問して頂ければお答えします😄
Github: [omurayuki](https://github.com/omurayuki/ "omurayuki")

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">せっかくなのでこちらも紹介させてください。<br><br>以前作ったApp Store クローンです。<br><br>これは海外のエンジニアの方の力をお借りして作りました！<br><br>ソースもあげてるので是非参考にしてみてください😄 <a href="https://t.co/4IwSpZPwHn">pic.twitter.com/4IwSpZPwHn</a></p>&mdash; YUKI_個人アプリ開発🌕未経験からエンジニア (@yuking_0319) <a href="https://twitter.com/yuking_0319/status/1166877756157640704?ref_src=twsrc%5Etfw">August 29, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>