みんからきりまで

きりみんです。

新卒からAndroidのエンジニアが30でサーバーサイドの仕事をやれるようになるまでに感じたこととか

こんにちは。最近はAndroidをやっていないきりみんです。

エンジニアとしてのキャリアのほとんどをフリーランスAndroidエンジニアとしてやってきた自分が、最近仕事でRails+Nuxt.jsをやっているので、そのあたりの経緯だったり思ったことなんかの話を書きたいと思います。

なぜAndroid以外をやるのか

Android以外をやっているのは自分の意思です。
ではなぜバックエンドとフロントエンドの仕事を選んだのか。

元々自分はエンジニアとしての最初の仕事でAndroidをやり、そのままAndroidコミュニティとともに歩んできたところがあり、アプリ開発特需に上手く乗れたからこそなんとかやってきたというところがあります。
当時まだ新しい分野であったAndroidでは勉強会なども盛んで、情報発信をすると見てもらいやすかったりと評価されやすい環境があり、モチベーションも高く取り組んでいました。

Androidへのモチベーションの低下

しかし、キャリア年数を積んでいくうちにAndroidしか出来ない自分に少し負い目を感じるようになってきました。
もちろんAndroidの仕事は今でもかなり需要があるのですが、新しく学ぶことは次第に少なくなり、複雑化の一途をたどるモバイルのクラス設計やプラットフォームのAPIをひたすら相手にするばかりという感じになり、更に以前は設計手法や新しい技術の導入などに関心が強かった気持ちも最近は冗長に感じたりあまり意義が感じられなかったりして、Androidの最新情報を追う気力もなくなってきました。

一方で、趣味で競技プログラミングをやったり、ゲーム系や機械学習系のプロダクトにユーザーとして刺激を受けることが多くなり、もう少しロジカルな実装に近い方向にもスキルを伸ばして行きたいという気持ちが強くなっていきました。

また、Androidだけをやっているとどうしても触れる技術に偏りがあり、ネットワークやデータベースなどの知識はなかなか身につかないというようなコンプレックスもありました。

バックエンドの仕事をどうやって得るか

かなり前から消極的には「Android以外をやってみたい」という気持ちがあったものの、仕事を受ける時に「iOSとかバックエンドもやるかもしれない」と言われたとしても、実際にはなかなかちゃんと業務としてがっつりやらせてもらえる機会はないし、業務委託で仕事をしている以上はやはり即戦力として一番パフォーマンスが出る仕事が求められるので、なかなか業務経験がないことをやるというのは難しいことでした。

個人的にはフロントエンドの知識をキャッチアップしたり、Railsなどサーバーサイド開発の入門書を何冊も読んだりしていても、特にサーバーサイドは実際に動いている規模のソフトウェアでないとなかなか実務的な知識や経験は身につけにくいというのもありました。
少し前の仕事ではAndroidとバックエンドを半々でやるという仕事だったのですが、やはりどうしても自走できるAndroidの比重が大きくなりがちだったり、バックエンドの仕事を振ってもらってもかなり歴史のあるサービスだといきなり機能拡張系のタスクを渡されてもなかなか太刀打ち出来なかったりして、結局ほとんど経験が積めないまま終わってしまいました。

結局、今の仕事は以前に一緒に働いていて自分の人となりを知っている人から誘われた案件で、単価をかなり下げてもらい、事情を話した上で受け入れてもらいました。

モバイルエンジニアはバックエンドもやった方がいいのか?みたいな話

「バックエンドなどの仕事をしたい」という話を周りに相談した時は、同じモバイルエンジニアの相手からはあまりポジティブじゃない反応をもらうことが多かったです。
実際、モバイルの案件は今でもたくさんあるし、その方がキャリアとしても差別化が出来ていて単価も高く安定しているのに、なぜわざわざ得意じゃないことをやるのか、というように思われることが多いようです。

たしかにそれはそうで、別にAndroidだけをやっていてもそんなに困ることはないと思っています。
ただ、純粋に自分が飽き性で色々なことをやりたいという性格なので、一つの分野を突き詰めるというのがあんまりイメージ出来ないという気持ちがありました。

また、自分が新卒からずっとAndroidなので、例えば今は問題なくても10年後20年後になってAndroid開発がかなり下火になったとして、その時に別の仕事に乗り換えられるだけの体力が自分にあるだろうかという気持ちもあります。
このあたりは元々バックエンドをやっていてAndroidに転向してきた人や、仕事でAndroid以外もやったことがある人とは危機感が違ったかもしれません。

Rails+Nuxt.jsをがっつりやってみて

まずRailsですが、想像以上に苦戦しました。
Railsの厚めの入門書を3冊くらいは読んで写経していたので、ちょっとしたことはだいたい出来るだろうと思っていたのですが、実際には本当に基本的なことも身についておらず、最初はほとんど何も出来ませんでした。 RubyRailsの作法、パフォーマンスを意識したActiveRecordの書き方、テーブル設計やリレーションの細かい定義、ActiveJobなどなど。入門書を軽く読んだだけでは理解出来ていないことだらけでした。
そして、ずっとAndroidJavaとKotlinを書いてきた自分は何よりもRubyという動的型付け言語の難しさに苦しめられました。
型の情報とIDEの強力な支援がない環境だとこんなにコードを書くのはむずかしいのかと絶望しました。

一方で、フロントエンドのNuxt.jsの方は想像以上にスムーズにキャッチアップすることが出来ました。
フロントエンドは元々Reactなどの知識を追っていたというのと、モバイル開発とパラダイムが似ている部分が多く、TypeScriptという型の支援があることもあり、設計なども自然に理解することが出来ました。

サーバーサイドをキャッチアップするために大切なこと

やはり実践あるのみというか、何百ものクラスファイルと何十もテーブルがあるようなサービスの設計やパフォーマンスは実際に触ってみないと分からず、独学でキャッチアップするのには限界があるなぁと強く感じました。

更に言うなら、良いメンターがいるということな気がします。
今の仕事では幸いにも自分が信頼しているとても優秀なエンジニアが丁寧に何もかもを教えてくれる環境なので本当にありがたいです。
クライアントサイドと違って(?)バックエンドの実装、特に動的型付け言語であるRubyRailsでは「動けばだいたい合っている」なんてことはなくて、負荷が高くなったりした時に初めて問題になるようなコードもたくさんあると思います。
多分たとえ実務経験が長くあったとしても、そういう部分を指摘したりレクチャーしてくれる存在がいなければ我流で悪いあまり理解していなかったり良くないコードを書き続けてしまっていることもあるんじゃないかなと感じます。

そういう意味ではやはりフリーランスの立場で学ぶというのはなかなか難易度が高いので、正社員でエンジニアをやっている人はぜひその貴重な立場を活かして色々チャレンジしてほしいなと思います。

あと、事前に勉強した知識の中では、学生時代に取った基本情報や応用情報のDBやネットワークyまわりの知識だったり、教養として読んだ技術書の断片的な知識が役に立ったりした気がします。

おわりに

偉そうなエントリを書いておいてまだまだ全然初心者レベルですが、ようやく実務レベルでサーバーサイドとフロントエンドの仕事が出来るようになって世界が広がったような気がします。
これから少しずつ幅を広げて色々なことにチャレンジしていけたらなと思っています。