候補者にリンクリストの実装を作成させるのは面接の習慣として悪いですか?[閉まっている]


43

このサイトを読んで、候補者がリンクリストを最初から実装しなければならないと言ったインタビューの質問と回答の多くの物語を見てきました。通常、これはFizzBu​​zzを書くようなロール候補者をプログラミングするための「ギミー」演習です。候補者がこれを行うことができない場合、彼らはプログラムすることができず、ほぼすぐに拒否されるべきであるという考えです。

ただし、次の理由から、これは悪い練習になると思わずにはいられません。

  • C#やPythonなどの最新の高レベル言語は、ネイティブでリストを広く使用しています。独自のリンクリストオブジェクトの作成は、通常とは異なる状況でのみ必要であり、それでもおそらく不適切です。
  • C ++のような低レベル言語には、イテレータ/リストコンテナとオブジェクトを備えた標準ライブラリがあります。
  • 最初の2つのポイントに照らして、コーダーはリスト(リンク、二重リンクなど)を実装することさえ考えずに何年も行くことができます。大学時代からそのようなものを見ることさえない人もいます。
  • コンピューティング能力も数年前の要因ではないため、ポインターを介した効率は以前の問題ではありません(一般的に)。
  • 「リンクリストの例」のような単純なWeb検索では、多くのコード例が表示されますが、それらは暗記し、吐き出すだけで、申請者の真の能力を示すものではありません。

リンクされたリストを使用して、自由回答形式の質問/候補者の問題解決/批判的思考能力の議論につながることは、ほとんどの場合、非常に優れた面接の練習です。面接担当者は、応募者がどのようなもので、どのように考えると非常に有益であるかを実際に見ることができます。

デスクトップまたはWebアプリケーションで作業するプログラマーのための「リンクリストコードも仕事もない」というこのバイナリアプローチは少し時代遅れだと思います。また、非常に有害な場合もあります。リストの先頭で適切に作業する方法を覚えていない候補者は、そうでなければ優れたコーダーおよび同僚であり、ミックスで失われる可能性があります。考え?

編集:これが尋ねるべき良い質問か悪い質問かは、仕事の文脈に依存することを示唆する多くの(良い)コメントがあります。私は強く同意するので、この質問を言い換えてみましょう:リンクリストの実装は、FizzBu​​zzや階乗を計算するための再帰関数を書くような質問に似た、幅広いコーディングジョブの一般的なインタビューの質問です。この質問には、プログラミングの候補を全面的に評価するために一般的に使用するのに十分なユーティリティがありますか?または、「シニア開発者、埋め込みリンクリストチーム」の職を除いて、尋ねるべき悪い質問を検討すべきですか?


11
これはどのような立場ですか?これはどんな仕事ですか?それはどのドメインにありますか?
トーマスオーエンズ

1
私はあなたの編集を見ますが、それでも-これはどのような仕事ですか?これはインターンシップですか?エントリーレベルの仕事ですか?中間の仕事ですか?プログラマー、エンジニア、または科学者を募集していますか?これはどのドメインですか?何らかの理由で独自のアルゴリズムまたはデータ構造をロールする必要があるような立場にあるでしょうか?
トーマスオーエンズ

3
「C#(...)ネイティブにリストを広範囲に使用する」と「ポインターによる効率は問題ではない」:これらのネイティブリストはリンクリストではなく、配列に基づくリストであることを知っていますか?キャッシュのため、配列のパフォーマンスが向上する傾向があります。実際、IIRCの.NETフレームワークには2.0までリンクリストさえありませんでした。私はそこにあるC#プログラムの大部分がリンクリストを使用していないと確信しています。
アレックス10ブリンク

1
@AlextenBrink興味深いことに、それはリンクリストの知識がC#にとってさらに重要でないことを意味すると思います。言語に組み込まれたより良い構造を使用できるのに、データ構造を(可能性のあるバグとともに)自分で実装する理由
joshin4colours

私が念頭に置いている質問は、「ほとんどすべての場合、別のデータ構造に劣るデータ構造の使用を検討する理由さえありますか?」です。リンクリストは、ほとんどの操作で、配列に基づくリストよりも低速です。リンクリストが適しているのは、一定の時間内に削除することだけですが、それが必要な状況はほとんどありません。インタビューの質問に適したデータ構造であるかどうかについては話していないことに注意してください。関係する概念は良いテストかもしれませんが、わかりません。
アレックス10ブリンク

回答:


52

質問に答えることで候補者について知りたいことがわかるなら、それは良い面接の質問です。それがあなたにそれを告げないなら、それは悪い質問です。

FizzBu​​zzのような簡単な質問は、特定の目的に役立ちます。候補者がFizzBu​​zzをコーディングできない場合、彼らは単にコーディングできず、インタビューを早期に終了できます。リンクリストを実装するのは少しだけ難しいと思いますが、一般的にデータ構造についての会話を始めることができ、多くのことが明らかになります。

面接の質問で、知りたいことをすべて伝えるものではないことを覚えておいてください。質問のグループを準備する必要があります。候補者が知っていることの限界を見つけることができるように、最も簡単なものから最も難しいものへと順番に質問をする必要があります。1つの質問をして、彼らがそれを釘付けにした場合、あなたは彼らが他に何をするか、または知らないかをまだ知りません。


編集に関して:

この質問には、プログラミングの候補を全面的に評価するために一般的に使用するのに十分なユーティリティがありますか?または、「シニア開発者、埋め込みリンクリストチーム」の職を除いて、質問するのは悪い質問と見なすべきですか?

プログラミングの候補者を実際に評価するために使用できる、良い一般的な質問だと思います。質問のより大きなグループの一部である必要があります。多くのタイプのポジションに適した砕氷船(候補者がリンクリストを最初から実装できない場合でも、以前のリストの使用方法と主要な機能を説明できる場合があります)、または「シニア開発者、埋め込みリンクリストチーム」の役職に対するより高度な質問の長いシーケンス。


19
最初の段落は半分です。残りの半分は:質問されて候補者があなたのために働きたいと思うなら、それは良い面接の質問です。候補者があなたのために働きたくない場合、それは悪い質問です。
ruakh

5
「複雑な」と「基本的な」とみなされるものが同じ順序で候補者に適用されると断言する方法がないため、候補者がその方法で知っていることの限界を見つけることはできません。LinkedListは、大学で教えられたプログラマーにとっておそらく基本的なものですが、独学のプログラマーはおそらく1つも書く必要がなかったでしょう。結局、彼はおそらく必要なときにいつでも "LinkedList <string> ..."を書いたでしょう。それは、彼の知識が「linkedList」レベルの下に固定されているということですか?彼はより複雑な科目の専門家であり、Googleで5分でLLを学ぶことができます。
Sylverdrag

1
@Sylverdragだから、複数の質問が必要だと言った。リンクリストに関する知識の限界を見つけたら、別のトピックに移動します。
トカゲのビル

@ruakhそれは間違いなく役割を果たす。インタビューで聞かれる質問がすべてCRUDアプリのありふれた側面に関するものであれば(つまり、その会社で新しいことを学べるとは思わない)、そこで働くことに興奮することはありません。
トカゲのビル

34

私はこのような単純なパズルに夢中になっていたため、純粋に仕事を逃しました。私は他のインタビューでもそのようなパズルについて見事にやってきました。プレッシャーのない環境でリンクリストを実装する方法を知っています。一緒に仕事をしたことがある人から自分の能力について苦情を言ったことは一度もなかったので、仕事を逃したと思ってはいけないかもしれません。

ええ、それはせいぜい疑わしい練習だと思いますが、私はそれを理解しています。また、それを質問のせいではなく、質問者のせいである可能性も考えました。

個人的には、候補者がすでに解決した問題について、自由自在な質問をすることを好みます-可能であれば、最近、コーディングとプロセスの両方の問題をカバーします。彼らがコードサンプルを持ってくることができれば、素晴らしい。


彼らは何か質問する必要があります。質問があると、その人は空白になります。
サイン

2
@pdr-「彼らがコードサンプルをもたらすことができれば、素晴らしい。」彼らが持ってきたコードサンプルを書いたら、貴重です。
ロブラムブッシュ

4
誰かがリンクリストの実装を空白にして、少しプロンプトを表示したり、簡単にイライラしたりすることができない場合、私はそれを逃すことを気にしないだろうと思います。
ビルK

1
@pdr-「できなかったら、どのくらいの期間、仕事に就けると思いますか?」-あなたが苦しんでいる人事制度の下でそれらを解雇するのにかかる限り。次に、候補者の検索を再開するための追加費用があります。また、あなたがインタビューした次の人があなたの部門全体の技術的要となるかもしれないという事実に固有の機会費用。しかし、もちろん、あなたは間違った人雇って、彼らは別の仕事見つけたので、彼らは利用できません。
ロブラムブッシュ

1
@robrambusch:彼は優れた問題解決スキルを示し、クラス構造についてよく話しました。しかし、彼はコードを書きませんでした。インタビューでコードを書くというテーマについては、はい、それは役に立ちますが、私はあなたが解決した問題についてあなたに話す時間であなたについてもっと学ぶことができると主張します。解決する時間。
pdr

25

プログラミングジョブタイプを定義する必要があります。コンパイラとアルゴリズムを開発するビジネスをしているのであれば、そのようなことについての質問が予想されます。基幹業務アプリケーションを使用していて、候補者がCRUDアプリケーションを実行することを期待している場合は、(プログラムを作成せずに)概念の知識があれば十分です。今日、LOBタイプのアプリケーションで特別に仕事をするために必要なさまざまなテクノロジーの知識は、きちんとしたアルゴリズムの必要性に取って代わります。


まさに。昨年、汎用の遺伝的ソートコンポーネントを作成しました。このコンポーネントは、シミュレートされたアニーリングを少し使用し(クラススケジュールを作成する)、いくつかの「高度な」データ構造を使用して実行しました。単一のものをコーディングする必要はありませんでした。.Netフレームワークに必要なものがなかった場合は、C5またはPower Collectionsを使用しました。
エルグリンゴグランデ

4
同意します。私はLOBアプリを終日作成します。過去にリンクリストの実装を...大学で... COBOLで作成しました。もう一度できますが、なぜですか?有能なLOB開発者の多くは、おそらくこれを書いたことがないので、絶対に書く必要はありません。
CaffGeek

1
一般的には同意しましたが、リンクされたリストはエキゾチックなものではありません。これは基本であり、FizzBu​​zzの1つ前のレベルです。
フランチェスコ・デ・ヴィットーリ

1
@FrancescoDeVittori:それは時々問題ではないですか?誰かがあなたに解決すべき問題を与えます。それは十分に単純に思えますが、あなたはそれを以前にやったことがないので、あなたの脳はレースを開始し、あなたがそれを考えなければインタビューを犠牲にすることになる落とし穴を見つけようとします。そして、それはそこにありませんが、それは実際の問題を解決することからあなたをそらしています。
PDR

@FrancescoDeVittori:非基本的なインタビューの質問の例をいくつか教えてもらえますか?これは自己改善のために必要です。ありがとう。
デン

9

私の答えは「それは依存します」です。候補者が履歴書にCまたはC ++を記載している場合、この質問をします。リンクリストの実装を要求することは、CまたはC ++プログラマにとって絶対に不可欠なポインターを理解するための良いテストです。

一方、候補者がCまたはC ++を知っていると主張しない場合、リンクリストの実装を依頼することはありませんが、それについて質問することを検討します。リンクリストの仕組みを高レベルで説明します。リストの先頭に要素を追加する複雑さは何ですか?リストの最後?リストの中央に要素を挿入しますか?配列ではなくリストをいつ使用しますか?これらは基本的なデータ構造の概念であり、私見では、すべてのプログラマーが知っておくべきです。


7

私はそれを悪いインタビューの質問とは思わないでしょう。多くのデータ構造の理解とプログラミングは、リンクリストの十分な理解から始まります。ただし、いくつかの注意事項があります。

1)それはフィズバズタイプの質問です。あなたは非常に基本的なものを検証しているだけです。その人はリンクリストを理解していますか。聞いて先に進みましょう。

2)リンクリストには、リンクリストの概念(Cなど)の理解を示すのに非常に適した言語が、仕事で使用する言語と同じではないという課題があります。もちろん、構造を持つ任意の言語で基本的な理解を示すことができますが、[]を使用せずにErlangでリンクリストを再実装するように候補者に求めることは同じ課題ではなく、候補者の理解について同じことを伝えませんCでそれを行うように頼むことです。仕事がJavaを中心としているのであれば、Cでそれをするように頼むことも、その点をいくらか失います。

3)それを念頭に置いて、「ホワイトボードプログラミング」の一般的な課題を念頭に置いて、この種の質問をするとき、コア原則の理解を示す限り、擬似コードまたは図を受け入れます。特に、もう一度確認するように求められたときに論理的な問題を特定し、特定できる場合は、ホワイトボードに構文的および論理的に完璧なコードを書くことを求めません。YMMV。


6

インタビューを行っていたとき、リンクリストの実装とリンクリストを中心としたいくつかのアルゴリズムを求められました。私はそれらのほとんどを解決しました、そして、それらのいくつかは私のニューロンを少し運動させる必要がありました。

面接を受けたことがあったら、リンクリストの実装のようなものを選び、人がコーディングの能力をテストするのではなく、人が細部にどれだけ注意を払っているかを確認します。リンクリストは誰でも作成できますが、優秀なプログラマでさえ失敗するのは境界の場合です。彼に聞かないでください:Write a code for linked list in C/C++。C(C ++ではなく)で一般的なリンクリストを作成するように彼に依頼します。

問題をひねり、リンクされたリストに他のいくつかの条件を入れてください、そしてあなたは尋ねるべき良い質問があるでしょう。間違いを犯す人もいます。


2
Cには一般的なリンクリストのようなものはありません。
DeadMG12年

1
マジ?voidポインタはそのためだけにあると思いました... :) Googleで「cのジェネリックリンクリスト」の最初のリンクはdaniweb.com/software-development/c/threads/109260で、もう1つは技術面接でした.com /… 誰もがこれを知っていると思った!
-c0da

...私はこれらのコードをテストしていませんが、私は、以前のリンクリストのこのタイプを持っている、そしてそれは確かに罰金を働いた
c0da

C#で一般的なリンクリストを作成する場合でも、1つまたは2つの「落とし穴」があります(たとえば、T型の要素を比較するのは非自明です。つまり、(T v1、T v2)=> {return v1 == v2;}はコンパイルに失敗します)クラス制約がある場合、またはデフォルトの等値演算子を使用する場合を除く)
スティーブンエバーズ

@ c0da私の意見では、voidポインターを使用するリストは一般的ではなく、いつでも一般的です。どんな種類の物でも中に入れることができ、必要なものをすべて混ぜることさえできます。まさにそれは私にとって一般的ではありません。これobjectは、オブジェクト指向言語で基本型を使用するようなものです…
突く

5

これまでの約10年間のプロのプログラミング(および趣味としての別の10年間)で、リンクリストを実装する必要はないと思います。誰かがインタビュー中に私にそれをするように頼んだら、私はそれが仕事で定期的にやっている何かであるかどうか尋ねることによって反論するかもしれません。

確かに、リンクリストをゼロから実装するなど、一般的に知られているアルゴリズムのクリーンルーム実装を作成する必要があるジョブはほぼ確実にあります。しかし、ほとんどのプログラミングの仕事では、候補者が面接中にそれを行うことができるという会社にとって、特定の価値はありますか?このような設定では、候補者がエッジケースを正しく処理し、言語またはフレームワークの一般的な慣行に従って障害を報告するなどの完璧な実装を提供するほど重要です。それとも、それを見過ごして、代わりに彼らが実際に彼らがおそらく10-20年で直面していない問題にどのようにアプローチするかに集中できますか?

現在の仕事のためにインタビューしたとき、会社で使用されているテクノロジースタックについてはほとんど経験がありませんでした。数年後、私は定期的に同僚を訪ねて、製品、それらの実装、それらによって実装された標準だけでなく、はるかに一般的なプログラミングの問題について質問します(昨日、その意味は、特定のテーブルのコンテキストでのSQL Serverの既定の制約の循環依存関係と、この場合のその使用法でした-それを推論すると、その特定のケースでは意味がありませんでした)。そのために、新しいリンクリストの実装も必要ありませんでした。

候補者が割り当てられる可能性が高い作業に関連する質問をする、新しい知識の獲得についてどのように感じているかを把握してください。彼らは今まで見たことのないいくつかのあいまいな構文の意味をどのように理解しようとしていますか?(たとえば、Cショップの場合は、トライグラフに関する質問を試してみてください。)プログラミングの立場では、Stack Overflowなどのフォーラムを定期的に読んだり、投稿したりしますか?プログラミング言語またはフレームワークでタスクを実行するように依頼された場合、経験がほとんどないかまったくない場合(たとえば、主にJavaショップの場合、Clojureや.NETはどうですか)、彼らはどのように問題に取り組みますか?バグトラッカーから実際のバグを取り除いて(解決されてからずっと長いものである場合もあります)、一般的な用語でそれを解決する方法を尋ね、問題の製品の関連部分を説明する準備をしてください。

候補者がビジネスケースに関連するタイプの問題に対処でき、新しいことを学習する態度が良い場合、それはおそらく、よく知られている質問に対して定型の回答を提供できるよりも、その特定の立場に合うかどうかのはるかに優れた指標です質問は、FizzBu​​zz、リンクリスト、またはその他に関するものです。候補者がチームにどれだけうまく適合するかを投げてください。あなたはかなり安全な立場にいると思います。


4

もちろん、ほとんどの人はリンクリストを実装する必要はありませんが、最初からリンクリストを実装するには、おそらくポインタを正しく処理する必要があります。彼らの考えは、ポインターの一貫したメンタルモデルを形成したことは、言語の習熟度、一部の(抽象的な)マシンレベルで起こることの理解、および一般的な抽象化能力と相関するというものです。

これが必ずしも最良の尺度になるとは言っていませんが、相関関係があるということだけです。


4

あなたは彼らが「ギミ」の質問だと言って始めますが、それから人々は理解できるほどそれらをすることができないだろうと指摘します。よくわかりません。

私はそれについてどう思うかです:

  • あなたが言うように、それを書く必要はめったにないので、人々は簡単に忘れてしまうでしょう。
  • 書くのはそれほど難しくありません。
  • それらを記述するために使用される概念は基本的なものと考えることができます。
  • 彼らは(あなたがそれを知らなくても)信じられないほど頻繁に使用されます。

それは彼らに尋ねるべき良い質問になると思います。面接の事前学習について心配している場合は、リストに入れてください。彼らにそれを回覧してもらい、彼らの実装の漸近的な実行時間は何であるか尋ねてください。または、別の一般的なデータ構造やクイックデータ構造を記述しているか...バイナリ検索ツリー?キュー(FIFO)?スタック(FILO)?単純な(O(n))優先度キュー?私が知っている多くの人々は、BSTはO(log n) それが木だからだと思っています

あなたは金属製で働いて、そして必要とされる誰かを探しているなら、非常なデータ構造での強固な基盤を...これらが偶数になるようにしてもはるかにあなたが雇うために探している候補者のためにあまりにも些細な。

もちろん、これは、データ構造の基本/基本を備えた開発者が必要であり、それらの基礎から利益を得られることを前提としています。数秒でaspページを一緒に投げることができる誰かが欲しいならば、それのためにインタビューしてください。重要なのは、面接の質問を他のみんなが選ぶからではなく、探しているスキルを測定するものを選ぶことです。個人的には、データ構造の質問は、リンクされたリストでよいか、そうでないと思います。


実際には混乱しません。FizzBu​​zzはさらに簡単な質問ですが、応募者は日常的に答えることさえできません。リンクリストについても同様です。それはプログラミングの世界の謎です。
joshin4colours

@ joshin4colours:いいえ、質問について混乱しています。最初、OPはLLの質問はGimmeの質問であると言いますが、その後、資格のある開発者が質問に失敗する理由についてリストポイントに進みます。
スティーブンエバーズ

3

この質問には、プログラミングの候補を全面的に評価するために一般的に使用するのに十分なユーティリティがありますか?

いいえ、まったくありません。言い回しに応じて、「この候補者はリンクリストの設計方法を知っています」から「この候補者は言語Xでリンクリストをプログラムできます」に至るまでの範囲がわかります。擬似コードを要求する場合、最初に向かっている傾向があります。特定の言語での実装を要求すると、その言語の理解がさらに深まります(特に、ポインターや参照、構造体を扱うことができるCおよびC ++の場合)。

同じ質問を使ってすべての候補者を評価することは不可能であると言ってもいいくらいです。面接の質問を調整して、そのポジションで求めているスキルを評価する必要があります。

その人がコードを書く立場にあるなら、その立場に関連する限り、アルゴリズムやデータ構造の質問を含めることを考えます。以前に議論または使用された可能性のあるものを選択しようとします。また、実行時間やメモリ消費(big-O表記など)など、前述のアルゴリズムとデータ構造の実装以外にも注目します。これらの概念は、データ構造の作成だけでなく、最適な実装の選択(例:ArrayListLinkedListなど)にも関連しています。


3

定期的なプログラミングの仕事は、候補者を排除するような質問であるべきだとは思いません。しかし、本当に上級のプログラマーを扱っているのか、それとも長年にわたってフォームを猿でコーディングしているだけの人物を扱っているのかを確認するのは良いことです。たとえそうであっても、それはプログラマーを選択するための基本的な基準ではないはずです。たぶん、記憶力に乏しい優秀なプログラマーで、長年「リンクリスト」という言葉を読んだことはありません(または名前を覚えていません)が、それでも良いアプリを作成できます。

だから、ある人が言ったように、リンクリストやたくさんの派手なアルゴリズムなどを扱う必要がある仕事になるなら、それでいい。フォーム上の通常の入力データの場合、検証と表示はまったく役に立たず不公平です。


2

これはインタビューの質問の悪い例だと思いますが、別の理由があります。リンクリストは、それが何であるかを知ることは、それを実装する方法を知ることであるほど単純な概念です。リンクリストが何であるかを知らない人は、それがどのように機能するのかを説明する必要があります。そのため、質問は「リンクされたリストとは何か、そしてどのように機能するかを既に知っていますか?」に還元することができます。


2
また、よくある質問は、暗記が得意な人によるゲームの対象となります。
ポールネイサン

1
リンクリストが候補者にどのように機能するかを説明する必要がある場合は、おそらくプログラミングを行うために彼を雇うべきではありません
...-Dima

2

リンクリストの実装を書くことは、面接の良い質問です。候補者のコーディング方法について多くのことが明らかになるからです。

  • 彼はAPIが何であるかを知っていますか?彼は他の人のコードを使用できますか?他の人が使用できるように彼はコードを書くことができますか?

  • 彼はリンクリストが何であるかを知っていますか?彼はコレクション、データ構造、アルゴリズムを知っていますか?

リンクリストが提供するメソッドがわからない場合は、おそらく彼が使用したことがないか、いつ使用するかを知っています。

  • 彼はどのように問題を処理しますか?彼は最初に分析、小さな仕様、事前にいくつかのテストから始めますか?それとも、彼は幸せにハッキングを始めたのでしょうか?

  • 彼はエッジケースを処理しますか?リンクリストから最後のノードを削除するのはどうですか?誰かがリンクリストへの参照をリンクリストに追加しようとして、それからすべてを削除しようとしたらどうなるでしょうか?

  • 彼は例外を処理しますか?各プログラミング言語には、例外を処理するための独自の規則があります。Javaでは、空のリストに対してgetFirst()を実行すると、LinkedListがNoSuchElementExceptionをスローすることが予想されます。他の言語は、未定義の-1または定数を返す場合があります。


インタビューコーディング演習では、特に求められない限り、概念実証に必要なものを超えて、あらゆる種類のエッジケース処理、エラー処理などをスキップします。しかし、私はそれが私がしている選択であることも明確にします。1時間または数時間の面接中の制約は、実際に使用されるものに実際に取り組んでいる状況とは大きく異なります。
CVn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.