「インタビューテスト」の質問になると、FizzBuzzのテーマがよく出てきます。 Coding Horror についての投稿もあります。
さて、このようなサイトを読んでいると、FizzBuzzをささいなもの以外に見つけるプログラマーの人口統計に入る可能性が低くなります。
しかし、99%のプログラマがそれに苦労するというのは本当でしょうか。
本当に?
これを裏付ける証拠は何ですか?
いくつかの実際の例は、この質問に答えるのに非常に役立ちます。
99%?いいえ。かなりの割合ですか?はい。人との面接に関する私自身の直接的な経験から、私はこれについて証言することができます。ささいなことのように思えるかもしれませんが、プログラミング分野では、何年にもわたって偽装してエントリーレベル以外のポジションに応募し、これに失敗した人がたくさんいます。
あなたがそれを簡単に解決できるとしても、あなたは私にそのような面倒な仕事をするように頼まれることについての大きな静的をあなたに数えるでしょう。チームにいるということは、時には楽しめないかもしれないが必要なことをしなければならないことを意味します。すぐに問題が発生した場合、私たちが協力し始める前に、私が求めていることを上回っているという特別なステータスを主張して主張するのが最善だと思います。
私は必ずしもあなたの解決策がどれほどエレガントであるかは気にしません(それはいいでしょうが)。 。あなたが憤慨し、「私は問題解決者であり、コードモンキーではない!」という言葉に沿って何か言うとその後、ペグをノックダウンされます。
私は面接官に、それを試み始めることすら拒否することを拒否しました。単に拒否するだけです。ええと。それをしないでください。私は1つまたは2つの丁寧な質問をし、彼らの時間に感謝し、インタビューを締めくくります。
私はこれをマネージャーとしてそして開発者として言います。
私は、仕事に応募する(そしてそれを取得しない)プログラマーの99%が苦労するかもしれないと思います。しかし、生産的に仕事をしているプログラマの99%ではありません。
それが現代の求職プロセスの本質です。応募する多くの人々は資格がありません。
そのCoding Horrorの投稿は、最近のコンピュータサイエンスの教え方にも触れています。過去(特にMIT)では、LISPのようなことを学ぶ必要がありましたが、そのためには再帰のような概念を理解する必要がほとんどありました。
今日、人々は教えられるJavaそれは業界で広く使用されており、焦点は深いプログラミング思考ではなく構文に移っています。私はJavaを嫌いではありません;実際、それは理想的だと思います最初のプログラミング言語ですが、インストラクターがそれを使って深いプログラミング原則を教えるのを見たことはありません。
これは言いたくないけど
私がプログラミングの質問に答えられないのを見た主な理由は、回答者ではなく質問者の責任です。
定数時間で実行される特定のコレクション検索アルゴリズムを作成する方法を尋ねられた1つのインタビューをはっきりと覚えています(コレクション内のアイテムの数に関係なく、ルックアップの数は同じです)。私はそれをあきらめて、あきらめる前に20分間ぶつけました。その時、インタビューをしているこの天才は答えをほぼ一定で動作するものであるとして実証し始めましたが、それでも一定の時間ではありません。 「私にゼロの答えをください」と言って、0.1を受け入れるようなものです。
それ以外にも、インタビューをしている人が次の基準を満たさない質問をしているケースが多すぎるのを見てきました。
真剣に(1)、インタビューの口頭でコードを書くように人々に求めるのはばかげていると思います。
真剣に(2)、コードを書かないで人々にインタビューするのもばかげていると思います。
真剣に(3)、彼らに「宿題」を与えるか、コードサンプルを持ち込むように依頼するか、またはラップトップといくつかの質問とそれらに取り組むための静かなオフィスを与える必要があります。次に、作業中は放っておいてください。私は通常、後者のアプローチを採用します。それは、彼らが外部からの助け(チート)を取得する能力を制限し、タイムボックス化できるからです。
あなたが言及したCoding Horrorの記事を読みました。私の意見では、Jeffは正しいと思います...しかし、彼が最後にインタビューを受けたのはいつですか?
インタビューを受けたとき、あなたは通常ストレスが高く、理論的な質問に答えなければならないことがよくあります(知性、グーグル、再シャープなし、ストレスに悩まされている記憶だけ)。テストでも同じです。ストレスはあなたを助けません。
私は誰かがポジションに適しているかどうかを知る唯一の方法がしばらく彼と一緒に働くことであることに気づきました...あなたが雇った最後の10人を100人から(おそらくそれ以上)取るだけで、どれだけ本当に本当に良かったですか雇う???
雇用主は、モジュロを知っているコードモンキーではなく、問題解決者を雇う必要があります。
「しばらくの間は応募者全員」をテストすることはできないため、面接が必要です。それが私が私の問題に焦点を当て(問題解決)、過去の参照チェックを行う理由です。
私の意見では、FizzBuzzは、成長を維持するための開発者を探している会社にとって危険です。
FizzBuzzで検索するだけです。そこにブログの投稿の巨大な波がありました。一般的に言って、ブロガーは「私はそれを[ある言語]で書くように人々に言いました、そしてここに彼らがした種類の間違いがあります:」と述べ、そしていくつかの落とし穴をリストしました。楽しみは、人々が「[ha!それは[他の言語]で取るに足らないことです。あなたが書く必要があるのはこれだけです」と言うコメントから始まり、その後にコードが続きます。次のコメントは必ず最初のコメントのバグを見つけます。一部の非常に優れた開発者は、どの言語でも、最初はうまくいかないようです。エラーのいくつか:
私が採用しているとき、私は人々にホワイトボードでコードを書くように頼みます。その複雑なものの近くには何もありません(私は知っています、あなたはそれが複雑だとは思わない)、多くの候補者は完全に失敗します。私はvbスタイルのIf、Then、End Ifを書くのと同じように中かっこも付けて(おそらく安全のために)、C#を書いて(そして最初にC#を尋ねます)、セミコロンを1つも持たないようにしています。論理エラーから始めないでください!
私は最近、主にPHPを使用する上級職の50人以上のプログラマーにインタビューする任務を課されました。
私はスクリーニング試験でfizzbuzzの問題を投げました。主に自分自身を楽しませるためでした。10問の良い質問が必要で、9問しかなかったためです。当時の私の意図は、インタビューの質問であっても、私たちにも楽しんでいただけることを人々に示すことでした。
応募者の80%が問題を解決しましたが、係数演算子を使用しませんでした。
応募者の15%が問題を解決できませんでした。
応募者の5%は、係数演算子を使用して問題を解決しました。
私のサンプリングは非常に限られていますが(1つの国からの50人の応募者)、私はあなたにそれを伝えることができます:
彼らの95%は、CSカリキュラムでBS以上の成績を収めていました(ここの大学は、CSのサウンドをより壮観なものにしようと競争しています)。
本当にびっくりしました。まあ、おびえた..しかし驚かされた。問題が非常に人気になったので、結果を再現することに近づくとは思わなかった。これは、私の応募者の5%がスーパープログラマではない可能性があることを示していますが、少なくともプログラミング関連のブログを読んでいます。
前回の採用ラウンドでは、3人の建設労働者に0を割り当て、ゼロを繰り返し、プログラミングの教育または経験をソフトウェア開発者のポジションに適用しました。* これが樽の底です。スキルの正規分布を想定すると、平均スキルレベルがかなり低くなり、「平均以上」(応募者の中で)でも依然として比較的悪いことがわかります。
ここで、プログラミング能力のように思われるものを持っている応募者のみをうんざりさせている場合は、次のことがわかります。
さらに、私が見たいくつかの 'fizzbuzz'質問はドメイン固有です。言語/フレームワークxで何年も段階的に開発でき(したがって、xのz年の経験)、それの特定の部分に遭遇していません(たとえば、ライブラリ開発者はUIコンポーネント開発についてあまり知らない)。
同様に、最近は多くの開発者がメンテナンス開発を行っているため、一部の領域では、アーキテクチャ/設計スキルが弱い場合があります。
現在、99%が正確かどうかはわかりませんが、IMEはまだかなり高いです。少なくとも80%の範囲です。
*いいえ、これらのアプリケーションを呼び出したり、再確認したりすることはありませんでした。
はい、そうです。おそらく99%ではないが、それでもかなり高い。私は、コンピューターサイエンスの学生にインターンシップとフルタイムの採用の面接を行っていました。大学の学生約25人にインタビューします。生徒たちが話していたので、同じ質問をしないように言われました。最初の質問に答えることができる25人中3人または4人の学生しかいなかったので、私はそれが問題ではないことをすぐに学びました。 「strcmpを書く」
2つの文字列を比較する関数を作成するように依頼しました。関数を使用して、辞書の単語を並べ替えることができます。関数の書き方はもちろんのこと、2つの単語を比較する方法を理解していない学生の数に驚くでしょう。そして、これらの学生の一部は、CScですべてのAを取得したと主張しました。
問題は、プログラミングが非常に難しいことです。多くの人はプログラミングの方法を知っていると思いたいのですが、そうではありません。
いくつかの考え:
彼らのプログラムにバグがあったとしても、私は誰かに対してそれを保持しませんが、彼らは明らかに正しい考えを持っていました。デバッグはプログラミングの一部です。
多くの人が、自分ができないことを知らない仕事に応募しているのは残念だと思います。経済の問題のように思えます。
人に悪い質問をするのは本当に簡単です。唯一の「正しい」答えは、インタビュアーが与えるものです。
このテストは、私が雇う可能性のあるプログラマーについて知りたいいくつかのことを非常にうまくカバーしています。
最後の点について詳しく説明すると、fizz-buzzには無数の解決策があります。読みやすさを追求していますか?速度?簡潔?あなたはプログラムを素早く書き終えようとしていますか?プログラマーがこの単純な問題をどのように攻撃するかは非常にわかります。プログラマーがソリューションを選択して最後まで見ることができない場合、それはこの人が実際のタスクでどのように実行するかについて何を教えてくれますか?
残念ながら、印象的な履歴書を持っている多くの人々は基本的なプログラミングスキルを欠いているようです。履歴書にCとC++を記載した人がポインターに関する基本的な質問に答えられない場合がたくさんあります。
なぜこれほど人気のある質問なのかという理由の1つは、それに答える方法が1つではなく、候補者がどの方法を選ぶかによっては、コードのコーディング方法に関する洞察を得ることができるためです。 Stack Overflowで10Kの担当者がいる場合、いくつかの素晴らしい例を見ることができます here 。
99%統計については、その数値がどこから来たかを確認します。それはおそらくバイアスされています。それが最初の仕事のために面接する初心者レベルのプログラマーに基づいている場合、そうです、特に彼らの候補者の大多数がまっすぐに大学を卒業している場合は、可能であることがわかります。私は実際には、おそらく100の条件ifステートメントをその問題の解決策として書き出すだろう誰かを考えることができます。
FizzBuzzが私を避けてくれることを願っている人には2つのタイプがあります。
どちらの場合も、私は完全な実装については本当に気にしません。開発者の求人に応募する人と一緒に行う必要があるテストは、まったくプログラムできることです。
とはいえ、私はおそらくいくつかの理由でその特定のテストを気にしないでしょう。まず、それは非常によく知られており、上記のグループのいずれかですぐに試すことができます。第二に、私は Steve Yeggeの電話画面の質問 を使用して、プログラマー以外の人たちを招き入れる前に選別することを好みます。彼らが自分の職業を真剣に受け止め、確かにインタビューを正当化する開発者の上位1%にいたことを私に示唆してください。同様に、誰かがここまたはSO=に良い担当者がいたら、インタビューする傾向があります。
開発者がFizzBuzzをコーディングできないのは、作業をコピーして貼り付け、意図的にコードを書かないようにする "nine-to-fivers"が見つかるまでありません。上級開発者の1人がC#開発者に3年の「経験」をもって、辞書の使い方を教えているのを聞いたとき、私はそれを信じられませんでした。インターフェース?デザインパターン? stdout? YAGNI?私のリードはYAGNIについて聞いたことがありませんでした!これらの人々が知らないことは驚くべきことです。
私は今それを信じています。また、十分な開発を行っている開発者が多すぎると思います。
プログラマーの99%がプログラムしたり、簡単なコーディングテストを解くことができないという声明は非常に誇張されています。 FizzBuzzテストの場合、この問題に遭遇したことがあり、modulo演算子で簡単に解決できるか、以前に遭遇したことがなく苦労するかのいずれかです。それはあなたのプログラミングスキルについて何もインタビュアーに伝えません。
多くのプログラマーが面接で悪い印象を残しているという問題は、技術面接方法の性質にあると思います。面接担当者は、応募者が言語構文、データ構造、ハードウェアアーキテクチャ、設計パターンなどの詳細と計算の複雑さなどを記憶し、即座に再現することを期待しています。コンピュータサイエンス/ソフトウェアエンジニアリングの領域は広大です。すべてを暗記しようとすることは不可能で無意味です。
現実の世界では、重要なのは、割り当てられたプログラミング/設計の問題を理解し、問題を解決するための情報(IDE、マニュアルページ、書籍、Googleなど)を見つける場所を知ることです。ただし、これは面接担当者がテストすることはありません。
私はまだ比較的ジュニアのプログラマーです(私は2年間お金をかけてコーディングしていて、その前に約2の副次的責任として専門職としてコーディングしています)十分な量のソルトを使用してください。
大規模エンタープライズプロジェクトのコーダー向けの最初の画面を実行した経験があります(プロジェクトが破綻していることはわかっていましたが、とにかく彼らは支払いたいと思っていました)。採用を行う会社で唯一のプログラマーとして、私は履歴書を確認し、応募者を選別するタスクを与えられました。
これは政府のプロジェクトだったので たぶん おそらく最も才能のある応募者を惹きつけなかったでしょうが、実際にコードが示されたgithubアカウントを持つ誰からも、ポートフォリオを持っている誰からも1つのアプリケーションを受け取っていなかったため、最初のパスとしてfizzbuzz(文字通り正確な問題)を使用しました彼らがプログラムすることができるかもしれないように見えた誰にでも。
私は、それが愚かであることを知っていたが、実際に機能するコードを見たかっただけであり、同等またはそれ以上の値の別の例または実際には何でも送信できると述べた偽の謝罪を前に付けましたが、fizzbuzzで十分です。
結果:実際に正しい回答は1つも得られませんでした。これは、インターネット上の回答の量を考えると驚くほどです。誰も盗用に悩まされませんでした。以前に失敗したプロジェクトのイテレーションに取り組んできた人材を採用するだけで済みました。
エクササイズの最初のショックと、政府のソフトウェア/契約がどれほどねじ込まれているかについての失望の後、私は自分のスキルについてはるかに良く感じたので、小さな勝利ですか?
編集:正しくないということは、1つずれたエラー(つまり、99ではなく100までを要求したこと)または簡単な修正である他の無害なバグを意味するものではありません。機能していない、つまり実行/コンパイルなどされない、または問題が単に読み取られて理解されていないことを明確に示し、またかなりの部分がアプリケーションを撤回し、代わりに他のコードを送信したわけではありません。