米国でソフトウェアエンジニアになる方法
1on1やメールでご相談を受ける最頻出の話題が
「どうすればアメリカでソフトウェアエンジニアになれるでしょうか?」
というものです。これは後述しますが、いくつかの点で中々ひと言では回答の難しい質問です。ただし、本当にアメリカでソフトウェアエンジニアになりたいなら、そのための確度を大幅に上げる方法はいくつか思い当たります。
筆者について
実際に米国で2年ほどではありますがソフトウェアエンジニアをしていました。現在も米系企業の日本法人でソフトウェアエンジニアとして働いています。留学経験もなく、3流大の文系出身で、30代になってから「正攻法で」米国に渡りました。そういう点で非常に現実的な経験をシェアできると思います。筆者について詳しいことは次のnoteにまとめました。もしご興味のある方はお読みいただければ幸いです。
本当に米国に行きたいですか?
冒頭の質問に対して僕がまずお聞きするのは
「本当に米国に行きたいですか?米国でなくてはダメですか?」
ということです。よくよく考えてみれば、
英語圏で働きたい
日本で同じことをするより給料を沢山もらいたい
など、米国でなくても同じことを達成できる国は沢山あります。その場合、もしかしたら米国ではないほうが難易度が下がるかもしれません。その最大の理由は米国の就労ビザです。
米国の就労ビザ
現在、米国の就労を非常に困難なものにさせている最大の理由が、米国の就労ビザの難易度にあります。これが非常に難しい。
米国は世界で一二を争う経済大国であり、アメリカンドリームという言葉が象徴するように、ある意味では現在でも労働者の夢と憧れの場所であり続けています。これはソフトウェアエンジニアにとってもある程度正しいでしょう。Levels.fyi などを見ていただけると、ソフトウェアエンジニアがどれほどの給与で雇用されているか、そのリアルな数字を見ることができます。
H-1Bの壁
これが一因となって、現在米国の専門職就労ビザ「H-1B」は、申し込み過多により年に一度の抽選で3割程度の労働者にしか発行できない状態です。これが何を意味するか?求職者の3割しか米国でソフトウェアエンジニアになれないのではありません。現状、米国の大学・大学院に通っていない限り、外国人が直接H-1Bを取得できる可能性は限りなくゼロに近いです。これはなぜか?
米国のソフトウェアエンジニア採用は通常、
オンラインテストや電話面接による足切りが1-2回
オンサイトのコーディングテストが45-60分×5回
その他、必要に応じてBehavioral interviewやチームマッチングが複数回
で、最初のメールからJob Offer(内定)まで2-3ヶ月という膨大な時間と手間を掛けて行われます。H-1Bビザの申請を企業ができるのはこの後です。ここで、大変な苦労をして内定を出す候補者が、抽選で3割しかビザがもらえないとしたら?そもそも、優秀な候補者は他の会社も併願している可能性が高いので、ただでさえ全員はオファーを受けてくれません。そうです。企業もこんな危ない橋は渡れないのです。どうするか?H-1Bの抽選に賭けるしか渡米の見込みのない候補者は最初から門前払いするのです。
H-1B以外のビザ
そもそも米国就労ビザはH-1Bだけなのかというと、これはそんなことはありません。次の条件を満たす場合、米国でソフトウェアエンジニアとして働ける可能性はあります。その条件とは、あなたは:
米国で生まれるなどの理由で米国籍を持っている
=> そのまま就職可両親や配偶者が米国籍者、または永住者などの理由で米国永住権を持っている
=> そのまま就職可あなたは現在アメリカの大学院に通学しており、卒業後学生ビザ(F-1)を延長(OPT)してインターンできる
=> そのまま就職可。働きながら会社がH-1Bに応募するかグリーンカードをサポートしてくれるあなたは現在日系企業からアメリカに駐在員として来ており(L-1A/B、E-2ビザなど)、会社がH-1Bビザに切り替えるかグリーンカードをサポートしてくれる
=> H-1B取得後またはグリーンカード取得後に転職可あなたはアメリカ合衆国におらず、アメリカで学位を取得していないが、例えば日本で情報科学、情報工学、電子電気工学、機械工学、数学、物理学などで博士号を持っている
=> O-1ビザが出る可能性がある。その後働きながら会社がH-1Bに応募するかグリーンカードをサポートしてくれるあなたはかつて、国際情報オリンピック、国際数学オリンピック、国際物理オリンピックなどで好成績を収めた
=> O-1ビザが出る可能性がある。その後働きながら会社がH-1Bに応募するかグリーンカードをサポートしてくれる
このどれにも当てはまらない場合、やはり厳しいです。そして、ほとんどの人はこれに当てはまらないことを僕はよく知っています。
唯一の現実的な方法
お待たせしました!唯一の現実的な方法をご紹介します。これは2022年現在最も確実で、唯一の正攻法と言っても過言ではない方法です。それは米系企業のどこかの法人に入社して米国本社に転籍することです。
米系企業と言っても色々あるようなので、僕が知っている限りこの方法が確実に使える、いわゆるBig Techに限って話を進めます。
僕の知る限り、Big Techでは世界中のどの拠点に入社しても、入社後1年以上経つと全世界の別拠点への異動を積極的にサポートしてくれます。具体例を出すと、僕はアマゾンジャパン合同会社に入社し、その後米国法人のAmazon.com Services LLC (a.k.a. Amazon Lab126) に転籍しました。
このとき利用されるビザはL-1A/BというIntracompany Transferee(社内異動)ビザです。このビザが利用できる条件は
ある会社のグループ会社に最低1年以上在籍すること
余人に代えがたい能力を持っていること
です。2つ目に関しては、外国人をわざわざ本国に連れてきて、見ようによっては国民の雇用を奪うわけなので、その人を連れてくる正当性が必要という意味です。これは移民弁護士が上手に作文してくれるので何の心配もありません。事実上、1つ目をクリアすればよいということになります。
また、世界中のどの法人に入社しても最終的な結果に基本的には何の違いも生まれません。例えば僕の知る限りのBig Techでは
Job Title(例えば "Software Development Engineer")
Job Level(例えば "L5")
には互換性があります。日本でSoftware Development Engineer (L5)で雇用されれば、転籍して米国に行ってもSoftware Development Engineer (L5)です。この際、転籍に伴う物価考慮が行われるので、ちゃんと現地で最初から雇用されたのと同じ水準まで給与が引き上げ/引き下げられます。
あとは米国に転籍するだけです。僕が社内転職サイトで米国拠点に移籍したときのことを、未だに忘れることができません。米国には文字通り、数え切れないほど、比較にならないほどのポジションとヘッドカウントがあります。きっと自分が一番力を発揮できる面白そうなポジションが見つかるでしょう!後はしっかり準備をして、会社によっては転籍の際に受け入れの面接を受けるだけです!詳しい準備方法は本エントリの最後に譲ります。
どうやってどこかの拠点に潜り込むか
ここまで読んでいただければ、2022年現在、どのようにすれば米国でソフトウェアエンジニアができるのか理論的にはお分かりいただけたかと思います。では具体的にどうすれば良いのでしょう。
このエントリは日本語で書いているので、読者の99%は日本語話者でしょう。「Big Techの東京拠点」にまずは応募することをオススメするのは自然な流れです。
ここで大切なことを何点か申し上げます。これは面談でもよく聞かれることです。
Q. 東京拠点に入るのは米国本社より簡単ですか?
A. そんなことはありません。
まず、事実として、僕が知る限りのBig Techでは世界中のどの拠点でも、同じポジションかつ同じレベルでは同じ難易度の採用難易度になるように面接を構造化しています。そのために大変な労力を掛けています。
実際には、面接に絶対的な評価というのは不可能なので、ある程度の「ゆらぎ」はあるでしょう。それはどのような面接でも避けられないことです。実際の採用面接では2つ壁があります。
そのポジションとレベルで最低限満たすべき能力の壁
壁を超えた候補者が複数いた場合、ヘッドカウントに応じて相対評価
まず、1に関しては各社(各面接官)かなりの構造化がなされており、この壁を超えない限りオファーが出ることは絶対にありません。しっかり準備をしてこれを超えましょう。問題は2です。ある程度「採用しても良い」壁を超えた場合、採用されるかどうかはヘッドカウント(採用可能人数)に依存してきます。日本法人のように、特に技術者のヘッドカウントが非常に少ない傾向にある拠点では、ここが大きな分水嶺になりがちです。日本の英俊たちとたった2つの椅子を争うか、それとも米国で世界中の猛者を相手に200個の椅子のどこかに座るか…どちらが向いているかは人に依りそうです。少なくとも、これで日本法人の方が簡単とは言えないことが分かったでしょう?
もうひとつよくある質問を。
Q. ソフトウェアエンジニアで採用される自信がないから、一旦別のポジションで入って転籍するのはどう思いますか?
A. 根本的な勘違いがあります。ソフトウェアエンジニアは他のポジションの上位互換ではありません。
まず、米系企業の「ポジション」について簡単に説明します。
日系企業では採用時に「総合職採用」とか、もし区別があっても「総合職(技術)」のような区分けしかないと認識しています(あってますか?)
米系企業はこの点大きく違って、採用時に
Job Title(例えば "Software Development Engineer")
Job Level(例えば "L5")
というのが非常に細かくかつ明確に定義され、ラダー(出世階段)もそのJob Typeごとに異なります。つまり、マーケティング担当で入社した人はエンジニアには簡単になれないのです。これは広義のエンジニアに関しても同様で、たとえばサポートエンジニアも狭義のソフトウェアエンジニアも同じ「エンジニア」ですが、両者に互換性はありません。
質問のケースは、この狭義のソフトウェアエンジニアは難易度が高いから、"難易度の低い" 別のエンジニア職で入社して社内でジョブチェンジを図るのはどうかという質問です。これはまったく正しい認識ではありません。
ソリューションエンジニアもサポートエンジニアも、明確な職責が定義されており、それは狭義のソフトウェアエンジニアには成し得ない困難なものも含まれています。たしかに狭義のソフトウェアエンジニアのコーディングテストはソリューションエンジニアのそれよりは難しいでしょう。ただそれはコーディング能力に限ったことです。ソリューションエンジニアの面接ではもっと別の能力がちゃんと査定されています。つまり、これは腎臓と肝臓に優劣がないのと同様に、単に別の役割が与えられているに過ぎないのです。まったく同様のアナロジーで、腎臓に肝臓の代わりが務まらないのと同様に、両者を簡単に行き来することはできません。なので"簡単そうだから"という理由で、自分の思っているのと違うポジションで入社を試みることはおすすめしません。そもそもそのようなことは簡単ではないですし、貴方の経験は思った以上にレジュメに影響があります。
拠点は日本に限らない
ところで、最初に就職する拠点は何も日本に限りません。先程書いたように、ビザの要件では世界中のどの拠点でもよいのです。
例えば、Amazonはカナダでの採用を非常に強化しているようです。
もしリクルーターが、相手が北米以外に住んでいることを認識しているにも関わらずメールを送ってきている場合、それは就労ビザと引っ越し費用などを全て当然サポートするつもりがあると考えてよいです。このような費用は採用のコストからすると誤差であるからです。
カナダで採用が活発な理由は、
米国よりもビザが出やすい
米国と時差がない
ことが理由として考えられます。外国人を連れて来やすいことから、最近はカナダではVancouverでもTorontoでも大規模な開発を米国に先んじて行うケースも増えているようです。僕の知人でも、カナダで採用されてから2-3年で米国転籍した人もいますし、そのままカナダが気に入って永住した同僚もいます。まずカナダを目指すのは面白い選択肢だと思います。
就労までの流れ
実は以前もこれとほとんど同じようなエントリを書きました。ここで書いた内容は、現在も大きくは変わっていないと思います。
しかしその時ひとつだけ書かなかったことがあります。それは具体的な就活の方法です。上記エントリでは、
というようなコメントを貰いました。
たしかに「ビザの難しさの前には個人の努力なんて誤差の範囲」ぐらいに思っていたので、当時のエントリではその部分を省略してしまいました。なぜなら、個人で頑張れる部分を個人の努力で補うのは夢を叶えるのに当然の前提条件だと思ったからです。
僕は全くの凡人です。世間でよくあるような、実はトップ大学を卒業し、海外留学も経験し、コーディングテストなんか楽勝で突破して世界に冠たる企業に楽勝で入社…には程遠い人間です。僕はAmazonに入るときも3年前に1回落ちていますし、英語は27歳から勉強を始めたし、米国転籍の時点では3流大学の文学士です。H-1Bならソフトウェアエンジニアのビザ条件を満たせないぐらいの低空飛行です。それでも面接に受かったのは、必要な対策を講じたからに他なりません。ここではそれについて少しだけ書こうと思います。
学位
最初に書いておくと、このエントリで解説したL-1A/Bによる転籍を狙う限りにおいては、学位はそれほど重要ではありません。しかし、ないよりあったほうがずっとよいのもまた事実です。
米国は日本よりずっと学歴社会です。ここでいう学歴とは日本のそれとは少し違い、学校名よりも学位が大切です。もちろん、米国でも名門校の方がレジュメの通りはよいのですけど、それでも企業の応募要件にもビザの要件にも学校のランクなどはひと言も出てきません。必要なのは関連学位です。
ソフトウェアエンジニアの場合は、いわゆるSTEM(要するに理系)の学位を持っていれば最低条件を満たすことが多いです。米国では就労する職種と応募者の学位が、日本よりもずっと密に紐付いています。学位が事実上の免許のように機能しています。
僕のように文学士などというエンジニアとはコサイン類似度が-1に近いほど離れている学位は、その業界に飛び込む際に大きな問題になります。端的に言って履歴書が通る可能性が下がります。これは就労経験が短ければ短いほど大きなハンデになります。関連学位がなくても就労経験が長ければ、履歴書に目を留めてもらえる可能性が上がります。逆に言えば、履歴書さえ通ってしまえば、あとは非常にフェアな勝負が待っています。これについては後述します。そして採用された後は、移民弁護士が何とでも上手に作文してくれるので、それほど心配する必要がありません。
コーディングテスト
米系企業で狭義のソフトウェアエンジニアとして採用されるためには、コーディングテストを避けて通ることは絶対にできません。技術者の採用面接で何が行われているのかを知るために非常によい本があります。
この本は原題 "Cracking the Coding Interview(コーディング面接をハックする)" というタイトルが意味する通り、いわゆるBig Techの技術面接を突破するための方法が沢山書かれています。この本は米国の大学生はもちろんのこと、米国でソフトウェアエンジニアとして職を得ようとする人で読んでいない人はいないほどのバイブルとされており、実際にリクルーターの何割かは「これ読んで準備しておいて」とさえ言ってくるほどです。
ここで非常に重要なことは、心構えです。面接に通る唯一の方法は、面接対策をすることです。
これは受験勉強とまったく同じです。技術面接というのは、幸か不幸か非常にシステマティックに作られています。傾向があり、それにきっちり対策を立てられれば、誰でも受かることができます。何回も言いますが、3流大学の文学部卒の僕が、オファーを受諾した会社も辞退した会社も含め、何社も内定を勝ち取っています。これはひとえに、コーディングテスト対策をしたからに他なりません。
現在のBig Techで非常によくあるパターンが
電話面接やオンラインテストでは、45-180分使って1〜3問ぐらいのアルゴリズムクイズを解く。
オンサイト(実地)面接では、ホワイトボードの前で1回45分のコーディングテストを合計5-6人と行う。
オンサイトのコーディングテストのうち、1つないし2つはシステムデザインについて問われるかも知れない。
という感じです。このうち圧倒的に対策が立てやすく、絶対に落とせないのがアルゴリズムのコーディングテストです。これは典型的には次のような問題です。
Q. Given a boolean 2D matrix, find the number of islands.
A group of connected 1s forms an island.
For example, the below matrix contains 5 islands
{1, 1, 0, 0, 0},
{0, 1, 0, 0, 1},
{1, 0, 0, 1, 1},
{0, 0, 0, 0, 0},
{1, 0, 1, 1, 0}
ここでは、入力として2次元配列が与えられ、要素に0か1が入っている。0は海、1がつながっている部分は陸(つまり島)と考えられる。与えられた入力に「島」がいくつ含まれるかを出力として返す関数を実装せよ、という問題です。
これは難易度としてはEasyもEasyという感じで、解けるのはもちろんのこと、次のような分析を必ず求められます。
計算量はどのくらいか?(Big-O-Notationで答える)
改善の余地はあるか?あるいは別解は?(深さ優先探索で解くのが一番シンプルだが、Disjoint Setでも解ける)
難しいですか?簡単すぎますか?これ、共通テストの数学と同じではありませんか。つまり対策をしている人は解けて当然だし、何もやっていない人は解けるわけがないのです。
このようなコーディングテストがソフトウェアエンジニアの素質を見極めるテストとして適しているか否かは、いまだに議論のあるところです。しかし、少なくともタクシーの中にゴルフボールが何個入るかフェルミ推定するよりはプログラマの力を判定することができるのは確かでしょう。
コーディングテストの対策はLeetCodeやGeeksForGeeksで行うのが黄金のパターンです。Big Techでソフトウェアエンジニアを目指していてどちらも聞いたことがないという米国の大学生はおそらく存在しないでしょう。
あるいは、アルゴリズムについてまったく自信がない人は夏休みを使ってEducativeなどのコースをひとしきり解いてみるのもよいでしょう。
数ヶ月スパンで準備のできる人は、社会人になってから米国に留学し、いまはNianticでソフトウェアエンジニアをされているTatsuya Nanjoさんのこのスライドをいつもおすすめしています。ここには面接を受ける数ヶ月前からどのような勉強を始め、どのような教材を使い、どのように本番を迎えるかといった心構えが克明に示されています。
また、現在はGoogleでソフトウェアエンジニアをされているKohei Araiさんが同社に内定をもらうまでに解いたLeetCodeの典型問題なども非常に参考になるでしょう。
システムデザイン
システムデザインに関しては "Grokking the System Design Interview" というバイブル的なコースがあります。
これに関しては、単に面接対策にとどまらず、これまで非常にシンプルな構成のウェブサイトしか作ったことのないソフトウェアエンジニアが大規模で複雑な要件のあるウェブサイトをどのように作れば良いのか考える非常によいきっかけになるでしょう。
また、最近の書籍では「データ指向アプリケーションデザイン」がこの分野のバイブルのひとつと考えられています。これも、単なる面接対策にとどまらないソフトウェアエンジニアの血肉となる良書だと思います。
最後に、どれだけ机上の勉強を繰り返しても実際の面接でアガってしまってどうにもならないという人は「モックインタビュー」をしてくれるサービスがいくつかあります。
サービスによっては有料でモックインタビューを受けたり、あるいは自分も相手のモックとなることでお互いに助け合うようなものもあるようです。あるいは、思い切ってBig Techで働く知り合いにモックインタビューを申し込むのも手です。僕も実際にやってもらったことがありますし、案外快く引き受けてくれることがあります。
まとめ
思いがけず長文になってしまいました。率直にどう感じましたか?難しそうですか?
僕は、こんな簡単なことで世界に通じているんだとワクワクしますね。僕は受験勉強はからっきしできませんでした。だって5教科も7教科もありますよね。けど、ことこれに関しては、コンピュータ・サイエンス1教科ですよ。大好きなコンピュータの勉強たった1教科だけ。あまりにも楽勝です。
運を天に任せるなら、その前に人事をつくす必要があります。少なくとも「就労までの流れ」に書いた部分は、全て、1日たった1-2時間の努力を2-3ヶ月継続するだけで埋めることができるんですよ。こんなコスパのよい投資はみたことがありません。健闘を祈ります。一緒に働きましょう!