Achievement unlocked: アメリカ国内で H-1B のまま転職した(1/2)
8/7/2017, 6:32:47 PM
Achievement unlocked: アメリカ国内で H-1B のまま転職した(その1/2)
0. はじめに
前職でそのサービスを作り始めて7年半、2013年4月に渡米して4年と1/4が経ち、そろそろ新しいチャレンジをしたい、チャンスがまだあるうちに、というわけで転職活動をしておりました。8月から新しい職場で新しい仕事を始めます。
前職の会社、経営陣、社員の皆さまには、自分の書いた汚いコードをこんなに立派なサービスに仕立て上げて、世界4カ国で数十人を雇用し、200万以上のアカウントが作られるまでに育て上げてもらって、感謝しかありません。ありがとうございました。
さて、せっかくなので忘れないうちに、H-1B ビザ保有者のアメリカ国内での転職はどういう流れで進んだのか、書き留めておこうと思います。検索したんですが、あまりこれだって例が見つからなかったので、誰かの役に立てばと思います。
なお前半は私の転職体験談なので、H-1Bの転職で必要な書類とかの概略だけ知りたいという場合は主にその2から見ればよいとおもいます。
1. 前提
コードを書くことについては、転職時点で主に以下のような感じでした。
- Perl 5 (10年以上)
- JavaScript (AngularJS, 少々Backbone.js、1–2年)
- Android (2.xで少々、4.0から本格的に、3年)
- iOS (Objective Cのみ、2012から2014くらいまで)
- インフラ周りの世話もほとんどやっていました(7年)。
- AWS (EC2, S3, Elaticache, RDS (MySQL, Aurora), CloudWatch, …)
- Elasticsearch (1.5, 1.7)
- MongoDB
- Kurado, xxForecast などのmetrics系
- AWSでclassicからVPCに移行するとか、MySQLをAuroraに移すとか、その手の作業も計画から実施まで大体1人でやってました。
そもそもサービスをイチから作ったので、DB設計やサーバー構成やプログラムの設計なども(出来の良し悪しはともかくとして)やってました。7年前に行った設計に大した手直しもせずにここまで来ていて、根本から書き直さないとどうしようもないみたいな問題は7年後の今も起こしていないと思われるので、まあまあのレベルでできていると言ってもいいのかなあと思っています。
こういう、いわゆる「full stack developer」的な履歴書(ただし自分でその言葉は使っていない)で活動を始めたのですが、今の仕事にだいぶ飽きていたということもあり、自分としてはAndroid Engineerで探せないかなあ、と思っていました。
2. 転職サイト登録
AngelList、Hired、Vetteryの3サイトにもともとアカウントを持っていたので、履歴書などの内容を更新し、「現在職探し中」のステータスにしました。よさげなところから連絡が来るのを気長に待つつもりでした。
Hiredは、職探しを始めると最初の2週間プロフィールをfeatureしてくれるらしく、Hired側のレビューが終わってfeature開始のメールが来た次の瞬間から、エラい勢いで「interview request」が来る結果に。
Vetteryも似たような雰囲気だったのですが、こちらはいつまでもreviewingのステータスのままで、結局今もそのままです。全然使いませんでした。
AngelListでは向こうから連絡が来たことはなかったのですが、なんとなく募集中の会社を見ていたら1つ面白そうな会社を見つけたので、こちらからApplyしてみました。
3. Phone screening
Hired のサイトで、「連絡したいから日時を指定してくれ」と言われたり、「カレンダーの空いているところにリクエストを送りました」と言われたりするので、日程を設定して電話を受けました。Hiredのカレンダーは真面目に更新しておいたほうがよいと思います。空いているところにいきなり予定を入れられることもあって、Google Calendarと同期できていないために見落としたり忘れそうになったことがありました。
Phone screeningは基本的に先方の人事担当者がかけてくる15–30分くらいのもので、自社の紹介をしてくれた後、こちらの希望ポジションや勤務地を聞いてくるもので、技術的な話はほぼありませんでした。ただしここで大事なのが、「H-1B の transfer をする意思があるか」を確認することです。Hired にはそれが必要である旨を示す項目があるのですが、私の10社くらいの電話経験では、そこを見た上で連絡してきた人は少数でした。30分の電話の最後に、「ところで、…」と聞いたら「ああああー、それ無理だわーごめん」と言われて終了したところもありました。
電話の後、24–48時間後には次の連絡があるのですが、この時点で「お祈り」されることも数社ありました。正直理由は全然わかりません。なんで電話してきたの?って感じでした。たぶん、HRの人は手当たりしだいに電話をし、なんとなくよさげだったらエンジニアや開発チームに履歴書を投げ、エンジニアや開発チームがそれを見て「イラネ」って言ってるんだろうと思います。
4. Coding interview 1
CSメジャーでなく、仕事以外のコードを公開しているわけでもない、ただの叩き上げプログラマーの自分にとって、Coding interviewは鬼門以外の何物でもなく、恐怖の対象でした。1ヶ月無給でいいから雇ってくれれば証明できるんだけどなあ、といつも思ってました。とはいえ恐れてばかりいても仕方ないので、leetcodeなんかで多少の練習はしつつも、基本的に最初のほうの会社のCoding interviewは、それ自体が練習なんだと思うようにしていました。出された問題を理解すること。書き始める前に問題に対して些細な、あるいは当然と思われることでも質問すること。その時間を通して自分自身のIce breakingをするような感覚でした。とはいえ、あの種の、これまで実践で書いたことのない種類のコードを30分でそれなり動くように仕上げるのは、非常に難しかったです。バカみたいなことでも、書いている最中に考えていることをブツブツ言うことも心がけました。
1社だけ、interviewの前にinterviewerがメールを送ってきてくれて、「このinterviewで見るのはどういう風にコードを書く人なのかということで、問題に対する答えを書いたかどうかは重要ではないし、ググっても何しても全然構わない。」と強調してくれたところがありました。まあそうは言ってもねえ、と思ってましたが、その人のことをGitHubなどで調べられるし、そもそも変なところで緊張しなくてよいように気遣ってくれているのがありがたかったです。
5. 履歴書の内容を少し変更
ここまでで数社coding interviewの予定ができて、phone screeningも数社入っている状況で、どれも基本的にはFull stackとかBackendとかArchitectとかいう肩書きの募集で、Android Engineerで先方から連絡があったのは1社しかない状況でした。考えてみたらそりゃそうで、履歴書にはAndroid EngineerとしてのAchievementsがあまりに目立たないので、あれを見てAndroidのポジションで雇おうと思う人は少ないだろうと。こちらとしては「なんでもできるから、なんなら2人雇うより安いよ」みたいなイメージでいたのですが、薄々分かっていたとおり、「なんでもできる」というのはポジションではないので雇われないんですね。
そこで、履歴書の内容に少し手を加えて、Androidのアプリ開発で何をやっていたかを、他の項目以上の量で盛り込んでみました。それと、思い切ってfullstack/backend developerのチェックボックスを外して、Androidのポジションだけで職を探していることにしてみました。まあダメならあとで戻せばいいやと思って。先述のとおり、いいところがあったら…という感じでいたんです。
そうしたら、Androidでの連絡もちらほらと来るようになりました。
6. Coding interview 2
ある会社から、オフィスに呼ばれてホワイトボードコーディングをしました。データ構造を与えられて、RDBのスキーマを答え、続けてそのスキーマを使ってある種のデータを取り出すコードを書くという感じで、一見とっつきやすいが始めてみると普通に再帰してしまうと重複データが出てきてしまう、それを避けるためのコードを書くと、件数が多いときどうする?って話になる、と、よくできた問題でした。
ありがちかつ苦手な、「バイナリーツリーをバランスしろ」とか「文字列と別の文字列を比較してこれとこれの条件にあうやつを取り出した文字列の最大長を答えろ」みたいな問題ではなくて、もう少しその会社の実際の業務に近い内容とそこで直面する問題についてどう考えるかを聞かれた感じだったので、楽しめたしまあまあうまくいったんじゃないかなあという反応でした。
ここでも、とにかく問題が出たら質問する。考えすぎずに最初の思いつきで何かを書き始めて、途中で(普通なら自問自答するような内容を)聞く、あるいは議論するということを心がけました。あとあちゃー間違えたーと気づいたときも、「あちゃー間違えたー」と言いつつ、今やっていたことをそれなりに書き終えて、説明する中で、「ここはこういうつもりだったけど前提条件のこれを忘れてて、この条件がある以上これだとデータが重複しちゃいますね」みたいなことを、自分のバカさをさらけ出すようにしゃべって、反応をうかがったりしました。
7. Coding interview more
その他いろんな会社と電話でやったんですが、まあ失敗しますね。問題は解けたかなあと思っていても、その後の返事はお祈りだったってことがほとんどでした。負け惜しみですが、こちらからすごく興味を持ったのにお祈りをくらったわけではなく、そっちが興味あるっていうから話聞いてあげたのにさあ、とか思うようにして、あまり落ち込まないように心がけたりして。
8. ここまで
長々と書きましたが、じつはここまでで2週間経っていないくらいじゃないかと思います。なんというか、早い。Hiredでプロモートされる期間が2週間だけなので、それが終わったらどうなるんだろうなあと思っていましたが、3回目のinterviewまでいったところもあって、うーんどうしようかなあと。
ただそんな中、ここまでで「こちらからapplyした」唯一の会社でもinterviewは継続していて、この会社のことを知るほどに興味が湧いてこの時点ではここが第一志望ってことなんだろうな、と思うようになっていました。先述のinterviewerが事前に連絡をくれたのもこの会社で。印象もよいしやってることも面白そうだし、ポジションはAndroid Engineerだし。
独立記念日の前の週になって、続けているのは2社という状況になっていました。前回オフィスに呼ばれた会社に、もう一回オフィスにきてCTOと他の開発メンバーとあってほしいということになり、ただ独立記念日の直前なので、みんな出払ってしまうのでどうしようかと相談され、結果Hangoutで木曜日にやることになりました。そしてその前の水曜日に、もう1社の「第一志望」的な会社からオフィスに来て経営陣とあってほしいということになり、休みをもらってオフィスへ行きました。
素敵オフィスで4人と順番に話をし、自分が今までしてきたこと、今できること、今後やりたいことなどを話しました。好感触だったし、やろうとしていることも簡単ではないけど自分にできることもありそうだし、ここからオファーがあったら行こうと決めました。
9. オファー
結果、オファーをいただきました。先に電話でオファーの概要とこちらの気持ちや状況を確認され、問題なかったので即答しました。が、この電話のときにH-1Bの件を確認するのを(だいぶ舞い上がっていて)忘れたことにあとで気づき、あわててメールで連絡をしました。幸い、翌朝には「なんとかする」という返事をもらったので、ほっと一息ついたのですが、だいぶ胃が痛かったです。
もう1社のほうにそういうわけでお断りとお礼の連絡をメールで送り、その他のこの間に始まってまだ残っていたinterview requestもすべてキャンセルしました。
そしたらなんと、お断りしたほうのもう1社から「すぐオファーを出すからもう1回話させてくれ」という返信をもらい、うれしいやら困ったやら。この会社も印象はすごくよかったし、これでさらに好印象になったのですが、気持ちはもう決まってしまっていたので、「本当にごめん」と再度連絡して、「仕方ないねグッドラック」的な返事をいただきました。
10. Two weeks notice
オファーを受諾したので、前職(この時点で現職)のCEOに退職する旨を伝え、最終日の相談をしました。2週間という意味では7月末でよかったのですが、その時点で関わっていたプロジェクトの進捗との兼ね合いもあり、8月中から末を打診され、新しい会社のほうとも相談して、8月第一週ということで決まりました。
想像ですが、おそらく私が転職活動をしていることはすでに知っていたのだろうと思います。会社のことよりも、ビザの件などこちらの心配をしてもらって、ありがたかったです。
その2へ続く