web-dev-qa-db-ja.com

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

インタビューの設定で:誰かが誰かであるときに確実に識別するための最良の方法は何ですか 優秀なプログラマー。これにより、彼は、スペクトルの下限に向かって、同業他社よりも10〜15倍効率的/迅速/優れている人の1人です。

私たちの多くは、弱い問題を取り除く方法として FizzBu​​zz Problem について聞いています。確かに、その問題を解決するために5〜10分かかることは、申請者が弱い候補であることを示す深刻な指標です。良い指標は、あなたが書くことができるのと同じくらい早くそれを解決することができると思います。しかし、これでは十分ではないようです。

それは多分彼に適度に複雑なバグのあるプログラムを与え、彼がそれをいじくってそれに関するすべての問題を識別することができる速さを見るようなものでしょうか?

82
Claudiu

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

General Intelligence(頭の体操/ロジックパズル)

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

プログラミング演習

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

アルゴリズム分析 (実行時 O(n)複雑度 およびストレージ要件)

ツールと方法論の使用

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

基礎数学

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

暗号化

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

離散数学

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

また、本 Programming Interviews Exposed もご覧ください。これは、このトピックに関する優れたリファレンスです。

65
rboyd

ああ、永遠の質問。

私は今年たくさんの面接を行いました(私は2人の候補者が明日予定されています)、そして私の経験では、採用は直感と人のスキルに関するものであり、技術的な知識に関するものではありません。

  1. CVで時間をかけてください。一部のCVは数秒で拒否され、一部は30分かかります。時々私は彼にインタビューするよりずっと長いCVに基づく候補者について考えます。通常、私は質問を用意していませんが、その候補者のために特別に面接の質問を数回用意しました。

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

  3. 彼が何をしたいのか、彼は彼のキャリアでどこに行きたいのか尋ねてください-あなたは彼が持っているものを必要としますか、そして彼が望むものを提供できますか?また、インタビューの終わり近くに、私は通常、希望する給与について尋ねます。彼が私の範囲外である場合、または私が彼の知っていることにそれほど多くを支払わない場合は、インタビューを終了します。

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

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

これは、いくつかの有力な候補者を失った後、会社の官僚機構を通じて戦わなければならなかったプロセスであり、採用を決定するのは私です(HRと同僚の両方からのアドバイスを聞いていますが、単語は最終です)。より多くの意思決定者、より長いプロセス。プロセスが長くなるほど、収穫を上げるためにGoogleになる必要があります。

それがノーマッチであると確信したらすぐにインタビューを終了し、彼は会社ツアーを取得し、それは終わりです。これは、面接のスケジュールを設定するときに、電話で2分間と短い場合があります。候補者を拒否したとしても、会社を売却します。あなたが良い仕事をしたならば、良い採用は拒否された候補者から口コミを通して来ることができます。

また、1つのヒント。取得した各アプリケーションについて、拒否レター(または電子メール)を送信してください。私の現在の会社では、通常、それを人事部に任せます(面接中に伝えたものは別として)が、ある時点では、「THANK YOU!あなたは実際に最初の会社です。彼らはいつの日か返事をくれるのではないかと思うのではなく、返事をくれた」

28
Domchi

この答えは少し外に出ていますが、それは貴重なポイントだと思います。

最高のプログラマーがインタビューすることはほとんどありません。 彼らはする必要はありません。あなたの会社が特に世界を変える、またはエキサイティングな秘密に包まれている場合、または彼らが尊敬するいくつかのプログラマーがそこに行った場合、彼らは応募するかもしれませんが、通常、優れたプログラマーは履歴書を送るのではなく、仲間のネットワークを通じて仕事を得ます。

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

24
Rich

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

17
Andy Lester

おそらく「優秀な」プログラマーが面接に来てくれません。おそらく、他の誰かから彼を盗む必要があります。

11
interstar

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

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

それは単に「職業についていく」ことだけではありません。情熱的なプログラマーはプログラミングに対する欲求と愛情を持っており、さまざまなトピックに関する資料をむさぼり食う傾向があります。現在使用している言語だけでなく、方法論、その他の言語(特に新規または「奇妙な」または古代のもの)、ITの他の側面(おそらくロボット工学、AI、またはゲーム、...)

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

乾杯、

-R

9
Huntrods

誰かが「速く」なる時間スケールにはさまざまなものがあります。一部の賢い人は難しいパズルを数秒で解決できますが、面接の質問がそれほど速くなくても、1か月で多くの優れたコードを生成する賢い人もいます。

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

7

Smart and Gets Things Done:Joel Spolsky's Concise Guide to Finding the Best Technical Talent 」という本は、答えを見つけるのに役立ちます。

目次:

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

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

そして、このトピックに関するSteve Yeggeによる記事 "Done、and Gets Things Smart"

7
sergtk

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

4
ManiacPsycho

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

「for forループを書く」などの最初の簡単な質問に答えられない場合や、愚かなほど簡単な場合は、この人がコードを記述できないことを知っています。

4
ManiacPsycho

あなたは主に彼らがすでにやった仕事を判断するべきです。不安に満ちた面接中に誰かが生成するコードやアイデアは、チームで実際に作成できるものに対する不十分なプロキシです。

コーディングの課題を行うには、codepad.comなどでIMを使用し、自分の家の快適さからIMを実行させます。コードの多くを上司の前のホワイトボードに書いて、30分の期限とラインのボーナスを書いていますか?私はしません。

だから、インタビューは無意味ですか?いいえ。ただし、彼らが何をしたか、そして彼らが貢献したものを正確に説明することに重点を置く必要があります。

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

3
twk

言語は関係ありません。ロジックはありません。つまり、最近のIDEとコンパイラーは非常に優れているので、優れたプログラマーなら1週間で(アセンブラーではなく)言語を習得できます。数週間でまともなものになり、数ヶ月でとても上手になります。

それはあなたが確認する必要がある彼(彼女の)の脳です。そして、あなたは私の話をします。簡単な問題を解決してもらいます。コードを書くのではなく、ロジックを実行して解決策を見つけることによって。

しかし、彼が1から10までの単純なループを記述できない場合、問題が発生したことは認めます。

2
Stephen Cox

私の意見では、インタビューに優れたプログラマーが参加するのが一番です。

応募者が面接の質問をたくさん知っているだけなのか、実際に問題について考えているのか、そして詳細に入ることができるのかどうかを判断できるのは、専門家だけです。インタビューパズルを解くために人を雇うのではなく、実際の仕事を終わらせるために人を雇うことを忘れないでください。

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

1
mdm

面接で情熱について話す必要はないと思います。率直に言って、「情熱」を求める企業は本当に「アイデアに対してお金をかけずに働く」ことを意味しているように思えます。

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

優秀なプログラマーは、彼らが積極的に関わってきた成功したプロジェクトを追跡する必要があると思います。したがって、基本的なFizzBu​​zzを超えるものをプログラマーに書くことは、インタビューでは不要です。彼らの過去のプロジェクトと彼らがしたことについて話してください。ルービックの立方体を解いてビー玉を数えるプログラマーを雇っていますか長くて大きくて疲れる 50行以上のcoeのソフトウェアプロジェクトに取り組んでいますか?

1
mannicken

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

記事から:


箇条書きの基準

したがって、要約すると、優れたプログラマーを認識するのに役立ついくつかの指標と反指標があります。

ポジティブインジケーター

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

否定的な指標

  • プログラミングは日常の仕事です

  • 「おしゃべり屋」になりたくはない

  • 会社主催のコースで新技術を学ぶ

  • 「すべてのテクノロジーが優れている」という、選択したテクノロジーを使用して作業できます。

  • あまりスマートに見えない

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

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

  • 主に1つまたは2つのテクノロジスタック(Javaアプリケーション)の開発に関係するすべてのもの)に焦点を当て、それ以外の経験はありません

1
Ronny Brendel

まず、面接が始まる前にアイデアを得る方法が1つあります。

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

基本的に、彼らはプログラミングに情熱を持っているかどうかを教えてください。それが本当の問題です。

1

優れたプログラマーは、これらの低スペクトルのピアでも作業できます。彼らがテストを行うことができて、彼らの自我にこだわらない限り、あなたは良い候補者を持っていますか?

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

0
Yes Fish...

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

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

0
Ather