web-dev-qa-db-ja.com

プログラマーと呼ばれるアルゴリズムとデータ構造を理解する必要がありますか?

コーディングしてから6年になります。 ActionScript、JavaScript、Java、PHP、Ajax、XML HTML、ASPなどのあらゆる種類のものへのコード化。配列、マップ、リンクリスト、セットなどを使用しており、私が好きな人にはどこでも使用しました。しかし、私がインタビューされるときはいつでも、人々はハッシュ、ツリー、スタック、キューについて質問をする可能性が非常に高いです。いくつかの質問は、いくつかの並べ替えアルゴリズムのジャグリングについてです。それらを本当に知っているべきか、それともプログラマーと呼ぶのをやめるべきかは分かりません。これらすべての質問をしている人が私を選んだとしても、私にこれらのことを働かせることは決してないでしょう。私は本当にこれらすべてを知る必要がありますか?

38
sushil bharwani

方法がグルーコードの記述しかわからない場合は、自分をコードモンキーと呼ぶことができます。たくさんのグルーコードを書く必要があり、コードモンキーとしてまともな生活を送ることができます。自分を本物のプログラマと呼ぶには TM コードを最初から作成する必要がある場合は信頼され、アルゴリズム、データ構造、メモリ管理、ポインタ、アセンブリ言語などを理解し、この知識を使用してトレードオフを評価する方法を理解する必要があります。

80
dsimcha

歴史を知らない人はそれを再発明することを非難されます

33
Steven A. Lowe

配列はベクトル、ハッシュ、ツリーの組み合わせであり、スタックまたはキューとして使用できるため、JavaScriptなどの言語で作業すると、これは非常に陳腐化します。 Arrayクラスを上回るデータ構造をJavaScriptで実装する必要があるか、実装できる可能性はほとんどありません。これはPHPにも当てはまります。

Java OTOHの場合、違いがあります。Javaの標準ライブラリがあなたの必要なデータ構造についてあなたに提供すると思います。しかし、

  1. 適切なデータ構造を選択できるように、これらのデータ構造を理解して区別し、さまざまな状況でそれらがどのように機能するかを理解する必要があります。
  2. Javaでは、最終的にハッシュマップの独自の実装を作成して、非常に特殊なケース(たとえば、キーで最適化を可能にするいくつかの特別な制約をフルフィルで処理したい場合)で速度を向上させることが絶対にあり得ます。

ソートアルゴリズムに関しては、アルゴリズムを自分で実装する必要がないため、それらを知ったり理解したりする必要はほとんどありません。ただし、そのようなアルゴリズムが提供されている場合は、それを理解して実装できるはずです。

2つのことが確かです。

  1. あなたはcanこのような知識に頼らずにプログラマーとしてのキャリアを築くことができます。
  2. それは間違いなくあなたがそれらを知ることを害することはありません。

データ構造とアルゴリズムは単なるものであり、理解しておくとよいでしょう。そして、それは非常に明確で形式化されたものであり、アプリケーションやシステムエンジニアリングの複雑さに比べれば、かなり簡単です。それらはパズルのほんの一部にすぎませんが、簡単に理解できます。時間をかけてもかまいません。

だからいいえ、あなたはそれらを必要としませんが、それはそれらを知るためのあなたの利益のためだけです。

30
back2dos

これは、「プログラマー」と「ソフトウェアエンジニア」の間に意味的に意味のある違いがある可能性がある機会かもしれません。この文脈では、具体的には、いくつかのプログラミング言語と関連技術の知識があり、それらを使用して望ましい結果を生成できることがわかります。これは「コンピュータプログラマ」の細かい運用上の定義です。

自分はソフトウェアエンジニアだと思います。私の仕事の日常のほとんどの局面で、私はおそらくあなたと同じことをしています。コンピューター言語と関連テクノロジーを使用して、望ましい結果を生み出しています。ただし、私はデータ構造とアルゴリズムを理解しており、その知識は、私がより多くのことを実行する能力の基本的な土台であると考えています。

多くの場合-毎日ではありませんが-私の仕事には、明確な解決策がない複雑な問題の解決策を見つけることが含まれます。と。この中で、問題を分析して解決策を考案する必要があります。このプロセスは、大規模なアーキテクチャの領域で行われることもあります。

この種の作業を行うには、これらのより深い問題を十分に理解する必要がありますが、十分ではありません。つまり、ハッシュテーブルのしくみや、ヒープソートのパフォーマンス特性が通常優れている理由を知るだけでは、システムアーキテクトや上級エンジニアとして十分ではありません。それは論理的な出発点であり、そこからより深く掘り下げてより広く旅行し、より大きな問題に取り組むために必要な経験を得ることができます。

あなたの質問に答えるには、「自分は何になりたいの?自分のキャリアはどこへ行くの?」と自問する必要があると思います。自分がやっていることを続けて満足している場合は、直面している大部分が恣意的なインタビューの質問に答えるために十分なデータ構造とアルゴリズムを学びたいと思うかもしれません。

キャリアを伸ばしたいが、それに対する情熱が不可欠である場合は、これらの主題をできる限りしっかりと受け入れる必要があります。あなたがそれらに取り組む時間、オープンマインド、そして真の熱意を持っているなら、あなたはいくつかの素晴らしい、エキサイティングなものを見つけるでしょう。クイックソートを最初に理解した日は決して忘れません。ワクワクと発見の気持ちが残りの人生の大部分を占めるようになり、それ以上に感謝することはできませんでした。今、私はソフトウェアエンジニアとして働く以外に何もできないとは思えません。

何を選んでも幸運です。

13
Adam Crossland

それは仕事が何のためにあるかに依存します。この種のことはかなり標準的なインタビューの質問ですが、かなり想像力に欠け、おそらくその仕事とはまったく関係がありません。もちろん、あなたが挙げたテクノロジーを使用する仕事ではありません。

私にとって、面接の質問は、一般的なプログラミング能力や知識の尺度ではなく、コンピュータサイエンスの学位を取得したかどうか(そしてそれを覚えているかどうか)を判断するのに適しています。

面接を通過できるようにこのことを学ぶか、これらのことを尋ねるのはあなたのためではないということを受け入れるだけでよいことをお勧めします。

12
Jon Hopkins

すばらしい質問です。 JavascriptまたはJavaまたはVC++は、非常にスマートなプログラミング言語であり、リンクリストまたはハッシュテーブルを最初から作成する必要はありません。ただし、いつ使用するかを決定する機能が必要です。もう1つは、パフォーマンスのペナルティとボーナスがそれぞれ発生することなどです。

私は多くのAPIプログラマー別名コードモンキーにインタビューしましたが、ほとんどのインタビューでは、パフォーマンス効率が高くスケーラブルなシステムを設計するのに日常的に失敗しています。結論:APIの負荷を知ることでパンが手に入りますが、バターの場合はコンピューティングの基本から始める必要があります。

6
Fanatic23

「はい、もちろんあなたはまだ自分をプログラマーと呼ぶことができます」を追加します。しかし、どのようなプログラマーになりたいですか?最高のプログラマーは、理論上の基礎に少なくともある程度の根拠があると思います。彼らは知っていますなぜ彼らは特定のデータ構造/アルゴリズムとそれに伴うトレードオフを選択しました。私がインタビューする開発者は、同じ専門用語を使用していなくても、少なくとも基本的な理解を持っていることを期待します(専門用語を知らないと、他の開発者とのコミュニケーションが難しくなります)。

3
Martijn Verburg

アルゴリズムの知識により、選択がどのように行われるかを自信を持って言えますscale!私は個人的にはこれが上級プログラマになるために必要だと思います

2
user1249

「優れたプログラマーになりたい場合は、毎日2年間プログラミングするだけです。ワールドクラスのプログラマーになりたい場合は、毎日10年間プログラミングできます。または、毎日2年間プログラミングしてアルゴリズムクラスを受講することもできます。 」

-チャールズE.ライザソン

Charles E. Leisersonによるアルゴリズムの分析からの良いアドバイス-MIT

2
milan-j

あなたは今すぐ良いプログラマーかもしれませんが、データ構造、アルゴリズムの知識、およびコンピュータサイエンスの他のトピックの知識は、多くの点であなた自身を向上させるのに確かに役立ちます。

  • 物事をより効果的かつ迅速に行うことができる場合があります。すでにコンピュータサイエンスの学位を取得していて、これらのトピックの多くを知っている人でさえ、自分自身を改善するために最新の進歩に遅れをとらない傾向があります。

  • この知識は、ある程度までは、後でプログラマから管理トラックに移動する場合にも役立ちます。これは、この知識があればプロジェクトの技術的側面をよりよく理解できるためです。

  • もちろん、データ構造とアルゴリズムはインタビューでよく尋ねられるので、それがそれらを知ることが役立つかもしれないもう1つの理由です。

1
aditya

プロジェクトによって異なります。私はコンピューターエンジニアのBEngであり、アナリストプログラマーとして働いています。

私は設計(テスト、ドキュメント、コード設計)のために長い時間を費やしました。しかし、バグ(またはパフォーマンスの低下)を見つけた場合、または新しいデータ構造をコーディングする必要がある場合(アプリケーションの要件が非常に新しいため)、アルゴリズムのどこに問題があるのか​​を理解し、修正する必要があります(これはあまり良くなかったので、:))

古典的なアルゴリズムとデータ構造は、開発者の世界では一種の「辞書パターン」です。

いくつかの優れたリンク:

1
alepuzio

あなたはハッシュ、ツリー、スタック、キュー、ソートアルゴリズムについて言及します。さて、あなたが言及したテクノロジーは、ほとんどがウェブページとウェブスクリプティングに関連しています。少なくともツリーは必ず理解しておく必要があります。そうすることで、DOMを適切に処理できるようになります。しかし、スクリプティングだけで十分であれば、おそらく大丈夫です。実際のプログラマーにとって、取引のツールのほとんどは必要ありません。しかし、それは、ほとんどのWebスクリプトを構成する文字列ジャグリングと、私たちの多くが "プログラムを書く"と考えるものとの間に大きな違いがあるためです。

私はハッシュとツリーを実質的に毎日処理し、スタックとキューの頻度は低くなりますが、十分な頻度です。ソートは基本的には解決済みの問題です。ほぼすべての言語の標準ライブラリに組み込まれたクイックソート、基本的なコレクション型のSortメソッドなどがありますが、どのような状況でクイックソートのパフォーマンスが大幅に低下する可能性があるか、およびソートを遅らせる適切な戦略を知っておく必要があります。

これらの原則とそれらがどのように機能するかを知らなかった場合、おそらく機能するコーディングソリューションを改造することができますが、それらは非常に高品質のソリューションではありません。実行速度が遅く、読みにくく、変更、再利用、拡張が困難です。したがって、優れたプログラマーになることを学びたい場合は、アルゴリズムとデータ構造を必ず読んでください。彼らは本当にあなたのコードの品質を向上させます。

0
Mason Wheeler