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


37

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


10
それはあなたがどこで働いているか、そしてあなたをプログラマーと呼びたい人によって異なります。
ティム

1
はい、否定的な形容詞がなければ。
デュロス

回答:


79

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


6
うわー、私はこれを「コードモンキー」という用語を使用して過度に政治的に正しい人々によって忘却に落とされると途中で予想していました。
dsimcha

15
「ソフトウェアのサル」常に有利な用語である
STW

3
私はまったく同意しません。「ゼロから」書かれているソフトウェアのタイプは、誰がそれを書くことができるかに大きく影響します。一部のソフトウェアは、他のソフトウェアよりも本質的に少ない(または大きい)洗練度を必要とします。
ニックスプライツァー

8
+ 1、20%は同意するため、5%は "Real Programmer TM"のため、75%はアセンブリ言語を習得し、それが苦痛に見舞われたふりをしたいためです
カーソンマイヤーズ

3
既存のジョブのほとんどは、「コードモンキー」のみを必要とします。「コードモンキー」の仕事に就く人は、彼の以前の知識をすべて忘れてしまい、彼の潜在能力にもかかわらず、毎日少し「コードモンキー」になりがちです。:(
cag

32

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


75
実際、歴史を知らない人は、50個すべてで酒を買うのに十分な年齢の有名なO(N log N)メソッドを使用する代わりに、O(N 2)またはO(N 3)メソッドを使用して歴史を再発明することを非難されます状態。
ジョンR.ストローム

@John ROFLMAO-本当だ!
スティーブンA.ロウ

3
....再

30

JavaScriptのような言語で作業すると、配列はベクター、ハッシュ、ツリーの混合であり、スタックまたはキューとして使用できるため、これはかなり時代遅れになります。Arrayクラスよりも優れたデータ構造をJavaScriptで実装する必要がある、または実装できる可能性はほとんどありません。これは、PHPにも当てはまります。

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

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

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

2つのことが確実です。

  1. このような知識に頼ることなく、プログラマーとしてのキャリアを積むことができます。
  2. それは、ほとんど間違いなく、彼らを知っているあなたを傷つけることはありません。

データ構造とアルゴリズムは単純なものであり、理解するのに適しています。そして、それは非常に明確で形式化されたものであり、アプリケーションまたはシステムエンジニアリングの複雑さに比べて非常に簡単です。それらはパズルのほんの一部にすぎませんが、把握するのは簡単です-ある程度の時間を投資したい場合。

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


13

これは、「プログラマ」と「ソフトウェアエンジニア」の間に意味的に意味のある区別が存在する場合があります。この文脈では、具体的には、いくつかのプログラミング言語と関連技術の知識があり、それらを使用して目的の結果を生成できることがわかります。これは、「コンピュータープログラマー」の優れた運用上の定義です。

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

多くの場合、毎日ではありませんが、私の仕事は複雑な問題の解決策を見つけることです。明確な解決策はなく、使用しているフレームワークの機能や作業している言語の機能によって直接対処されません。と。この中で、問題を分析して解決策を考案する必要があり、このプロセスは大規模なアーキテクチャの領域で行われることがあります。

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

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

あなたがあなたのキャリアで成長したい、そしてそれが不可欠であるという情熱を持っているなら、あなたはできるだけこれらの主題をしっかりと受け入れるべきです。それらに取り組む時間があるなら、心を開き、真の熱意を持って、あなたはいくつかの素晴らしいエキサイティングなものを見つけるでしょう。クイックソートを初めて理解した日を決して忘れません。興奮と発見の感覚は、私の人生の残りの大部分のコースを設定し、私はそれに対して感謝することはできませんでした。今、ソフトウェアエンジニアとして働く以外に何かをすることは想像できません。

何を選んでも幸運です。


2
常に明らかな解決策があります。要件が変わると動作しなくなります;)アルゴリズムとデータ構造に関する深い知識は、優れたソフトウェアエンジニアにとって本当の前提条件ではないと思います。優れたソフトウェアエンジニアが持っているものは、知識に対する満足のいく渇望であるため、それなしではめったに見られないというだけです。
back2dos

+1よく言います。「あなたの質問に答えるには、「私は何になりたいですか。自分のキャリアでどこに行きますか?」と自問するべきだと思います。
ビル

12

それは仕事の目的によって異なります。この種のことは、かなり標準的なインタビューの質問ですが、かなり想像力に欠けており、おそらく仕事とはまったく関係がありません-あなたがリストしたテクノロジーを使った仕事ではありません。

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

インタビューを受けられるようにこのようなことを学ぶか、これらのことを尋ねるのはあなたのためではないことを受け入れるだけです。


1
ご回答有難うございます。json css ajax javascript jqueryなどを使用して、ユーザーインターフェースの面で優れた人を必要とする私にインタビューする人々を、面白いインタビューと共有します。そして、どのような保存はワードファイルに押されたときに起こる
スシルbharwani

2
@sushil -私は...それはあなたが仕事にしたくない場所のようなものだと思う
ジョン・ホプキンズ

@sushil:@Jon Hopkins に完全に同意します。そのような仕事をするよりも良い仕事を待っているウェイターとして働く方が良い。無能な馬鹿を上司として持つことは、あなたを非常にいらいらさせ、あなたの個人的な成長に失速させます。
back2dos

6

いい質問ですね。JavascriptまたはJavaまたはVC ++は、リンクリストまたはハッシュテーブルを最初から作成する必要がない、超スマートなプログラミング言語です。ただし、どちらを使用するか、パフォーマンスのペナルティとボーナスが発生するかなどを決定する能力が必要です。

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


どうもありがとう、私はあなたのアドバイスを受け取り、それらのトピックについて学び始めます
マフムード・ホッサム

3

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


2

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



1

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

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

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

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


1

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

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

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

  • もちろん、データ構造とアルゴリズムはインタビューで多くの質問を受けます。それが、それらを知ることが役立つもう1つの理由です。


0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.