サーバサイドエンジニアからiOSエンジニアへ転向した

そういえば最近WebからiOSの開発にシフトしたのでそのことについて記事を書いていく。
内容としては以下の2点を中心に書こうと思う。

  • なぜiOSエンジニアにシフトしたのか
  • どうやってiOSエンジニアにシフトしたのか

なぜiOSエンジニアにシフトしたのか

Web技術での能力向上が頭打ちだった

実はここ2〜3年サーバーサイドでの成長にマンネリ感があった。基本的にはサーバーサイドの役割といえばクライアントにHTMLかJSONを返すぐらいで、複雑なビジネスロジックがない限り非常に簡単な内容になる。また、複雑なビジネスロジックがあったとしてもRuby on Railsでの開発の場合凝った設計にすることも難しかった。ただ、Railsではなく経験があるDDDを元にした複雑なクラス設計をしたいかというと機会があればいいなくらいの温度感である。恐らく、Elixirを経験したことで凝ったクラス設計にしないと大規模なアプリを開発するのは難しいという思い込みが解けたのも理由があるのかもしれない。
フロントエンドの方もSPA関連は出来るようになっていた。もっとフロントエンドをがっつりやることも視野にあったが、大きく環境を変えた方が良いと思った。

サーバーサイドの技術が進化していない

インフラに関してはクラウドの影響もあり変化が大きいが、サーバーサイドの技術は自分がこの業界に入ってからさほど変化はしていない。むしろ、クライアント・クラウドSaaSの影響でサーバーサイドの守備範囲は狭くなっている。
1つ変わったと感じるのがRailsに一時の勢いが無くなり、型付き言語が再評価される流れになったぐらい。ただ、個人的には型付き言語に勢いがあるのではなく相対的にRailsの影響力が下がって色々な選択が出来るようになったと考えている。ここに関してはサーバーサイドがもっとマルチコアを活かす流れになると大きく変化するのではと期待している。

未経験からのサーバーサイドにエンジニアが増加

業界未経験からエンジニアなる場合、Rails or PHPから始めるケースを目にすることが多くなった。例えば、Qiitaで新人が「○○を作りました」という記事があるとすると、Railsだろうなと思って見てみると9割9分くらい案の定Railsだったりする。技術面の評価は置いといて、Railsとそれを含むサーバーサイドエンジニアのコモディティ化がかなり進んでいる印象がある。Railsの場合、ルールベースで覚えてしまえば何とかなってしまうのもその一因だろう。
そう考えるとかつてのWordPressのようにこの領域において近い将来単価の破壊が進むだろうと予測した。

iOSの未来

iOS自体の登場から何年も経っているので、旬の技術というわけではない。ただ、これからも伸びるとは感じている。理由として、Appleがバックにいること。オレがこの業界に入った時は技術の主体はコミュニティだった。ただ、最近はGAFAM主体で技術が伸びている。React・Kubernetes・TypeScriptなどなど本当に沢山あって、純粋にコミュニティ中心で人気が伸びているのはVue.jsぐらいかな?
つまり、毎年定期的に機能が追加される領域はGAFAM中心が多いのでその領域に関わる箇所に移動しようと思った。
他にも機械学習が今はB to B向けが多いが、今後はB to CやC to Cにも適用されていくと思う。そうなった時に位置情報やセンサーのデータ取得としてはまだまだiOSのネイティブの機能との連携に頼るだろうと考えている。

フロントエンドの複雑化

最近のフロントエンドの複雑化は激しい。その中で、iOSデファクトスタンダードフレームワークがないので設計についてはかなり自由になっている。
MVC, MVP, MVVMなどUIアーキテクチャでは様々である。また、ドメイン層をClean Architectureで構築するケースもある。そう考えるとシニアなエンジニアの技術力が今後反映されやすい領域になっていくのでは無いかと感じている。

クロスプラットフォームアプリについて

最近、ネイティブアプリよりもReact NativeやFlutterなどのクロスプラットフォーム開発が活発である。確かに、Webで作っていたものをそのままアプリ化するのであればクロスプラットフォームアプリを作成した方が効率が良いのかもしれない。
ただ、エンジニア視点で見るとネイティブアプリの能力がある上でクロスプラットフォーム開発が出来る方が信頼感は高い。 また、単価という面で見てもクロスプラットフォームアプリを作成する動機はコストを下げたい理由が強いためクロスプラットフォームアプリを作成できるスキルが高くても、あまり単価には反映されないだろうと考えた。
まあ、Reactの経験もあるのでむしろ流行った方が自分的には都合が良い面もあるので、流行ったらその時流に乗ればいいやと考えている。

どうやってiOSエンジニアにシフトしたのか

実は日記を読み返すと2年ぐらい前からこちらの方向にシフトしたかったんだなと思われる。

2017年度の振り返りと2018年度に向けて - cassette
2018年の振り返りと2019年に向けて - cassette

こうやって考えるとなりたい方向性に関して文章にして公開するのは意味があるのかなと改めて思う。

どのようにスキルをつけたのか

業務委託で仕事する上でポテンシャルを評価してもらえることはないので、どうしてもスキルが必要になる。オレの場合、前回の業務委託先で4ヶ月間実務で携わったことの影響が大きい。その中でiOS特有の技術に触れることが出来たので非常に運が良かった。もちろん、携わる前に予習もしていてSwiftについては事前に書けるようになっていた。Rx系の知識については誰よりも詳しかったと思う。ただ、iOS特有のUIKitの知識は実務でしか経験できないことも多いのでその箇所は必死に学んだ。
それともう一つ実は3月に自作アプリを作っていたので、これも武器になった。ソースコードは公開している。
GitHub - nobezawa/TaskBase: Simple Task Management

iOS関連のアーキテクチャの本はこの本が本当に良かった。今年一番何度も読み返している本

peaks.cc

どのようなことをアピールしたのか

AutoLayoutやView周りについては経験の差が出やすいと思う。なので、そこの分野は普通に出来るぐらいを目指した。逆に、設計の知識は活かせたので再度学習をした。例えば、MVVM, Redux, クリーンアーキテクチャ, TDDを改めて勉強した。 別にそこまでする必要も結果的に無かったかもしれないが、これが詳しいですというポイントは作っておいた。また、他にもサーバーサイド・フロントエンド・チームビルディングも出来ますと総合力でアピールした。

どう活動したのか

以下の方法で活動していた。

  • 営業活動
  • エージェント経由

まず、そもそもフリーランスなのに営業活動をしていないことに危機感があった。なので、今から営業活動に関して抵抗感を無くそうと考えたので、基本的には営業活動を中心に探した。 別に営業活動といっても大したことはしていない、自分が気になる企業に関してお問い合わせフォームから問い合わせるだけだ。内容も単純にどういう能力があって、どうやって貢献できるかだけ意識した。合計4社に問い合わせて、全てアポイントまで取れたので感触は良かった。

営業活動とエージェントの比較

営業活動のメリット

  • 自分が興味のある企業に直接交渉出来る
  • エージェントによる手数料が発生しない
  • ライバルがいない

エージェントのメリット

  • 複数の企業に効率良く応募できる
  • 面接管の情報をもらえることがある
  • 事前に契約内容を把握できる
  • 直接交渉しなくてよい
  • ある程度大きな企業がクライアント

どちらもメリデメがあるので、どちらが優れているというわけではない。営業活動のメリットはやはり興味のある企業に直接応募出来る点と手数料が発生しないのでその分の単価が反映しやすいがいい。あと、エージェントを利用すると他のエンジニアと案件が競合する可能性があるが営業活動の場合はその可能性が低い。
エージェントの良いところは条件さえ提出すれば効率良く応募出来るので企業にこだわりがないのなら便利。また、契約書がよく分からなくてもエージェントを通せばそこまで不利な契約内容になることはまずない。えっそんな変な契約あるのと思われるが、残業についての支払いが書かれていない契約書も過去にあった。
また、エージェントを利用するぐらいなので事前に資金力が乏しい企業は除外されるので安心である。

結果的に営業活動した企業で決まった。単価はiOSエンジニアとして再出発するので落とした。 営業活動では4社にアプローチをして4社とも面談まで行ったので、メール営業としてはかなりの成果なんじゃないかと思う。

営業活動の振り返り

いきなりお金のことは言いにくいかもしれないが、単価は初回から伝えた方が良かった。どんなにお互いの印象が良くても想定している金額が2倍も離れると現実的に契約するのが不可能。そもそも交渉自体もそんなに得意でもないし、交渉に時間をさくなら他の企業に活動した方が効率が良いと思う。
また、面談中に少しでも違和感を感じたなら止めといた方が良いと感じた。きっと働きはじめてからその違和感はどんどん大きくなっていく。個人的にはもし面談が2回以上あるなら1回目はスカイプ面談にしてくれると助かるなあと感じた。
あと、エンジニアの技術力が高いかどうかよりも儲かっている企業と取引をした方が単価が高いということを改めて実感した。儲かっているかの指標は以下の通り。

  • 上場企業
  • スタートアップであれば大型の資金調達をした
  • 既に稼いでる事業がある
  • 面談にCEO(出来ればCTO)が参加しない

この項目に全くかすっていない企業の単価は期待しない方が良い。個人的にCEOが面談に参加しないというのは業務委託の単価ぐらいではCEOがわざわざ細かく判断しないという意味であり金払いが良い証拠である。結局書いてみる大企業の特徴になってくる。まあ、せっかく働くのだから単価以外にも総合的に判断した方が良い。

まとめ

長々と書いてきたが結局は興味がある方向に向かっただけのような気がする。Webの方も個人サービスでは開発が続くので全くやらなくなるわけではない(Elixirも書きたいし)

おわり。