iOSアプリ開発に必要なスキルをググりまくった

どうも、ねこきち[(@nekokichi1_yos2)](https://mobile.twitter.com/nekokichi1_yos2)です。

未経験からiOSエンジニアとしての実力を身に付けるために、とりあえずアプリをリリースすればいいと最近まで思っていました。

ですが、とあるツイートがきっかけで、ポートフォリオを充実させるのではなく、スキルセットを揃えることも重要だと知りました。
↓
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">フリーランスの面談ではポートフォリオより、スキルシートの方が重要。<br><br>昔面談前、エージェントにGitHubのURLを教えて欲しいと言われて、1年間なにもPushしてないアカウント送った。<br><br>面談でそのことには一切触れられず、普通に合格した。<br><br>絶対ポートフォリオみてない。笑</p>&mdash; COM@FREELANCE (@com_y_0) <a href="https://twitter.com/com_y_0/status/1299693473323511811?ref_src=twsrc%5Etfw">August 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


確かにエンジニアの転職ではポートフォリオが重要と言われてますが、
**(どんなに良い制作物を揃えても、転職先が求める人材、つまり求められるスキルを持ってないと転職は簡単じゃないのでは？)**
とも言えます。

そもそも、ポートフォリオとはいえ、
・いくつ作ればいい？
・どのような内容が良いのか？
・どんなスキルが望ましいのか？
など、必要なことを挙げればキリがありません。

ポートフォリオだけに依存するのではなく、スキルセットにも目を向けるべきだなぁと。

ゴールを一から決めておけば、進む道が見えてくるので。

ということで、**iOSアプリ開発、もしくはiOSエンジニアで求められるスキルを片っ端から調べて、自分なりにまとめてみました。**

## 言語
### Swift
- 2014年に誕生
- Appleが開発
- モダンでパワフルなオープンソース言語
- iOSのネイティブアプリを開発できる
- Apple製品(Mac,AppleTV,AppleWatch,iPod)のアプリを開発できる
- Objective-Cよりも、学習コストが低く、パフォーマンスでも優れている
- 直感的で、書きやすくて、書くコードの量が少なく、初学者におすすめ


## フレームワーク、API
### SwiftUI
- WWDC2020で登場
- SwiftよりもUIの開発を抽象化したフレームワーク
- ビルド要らずで、リアルタイムにコードのプレビューが見られる
- コードの依存関係を自動で監視し、UIや値の更新が楽になる
- iOS12以下は非対応
- 複雑なUIや機能の実装には不向き

### Alamofire
- API通信用のライブラリ
- 同じ系統のライブラリでは有名
- データ通信の処理を簡単に書ける
- Swiftに搭載されたURLSessionと比較されがち

### RxSwift
- FRP（関数型リアクティブプログラミング）のフレームワーク
- オープンソース
- RP:非同期処理、値が変化する度の処理をシンプルに書けるプログラミング
- （Rx系のフレームワークは）エンジニアの必須技術
- GCDやDispatchなど、非同期処理を簡潔に書ける
- 学習コストが高く、チームに導入するのが面倒

### Combine
- FRPのフレームワーク
- WWDC2019で登場
- Appleの公式フレームワーク
- RxSwiftと比較されがち
- iOS13以降でないと使用できない

### Vapor
- Swiftでサーバーサイド開発ができるフレームワーク
- GoやRailsよりも処理速度が高い
- さくっとサーバーサイドを利用するなら、FirebaseやRealm
- 独自のサーバーサイドを構築するのに向いてる

### XCTest
- XcodeのTDD(ユニットテスト)フレームワーク
- UIや機能が想定どおりに動作するかテスト
- 似たフレームワークでQuickがある
- UIをテストできるXCUITestもある
- リファクタリングと併用すれば、コードの安全性が保証される
- テストコードの記述、改修の手間が増える

## アーキテクチャ

### MVC（Model View Controller）
-  Model：データ全般の処理
-  View：UIやデータの出力を担当
-  Controller：ユーザーからの入力を処理、ViewとModelを制御
-  学習コストが低く、少人数規模向け
-  機能別に分割されているので開発がスムーズ
-  各機能の依存度が高く、テスト、再利用が難しい

### CocoaMVC
- Appleが推奨するMVC
- 従来のMVCと違い、ViewとModelが完全に独立
- ControllerがViewとModelを仲介
- Controllerのコードが肥大化し、テストが難しくなる

### MVP(Model View Presenter)
- Model:データ処理全般
- View:Modelの監視、Delegateを送る
- Presenter:View,Modelの制御
- データとUIの更新が連動してるので、フローを追いやすい
- MVCよりも学習コストが高く、書くコードが多い

### MVVM(Model View ViewModel)
- Model:データ処理全般
- View:UIを表示、ユーザーの入力を受け取る
- ViewModel:Viewと自身を制御
- ViewとViewModelの関係が密で、効率よく更新と表示を処理
- 大規模向けで、学習コストが高く、個人開発向けでない
- RP（RxSwift,ReactiveSwift）のフレームワークを理解する必要があり

## データベース
### CoreData
- AppleのmBaaS
- 保守性や安定性に優れている
- XcodeとSwiftと相性が良い
- 学習コストが高い

### Realm
- オープンソースのmBaaS
- Swift,Kotlin,Java,C#、などに対応
- CoreDataよりも処理速度が早い
- UserDefaultと同じくらい書きやすい
- マルチプラットフォーム開発でも使用可
- オープンソースなので、メンテナンスや改善の手間がかかる

### CloudKit
- AppleのmBaaS
- iCloudにデータを保存
- CoreDataと連携可能（ただしiOS13以降）
- 他ユーザーの情報を行き来させるアプリの開発に不向き（チャットアプリなど）
- iOS,Mac間でデータ共有したい人向け

### Firebase
- GoogleのmBaaS
- C++,Java,Unityなどにも対応
- リアルタイムのデータ共有
- 多機能で拡張性が高い
- 大規模な開発では、柔軟性が不十分
- 学習コストが高い

## ツール、エディタ
### Xcode
- Appleが提供するSwift用の統合開発環境(IDE)
- Playgroundにより、リアルタイムでコードを実行できる
- StoryBoardにより、ドラッグ＆ドロップでインターフェースを構築できる
- AppStoreにiOSアプリをリリースするのに必要不可欠
- コードをその場で手軽にテストできる
- Gitと連携して効率的なソース管理が可能

### ターミナル
- CUI(文字で操作する)ツール
- 主な用途は、ファイル操作、Git
- カーネル（パソコンの重要部分）を安全な形でいじれる
- マウスで行っていた操作をコマンドですぐ実行できる
- プログラミングも可能だが、IDEの専用エディタが大半

### Git/GitHub
- Git:ソースコードの変更履歴を分散管理するツール
- GitHub:GitをSNSのように、誰もが閲覧、利用できるサービス
- ソースコード管理ツールはエンジニアの必須技術
- GitHubはGitの派生サービスで、似たサービスは複数ある（GitLab,BitBucket）
- ユーザー数は業界で世界1位
- MSに買収されて、GitLabの台頭を許した
- 全機能を利用するのに料金がかかる
- プライベートリポジトリが有料

### GitLab
- GitHubのライバル
- GitLab.com（Webサービス）、CEとEE（オープンソース）の3種類
- 自社サーバー、クラウド（AWS,GCP）での運用が可能
- プライベートリポジトリが無償
- チーム開発での利用が何人でも無償
- Gitリポジトリのimport/exportが可能
- 自社サーバーにセルフホストできて、セキュリティ性が高い
- DevOps機能が圧倒的に充実している
- GitLabの関連ツールを含めた、アップグレードが面倒

### CocoaPods
- パッケージ管理ツール
- 使いやすく、多様な操作が可能
- 対応してるライブラリの数が多い
- ライブラリの導入、ビルドに時間がかかる
- Xcodeの使用に依存するので、エラーが起こりやすい
- さくっとライブラリを使いたい人向け

### Carthage
- パッケージ管理ツール
- CocoaPodsよりも軽量でビルドが高速
- 依存度が少なく、エラーが起こりにくい
- 手動で設定する必要があり、導入に手間取る
- CocoaPodsよりもライブラリの対応数は少ない
- 安定して柔軟に開発したい人向け

### SwiftPackageManager
- Appleの公式パッケージ管理ツール
- CocoaPod,Carthageより新しい
- 他管理ツールに比べ、独立性が高い
- 最新のツールなので、対応ライブラリ数が少ない
- CUIやバックエンドのアプリが得意

## CI/CDツール
### Bitrise
- クラウド型
- CircleCIと比較される
- 公式サイトは英語
- モバイルアプリ開発向け
- 料金プラン：個人40ドル、チーム100ドル、300ドル
- GUIで操作するので分かりやすい
- iOSに特化しており、Xcodeと相性が良い
- GitHub,GitLab,BitBucketをサポート

### CircleCI
- クラウド型
- Bitriseと比較される
- Bitriseと違い、メモリに上限がある
- 料金プラン：無料、30ドル、カスタム
- SaaSで運用コストが低い
- YAML（用途は設定やデータ処理）で記述
- ssh接続によるデバッグ、テスト
- GitHub,BitBucketをサポート

### fastlane
- CUI
- モバイルアプリ用の自動化ツール
- ビルド、テスト、デプロイなどを自動化
- リリース作業(証明書、ipa、の設定や作成)も自動化
- アクションと呼ばれる機能を組み合わせて使用
- iTunesConnectで載せるアプリの情報を遠隔で管理できる

### SwiftLint
- Realmの静的解析ツール
- Lint：コードをチェックするプログラム
- Swiftのコーディングスタイルに強制する
- バグに繋がる良くないコードを見つけてくれる
- 警告やエラーで知らせてくれる

### Danger
- 自動コードレビューツール
- CIツールとの連携が可能
- プラグインが充実している
- PullRequestにコメントでレビュー結果を表示
- PullRequestでのレビューに特化
- Swiftに特化したDanger-Swiftがある

### reviewdog
- 自動コードレビューツール
- 機能はDangerとほぼ同じ
- CircleCiなどのCIツールに対応
- linter（SwiftLintなど）とも連携が可能
- 1行単位でのレビューなど、Dangerよりも優れる

## サービス
### Sketch
- UIデザインツール
- 世界でシェア1位
- 年額$99、無料プランは30日間
- 他デザインツールとの互換性あり（AdobeXD,Figma,Studio）
- 歴史が長く、完成度が高い
- プラグインの数が圧倒的
- プロトタイピングには不向き

### AdobeXD
- UIデザインツール
- 日本でシェア1位
- 年額¥14000、無料プランでも大半の機能を使える
- 日本語のチュートリアルが充実している
- プロトタイピングのアニメーションが優れている
- シンプルなUIデザイン、個人開発などに向いてる
- デザインの表現機能がSketchと比べて、イマイチ

### Slack
- チャットツール
- ChatWork（日本発祥）と比較される
- 月額¥960,年契約で月額¥850
- 無料プランでも十分に使える
- ワークスペースを複数作成できる
- GitHubやDropboxなどのクラウドサービスと連携できる
- 返信がスレッドで表示されるので、見やすい
- ChatWorkはコスパ、Slackはカスタマイズ性に優れてる

## まとめ

本記事を書くまで、全く知らなかった技術ばかりで、以前の無知な自分が恥ずかしく思えてきました。

エンジニアの技術は、”扱う言語で実装できる範囲と深さ”、で決まると思ってましたが、
- ツール
- ライブラリ、フレームワーク
- データベース
- アーキテクチャ
を最適な形で使いこなすことも必要なんだと知りました。

利用できる技術の幅が広ければ、開発できるアプリの幅も広がる。

また、エンジニア転職する際も、扱える技術が多ければ、即戦力として採用されやすい。

言語の技術力だけでなく、スキルの幅も、エンジニアになるのに必要なもの。

実務経験がなくても、本記事で上げた技術（もしくは業務や受託で使われている技術）を習得できれば、独学でも相当の開発力が身に付くでしょう。（僕はそう信じたい。）

## 参考

[**ツール、エディタ**]
[【超初心者向け】ターミナルとは？Macの便利ツールを徹底解説](https://www.sejuku.net/blog/10977)
[GitLab って何?](https://qiita.com/masakura/items/29f8949379fa86dac22c)
[GitLabの運用方法を入門者向けに解説！GitHubとの違いも比較。ダウンロード、日本語化する方法も紹介！
](https://agency-star.co.jp/column/gitlab)
[GitHub.com・BitBucket.org・GitLab.comの月額料金比較 + α](https://qiita.com/hiroponz/items/c1ed4d6c10484233bf88)
[GitLab自社運用のための注意点とノウハウ（2018/06版）](https://techracho.bpsinc.jp/morimorihoge/2018_06_04/57628)

「**CI/CDツール**」
[iOS・Androidで、CI/CD環境を作る際の選択肢](https://qiita.com/Arime/items/08872737f58cd85a538f)
[iOS用のCIサービスBitriseを使ってみた](https://qiita.com/keygx/items/ab6149476f43ec51eb5c)
[いまさらだけどCircleCIに入門したので分かりやすくまとめてみた](https://qiita.com/gold-kou/items/4c7e62434af455e977c2)
[AndroidのCIサービスをCircleCIからBitriseへ移行しました](https://techblog.timers-inc.com/entry/2017/06/14/123614)
[fastlaneを使ってみる](https://qiita.com/masashi-sutou/items/5aa17f3d439b19562b18)
[iOSアプリ申請を驚くほど簡単に！fastlaneではじめる自動化入門](https://www.wantedly.com/companies/wantedly/post_articles/30973)
[SwiftLint × Sider + SwiftFormat で Swift らしくリファクタする](https://buildersbox.corp-sansan.com/entry/2019/05/28/110000)
[reviewdogによるGoのコードレビュー](https://swet.dena.com/entry/2018/09/18/142413#:~:text=reviewdog%E3%81%A8%E3%81%AF,%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)
[Danger から Danger-Swift 移行への手引き](https://qiita.com/lovee/items/1a0d8884963a9e3330b0#%E6%82%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D)

「**データベース**」
[Realmは「CoreDataもよくわかってないのに新しいDBなんて・・・」という人にこそオススメ](https://qiita.com/shu223/items/0ad51b5e9771c2189bd2)
[「Realmの基礎知識 〜特徴と強みの再認識〜」](https://www.isoroot.jp/blog/2271/)
[RealmSwift vs CoreData](http://www.project-unknown.jp/entry/coredata-realmswift)
[CloudKitについて調べてみた（その１）](https://note.com/yorifuji/n/n5ca8d328f7c7)
[iOS / iPadOS 13からCore DataとCloudKitの連携が自動化されたということで試してみた](https://qiita.com/NaoSekig/items/98589e8b445db90d056b)
[mBaaSとしてのApple CloudKit の利用シーンと利用制限についての考察](https://qiita.com/n-funaki/items/da38b09e5f79a3e3cfce#cloudkit%E3%82%92%E7%A9%8D%E6%A5%B5%E7%9A%84%E3%81%AB%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%B7%E3%83%BC%E3%83%B3)
[Firestore導入前に知ってほしい。３層に分解して、メリット・デメリット比較と使いどころを考える](https://qiita.com/osamu1203/items/23df0b135ed0548ff73b)

「**フレームワーク、API**」
[iOSアプリ個人開発で使ってるツールとかノウハウを公開してみる](https://qiita.com/shtnkgm/items/8d8d633be9e3ab1a504a)
[モバイルアプリ開発ツールメモ2016](https://qiita.com/Nkzn/items/9d1ded63296163663b44#ios---%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0)
[SwiftUIのすすめ – 1.メリットとデメリット –](https://www.bravesoft.co.jp/blog/archives/10973)
[Alamofire vs URLSession: a comparison for networking in Swift](https://www.avanderlee.com/swift/alamofire-vs-urlsession/)
[RxSwiftについてようやく理解できてきたのでまとめることにした(1)](https://qiita.com/_ha1f/items/e16ddc6017c4ad807c3c)
[RxSwiftを“チーム開発に”導入する話](https://www.slideshare.net/linecorp/rxswift-78445090)
[SwiftのCombineを知る](https://medium.com/@shiba1014/swift%E3%81%AEcombine%E3%82%92%E7%9F%A5%E3%82%8B-fad8e3d902fe#:~:text=Combine%E3%81%A8%E3%81%AF%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8C,%E3%82%B3%E3%83%B3%E3%83%99%E3%82%A2%E3%81%AB%E4%BC%BC%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)
[【Server-side-Swift】【Vapor】iOSアプリエンジニアが挑戦する初めてのサーバーサイド【勉強会レポ】](https://qiita.com/s-kamada/items/dbe1bef7be3a466cef8f)
[iOSDCでVaporを布教してきた](https://blog.personal-factory.com/2017/09/20/i-suggested-vapor-in-iosdc/)
[Firebase Vs Vapor
](https://www.reddit.com/r/swift/comments/9au02d/firebase_vs_vapor/)

[**パッケージ管理ツール**]
[[Swift] CocoaPodsとCarthageの違い / ライブラリ管理](https://qiita.com/nori0620/items/b81ae171f0e82b0c2d8a)
[CarthageとCocoaPodsの違いを経験交えて比較する](https://blog.mothule.com/ios/ios-carthage-vs-cocoapods)
[Xcode 11 + Swift Package Managerでライブラリを管理する]
(https://dev.classmethod.jp/articles/ios-add-library-with-spm/)
[Swift Package Manager vs CocoaPods vs Carthage for All Platforms](https://www.codementor.io/blog/swift-package-manager-5f85eqvygj#cocoapods)
[iOSアプリのライブラリ依存管理ツールとして Swift Package Managerを使うのは まだしばらく先かなと思った話](https://www.slideshare.net/mono0926/ios-swift-package-manager)

「**ユニットテスト、XCTest**」
[XCTest入門 (Swift) ~UITest編~](https://qiita.com/y-okudera/items/b6211cc3524ad2385150)
[https://techblog.yahoo.co.jp/advent-calendar-2018/ios/](https://techblog.yahoo.co.jp/advent-calendar-2018/ios/)

「**アーキテクチャ**」
[現場で選ばれているiOSアーキテクチャ](https://qiita.com/navitime_tech/items/602d3286f23952ae0149)
[iOSアプリアーキテクチャ比較検討(Cocoa MVC,MVVM,MVP,CleanArchtecture)](https://qiita.com/repepe2en/items/8dce2629b55dfd60c8c2)
[MVCモデルについて](https://qiita.com/s_emoto/items/975cc38a3e0de462966a)
[今更MVCとかでiOSアプリつくってみた（Swift）・改](https://qiita.com/am10/items/1a877dc2939962a40aaf)

「**サービス、他**」
[受託開発での iOS アプリプロジェクト新規作成プラクティス（上編：Xcode 編）](https://qiita.com/lovee/items/38cdfd5d2f5827f27427)
[地方エンジニアのための、オススメアプリ&サービスまとめ【思考整理/情報収集】](https://qiita.com/Hassan/items/1cbb890fecce7ae1db97)
[いちばん詳しい Sketch / XD / Figma / Studio の比較 〜1. 導入と背景知識](https://note.com/psephopaiktes/n/ne911c869a9d8)
[いちばん詳しい Sketch / XD / Figma / Studio の比較 〜6. まとめ](https://note.com/psephopaiktes/n/n90f74457892b)
[9 Skills you Require to Get Hired As An iOS Developer](https://www.code-brew.com/blog/2019/03/16/9-skills-you-require-to-get-hired-as-an-ios-developer/)
[iOS Developer Skills Matrix](https://medium.com/ios-os-x-development/find-the-image-and-markdown-version-on-github-fee807255235)