Google の面接を受けてみた

Google の面接について書かれたブログ記事が面白かったので翻訳してみました。
原著者の許可取得済み。(Thank you, Petris!)

本文


二週間ちょっと前、ぼくはカリフォルニアのマウンテンビューで Google の面接を受けてきたんだ! Google の面接が面白い体験だったから、ぼくはそのことを話したいんだ。(Google からはこの記事を出すゴーサインをもらった)

ぼくが面接を受けた職種は Google SRE だった。SRE というのはサイト信頼性エンジニアリング(Site Reliability Engineering)という意味だ。サイト信頼性エンジニア(SRE)はソフトウェアエンジニアでもあり、システム管理者でもあって、Google の製品サービスを端から端まで責任を持つんだ。

合計8回の面接があった。最初の3つは電話越しで(電話面接)、残りの5つは現地での面接だった。リクルーターとの最初の面接はそれほど技術的じゃなかったけど、残りの7つの面接はとても技術的な話だった。

どの面接もとてもうまくいったけど、ぼくは採用されなかったということを今知らされたんだ! 仕方ないか……。個人的にはぼくは本当にうまくやったと思う。ぼくは全ての質問に答えた、でも彼らは満足しなかったみたいだ! リクルーターはぼくに、ミッションクリティカルのチームで働くには経験不足だった、だからもっと経験を積んでから再挑戦してね、って教えてくれた。

これがその出来事の記録だ。

ぼくが「Google Chrome におけるコード再利用について(Code Reuse in Google Chrome)」を投稿した少し後、Google のリクルーターからコンタクトを受けた。メールによると、

私は Google で一流のソフトウェアエンジニアリングの才能を持つ方を募集しています。ワールドクラスのエンジニアと思われる方としてあなたのお名前をお見かけして興味を抱き、あなたのことをより詳しく知りたいと思っています。私達のことについて詳細な情報を交換する方がお互いにとっていいことであると断言いたします。

お話に興味がありますか? Google で影響力のあるプレイヤーになりたいですか? それならば現在のあなたの履歴書(英語)をお送りください、あなたにお電話差し上げて話し合いをいたします。


ぼくは最初ソフトウェア開発の職種に応募しようと思っていたんだけど、ぼくのスキルセットに目を通してから、SREの方が合っているとリクルーターは結論したんだ。ぼくは彼に同意した。この職種はぼくにとって完璧であるように見えたんだ。ぼくはプログラミングと同じくらいシステム管理が大好きなんだ。

一次面接(電話)


最初の面接は9月10日にリクルーターと実施した。彼は Google の採用プロセスについて説明し、それからぼく達はぼくのスキルセットについて話し合った。ぼくは自分自身について、一連の分野に 0-10 のランク付けをした。Cプログラミング、C++プログラミング、Python プログラミング、ネットワーク、アルゴリズム、データ構造、分散システム、Linux システム管理、などなど。

さっきも言ったけど、ぼくの回答をもとに、ぼく達は SRE がぼくにとってベストな職種だって結論づけた。SRE は基本的にあらゆることを知らなきゃいけない。アルゴリズム、データ構造、プログラミング、ネットワーク、分散システム、スケーラブルアーキテクチャ、トラブルシューティングなどだ。こいつはとんでもなくハッカー的な仕事なんだ!

こうした質問の後、彼はどこで働きたいかと訊いてきた。次のいずれかの Google オフィスだ。アイルランド、チューリッヒ、マウンテンビュー、オーストラリア。ぼくはマウンテンビューと言った、なんたって Googleplex(*)だからね! 彼はもし面接がOKなら、H-1Bビザという非米国市民が米国で働くためのビザをとらなきゃいけないと説明した。

(*訳注 Googleplex とは Google 本社の愛称のこと)

面接の後半はいくつかの基本的な技術的質問で、これは単にぼくがある程度のことは知っているということを確認するためだけのものだった。質問は Linux システム管理、アルゴリズム、コンピュータアーキテクチャ、そしてCプログラミングだった。秘密保持契約を結んでいるから詳細は書けない、それにぼくのリクルーターはご丁寧にも質問を投稿しないようにねとお願いしてきたんだ!

いくつかの事実誤認はあったけど、リクルーターは満足し、ぼく達は次の電話面接のスケジュールを決めた。彼は次の面接は非常に技術的で、事前に十分な準備をしておいた方がいいと忠告した。ぼくは準備に十分な時間が欲しいとお願いし、そして次の面接を9月22日と決めた。

また彼はいずれの電話面接も45分から1時間ほどの長さになるだろうと教えてくれた。

ぼくは狂ったように準備し始めた。ぼくは SRE とはどういうものか書かれている3つの発表資料を発見した。


次にぼくは Google の面接及び面接での質問について書かれている全ての他のブログ記事を見つけた。


ぼくは4編の Google の研究論文を印刷して読んだ。


またぼくは何冊かの本に目を通した。


特定のプログラミング言語に関する質問を受けるかどうかわからなかったから、ぼくは C++クックブックPythonクックブックPerlクックブックにあるいくつかのレシピに目を通した。


(訳注: 本のタイトル及びリンク先については訳本がある場合はそちらを用いている)

二次面接(電話)


二次の電話面接は Google のエンジニアと行われた。彼は広告チームという AdSenseAdWords、そして他の広告ツールを受け持っているチームで働いているとのことだった。

面接は非常に技術的で、コンピュータメモリに収まりきらない大きなデータに関するアルゴリズムの問題から始まった。ぼくは自分だったらどうやってこの問題を切り抜け、どのデータ構造とアルゴリズムを使うか正確に話した。彼はぼくに、考えてることを声に出してほしいとも言ってきた(*)。面接は次のような質問で続いた。データ構造、DNS、TCPプロトコル、TCPにおけるセキュリティの脆弱性、一般的なネットワーク、そして Google 自身について。申し訳ないけど、これ以上細かく公表することはできない。

(*訳注 思考の過程を説明してほしいと言っている?)

面接の後、そのエンジニアはぼくに結果を書く必要があった。それは好意的なもので、そしてぼくは次の面接にとりかかった。

三次面接(電話)


ぼくは更に多くの時間をかけて準備をした。三次面接は10月1日にあった。Googleトラフィックチームのエンジニアとの面接だった。

この面接では非常に簡単なプログラミングに関する質問を受けた。ぼくは電話越しにコーディングしなければならなかった。言語を選ぶ自由が与えられたので、ぼくは Perl を選んだ。一番好きなプログラミング言語だからね。Perl の文法を口で説明するのは無理だから(ドルマーク開き括弧データ閉じ括弧開き中括弧……閉じ中括弧)、ぼくはメールで Perl のプログラムを送った。

それから次の段階に進むために同じ問題がとりあげられた。ぼく達が扱っているデータサイズがギガバイトやテラバイトのとき、プログラムや解決策はどう変えていったらいいと思うか?

最後にぼくは再びDNSについての質問を受け、HTTPプロトコル、ルーティング、TCPデータ転送についての質問を受けた。

結果は好意的で、ぼくは現地での面接を受ける準備をすることができた。リクルーターとの話し合いで、現地での面接は5回あること、それぞれきっかり45分間あることを知った。一つはぼくの今までの実務経験、一つはアルゴリズムとデータ構造、一つはトラブルシューティングとネットワーク、二つはCとC++を中心としたソフトウェア開発とのことだ。

リクルーターはもういくつかのドキュメントを読むことを勧めた。


ぼくはラトビアを10月24日午後1時に出発してアメリカに飛び、午後8時にカリフォルニアに着いた。実質14時間かかったけど、時間の流れと同じ方向に飛んでたから快適だった。これは7時間の節約になった。現地での面接は10月27日に予定されていたから、面接の前に十分な休息をとることができた。さらにいいことに、ぼくの旅費、ホテル代、タクシー代及び食事代は Google が払ってくれた。ぼくは何も払わなかったんだ!

四次面接(現地)


四次面接はとうとう Googleplex で行われた! 10時にリクルーターと会い、面接について15分間の打ち合わせをした。彼はぼくに次のことを教えてくれた。今から2つのインタビューがあり、それから Google エンジニアの一人がぼくを Google のレストランに連れていってランチを食べ、その後3つの面接があるとのことだ。

10時15分、最初の面接が始まった。ぼくの今までの実務経験についてだった。過去に多くの実務経験があったので、ぼくが数年前に Linux 上で C でコーディングした物理的セキュリティ通報システムについて話すことにした。このシステムはシリアルポートからメッセージを受け取り、メールかSMSで送信するものだ。

面接の最後の数分で、彼は基本的な Unix ファイルシステムの質問をしてきた。

どの面接でもぼくは2つの大きなホワイトボードに文字を書いたり絵を描いたりしたんだ。 楽しかった!

五次面接(現地)


五次面接は11時に始まった。その面接はコーディングの時間で、現実のコーディングの問題ではなくひっかけ問題から始まった。ぼくはある問題の解決策を C で実装するように言われた。その解決策は1行の return 行がある数学的な式だった。大きなコーディングはなかった。それからぼくは非常に有名なデータ構造の実装を書くように言われた。コーディングのとき、ぼくはミスをしてしまって、malloc()したデータ構造の一部を初期化し忘れちゃった! プログラムは実際にはセグメント違反を起こし、ぼくはそのエラーに気づいたんだけど、Google のエンジニアはそのことを非常に深刻に受け止めたんだ! もし読者が面接を受けることがあったら、どんなミスも絶対にしないように!

この面接の後ぼくは二次(電話)面接の担当者だったエンジニアにランチに連れていってもらった。彼女は Google で2年間働いていて、とても楽しいと話してくれた。ぼく達はアジア料理レストラン(Googleplex 内にある)に行き、あらゆる種類のおいしい食べ物にありつけた。全部タダ!

その後彼女は Googleplex の中を色々と見せてくれた。何もかもが驚くことばかりだった。どこにでも無料の飲み物とキャンディがあり、アーケード機があったり、外ではビーチバレーができたり、他にもたくさんのびっくりするものがあった。

六次面接(現地)


六次面接は12時45分に始まった。トラブルシューティングとネットワークの面接だった。面接担当の人はネットワークダイアグラムをホワイトボードに描き、この図から読み取れる問題を考えるように言った。ぼくは問題を特定するために一連のネットワークに関する質問をする必要があった。彼は満足し、面接の最後の数分でネットワークデバイスに関する質問を投げかけた。

七次面接(現地)


七次面接は1時半に始まった。コーディングの時間だった。ぼくは単純な文字列操作サブルーチンを C か C++ で実装するように言われた。ぼくは C を選んだ。不幸にもぼくは off-by-one のミスをしてしまった。人類史上最もありふれたプログラミングミスだ。面接はこの一つの問題だけ行われた。

八次面接(現地)


最後の八次面接は2時15分に始まった。アルゴリズムとデータ構造の面接だった。ここで出された問題は二次面接の問題と似ていた。データが大きすぎてコンピュータメモリに収まりきらないというだけでなく、分散されていた。ぼくはあらゆる知略を用いて解く必要があった。面接は非常に自由な形で行われ、ぼく達はその問題についてあれこれと話した。ぼくは面接終了直前になって正解にたどり着いた。彼はそうやって正解にたどり着いた候補者はそうはいないと言った。ぼくはうれしかった。

面接の後、エンジニアはぼくをロビーの外まで送ってくれて、ぼくはタクシーで自分のホテルに戻ったんだ。以上! :)

終わり

全体的に Google の面接は純粋に楽しかった。面接の問題は技術的だったけどそれほど挑戦的でも難しくもなかった。

機会を与えてくれた Google に感謝! :)