なろう!フルスタックエンジニア

初出: TechReport 2018.04

少なくとも日本国内(の私の Twitter)では、いわゆる大喜利ネタとして定着した感じのある「フルスタックエンジニア」というキーワードですが、今回はあらためてこのフルスタックエンジニアについて考えてみようと思います。

フルスタックエンジニアという単語そのものは、2013年6月に書かれた Publickey の記事54によると、海外とりわけ米国のスタートアップ企業における求人広告に登場したようです。基本的には、スタートアップ企業の立ち上げステージにおいて必要とされる、ビジネスに必要とされる以下のようなスキルを持つ人材を指します。

  • Web アプリケーションの開発

  • スマートフォンアプリケーションの開発

  • Web システムの運用

  • Web やスマートフォンアプリを含むサービス全体のアーキテクチャ設計

  • 情報システム

それが日本国内のスタートアップ等でも求人広告に利用されるようになり、それを取り上げたブログ55などを通じて認知度が上がっていったようです。

由来

フルスタック──すなわち full-stack は、いわゆるコンピュータサイエンスにおけるスタック(stack)が積み重なっているというイメージの英単語です。おそらく由来としては、IT 業界(というよりWeb 業界)において、OR マッパー(等の DB アクセス)や表示テンプレート処理など一通りの機能を備えたウェブアプリケーションフレームワークを指して「フルスタック」だと表現していたものが、フルスタックエンジニアという言葉が発生する背景となったのでは無いかと思います。

具体的には Ruby on Rails が、様々なライブラリを設定で組み合わせる文化に対抗して、単独で完結して規約に従い自動で設定される事を売りにするために積極的に使っていたようです。Rails の場合には、単純にサーバサイドの実装に必要なコンポーネントを備えただけでなく、クライアント JS 側に対する様々な支援機能も備えていた事が、より「フルスタック」性を高めています。もっとも、その後 Rails をはじめとするフルスタック型の重厚なフレームワークと、自分自身の機能を最低限に保ち必要に応じてプラグインや別のライブラリ等を使えば良いという軽量フレームワークの流れが来た事も記憶に新しいところです。

このフルスタックという単語が英語圏でどれくらいの温度感を持つのかは判りませんが、この「これさえあればひととおり」というイメージが、スタートアップの初期で必要とされる人材像にマッチしたため、それなりに広く使われ日本語圏にも登場しました。そもそもが Web 系スタートアップということもあり、スマートフォンアプリを含む Web サービスを立ち上げるために必要なエンジニアスキルが期待されているわけです。

その後の大喜利展開は皆さんご存知の方も多いと思いますが、主に使い潰される社畜的なイメージであったり、どこまでできたらフルスタックと名乗れるのか見たいな話だったりで、Publickey の記事から5年近くたっても Twitter 検索では日々フルスタックネタが投稿されているのが見られます。

フルスタックってどうよ

日本における「フルスタックエンジニア」はざっくり二種類の方向性があるかなと感じます。

一つは役割としてのフルスタックエンジニアで、初期のスタートアップに代表される人が少ない組織において、複数の技術領域を掛け持ちで担当している(担当せざるを得ない)エンジニアです。とはいえ創業間もない頃ならまだしも、本来ならば採用を強化しなければいけない段階においても人不足によってそこから脱却できないということが少なからずあるようで、フルでスタック(stuck:立ち往生)するエンジニアなどと揶揄されたりします。

もう一つはスキルとしてのフルスタックエンジニアで、フロントサイド(ブラウザ JavaScript やスマートフォンアプリ)からサーバサイドまでの開発スキルと、インフラの構築・運用スキルまでを持っていれば、ひとまず当初の意味としてのフルスタックであるとされています。実務上の必要性から、小企業の情報システムに関するスキルあたりまで求められる事が多いでしょう。これは、昔から言われる「T 型人材」のパワーアップ版とも言えますし、一方で手をきっちり動かせるシステムアーキテクトの領分でもあります。

この二つは明確に分ける事に意味は無く、フルスタックのスキルを持つ人(あるいは持たない人)が、必要に応じてフルスタックの役割を任されているわけです。

やっぱりフルスタックって格好良いですよね、名乗ってみたいですよね、じゃあフルスタックエンジニアになるには、あるいはフルスタックエンジニアと名乗るにはどうすれば良いか考えましょう。

大喜利フルスタックエンジニア

ところで、Twitter などで冗談で取り上げられるフルスタックエンジニアには、以下のようなスキルが求められています。

  • ハードウェア

  • コンピュータサイエンスのすべての分野に精通56

  • 量子コンピュータ

  • デザイン、作曲・作詞

  • 電磁気学、数学

  • 営業、顧客対応

  • 地鎮祭

  • イベント運用、音響操作

  • 筋肉(ラックマウント能力)

  • 料理、焼きそば

  • 会社経営、総務、財務

  • 法律、政治

  • 農業

ここまでいくと空想上の TOKIO じゃねーかという感じですが、裏を返せば、これらを必要とする場面があったり、中途で取りたい凄腕エンジニアに期待したい事であったりするわけです。もっとも「それ神社に任せろよ」という地鎮祭みたいなものも複数人から上がっていて、なるほどと思わされます。苦労したんでしょうかね。ざっくり分類すると、以下の3つぐらいに分ける事ができそうです。

  • コンピュータサイエンスの範疇

  • 一般的なコンピュータサイエンスの範疇を超えるが、IT 企業でエンジニアが知っていると相乗効

果が得られるもの

  • そもそもエンジニアに担当させる理由が薄いもの

3つめは完全にネタというか、実際にそういうものを求めた組織があったり無かったりするんでしょうが、それはさておき2番目の領域に含まれそうな、たとえばデザインであったり、法律や政治であったり、営業・顧客対応、会社経営といった領域は、何らかの形で IT 技術と組み合わせて価値が高まる場面が出てきます。なお、いわゆる業務知識と呼ばれる部分は人それぞれなので、この議論からはひとまず外します。

フルスタックエンジニアを目指すに当たっては、この1番目と2番目をバランス良く、世の中の需要に合わせてスキルを揃えていくとよさそうです。

必要なスキル(コンピュータサイエンス領域)

一般的な Web サービスであれば、まず中心となるのがウェブアプリケーションの開発能力、スマートフォンアプリの開発能力、フロント JS の開発能力、サーバインフラの構築・運用能力の4本柱が基本となるでしょう。サービスによっては、フロント JS とスマートフォンアプリは必要が無い事もありますが、そのような場合はそもそも「フルスタックエンジニア」とあまり呼ばないため、少なくともどちらかはできる必要がありそうです。

スマートフォンアプリについては、Android と iOS でシェアのほとんどを占めているので、その二つができれば良いわけですが、ウェブアプリとしてスマートフォンアプリを実装できる Apache Cordovaだとか、iOS・Android どちらも.NET 技術で開発できる Xararin のようなものも出てきているため、それらを覚えておくとひとまずフルスタックに早く近づけそうです。

サーバインフラの運用も、クラウドネイティブな2018年ですのでもちろんパブリッククラウド上で安定運用ができれば問題ないでしょう。

さらなる広い領域を押さえた格好良いフルスタックエンジニアを目指すのであれば、ハードウェアや、ソフトウェアの低レイヤーの部分を狙っていきましょう。今はまさに IoT ビジネス立ち上がりの時期であり、それらがわかるエンジニアの人気はどんどん上がっています57。

新しい技術領域もまたどんどん登場しています。ガートナーのハイプ・サイクル58を眺めると、機械学習系の領域はちょうど過剰な期待のピーク紀を迎え、実際の事例に収束する幻滅紀を迎えています。これから来るものというと、筆者自身も推しているサーバーレスであったり、量子コンピュータ、会話型ユーザインターフェース(VUI)あたりは押さえておいて損が無い領域と思います。

必要なスキル(コンピュータサイエンス外)

コンピュータサイエンスと直接関わりが無くても、ビジネスをする企業におけるエンジニアとして、おさえていると「つぶしがきく」領域があります。

間違いが無いのが会社の運営に必要な部分で、例えば経理/財務の話は自分で持つサーバやネットワーク機器の扱いにも関連していきます。簿記資格を取って仕訳を行う必要は無くとも、基本的な減価償却の考え方などは情報システムの業務知識の一つとして知っているべきです。

デザインに関しても、もちろん餅は餅屋ですから実際にデザインをするのはそのセンスを持つデザイナーが行うべきです。ただそのデザインをアプリケーション上で実装する必要がありますし、逆にアプリケーション側の制約によってデザイン側を修正する必要があれば、デザイナーとデザインの世界観で話せればスムーズに議論が進みます。

要するに、「自分がそれを担当できるほど詳しく必要は無いが、その領域の世界観を理解し、その世界の言葉で会話ができること」が重要です。

はったり駆動フルスタックエンジニアのススメ

よく考えると、この「自分がそれを担当できるほど詳しい必要が無いが、その領域に対して一定の理解がある」ということは、コンピュータサイエンスの領域でも持ち込む事ができます。

人生の時間は有限なので、全ての技術領域で十分に活躍できるほどスキルを引き上げられる人はそれほど多くありません。ですが、数多くの技術領域に対して、「その分野で今できる事は何か、それにどれくらい掛かるのか大変なのか、何は難しいのか、あるいは現状では実現できないのか、より深く知るためにはどうすれば良いか」を浅く広く知る事はできます。

IT の発展によって、今は「学習の高速道路」が敷かれたと言われます。もちろんその先での大渋滞として一流になれるほどでは無いエンジニアの大量発生も取り沙汰されますが、フルスタックエンジニアを目指す上で全ての領域で一流である必要は薄く、必要になってから高速道路に乗るので十分です。

そこで、普段業務で使っていない技術領域についても個人的に「遊んで」おいて、高速道路の入口まではたどり着いておきます。そうすると、その技術で「何がどこまでどれぐらいでできるのか」という勘が働いてきます。そうしたらしめたもので、その技術をフルスタックエンジニアのポートフォリオに入れてしまいましょう。実は世に言うフルスタックエンジニアの大半は、普段から遊んだ事のある技術の幅の広さによって「はったり」を言っておいて、実際に業務で必要になってから高速道路でつじつまを合わせる「はったり駆動」であることが多いのではないかと考えています。

つい先日、「知識の壁」「行動の壁」「気づきの壁」「技術の壁」「習慣の壁」という段階を明確に示した図が SNS59で紹介されていましたが、はったりをきかすために普段から「遊んで」いれば最初の2つか3つの壁を既に乗り越えているわけで、業務として必要になってから「技術の壁」は超えれば良いというわけです。

最初の知識の壁を越えるために、様々な領域の勉強会などに参加してみるのも良いです。そもそも知らない事に対しては努力を始められないし、はったりも言えませんからね。

フルスタックでも基礎がだいじ

一流の一歩手前まで学習の高速道路が敷かれていると言っても、そこを最高速度で走るために必要なものがあります。それはコンピュータサイエンスの基礎知識です。あるとないとでは、原チャリとスポーツカーぐらい違います。

基礎知識といっても、別にプログラミング言語の数学的構造や、シリコンの物性を知る必要まではありません。それらは「そういう分野がある」ということまで知っていれば良いですし、それらにもまた高速道路があります。

その一方で、ある程度中身に踏み込んで理解しておくべき分野があります。

  • 情報理論、データ構造とアルゴリズム

  • プログラミング言語における、関数型や型付け有無など最近のトレンド、向き不向き

  • 分散コンピューティング、並列コンピューティング

  • IP をベースにしたコンピュータネットワークの仕組みと、現在の発展方向

  • 暗号理論

  • OS の仮想化技術、コンテナ化技術

  • ID と権限の管理、連携技術

これらの分野の知識は、あらゆる分野の「高速道路」においても倍掛けで効いてきます。これら基礎知識の領域にも高速道路は敷かれているわけで、是非追いついておくのがお買い得です。

フルスタックエンジニアを目指そう

こうやって様々な技術領域に触れ、遊んでおくと、急に新しいチャンスが来たときにそれを掴む事ができるようになります。

それは会社として相談された新しい案件かも知れないし、プロジェクト内の役割に過ぎないかも知れないし、あるいは転職のお誘いかも知れません。あるいは自らチャンスを作り出す提案を周りに仕込んでいく事もできます。

周りからできると思われている既存と同じ仕事をただ受けるだけのエンジニアと、自らできる事を(はったり交えてでも)増やし組織全体の可能性を広げられるエンジニアで、待遇はおおきく変わってきますし、もし変えない組織に居るのであれば今すぐ転職を検討すべきです。後者のエンジニアは常に業界全体で不足しています。

ことソフトウェアエンジニアという業界において、技術的な停滞はごく少数を除いて低待遇への高速道路です。いいですか、いまどきの Web アプリケーションのパターンを提示して大きな影響力を今なお持つ Ruby on Rails が登場して14年、Amazon が EC2をリリースして11年、ビッグデータ処理の幕開けとなった Apache Hadoop のリリースから6年、HTML5の勧告から3年半、今もっとも広く使われている(使われ始めている)言語である ECMAScript(JavaScript)に至っては、仕様は毎年6月に改訂されブラウザやサーバサイドランタイムの実装速度と競い合っているのが、現在のコンピュータサイエンスにおける速度感です。この流れに対抗していくためには、フルスタックエンジニアという生き方は、日常的に大喜利で揶揄されるほどひどいものではないと思います。

どうです、あなたもフルスタックエンジニアとして生きませんか?