就職の面接で優秀なプログラマーを見分ける最善の方法は何ですか?


82

インタビューの設定では:誰かがあるときに確実に識別するための最良の方法は何である優秀なプログラマは。これにより、彼はスペクトルの低域に向かって彼の仲間よりも10-15倍効率的/迅速/優れている人の一人であることを意味します。

私たちの多くは、FizzBu​​zz問題を弱いものを取り除く方法として聞いています。確かに、その問題を解決するのに5〜10分かかることは、申請者が弱い候補者であるという重大な指標です。私は、良い指標があなたが書くことができる限り早くそれを解決することができると仮定します。ただし、これでは十分ではないようです。

それは、彼に適度に複雑なバグのあるプログラムを与え、彼がそれをどれくらい速く調べて、それに関するすべての問題を特定できるのか、というようなことでしょうか?


質問では、確実に実行できると想定しています。
アンソニー

できません:http
John with waffle

必ずしも。有効回答は「全く方法がない」だろう
クラウディウ

回答:


65

長い回答を気にしない人には申し訳ありませんが、候補者を採用する前に資格を取得することは非常に重要だと思います。この業界でかなりの量の面接を行った人は、ほとんどの候補者が面接の最初の15〜30分間は続かないことを知っているため、このリストのほとんどは必要ありません。私のリストをやり過ぎとして却下する前に誰かを解雇することは(経済的および感情的に)どれほど高価かを念頭に置いてください。ここで重要な順にインタビューのトピックをリストしようとしました。

ジェネラルインテリジェンス(頭の体操/論理パズル)

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

プログラミング演習

  • GCD要因フィボナッチハノイの塔
  • 文字列とリストの反転
  • 片方向リンクリストにループがあるかどうかを判断します(2つのポインターのみでループを実行できますか?)
  • バグを見つける

オブジェクト指向プログラミング技術と一般的な設計パターンの知識

アルゴリズム分析(実行時O(n)の複雑さとストレージ要件)

ツールと方法論の使用

一般的なセキュリティの脆弱性と攻撃に関する知識

基本的な数学

  • 数値システム(1つのベースから別のベースに変換)
  • 確率論
  • デカルト平面上の2点間の距離(ピタゴラスの定理)
  • 平方根(アレクサンドリアのヘロン、逐次近似)

暗号化

  • 公開鍵暗号
  • 対称キー暗号化
  • ハッシュ関数
  • 暗号化プロトコル(秘密共有、ゼロ知識証明)

離散数学

  • 論理
  • 集合論
  • グラフ理論
  • 情報理論
  • 組み合わせ論
  • 証明(無理数の存在、無限素数など)

プログラミングインタビューの公開」という本もご覧ください。このトピックに関する参考資料です。


10
ちょっと長いインタビューに違いない。
リック・ミネリッチ08年

8
今日、私はACMプログラミング競技のチームメイトと「Crossing Bridges」を解決しようとしました。唯一の違いは、何人でも解決する必要があることです。任意の数のN人の問題を解決するのに約30分かかりました。しかし、インタビューの設定では、パズルは不十分なメトリックであるように感じます。

52
面接では、面接対象者が緊張している、まっすぐ考えていないなどの理由でパズルがひどくなります。さらに、多くのパズルがa-haです!候補者について実際に何も語らないものを入力してください。

11
これらの数学的な問題は非常に難しいと思います。10年間コンピューターサイエンスの学位を取得した後、不合理な数などを証明する方法を思い出すにはどうすればよいですか?

14
パズルの問題は、ほとんどの人が解決していないことです。彼らは前に答えを見たばかりです。そのため、最も精通した候補者は、彼らを見ていないふりをして、すでに知っている答えを断続的に解決します。あなたの目標が欺く人ではなく、賢い人を雇うことなら、パズルは悪い選択です。
キラレッサ

28

ああ、永遠の質問。

今年は多くのインタビューを行いました(明日2人の候補者が予定されています)。私の経験では、雇用は技術的な知識ではなく、直感と人間のスキルに関するものです。

  1. CVで時間をかけてください。数秒で拒否できるCVもあれば、30分かかるものもあります。時々、私は彼にインタビューするよりも、CVに基づく候補者についてずっと長い間考えます。私は通常、質問を準備していなくても、その候補者のためにインタビューの質問を数回準備しました。

  2. 技術的な知識-最低限必要なものがあり、これは通常、わかりやすいです。疑わしい場合は、インタビュー中に、CVで彼が言及したプロジェクトについて話し、必要なだけ深く掘り下げてください。これは通常、彼が知っていること、そして彼を動かしている理由を伝えるのに十分すぎるほどです。教育は重要ではありません。以前の仕事は重要であり、個人的なプロジェクトの可能性は高いです。

  3. 彼が何をしたいのか、彼のキャリアでどこに行きたいのかを尋ねます。彼が持っているものが必要ですか、彼が欲しいものを提供できますか?また、インタビューの終わり近くに、私は通常、希望の給料について尋ねます。彼が私の範囲を超えている場合、または彼が知っていることに対してあまりお金を払わない場合は、ここでインタビューを終了します。

  4. 最も重要なことは、候補者がチームに適合する必要があり、私たちが一緒に働くことができると確信していることです。私は彼を好きにする必要はありませんが、私は彼を扱うことができなければならず、彼は私を扱うことができる必要があります。そうでない場合は、彼の技術的な知識を使用することができないため、合格します。一方、これが事実であり、彼が素早い学習者である場合、彼の技術的知識の欠如は私が彼を雇うことを妨げません。

HRの女の子を訓練して、CVを取得したらすぐに合格できるようにしました。私はできるだけ早く個人的に面接をスケジュールします(理想的なのは明日の翌日、良い履歴書の履歴書を受け取った後です)。その後、彼は私と少なくとも1人の同僚(通常は上司またはチームメンバー)と30分または1時間のインタビューを受け、そこで彼と知り合い、質問に答えます。たとえその場で彼の申請を拒否したとしても、彼は会社の20〜30分のツアーに参加し、私たちが何をするのか、どうやってやるのかについて話します。それから、私は彼を心理テストのためにHRに送り、ちょっとした本当に基本的なペーパーコーディング/ SQLを送りました。両方のテストが私の決定において重要な役割を果たすことはほとんどありません。これは、インタビューで正しく判断したことの検証です。結果の後、彼が申し出をするのは15分間の話であり、私たちが満足している条件を交渉すれば、彼は雇われます。

これは、いくつかの優秀な候補者を逃した後、会社の官僚制度を通じて戦わなければならなかったプロセスです。単語は最終です)。より多くの意思決定者、より長いプロセス。プロセスが長くなればなるほど、Googleである必要があります。

それが不一致だと確信したらすぐに、インタビューを終了し、彼は会社のツアーを取得し、それは終わった。これは、インタビューのスケジュール中に電話で2分程度の短い時間になる場合があります。候補者を拒否したとしても、会社を売ります。良い仕事をした場合、却下された候補者から口コミで良い採用を得ることができます。

また、1つのヒント。受け取ったアプリケーションごとに拒否通知(または電子メール)を送信してください。私の現在の会社では、通常、それを人事部に任せています(インタビュー中に伝えたものは別として)が、ある時点では、「ありがとう!あなたは実際に最初の会社です彼らがいつか返事をするかと私に思わせずに答えた!」


心理テスト?

5
@ Ink-Jet:いいえ、サイコテストは正しかった-候補者は自宅の住所も知っている暴力的な男性によって維持されるコードを書くように求められます。

正直に言うと、それは私が初めて読んだものです。

@Grundlefleck-うん、それはほぼ正しい。:)
Domchi

2
拒否の手紙を受け取ったら、感謝します。電話でのインタビューを受けた後、私は沈黙によって拒絶されました。
01d55

24

この答えは箱の外にありますが、貴重なポイントだと思います。

最高のプログラマーはめったにインタビューしません。彼らはする必要はありません。あなたの会社が特に世界を変えている、またはわくわくして秘密に包まれている、または彼らが尊敬している複数のプログラマーがそこに行った場合、彼らは適用されるかもしれませんが、通常、偉大なプログラマーは履歴書を送ることではなく、仲間のネットワークを通して仕事を得ます。

就職の面接で優秀なプログラマーに伝える最良の方法は、彼がそこにいないということです。


2
本当です...素晴らしい点。:)
アーニスラプサ

5
だから...それは「あなたがすること」ではなく「あなたが知っている人」ですか?本当に恐ろしいプログラマーは、友人や家族を介して仕事を得ています。ああ、すみません、「仲間のネットワーク」。
フィリップ

17

回答にはコードサンプルを含める必要があります。自分のコードを見ずにプログラマを雇うことは、料理を試さずにシェフを雇うことを好みます。


11

おそらく「優秀な」プログラマーがインタビューのためにあなたのところに来ていないのでしょう。おそらく他の誰かから彼を盗む必要があります。


ドッ!この答えは一般的になりつつあるようです。私は外出や仕事のために適用を開始しなければならないのと同じように...
interstar

9

情熱的なプログラマーに「仕事が欲しい」プログラマーに伝える方法の1つは、今週読んでいる本を尋ねることです。次に、過去数週間に読んだ本について質問します。

情熱的なプログラマーは常に読んでいることがわかりました。通常、リストにはいくつかのプログラミング/コンプが含まれます。科学 最近のリストの本。

「職業に追いつく」だけではありません-情熱的なプログラマーはプログラミングに対する欲求と愛を持ち、現在使用している言語だけでなく、方法論、他の言語(特に)新しいまたは「奇妙な」または古代のもの)、ITの他の側面(ロボット工学、AI、またはゲームなど)

彼らが最近のブックリストを持っていない場合、私の経験ではおそらく彼らはプログラマーではないでしょう。

乾杯、

-R


8
私の最近の本のリストはほとんど常にフィクションです。私の最近のテクニカルリーディングはほぼ完全にオンラインです。なぜならそれはより最新だからです。

1
さらに良いことに、今月書いた本を尋ねてください。:)

7

誰かが「速い」ことができるさまざまな時間スケールがあります:一部の賢い人は難しいパズルを数秒で解決できますが、一部の賢い人は、インタビューの質問ではそれほど速くないかもしれませんが、1か月で多くの良いコードを生成します。

候補者に、コードの一部をレビューできるオープンソースプロジェクトでアクティブであるかどうかを尋ね、それらのプロジェクトのメーリングリストのアーカイブとコミットログを読むのに時間をかけます。それは、候補者が面接で示すことができるものよりもはるかに多くのことを教えてくれます。(もちろん、すべての優れたコーダーがオープンソースの仕事をするわけではないので、これはインタビューを置き換えることはできません。)


7

本「賢く、物事を成し遂げる:ジョエル・スポルスキーの簡潔な技術ガイドを見つけるための簡潔なガイド」は、答えを見つけるのに役立つかもしれません。

目次:

  • 前書き
  • 第1章:「ハイノートを打つ」
  • 第2章:「優れた開発者を見つける」
  • 第3章:「開発者向けフィールドガイド」
  • 第4章:「履歴の並べ替え」
  • 第5章:「電話スクリーン」
  • 第6章:「インタビューへのゲリラガイド」
  • 第7章:「次善のチームの修正」
  • 付録:「ジョエルテスト」

ジョエルの記事「インタビューへのゲリラガイド(バージョン3)」も役立ちます。

トピックに関するSteve Yegge の記事「Done、and Gets Things Smart」


4

コーディングを必要とする一連の質問を彼らに尋ね、質問をより難しくします。彼らが挑戦を楽しんでいるように見えるなら、あなたはおそらく生きているものを持っているでしょう。

「forループを書く」などの最初の簡単な質問に答えられない場合や、ばかげて簡単なものであれば、この人はコーディングできないことがわかります。


4

それらをホワイトボードにコーディングしてもらいます。彼らがコードの書き方を知っているかどうかを知ることができる唯一の方法です。


これがなぜ投票されたのかわからない。プログラマーがホワイトボードにコードを書くことができない場合、コンピューターでそれを書くことができると思う理由は何ですか?
クリストファージョンソン

3
@Kristopher:プログラマーがコンピューターで優れたコードを書くことができるとしたら、何がホワイトボードにそれを書くことができると思いますか?これらはかなり異なる環境です。
デビッドソーンリー

「ホワイトボードテスト」は、実際のコーディングをシミュレートするためのものではありません。候補者がどのように考えているか、候補者が何をしているのかを説明できるかどうか、候補者が自分の頭の中でどのくらい早く解決策を形成するかなどを見るチャンスです。コンピューターで同じ問題。
クリストファージョンソン

3

主に、彼らがすでに行った作業を判断する必要があります。不安にさらされたインタビュー中に誰かが生成するコードまたはアイデアは、チームで実際に作成できるものの貧弱なプロキシです。

コーディングの課題を実行するには、codepad.comのようなものでIMを使用し、自宅の快適な場所からIMを実行させます。上司の前のホワイトボードに多くのコードを書き、30分の締め切りとボーナスをラインに書きますか?しません。

それで、インタビューは無意味ですか?いいえ。しかし、彼らが何をしたか、そして彼らが何を貢献したかを正確に説明することに重点を置くべきです。

また、顔を合わせて誰かに会うと、あらゆる種類の心理的偏見にさらされることになります。プログラマーのアイコンタクトを改善したり、他の誰かより背が高いため、誤ってプログラマーを雇ってはいけません。これらを迂回するために、面接する前に、できるだけ多くのインタビューをIM /電子メールで行います。


履歴を採用する候補者の他の人々の心理的偏見を見ることで、この効果を逆転させることができます。上級職に就き、物事を成し遂げた背の低い人たちは、おそらく本当に本当に良い人です。同じ歴史を持つ背の高い人は、平均してそれほど良くなく、ハローポイントをうまくやっていくでしょう。
ティムウィリスクロフト

2

言語は関係ありません。ロジックはそうです。IDEやコンパイラーは最近非常に優れているので、優秀なプログラマーであれば1週間で任意の言語(おそらくアセンブラーではないかもしれません)を習得できます。数週間でまともになり、数ヶ月で非常に良くなります。

それはあなたが確認する必要がある彼の(彼女の)脳です。そして、あなたは私の話をします。私は彼らに簡単な問題を解決するように頼みます。コードを書くのではなく、そのロジックをステップスルーして解決策を見つけます。

しかし、1〜10をカウントする単純なループを作成できない場合、問題が発生します。


1

まず、インタビューが始まる前にアイデアを得ることができる方法が1つあります。

彼らがブログを持っているか、1つ以上のオープンソースプロジェクトに貢献しているなら、彼らが書いたコードと記事を見てください。まず、これらのいずれかを行った場合、彼らは物事を成し遂げるためのイニシアチブを持っています。また、これらのことを履歴書に記載されている仕事の経験と比較し、帰宅して仕事の後にもっと学ぶか、午後5時以降に帰宅して仕事を忘れるかを知ることができます。

本質的に、彼らはプログラミングに情熱を持っているかどうか?それが本当の質問です。


1

私の意見では、面接に優れたプログラマーがいることが最善です。

応募者が多くの面接の質問を知っているか、または実際に問題について考えており、詳細に進むことができるかどうかを判断できるのは専門家だけです。面接のパズルを解くために人を雇うのではなく、実際の仕事を成し遂げるために雇うことを忘れないでください。

パズルは、基本を正しく理解していない人を除外することです。スキルをテストしたい場合は、あなた(または「優秀なプログラマー」)がいくつかのことを詳細に準備し、志願者がしばらく考えなければならないものに焦点を合わせます。彼はすぐに解決策を知らない問題にどのようにアプローチしますか?


1

インタビューで情熱について話すべきだとは思わない。率直に言って、「情熱」を探している会社は本当に「アイデアのためにお金がないために働く」ことを意味しているように聞こえます。

情熱は卓越性を保証するものでもありません。つまり、私はほぼすべての人生のプログラミングに費やし、プログラミングについて読み、ErlangやClojureのようなクレイジーな言語を学習します。それでも、私はプログラミングが苦手です。

優秀なプログラマーは、彼らが積極的に関与している成功したプロジェクトのトラックを持っているべきだと思います。したがって、プログラマーにインタビューで基本的なFizzBu​​zzを超えるものを書くことは不要です。彼らの過去のプロジェクトと彼らがしたことについて話してください。あなたはルービックキューブを解決し、ビー玉を数えるかで動作するようにプログラマーを雇っている長いと大きな及び排気 COEの50本の以上のラインのソフトウェアプロジェクト?


1

http://www.inter-sections.net/2007/11/13/how-to-recognise-a-good-programmer/

記事から:


箇条書きの基準

したがって、要約すると、優れたプログラマーを認識するのに役立ついくつかのインジケーターとカウンターインジケーターがあります。

肯定的な指標

  • 技術への情熱
  • 趣味としてのプログラム
  • 奨励された場合、技術的な話題について耳を傾けます
  • 長年にわたる重要な(そして多くの場合多くの)個人的なサイドプロジェクト
  • 自分で新しい技術を学ぶ
  • どのテクノロジーがさまざまな用途に適しているかについての意見
  • 彼が「正しい」とは信じていないテクノロジーを扱うという考えについて非常に不快
  • 明らかにスマートで、さまざまなトピックについて素晴らしい会話ができる
  • 大学/仕事のずっと前にプログラミングを始めた
  • いくつかの隠れた「氷山」、CVレーダーの下での大規模な個人プロジェクト
  • 多種多様な無関係な技術に関する知識(履歴書に載っていない場合があります)

負の指標

  • プログラミングは日課です

  • 「トークショップ」を望んでいない

  • 企業主催のコースで新技術を学ぶ

  • あなたが選んだどんな技術でも喜んで仕事をする、「すべての技術は良い」

  • あまりスマートではないようです

  • 大学でプログラミングを開始

  • プログラミングの経験はすべて履歴書にあります

  • 主に1つまたは2つの技術スタック(たとえば、Javaアプリケーションの開発に関連するすべて)に焦点を当て、それ以外の経験はありません


それが何をするのか、そして尋ねられた質問に答えるのになぜそれをお勧めするのか、もっと説明していただけますか Stack Exchange では「リンクのみの回答」は歓迎されません
-gnat

0

優秀なプログラマーは、これらの低スペクトルピアと連携することもできます。彼らがテストをすることができて、彼らのエゴにふさわしくない限り、あなたは良い候補者を持っているでしょう?

そのfizzbuzzテストはちょっと面白いです。私が考えることができる解決策は、モジュロ演算子を使用しています。これは、キャラクターシートマッピング座標を計算することでしかわかりません(学校や大学では言及していません)。平均的なプログラマーもそれを知っているでしょうか、それとも私はくだらない教育を受けたでしょうか?


あなたがモジュロ演算子に出会わなかったことに驚いています。私はこれまでに学んださまざまな言語で紹介されました。

2
大学でCSを専攻している場合、モジュロ演算子はプログラミング101

驚くべきことに、ビットシフトやモジュロのようなものは大学でスキップされます
Claudiu

大学でどのようなことを教えようとしているのかによると思います。現実世界の問題でモジュロを使用したことも、明示的に教えたこともないと思います。しかし、この種の演習(および試験問題)では非常に一般的です。
インター

2
実際、どちらも小学校で一般的に教えられています。その段階では、それらは「残り」および「10で乗算」と呼ばれます。
直観

0

私が使用する基準の1つは、アカデミックまたはプロのプロジェクトで彼が取り組んだ言語とツールの「種類」と、彼が達成したことを確認することです。彼は常に標準ライブラリ(常にC#またはVB6の男)を使用してアプリケーションレベルで作業しましたか、またはLinuxでCを使用して、ポインター、メモリ管理、再帰、プロセス同期、相互排除、イベントなどのハードコアなものを扱うプロジェクトを実行しましたか? 。彼が常に何らかの抽象化レイヤーの下でこれらのコアおよび基本概念を使用している場合、私は疑わしいでしょう。

これは明らかに、彼にコードを作成させることに加えてです。それに代わるものはありません。しかし、一部の人々は他の人々よりも速くコードを書くことができ、インタビューの脚光を浴びるとき、人々は異なる応答時間を持っているという事実に応えます。


再帰、プロセス同期、相互排除。これらのテクノロジは、C#、VB.NET、C、またはアセンブリ言語のいずれで作業する場合でも等しく重要です。

-1-これはまったく間違っています。言語とツールの「種類」は100%「無関係」です。
モーガンハーロッカー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.