はじめに

2019 年 7 月末で、9 年間働いた Microsoft を退職しました。2010/10 から 2013/07 まで日本支社、その後 2019/07 までレドモンド本社在籍でした。7/29 からは、Mozilla Corporation で Firefox のエンジニアとして在籍しています。

最近は、転職に際して退職/転職エントリなるものを書くのがトレンドみたいなので、それに乗っかることにしました。自分の気持ちを整理しつつ記録に残しておきたいというのと、私自身が他の人の転職エントリを読むのが比較的好きだからというのが理由です。

つい最近では、理三出身の内科医の方が Google に転職した記事が話題になりました。理三 SUGEEEE、という安直な第一印象はもちろんありましたが、医者になってからも勉強に対する工夫と努力を (といってもその方の実際の努力は全く分かりませんが) 維持できている点で器が違いますね。私は高校生の時のモチベーションや馬力は明らかに維持できていません。

【転職エントリ】Googleに入社します|Lillian|note
https://note.mu/neko_chan0214/n/n3a64bc1e1412

日本マイクロソフト時代

2010 年 10 月に、PFE Japan というサポート組織内のエンジニアとして中途入社しました。その中でも Platform PFE というチームで、Windows 担当になりました。当時の製品で言うと、Windows 7 がリリースされてしばらくしてからで、入社して数か月して SP1 が GA になる時期です。

PFE では、仕事内容、先輩方に恵まれ、技術的に一番成長できた時期でした。入社当時は、Win32 のプログラミングがちょろっとできるぐらいでしたが、ここでの 2-3 年で、OS カーネルや CPU に関する知識、アセンブリ レベルでのデバッグという、現在でも通用しているコアなスキルを身に着けることができました。

私が入社した頃から PFE ビジネスの方向性は少しずつ変わり、現在の PFE のミッションが当初の PFE とは大きく異なってしまっているのは残念です。

2 年ほど経って 2012 年の 12 月頃、本社で Hiring Manager をしている日本人の方と知り合うきっかけがあり、その方経由で US のポジションに応募して、WinSE の SDET としてオファーをもらうことができました。

Microsoft Corporation 時代

US 本社で最初に所属になったのは、Windows のバグ修正をする WinSE という部署のテスト エンジニア (SDET) で、その中でも FSC (File Server & Cluster) というチームに配属になりました。Job Level でいうと 59 で、ジュニア レベルの新卒という位置づけですが、それでも PFE のときと比べて給料は 1.5 倍ぐらいになり驚きました。

勤務開始は 2013 年 7 月の後半で、Windows 8.1 が GA になる直前でした。サーバーのチームなので、Windows Server 2012 R2 が OS 開発チームから WinSE に移譲されている時期で、ビジネスが大きく変わるタイミングだったことを覚えています。留学や海外在住経験が全くなかったので、当然英語で苦労したのに加えて、新 OS のサポートが始まるに伴ってビジネス プロセスにも変化が生じるので、そもそも旧ビジネスさえも知らない私は半年ぐらい苦労しました。

その後仕事的には FSC で大したことはしていないのですが、ここで転機となる出来事が 2 つほど起きました。

1 つ目は、2014 年 8-9 月頃に、Internet Explorer の Servicing ビジネスが WinSE の配下に移譲されて、さらにエンジニアの入れ替えが発生したことです。元の IE エンジニアがどうなったかはよく知りませんが、FSC にいた私を含めて何人かの SDE/SDET が無期限レンタル移籍することで新生 IE チームが結成されました。後で知った情報によると、どうやら上司の上司が推薦してくれたらしいのですが、当時詳細は全く知らされず、当日になっていきなり辞令が出た感じでした。最初は追い出し部屋的な左遷を疑ったぐらいです。ちなみにレンタル移籍だったくせに、なし崩し的に全員 IE に異動になり、私が覚えている限り元のチームに戻った人はいません。

FSC 時代に Internet Explorer 11 が Windows 8.1 とともにリリースされており、2015 年 7 月頃に (後に TH1 と呼ばれることになる) 最初の Windows 10 が Microsoft Edge とともにリリースされます。なお、この後 Microsoft を辞める前年の 2018 年後半に、Edge が Chromium ベースになるという Project Anaheim が発表されるので、奇しくも Edgehtml が生まれてから死亡宣告されるまでを見届けることになりました。

2つ目の転機は、”combined engineering” と称する、SDET/SDE を統合して Software Engineer (SWE) という職種に一本化する波が WinSE に来たことです。時期は 2015 年の 8-9 月頃でした。

これらの転機により、面接などを受けることなく自動的に Internet Explorer チームの Software Engineer になりました。もともと SDET として入ったのも、将来的に SDE になるための布石として (というか SDET の多くはそんな感じだったはず) なので、このチャンスは完全にラッキーなものでした。加えて担当エリアがサーバーのコンポーネントから IE になったのも嬉しい変化でした。

技術的には、FSC の方がカーネル モードのモジュールも含んでおり、かつ、大体のバグがマルチスレッド絡みの競合問題であるため、IE より難解だと思いますが、いかんせん閉鎖的で地味なコンポーネントです。つまり、クラスターだったらクラスター以外の技術とあまり関りがありません。その点ブラウザーである IE は、オープンな Web 標準の技術と密接な関りがあり、より「潰しが効く」製品で、キャリアとして良い変化だと思いました。また、サーバー製品よりも明らかにコンシューマーに知名度があり、ユーザーの目に触れることが多いのもモチベーションになります。

さらに、IE に限らずブラウザーというエリアは外部のコードを実行するという性質上、脆弱性の数が他のコンポーネントと比べて圧倒的に多く、セキュリティー関連の知識を学ぶ多くの機会を与えてくれました。アセンブリやカーネルなど、下位レイヤーの技術に興味がある私としては、セキュリティー分野をキャリアの選択肢の一つとしても考えるようになりました。IE 以前でのセキュリティの知識は、Buffer overrun とかの仕組みをちょっと知っているぐらいで、深掘りしようと考えたことがありませんでした。

この後辞めるまでの 6 年間、ずっと IE チームに所属することになります。

辞めた理由

理由はシンプルで、Internet Explorer という製品、及びその製品を担当するチームに将来性を感じられなかったからです。

何人かの同僚から、製品のクォリティー、ビジネス プロセス、もしくは周りのエンジニアの技術レベルに不満があったから辞めるのだと勘違いされたのですが、これは明確に違います。

実際に組織に対して不満は大いにあり、常日頃から文句を言っていたのは事実ですが、辞める直接の理由ではありません。なぜなら、製品に魅力や将来性があるのであれば、組織の問題を解決しようというモチベーションは保てると考えるからです。

現実的にあり得ない世界線ですが、Microsoft が edgehtml の開発を諦めて Chromium を使うと決めたときに、Edge チームを解散して Edge ブランドを捨て、Internet Explorer 12 のような製品名で全く新しいブラウザーを IE チームが作る、みたいなことになるのであれば、組織に不満があっても辞めなかったと思います。

2017 年か 2018 年だったか定かではありませんが、Twitter 社が twitter.com を IE で開いた際、IE はサポートされないから云々、というバナーを出す事件がありました。これは IE チーム内で騒ぎになり、今後の IE の方針に関して幾つかの選択肢を検討することになったのですが、結局は何の大きな変化もないまま有耶無耶に終わってしまいました。詳細は私もよく知らされていませんが、Twitter 社は、IE は Web 標準が中途半端にしかサポートされていないことを問題としていたようです。したがって選択肢としては、今後は IE も Web 標準には完全に準拠していく、というような方針転換も現実的ではないにしろあり得たわけです。ここでの結論によっては、もう少し IE に残ろうという気持ちも芽生えたと思うのですが、そうはなりませんでした。

さらに追加するならば、Windows OS に対する IT 業界内、及びマイクロソフト内での立ち位置も、かつてのような黄金時代を迎えるようなイメージがあまり湧かない、という理由も挙げられます。ただしこれはメインの理由ではありません。もし NT カーネルの開発チームからオファーをもらえるならば、そっちに異動していたと思います。

NT カーネルじゃないにしても、Microsoft 社内でどこか IE 以外に異動するという選択肢も模索し、何人かの Hiring manager と話をしましたが、いまいちいい反応が返って来なかったので、断念しました。

Mozilla との出会い

Microsoft 以外の選択肢では、アクティブに行きたいところがあってその会社を受ける、というスタンスは取っていませんでした。いざ Microsoft 以外で、自信を持ってこれまでの経験を活かせそうなフィールドを見つけられていなかったことが大きな理由です。

LinkedIn 経由でそれなりにプロフィールを埋めておくと、毎月 1, 2 回はどこかしらのリクルーターからメッセージが来ます。それを見て面白そうなポジションに応募してみるのものの面接を通過できず、ということが 2 年間で数回ありました。

Mozilla も同様のチャネルで、LinkedIn 経由でリクルーターからメッセージが来ていたのがきっかけです。そもそもどこに Mozilla の拠点があるのかも知らないので、転職先として検討したこともありませんでした、

紹介されたのは、Firefox の Platform Security というチームで、Windows の Firefox で動くサンドボックスの実装をするエンジニアでした。今まで Windows でブラウザーをやってきていて、セキュリティーにも興味があり、直近の BlackHat でコード インジェクションのツールを発表した自分向けに作られたとしか思えない程の運命的な出会いでした。

Mozilla の採用プロセス

面接で聞かれた具体的な質問は公表しませんが、面接のカラーというか、その傾向がユニークで Mozilla らしく、自分にはとても理想的な採用プロセスと思えたので、それが伝わるように書いておきたいと思います。

時系列的にまとめるとこんな感じです。


May-6
LinkedIn でメッセージ。その日のうちに返信。

May-7
リクルーターと電話。

JD が既に具体的に書かれていて不明な内容はなかったので、自分の経歴といかにマッチしているかを伝えて、是非応募したいです、みたいなことを言ったはず。リクルーターからは、JD の Requirement をどのぐらい満たしているかの簡単な確認と、 在宅でも OK か、年に何回か All-hands で海外出張があるけど問題ないか、などを確認されてそれで終了。あと compensation の希望について聞かれたが、このときは具体的な数値は提示せずに回避。

そのあとのメールのやり取りで、1 回目のスクリーニング インタビューが 5/14 に設定される。(なお、全てのインタビューはオンラインで実施され、長さは 45 分。)

が、5/14 になぜかインタビューをすっぽかされる事態が発生して焦る。超有望な志望者が出てきてポジション埋まったんじゃないかと思い憂鬱になるが、普通に Mozilla 側のミスだったらしく、謝罪とともに再度 1 回目のスクリーニングが 5/28 に設定される。

May-28: 1st screening
後に直属の上司となるマネージャーとのインタビュー。コーディングの質問どころか、技術的なことを一つも聞かれず、いわゆる Behavioral question だけで 45 分が終了。後述する準備のおかげもあって、終始いい感じの雰囲気で進められた。

インタビューは 9am からだったが、その日の午後にすぐに通過の連絡が来て、2 回目のスクリーニングを 6/3 に設定。

Jun-3: 2nd screening
応募しているチームのエンジニアとのインタビュー。前回とは打って変わって、今度は Behavioral question は一切省かれ (tell me about yourself すらなし)、ひたすら Windows について聞かれる。実際に聞かれた質問ではないが、似たような質問を挙げるなら「VirtualAlloc と HeapAlloc の違いは」みたいな感じ。

45 分みっちりなのでけっこう緊張したが、たぶん想定されていたキーワードは全部抑えて答えられたのと、加えてそれを発展させるような質問をすることで建設的な議論ができたと思う。

前回は同日中に連絡が来たが、このときは 6/4 になっても連絡が来なくて、ここで冒険が終わってしまうのか、と意気消沈していたところ、6/5 に無事通過の連絡。3 回目のスクリーニングを 6/11 に設定。

Jun-11: 3rd screening
応募しているチームのエンジニアとのインタビュー。このときも Behavioral question は一切なく、ひたすら技術的な質問に 45 分間答え続ける。コーディングもなし。このときのテーマは code injection で、BlackHat でも発表したそれなりに得意なエリアでもあるので楽しく議論しつつ終了。

一回目と同様、インタビューと同日の夕方には通過の連絡が来て、次が final round なのでその説明をしたい、ということで同日の 6/11 にリクルーターと電話。そこで、以下の衝撃な話を聞く。

  • Final round は 6 回のインタビューです
  • 普通はオフィスにオンサイトしてもらうのですが、今回は全部オンラインでやります
  • 6/17 の週は Mozilla の All hands がウィスラーで開催され、みんなそれに参加するので、できればその前に全てのインタビューを終えたい (= 6/12-14 の 3 日しか猶予がない)

このとき compensation について具体的な数値を求められ、初めて希望を提示。が、案の定 Mozilla お金なさそうな印象。さらにリクルーターから、面接で聞かれる可能性のあるテーマを幾つか教えてもらう。

日程調整の結果、Jun-13 に 4 つ、Jun-14 に 2 つ面接が設定された。オンサイト面接並みにきつい。

Jun-13 9:30am-10:15am: 1st interview
一回目のスクリーニングの時のマネージャーと再度。ついに初めてコーディングを求められた。オンラインのホワイトボード的なのを使うやつ。けっこう簡単だったのでそつなく終了。

Jun 13 10:15am-11:00am: 2nd interview
応募しているチームのエンジニアとのインタビュー。セキュリティ関連の質問だった。これは 9 回のインタビューの中で一番難しく、幾つかはしっくりこない答えになってしまった。ちょっとやばい。

Jun 13 11:00am-11:45am: 3rd interview
上司の上司となる人とのインタビュー。おそらく Hiring manager。この回は再び Behavioral question。IE についても聞かれたと思う。いい感じに終わって、彼は「君のことは推薦しておくよー。残りの技術的な質問頑張ってね。」的なことを言われる。

面接官がどんなポジションの人か事前に教えてもらったわけではないが、このときは面接官がけっこう上のポジションの人っぽかったので LinkedIn で見てそれを確信。

このあと会社に行って仕事して、午後戻ってきてこの日最後の面接。

Jun 13 5:00pm-5:45pm: 4th interview
応募しているチーム外のエンジニアとのインタビュー。Amazon で言うところの Bar-raiser 的なポジションかどうかは不明。単なる人数合わせの可能性が高い。この回も Behavioral question で、過去の経験について聞かれた。OSS 貢献の話題で、GDB に機能を追加したときの話をけっこうした気がする。最後にちょっとだけ簡単な技術的質問をされた。

Jun 14 8:00am-8:45am 5th: interview
応募しているチームのエンジニアとのインタビュー。確かこの人はベルギー在住。二度目のコーディング。これもけっこう簡単で、楽しく会話しながら進められたと思う。

Jun 14 9:00am-9:45am 6th: interview
応募しているチームのエンジニアとのインタビュー。確かこの人は UK 在住。最後のテーマは Windows におけるサンドボックスについて。主要なキーワードは答えられたが、知らないところもあって、逆にいろいろ教えてもらった。

というわけで、大きなミスはなく final round 終了。まあ順当に行けば受かるような気はするのだが・・・という感じ。この後彼らは 6/17-21 の期間 All-hands なので、その間連絡はなし。これは予期できたことだが、どっちつかずの状態が長くて精神衛生上よくなかった。で、ついに 6/24、リクルーターから「お話したいことがあります」的なメールが来る。

6/24: offer call
リクルーターからの電話で、6 人とも recommend もしくは strongly recommend だったのでオファー出します、と連絡を受ける。compensation と start date をその電話の中で決めて、後は offer letter 待ち。

確か 6/27 に offer letter が DocuSign で送られてきて、6/28 にサイン、その日の 6/28 のうちに Microsoft の直属の上司に辞意を伝えるなどしてゴール。


業務開始日は 7/29 に設定したので、全体のプロセスは 3 ヶ月弱。これが長すぎることはないと思いますが、スクリーニング 3 回と、本番の面接 6 回は多いと思います。そのぶんしっかり見ているということでもあるので、自分の英語力、技術力の裏付けになったという点ではかなりの自身になりました。Microsoft 本社に異動したときにも面接を受けましたが (スクリーニング x1、final round は x4。これらも全部オンライン。) 、実は Final round は自分の力だけで受かった気がせず、英語の技術面接にはかなり苦手意識がありました。それもある程度は克服できたと思います。

上述のように、ほとんどの面接が知識を問う内容で、コーディングが 2 回しかなかったのには驚きますが、これも好印象でした。面接の中で議論をすることで、その人の考え方がカルチャーにマッチするかどうかを重視しているのだと思います。いわゆる “think out loud” というのは実践的なスキルじゃないですし。

ちなみに、Mozilla の面接でググると以下のような記事が見つかり、私が経験したプロセスと大差ない気がします。ただ、Glassdoor で Mozilla の面接エピソードを見ると、わりと評価が低いです。この違いはなんなんでしょうかね。

2014-Jan-13
This is my first day at Mozilla | daniel.haxx.se
https://daniel.haxx.se/blog/2014/01/13/this-is-my-first-day-at-mozilla/

2014-Mar
Interviewing with Mozilla - My Journey | #include Akshay
http://akshaycode.blogspot.com/2014/03/interviewing-with-mozilla.html

2014-Aug-03
My journey to Mozilla | Wilson Page
http://wilsonpage.co.uk/my-journey-to-mozilla/

2014-Oct-12
Answers and Questions » Blog Archive » How I Hire at Mozilla
https://benjamin.smedbergs.us/blog/2014-10-02/how-i-hire-at-mozilla/

2015-Jul-06
Mozilla Onboarding — edunham
https://edunham.net/2015/07/06/mozilla_onboarding.html

2016-Mar-28
My interview with Mozilla
http://www.grigory.ca/2016/03/my-interview-with-mozilla/

面接準備

私の行なった準備が他の人の役立つかは分かりませんが、恥ずかしながら書いておきます。凡人向けです。

正直近道ってないと思うんですよね。王道をしっかりやるのが一番いいと思います。

Behavioral question 対策

最も力を入れたのはこれです。正直技術的なところは数週間でどうにかなるものではなく、Behavioral が最も即効性があると考えられるからです。あとは 6 年経っても英語は苦手で、単語がすらすら出てこないことが多々あるため、定番の質問ぐらいはスムーズに答えて第一印象を変えたいという狙いがありました。英語が得意な人、喋りが得意な人には該当しないかもしれません。

最も定番の質問となるのは “tell me about yourself” です。ネイティブ スピーカーの間でも苦手とする人は多いらしく、”tell me about yourself interview question” でググると多くのテクニックが出てきます。STAR method が有名な例ですが、日本で習った記憶はありません。今はどうなんでしょう。

準備として具体的には、複数の例文を組み合わせて自分に合ったパターンを作り、そこにエピソードを載せてスピーチの原稿を作りました。当然そのためには、自分のこれまでのエピソードを洗い出して、主要なものは英語で軽く喋れるようにしておく必要があります。エピソードを決める際には、Job Description と照らし合わせながら応募ポジションに最も刺さるエピソードから順番に使います。

原稿ができたら、暗記できるまで実際に音読して練習しました。このテクニックは、大学の卒業研究の時に教えてもらったもので、仕事の場面でもけっこう使えます。私の場合は、最終的に全体で 3 分ぐらいの tell me about yourself を作って覚えました。 この程度の長さであれば、前日の夜に少し練習するだけで覚えるのは簡単です。

“Tell me about yourself” は大体冒頭で聞かれるので、ここでスムーズに 3 分過ごすことができれば、第一印象は良くなりますし、残りの時間を生き延びる自信になります。仮に “tell me about yourself” と直接聞かれなくても、それ以外の Behavioral question でもどうせ自分が何者で今何やっているかは説明する必要が出てくるので、部分的に流用することができます。

コーディング対策

結果的に Mozilla では役に立ちませんでしたが、LeetCode の Easy と Medium を中心に 30 問ぐらいはやりました。Hard は時間もかかるし、一部のポジションを除いて面接では聞かれないんじゃないかと思っていたので、汎用的なものを数問解いただけです。

ユニークなところでは、2 年ほど前に Clean Code という本を読んだことをきっかけとして、自分で kata programming の問題を作って 2 年間毎日やるようにしています。これに即効性は全くなく、実際に役立ったかどうかも不明ですが、今後も続けると思います。参考までに。

ドメイン ナレッジ対策

Mozilla の場合、面接ごとに技術的テーマがあることが分かってきたので、JD を見て予想されるテーマは一通り復習して、簡単な実証コードも書いたりしました。例えば、COM、マルチスレッド、排他処理の種類、インジェクション手法など。面接の中で新たに覚えたことについても、次回はより深く答えられるようにもしておきました。応募する会社やポジションによっては、ドメインナレッジを聞かれることが無いこともあるはずなので、ググって傾向を調べておくことは必須だと思います。

Mozilla に入社しての印象

シアトル エリアに Mozilla オフィスは無いため、基本は在宅勤務になりますが、入社して最初の一週間はオリエンテーションも含めてポートランド オフィスでの作業でした。といっても、同じチームの人はそこに 2 名だけです。さらに言えば人事のオリエンテーションも conf call でした。これぞ 21 世紀の働き方です。

Onboarding の動画を見てプロセスや Firefox について学びつつ、記念すべき最初のバグもアサインされました。

1568610 - Change PEHeaders::GetIATThunksForModule to return Maybe<Span<IMAGE_THUNK_DATA>>
https://bugzilla.mozilla.org/show_bug.cgi?id=1568610

やはりどうしても Microsoft や Internet Explorer と比較してしまうのですが、今のところいい印象しかないです。例えば、以下の Three Pillars や、

Three Pillars
https://mail.mozilla.org/pipermail/firefox-dev/2015-July/003062.html

以下のセキュリティ プロセスにおける assume the worst など、

Security/Bug Approval Process - MozillaWiki
https://wiki.mozilla.org/Security/Bug_Approval_Process

製品を改善することに前向きな姿勢が全面に出ているのが素晴らしいと思います。

Onboarding の中でも、「既存のコードはベストだと思わなくていい。駄目なコードはたくさんあるから、それを見つけたらバグをファイルすればいい。」みたいなことを言っていて、とても同意できました。Internet Explorer でもそれがやりたかったんですけどね。ある程度そういう流れを作ろうともしたんですが、力不足でした。

おわりに

Microsoft に不平不満はあるものの、2010 年、2013 年のときにはおそらく書類すら通らなかったであろう Mozilla に行けるまでに成長させてもらったという点では、とてもお世話になりました。もちろん、US で働くための雇用ビザを取得してもらい、さらに永住権をもらえたことに対しても感謝の気持ちしかありません。また月並みな言葉ですが、日本、アメリカ両方で知り合えた多くの方にお世話になり、助けられたことにも感謝です。今後も keep in touch していきたいです。今は LinkedIn や Facebook があるので便利ですね。

Microsoft から Mozilla への転職が、今後の人生でどういう変化をもたらすかは全く未知数です。しかし現時点で、Microsoft Japan への転職と、Microsoft Corporation への移籍が自分のスキルを大きく成長させるきっかけとなったことは確かです。

最後に給料に関して言えば、Base は 10-15% ぐらい下がりました。Mozilla で成績トップを取ってボーナスの上限がもらえたとしてようやく、Microsoft で最後の年にもらっていた給料と同じぐらい、というレベルです。もちろん、Microsoft で残っていた RSU は全部放棄です。Ouch.

逆に IE に留まればおそらく Principal には数年で昇進できる自信はありましたが、エンジニアとして local maximum に到達してデッドエンドな気がします。ここで給料を下げてでも、鶏口から牛後になれば、そこから大きな飛躍ができる可能性に賭けました。ある意味夢を追いかけたとも言います。

交渉すれば RSU 分の補填は多少あったんじゃないか、と何人かの人に言われたのですが、GAFA のような大企業ならともかく Mozilla じゃ希望薄だと思います。面接で得た印象は本当によく、チームでの仕事内容も楽しみにしているので、給料は、まあ、多いに越したことはないですが、生活に困らなければ文句は言いません。一応 Glassdoor で出てくる Senior Engineer の平均よりはちょっと上なので、Microsoft と比較しなければ悪くはないんじゃないでしょうか。

というわけで以上!