初心者からフルスタックのソフトウェアエンジニアになるには
はじめに
自分自身では「ソフトウェアエンジニア」とだけ名乗ってるんですが、他人に自分を紹介してもらうときに「フルスタックエンジニア」とか「なんでもできるエンジニア」とかでざっくりと表現してもらうことが増えてきました。
そんな中、若者に質問されるのがどうやって技術を身につけられるかということです。
これまでは「誠実に目の前の仕事に取り組むのが一番の近道だよ」と答えて来ましたが、これは一定の真実ではあるんですがそれだけで良いかというとそうじゃない気はします。
ということで、若者がこれから何でもできるエンジニアを目指そうとするならこうすれば良いんじゃないかなというのを言語化してみました。
1. 基礎知識を身に付ける
応用情報技術者試験レベルの知識を身に付ける
身につけるべき知識は死ぬほどあるんですが、最低限かつ体系的にまとまってるのは応用情報の試験かと思います。意外とこのレベルの内容もわからずにプログラミングスクールを出ただけで基礎力は身についていると認識している人もいるのでまずはエンジニアならこのレベルの試験は軽く通ってほしいなと思います。
高校数学の復習をする
フルスタックと思われるには「これできる?」に対して迷わず「できます」といえる必要がありますが、難しすぎてできませんでした、とならないようにしたいです。
sin, cos, tan, atanあたりはなんだかんだ使う機会ありますよね。機械学習とかの方面であれば線形代数も必須だと思います。大学の範囲だと偏微分くらいは理解しておいたほうが良いかも。
英語を学ぶ
最近エラーメッセージをスタックトレースも含めてGoogle翻訳にかけてエラーの内容がわからないと言っている新人を見たときは衝撃でした。
英語は読み書きは最低限できないと成長速度がどうしても遅くなってしまいます。
アルゴリズムを学ぶ、実装する
複雑なアルゴリズムを覚える必要は(Googleの入社試験を受けない限り)ないと思いますが、ある程度複雑なロジックを理解して実装する力は必要なのでその勉強として本一冊分くらいはアルゴリズムの勉強はしておいて損はありません。
Apple Payの実装とかOAuthの実装とかもいざやることになったときに適当に実装してしまうと7payのような話にもなるかもしれません。(自分は課金周りの実装をミスったことがあるので大きなことは言えないですが、、、)
2. 技術を身に付ける
Webサービスを自宅サーバーでホストしてみる
PCを自分で組み立てて、その上で自分で開発したWebサービス(todoアプリでも何でも)をホスティングしてみましょう。ハードウェア、OS、Webサーバーなど広い知識を身につけることができます。
ちょっとデザインにこだわればPhotoShopなども使うことになるでしょう。
はじめのうちはググった内容を実行するだけで何をやっているかわからないと思いますが、4〜5回もやればだんだんと一つ一つの操作の意味がわかってくると思います。
Webサービスをクラウドサービスでホストしてみる
なんだかんだ今はクラウドの知識は必須だと思うので、まずは一番王道なWebサービスのホスティングをクラウドでやってみましょう。
クライアントアプリを作る
Webサービスとはまた一つ感覚が異なるのがクライアントアプリケーションです。
Android/iOS/Mac/Windowsなんでも良いですが、いくつかのプラットフォームに対して実装してみると様々な知見が得られると思います。
作ったサービスやアプリを世の中に出す
マーケティングやカスタマーサポートの感覚を身につけるのも重要です。
自信作がクソアプリだという評価をつけられてもヘコまない精神を身につけることもできます。
得意言語を作る
ソフトウェアエンジニアとしてはインフラからインターネット一般の知識まで広い知見が必要ですが、やはり競争力の源泉はプログラミングの能力です。
一つの言語をある程度極めれば他の言語もすぐに使えるようになるので、まずは好きな言語を人に語れるくらい極めて見るのが良いでしょう。
3. 開発スタイルを身に付ける
ウォーターフォール開発を実践する
大規模システムを作るときは日本ではウォーターフォールがほとんどです。
やってもいないのにディスるのは頂けないですし、ちゃんとやった人であればウォーターフォールそれ自体をディスる人はいないでしょう。要は適材適所です。
SIerで学んだプロジェクトマネージメントはアジャイル開発を基本としている今でも周りの人よりもうまくこなすことができている一因だと思っています。
アジャイル開発を実践する
スクラムでなくてもそれ以外でも、ちゃんとしたアジャイル開発を学んで実践しましょう。
体系立てられたアジャイル手法があるのに最初から崩したスタイルでやる人たちもいますが、まずは教科書通りにやってみたいところです。
マネージメントをやってみる
開発にしか興味がなくても、一度は10人〜のチームのリーダーとして働いたほうが視野も広くなり、どのような開発チームに入ってもマネージャーの視点で動くことができるようになります。
複数の開発スタイルを経験するためには複数の会社で働く必要がありますが、あまりにジョブホップをしているとあくまで開発者のポジションに留まってしまって、マネージメントをする経験がなくなってしまうので注意です。
4. 技術に親しむ
家でも仕事のための勉強をするのか、というのは議論によく上がりますが、専門職というのは常に専門知識をアップデートし続けてこそ成り立ちます。医者や弁護士が大学時代の知識だけで仕事してても困りますよね。
技術ニュースを読む
はてぶのテクノロジーカテゴリを追うでも良いですし、TechCrunchの記事を読むでも良いのですが、日常的にニュースに触れると少なくとも単語単位ではトレンドを追えるので世の中の流れに置いていかれずに済みます。
技術について議論する
技術がわかる同僚、友人と様々なことについてディスカッションしましょう。
新しい知識を得られたり、話すことで自分の理解が深まったりといい事ずくめです。
まとめ
各論ではDDDのような開発手法やMVCフレームワーク、関数型言語の知識など多くの人が必須だという知識は多々あるでしょう。しかしそれらを全て網羅するとそもそも時間が足りません。
「なんでもできる」と思われてても結局は「捨て方がうまい」くらいなのかもしれません。
何を捨てて何を活かすかというと、まずはここに書いてある内容くらいが自分的にはバランス感がある人材かなと思います。
ある程度基礎力ができると知識の吸収速度も上がるので、あとはとにかく色々やって経験したり本を読んで勉強したりで個別の知識を学んでいけばより良いエンジニアになれると思います。
そもそもフルスタックエンジニアを目指すべきなのか
なんでもできますというだけのエンジニアは実は市場価値が低いです。
お金がある会社は各技術要素に対して個々に専門的な人材を雇います。「なんでもできる」という人材を雇うのは各領域に対しての専門人材を雇う余裕がない企業ということなので、安い給料でしか仕事はできません。
技術の幅が広くても個人で実現できるものは小さく、多くの仕事は複数人で実現することになります。技術が一番わかっていても数十人をまとめる力がなければリーダーにはなれませんから、技術の素養が多少足りなくてもマネージメント能力の高い人間が上に行くことになります。
ということでどの仕事にも言えることですが何でも屋さんの立ち位置は実はすごく微妙です。
個人としてはフルスタックというワード自体は自分で名乗っているわけでもなく他の人から言われるだけなので良いのですが、結局は自分の売りというものがないとなかなか市場価値を上げられません。
私の場合は中学から20年以上プログラミングをやってきているので結局は設計力や開発のスピードが売りになっています。
それ以外はその開発力をサポートするための補助的なツールなのかなと今は思っています。
なので若者はまずは幅広く経験しながらも、その中で自分の好きな分野を見つけて専門性を伸ばしていくのが良いかもしれません。