2019年度 iOSアプリの勉強方法

前回のサーバサイドエンジニアからiOSエンジニアへ転向したの記事に書いたとおり現在はiOSの開発を主にしている。その中でどのように勉強したのかを書いていく。

iOSエンジニアの状況について

勉強方法の前にiOSエンジニアがどのような状況なのかを説明したい。
まず、求人数を比べてみるとサーバーサイドやフロントエンド(JavaScriptを扱う)に比べて少ない。理由として、iOSアプリは少数精鋭で開発されることが多いので有名なアプリだとしても2~3人の規模で開発されていることもザラにある。そのため、未経験またはジュニアレベルのエンジニアをOJTを通して教育するというのが難しい状況だ。また、フロントエンド特有のイベント駆動や非同期処理の概念やさらにマルチスレッド処理も学ばないといけないため初学者には厳しい分野とも言える。
あと、他のエンジニアに比べるとあまり流動化はしていない傾向がある。理由として、プラットフォームに依存した言語を採用しているため、サーバーサイドのようにRubyやGoなどの選択肢がそもそもない。そのため、別の現場に行ったとしてもさほど大きく技術において変化が少ないのも理由だ(アーキテクチャの違いはあるがそれぐらい)。

ちなみに、Androidに比べるとエンジニアのiPhoneMac所持率が高いためiOSの方がエンジニアの絶対数は多い。

学習について

今、iOSを勉強する絶好のタイミングか?と聞かれると微妙にはなるかもしれない。実はiOS13からSwiftUIというまったく新しいアーキテクチャが生まれるためだ。そのため、iOS13以降のベストプラクティスが全然固まっていない(恐らくApple自身も分かってない)。
ただ、既存アプリの対象バージョンをiOS13以上に引き上げるのも現実的ではないため、AutoLayoutなどの既存のやり方はやはりマスターした方が良いだろう。

勉強の流れとしては以下の順序で勉強するのが良いだろうと考えている

  1. Swiftについて学ぶ
  2. XcodeとAutoLayoutについて学ぶ
  3. UIKitとHuman Interface Guidelinesについて学ぶ
  4. UIアーキテクチャについて学ぶ

ただ、自分自身がそんなにブログを沢山書ける人ではないため、「Swiftについて学ぶ」だけ書いていく。

Swiftについて学ぶ

まず、個人的にSwiftという言語についての印象はモダンな言語でクセが無い優秀な言語というイメージ。ただ、言語仕様としては複雑に分類されるので初学者向きの言語とは言えない。習得できれば色々な概念が学べるかなりお得な言語ではあるが、裏を返せば沢山の概念を学ぶ必要がある。

自分の場合は以下の本を読んだら大体理解できた。

上の本が難しい場合は以下の本が良いらしい。自分は読んでことはないので自信はないが。

詳解 Swift 第4版

詳解 Swift 第4版

この段階で気をつけたいのはiOSの知識とごっちゃになって勉強してしまわないようにする。そのため純粋にSwiftの知識だけで構築できるアプリを作ることが望ましい。個人的にはCLIアプリが良いと思う。例えば、無料のAPIから情報取得してきて、ターミナル上に標準出力するというくらいの単純なアプリでちょうどいい。 下では個人的に重要な箇所をいくつかピックアップした。

classとstructの使い分け

最初に勉強した時、個人的に使い分けに困った。classは参照型でstructは値型ということだけで理解できる人は飛ばしていい。
基本的にはstructで実装できないかを考えて、難しいならclassで考えるざっくりとした方針でいいと思う。分かりやすく言うと、structは不変オブジェクトで使うのが良い。structには自身の値を書き換えできるmutatingキーワードがあるが、あれはよっぽどのことがない限り使う必要はない。使う場合は設計がイケていない可能性が高い。
反対にclassは複数のオブジェクトで共有して使いたい場合やUIViewControllerなどの特定の場面で使うと良いと思う。classの何がめんどくさいのかというと、メモリリークの可能性を引き起こすからだ。そのため、参照カウントの管理もしないといけないためシンプルではない。個人的にclassを使いたい場合はなぜ使うのかコメントに書くレベルで使うのが良いと思う。

enumを使いこなす

Swiftで強力な機能といえば、Optionalと双璧をなすのがこのenumの機能だ。enumはパターン網羅をしたい処理の時にちゃんと型付け処理できるのが非常に使いやすい。このenumは使いこなせておける必要はある。

マルチスレッド

この段階で書くかどうか迷ったが、実際の現場で起こるバグの原因にもなりやすく、かつ解消が難しいので書いておく。単純にSwiftのマルチスレッドが難しいというよりも、マルチスレッド自体が難しいため別にSwiftの問題というわけではない。 ここに関しては現役のエンジニアでさえ、得意ではない人もいる。 本としては古いが以下の本が役にたつ。

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

既に絶版みたいだが、この本ではいかにマルチスレッドが難しいのかと、どのように設計していくのが正しのかの指針があるので読む価値はあると思う。 個人的にはマルチスレッドを自分で書くよりもRxSwiftなどのライブラリ経由で扱う方が好きだが、そこは結局現場次第になってしまうのでSwiftでのマルチスレッドは勉強しておくと良い。
SwiftでマルチスレッドをやるといかにElixirで並行処理をするのが楽だったのか思い知らされる。

まとめ

ここまで書いてきてなんだが、アプリエンジニアになるには結構難しいとは思う。技術的というよりも市場的に難しいという意味だ。Webのフロントエンドなどはサーバーサイドと兼務してやる機会があるので移ることも可能だが、よっぽどの小さい企業でもない限りアプリエンジニアと兼務することは稀だ。 王道で言うなら、学生時代にアプリを作っていてそのまま就職するのが一番良いがそうじゃないなら一時的な給与が下がるのを受け止める必要がある。

あと、学習環境もWebに比べてそこまで整っていない。理由は毎年OSのバージョンが上がるため、本の内容が陳腐化しやすい。そのため、参考になる記事もそのまま使えることが少なくて現在の最新のAPIを調べる必要がある。