このサイトとSOを読んで、候補者がリンクリストを最初から実装しなければならなかったというインタビューの質問と回答の話をたくさん見ました。通常、これは次のような役割候補をプログラミングするための「ギミ」練習ですFizzBuzzを作成します。これは、候補者がこれを実行できない場合、プログラムを実行することができず、ほとんどすぐに拒否する必要があるという考えです。
ただし、次の理由により、これは不適切なプラクティスになる可能性があると思わざるを得ません。
リンクされたリストを使用して自由回答質問/候補者の問題解決/批判的思考能力につながることは、おそらく本当に良い面接の実践であると言えるでしょう。面接担当者は、応募者がどのような人で、どのように非常に有益であると考えるかを実際に確認できる方法です。
私は、デスクトップまたはWebアプリケーションで作業するプログラマーにとって、「リンクリストコードなし、仕事なし」のこのバイナリアプローチは少し時代遅れだと思います。また、非常に有害な場合もあります。リストの先頭を適切に処理する方法を思い出せない候補者は、他の点では優れたコーダーであり、同僚であり、ミックスで失われる可能性があります。考え?
[〜#〜] edit [〜#〜]:多くの(良い)コメントがあり、これが良い質問なのか悪い質問なのかは、仕事の内容によって異なることを示唆しています。私は強く同意するため、この質問を言い換えます。リンクリストの実装は、FizzBuzzのような質問や階乗を計算するための再帰関数の作成に似た、幅広いコーディングジョブに対する一般的なインタビューの質問です。この質問には、全体的にプログラミング候補者を評価するために一般的に使用される十分なユーティリティがありますか?それとも、「上級開発者、埋め込みリンクリストチーム」の役職を除いて、悪い質問と考えるべきでしょうか。
質問に答えることで候補者について知りたいことがわかった場合、それは面接のよい質問です。それがあなたにそれを伝えないなら、それは悪い質問です。
FizzBuzzのような簡単な質問は特定の目的に役立ちます。候補者がFizzBuzzをコーディングできない場合、彼らは単にコーディングできず、面接を早期に終了できます。リンクリストの実装は少し難しいと思いますが、データ構造全般についての会話が始まり、多くのことが明らかになります。
面接の質問1つでは、知りたいことすべてがわかるわけではないことを覚えておいてください。質問のグループを準備する必要があります。候補者が知っているlimitを見つけることができるように、質問を最も簡単なものから最も難しいものの順に質問する必要があります。あなたが一つの質問をして、彼らがそれを釘付けにしても、あなたはまだ彼らが他に何をするか知らないのか分かりません。
あなたの編集について:
この質問には、全体的にプログラミング候補者を評価するために一般的に使用される十分なユーティリティがありますか?それとも、「上級開発者、埋め込みリンクリストチーム」の役職を除いて、悪い質問と考えるべきでしょうか。
プログラミングの候補者を実質的に評価するために使用できる優れた一般的な質問だと思います。質問のより大きなグループの一部である必要があるだけです。これは、多くのタイプのポジションにとって良いアイスブレーカーになります(候補者がリンクリストを最初から実装できない場合でも、以前にどのように使用したか、主要な機能を説明できるかもしれません)、または「上級開発者、埋め込みリンクリストチーム」のポジションに対する、より高度な一連の質問。
このような単純なパズルに頭が空っぽだったので、私は純粋に仕事を逃しました。私はまた、他のインタビューでそのようなパズルについて見事に行いました-非プレッシャー環境でリンクリストを実装する方法を知っています。一緒に働いたことのある人から自分の能力について不満を受け取ったことは一度もないので、私が仕事を逃したと思ってはいけないのかもしれません。
ええ、私はそれがせいぜい疑わしい慣行だと思いますが、私はそれを理解しています。私はまた、それを高圧の状況にするために、それが質問の責任ではなく質問者の可能性を考慮しました。
個人的には、候補者がすでに解決した問題について、自由回答形式で質問することをお勧めします。最近、可能であれば、コーディングとプロセスの両方の問題を取り上げます。彼らがコードサンプルを持ち込めるなら、素晴らしい。
プログラミングジョブタイプを定義する必要があります。コンパイラとアルゴリズムを開発している場合は、そのようなことについての質問が予想されます。基幹業務タイプのアプリケーションを使用していて、候補者がCRUDアプリケーションを実行することを期待している場合は、(プログラムを作成せずに)概念の知識があれば十分です。今日、特にLOBタイプのアプリケーションで作業を行うために必要なさまざまなテクノロジーの知識は、きちんとしたアルゴリズムの必要性に取って代わります。
私の答えは「場合によります」です。候補者が履歴書にCまたはC++を記載しているかどうか、この質問をします。リンクされたリストの実装を求めることは、CまたはC++プログラマーにとって絶対に不可欠であるポインターを理解するための優れたテストです。
一方、候補者がCまたはC++を知っていると主張しない場合は、リンクリストを実装するように彼に依頼しませんが、それについて質問することを検討します。リンクリストがどのように機能するかを高レベルで説明します。リストの先頭に要素を追加する複雑さは何ですか?リストの最後?リストの中央に要素を挿入しますか?配列ではなくリストをいつ使用しますか?これらは、IMHOがすべてのプログラマーが知っておくべき基本的なデータ構造の概念です。
私はそれを悪いインタビューの質問だとは思わないでしょう。データ構造の理解とプログラミングの多くは、リンクリストを本当によく理解することから始まります。とはいえ、いくつかの注意点があります。
1)フィズバズタイプの質問です。あなたは非常に基本的なものを検証しているだけです:その人はリンクリストを理解していますか?それを聞いて、次に進みます。
2)リンクリストには、リンクリストの概念(Cなど)の理解を示すのに非常に適した言語が、仕事で使用する言語と異なる場合があるという課題があります。もちろん、構造を備えた任意の言語で基本的な理解を示すことができますが、候補者に[]を使用せずにリンクされたリストをErlangで再実装するように依頼することは同じ課題ではなく、候補者の理解について同じことを教えてくれませんCで実行するように依頼する。ジョブがJavaの周りにある場合は、Cで実行するよう依頼することでも、要点が多少不足しています。
3)そのことと「ホワイトボードプログラミング」の一般的な課題を念頭に置いて、この種の質問をするときは、コア原則の理解を示す限り、疑似コードまたは図を受け入れます。構文的にも論理的にも完璧なホワイトボードにコードを書くことを求めないでください。特に、振り返って論理的な問題を特定し、もう一度見直すよう求められた場合はなおさらです。 YMMV。
インタビューをしているときに、リンクリストの実装と、リンクリストを中心としたいくつかのアルゴリズムを頻繁に求められました。私はそれらのほとんどを解決しました、そしてそれらのいくつかは私のニューロンを少し運動させることを必要としました。
面接を受けていた場合は、リンクリストの実装のようなものを選び、人がコーディングにどれだけ優れているかをテストするのではなく、細部にどれだけ注意を払っているかを確認します。リンクされたリストは誰でも作成できますが、優れたプログラマーでさえ失敗するのは境界の場合です。彼に尋ねないでください:Write a code for linked list in C/C++
。 C(C++ではない)などで一般的なリンクリストを書くように彼に依頼します。
問題をひねって、リンクされたリストに他のいくつかの条件を加えれば、あなたは尋ねるべき良い質問をするでしょう。そのとき、間違いを犯す人もいます。
これまでの約10年間の専門的なプログラミング(および趣味としての約10年間)では、リンクリストを実装する必要はなかったと思います。面接中に誰かが私にそれをするように頼んだら、私はそれが私が仕事で定期的に行うことであるかどうか尋ねることによって対抗するかもしれません。
確かに、ほぼ確実に、一般に知られているアルゴリズムのクリーンルーム実装を作成する必要のあるジョブがあります(リンクリストを最初から実装するなど)。しかし、ほとんどのプログラミングの仕事について、候補者が面接中にそれを行うことができることは、会社にとってどのような具体的な価値がありますか?そのような状況では、候補者がEdgeケースを正しく処理し、言語やフレームワークの一般的な慣行に従って障害を報告するなど、完璧な実装を提供することが本当に重要ですか?あるいは、それを見落として、代わりに、おそらく10〜20年で直面していない問題に実際にどのように取り組むかに焦点を当てることができますか?
現在の仕事について面接したとき、会社で使用されているテクノロジスタックについてはほとんど経験がありませんでした。今、数年後、私は定期的に同僚のところに来て、製品、それらの実装、およびそれらによって実装された標準についてだけでなく、はるかに一般的なプログラミングの問題についても質問しました(昨日、この影響は、特定のテーブルのコンテキストにおけるSQL Serverの既定の制約の循環依存関係と、私たちの場合のその使用法でした-それを推論すると、その特定の場合には影響がないことがわかりました)。そのために、まったく新しいリンクリストの実装も必要ありませんでした。
候補者が割り当てられる可能性が高い仕事に関連する質問をします、そして彼らが新しい知識を習得することについて彼らがどのように感じているかについての考えを得ようとします。彼らはどのようにして、彼らが見たことがないいくつかのあいまいな構文の意味を理解しようとしますか? (たとえば、Cショップの場合、3文字表記に関する質問を試すかもしれません。)プログラミングの立場について、彼らは定期的にスタックオーバーフローなどのフォーラムを読んだり、フォーラムに投稿したりしていますか?彼らがプログラミング言語またはフレームワークでいくつかのタスクを実行するように依頼された場合、彼らはほとんどまたはまったく経験がありません(たとえば、主にJavaショップの場合、Clojureまたは.NETはどうですか?)、次に、彼らはどのように問題にアプローチしますか?たぶん、実際のバグをバグトラッカーから取り出し(解決されてから長い間もあるかもしれません)、一般的な用語でどのようにそれを解決するのか、そして関連する部分を説明する準備ができているか尋ねます問題の製品。
候補者がビジネスケースに関連するタイプの問題を処理でき、新しいことを学ぶことに良い姿勢を持っている場合、それはおそらく、その特定のポジションの適合性よりもはるかに優れた指標です FizzBuzzやリンクリストなど、よく知られた質問に対する返信定型文を提供します。候補者がチームにどれだけ適合するかを投げ入れてください。あなたはかなり安全な立場にいると思います。
もちろん、ほとんどの人はリンクリストを実装する必要はありませんが、それらを最初から実装するには、おそらくポインタを正しく処理する必要があります。彼らの考えは、ポインタの一貫したメンタルモデルを形成したことは言語能力と相関し、一部の(抽象的な)マシンレベルで何が起こるかを理解し、一般に抽象化する能力であるということです。
これが必ずしも最善の方法であると言っているのではなく、何らかの相関関係があるということだけです。
あなたはそれらが「ギミ」質問であると言って始めますが、それから人々は当然それらを行うことができないだろうと指摘します。よくわかりません。
ここに私がそれについてどう思うかがあります:
私はそれが彼らをgoodに尋ねると思うと思います。面接のための事前学習について心配している場合は、リストを用意してください。彼らにそれを循環的に書いてもらい、彼らの実装の漸近的な実行時間は何であるか尋ねます。または、別の一般的なデータ構造またはクイックデータ構造、あるいはその両方を作成してもらいます...バイナリ検索ツリーですか?キュー(FIFO)?スタック(FILO)?素朴な(O(n)
)優先度キュー?私が知っている多くの人は、BSTはO(log n)
それがツリーであるためだと思っています。
金属で作業する人を探していて、データ構造にvery強固な基盤が必要な場合...これらはfarあなたが採用しようとしている候補者。
もちろん、これは、データ構造の基本/基本を持っている開発者が必要であり、それらの立場がそれらの基本から利益を得ると想定していることを前提としています。数秒でASPページを一緒にスローできる人が必要な場合は、インタビューを行ってください。重要なのは、他の誰もがそうであるようにインタビューの質問を選ぶことではなく、あなたが探しているスキルを測定する質問を選ぶことです。個人的には、データ構造の質問は良い、リンクされたリストであるか、そうでないと思います。
この質問には、全体的にプログラミング候補者を評価するために一般的に使用される十分なユーティリティがありますか?
いいえ、絶対にありません。言い方に応じて、「この候補者はリンクリストの設計方法を知っている」から「この候補者はリンクされたリストを言語Xでプログラムできる」までさまざまです。疑似コードを要求すると、最初のコードに近づく傾向があります。特定の言語での実装を要求すると、言語についての理解が深まります(特に、ポインターと参照および構造体を処理できるCおよびC++の場合)。
同じ質問を使ってすべての候補者を評価することは不可能だとまで言ってもいいでしょう。面接で求めているスキルを評価するには、面接の質問を調整する必要があります。
その人がコードを書く立場にいる場合は、その立場に関連する限り、アルゴリズムやデータ構造の質問を含めることを検討します。以前に議論または使用された可能性のあるものを選択しようと思います。また、実行時間やメモリ消費量(big-O表記など)など、上記のアルゴリズムやデータ構造の実装以外にも焦点を当てます。これらの概念は、データ構造の作成だけでなく、どの実装が最も適しているか(たとえば、ArrayList
とLinkedList
など)の選択にも関連しています。
通常のプログラミングの仕事は候補者を排除する質問であるべきだとは思いません。しかし、本当に上級のプログラマーか、長年モンキーコーディングフォームを使用してきた誰かを扱っているかどうかを確認するのに適しています。それでも、それはプログラマーを選択するための基本的な基準であってはなりません。たぶん、記憶力の悪い優れたプログラマーであり、「リンクされたリスト」という言葉を何年も読んでいない(または名前を覚えていない)が、それでも優れたアプリを実行できる。
ですから、誰かが言ったように、もしリンクされたリストやたくさんの空想的なアルゴリズムなどを扱う必要があるなら、それでいいです。フォーム上の通常の入力データの場合、検証と表示は少し役に立たず、不公平です。
これはインタビューの質問の悪い例だと思いますが、別の理由があります。リンクされたリストは、それが何であるかを知ることはそれを実装する方法を知ることであるというような単純な概念です。その人がリンクされたリストが何であるかを知らない場合は、それがどのように機能するかを説明する必要があります。そうすることで、何も発見せずに答えを出します 問題を解決する方法を知っているかどうかにかかわらず =。したがって、質問は「リンクリストとは何か、そしてそれがどのように機能するかをすでに知っていますか?」に還元できます。これは、プログラマーとしての適合性について何も役に立たないことを示しています。
リンクされたリストの実装を書くことは、候補者のコーディングの方法について多くを明らかにするので、良い面接の質問です。
彼はAPIが何か知っていますか?彼は他の人のコードを使用できますか?他の人がそれを使用できるように彼はコードを書くことができますか?
彼はリンクリストが何であるか知っていますか?コレクション、データ構造、アルゴリズムを知っていますか?
彼がリンクリストが提供する必要のある方法すら知らない場合は、おそらく彼がこれを使用したことがないか、いつ使用するかを知っているでしょう。
彼はどのように問題を処理しますか?彼はまず分析、小さな仕様、事前のテストから始めますか?それとも、彼はただハッキングを始めましたか?
彼はEdgeケースを扱いますか?リンクリストから最後のノードを削除するのはどうですか?誰かがリンクされたリスト自体への参照をリンクされたリストに追加しようとし、その後全体を削除した場合はどうなりますか?
彼は例外を扱いますか?各プログラミング言語には、例外を処理するための独自の規則があります。Javaでは、空のリストに対してgetFirst()を実行すると、LinkedListがNoSuchElementExceptionをスローすることが予想されます。他の言語では、未定義、-1、または定数が返される場合があります。