サンフランシスコのスタートアップで面接官をしている

絶賛人員拡大中のスタートアップに転職して以降、コーディング面接の面接官をするようになった*1

弊社はいろんな方面で人員を拡大中のため、面接対象の職種も多岐にわたっている。具体的には、入社からの数ヶ月の間で以下の5つの職種の候補者を面接した。

  • Fullstack engineer (自分の職種)
  • Infrastructure engineer
  • Data scientist
  • Technical product manager
  • Sales engineer

基本的に自分に期待されているのはエンジニアリング(主にコーディング)の技能のチェックなので、職種にかかわらず似たようなコーディング面接を行い*2、職種に応じて評価を調節することが多い。

コーディング面接に際しては、うちの会社ではcoderpadを利用して、実際に動くコードを書く面接を行っている。自分の(インタビューされる側としての)数少ない過去の経験だと、大企業のほうがホワイトボードにコーディングさせる傾向が多く、スタートアップは実際にコードを書いて実行させることが多い気がする。大企業は基本的な理論や理解を問うのに対し、スタートアップは実際に職務を完了させることができるかを見たがっているということかな、と思っている。

もちろん、弊社でも場合によってはアーキテクチャの議論にフォーカスしてホワイトボードのみで面接することもあるし、場合によってはずっと喋っているだけという場合もある。自分は今のところはコーディングを中心とすることが多い*3

コーディング面接の問題としては、LeetCodeなどから見つけてきた問題のストックの中から、応募者の経験に応じて出題している。なかなか手頃な問題のリストを集めるのに未だに苦労しているのだけど、一応自分が意図しているのは以下

  • トライ木など、発展的なデータ構造の知識の有無に依存するような問題は避ける
  • 複数の解法があるとなお良し
  • 30分くらいで実装が終わる
  • 現実の問題になるべく近いとなお良し(例えば、自分でLinkedListを実装する、みたいなのは避けるようにしている)
  • 自分でも出題する問題を一度は解いておく

自分が面接を受ける側だったときに、インタビューの内容によってやはり会社に対する印象が変わっていったので、なるべく候補者に面白いと思ってもらえるような問題を出題しようとしているが、正直まだまだ模索中である。

面接のフォーマットとしては、最初に5-10分くらいアイスブレイク的な会話(雑談と、過去の経歴、転職してやりたいことなど)をしたあと、コーディング面接を行い、最後に5分ほど応募者からの質問に答える時間をとるようにしている。

コーディング面接に際しては、

  • 応募者がうまく自分の考えをコミュニケーションできるか
  • 実際に解法のアイディアにたどり着くことができるか
  • コーディングの早さやアプローチ(例えばこまめにテストをして問題がないか確かめ、簡潔なコードを書けるような人は印象が良い)
  • 例外的なケースにちゃんと気づくことができるか(ちゃんと説明してくれれば実際にそれに対応する必要はない)

あたりを見ている気がする。

逆に自分がどうでも良いと思っているのは

  • 必要以上に細かい例外処理: 時間がもったいないので、例外ケースを認識しているということだけ伝えた上で無視してくれるのが一番ありがたい
  • 計算量の議論: 別にしてもいいんだけど、間違った計算量見積もりを言われると藪蛇になってしまうので、聞かれないなら言及しないのが無難だと思う

候補者がすぐに一問目を解いてしまった場合は、簡単な問題をもう一問出題することもあるけど、大抵の場合は一つの問題でインタビュー時間のほとんどを使う。逆に候補者が手こずって時間がかかっている場合は、ヒントを出して、時間内に一応解法まではたどり着けるようにしている。中途半端なところで終わってしまうと候補者としても後味が悪いと思うので。

まだ累計でも十数回インタビューしたくらいなので、まだまだ実際に面接しながらこちらも学習してるような段階だけど、流石に最初の頃と比べると少し慣れてきたような気がする。今年ももっと面接をしないといけない予定なので、引き続き頑張っていきたい。

おまけ: 面接を受ける場合の話

自分はこちらもたいして経験がないけど、たまにアドバイスを求められることがあるのでついでに書いておく。

参考書としては世界で闘うプログラミング力を鍛える本 コーディング面接189問とその解法がおすすめ。著者は元Googleのエンジニアで、記載されている例題も妥当っぽい感じがする。ただしこれは問題集的なので、これを一読しただけでわからないことがあるようなら別途お勉強する必要があるかもしれない。コンピュータサイエンスの全般的なことが一通り網羅されている。

実際の面接では補完の効かないオンラインエディタを使ってコーディングしながら、英語でコミュニケーションを取らないといけないので、それも練習しておくと良さそう。プログラミング中のボキャブラリなんてたかが知れてるので、慣れれば日常会話ほどは辛くない。interviewing.ioというWebサイトで無料でコーディング面接の練習をすることができる。

プログラミングの問題を解くだけならLeetCodeというサイトも有名っぽい。たまにPKU Online Judgeなどで練習してる人も見かけるが、プロコンで求められる能力とコーディング面接で求められる能力は必ずしもイコールじゃない(プロコンのほうがより数学・パズル的)ことには注意したほうがいいかも。

あとはシニアになるほど抽象的な話とか過去の経験の話とかが増えてくる(過去にした設計上の誤りの話とか、チームでどうやってタスクの優先付していくか、など)ような気がするけど、そういうのは対策が難しそう。普段からそういうことを考えるようにしてるといいんだろうか。

*1:前職では3年も在職していたのにインタビュー講習を結局受けないままだったため、一度も面接官にならなかった

*2:実際には事前に他の面接官と相談して、誰がどういった側面をインタビューするか決めている。例えばインフラエンジニアの採用なら、ひとりがコーディング全般のインタビューをして、もうひとりがインフラを実際にセットアップする実技試験、もうひとりが過去の経験やインフラの知識全般を聞くといった具合

*3:これは恥ずかしながら自分の英語でのコミュニケーション能力の欠如によるところもあると思う…違ったフォーマットにもだんだん挑戦していきたい次第