付け焼き刃でベイエリアの面接を突破する方法

Daigo Sato 氏:よろしくお願いします、Daigoです。いま、ベイエリアにあるサンマテオというところに住んでるんですが、アメリカがつまらなすぎて日本に3ヶ月ほど滞在しています。

今日はコード面接について話そうと思います。あ、Twitter(@daigo)、非常に覚えやすいんで、ぜひフォローしてください。

キャリアなんですが、最初はActivision Blizzardというゲーム会社に入って、スクウェア・エニックス、ディー・エヌ・エーを経て、ディー・エヌ・エーのサンフランシスコオフィスに移籍しました。いまはなんと無職になって2年経ってしまったんで、スマニューに入ろうかなと(笑)

(会場笑)

(スライドを指して)こちらが今日話さないことです。もし興味があれば、あとで話を聞いてください。

最近は@hajimehoshiという人とgolangでゲームを作ってたりするので、スマホをお持ちの方はぜひ事前予約して、私の生活を支えてくれればと思います。

1つ告白なんですけど、僕はホワイトボード面接がすごく嫌いです。本当に嫌いなんですけど、なんでかというと、ホワイトボード面接はまず、そもそも人前でコーディングさせられるという羞恥プレイなわけです。尊厳が踏みにじられる感じです。

あと、勉強で時間をとられるのがとてもつらい。Googleに入るのに、2ヶ月は勉強しないと無理じゃないかなーと思っているんですが、ゲーム開発で忙しくてなかなか時間が取れません。

そして、当日、けっこう疲れるんですよね。1日がかりなので、終わったらとても眠いです。

あと、ホワイトボード限定の話ですけど、そもそもホワイトボードにどうモノを書くかというスキルが重要なんですよ。だからペンのインクが出ないとか、そういうところで苦しむという。

(会場笑)

そういうのがリアルにあるんで、ちょっとイヤですね。当日のコンディション、面接官や質問の内容が結構運もあるなぁ、と面接が終わるたびに思ってました。

面接はもはや「受験」

面接の内容が難しいかというと、会社にもよりますが、準備しなかったら、まず落ちるんじゃないかなと思ってます(笑)。コードインタビューというのは1つのスキルであると、割り切る必要があろうと思います。

コードインタビュースキルは通常の業務ではあまり鍛えられません。普段、バイナリツリーの実装とか、あんまり意識しないと思うんで。アルゴリズムとデータ構造をガチで勉強してきた新卒は記憶がフレッシュですけど、オッサンにはなかなかつらいんじゃないかなと。

あと、自分は「動けばいいや」と考えるタイプの人間なので、ちょっとつらいかな。コードインタビューを制覇するためには態度を改める必要がありますね。

先程も「Homebrewの開発者も落ちた」という有名な話がでてきましたが、必ずしもその人の職務上の能力と面接の評価は一致しないと思います。これがすべての元凶と思ってるんですけど、『Cracking the Coding Interview』という本があって、要は「Googleとかの大手ではこういう面接をしてますよ」的なことを書いた人がいます。

これを見て、小さい会社も大きい会社も含めて「これに従っておけば、ハイスペ技術者が来るだろ」みたいな感じで、盲目的に取り入れるようなものになってしまった。なので、形骸化していると感じられる事例も多く、友人のアメリカ人でも、「コーディングインタビューは死ぬほど嫌いだ」という人は結構います。

FacebookのHRからのメールとかに、まさに「これ準備しとけ」っていうのが書いてあったりするんですよね(笑)。大変親切だとおもいます。

しかも、Interview Prep Sessionというものもあるらしくて、「受験者みんなでインタビューの準備しようぜ!」みたいなものをFacebook公式でやっているっぽい? また、「Helpful Links」というのがメールに載っているのですが、これをみると、けっこう勉強しなきゃいけないなというのがよくわかります。 (会場笑)

これはもはや受験だと思うので、受験が苦手な人にはけっこうつらいんじゃないかなぁ、と僕は思います。とはいえやるしかない。ホワイトボード面接、嫌いではあるんですけど、たぶん変な人を採用するコストのほうが高いという現実があって、足切りとしてみんな取り入れてるのかなぁ、とか自分を納得させて取り組んだりしています。

Just a casual chat=面接をやろうぜ

コードインタビューはできれば、一生経験せずに死にたかったんですけど、ディー・エヌ・エーが(欧米での開発から撤退して)クローズして、強制退場になってしまい、気づいたらベイエリアに1人、ぽつんと、無職になってしまったんですね。

できれば転職ももう一生せずに生きていきたいと思ってたんですけど、あるスタートアップのHRの人が「Why don’t you check out our office?」ということで「ちょっと会社見ていけよ」とパーティで言ってきたんです。

「ちょっとほかの会社どうなのか興味あるし、見ていこうかな」と思ったら……これが罠で(笑)。

見に行くだけと言ったのに、メールで詳細な面接スケジュールが来ていて、「話が違うな」と。

それでオフィスに着いて、部屋に案内されて「なんで五目並べしてるんだろう」とか思いつつ、「マージソート」ってどうやるんだっけ、みたいな。アーキテクチャは得意というか、Prepがなくても経験からできる内容だったのでよかったんですけど、とくにアルゴリズムはつらかったです。雑談は心が洗われますね、適当に話しておけばいいんで。

(会場笑)

(スライドを指して)とりあえず、HRは信用できません。あの手この手で面接をセットアップしようとします。「もう何も信じない」(笑)。

「Just a casual chat」は、つまり、「面接をやろうぜ」ということです。「It's easy」とかも信じてはいけない。準備しないと落ちるのでそうなると非常に惨めです。とにかくHRがコンバージョンを狙ってるんで、抜かりないですよ。唯一信じていいのは「Happy hour」(仕事終わりの憩いの時間)くらいかなと思ってます。

(会場笑)

テックインタビューは自分との戦い

電話面接もあります。コネがあったりする場合、電話面接はすっ飛ばせることもありますが、なにもない会社の場合は電話面接が入ったりします。

Codilityとか、そういうサービスもあると思いますけど、自分が最近見たのはcodepad.orgです。ホワイトボードの代わりにそこに書いて、実際にコンパイルしたりデバッグしたり。「Best Time to Buy and Sell Stock」とか、ここらへんの段階でけっこうよく出る問題だなと思ってます。

主に自分との戦いで、頭が真っ白になることもありました。準備が足りないとか、まったく自分が準備してなかったやつが出るとか、もしくは準備しすぎて徹夜して眠かったりすると頭が真っ白になって、本当にもう「家に帰りたい」としか思わないです。

優れた面接官はつまってしまった人を救ってくれる気がしていますが、ダメな人だと放置してきますね、40分くらい。これは本当につらくて、「助けろよ」って思うんですけど(笑)。

(会場笑)

うまく助け舟を出してもらって、それで前に進めると復帰できることはあるんですけど、大抵はもういっそのこと殺してくれ、という気持ちになっているので復帰は非常に難しい気がします。

あと、たぶん最適解をいきなり出すのはダメで、最初はとにかく効率が悪くてもいいから解けると(いうことを示します)。なぜなら、それでまず点数がついて、そのあとのフォローアップでさらに点数がつくからです。

ホワイトボード面接の心得

ホワイトボードTips。

大抵コードを書くことになるんですけど、このあいだ行った会社ではホワイトボードではなくてパソコンをつかってコードを書かさせてくれました。

ただ、ホワイトボードのほうがいいときもあるなと思いました。コードはコードで図やグラフ構造にすごく弱いですし。そういうときはホワイトボードのほうがいいかも。

あと、ホワイトボードで書くときに型のある言語はやめたほうがいいですね(笑)。

(会場笑)

ふつうに記述量が増えるので。自分はよくJSを使って、適当に書いてますね。なるべく短く効率よくコードを記述しましょう。

また、これは基本ですが、自分はわりとコードを書きながらものを考えるところがあったんですが、ホワイトボード面接においては方針を決めてから書いたほうがいい。そうしないと、黒板消しで消す時間とかで相当に時間の消費が激しいです。ホワイトボードでのinsertがかなりつらい。

(会場笑)

ホワイトボードでヘルパー関数を使っちゃいけないみたいなイメージがあるんですけど、そんなことはない気がします。説明ができれば意外と標準関数を使ってもいいみたいなところがあるんで、積極的に使うといいのかなと思います。Pythonとかだと、いろんな便利関数がはじめからついてるんで、わりと便利にできる気がしてます。

やはり、ホワイトボードを買って練習しないと無理だなって思いました。会社が大らかなところだったら(会社の)ホワイトボードでやってもいいですけど、少々怪しまれるかもしれません(笑)。

(会場笑)

ホワイトボードに書いてるときにも、なるべくブツブツひとり言をつぶやく必要があります。そうしないと面接官は、何やってるのかわかんないですから。

自分はゲーム系なので、ベクトルとか当たり判定とか、それ系の問題もわりと出ます。一番よく見たのは円と線分の当たり判定なので、これは準備しておいたほうがいいんじゃないですかね。あとは経路探索とか、そのあたりですかね。

ほかにも「ホワイトボード シリコンバレー 面接」で検索するとかなりいろいろ出ます。

テックインタビュー対策のススメ

テックインタビューはつらいわけですが、じゃあどうやって準備するかってところですね。「LeetCode」という最強のサービスがあって、僕はこれをやっておけばいいと思ってます。

これは受験と同じなので、受験と同じように過去問で傾向と対策を練りましょうLeetCodeは有料サービスになると、各社の過去問まで見られます。

優しい人たちがみんな、過去問を登録してくれるんです。プレミアムって書いてあるんですけど、ぜひインタビュー期間には課金して使ってもらえるといいなと自分は思います。

LeetCodeに、preorder、inorderとかのトラバーサルの問題があったんですが、一度これと全く同じ問題が面接ででました。「あっ、これLeetCodeでやったところだ!」ってなりましたね(笑)。

(会場笑)

面接官によっては何を思ったのか「この問題、知ってたら言ってね」って言ってくるんですが、「言うわけない」って(笑)。

(会場笑)

「いやー、これ難しいっすねー」と、ちょっと演技しながらいい感じに解くというスキルも必要かなと。ということで、LeetCode、やりましょう。

正攻法以外の戦い方

そう、それがたった1つの方法……と思っていた時期があったんですが。僕たちはもう大人なので、正攻法だけで行く必要はないと思うんですよね。。僕はこの話をするときに、『NARUTO』の中忍試験を思い出すんですけど、「ズル」することを含めて「試験」なのだと思っています。

(会場笑)

例えば「CEO/CTOに気に入られる」とか。

一度テックインタビューが明らかにうまくいかなかったんですけど、受かったんですね。これはもう、バフがかかっている状態です。

(会場笑)

ほぼ出来レースなので、よほどひどくなければ、もう大丈夫です。現場の人を納得させるためにしょうがなく面接している感じがあります。

「契約社員で始める」というオプションもおもしろいなと思いました。

会社に誘ってくれてる人がいたんですけど、「いやーでも、面接の準備で2ヶ月かかるし、ベストを尽くしたいので今は無理です」とグチグチ言ってたら、「わかったよ、とりあえず契約で始めて」って言われて、「それならいいよ」ということではじめて、2ヶ月でオファー。テックインタビューなし!

これはなかなかいいんじゃないかと思いました。また、契約(社員)で実力を示して、自分が抜けると困る状態にしてからのほうが、オファーをつり上げられるかな、と考えていたのですが、実際にワークしました。

あと、ちょっとグレーですけど「受験者と共謀する」とか。

(会場笑)

特に小さな会社だと、面接の問題のストックがあまりないのか、けっこう同じ問題が出てくるんで、そういうのを賢く……これは、まぁ、はい(笑)。

(会場笑)

最後に、これは大変良いと思っているのですが、「すでにその会社にいる人と練習」。稽古をつけてもらいましょう。実際面接もしてるでしょうし……。

持てる手段を総動員する

僕はホワイトボード面接が好きじゃないし、面接自体が好きじゃないんですが、プログラマーは怠惰が美徳らしいので、視野を広げていろんな方向から攻めるのがいいんじゃないかと思います。それはLeetCodeを使ったり、コネを使うことだったり、持てる手段を総動員するべきだと思います。

でもこういう付け焼き刃だとGoogleとかFacebookとかに入れる気はしないので、真面目に勉強してください。

(会場笑)

あ、LeetCodeといえば、1個、宣伝してもいいですか。

「LeetCodeもくもく会」というのがSlackであるんですが、@ryo1katoさんが主催してるんで、「ベイエリアによく行くよ」って人とか、「時差があってもいいから、みんなでLeetCodeの情報交換したいぜ」みたいな人はぜひ、この人に連絡をとってみてください。

面接官によっては、工夫をこらして面白い問題を考えてくれたりもします。例えばこういう問題がありました。

AがスタートでBがゴール。途中に円の障害物がたくさんあるので、これらを通り抜けて左から右に行きたいという問題です。通り抜ける人のサイズは無視していいことにすると、隙間が少しでもあれば通り抜けられるということになります。

これを1つやるだけでも、再帰とか関数化とか、すごく簡単ですけど円の衝突判定みたいなものも、工夫して考える必要がある。一通り解いた後、計算量を減らすためにどうするか、みたいな質問が面接官からあったりするわけですね。まぁ、そういう感じです。

以上です。ご清聴ありがとうございました。