web-dev-qa-db-ja.com

インタビューでデータ構造がなぜそれほど重要なのですか?

私が大学を卒業したとき、私はデータ構造があまり得意ではなかったことを告白しなければなりません。私の卒業時のキャンパス配置全体を通して、Amazon、Microsoftなどの大物ハイテク企業のほとんどが主にデータ構造に焦点を当てていることを目の当たりにしました。まるでデータ構造だけが卒業生に期待するもののようです。

正直なところ、私はそれについて気の毒に思いました。私は良いコードを書いています。私はコーディングの標準的なデザインパターンに従いますが、データ構造を使用しますが、Java ArrayList、LinkedListなどの公開されたAPIなど)のように表面的なレベルで使用します。ただし、企業は通常、データ構造の複雑な側面に焦点を当てましたポインタベースのメモリ操作や時間の複雑さのようなものです。

おそらく私のJava=バックグラウンドのために、当時、オブジェクトやインスタンスなどのオブジェクト指向プログラミングの観点から話されたときにのみコードの効率とロジックを理解しましたが、ビットのレベルにドリルダウンすることはありませんでしたデータ構造における私の知識の不足分を人々に見下されたくありませんでした。

では、なぜデータ構造に重点を置いているのでしょうか。

106
Vamsi Emani

microsoftのような大手テクノロジー企業のほとんどは、主にデータ構造に焦点を当てています。まるでデータ構造だけが卒業生に期待するもののようです。

いいえ、まだあります。たとえば、私たちalsoは、新しいフレームワーク、API、さらにはプログラミング言語さえも短時間で学習できる素早い学習者であることを期待しています。それは最低限のバーです。新しいフレームワーク、API、または言語を学ぶのに長い時間がかかる人は、Microsoftのほとんどのチームで成功する開発者ではありません。

そしてもちろん、データ構造の生の知識以外にも、インタビューで私たちが焦点を当てている多くの側面があります。たとえば、あいまいな仕様に対処する能力、または安全でないコードを生成するコーディングパターンを認識する能力、その他多数。しかし、データ構造を理解する能力は確かに非常に大きなものです。

特にインタビューは、最近のCS卒業生のデータ構造の知識のテストに偏っています。最近の卒業生は、そのほとんどが実世界での経験がなく、業界で15年の経験を持つ人が得意とするのと同じようなことは得意ではありません。

私はデータ構造があまり得意ではなかったことを告白しなければなりません

あなた自身についてそれを知っているのは良いことです。自分について変更できない、または変更したくない場合は、データ構造を備えた施設を必要とする仕事には応募しないことをお勧めします。

優れたプログラマーは、データ構造について十分な知識を持っている必要があるという一般的な見方があります。

優れたプログラマーは、構築する必要のある種類のプログラムを構築するのが得意なプログラマーであることはトートロジーです。多くのプログラマーが、データ構造の深い知識を必要としないタスクに取り組んでいます。たとえば、ユーザーインターフェイスの設計に関する深い知識が必要なタスクに取り組む人もいます。またはデータベースの正規化。または何でも。それらの人々はまだ彼らのドメインで「良いプログラマ」であることができます。

なぜこのすべてがデータ構造に重点を置いているのですか?

私のチームでは開発者が毎日複雑なデータ構造を設計、実装、操作しているので、データ構造についてインタビューの質問をします。昨日、4時間の会議があり、ダースの開発者は、特定のツリーノードに単一のブールフィールドを追加することの長所と短所を主張しました。おそらく私のチームには、データ構造を深いレベルで理解する能力以上に重要なスキルはありません。それについてはインタビューの質問をしないのはばかげています。

データ構造の知識がないと、プログラミングのキャリアに本当に影響しませんか?

まあそれは確かにあなたが私のチームで仕事を得ることを妨げます。しかし、前に言ったように、プログラミングはhugeフィールドです。データ構造の知識を必要としない多くの種類のコンピュータプログラミングがあります。

この主題の知識は本当に良いプログラマと悪いプログラマを区別するための十分な基礎ですか?

いいえ。しかし、ほとんどの場合、Microsoftで成功する可能性が低い開発者を検出するだけで十分です。 それが私が主に検出することに関心があることなので、データ構造の知識は、インタビューでテストする要素の1つです。

121
Eric Lippert

データ構造に関する重要な点の1つは、少なくとも実用的な目的では、データ構造は普遍的で時代を超えないということです。過去30年間に開発者であった人は、シングル/ダブルリンクリスト、バイナリツリー、グラフなどの基本的なデータ構造を知っているはずです。 2人の開発者にそれらについて尋ねる場合、開発者の知識を回答で比較できます。これはフレームワークや言語についてもほとんど言えません。Railsについて2人の開発者に尋ね、一方が他方よりも多くを知っている場合、それは本当に何を意味しますか?あなたが質問で言うように、賢い開発者は新しいフレームワークをすぐに学ぶことができるので、彼らの現在の知識をテストすることはあまり意味がありません。

データ構造に関する知識がないと、プログラミングのキャリアに本当に影響しますか?

はい。絶対に。あなたが一生をかけてCRUDアプリケーションを書くことを望まない限り。

それとも、この主題の知識は本当に良いプログラマと悪いプログラマを区別するための十分な基礎ですか?

いいえ、それは十分ではありません。しかし、就職の面接で尋ねることができる十分なものはほとんどありません。そして、アルゴリズムの知識は、少なくとも就学前の人々にとって、仕事の経験について尋ねることができないより良い指標の1つだと思います。

133
nikie

私はすぐに習得でき、かなり短い時間で新しいフレームワーク、API、またはプログラミング言語を学ぶことができます。

厳しく聞こえないようにしてください。ただし、中途半端な開発者であれば、比較的短い期間で新しい言語やフレームワークを習得できます。

データ構造は普遍的であり、コンピューターサイエンスの基本的なビルディングブロックです。赤黒木は、Java、Python、PHPなどで実装されているかどうかにかかわらず、基本的に同じです。特定の言語または特定のフレームワークをテストする場合、雇用主(少なくとも、傑出した開発者を探している雇用主)は、コンピュータ科学のfundamentalsを知っているかどうかをテストします。 -彼らが現在使用している月。

(少なくとも、彼らはファンダメンタルズをテストする必要がありますに加えて彼らが現在使用しているものは何でも...彼が人生でコード行を記述したことがない場合は、コンピュータサイエンスウィザードを採用しても意味がありません)

45
Dean Harding

F1レーサーだけdrive速い車だと思いますか?いいえ、彼らは自分が運転する車を理解しており、メカニックやエンジニアと協力してそれを調整しています。もちろん、通常のドライバーは運転するだけです。

あなたは単にwritesコードである通常の/平均的なプログラマーになることができます。あなたは背後にあるものを理解していません。あなたは物事を成し遂げる。以上です。また次の日にお会いしましょう。

しかし、多くの企業がF1開発者を探しています。コードの背後にあるものを知って開発する人々。会社がより良いものを構築するのにも役立つ人々。

データ構造を知ることは、「事前に調理された」形式で多く使用するだけでなく、非常に良いことです。また、彼らのアイデアから派生する何かを作成するので、それは良いことです。

30
graffic

データ構造に関する私のクラスで、教授が言った最初のことは次のとおりでした:このクラス本当に高速に検索できるということではありません。次に、最適なデータ構造とアルゴリズムを見つけるために半年かけて本当に速い検索。

それでも、彼は正しいままでした。データ構造を分析したり、適切なデータ構造を特定の問題に適用したり、新しいデータ構造を考え出すには、エンジニアの多くの資質が必要です。

  • 具体的な問題をモデル化するための抽象化を見つける
  • 問題を分解できること
  • 論理的/形式的に推論できる
  • 創造性
  • 等.

AmazonとMicrosoftが人を雇うとき、彼らはしません彼らは次のクイックソートを発明することを望んでいるなので、データ構造について質問します。彼らは、彼らが上記の資質を持つ人を雇うことを確実にしたいのです。

もちろん、これらの品質の大きなセットを持っていても、データ構造を吸うことは可能です。しかし、そうであれば、データ構造の専門家になるのにそれほど時間はかかりません。


そうは言っても、ArrayListが十分に拡張されないという問題がまだあります。システムが大きくなると、ジョブを実行するために、より適切なソリューションが必要になります。そして、データ構造を十分に理解していないと、具体的なシナリオで大規模に拡張する構造やアルゴリズムを見つけて構成することができません。

17
blubb

一般に、アルゴリズムとデータ構造は、プログラミングにおける最も「ハードコア」なトピックの2つと見なされています。これは、コンピュータサイエンスの分野で膨大な量の研究と研究が行われているためです。彼らはまた、数学や科学のようなものが好きな典型的な「左葉型」のプログラマーを魅了します(これは多くのプログラマーです)。

そうは言っても、特にGoogleのようなエンジニアリング指向の職場で面接する場合は、これらの知識が面接の面でキャリアに影響を与える可能性があります。しかし、他の企業は現在、その側面をまったく気にしている可能性があります。

私の経験では、アルゴリズム/データ構造の要求が「プログラマーエリート主義」として出くわすことがあり、アルファオタクは誰が一番賢いかを示すためにジョッキーしています。そこに何があるかを知ることは常に良いことですが、赤黒木を使用したり、ボイヤームーア検索をコーディングしたりする方法を知る必要がない、非常に多くの異なるプログラミングジョブがあります。

あなたがそれらを興味深く見つけ、それらをいじくることができるいくつかの個人的なプロジェクトを持っているならば、私はトピックについてもっと学ぶことを勧めます、そうでなければあなたはおそらく今のところそれらなしでうまくいくことができます

PS。 rudimentaryデータ構造(リンクされたリスト、辞書、ハッシュテーブルなど)を使用する能力は、プログラマーDSの必須知識である必要があります。

12
Homde

では、なぜデータ構造に重点を置いているのでしょうか。

2つの理由。

1つには、特定のプログラミング言語ではなく、抽象的な用語で問題を考えることができることを示しています。 なぜハッシュテーブルが特定の状況で赤黒ツリーよりも良いか悪い選択であるかを知っていますか?

もう1つは、怖い仕事について面接をしている人たちがいて、その経験について単純にで、プログラミング能力がある場合データ構造の質問は、これらの人々を取り除くための迅速な方法です。

7
John Bode

これらは基本的なものですが、卒業生は何をクイズしますか?彼らは、コースワーク以外の経験がある場合とない場合があります。彼らのコースは、Javaを言う以上にMicrosoftテクノロジーをカバーしているか、その逆の可能性があります。データ構造は共通の基盤です。

5
Ian

多くの場合、最良のコードは低レベルのデータ構造の再発明を回避します。これは、高級言語で特に当てはまります。 CRUDジョブでも、低レベルのデータ構造の質問に向かう傾向に気づきました。 YMMVですが、ハッカー科学者の専門知識に重点が置かれているため、優れた開発者を生み出す他のスキルが覆い隠されているようです。

  • プロジェクト/時間管理:1%速く動作する新しいリンクされたリストではなく、ビジネスによって推進される現実の世界についていくことができます。
  • 最低限のソーシャルスキル:傲慢でうまくいかない開発者は、アンカーにすぎません。
  • 新しいことをすばやく継続的に学習する能力:データ構造は何年にもわたってほとんど変化しませんが、それ以外はすべて変化します。データ構造は優れた基本であり、すべての開発者はそれらを十分に理解している必要がありますが、会計士はインタビューに参加するときに長い除算スキルについてテストされません。優れた開発者とは、新しいことを理解し、好きになることができる人のことです。

データ構造は素晴らしいです。データ構造は重要です。すべてのプログラマーがそれらを理解する必要があります。しかし、私たちはこれらのファンダメンタルズを彼らの場所の外に押し出すことに夢中になっています。データ構造についてすべてではなく、99%のケースでは、データ構造の基本を超えて質問する必要はありません。会計士に面接する場合は、81を9で割ったものを尋ねてください。ただし、「電卓なしの98425454242412 * 4512324の立方根は何ですか?」それからあなたはあなたが持っていたかもしれない合理的で、賢く、才能があり、そして快適な人々のかなりの割合を驚かすでしょう。基本的なリレーショナルデータモデルを構築できるかどうか、関連するフレームワークによって提供される拡張配列構造を使用できるかどうかを尋ね、バイナリ検索がフラット検索よりも高速である場合を説明できるかどうかを尋ねますが、あまり意味がありません。それをはるかに超えています。彼らがこれらのことを実行できる場合は、最も優れた、最もプロフェッショナルで、最も創造的な束を探し始めます。

ジョエルの執筆は大好きですが、彼の「Javaスクール」のことはまったく間違っていると思います。誰かがC++を習得する以上に賢いことを証明できるものはたくさんあります。考えてみてください。ポインタ演算について尋ねることなく、誰かと10分間話すことができます。そして、彼らが物事を成し遂げ、物事を理解できるタイプであるかどうかについてかなり良いアイデアを得ます。このようにする必要はありません。

インタビュアー:「あなたの業績について教えてください。」

コーダー:「私の最後のポジションでは、カスタムのERP 10億ドル規模の金融会社のシステムを開発しました。数か月前倒しで提供し、システムは過去に生産されています。 3年。"

インタビュアー:「明確にさせてください。あなたのprogrammingの成果について教えてください」

コーダー:「うーん...」

インタビュアー:「例えば、あなたはあなた自身のリンクされたリストを作ったことがありますか?」

コーダー:「... [ウォークアウト]」

4

優れたプログラマであるということは、言語やフレームワークを学ぶことができるということではありません。複雑な問題の解決策を構築できるようになることです。これらのソリューションを効率的かつ信頼性の高いものにするためには、ほとんどの場合、優れたアルゴリズムとデータ構造の適切な使用が必要です。データ構造が存在することを知るだけでは十分ではありません。問題に適切なデータ構造を使用するにはデータ構造が十分であることを理解する必要があります。リストとマップはいくつかの価値のある機能を提供しますが、それにはコストが伴い、間違った機能を使用するとソフトウェアのパフォーマンスを著しく損なう可能性があります。

良い面接担当者はこれを知っており、あなたが彼のチームまたは会社にとって貴重であることができるかどうかを決定しようとしています。 2年後から使用する言語は大きく異なりますが、効果的なアルゴリズムとデータ構造の必要性は変わりません。

4
cdkMoose

データ構造、時間の複雑さ、メモリ操作、およびポインタはすべて、自分をコンピュータサイエンティストと呼ぶ人が本質的に知っておくべき基本です。どのコードモンキーも言語を学び、その使用方法を学ぶことができますが、CSの専門家と学生が区別するべき場所は、リンクリストやハッシュマップの使い方だけでなく、なぜかを知っています。

WHYは、基本的なスクリプトキディ、コードモンキー、およびコンピューティングの世界のうなり声とは別に、私たちすべてを本当に差別化するものです。リンクリストの代わりにハッシュテーブルを使用する理由、ハッシュテーブルのクラスター密度が約.6-.8の場合、二重リンクリストの代わりに循環リンクリストを使用する必要があるのはなぜですか。なぜ私のコードは、最悪の場合は「x」、平均的な場合は「y」の効率で実行する必要がありますか。

これらの基本的なデータ構造と、それらがどのように使用されるか(とにかくすべてのプログラマーがどのように報復すべきか)に関する知識だけでなく、使用される理由が言語にとらわれないため、これらのケースで求めているものよりも多くなる傾向があります。

多くの場所では、コードをより堅固な言語で記述しますが、Cはもはやプログラミングの世界の言語ではなく、疑似コードの構造化は大雑把であり、多くの場合、疑似コード/ p&pコードが実際には教えられていないため、対処することは不可能です。

2
Jeff Langemeier

データ構造は、すべてのプログラムの基本的な基盤です。必ずしもそれらを深く理解する必要はありませんが、それらがどのように機能するかを絶対に知る必要があります。

どうして?すべてのコードがデータと対話して操作するためです。データ・セットを構造に保管できない場合は、使用できません。データは家の建築材料のようなものです。それを構造にまとめるまでは、無用なボードの山があります。

データセットについてどのように考え、定義するかを決定したら、-その後を使用して、デュオの古典的なアルゴリズム部分である処理を開始できます。 作成するすべての単一プログラムはデータ構造を使用しますが、多くの場合、この構造は非常に単純化されているため、ほとんど存在しません。状態データ用のいくつかの変数とこれで完了です!

単純なプログラムを超えて移動すると、ほとんどすべてのものがデータ構造を必要とします。ベストプラクティスと数学を使って超高層ビルを設計するプロの建築家、またはすぐに構築を開始する叔父のジョーボブのどちらを選びますか?

0
Spencer Rathbun