Javaプログラマーのポジションの候補者にインタビューしています。
私の同僚は、インタビューの半分以上をJavaコーディングパズルで埋めるように主張しています。彼の見解は、候補者がループをナビゲートできれば、彼らは良いはずです。
コーディングパズルのそのような例の1つは
i=0;
for( i=1 ; i< 10 ;i++)
{
if(i%3 ==0) i++; break;
if(i%2 ==0) i++;
}
print(i);
フォローアップ:休憩を削除するとどうなりますか?
どのような開発者を探していますか?
私はなぞなぞを解くように、またはインタビューの一部としてコードを書くように求められたことはありません。ほとんどの場合、その仕事は一人のプログラマーでした。また、会社が慣れていない技術を採用することもありました。どちらにしても、なぞなぞを構築して評価する簡単な方法はありません。
パズルを何に使うかによります。
それを出発点として使用する場合、候補者が問題にどのようにアプローチするかを確認し、プログラミング手法、スタイル、および哲学についての議論を起こすために、それから良いです。
パズルを解決する最速の候補者が仕事を得る、白黒テストとしてそれを使用する場合、それは間違っています。
コミュニケーション、既成概念、コード理解、問題解決スキル、コーディングに対する一般的な態度、社会的スキル、長所と短所、そしてそれらが優れているかどうかなど、幅広い側面で候補者を評価したいチームに合う。これらすべてを単一のブール値「パズルを解いた」に減らすだけでは十分ではありません。
パズルが得意な人を雇うことを考えているなら、そうです、それは良いアプローチです。あなたが良いプログラマーを雇うことを探しているなら、あなたは Joelによってレイアウトされたアプローチ を取ることを望むかもしれません。
私が鍵を握るのは、あなたが思いつくパズルが何を求め、何を求めないかを理解することです。
(imo)ユーティリティにはさまざまなレベルがいくつかあります。
ただし、このアプローチには2つの主な落とし穴があると思います。 1つ目は、ある種のサディスティックなダンジョンマスターのように、ハード/不透明/賢いということです。読んだり理解したりしないように設計されたひどく書かれたコードを解読する能力について人々をテストするのはなぜですか(すでにひどく書かれたコードベースがある場所については例外を設けます)?
もう1つは、パズルに多くの時間を費やしていて、これらの価値に実際に取り組んでいないことです。これらのタイプの質問でうまくやることは、あなたがパズルを解くのが得意であることを示します。それはあなたがあなたの従業員に望む主要な才能ですか?
もちろん、質問することはできませんのみパズル、および言語の雑学を中心に展開する「雑談」はあまり役に立ちません。しかし、人材派遣会社や採用担当者を使用する場合、または能力のレベルを偽造するのが得意な人を採用し続ける場合、ある種のプログラミング演習は事実上必要です。
適切な種類の質問をすることで、一般的なアルゴリズムに慣れているプログラマーの習熟度や、問題にそれらを適用する方法を評価できます。また、複数のアプローチを探して最適なアプローチを選択するのか、それとも機能することがわかっているアプローチを選択するのかもわかります。後者の場合、彼らはより良い方法があることを知っているかもしれませんが、正しく理解するためにはそれを調べる必要があります。これは十分公平です-機能し、最大限に効率的でない場合、コードは機能しないコードよりも優れています、そしてより良い方法があることを知るだけで、戦いの半分以上が得られます。
まず始めにまともな場所の例としては、私が若いApplesoft BASICハッカーだった1985年の頃のプログラミング大会で私が抱えていた問題があります。問題は、1から1000までのすべての完全な正方形を印刷することでした。もちろん、これを解決するには2つの方法があります。
明らかに、2番目の方法は最初の方法よりもはるかに効率的で、ボーナスとしてすべての正解を出力しますが、最初の方法は、Appleの浮動小数点実装の丸め誤差のため、実際には1つまたは2つ見落としました。ただし、ほとんどのソリューションは、使用されているアプローチ#1を採用しています。 (結局、これらは高校生でした。)
この種の現代の問題に関する議論は、候補者が2つのアプローチがあることを認識しているか、どちらが優れているかを判断でき、2進浮動小数点演算の限界を理解しているかどうかを明らかにできます。事実、2番目のアプローチの方が優れている理由を説明できない人は、貧弱な候補者になるでしょう。基本的には1985年の高校生レベルです。この問題は、「fizzbuzz」よりも少しだけ複雑です。 -そして、彼らが実際に取り組んでいる可能性があるものよりもはるかに複雑ではありません!
私のポイントは、あなたがそのような質問から何を学ぶことが期待されるかを知り、それらを合否の質問として設定するのではなく、候補者の知識の限界を調査するための出発点としてそれらを使用することです。ますます困難になる一連の質問をして、どこで問題が発生し始めるかを確認できます。
誰かが私のチームで作業するのに十分賢いかどうか、一連のプログラミング演習からどのようにしてわかりますか?そして答えは、あなたはそうではありません、あなたはそれらを賢い順にランク付けし、彼または彼女が賢いと仮定して、あなたが買うことができる最も賢い人を雇います十分です
誰かが私にこの種の質問をするとき、私は「私はより良い提案があります。あなたはこのようなコードを書く愚か者を解雇します。このようなコードは、過去のコードレビューを行うべきではありません。
おとうさん、パズルが好きです。私は彼らが楽しいと思います。それは私がまともな、メンテナンス可能な、堅牢なコードを書くことができるかどうかとは関係ありません。
決定的な答えを出すとしたら、答えはノーだと思います。なぞなぞは面接には不向きです。面接している人がパズルが得意であるが、お粗末であるか、またはJavaコーディングで経験の浅い人であるとしましょう。多分謎解きのソルバーが平均的なプログラマーよりも速くスピードアップできるでしょう。 、でも待ってもいいですか?Java開発者を雇っているなら、夢のある人を雇うJava眠っている。環境が1つだったらプロジェクトとテクノロジーが急速に変化し、申請者が次の2〜3年でさまざまなフレームワークを使用してさまざまなプラットフォームでさまざまな言語でプログラミングする可能性がある場合、謎解きツールを使用する傾向があります。
コーディングパズルが、誰かがコードや問題解決について十分な知識を持っているかどうかを発見するのに特に効果的であるとは考えたことはありません。通常、私はそれらに必要な種類の問題解決が、実際にソフトウェアを作成するときの問題解決の種類とはかなり異なることに気づきます。彼らは通常、創造的に考える必要はありません。これをGoogleタイプのインタビューの質問で比較してください。「シアトルのすべての窓を洗うための価格をどのように考えますか?」これには創造性と問題解決能力が必要ですが、将来使用するすべてのプログラミング言語に適用できます。
これらのパズルは、IQ、または少なくとも論理的な推論スキルを測定するためのプロキシにすぎません。明らかな理論的根拠は、長期的には、利口な人は自分が使用しているテクノロジースタックを学習するのに対し、知性を高めることはできないということです。インテリジェンスは、優れたプログラマーであることと強い正の相関関係がありますか?私はそう思いますが、さらに多くの変数があり、経験をそれほど容易に取り除くことはできません。
パズルを使用することは悪い方法ではないと思います。おそらくパズルと実際のコーディングの組み合わせが最善でしょう。
私の意見では、最悪の方法は面接であり、その人に会っており、偽の仮定(候補者が太っている、どもる、ゆっくり話している、または逆に、明確にする)。これを知っていても、任意の変数に基づいて無意識に区別することになります。
私はこれを古典的なパズルとは呼びません 例えばこの質問で議論されたように 。私はそれをコード読み取り演習と呼びます。ほとんどの人は、パズルが候補者がこの種のパズルを以前に見たことがある場合にのみ測定することに同意します。しかし、コード読み取りの演習は理にかなっています、結局のところ、開発者はコードの読み取りに多大な時間を費やしています。
しかし、個人的には、もう少し現実的なコードを使用します。たとえば、コードベースのどこかに、幅優先でツリーをトラバースする関数があります。名前を取り除いても、経験豊富なプログラマーは、上記の関数の機能を理解できるはずです。そして、「そのデータ構造がツリーではなくサイクルを持つグラフである場合はどうなりますか?」のような質問に答えてください。または「深さ優先検索を取得するには何を変更する必要がありますか?」.