自分を攻略していく記録

自分がやりたいことを達成するには何をすればいいのか、その攻略していく過程をつらつらと

3年弱でゼロからフルスタックエンジニアになるまでにやったこと

はじめに

そもそも何をもってフルスタックというのかという話もあるが、ここでは、開発するプラットフォームや言語を問わずエンジニアとしてすぐ働ける、というイメージでフルスタックエンジニアという言葉を使っている。ベテランのエンジニアからすると自分の技術力はまだまだだし、自分でフルスタックエンジニアというのは恐れ多いが、iOSAndroidのモバイル環境やウェブ、ブロックチェーン周りのいろんな技術を現場レベルで触ってきた過程で、どういうことをいつ学んできたのか書いていく。もちろんこれが正しいわけでもないし、人によってはフルスタックにならずに何かに尖らせたいということもあるので、参考程度にとどめていただければ、と思う。

長いので、あらかじめまとめを書いておくと以下のような感じ

  • 週末とかもひたすら好きなモノを作ってみる。その際、できれば新しい技術で作ってみるのに挑戦する。
  • 環境に慣れてきたら変える。会社でもいいし、プロジェクトでもいいし、言語でもいいし、役職でもいいし、そこに安住しない。
  • 自分より格段にすごいエンジニアと一緒に働く。
  • ビジネスサイドともコミュニケーションは取る。UMLとか書くといいかも。
  • (アウトプットもした方がいい。自分はできてなかったので偉そうなことは言えないが...)

きっかけ

2015年の12月、大学の同級生が作ったCandleという会社でインターンを始め、プログラミングをHTMLから本格的に勉強したのがスタートだった。これは大学4年の冬。大学の課題でなんとなくJavaを触ったことはあったが、コンピュータ・サイエンスの基礎とかはやったこともなく、2015年12月の時点ではほぼ初めての状態だった。大学時代は、ラクロスというスポーツをやっていて、ほとんどの時間を部活、筋トレ、映像を見ることに費やしており、恥ずかしながら勉強にあまり時間を割けなかった。基本朝4時半起きだったしそれを言い訳にしていた感は否めないが...。とにかく、大学4年の終わりに部活を引退し、その1ヶ月後から、当時なんとなく興味を持っていたプログラミングに熱中しだした

▼大学院試験前夜の様子(白が自分)。遅刻ギリギリに試験には間に合ったが、第1希望は落ちた...

f:id:ngo275:20181121235617p:plain:w300

2015年12月~ : 1年強のインターンで0.8人前くらいに

インターンといっても初めの1ヶ月はHTML、CSSJavaScript(jQueryとかの使い方)、PHPをひたすら勉強して簡単なウェブアプリを作ったりしていた。 とりあえずドットインストールとかを見ながら写経して動くものを作ってみる という感じ。 当時はProgateとかの選択肢もなく、ドットインストールがバイブルになっていた。確かに環境構築とか、 思い通りにいかないところで何時間(下手すると数日)も消えるのが当たり前だったが、問題を解決するのが楽しくて1日中パソコンを触っていた のを覚えている。でも「最悪誰か聞ける人がいるから大丈夫」という環境でなければ、心が折れてプログラミングを投げ出していたかもしれない。僕自身は、「気づいたらパソコンと育っていた」というタイプのエンジニアではないので、初学者がプログラミングを勉強してても続かなくなってしまう理由がとても分かる。誰もが初めはチンプンカンプンで心が折れそうになるのは当たり前なので、決して「自分は向いてないのではないか」と思わないでほしい。そのうち分かるようになる、とやり続けていると、本当にそのうち分かるようになっている。

1年ちょっとひたすらコードを書いたり技術書を読み漁って、基本的なコンピュータ・サイエンスの知識(TCP/IPとかネットワークの基礎知識・アセンブラまわりとかの知識)をつけて、iOSなら普通に他の会社(Candle以外)でもやっていけるようになっていたと思う。

最初の1年で読んだ本を印象に残った順にピックアップしてみる。

Candleでは優秀なiOSエンジニアがそばにいて、その人が綺麗なコードというものを教えてくれたおかげで一気にレベルをあげてもらえた。そういう人が身近にいないと早く成長するのは難しいかもしれない。その時は、いくつかのスタートアップを手伝い、ずっと働いて月50万くらいは稼げるようになっていた気がする。

▼できる人に自分のレベルを無理やり上げてもらうのが早い、というは念能力と同じ

f:id:ngo275:20181121235308p:plain:w300

2017年1月~ : AnyPayにiOSエンジニアとして関わりだす

プログラミングを真剣に初めて1年強経った2017年の1月末に、AnyPayにiOSエンジニアのバイトとして関わりだした。1年強できる限りプログラミングを勉強してきて、ある程度動くコードを書けるようにはなったつもりだったが、30歳を過ぎた力強いエンジニアたちに囲まれると、いかに自分のレベルが低かったのかを痛感した。議論のレベルが学生エンジニア同士では中々ないレベルだった(もちろん学生エンジニアでもそういうのに平気でついていける人もいるが多くはない)。いかにしてテストを書きやすいコードを書くのか、こういう設計だとこういう問題が起きてくる、とかモバイル開発におけるテスト・アーキテクチャについてとにかくキャッチアップした。周りのレベルが上がって刺激的だったので、そういう環境に身を置こうと思い、2017年の4月から正社員として入社することにした

www.wantedly.com

エンジニア歴10年以上の人のパソコンの手さばきが早すぎて衝撃的だったのを今でも覚えている。ショートカットをガンガン駆使していて、とにかくキーボードから手が動かないのだ。他にも、バグやわからないことを調べる時は、Qiitaや第三者のブログを当たるのではなく、とにかく公式のドキュメントを参照していたのも当時の自分には新鮮に映った。当時の僕は、馴れないものを触る時は、まずQiitaで日本語で簡単に説明してるのを見てから自分で少しずついじってみる、というのが染み付いてしまっていた。これ自体は悪いことではないかもしれないが、すごいエンジニアと言われている人は公式のドキュメントで正しい情報を取りに行くのだと痛感した。ベテランのエンジニアと一緒に働くことでこうした些細だけどエンジニアとして大切なことを学ぶことができる

「ゼロからですが本気でプログラミングを勉強します!」と言ってこういう環境に飛び込むのは、数学オリンピック優勝とかよっぽどのことがないない限り基本通らないので、どこかで半年~1年くらい実戦経験を積んでから、レベルの高い環境に移動するのが良いと感じた。むしろはじめからベテランエンジニアに囲まれると、力の差に絶望しか感じないので、個人的には、学生であれば友達のスタートアップとか初心者でも入りやすいところから入るのがオススメ。僕は、初めのうちは、とにかく自分の周りの環境にこだわっていて、自分のレベルが上がると周りの環境を変えるのをかなり意識した

この時期読んだ技術書はこんな感じ。FinTechの業界に対するキャッチアップが必要で、技術書よりもFinTechの法律の本などが中心だった。

2017年6月~ : サーバーのコードも書くようになる

AnyPayに入った初めのうちは就業時間に関係なくずっとiOSの開発をしていたが、数ヶ月経つと新しい環境にも慣れてきて、仕事が終わったあとはひたすらRailsの勉強をした。というのも、サーバがRailsで書かれていたからだ。APIを専任で書いている人もいなかったので、自分が書けるようにようになると頼りにされるとも思った。仕事後や週末に、1ヶ月くらいこっそり勉強してから、サーバも興味あるとCTOに話をして、わからないことを教えてもらいつつRailsのコードも書くようになった。この時は、Ruby on Railsチュートリアルを半分強やって、Railsに関する技術書(パーフェクト Ruby on Rails)を読んで勉強したのだが、Railsに独特の覚えるべきことが多く苦労した。結局自分で簡単なアプリを作ることでRailsの基本や、よく利用されるライブラリ、ActiveRecordの使い方を習得した

そういった甲斐もあって、2017年の夏過ぎから新規事業のサーバーの開発(Rails)もほぼ1人でやらせてもらって、ここでDBの設計からしごかれながらなんとか完成させた。このときにGKE(Google Kubernetes Engine)で開発をしたので、Kubernetesについても勉強することとなった。このプロジェクトを通じて、アラートやロギングをしっかりしておかないと、あとで調査もできないし経済的損失も馬鹿にならないというのも学んだ。

会社の環境にもよるが、チャレンジさせてもらえる環境であれば、ガンガンやりたいことを伝えてやらせてもらうべき。もし逆に、スタートアップで働いているのに、そういうチャレンジがさせてもらえないなら、他の会社を探すなりした方が良いと思っている。いろんな言語・技術に触りたいわけじゃなくても、iOS開発でも機能の要件定義から仕様に落とすとか、ロールをもらえるかどうかも同様。

2017年11月~ : JavaScriptブロックチェーンの世界に入り込んでしまう

f:id:ngo275:20181202234611p:plain:w300

Railsを3~4ヶ月くらい開発した後、そのプロジェクトは運用のフェーズに入り落ち着いてきて、また新しいプロジェクトの開発にも関わりだした。それは暗号通貨関連のプロジェクトでReact NativeでiOS/Androidアプリを作るものだった。2017年の11月くらい、ちょうど暗号通貨が話題の頃で、プライベートの時間にはJavaScriptやSolidityをコツコツ勉強しており、AnyPayの業務でもそういった技術を触るようになった。Railsの時と同様に、業務で使えそうな技術をプライベートで勉強しておいて、ある程度分かってきたら、会社でそれを活かせるところに関わりたい欲をアピールした。それが受け入れられるかどうかは会社によると思うが、幸いなことにAnyPayのCTOはそういった姿勢に対して非常にポジティブで応援してくれる方だった。ブロックチェーン系のプロジェクトはJavaScriptとの相性が良いということもあり、この時期(2017年の冬)から最近(2018年11月)に至るまでほとんどJavaScriptを書いていた。

JavaScriptはプログラミング初心者の頃によく勉強すると思うが、JavaScriptを本格的にプロダクトで利用するとなると学ぶことが非常に多い。書き方が柔軟すぎるからだ。特にウェブのフロントエンドの変化は早く、去年学んだことがもうdeprecatedになってしまう勢い。ただ、開発者が多いので、GitHubJavaScript系のプロジェクトを見つけるのが非常に容易で、大きなプロジェクトのソースコードを読んだり動かしてみることで勉強をした。特にブロックチェーン系の文脈でJavaScriptを学びだしたので、ICOしているプロジェクトや有名なプロジェクトを参考にした。もし最初の言語がJavaScriptの場合は、勉強のために大きなプロジェクトのコードを読むのは辛いかもしれないが、他の言語の知識があると補完しあうことで理解が早まると実感した。特に、Swiftのような静的型付け言語と、Rubyのような動的型付け言語をそれぞれ学んだことで、新しく言語を学ぶ時の理解度が初めの頃に比べてグッと早まった。Ethereumというブロックチェーンを扱う際に、Solidityという新しいプログラミング言語を利用するのだが、Solidityはほとんど勉強しなくてもコードが読めたし、実装も苦労しなかった。Goに関しては少し苦労したし、まだ自信を持って書けるとは言えないが...。

2018年8月~ : プロダクトの設計も関わりだす

初めの2年でモバイル(iOSAndroid少し)とウェブの開発、ブロックチェーン関連(Ethereum)の開発、アナリティクス周りがそれっぽくできるようになったが、3年目にUMLやDBの設計・プロダクトのアーキテクチャについて、シニアエンジニアとの議論を通じて学ぶことができた。「コードは書ける」という状態から、要件から仕様に起こすといったプロダクトの設計レベルのことにも関わり、エンジニアとして少し深みが出たかもしれない。個人的には、プロダクトの設計の部分が割と重要だと思っていて、独学では中々学べないので実践で学んでいくしかない。PMが普段何をしているのか、ということに注意を払ってみるとこうした設計レベルのことを行っており、エンジニアもそういったプロセスを見ると勉強になると思った。

f:id:ngo275:20181203002419p:plain:w300

ビジネスサイドの人が何を考えているのか理解することが非常に大切で、そういったことを理解するためにもUMLは欠かせないと思う。エンジニアとしては価値のあるものを作りたいという気持ちがあるが、ビジネスとしてサステイナブルでないものを作るのは、ビジネスとしては間違っているし、中で働いているエンジニアも給料も上がらずいい思いをしないと思う。

その他

  • プライベートの時間で自分でモバイルやウェブのアプリを作ったりして、興味がある技術を試したりしていたのも今となっては良い勉強だった。たとえば、Firebaseに興味を持ってサーバレスのアプリ開発をしていたが、AnyPayでも、プロジェクトによってはFirebaseのRealtime Databaseを利用する案件もあり、プライベートで学んだ知識を還元することができた。

  • IoT系のプロジェクトも少し関わって、はんだごてを握ったりArduinoをガシガシ使ったりした時期もあり、ものづくりの可能性を感じた。アプリ開発だけしているとどうしてもアプリ開発が先に思いついてしまうが、ハードウェアの開発もすると、欲しいもの何でも作れる気がしてきてエンジニアとしては楽しみが増えた。その点では中国の深センは面白い。

  • アウトプットが少なかったことは反省。インプットするものの、ついついアウトプットが少なくなってしまっていた。外部のイベントで登壇やLTをする時期もあったが、忙しくなったタイミングでいつも途絶えてしまう。そこで知り合った人から仕事をもらえたりもするのでアウトプットするのは大切。

  • 週末にアメリカ人の会社を手伝っていたのは良い経験になった。英語でのコミュニケーションも勉強になったし、シリコンバレーでずっとエンジニアしていた人だったので、いつもと異なるスタートアップの文化を日本にいながらにして感じることができた。今はもう手伝っていないが、イギリスに移転したからおいでよ、とお誘いもいただけた。

まとめ

つらつら書いてきたが、自分がしてきたことのうち意識したことをまとめると以下のような感じ。どこでもよく見かける内容ではある。

  • 週末とかもひたすら好きなモノを作ってみる。その際、できれば新しい技術で作ってみるのに挑戦する。
  • 環境に慣れてきたら変える。会社でもいいし、プロジェクトでもいいし、言語でもいいし、役職でもいいし、そこに安住しない。
  • 自分より格段にすごいエンジニアと一緒に働く。
  • ビジネスサイドともコミュニケーションは取る。UMLとか書くといいかも。
  • (アウトプットもした方がいい。自分はできてなかったので偉そうなことは言えないが...)