何千ものコーディングインタビューを分析しました。これが私たちが学んだことです。

注:この記事ではほとんどの単語を書きましたが、伝説のデイブ・ホルツがデータ側の面倒な作業を行いました。彼の作品の詳細については、彼のブログをご覧ください。

この投稿を読んでいる場合、技術面接のクレイジーで怖い世界に再び入ろうとしている可能性は十分にあります。

たぶん、あなたは初めてインタビューのプロセスを経験する大学生や新卒者かもしれません。たぶん、あなたは経験を積んだソフトウェアエンジニアであり、数年も面接について考えたことがないかもしれません。

いずれにせよ、インタビュープロセスの最初のステップは、通常、多数のオンラインインタビューガイドを読み(特に、興味のある企業によって書かれている場合)、インタビュープロセスの経験について友人とチャットすることです(両方ともインタビュアーとインタビュイー)。

おそらく、インタビュープロセスのこの最初の「探索的」フェーズで読んで学んだことは、今後の準備をどのように選択するかを示します。

インタビューの準備に対するこの典型的なアプローチには、いくつかの問題があります。

  • ほとんどの面接ガイドは、ある会社の観点から書かれています。企業Aは効率的なコードを本当に重視するかもしれませんが、企業Bは高度な問題解決スキルをより重視するかもしれません。会社Aに心が向けられていない限り、おそらく、会社Aが重視するものにあまり重きを置きたくないでしょう。
  • 意図しない場合でも、時々嘘をつきます。書面では、企業は言語にとらわれない、または答えが正しくない場合でも、思考プロセスを説明する価値があると言うかもしれません。しかし、これが実際に彼らがどのように行動するかは明らかではありません!ハイテク企業が応募者プールを欺こうとしている悪意のある嘘つきだと言っているのではありません。暗黙のバイアスが潜入することもあり、人々はそれを認識していないこともあります。
  • あなたが友人や知人から聞く「民俗知識」の多くは、実際にはまったく基づいていないかもしれません。多くの人々は、短いインタビューが運命を綴ると思います。同様に、誰もが1つの長いインタビューを思い出すことができます。その後、「そのインタビュアーで本当に成功しました。間違いなく次の段階に移行します」と考えていました。彼らがインタビューでどのように行ったかを測定するのは本当に悪い。今回は、インタビューの長さなどの指標を直接見て、それらが実際に重要であるかどうかを確認したかったのです。

私の会社のinterviewing.ioでは、テクニカルインタビューとその結果にデータ駆動型でアプローチする独自の立場にあります。匿名で技術面接を練習できるプラットフォームがあります。うまくいけば、Uber、Lyft、Twitchなどのトップ企業といつでも好きなときに匿名でインタビューできるようになります。

クールなことは、企業への実務面接と実際の面接の両方がinterviewing.ioエコシステム内で行われることです。その結果、かなり多くのインタビューデータを収集して分析し、技術面接、それらが伝える信号、何が機能し、何が機能しないか、インタビューのどの側面が実際に重要かをよりよく理解することができます。 。

各インタビューは、実践であろうと本物であろうと、音声、テキストチャット、ホワイトボードを使用した共同コーディング環境でのインタビュアーとインタビュイーのミーティングから始まり、そこで技術的な質問に飛び込みます。

インタビューの質問は、バックエンドソフトウェアエンジニアリングの役割の電話画面で遭遇するもののカテゴリに分類される傾向があります。

これらのインタビューでは、インタビュー対象者が作成および実行しようとしたコードを説明する音声トランスクリプト、データおよびメタデータ、インタビューの実施方法や考えについてのインタビュアーとインタビュー対象者の両方からの詳細なフィードバックなど、発生するすべてを収集しますお互い。

興味がある場合は、インタビュー担当者とインタビュー対象者のフィードバックフォームが以下のように表示されることを確認できます。1つの直接的なyes / noの質問に加えて、1〜4のスケールを使用したインタビューパフォーマンスのいくつかの異なる側面についても質問します。

また、インタビュアーとは共有しない追加の質問をインタビュイーに依頼します。質問の1つは、インタビュイーが以前に作業した質問を見たことがあるかどうかです。

インタビュアー向けのフィードバックフォームインタビュー対象者へのフィードバックフォーム

結果

結論を出す前に、以下の結論が観測データに基づいていることに注意する価値があります。つまり、強い因果関係を主張することはできません。あなた自身の結論を引き出すことができます。

以前にインタビューの質問を見たことがある

「私たちは練習について話している!」-アレン・アイバーソン

最初のものが最初です。ロケット科学者は、面接でより良い結果を得るための最良の方法の1つが...面接を練習することであることを示唆する必要はありません。練習に役立つリソースがたくさんありますが、その中には私たちのものもあります。練習問題を処理することの主な利点の1つは、今まで見たことのない何かを解決するように求められる可能性を減らすことです。そのバイナリ検索ツリーのバランスを取ることは、既に1回または2回行ったことがある場合、それほど威圧的ではありません。

〜3000件のインタビューのサンプルを見て、結果をインタビュー先がインタビューの質問を見たことがあるかどうかと比較しました。以下のプロットで結果を見ることができます。

当然のことながら、質問を見たインタビューを受けた人は、インタビュー担当者によって雇用可能であると考えられる可能性が16.6%高かった。この差は統計的に有意です。この投稿のすべてのエラーバーは95%の信頼区間を表しています。

どの言語でコーディングするかは重要ですか?

「生まれた言語が好きではない人は、獣や悪臭のする魚よりも低い。」— Jose Rizal

異なる言語がより良いインタビューにつながると想像するかもしれません。たとえば、Pythonの読みやすさは、インタビューの際に足を踏み入れるかもしれません。あるいは、特定の言語がデータ構造を特にクリーンな方法で処理するという事実により、一般的なインタビューの質問が簡単になります。異なるインタビュー言語間でインタビューのパフォーマンスに統計的に有意な差があるかどうかを確認したかったのです。

調査するために、プラットフォーム上のインタビューをインタビュー言語ごとにグループ化し、5回未満のインタビューで使用された言語を除外しました(これはほんの少数のインタビューのみを除外しました)。これを行った後、インタビューの結果と、インタビュー言語の関数としてどのように変化したかを見ることができました。

その分析の結果は下のチャートにあります。オーバーラップしない信頼区間は、インタビュー言語の関数として、インタビュー対象者がインタビューを「合格」する可能性の統計的に有意な差を表します。

考えられるすべての言語ペアについてペアワイズ比較を行うわけではありませんが、以下のデータは、一般的に言えば、インタビューが異なる言語で行われた場合の成功率に統計的に有意な差がないことを示しています。 (私たちのプラットフォームにはこれらより多くの言語がありましたが、言語があいまいであるほど、データポイントが少なくなりました。たとえば、Brainf ***でのインタビューはすべて成功しました。冗談です。)

とはいえ、私たちが定性的に観察した最も一般的な間違いの1つは、慣れていない言語を選択し、配列の長さのルックアップ、配列の反復、ハッシュテーブルのインスタンス化などの基本的なことを台無しにする人々です。

これは、インタビュイーがインタビュアーを印象づけるために意図的に派手な言葉を選んだ場合、特に残念です。私たちを信頼して、あなたの選択した言語を快適に振り回すことは、あなたがよく知らない派手な響きのある言語で毎回誇示します。

言語が重要ではない場合でも、会社が選択した言語でコーディングすることは有利ですか?

「神は私を助けてくれた、私はネイティブになった。」—マーガレット・ブレイン

一般的に、インタビューの言葉がパフォーマンスと特に相関しているとは思えないのは、すべて良いことです。ただし、特定の会社が使用する言語によっては効果があると想像するかもしれません。 Rubyショップが「Ruby開発者のみを雇用します。Pythonでインタビューすれば、雇用する可能性は低くなります」と想像できます。

反対に、Pythonですべてのコードを記述する会社は、Pythonのインタビュー対象者にとってはるかに重要になると想像できます。インタビュー中の一種の「非パイソン的」なもの。

以下のチャートは、C ++、Java、およびPythonのインタビュー成功率(インタビュー対象者を採用する意思のあるインタビュアーによって測定される)の違いを示したチャートに似ています。ただし、このグラフでは、インタビューの言語が会社のスタックにあるかどうかによってパフォーマンスを分類しています。

この分析をC ++、Java、Pythonに限定します。これらは3つの言語であり、会社がその言語を使用した場合と使用しなかった場合のインタビューがうまく混合されていたためです。ここでの結果はさまざまです。インタビュー言語がPythonまたはC ++の場合、インタビュー言語が会社のスタック内の言語であるかどうかにかかわらず、インタビューの成功率に統計的に有意な差はありません。ただし、Javaでインタビューしたインタビュアーは、Javaショップでインタビューしたときに成功する可能性が高くなりました(p = 0.037)。

それでは、なぜJavaの場合は会社の言語でのコーディングが役立つように思えますが、PythonやC ++の場合はそうではないのですか?考えられる説明の1つは、特定のプログラミング言語(Javaなど)の周囲に存在するコミュニティが、その言語の以前の経験をより重視しているということです。これらの方針に沿って、Javaを使用している企業のインタビュアーが、Javaの特異性に関する既存の知識を持つ人に好意的な質問をする可能性が高くなります。

あなたがプログラムする言語と、あなたが認知されているコミュニケーターの質との関係についてはどうですか?

「言語を上手に扱うことは、ある種の刺激的な魔術を実践することです。」—チャールズボードレール

全体的なパフォーマンスにとって言語の選択はそれほど重要ではありませんが(Javaを使用する企業にも関わらず)、言語の選択の違いが他のインタビューディメンションで異なる結果をもたらすかどうかに興味がありました。

たとえば、Pythonのような非常に読みやすい言語は、より良いコミュニケーションを持っていると評価されるインタビュー候補につながる可能性があります。一方、C ++のような低レベル言語は、技術的な能力のスコアが高くなる可能性があります。

さらに、非常に読みやすい、または低レベルの言語は、これらの2つのスコアの間に相関関係をもたらす可能性があります(たとえば、C ++の面接候補者で、何をしているのかまったく説明できないが、非常に効率的なコードを書く場合)。下のグラフは、さまざまなプログラミング言語において、候補者の技術的能力とコミュニケーション能力がどのように認識されるかについて、実際に目に見える違いはないことを示唆しています。

さらに、技術的な能力の低さはコミュニケーション能力の低さと非常に相関しているように見えます。言語に関係なく、候補者が技術的にうまく機能することはめったにありません。支離滅裂で、率直で、扱いにくいエンジニアの神話を暴きます。

(私が出会った最高のエンジニアは、複雑な概念を解体し、一般の人々に説明することで伝説的に優れていました。

インタビュー期間

「災害や恐ろしいほど悪いレビューや拒否など、若いときに気を配るのは問題ありません。あなたの回復力は素晴らしいです。」—ハロルドプリンス

私たちは皆、インタビューを残して、それがうまくいかないように感じた経験がありました。多くの場合、特定のパフォーマンス低下の感覚は、私たちが思いついた、または何度も何度も繰り返し聞いた経験則によって動機付けられます。 「インタビューは長続きしませんでしたか?それはおそらく悪い兆候です...」または「私はそのインタビューでほとんど何も書いていません!データを使用して、インタビューのパフォーマンスを評価するためのこれらの経験則にメリットがあるかどうかを確認したかったのです。

まず、インタビューの長さを見ました。インタビュアーが短いということは、あなたが列車の事故でインタビュアーがインタビューを早めに止めなければならなかったということですか?それとも、インタビュアーが通常よりも短い時間しかなかったのでしょうか、それとも短時間であなたが素晴らしい候補者であると思っていたのでしょうか?以下のプロットは、成功した候補者と失敗した候補者の両方のインタビューの長さの分布(分単位で測定)を示しています。

このチャートを簡単に見ると、うまくいくインタビューとそうでないインタビューの間でインタビューの長さの分布に差がないことが示唆されます。インタビュアーがしなかったインタビューの長さは49.95分でした。この違いは統計的に有意ではありません。

(この投稿の分布を比較するたびに、フィッシャー・ピットマン置換テストの両方を使用して、分布の平均の差を比較します。)

書き込まれたコードの量

「簡潔さは機知の魂です。」-ウィリアム・シェイクスピア

あなたは完全に困惑したインタビューを経験したかもしれません。インタビュアーは、ほとんど理解していない質問を尋ね、彼または彼女に「バイナリ検索とは何か」を繰り返し、インタビュー中に基本的にコードを書きません。このようなインタビューを、機知に富み、魅力的で、高度な問題解決スキルを介して受け渡すことを希望するかもしれません。これが真実かどうかを評価するために、インタビュー対象者が書いたコードの最終的な文字の長さを調べました。以下のプロットは、成功した場合と失敗した場合の両方の文字長の分布を示しています。このチャートをざっと見てみると、2つの間に違いがあることがわかります。うまくいかないインタビューはコードが少なくなる傾向があります。これに寄与する可能性のある2つの現象があります。まず、失敗したインタビュアーは、最初から記述するコードが少なくなる可能性があります。さらに、実行していないか、予期した結果を返さないコードを大量に削除する傾向があります。

平均して、成功したインタビューの平均インタビューコードは平均2045文字でしたが、失敗したインタビューの平均コード長は1760文字でした。それは大きな違いです!この発見は統計的に有意であり、おそらくそれほど驚くことではありません。

コードのモジュール性

「成熟したプログラマーのマークは、それが無意味だと気付いたときに時間を費やしたコードを捨てる意欲です。」— Bram Cohen

どれだけのコードを書くかを見るだけでなく、書くコードの種類についても考えることができます。優れたプログラマーはコードをリサイクルせず、何度も何度も再利用できるモジュラーコードを書くことを、従来の知恵は示唆しています。そのタイプの行動がインタビュープロセス中に実際に報われるかどうかを知りたかったのです。そのために、Python5で行われたインタビューを調べ、インタビューの最終バージョンに表示された関数定義の数をカウントしました。成功したインタビュー対象者がより多くの機能を定義したかどうかを知りたかったのです。より多くの機能ハンドラを持つことはモジュール性の定義ではありませんが、私たちの経験では、それは非常に強力なシグナルですいつものように、これについて強い因果関係を主張することは不可能です。特定のインタビュアー(多少寛大な人)が、多かれ少なかれ機能に役立つインタビューの質問をする場合があります。それにもかかわらず、調査するのは興味深い傾向です!

以下のプロットは、インタビュアーが雇用すると言った候補者とインタビュアーが雇用しないと言った候補者の両方に対して定義されたPython関数の数の分布を示しています。このチャートをざっと見てみると、うまくいくインタビューとそうでないインタビューで関数定義の分布に違いがあることが示唆されています。成功したインタビュー先は、より多くの機能を定義しているようです。

平均して、Pythonでのインタビューに合格した候補者は3.29関数を定義し、失敗した候補者は2.71関数を定義します。この発見は統計的に重要です。ここでの結果は、インタビュアーが本当にあなたが書いて欲しいと言っている種類のコードに報酬を与えるということです。

コードを実行しても問題ありませんか?

「速く動き、物を壊します。物を壊さない限り、あなたは十分に速く動いていない。」—マーク・ザッカーバーグ
「最も効果的なデバッグツールは、慎重に配置された印刷ステートメントと相まって、依然として慎重に考えられています。」—ブライアンカーニガン

技術面接でよく見られるのは、面接官は実際にコードが実行されるかどうかを気にしないということです。彼らが気にするのは問題解決スキルです。インタビュー対象者が実行したコードとそのコードがコンパイルされるかどうかに関するデータを収集するため、データにこの証拠があるかどうかを確認したかったのです。成功したインタビューと失敗したインタビューでエラーなしでコンパイルされるコードの割合に違いはありますか?さらに、インタビュイーは、たとえ大量の構文エラーを犯したとしても、実際に雇われますか?

この質問に答えるために、データを調べました。データセットを、実行中のコードの5つ以上の一意のインスタンスを使用した10分以上のインタビューに制限しました。これにより、インタビュアーが実際にインタビュイーにコードを実行させたくない場合や、何らかの理由でインタビューが省略された場合に、インタビューを除外できました。その後、エラーになったコード実行の割合を測定しました。5もちろん、このアプローチにはいくつかの制限があります。たとえば、候補者はコンパイルはできますが、わずかに間違った答えを与えるコードを実行できます。また、正しい答えを得て、stderrに書き込むこともできます。それにもかかわらず、これは違いがあるかどうかの方向感覚を私たちに与える必要があります。

以下のチャートは、このデータの概要を示しています。 x軸は、特定のインタビューでエラーがなかったコード実行の割合を示します。そのため、3つのコード実行と1つのエラーメッセージのインタビューは、「30%-40%」バケットにカウントされます。 y軸は、成功したインタビューと失敗したインタビューの両方について、そのバケットに入るすべてのインタビューの割合を示します。下のグラフを見てみると、平均して、成功した候補者はエラーなしで終了するより多くのコードを実行するという感覚が得られます。しかし、この違いは統計的に有意ですか?

平均して、成功した候補者のコードは64%の時間で正常に実行されました(エラーは発生しませんでした)が、失敗した候補者のコードのコンパイル試行は60%の時間で正常に実行されました。繰り返しになりますが、因果関係を主張することはできませんが、主なポイントは、面接の最初に面接官があなたに何を言っても、成功した候補者は通常、より良いコードを書くことです。

コードを書く前に、待って考えをまとめる必要がありますか?

「沈黙の力を忘れないでください。それは非常に混乱する一時停止であり、それが相手をせせらぎ、神経質に後戻りさせる可能性があります。」—ランス・モロー

また、面接に成功した人が面接に時間をかける傾向があるかどうかにも興味がありました。インタビューの質問はしばしば複雑です!質問を提示された後、物事に飛び込むのではなく、一歩下がって計画を立てることにはいくらかの利点があるかもしれません。これが真実かどうかの感覚をつかむために、特定のインタビュー候補者がコードを最初に実行した範囲を測定しました。以下は、インタビューの成功した人と失敗した人の両方が最初にコードを実行したインタビューの範囲を示すヒストグラムです。ヒストグラムをすばやく見ると、効果の大きさはそれほど大きくありませんが、成功した候補者は実際にコードの実行を開始するまでもう少し長く待機していることがわかります。

より具体的には、平均して、インタビューが成功した候補者は最初にインタビューの27%のコードを実行しますが、インタビューが失敗した候補者は最初にインタビューの23.9%のコードを実行します。もちろん、ここで何が起こっているかについては別の説明があります。たとえば、おそらく成功した候補者は、面接官に甘い話をするのに時間がかかるでしょう。さらに、私たちが因果関係の主張をすることができないという通常の警告が適用されます。完全に沈黙してさらに5分間インタビューに座っただけでは、チャンスがありません。それにもかかわらず、2つのコホートには違いがあるようです。

結論

全体として、この投稿は何を理解するための最初の試みであり、通常はインタビュアーが「あなたは何を知っていますか、私は本当にこの人を雇いたいです」と言います。私たちが見ているものについて因果関係の主張をする。

面接の成功者は特定の行動を示す場合がありますが、それらの行動を採用しても成功を保証するものではありません。それにもかかわらず、インタビューで成功する方法についてインターネットで読む多くのアドバイスをサポート(またはBSに電話)することができます。

とはいえ、やるべきことはまだたくさんあります。これは私たちのデータの最初の定量的なパスでした(多くの場合、インタビューの秘密の宝庫です)が、より深く、定性的なダイビングを行い、実際にさまざまな質問を分類して、ほとんどのシグナルだけでなく、コードサンプルに対して正規表現を実行したり、インタビューにかかった時間を測定したりすることでは簡単に測定できない2次の動作を実際に回避できます。

これで私たちを助けたいと思って、たくさんの技術的なインタビューを聞くことに興奮しているなら、私に連絡してください!

技術面接で素晴らしくなり、その過程で次の仕事に就きたいですか? interviewing.ioに参加してください!