Software Transactional Memo

STM関係のことをメモっていこうと思います。

こうしてGoogleに入社した(kumagi編)

f:id:kumagi:20181122153114j:plain

Googleオフィスの窓からの眺めをGoogle Photoが自動加工したもの

TL;DR AtCoderやろうぜ

Googleの(僕から見て)偉い人が立て続けにブログを書いており

ctrl-x-s.blog

hoge.blog

ここ数件の僕のブログへの反響を読んでも「Googlerだから特別」みたいな意見が散見され、入社へのハードルが変に高く見られてしまっている気がするので、僕がGoogleに入社する準備として取り組んでいた事とそのレベルを紹介する。程度の低さに安心して欲しい。

英語

英語の論文は興味の赴くままに読んでいたため読むことに関してはあまり苦手意識は無いものの、絶対的な英語力に関して言うとTOEIC500点というスコアが端的に表している。これがどれぐらいかというと、得意分野から外れると長文を読む速度と精度がガタ落ちし、リスニングも結構な単語を聞き落とし、文脈からの推測と辛うじて拾えた単語からどうにか会話を成立させているように見せかけれていると本人は思い込んでいる有様である。この文章を読んでいる大半の人のほうがよほど英語力は高いかも知れない。

今時であればオンラインの英会話レッスンなどで結構お手軽に学習はできるのだが、一切やらなかった。特に自信があったわけでも何でもなく、時間があれば他のことがしたかったという理由に尽きる。

なお英語力に関しては入社後でもやっぱり苦労しており、そろそろ勉強せねばならんかと諦めるフェーズに差し掛かっている。

競技プログラミング

僕は名古屋工業大学という地方都市の国立大学の出身であり、そこで情報工学を履修したのが基礎となっている。授業はよく練られて歯ごたえがあったが競技プログラミングという観点では学生当時は存在すら知らなかった。ツクモ電機で店員のバイトしたり近所のベンチャー企業でアルバイトとしてPICマイコンと戯れたりしていた。

2018年の5月頃にやっと興味が出てきたのでチラホラと取り組んでいたら、ちょうどNTTの競技プログラミングに興味がある集団と意気投合したのでほぼ毎晩バーチャルコンテストに打ち込んでいた。

https://not-522.appspot.com/

ここから誰でもAtCoderの過去問を使ってコンテストを開催することができる。NTTの有志が毎晩コンテストを開いてくれたのでひたすらそれに参加していた。当時の記録をkenkooooさんのサービスで見返して見ると

f:id:kumagi:20190326002828p:plain

一日3〜4問ぐらいずつ解いている

ABCの過去問ばかりやっていた。C問題が解けたらハッピー、D問題までできたら最高ってノリで本番より短い1時間の設定で、ヤイヤイと解いたり感想戦したりを日課にしていた。AtCoderのC問題がどの程度のレベル感かというとAtCoder社長のchokudai氏によると

と威張れるような難度の問題でもなく、頭の体操、もしくは指先の体操ぐらいのノリで解いてしまう人もいるような難度に過ぎない*1。別に超人的な努力を重ねたわけではなく、最低限これぐらいはと言われる難度の問題に1日1時間向き合っていただけである。

こうしてAtCoderでやっと緑コーダーになった時点ぐらいでGoogleの面接を受けた*2。逆に言うと緑コーダーでもGoogleのコーディング面接を通過できた。緑コーダーというのはAtCoderで言うところの下から3つめのボリュームゾーンであり、あまり馬鹿にしたものでもないがそこより上にまだ水色・青・黄色・橙・赤と続いている事を考えるとそこまで自慢できるような実力とは言えない。

この実力でGoogleに入社できると自信を持っていたわけでは断じてないが、Googleは入社試験に落ちても1年程間を空ければ再度受けられるので刺激を受けに行くつもりぐらいのダメ元で試験に臨んだ。

careers.google.com

昨年面接を受けた(または応募した)のですが、採用されませんでした。再度応募できますか?
エンジニアリングの職種の場合は、1 年ほど経験を積んでから再度応募していただくようお願いしています。

生涯で受けられる試験の回数上限が決まっているものは数あれどGoogleの入社試験に上限はないので太っ腹である。社内見学ぐらいの軽い気持ちで挑んでみるのもアリである。

Google入社試験

面接は電話面接x2と対面(オンサイト)面接一日からなっていた。電話面接でスクリーニングをおこなって良さそうであれば東京のGoogleオフィスでホワイトボードコーディング、という順序で僕の採用の時は回っていた。

初回電話面接

情報工学の基礎的な内容を一問一答みたいなノリで質問された。問題を直接晒しはしないが、同等レベルの問題を出すならば

  • バブルソートの計算量は?
  • 平衡2分木の削除に掛かる計算量は?
  • std::vectorのランダムアクセス1回に掛かる計算量は?
  • 幅優先探索ってどういう時に使う?

みたいな感じで、大学の授業をちゃんと聞いていれば即答できるようなものばかりであった。僕がややデータ構造オタクだったりしたのも功を奏した。(あなたの知らないハッシュテーブルの世界, 冬のロックフリー祭り) 英語での電話面接だったのでだいぶ緊張はしたが、面接官からは「英語が分からなかったら言ってくれたら日本語で言い直す」と伝えられており、実際にいくつかは日本語で確認をしたが特にそれを理由に減点ということはなさそうだった。

電話二次面接

電話をハンズフリーで通話できるようにし、パソコンの前で待てと言われた。共有されたリンクから開いたGoogle Docs的にリアルタイムに編集が共有できるエディタ上で、出題されたコードをその場で書いてみせた、日本語なので落ち着いて問題に取り組めた。Emacsバインディングを思わず使おうとして新ウィンドウを開きまくる凡ミス*3などをしつつ、難度でいうならLeetCodeのmediumぐらいの物を解いた。つまり劇的に難しいわけでもなく答えも多分20行程である。

leetcode.com

このサービスはGAFAを始めとしたテック企業の入社試験で実際に出たとされる過去問を並べていたり、面接の模擬試験を受けれたりとコーディング試験対策に特化したサービスであると同時に毎週日曜日の朝にコンテストが開催されるいい奴である。AtCoderの問題が時々考察ゲー*4だったりするのに対し、LeetCodeではそういうタイプの問題はめったに出てこない。多分コーディング面接でも考察ゲーは滅多に出題されないからではないかと思う。

LeetCodeは無料で1000問以上解けるし、自分好みの問題が多く出るので好きなサービスである*5。有料プランだと更に面接対策に向けたいろんなサービスが受けられるらしいが使ったことはない。

オンサイト面接

Google名物4〜6人抜きの対面面接である。僕は5人だった。といっても同時に5人と面談をする逆集団面接のような形ではなく、一対一での比較的長時間な面接を5人分行うというもので、何人目で散々な結果を残そうがとりあえず面接官全員と話す事になる。面接官同士は他人の面接過程が見れないので先入観を排した評価を人数分集めることができる、という利点があるのだと思う。昔からGoogleは面接に力を入れている事は広く公言しており、バスの中に入るゴルフボールの数や国中にあるマンホールの蓋の数の推定をさせてた時期もあったというが、僕の面接の時にはその手の問題は出なかった。Googleが近年採用していると公言しているのは構造化面接法というもので、その詳細はよくわからないが構造があるためか全員から志望動機を訊かれるみたいな事も一切なかった。

Google の面接では今でも創造力を試す超難問が出題されていますか?
いいえ。そうした超難問を面接に取り入れても優秀な候補者の判定にはつながらないことがわかったため、現在は出題しておりません。代わりにサンプルテストを実施し、構造化面接法に基づいた質問を行っています。

ホワイトボードのある部屋に通され、AtCoderで言うところのA〜Cぐらいの難度の問題が出された。面接官によっては開幕から「この面接では英語しか使いません」と宣言された時もあり、それは内心だいぶテンパった。問題文をホワイトボードに書いてもらえばリスニングスキルが致命傷になることもないと思ったが、筆記体読めないマンであるという自覚を忘れていたので問題文に書かれたsの字をなんて読むのか訊いたりなどした、それで減点を貰ったのかはわからないが結果として通過できた。

競技プログラミング的な問題の他にもシステムデザインやオブジェクト指向的なインタフェース設計やシステム周りの問題も出題された。僕に出された問題ではないが架空の問題をでっち上げるなら

  • 黒ひげ危機一髪ゲームのインタフェースをオブジェクト指向で設計せよ
  • X万人が同時にアクセスしてくる動画配信サービスを想定し、Yという性能のマシンでZという要件を満たすにはどんな設計で何台のマシンを使うか計画せよ
  • スピンロックの利点と欠点を述べ、実装せよ

こんなノリの問題が出る。この辺はLeetCodeのOO designとかOperatingSystemとかの項目を見ると似たような過去問や想定解などが並んでいる。

他にも直接的にプログラミングの話ではない過去の行動などへの質問なども出るし、そこに応じるための心構えも言いたいことはあるが

f:id:kumagi:20190402030806j:plain

この本に軒並み書いてある。安心して実力を出しきれるように脳内でシミュレーションしてみるために必要な情報が詰まった神本である。ついでにGAFAMなどの面接の裏でどういう仕組みが回っているのかも解説しており興味深い。これの第二版にあたる

f:id:kumagi:20190402030920j:plain

もいいことが書いてあるそうだが僕は読んだことがない。

僕の面接に限って言うと出されるなり絶望するような問題は出なかったが常にタイムアップ気味で、後からあそこはもっとうまく答えられたなぁと反省していたら結果として通過判定を貰っていたのでわからないものである。もう一度受けたら運次第で問題や面接官との相性であっさり落ちるかも知れない。基本的に運ゲーだと割りきって、落ちても悔やまずまた来年受ければいいやと気楽な気持ちでいた方が精神衛生上楽である。

kumagiは有名人だから通ったんでしょ?的な声も散見されたが、入社の過程で僕のtwitterでのフォロワー数やQiitaでの記事などが加味されたような様子は特になかった。面接は終始朗らかに進み、中には僕が一方的に知っているような有名人が現れたりして彼ら彼女らと高度な会話ができたのは純粋にエンジニアとして楽しい体験だった。

給与交渉

そして面接の通過後にオファー額の交渉に入った。本にはいくつか受けてオファーで綱引きさせろと高度なテクが書かれていたが、その時はGoogleしか受けていなかった&2つ前のブログに書いた通りとにかく現職を出たかったので当時の年収の653万という数字にいくらか積み増しをして

僕「うーん、コミコミで800万貰えれば…」
G「じゃあ1350万でどう?*6
僕「謹んで入社させていただきたく存じます(土下座)」

というやりとりを経てGoogleに入社した。この給与交渉こそ電話だったが当然英語であり、額面は何かの聞き間違いかと思ったがこの時ほど自分のリスニング能力を歯がゆく思った事は生涯になかった。その後で書面で正確な額を知り2度驚いた。

まとめ

  • 別に天才じゃなくても(緑コーダーでも)コーディング試験に受かる事例は少なくともここに1件ある
  • TOEIC500点でも英会話はどうにかなる
  • 面接は楽しいのと(1年後に)再挑戦もできるので気負わずに挑んで欲しい
  • 少なくとも僕の給料は大きく上がった

そういうわけで We are hiring です。奮ってご応募ください。

careers.google.com

蛇足気味な想定Q&A

Q. 蟻本とか勧めないんだ?
A. 緑コーダーになるのに蟻本は要らない

Q. どうせNTT研究所で英語バリバリ使ってたりしたんでしょ?
A. そんなわけない。業績を調べてもらっても構わない(白目)

Q. システム系の基礎力全く足りないんだけどどこで勉強できるの
A. https://picoctf.com/ あたりがオススメだと思う(CTFそのものはセキュリティの問題が多いが、最初の方ではシステムの知識が問われるので基礎固めにも使える)あとISUCONの過去問をいくつかやってみると良いのでは

Q. その1350万って数字、どうせ外資だし重病や怪我とかしたら人生詰むんでしょ
A. そう思ってたけど想像以上に会社が給料とは別枠で保険に入れてくれててものすごい手厚い。約款よく読んだら手厚すぎて任意保険即解約した

更新:5人抜きという表現が誤解を招きそうだったので修正

*1:当然僕はそれなりに頭をひねらないと解けないのだけど

*2:この記事執筆現在はギリギリ水色まで上がっている

*3:Ctrl+NはEmacsならカーソルを一つ下にずらす操作だがChromeでは新ウィンドウが作られる

*4:一見すごく複雑そうだが問題をよくよく考察すると入力値の偶数奇数だけを判定するだけのコードで答えが出たりする奴。好き嫌いが別れる。

*5:入社試験を集めるというコンセプト自体はちょっとどうかと思うが

*6:厳密にはストックを含むので時価でブレる