先日、全ての開発者が学ぶべき5つの言語という翻訳記事を投稿させて頂いたのですが、「プログラミング力を伸ばす」という観点においては記事主の方のご意見に大きな異論はないものの、これからエンジニアを目指す初学者の方や経験の浅い方が「日本のWeb業界でキャリアを爆速で成長させるための最適な習得順序」としてはまた別の組み合わせが必要だと思いますので、この記事ではそれに関する私の考えを簡単に述べさせて頂きたいと思います。
(注:主にバックエンドエンジニアの方を対象としています)
結論
- 未経験から日本のWeb業界でキャリアを爆速で成長させるためにはRuby -> Go -> Scalaという順序が最適である。
- 以下その理由について説明します。
Ruby
初学者の方がプログラミングスクール等を経由してWeb業界にエンジニアとして就職する場合に、言語選択において最も重視すべきポイントは下記の3点です。
- 求人数
- 日本語情報量
- ポートフォリオ(作品)の作りやすさ
日本のIT業界における「業務未経験者可」の求人で最も多いのは「Java」と「PHP」ですが、Javaは主に「SIer業界」で多く使われている言語であり、この言語を最初に学んでも「SES系企業以外の就職口を見つけるのは難しい」という問題点があり、さらに動的型付け言語と比較した場合の「初学者にとってのポートフォリオの作りやすさ」という点に関してJavaは大きく劣ります。
PHPに関しては、上記の3条件に関してはほぼRubyと同等であり、求人数に関してはむしろRubyを上回りますので最初にPHPから始めるのも十分に妥当な選択だと思われますが、PHPを使用している会社のレベルがピンキリのため、「会社やチームによってコードのレベルのばらつきが非常に大きい(テストを書いていない or パッケージマネージャを使用していない等)」という問題点を考慮すると、「WebフレームワークがほぼRailsで統一されており、モダンな開発方式が採用されている可能性が高い」Rubyの方が、キャリアの最初の選択としてはより適切であると考えます。主要プログラミングスクールのカリキュラムのメイン言語にRubyが多いという点も重要でしょう。
Web業界で使用されている主要な動的型付け言語としては他に「Python」と「Node.js」がありますが、バックエンドの求人数という点ではRubyとは差がありますので、初学者の方がこの2つのどちらかをあえて選択する理由は特にないと思われます。(Python+Djangoの開発案件は増えていますがRubyほどではないですし、Node.jsは明らかに人気が下り坂です)
モダンな開発を行っている企業でRuby(とRails)を使ったバックエンド開発を経験することで、主に下記の知見の習得が期待出来ます。
- 動的型付け言語の知見
- オブジェクト指向言語の知見
- Webアプリケーション開発の知見
- HTTPやREST APIに関する知見
- Webサーバとアプリケーションサーバの知見(NginxやPuma等)
- RDB(MySQLまたはPostgreSQL)の知見
- パッケージ管理の知見
- 単体テスト/統合テストの知見
- セキュリティに関する基本的な知見
- 基本的なCI/CDの知見
- クラウド(AWSまたはGCP)の基本的な知見
- GitHubによるタスク管理やコードレビューの知見
- Scrum等によるチーム開発の知見
キャリアのこの段階で重要なのは「モダンな開発を行っている企業で十分な基礎固めを行う」ことです。レガシーな開発を行っている企業で働いても爆速での成長は全く期待出来ませんので、当然のことではありますが最初に就職する会社のレベルは高ければ高いほど望ましいということになります。
良質なポートフォリオを作成して良質な企業に入社することがキャリアの最初の段階では非常に重要です。
Go
キャリアの最初期においては動的型付け言語で開発経験を積む方式で問題ありませんが、いつまでも動的型付け言語ばかり使っていてはスキルやキャリアの大幅な進展は望めません。
私の個人的見解ですが、RubyとRailsもしくはその他の動的型付け言語を使った開発は1年も経験すれば十分だと思います。(逆に言うと、その1年間で「十分」と言えるほどに成長出来ていないようであれば、その人は「怠けていた」ということになるでしょう)
動的型付け言語の次は必然的に静的型付け言語ということになりますが、全ての開発者が学ぶべき5つの言語ではJavaが推薦されていましたが、現在の日本のWeb業界のトレンドから考えると、いま最も価値の高い静的型付け言語は「Go」であるというのが私の見解です。
Goの言語仕様は貧弱(特にジェネリクスが存在しないのがつらい)なので、言語そのものとしては私はあまり好きではありませんが、「マイクロサービス方式で開発を行う際のファーストチョイスの言語になっている」という事実は非常に重要であり、日本のWeb業界においてはマイクロサービス方式の開発スタイルが今後さらに増えていくと思われますので、Goを習得することの価値はしばらくの間は高止まりし続けると考えて良いでしょう。(ちなみに私が現在お世話になっている会社様で使用しているメイン言語はGoとPythonです)
日本のWeb業界におけるGoの価値が「マイクロサービス」の流行と大きく関連している以上、Goを使用している会社に転職する際には「マイクロサービス方式での開発を行っているチームにジョイン出来るかどうか」を重視する必要があるということになります。逆に言うと「マイクロサービス方式での開発を経験出来ないようであればGoの魅力は半減する」と考えて良いと思います。(そういう案件が見つからない場合は「マイクロサービス方式の開発が行える案件への踏み台」として、とりあえず一般的なGo案件に参画しておくというのもありでしょう)
Go(とマイクロサービス方式)による開発を経験することで、主に下記の知見の習得が期待出来ます。
- 静的型付け言語の知見
- コンパイル言語の知見
- ポインタやインターフェイス等の知見
- 並行プログラミングの知見
- マイクロサービス方式での開発手法に関する知見
- DockerやKubernetesの知見
- gRPCとProtocol BuffersとHTTP/2に関する知見
(マイクロサービスはKubernetesを前提としているわけではありませんが、マイクロサービスの基盤として今後はKubernetesが標準になっていくことはほぼ確実な情勢です)
もし可能であれば、最初のRubyの開発においては大抵の場合バックエンドのインフラはAWSだと思いますので、2社目ではGCP環境を経験出来るとさらに望ましいでしょう。(Go + マイクロサービス方式の開発に関しては、AWSのKubernetes対応が遅れ気味ということもありGCPを使っている会社がそこそこ多いので、Go案件でGCPも同時に経験するチャンスは十分にあると思います。Go + GCP + Kubernetesという技術スタックの代表的な企業はメルカリさんです)
キャリアのこの段階においては、動的型付け言語と静的型付け言語の違いと、双方のメリット/デメリットを理解することが非常に重要です。
Scala
現在のWeb系エンジニアにとって関数型言語は避けて通れませんし、もし皆さんの身近にいるベテランのバックエンドエンジニアでまだ関数型言語を経験していない人がいるならば、「その人は成長をサボっている」と考えて差し支えありません。
ちなみに関数型言語もしくは関数型開発スタイルの定義は「純粋関数だけを使ってプログラムを構築すること」ということになり、そのメリットは「テスタビリティが高まる」「可読性が高まる(コードを理解しやすくなる)」であると言われていますが、少なくとも私自身は「静的型付け関数型言語で書かれたコードの可読性が高いと思ったことは一度もない」です。
いわゆる「参照透過性」という考え方により局所的な可読性が高くなる場合はありますが、それ以外の部分の文法的な難易度により、その程度の可読性の向上は簡単に相殺されてしまうので、エンジニアとして「解読することの楽しさや書くことの楽しさ」は非常に感じますが、他の言語ではなくScalaを使うことによる開発メリットは「開発者が楽しめる」という以外には特に無いというのが私の認識です。
(私が以前Scala案件に参画していた際の勉強メモ(悪戦苦闘の跡)は「Scala関数型デザイン&プログラミング」を13章まで学習して練習問題を7割ほど消化したので要約&振り返ってみました。にまとめてあります)
ではなぜそういう種類の言語であるScalaをお薦めするかというと、「Scala案件が以前と比較して増えたこと」および「関数型言語を使用する案件は言語以外のテクノロジーに関しても非常にレベルが高く魅力的なものを使用しているケースが多く、大抵の場合は単価もかなり高い」という点にあります。例えば私が年収1200万円のオファーを頂いた企業様のメインの開発言語はScalaでした。
moffersで年収1200万円のオファーをゲットしたエンジニアの業務経歴を公開します
関数型言語やScalaが実務で全く使われていなかったり、あるいは単価が低いのであれば学ぶ必要は全く無いのですが、上記のように魅力的な案件がそこそこあるので、そういった案件に参画する可能性を上げておく上でScalaを経験しておくことはメリットがある、ということになります。
Scalaを関数型で使用する方式の開発を経験することで、主に下記の知見の習得が期待出来ます。
- 静的型付け関数型言語の知見
- ジェネリクス(型パラメータ)に関する知見
- 純粋関数、参照透過性、パターンマッチ、代数的データ型、圏論、モノイド、モナド等に関する知見
- 高階関数、map/flatMap/fold/reduce等に関する知見
- 部分適用、カリー化、関数合成等に関する知見
- 共変/反変/上限境界/下限境界等に関する知見
- FutureやPromiseに関する知見
- 再帰処理に関する知見
- JavaやJVMに関する知見
また、Scalaを採用している現場では、DDD(ドメイン駆動設計)による開発を行っているケースも多く、DDDあるいはクリーンアーキテクチャ等の設計手法の知見を得る上でもScala案件を経験することは有用だと思います。
その他の関数型言語であるHaskell、Lisp、Clojure、Elixir、Erlang等は、求人数がScalaと比較するとかなり少ないため実務経験を積む対象として考えるのは難しいので、初期のキャリアプランからは除外して良いと思われます。
Ruby->Go->Scalaの後は
この段階まで来ると相当スキルも上がっていると思いますし、「動的型付け言語」「静的型付け言語」「静的型付け関数型言語」、そして可能であればAWSとGCPの両方を経験出来ていると、この後の案件は「ほぼ選び放題」という状況になると思いますので、その方の好きな方向にさらにどんどん爆速で成長していけばよいと思います。
目安としては、キャリアの初期、おおよそ3年程度でこの段階まで来ることが望ましいと思われます。(意欲の高い人であれば十分に可能です)
逆に、最初の3年間を「動的型付け言語による開発」だけで過ごしてしまった場合、その後の成長速度はあまり期待できない状態になってしまう可能性が高いでしょう。
また、「正社員」として数ヶ月や1年ごとに職場を移る行為は「職歴がどんどん増えてしまうのでジョブホッパーと判断され正社員転職で将来的に不利になる」というリスクがあるため、職場を頻繁に移動することを前提とする場合は早い段階でフリーランスになることをお薦めします。正社員とフリーランスのメリットとデメリットに関しては下記の記事に記載してあります。
転職ドラフトで1000万円超えのオファーを2度貰ったエンジニアが「評価された理由」と「正社員で働く意味」について考えてみました。
まとめ
2018年の最先端バックエンドエンジニアに必要なスキルについて考えてみました。という記事でも触れましたが、私は過去に下記の言語をそれぞれ数ヶ月以上実務で使用した経験があります。
- Rust
- Elixir
- Scala
- Kotlin
- Java
- Go
- Python
- Ruby
- PHP
- Perl
- JavaScript
- TypeScript
- ActionScript
- VC++
- C#
- Objective-C
- VB.NET
- Delphi
この記事で述べた内容は、これらの経験や現在のWeb業界の現場の状況を踏まえての見解ですので、そこそこ信頼性は高いと考えて頂いて差し支えないと思います。
色々な言語を使うことはそれ自体が面白いのですが、残念ながら「キャリアにとって大きく役に立つ言語とそうでもない言語が存在するというのは厳然たる事実」なので、キャリアの初期段階ではなるべく「優先順位の高い言語から経験していく」ことをお薦めします。
個人的見解ですが、言語とは「技術的に面白い開発案件にジョインするための"チケット"のようなもの」と考えた方がよいでしょう。
例えば「静的型付け言語」を必要とする非常に面白い案件があっても、静的型付け言語の経験が無い人は参画可能性が低くなってしまいますので、「どの種類の言語でも対応出来る」状態にしておくことは、皆さんのキャリアを爆速で成長させる上での大きな助けになると思います。(空前のエンジニア不足という状況ではありますが、技術的に面白い案件は常に「買い手市場」です)
「一つ一つの言語でもっとしっかり経験を積んだ方がいい」というご意見もあると思いますが、もし技術不足を感じたら「成長してからまた戻ってくればいい」だけですし、そもそも一つの言語に何年もかかりっきりになるのはコンフォートゾーンから出る勇気が無いだけというのが私の意見です。
おまけ
Youtubeの方で、Web系エンジニアやWeb系エンジニアに興味のある方たち向けの雑食系エンジニアTVというチャンネルをやっています。もしご興味ございましたらチャンネル登録してみて頂けると大変嬉しいです。
また、2019年から「雑食系エンジニアサロン」というオンラインサロンも始めました。
Twitterの方でも「Web系エンジニアのキャリア戦略」を中心に色々と情報を発信しておりますので、もし宜しければフォローしてみてください。@poly_soft