優秀なエンジニア採用に必須のコーディング試験とは?

はじめまして、株式会社ハイヤールー代表葛岡(@kkosukeee)です。2021年のスタートと共に、株式会社ハイヤールーを仲間と設立してはや2ヶ月、順調なスタートとβ版のリリースを終え一息ついたところで、オウンドメディアをはじめました。

記念すべき第一弾の記事はなぜ優秀なエンジニア採用にはコーディング試験が必須なのかを実際にDeNAやメルカリで積んできたキャリアを持つエンジニアとしての観点から話したいと思います。

コーディング試験をエンジニアの採用プロセスに組み込もうとしているテック企業や、すでにコーディング試験を導入しているんだけど他社の事例も見てみたい。という方に少しでも参考になれば幸いです。

コーディング試験とは?

コーディング試験とはエンジニア採用に必須である、エンジニアの技術力を判断する選考のプロセスです。日本でもテクノロジーに強い企業ではどんどん普及しており、メルカリ、LINE、M3、SanSanなど日本を代表する企業は新たに選考フローに導入しています。

後に事例を紹介しますが、パターンは複数あり、典型的なものとしては対話式で行うアルゴリズムの問題や、オフラインで課題形式で提出してもらうなど様々なものがあります。海外では前者の対話方式で行うものが多いですが、日本では後者の課題方式で行うものが多い傾向にあります。

海外によく見られる問題としては、大学で習うコンピューターサイエンスの知識と多少のプログラミング力があれば解けるものとなっており、私自身某海外テック企業の面接で出題された問題としては以下のようなものがありました。

二分木のRootである node が与えられ、あなたはこの二分木の右側に立っています。

この時右側から見える node を上から順(RootからLeafに)に配列として返すプログラムを書いて下さい。

この様な問題には複数回答があります。それぞれの回答は一長一短のため、それらを全て簡潔に説明できる候補者は優秀とされます。それでは回答の中からいくつかピックアップしコード無しで説明して雰囲気を掴みたいと思います(エンジニアのバックグラウンドがない方は雰囲気だけでも掴んでいただけると幸いです)。

回答1

幅優先探索で全てのNodeを訪れ、二次元配列を作る。

作った二次元配列配列の一次元目をループし、最後の要素だけを抜いた配列を作り答えとする。

回答2

深さ優先探索であるPre-Order Traversalを右から行う。

各深さで一番最初に訪れるNodeを返り値となる配列に入れて最後にReturnする。

アルゴリズムの知識を使い問題を解くことも大事ですが、このように複数答えがある場合はそれ以外にコミュニケーション能力や問題を解く過程の思考回路も評価基準として設けられます。次のセクションでは前述した回答を見ながら、どの様な評価基準でコーディング試験を採点すればよいかについてお話したいと思います。

コーディング試験の評価軸

前セクションではコーディング試験とはどんなものかというのを実際のアルゴリズムの問題とともに説明しました。同時に実際に某海外テック企業で出題された問題のサンプルの回答として2つを挙げてみました。続いてこれらの回答から候補者技術力をどのように判断するのかを説明したいと思います。

GAFAのPhone Screening(*詳細は後述)で行われるアルゴリズムのオンラインコーディング試験では、大きく4つの項目を判断しています。まずはじめに定量的に評価が可能な技術目線の項目、そして定性的に評価される非技術的項目を見ていきます。

コンピューターサイエンス基礎知識

コーディング試験で出題される問題の多くは、前セクションの例題のようなアルゴリズムの知識を要する問題です。最低限の知識がないと解けない問題にはなっていますが、面接官は候補者との会話を通じて「コンピューターサイエンスの基礎知識などが充分か?」を評価しています。

前述の二つの回答にはキーワードとして「幅優先探索」と「深さ優先探索」があります。これらは基礎知識として認知されており、大学で情報専攻している人だとおなじみのアルゴリズムとなっています。優秀な候補者はそれぞれアルゴリズムの長所・短所を理解しており、実装に入る前に面接官に説明します。

以下のようなやり取りは、かなり優秀な候補者でコンピューターサイエンスの知識が充分にあり、また面接官とも適切なコミュニケーションが取れてると言えます。

候:この問題は「幅優先探索」で解けます。その際必要な計算量はO(N)でNがNodeの数となります。
面:はい。「幅優先探索」以外の解法としては何が他に挙げられますか?
候:「深さ優先探索」を用いて、右側からPre-Order Traversalを行うことにより、問題は解けます。がその時も計算量は変わらずO(N)になります。
面:そうですね。それでは実装に移ってください。
コーディング力

前述のコンピューターサイエンス基礎知識と共にコーディング力も評価します。これは実装すると決めたアルゴリズムに対して、簡潔に可読性の高いコードが書けているか、またエッジケースなどがカバーされているかを判断します。

ここでは実際のコードを見たり、過程を説明して良い候補者・悪い候補者は見ませんが、いくつかピックアップした良いケース、悪いケースを見ていきたいと思います。

良いケース

  • 問題の複雑度を低くするために、エッジケースを事前にハンドリングしている
  • コード量が必要な問題に対し関数を切り離し、切り離した関数はすでに動いてると仮定し本質部分を進めていく

悪いケース

  • 汎用性が少なく、条件分岐が非常に多い問題に特化したコード
  • 関数を切り離したりせず、スパゲッティコードを書き、本質でないところに時間を使いすぎる

提出するコードも大事ですが、過程も同様に大事で、オンラインのコーディング試験ではこれら全てが判断できるため技術力の判断に非常に有力です。

コミュニケーション能力

オンラインのコーディング試験では、実際に面接官と候補者がコミュニケーションを取りながら行います。ここでは単なるコミュニケーション能力ではなく、技術的なディスカッションができるかを軸に評価しています。

採用側として避けたいのは技術力は非常にあるが、孤立してしまうタイプのエンジニアであり、逆に採用したい人はチームとして成果を残せる優秀な人材です。コーディング試験のセッションはオンラインで行うため、コミュニケーション能力などを判断するにはもってこいとなっています。

ここではいくつか評価の高い候補者との低い候補者の典型的なケースを例として挙げたいと思います。

良いケース

  • 問題のエッジケースなどを候補者に事前に確認し、問題の複雑度を低くする(例:引数が数字の場合、負の数字は入力としてあり得るのかなど)
  • 問題に詰まった際、面接官と適切なコミュニケーションを取り、必要であればヒントを求める

悪いケース

  • 与えられたヒントを無視し、自分の考えた実装で押し切ろうとする
  • 問題に詰まった際黙り込んでしまい、面接官から声を掛けるまで何もしない

面接官はすでに回答やヒントなどを知っているため、候補者と適切なコミュニケーションを取り正解に導く必要があります。オンラインのコーディング試験では面接官を味方につけ問題を解く候補者がコミュニケーション能力観点では高く評価され、黙々と一人で解いてしまう人は低い評価が付けられます。

思考プロセス・地頭力

面接官は候補者が詰まっている時に時折ヒントなどを与え、それに対してのレスポンスなどを見て思考プロセスと地頭力を判断しています。黙々と問題を解くだけではだめで、きちんと自分の考えを面接官に伝える必要があり、それらを元に判断されます。

問題に対しての質問などを多く投げかけ、複雑な問題をシンプルにしていくプロセスは建設的な問題の解き方だと高評価され、逆にいきなりコードを書き出したりすると返って悪い評価が付きやすい傾向にあります。

地頭力は与えたヒントや、会話での反応速度など定性的に評価することが可能であり、オフラインのコーディング試験などでは評価できないため、オンラインのコーディング試験の非常に大事な評価項目となっております。

事例で見る採用プロセス

ここまでコーディング試験と評価軸などを見てきました。次に実際に私が試験を受けたことのある海外・国内の有名なテック企業の事例をいくつか見ていきたいと思います。

ケース1: Google

Googleは言わずもがな世界最高レベルのエンジニア組織をもっています。Googleのエンジニア採用のプロセスは大きく “Phone Screening” と “Onsite Interview” の2つに分かれています。それぞれみていきましょう。

Phone Screening(電話面接)

45分の対話方式でHangoutとGoogle Docを組み合わせ、採用された後に同僚になるかもしれない内部のエンジニアと一緒にアルゴリズムの問題を解きます。コンピューターサイエンスの知識がないとここで9割がふるいにかけられ、残った人が次のステップであるOnsite interviewに進みます。

Onsite Interview(現地面接)

Phone Screeningにパスすれば次はGoogleのオフィス(私の場合は六本木ヒルズオフィスでした)に行き、一日45分のセッションを4~5個こなします。実際のケースでは、アルゴリズムの問題3つ、システム設計の問題が1つ、そしてGooglinessと呼ばれるBehavioral Interview(非技術的な行動面接)のセッションを行いました。これら全ては採用された際、一緒に働くであろうGoogleのエンジニア・マネージャーと一日を使い選考します。

コーディング試験はホワイトボードにコードを書き行われます。システムデザインも同様にシステムの構成図などをホワイトボードに書いて、Googleのエンジニアと技術的なディスカッションを繰り返し行います。非技術的な試験(Behavioral Interview)に関してはマネージャークラスの人と口頭で行います。

ホワイトボードにコードを書くのは比較的難易度が高く(自動補完なんてもちろんありません笑)練習をしないとほとんどの人が落ちるのではないかなと勝手に想像していました(事実9.9割の人がここで落ちます)。

ケース2: Facebook

FacebookもGoogle同様圧倒的なエンジニア組織を持っています。採用プロセスはGoogleとかなり似ており、Phone ScreeningとOnsite Interviewによって優秀なエンジニア以外をフィルターにかけ採用しています。特徴的だったのは行動面接をそこまで入念に行わず、とにかく技術優先で判断しているところでした。

Phone Screening(電話面接)

Google同様45分でアルゴリズムの問題を解くセッションです。BlueJeans + CoderPadを使用してFacebookのエンジニアとともにアルゴリズムの問題を解きます。Binary TreeやHash mapの様な基本的なデータ構造に関する問題が出題され、前述のようなコミュニケーション能力や問題解決力を判断軸とし、残った人が次のステップであるOnsite Interviewに進みます。

Onsite Interview(現地面接)

ここも基本的にはGoogle同様です。Phone Screeningを通過すると数日後にFacebookの人事から連絡があり、Onsite Interviewをするためのスケジュールなどが始まり、最終的にはFacebookのオフィス(私の場合はFacebook Singaporeオフィスでした)に訪問し現地のエンジニアとともにアルゴリズムの問題を約3~4セッションこなします。

出題問題や形式はGoogleとかなり似ていて、基本的なデータ構造の問題やシステムデザインに関する問題が出題されます。Googleとの違いはFacebookはBehavioral Interviewの時間が少し短く、Behaviroal Interviewの最後の15分程を使用しアルゴリズムの問題を更に一問解いて終わりというプロセスでした。

ケース3: メルカリ

国内のテック企業でずば抜けたエンジニアリング力をもっているメルカリの採用プロセスにも触れたいと思います。GoogleやFacebookとは異なったプロセスですが、比較的日本企業はすでに似たようなプロセスを入れてる企業が多く、Google, Facebookと比べると国内の企業でも真似しやすいのではないかと思います。

オフラインコーディング試験

まず書類選考を通過すると課題が渡されました。この課題は募集している役職によって異なると思いますが、私の場合はオフラインで一週間ほど期間が与えられ提出する形式でした。

提出を終えるとコーディング試験の合否の連絡があり、通過した場合は次のステップに進みます。アルゴリズムの問題というよりは役職に関係のある課題が出される点ではGoogleやFacebookとは異なり、また完全にオフラインでコミュニケーション能力や技術的な会話力などは評価しません。

技術ディスカッション

コーディング試験の合否の連絡後、通過していた場合は、メルカリのエンジニアと一緒に一時間弱提出したコードに対する技術的なディスカッションをします。おそらくここでコミュニケーション能力やオフラインでは判断できない項目を評価しているのだと思います。

なぜその実装をしたか、潜在的な改善点などいくつかの技術的な会話を実際のエンジニアとすることによって、候補者のエンジニアリング力や経験、知識といったものを評価し、通過した際はバリューに共感できる人材か、カルチャーフィットする人材か。など非技術的な面接をいくつか繰り返し採用の合否を判断します。

コーディング試験の必要性

これら3社の高いエンジニアリング力を持つ会社の選考プロセスに共通するのはコーディング試験です。コーディング試験にはGoogleやFacebookのようにリアルタイムでオンラインでやるものもあれば、メルカリのようにオフラインでやるものもあります。

それぞれ評価項目が違ったり、採用したいエンジニア像によってコーディング試験の形式は異なりますが、ほぼ全ての有名な海外のテック企業はコーディング試験を行っています。なぜ高いエンジニアリング力を誇る会社はコーディング試験をするのか、最後にそれについて話したいと思います。

技術ミスマッチを防ぐため

日本の企業ならではでありますが、一度採用すると簡単にクビにするといったことはできません。エンジニア採用でよく失敗例として上がるのが期待値とパフォーマンスとのギャップから生まれるミスマッチです。それが起きると企業側もエンジニア側もLose Loseとなってしまいます。

カルチャーやバリューへの共感などはコーディング試験からは判断できませんが、技術に関しては事前に判断することができます。そこで役立つのがコーディング試験です。

Google, Facebookのように基礎的なアルゴリズムの問題を解いてもらうことによって候補者のコンピューターサイエンスの知識などが評価することができます。これらは履歴書や職務経歴書では判断できないですが、オンラインでのコーディング試験をすることによって技術力が足りない人はすぐに分かってしまいます。

強いテック企業ほどこのスクリーニングと呼ばれるプロセスが、技術ミスマッチを防ぐ観点でも非常に大事になってくるのです。

期待値とパフォーマンスのギャップをなくす

どれだけアルゴリズムの問題が解けても技術スタックが合わなかったり、かなりの前提知識を要する役職なのに経験が浅かったりすると期待するパフォーマンスと実際のパフォーマンスにギャップが出ます。

メルカリのように役職に沿った課題を出すことによって、経験や知識をテストでき、採用後にかかるオンボーディングのコストや期待値とのギャップを減らすことができます。これにより一緒に働くエンジニアとの共通言語ができ即戦力採用が可能になるため、個人的にはアルゴリズムの問題と同じくらい大事なコーディング試験だと思っています。

期待値とパフォーマンスのギャップからチームにいざこざが生じ、崩壊するチームをエンジニアキャリアの中でいくつも見てきました。全てはコーディング試験で防げるとは思ってませんが、少なくとも技術的要因で起きるものに関してはコーディング試験などを取り入れることによって防げると考えています。

まとめ

ここまで読んでいただきありがとうございます。エンジニアのキャリアを積み、採用にも携わった私の観点で詳細にコーディング試験の概要と、なぜそれが必要なのか、そして国内外の事例をいくつか見てきました。

コーディング試験は企業と候補者の技術ミスマッチを防ぐために、海外では当たり前のように導入されており、日本でもテクノロジーに強い企業を筆頭にどんどん普及しています。その一方導入コストが非常に高く、メルカリもこの点に去年(2020年)のアドベントカレンダーで触れています。

そのような課題を解き、日本のエンジニア採用の新しい当たり前を築くべく先日HireRoo(ハイヤールー)というコーディング試験サービスをβリリースしました。私達はこのサービスを通じ、企業と候補者の技術ミスマッチを防ぎよりフェアなエンジニア採用を実現できると信じています。

少しでも共感された方、もしくはコーディングを試験的に導入してみたいと考えている方がもしこの記事を読んでくださっているのであれば、ぜひお気軽に弊社LPからお問い合わせいただけると幸いです。

f:id:KKosukeee:20210309154741p:plain