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