Facebook London に Software Engineer (Machine Learning) として入社することになったので経緯と準備をまとめました.一昔前にGoogle Japan の人々が同じような記事を書いていたのが大変参考になったので,この記事もいつか誰かの参考になれば幸いです.
自己紹介
理論計算機科学(特に離散アルゴリズム・機械学習など)を専門とする研究者です.東京大学大学院情報理工学系研究科で博士(情報理工学)を取得したのち,国立情報学研究所でポスドク,静岡大学で助教を務め,現在理化学研究所でユニットリーダー(准教授相当職)をしています.株式会社サイバーエージェントで兼業もしています.詳しい経歴・業績・etc は CV http://www.prefield.com/CV.pdf を見てください.
現職が 2020 年度までの任期付きポジションだったので次のポジションを探していました.現職は数年の更新が可能だったので,もし就活がうまくいかなかったら更新をお願いしようと考えていました.
(国内の)大学は環境としてあまり魅力的に思えなかったので(というよりも,大学に移るくらいなら現職を延長したほうがよいと思ったので)民間企業を考えていました.また,これまで海外勤務経験が無かったので,せっかくだから挑戦してみようと海外勤務できるところに候補を絞りました.数理的・アルゴリズム的に難しい問題を扱えれば何でも楽しめるタイプなので業種・職種にこだわりはなく,せっかく民間企業に応募するのだから実応用っぽいことをやりたいと考えていました(理論研究は勝手にやるし,実応用を知っていることが理論研究の役にも立つと思ったため).論文を投稿できることは必要条件にしました.
タイムライン
12月上旬:CV を整備,Glassdoor を眺める
12月中旬:LinkedIn,Twitter で求職中であることをアピール
12月下旬〜1月上旬:いくつかの企業の方と面談
12月下旬〜1月中旬:適当なところに応募
1月下旬:オンラインインタビュー
2月上旬〜2月中旬:国際会議参加・海外大学訪問のため就活一時停止
2月下旬〜3月中旬:オンサイトインタビュー(COVID-19 のためオンラインで施行)
4月上旬:結果通知
応募先と結果
結果が出た順に書きます.
1. IBM Yorktown / Cambridge; オファーなし
1月上旬〜中旬に IBM Yorktown と Cambridge に応募しましたが,Yorktown は2月上旬に書類落ち,Cambridge は5月下旬に書類落ちしました.
2月上旬〜中旬に人工知能系国際会議(AAAI)に参加しました.それに合わせて IBM からも「会議中に話しませんか」というメールを受け取ったので返信してみたのですが,特に何の返信もありませんでした.会議参加中に IBM の知人に直接人事の方を紹介してもらい,人事の方から「直接 CV を送ってくれ」と言われたので送ったのですが,やはり何の返信もありませんでした.これはさすがに縁がなかったと考えて2月下旬に見切りました.
2. 富士通研究所; オファーあり
求職アピールをしていたら声をかけていただきました.1月に話を伺ったところ,わたしが事前に抱いていた印象よりも格段に魅力的な条件(それなりに良い給料・大きな裁量・将来的な海外勤務の可能性)を提示していただいたので,「現在 IBM, Google, Facebook にも応募しているが,それでもよければプロセスを進めてほしい」と伝えたところ,そのまま面談に進んでオファーをいただきました.
最終的にはオファーをお断りすることになったのですが,その際の連絡でもこちらのことを気遣っていただきました.大変感謝しています.ちなみにこのオファーは Facebook との給与交渉でも活用させていただきました.
3. Google Japan (Software Engineer (ML)); オファーなし
12月下旬に Google の知人のリファラルで応募しましたが,諸事情により応募先が二転三転し,ちゃんとプロセスが動いたのは1月後半でした.Google は内部移動の自由度が高いので Japan であることは特に問題にならない(通ったら数年後に異動を希望しよう)と考えており,また,Google では仕事内容は役職名でなくチームで決まると内部の複数の人から聞いたので,ジョブタイトルが Software Engineer であることも特に問題にならないだろうと考えました(この事情は後述の Facebook も同様です).
オンラインインタビューはつつがなく終わりました.出来もよかったようでオンサイトインタビューに進みましたが,COVID-19 のためビデオインタビューになりました.オンサイトインタビューは(自覚できるレベルで)あまりうまくいかなかったため普通に落ちました.事後のフィードバックで「エンジニアリングの能力不足」を指摘されましたが,インタビューの内容や自分の背景と照らし合わせて妥当な結果だったと思います.
テック系企業の選考を受けるのは初めてでしたが,Google を最初に受けたのはとてもよい経験でした.リクルータは親切で,こちらがどういう準備をするべきかを丁寧に教えてくれました(具体的にやったことは後述します).Google のインタビュー経験を積んだおかげで後述の Facebook のインタビューに通ったと思っています.
4. Facebook London (Software Engineer (ML)); オファーあり
1月頭に LinkedIn 経由で Facebook London のリクルータから連絡を受けました.ポジションについて「1/2 Research, 1/2 Engineering」という説明を受け,これはまさに自分のやりたいことだと思って応募しました.応募した中でここだけが全く「コネ」のない応募でした.
オンラインインタビューはつつがなく終わりました.出来もよかったようでオンサイトインタビューに進みましたが,COVID-19 のためビデオインタビューになりました.同じくビデオインタビューになった Google Japan は何度か訪問したことがあったので「ランチを1回食べ損ねた」くらいの残念感でしたが,こちらは一度も訪問したことがない場所だったので「もしかしたら働くことになるかもしれないオフィスを見られない」と大変残念に思っていました.オンサイトインタビューは Google のインタビューの後に行われたのですが,Google のインタビューで経験を積んだこともあって終始余裕をもって進められました.事後のフィードバックでも「非常にポジティブ」との評価で嬉しかったです.
面接後2週間ほどで「ヘッドカウントを確認次第オファーを出す」と言われました.COVID-19 のせいでヘッドカウントを絞っている企業があると聞いていたため,この連絡はむしろ不安材料だったのですが,さらに1週間後に無事「ヘッドカウントが確認できたのでオファーを出す」との連絡をもらいました.
勉強したこと
Facebook London の Software Engineer (ML) の面接で問われたのは
1.
Coding Interview
2.
System Design Interview
3.
Machine Learning Design Interview
4.
Behavioral Interview
でした.Google も大筋では同じでした(このあたりは検索すると出てきます).以下では各々について準備したことをまとめます.
1. Coding Interview
与えられた問題を解くプログラムを書きます(プログラム言語自由).いわゆる競技プログラミングです. https://www.youtube.com/watch?v=3Q_oYDQ2whs を見るとイメージがつかめます.
基本的なアルゴリズムの理解とそれを具体的なコードに落とす実装能力が問われます.わたしは専門分野がアルゴリズムであること・競技プログラミングの経験がチョットアッタことから比較的楽に進められるだろうと思っていました.実際
LeetCode https://leetcode.com
の問題を 1 ヶ月で 200 問ほど解いてみましたが,解き方がわからない問題はほとんどありませんでした.
150 問ほど解いて問題が解けることを確認したあとはインタビュアーに説明する練習をしました.一般にこの手のインタビューでは技術的能力だけでなく一緒に仕事できるだけのコミュニケーション能力が評価されます(このことは Google, Facebook 両方のリクルータからかなり強く念押しされました).具体的には「LeetCode の問題を適当に選び,脳内インタビュアーに対してコードを書く前に方針を説明し,コードを書いた後に簡単な入力に対して挙動をステップ実行する」という練習をしました.ゼミで相手に説明する感覚でやっていました.
2. System Design Interview
大規模システム(主にウェブアプリケーション)の全体的な設計を行います.具体的には「URL 短縮サービスを設計せよ」みたいな問題を解きます.コードを書くことはあまりなく,いわゆるシステム構成図(ロードバランサがあって,アプリケーションサーバがあって,データベースがあって,云々)みたいなものをホワイトボードに描いていきます.https://www.youtube.com/watch?v=lOcqPEOROwQ や https://www.youtube.com/watch?v=mDYuJoQEowQ を見ると少しイメージがつかめます.
ネットワーク・データベースなどを中心とした,システムに関する基本的な知識が問われます.ここはわたしの知識が不足している分野でした.15 年ほど前に基本情報技術者試験・応用情報技術者試験(の前身)に合格しているので最低限の知識はあったのですが,そのころから知識がアップデートされておらず,忘れている部分も多くあり,何より覚えている部分も専門用語を日本語で覚えているので英語で議論できないということで,一通りやりなおすことにしました.基本的な知識を固めるために
System Design Primer https://github.com/donnemartin/system-design-primer
をリンク先も含めて通読しました.その後に
Grokking the System Design interview https://www.educative.io/courses/grokking-the-system-design-interview/
の問題を全て解きました.いくつかの簡単に実装できるものは AWS 上で実装もしてみました.
一通り問題を解けるようになってからは Coding Interview と同じくインタビュアーに説明する練習をしました.Coding Interview では初手で最良解を出せば説明を簡単化できるのですが,System Design Interview は明確な正解がない問題を扱うため最良解が定まらず,複数の実装方針の中でなぜこれを選んだのか等を説明する必要があるため,より高いコミュニケーション能力が問われます.それなりに多くの時間をこの準備にあてました.具体的には,Coding Interview と同じく「上の問題集に載っている問題を適当に選び,時間を決めて脳内インタビュアー相手に説明する」という練習を繰り返しました.練習のたびに注目する部分を変えてみたり実装方針を変えてみたりして色んなパターンで説明できるようにしました.
3. Machine Learning System Design Interview
機械学習パートに焦点を当てた System Design Interview と思えばよいです.具体的には「Twitter でフォローするべきユーザを推薦するシステムを設計せよ」みたいな問題を解きます.
PRML, MLaPP といった機械学習の定番教科書に書いてあるような知識よりはむしろ機械学習をどうシステムに組み込むかが問われます.例えば,どういうデータを学習に使うのか,それらをどうやって収集するのか,作ったシステムの性能をどう評価するのか,といった部分が注目されます.このあたりの知見を得るために
ML System Design https://github.com/chiphuyen/machine-learning-systems-design
を通読しました.特に Exercises の「答え」はだいたい blog や論文を探すと見つかるのでそれらを読んでおきました.基本的な知識が身についたあとは Exercises に対して他の可能性はないかを考えたり,System Design Interview の各問題について機械学習の要素を入れられないか(例:URL 短縮サービスの集計システムとしてホットトレンドを見出すには?)を考えて,System Design Interview と同様の練習をしました.
4. Behavioral Interview
いわゆる普通の面接ですが,質問される内容がある程度標準化されています.具体的に聞かれるトピックは
でだいたいカバーされるようです.聞き方が違うだけで本質的に同じことを聞いている質問も多いので,やらないといけない準備は実は少ないです.回答する側も
というフォーマットで答えるのが標準らしいので,上の全質問に対してこのフォーマットで回答できるように練習しました.具体的には,過去の経験を何個かピックアップし,質問に対して回答をいずれかの経験から引き出せるようにしておきました(このやり方は Google, Facebook 両方のリクルータに推奨されました).
英語
London オフィスへの応募だったので,すべてのやりとりが英語で行われました(cf: Google Japan は面接の約半分が日本語でした).
わたしの英語力は Facebook からオファーを貰った直後で TOEIC 750 程度 のようです(abceed というスマートフォンのアプリによる推定値.もうちょっと高いと思っていたので悲しい).これまでに海外留学経験・海外就職経験はありません.一方で,現職では日常的に英語で論文を読み書きしたり,研究ディスカッションしたり,学会発表したりしているので,技術領域に限れば TOEIC スコアから想定されるよりは英語ができるのだと思います(思いたいです).
Coding Interview と (ML) System Design Interview は技術的なトピックだからなんとかなるだろうと思っていたので語学を意識した準備は特にしませんでした(単純に全準備を英語でやっただけ).一方で Behavioral Interview では日常会話的な言い回しを知らないことがマイナスになりうると思ったため,英語圏の面接対策系のサイトを色々眺めて頻出の言い回しを頭に入れておきました.
その他,英語に関して全体的に意識したことは以下のとおりです.上ほど効果が大きかったと思っています.
携帯ではマイク付きイヤフォン・PCではヘッドセットを使う.可能なら電話でなく Skype などを使う.音質のおかげで発音の聞き取りやすさが段違いになります.
ゆっくり・はっきり話す.一般的な会話テクニックとして「こちらがゆっくり・はっきり話すと相手もゆっくり・はっきり話すようになる」というのがあるので活用します.これにはインタビューの時間が短くなるというデメリットがありますが,迷わないことで解決しました.
会話の主導権を握る.会話の主導権を握ることで次に相手が話すかを予測できるようにしました.具体的には「相手が質問したくなる場所を作る」とか「相手に質問される前にこちらから質問を投げかけて答えを限定する」みたいなことをしました.インタビューなので主導権を握るのは英語に関係なくやるべきですが,英語の観点でもこれは有益でした.
聞き取れなかったら聞き返す.多少聞き返すのはネガティブにならないと明言されていたので,わからないときは遠慮なく聞き返すことを意識しました.ただし実際に聞き返しが発生した回数はそれほど多くありません.
結局のところ,面接ではこちらが英語非ネイティブであることを大いに汲み取ってもらったように思います(リクルータの電話での会話速度が,回を重ねるたびに遅くなっていくのが面白かったです).技術的に優れていて積極的にコミュニケーションをとる意志さえあれば大丈夫という姿勢が伺えました.
今後
無事進めば11月9日からロンドンで勤務開始となります.初の海外生活になるのでどきどきしています.国内から海外に転職した経験のある方からアドバイスいただけると嬉しいです.