エンジニア全般

【凡才エンジニアの処世術】フルスタックエンジニアの本当の意味

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

エンジニア界隈では、
しばしばフルスタックエンジニアという言葉を耳にします。

しかし、このフルスタックエンジニアとは何なのでしょうか?

「フロントもバックエンドもモバイルもインフラも全てできる人?」
「フロントとバックエンドができる人?」
「そもそもできるってどの程度のレベル?」

など色々突っ込みどころがある言葉かなと思います。

そのため、このフルスタックエンジニアという言葉自体が
気に食わないという現役エンジニアも多いかもしれません。

本記事では、このフルスタックエンジニアについて、
私が考えるフルスタックエンジニアについて、
述べていきたいと思います。

本記事の動画バージョンは、
下記になります。

フルスタックエンジニアとは?

フルスタックエンジニアとは一般的には、
その名の通り、開発におけるすべてのスキルを
備えているとされるエンジニアです。

ふわっとした言葉なので、
人によって定義は微妙に変わりますが、
フロントエンドとバックエンドの両方ができるというのが最低条件でしょう。
(これらに加えて、インフラやiOS, Android開発も含めて
フルスタックエンジニアと定義する人もいる)

本記事では、わかりやすさのため、
フロントエンドとバックエンド、インフラができるエンジニアを
フルスタックエンジニアと定義します。

さて、もしかするとお気づきかもしれませんが、
上記の定義にはすでに欠陥があります。

すなわち、「できる」ってどの程度か?
フロントエンドってどこまでを指すか?
バックエンドってどこまでを指すか?
インフラってどこまでを指すか?

という冒頭でも触れた問題です。

フルスタックエンジニアは、
大抵の場合、意味がふわっとしがちな言葉なので、
とにかく「広い分野ができる」エンジニアとして認識されています。

フルスタックと専業

フルスタックエンジニアは、キラキラしたイメージがあるので、
単にバックエンドだけできるや、フロントエンドだけできるよりも
良いように思えるかもしれません。

実際、良い悪いの問題で考えると、
良いと思います。

広い分野の知識があることは、
武器になることも多いでしょう。

それに対して、専門のエンジニアは、
その分野の知識しかないので、
フルスタックエンジニアよりは、
融通が効かなかったりします。

しかし、エンジニアとしてのスキルレベルが高いという
観点ではフルスタックエンジニアは、
専門エンジニアに劣ることがほとんどです。

(もちろん、ごく少数のフルスタックですべてのスキルレベルが高い
化け物もいるかもしれませんが)

それに既に少しだけ触れましたが、
このフルスタックエンジニアという言葉自体を嫌っている人も
少なくない印象です。
(この点について、面白い掲示板を見つけたので掲載しておきます。)

まあ、フルスタックエンジニアという言葉から出る全能感に対して、
実態は中途半端なエンジニアであることから生じる乖離が、
口さきだけの印象を与えているのが原因な気はしておりますが。

フルスタックエンジニアのスキルが低いことの卑近な例だと、
色々な案件を広く浅くやっているエンジニアなどがわかりやすいと思います。

例えばSESなどで、2ヶ月間Javaの案件に入るも、
3ヶ月目からは、3ヶ月間、Reactの案件に入り、
その後は、Swiftの案件に2ヶ月入ったり、
その後は、AWSの案件に入ったりと、
プロジェクトを転々としているケースがあるとします。

この場合、実務経験がある技術領域だけでいえば、
フロント、バックエンド、モバイル、インフラ全てになるので、
領域的にはフルスタックエンジニアです。

しかし、お察しの通り、
上記のエンジニアの技術レベルが高いかと考えると、
かなり微妙だと思います。

結局どれも身になっていないのではないかという
不安を感じますよね。

もちろん、これは極端な例ではありますが、
フルスタックエンジニアとして、専門性を高めていくには、
それぞれの技術領域でそれぞれ3年以上の実務経験を積んでいかなければ
ならないことを考えると、最低でも9年以上の実務経験があるエンジニアに
なるので、市場にはかなり少ないことがわかります。
(ちなみに、実務経験という尺度自体も多分に曖昧かつ広範な領域を含んだ言葉なので、
個人的には信ぴょう性があるのか疑問があります。この点については、
こちらの記事で詳しく考察しています。)

そのため、フルスタックエンジニアは、
化け物クラスの例で考えると、
いるかどうかの幻の存在に近いので、
普段フルスタックエンジニアと言っているのは、
大抵の場合、それぞれを浅く広くやっているエンジニアがほとんどだと思います。

そう考えると、巷でフルスタックエンジニアと
言われている人が、技術力が高いかどうかは
疑問が残るところです。

もう少し深ぼっていくために、
以下、それぞれのスキルスタックを大雑把にまとめてみます。

フロントエンドエンジニア専業

フロントエンド専門の人が求められる技術スタックを
羅列してみます。

ポイント

  • JavaScript / TypeScriptに対する深い知識
  • node_modulesなど、JSのエコシステムについての深い理解
  • JavaScriptのライブラリについての知識
  • JSフレームワーク一つ以上に対する深い知識
  • 最新トレンドを継続的にキャッチアップしていく素養
  • CSSの深い知識
  • UI/UXに対する知見
  • Webデザインのスキルもあるといい(場合によっては必須)
  • APIとの接続に対する知識
  • バックエンドに対する最低限の理解

フロントエンドエンジニアの場合、
とにかく、JavaScriptとTypeScriptへの深い理解、
フレームワークに対する深い知識が求められます。

それと、node_modulesなどを初めとした、
JSのライブラリ周りのエコシステムについて、
深い理解が求められます。

専業の場合、これらのスキルに相当自信があるのはもちろん、
場合によっては、他の自信があるフロントエンドエンジニアと
差別化できるぐらいのレベルが必要です。

バックエンドエンジニア専業

これに対して、バックエンド専門の場合、

ポイント

  • バックエンド言語最低1つに対する深い知識(できれば静的型付け)
  • DBに対する深い知識
  • APIの深い理解
  • アルゴリズムやCSの知見
  • パフォーマンスに対する知見
  • セキュリティーへの知見
  • 最低限のインフラ知識
  • 最低限のJavaScript / TypeScript

バックエンドの場合、
とにかく、DBやAPIの処理などの、
細かいパフォーマンスやセキュリティー要件などが
シビアに見られます。

そのため、これらに対する相当深い知識が求められます。

というか、ある一定以上のレベルは、
専門性が高すぎてセンスや才能が必要な領域とすら思えます。

理系でCS専攻という、
いわゆるエリートはバックエンド専業だったりすることが
多い気がするので、基本的にバックエンド専業を目指す場合、
こうしたエリート達と遜色ないレベルに達する必要があります。

またバックエンドは、プロダクトによって難易度がまちまちで、
アルゴリズム系が複雑にからむプロダクトのバックエンド専業は、
特にレベルが高い印象があります。

総じて、下記のようなプロダクトのバックエンド専業をしている
エンジニアは相当高いスキルでしょう。

要件

  • 銀行 (セキュリティー要件が厳しく、障害が一大問題になるので、止めないためにできることを考慮したりなど、バックエンドやインフラ領域において高いスキルが求められる)
  • 仮想通貨系 (これも銀行と同様だが、こちらはそれに比べてブロックチェーンなど最新技術の動向への知見も
    必須だったり、複雑なアルゴリズムが必要だったりと、総じてレベルが高い)
  • ユーザー数が多いプロダクト(トラフィックが多いので、インフラやバックエンドのクエリー制御など、
    考慮することが多い)
  • リアルタイム性が強いプロダクト(ちょっとした時間のずれとかが障害につながるので、処理の正確さ、効率の良さなど、チューニングが難しい印象。)

このへんは、私の印象なので「違うよ!」って言う部分もあるかもしれませんが、
概ねこのような感じだと思います。
(難易度が高い理由そこじゃないよっていうのはあるかもしれないですが、
難易度が高いっていうことは間違ってないと思います。)

これに対して、バックエンドの難易度が低いのは、

要件

  • ユーザー数が少ない (処理とかインフラ構成がガバガバでもなんとかなる)
  • 処理が単純または、バグによる損失が小さい
  • お金が関わらない

このあたりでしょうか。
もちろん、バックエンド専業であれば、必ずしも難易度が低いわけでもないと思いますが、
少なくとも上記よりは難易度は低いでしょう。

そう考えると、銀行系は、上記の難易度が高い4項目をすべて備えているので、
やはりえぐいですね。

すでに銀行系でバックエンド専業でやられている方は尊敬します。

バックエンド専業の場合、こうしたレベルと戦う土俵に上がらなければなりません。

フルスタックエンジニア

最後にフルスタックエンジニアはどうかというと、

ポイント

  • バックエンド言語最低一つが、最低限実装できる
  • フロントエンドの実装が最低限行える。
  • インフラの知識が最低限ある。

おや、フロントエンドやバックエンド専業に比べて、
求められる要件のレベルが下がったような。

フルスタックエンジニアは、領域の広さが売りですので、
深さは専業よりは求められません。

フロントエンドは、JS周りのエコシステムや、
複雑に入りくんだnode_modulesの構造などは、
ふんわり理解でもとりあえず大丈夫で、
バックエンドは、アルゴリズムやCSの知識とかはなくても、
なんとかなるっていうレベルといったところでしょうか。

とりあえず、フロント、バックエンド問わず、
タスクに着手できればいいっていう感じですかね。

そのため、浅く広くのスキルスタックでもいいというのが、
フルスタックエンジニアの特徴です。

(もちろん、広く深くというフルスタックエンジニアもいるにはいるでしょうが、
ごく少数なので、そういうケースはカウントしないでおきます。それに大抵の場合、
広く深くのフルスタックエンジニアは、どこかの専門が強いのが第一条件で、
他の分野の知見もあるというパターンなので、厳密にはフルスタックエンジニアというより、
専業エンジニアで異分野も強いっていうパターンだと思います。)

フルスタックエンジニアは凡人の処世術

フロントエンドの専業や、
バックエンドの専業は、
求められるレベルがすごく高いです。

そのため、この領域はだれでも目指せるものではありません。
何年も経験を積むか、経験が少ないならもともとセンスがある才能豊かな人が、
目指せる領域かもしれません。

たまに、未経験や駆け出しエンジニアで、
バックエンドやフロントエンド志望という方がいます。

バックエンドやフロントエンドしかやらないということは、
求められるレベルも数段高いということです。

未経験や駆け出しエンジニアの段階で、
そのレベルを目指すのは至難の技です。

初期の段階であちこち手を出すのは
中途半端ということなのかもしれませんが、
未経験や駆け出しの時点で、スキルは大抵中途半端です。

だったら、中途半端らしく、
色々つまみ食いするのが良いのではと思います。

フルスタックエンジニアは、
名前はかっこよくて、
なんともすごい人感がありますが、
実際は、専業エンジニアになれないだけです。

専業エンジニアになれないから、
相互のスキルを補完しあって、
ごまかしているのです。

しかし、これは悪いことではありません。
経験が浅い段階では、むしろ
このようにフルスタックエンジニアを目指すほうが理想です。

なぜなら、誰にでも再現性がある程度あるから

フルスタックエンジニアは、
専業に比べ、ごまかしがききます。
それに、専業の場合に突き当たる、
レベルが高い壁は、フルスタックエンジニアの場合は、
中途半端でも割と見逃してもらえます。

なので、努力で目指せるものだと思います。

例えば、フロントエンド専業の人が、
JSの非同期処理を理解していなかったら、
は?って感じですが、
フルスタックエンジニアなら、まだ多めに見てもらえることが多いです。(多分)

バックエンド専業の人が、
DB設計やクエリーのチューニングができなかったら、
は?って感じですが、
フルスタックエンジニアなら、多めに見てもらえることが多いです。(多分)

もちろん、何もかもできないのは問題ですが、
一つできないところがあっても、
ほかでカバーしやすいということです。

例えば、ややフロントが強いフルスタックエンジニアの人であれば、
DB設計とかはちょっと苦手だけど、その分TypeScriptとかReactは
得意だからそのへんでカバーできたり、

バックエンドがやや強いフルスタックエンジニアであれば、
JSの非同期処理の理解が甘くても、DB設計とかで
カバーできたりといった感じです。

専業の場合は、こうはいきません。
というかこのレベルだったら専業を名乗れません。

キャリア初期でフルスタックエンジニアを目指すメリット

フルスタックエンジニアの最大の強みは、
領域の広さです。

これは、ベテランの場合だと専門性の浅さから、
デメリットになりがちですが、
20代などのキャリア初期であれば、
メリットに働くことが多いです。

例えば、

ポイント

  • 色々な領域を知ることができるので、技術同士の関係性がわかる
  • 自分の向いていそうな分野を見定められる
  • 高い壁や専門性の高いものはフルスタックであることでごまかせる
  • フルスタックエンジニアから専業を目指すこともできる
  • その気になれば、どの専業も狙える

フルスタックエンジニアは、
一言で言うなら、
まだ飛び立つ先が決まっていないワタリドリみたいなもので、
いつでも方向転換できる状態です。

この柔軟性が最大の強みです。
なので、キャリア初期は
積極的にフルスタックエンジニアを目指すべきです。

規模が小さいアプリならフルスタックエンジニアの方が強い

基本的に、専業エンジニアの方が、
フルスタックエンジニアよりも重宝されるまたは、
レベルが高いことがほとんどですが、
スタートアップや中小のように、
そもそものアプリケーションの規模が小さい場合は別です。

この場合、フロント、バックエンドという風に
分業が敷かれていないことも多いので、
一人で様々な領域ができるフルスタックエンジニアは重宝されます。

一つ一つのスキルが中途半端でも、
とにかく色々できるっていうのが重宝されます。

シンプルに人手が足りていないのと、
エンジニア採用に余力がないので、
既にいるエンジニアで回していくしかなく、
そんなとき、一人で複数分野できる人は、
重宝されるという感じですね。

冷静に考えて、バックエンド専門とか、
フロントエンド専門とかのようなエンジニアがおける企業は、
エンジニア採用に余力がある大企業になると思うので、
なんだかんだで、一人で複数分野やるというケースは
多い気がします。

また、個人開発とかにおいても、
両方できたほうが便利だと思います。

大抵の人はいきなり専業エンジニアになれない

そして、未経験や最初のうちは、
よほど優秀だとか、CS専攻とかではない限り、
大抵これぐらいの中小やスタートアップの企業に
エンジニアとして滑り込むことがほとんどだと思います。

そのため、ぶっちゃけた話、
フルスタックエンジニアになりたくなくても、
最初のうちはフルスタックエンジニアにならざるを得ないと思います。

私がまさにそうでした笑

基本的に未経験や駆け出しの段階で優秀な人って、
パターンが決まっています。

ポイント

  • 未経験といいつつ、実はインターンとかでゴリゴリ開発していた
  • 実務は未経験だけどCS系専攻で、それ系の研究をしてた
  • 実務は未経験だけど、競プロとかが好きかつ成績も出している

まあ、悲しいですけどこれが現実ですね。。。

このパターンの優秀な人達は、
いきなり大企業で専業エンジニアのキャリアを進むこともあると思います。

ただ、先述のようにこれはかなり例外的かつ、
優秀な人の場合です。

彼らの場合、すでに自分の中で強い部分ができているんですよね。
なので、そもそもまだ自分の中に強い部分ができていない場合は、
それを醸成しなければなりません。

その第一段階として、
まずは色々見てみたくなりますよね。

そのフェーズがフルスタックエンジニアです。

フルスタックエンジニアが優秀というのは、
大抵の場合幻想です。

ソフトウェアの複雑さと大きさは指数関数的に
増加していきますので、そこに対してどう向き合うかという問題は、
相当専門性が高い領域です。

そのため、一人の人でフルスタックに文字通り
専業レベルでカバーするのは、無理なのでは?と感じます。

そのため、フルスタックエンジニアは、
実質は中途半端なエンジニアでしかないでしょう。

もちろん、フルスタックエンジニアで、
すべてのレベルが高いという10年、20年レベルの
エンジニアもいるかもしれません。

しかし、それもフルスタックエンジニアのキャリアではなく、
専業のキャリアを選んでいたとしたら、
その分野については、遥かに高いスキルになっていたことが想像できるかと思います。

そう考えると、フルスタックエンジニアは、
やはり相対的には一つ一つのスキルレベルは低くならざるを得ない、
キャリアなのかなとも感じます。

多くのフルスタックエンジニアはすごくない

以上、フルスタックエンジニアは、
総合的に領域が広いことが売りの中途半端なエンジニアです。

しかし、これは悪いことではなく、
柔軟性が高いことです。

それに今まで専業の人のレベルが高いという話をしましたが、
世の中、専業だけどレベルが低い人も少なくありません。

正直、エンジニアのレベルは企業によっても変わってきます。

なので、フルスタックエンジニアだけど、
専業の人よりも相対的にできるという場面もあるかもしれません。

まあそういう場面がある時点で、
そのチームのエンジニアのレベルがしれているっていうのもあるのですが、
レベルが高いエンジニアの方が圧倒的に少ないので、
そういうチームに入ることも多いでしょう。

なので、中途半端といっても、
なんだかんだで差別化しやすいのも魅力の一つです。

なので最初のうちはフルスタックエンジニアとして、
様々な領域を吸収しつつ、自分の中で極めたい分野が見つかったら、
そっちの専業エンジニアを目指すのが一番いいと思います。

つまり、フルスタックエンジニアとは、

凡人がキャリア初期に通過する、
強い専業エンジニアになるための処世術であり、
ステップとも言えるかもしれません。

  • この記事を書いた人
  • 最新記事

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

おすすめ記事はこちら

Vim/Neovimプラグイン 1

プラグインをどれだけ入れるかは、その人の思想なども関係するので、一概にこれがいいというのはないかもしれません。 プラグインを全く入れない人もいれば、100個以上入れる人もいます。 ただそれでも、これだ ...

VimとNeovimの比較 2

本記事では、VimとNeovimの違いについて、解説します。 VimとNeovimの違いについては、普段頻繁にVimなどを使う方でなければ、正直、あまり気にしなくてもいいかなと思います。 ただ、Vim ...

Ruby変数やすべてがオブジェクトについて 3

本記事は、Rubyの基礎文法である、変数や真偽値、論理演算子に触れると同時に、「すべてがオブジェクト」というRubyの特徴的な思想についても解説します。 この思想は、Rubyの文法の根幹になっているの ...

4

エンジニアにおすすめの技術書 書籍学習は、エンジニアの嗜みみたいなところがありますが、 良書というものは、意外とそこまで多くもありません。 そこで本記事では「技術書マニアの筆者が厳選した技術書20選」 ...

5

エンジニアになるには? プログラミングは、専門性が高く自分一人で勉強するのが大変に感じることも多いですよね。 そこで本記事では「おすすめのプログラミングスクール5選」を特徴と、現役エンジニア目線で優れ ...

-エンジニア全般