400人くらい面接したけど技術面接はまだまだ難しい

私信電信という共著ブログ(?)を友人たちと始めた。完全に Message Passing - はなしをふったりふられたり にインスパイアされていて、友人たちとあれこれオンラインで雑談する感覚でブログを書いたり読んだりできたらいいなという試み。

今回のテーマは「実際、競技プログラミングって採用時にどうよ?」

競技プログラム強い人が採用面接でも強いかどうか、自分の経験でいうと新卒ならかなり有利、シニアになってくるとそうでもない、という感じかな。

自分が以前働いてたスタートアップ(bolt.com)は自分の在籍してる間にエンジニアが5人から40人くらいに増えたので、たくさん面接する必要があった。あとで数えたら3年間で350回以上面接したようだった。電話面接->オファーのコンバージョン率が10%以下だった気がするのでそれなりに厳しい面接と言っていいと思う(落としすぎてリクルートチームの人から文句を言われたりした)。小さい会社だったので自分が面接して採用された人たちとは全員一緒に仕事をした。なのでこれから書くことは主にBoltでの経験に基づいている。

Boltでの面接については以前 サンフランシスコのスタートアップで面接官をしている - ベイエリアで楽しくやっていく にも書いたけど、最初の1-2年は主にコーディング面接を担当していた。そのあとは自分も「シニアエンジニア」という扱いになったので、デザインインタビューとか過去の経験を話す面接とかも担当するようになった。

技術面接で何を測りたいかというと「この人がチームに加わったとしたらチームが成し遂げたいこと(プロダクトをつくるとか)の生産性がどれだけ上がるか」ということだと思う。新卒なりジュニアなポジションの場合は、前提として実務経験はそんなになくてもいいからある程度自走できて(コードが書けて)かつ実践でいろいろ学習できるひとが欲しい、というのがあって、そのためにコーディング面接を使うというのはわりとうまく機能する気がする。

簡単に面接対策できてしまうという指摘もあるようだけど、それは一方でちゃんと目的に対して準備できるということだから、一夜漬けのテスト対策でもちゃんとコーディング問題が解けるというのは一定の価値があると思う。

自分が面接した範囲で競技プログラムめちゃくちゃやってた人はそんなにいた記憶がないのだけど、なんにせよ授業・業務の外でコーディングに自分から触れているというのはプラスだよねえとは思う。

ほかにコーディング面接の批判でよくあるのは「本当は業務をこなす力がある人を一面的な評価で落としてしまう」というもの。これについては悩ましい問題で、採用のfalse positive(優秀な人を落としちゃう問題)ってそもそも測定しようがないよね。インターンとか期間限定でボーダラインの人を雇ってみるという手もあるけど、かなり採用側のコストが高い。前述の通りBoltではかなりの数の人を落としており、実際はもっと採用しても良かったのでは、というのは当時も思っていた。

コーディング面接に限らずだけど、どうしても人は自分と似た人を採用したくなるバイアスがある気がしていて、Boltの場合はいわゆるGAFA出身のエンジニアが多かったので、採用もGAFA式のコーディング面接重視になっていた。コーディング面接の問題もアルゴリズム的なのが多かった気がする。スタートアップだからもう少し実務に近い感じとかでもいいのではという話は定期的に出ていて、面接プロセスについては在職中に何度か修正・改善を重ねてはいた。

あとはシニアになってくるとそもそもコーディング面接だけじゃなくなってくるよね、という話があると思う。Boltではシニア向けの面接は半分だけコーディングで、あとはシステムデザインと過去の経験深堀りみたいな感じだった。

現職(エンジニア数人のスタートアップ)でもシニアエンジニアを今とても欲してるけど、会社のステージ上、過去の経験が今欲しいポジションにドンピシャな人がほしくて、かなり過去の経験の比重が多い感じ。そういう場合は競技プログラムが業務に直結してるみたいな職種じゃないとあんまり競技プログラムの強さは生きなさそう。GAFAなどのシニアポジションを受けたことがないのだけど、GAFAだとシニアなポジションでもコーディングで突破できるんだろうか?

逆にシニアエンジニアになってくるとそこまでガリガリコード書いてない+いわゆるコーディング面接みたいな問題設定から離れてるので新卒よりコード面接ができない、というのは何度も見た。自分が見てきたすごいエンジニアの人はなんだかんだコード面接もすごくできる人が多かったけど、コード面接ができないけど実務上プロジェクトを前に進められる人というのは一定数いるだろうなあとは思う。

色々ぐるぐる書いたけど結論に戻ってくると、自分は今のところ

  • ジュニア→コーディング面接重視
  • シニア→過去の経験深堀りとデザインインタビュー重視

というBoltでやってた形式に落ち着いている。 これが最適なのか?というのはまあ結局の所わからないんだけど。


他の二人の記事はこちら 実際、競技プログラミングって採用時にどうよ? | 私信電信