web-dev-qa-db-ja.com

優れたプログラマーになるために、アルゴリズムと理論を学ぶことはどのくらい重要ですか?

重複の可能性:
データ構造とアルゴリズムに引き続き投資すべきですか?

私はCSの学生です。私は本当に素晴らしいプログラマーになりたいのですが、素晴らしいプログラマーになるためには何が必要ですか?それからたくさんのコードを書く他に、アルゴリズムと理論(論理!)を学ぶことが助けになると聞きました。最高になるために何をお勧めしますか?何を読む必要がありますか?何を勉強する必要がありますか?

12
Snow_Mac

プログラミングはプログラムと同じくらい広大で多様です。アルゴリズムの複雑さを気にすることなく、実り多いキャリアを積むことができます。私は毎日の命を救うのに役立つデータベースタイプのアプリケーションを開発してきましたが、自分で作成したもののBigO表記を計算する必要はありませんでした。

つまり、アルゴリズムはドメインの重要な部分であり、それを学べば良い資産になる可能性があります。それを学ぶことは、それを測定する方法であなたが遭遇する可能性がある特定の問題にあなたの心を開き、それらを解決するために使用できるいくつかの一般的なパターンを教えてくれます。

そう、そうです、アルゴリズムの研究は確実にあなたをより良いプログラマにします。

ここで、もっと重要なことは、キャリアとしてどのような問題を解決したいかということです。これを知ることは、適切なツールを手に入れるために役立ちます。 Algorithmicは重要な理論的ツールですが、 認知的エルゴノミクスアーキテクチャパターン情報理論 もそうです。 ソフトウェア開発プロセス のさまざまなパターンを学習するなど、実際に退屈で面白くないと嫌われがちな業界のソフトウェアを作成する際に重要な役割を果たす多くの現実的な知識もあります。 。

これは決して包括的なリストではありませんでしたが、私の経験では、すべてがあなたを優れたプログラマーにするのに等しく価値があります。それはすべて、プログラミングで解決したい問題とそれらを解決するために使用したいアプローチに依存します。

---編集--- Earlzがスキルを学んだ後にコメントで述べたように、それらはずっとあなたと一緒に残っています。したがって、システムの完全な詳細なbigO分析を行ったことはありませんが、ナレッジは引き続き利用可能ですが、システムの感触をつかむ補足的な感覚が得られると思います。私はかつて、実装が階乗順に実行される単純なロギングシステムに出くわしました。プログラマーがアルゴリズムの複雑さについて知っていて、それに気づかなかった場合にコーディングすると、代わりに古いレトリック「ログを記録するだけで、ランタイムには影響しない」が得られたと思います。もちろん、データのインポートが完了するまで約64億年待たなければならないことを顧客に伝えなければならないのは彼ではありませんでした。

これは、知識に関するそのような基本的な組織のほとんどすべてに当てはまります。あなたが積極的にそれを使用しなくても、得られた知識は残り、あなたの日常業務に影響を与えます。特定の言語、方法論、システムを学ぶことは短期的には良いことですが、本を開く前に陳腐化する運命にあります。

13
Newtopian

本物のプログラマになるには、少なくともある程度はアルゴリズムを研究する必要があります。 そうではないがプログラミングに不可欠なことはたくさんありますが、少なくともある程度の知識がなければ、あなたはかなり没頭しています。

この分野には多くの古典がありますが、最も明白なのは、

  1. The Art of Computer Programming、Donald Knuth著
  2. アルゴリズムの概要、Cormen、Leiserson、Rivest、Stein。

個人的には、私はKnuthを好む傾向がありますが、どちらも完全に適切であり、他のものは、新しいアルゴリズムの方法でより多くカバーしています(ただし、Knuthの新しいエディションは、その点でも間違いなく優れています-私は自分のコピーを更新していません30年ほど前に購入しました。

7
Jerry Coffin

絶対に不可欠です。中央。これ以上問題はありません。

一部の人々は、アルゴリズムクラスで学んだジャンクを決して利用しないと主張しています。

しかし、奇妙なことに、ネストされたループを回避し、ポインターを利用するタイミングを知っているようです。

したがって、彼らはそれを利用したことがないと主張することができます。しかし、それは明らかに彼らのコーディングに影響を与えます。

5
S.Lott

データ構造を調査します。適切なデータ構造を知ることは、プログラムを編成する方法を知る上で非常に役立ちます。また、適用可能なアルゴリズムはそれらから続く傾向があります。

たとえば、配列内にデータを保持できるかどうか、またはハッシュテーブルやツリーなどが必要かどうかを(単一の関数またはプログラム全体の)仕様から理解することを学びます。

また、ライブラリを知ってください。現代のプログラミング言語は、配列/ベクトル、セット、マップなどのデータ構造を中心にライブラリを編成する傾向があります。赤黒ツリーを自分で実装する必要はないかもしれませんが、必要な場合と標準ライブラリのどの部分が実装されているかを知っています。 1つ(またはパフォーマンスの点で同様の構造)。

4
Fred Foo

「偉大なプログラマ」が何を意味するかによる。私は(任意に)偉大さを3つの同じビンに分けます:

  1. クリエイティブ:挑戦的な新しい問題に直面した場合、効率的なソリューションをすばやく決定します。
  2. 責任がある:あなたは明快で、明確で、保守可能なコードを作成し、決してビルドを壊さない
  3. 百科事典:ライブラリー、フレームワーク、OSなどの外部の世界とのやり取りが不明瞭な問題がある場合、その対処方法をすぐに理解できます。

理想的には、すべてのタイプであることが望ましいですが、それは一般的には不可能です。アルゴリズムと理論が本当に役立つ場所は、最初の種類です。私はコンピューターサイエンスの研究者として、いつもそれを使用しています。タイプ2の専門知識は希望よりも頻度が低く、タイプ3はめったに使用しません。

参考文献として: CLRアルゴリズムのテキスト は古典的であり、読みやすいです。おそらく、オンラインでいくつかのクラスの使用法がうまく機能していると思います---試してみてくださいMIT OpenCourseWare。最も重要なことは、IMHOは、漸近的な複雑さに対して強い直感を得ることです。 CLRのようなテキストで記述されたパスを使用すると、データ構造とアルゴリズムの基本的なリテラシーも得られ、うまく機能します。

2
user18793

優れたプログラマーはどのように測定されますか?どのように測定したいですか?

これらの質問に対するあなたの答えは、今日あなたに影響を与えるのに役立つかもしれませんが、彼らはあなたのキャリアを通して再び現れ続けます。

技術的な熟練は確かに成功を収めるための基本となります。ただし、自分を区別するために、オプションがあります。多くの場合、ほとんどすべての目的地への複数の経路があります。おそらく、優れたプログラマーになることは、ドメインを分析して消化する優れた能力によって達成でき、特定のドメインのクロススタディが役立つかもしれません。おそらく、心理学と社会学の理解を通じてユーザーの意図を特定するための不可欠な能力によって、それほど具体的ではない方法で達成できます。おそらく代わりに、それはビジネスについてもっと知ることになります:マーケティングで効果的であり、人々がそれが存在する可能性があることに気づく前に人々が何を求めているかを理解し、そして彼らがそれを望んでいるだけでなくそれに依存していることを説得します。多分それは何か他のものです。

私が与えるアドバイスは、プログラミングはあなたが磨く工芸かもしれないが、あなたが自然な才能や興味を持っている他の分野のより深い研究を意図的に省略しないことです。

2
JustinC

これは、答えるのが少し難しい質問です。特に、ますます強力な抽象化/ライブラリを取得する場合、これらのことを学ぶ必要はほとんどありません。

フェーズI

何千人もの経営幹部が、実際にプログラミングしていることを知らなくても、Microsoft Excelと呼ばれるツールでプログラミングを続けることができます。ワークフロー(ヒューリスティック)の定義、データの並べ替え、データの管理、データのクエリを続行できます。プログラミングの言葉を知らなくても、タスクを自動化できます。 Excelは、並べ替えと検索を行うときに、適切なアルゴリズムが何であるかを調べます。

では、アルゴリズムのアイデアをどのように彼らに売りますか?

フェーズII

昔のことですが、APIを実際に覚えておかないと、適切なアプリケーションを実装することは不可能だと思いますか。それらを覚えるか、マニュアルで調べ続ける必要がありました。 EclipseのCtrlスペースにより、今日ではそのようなことをする必要はほとんどなくなりました。

フェーズIII

近い将来、IDEとツールには、与えられた入力に基づいて(アルゴリズム的に)どのソリューションがより適切であるかを示唆するインテリジェンスが組み込まれる予定です。または、sort()などの関数があるかもしれません。これは、時間と空間の複雑さを調べるのに必要なアルゴリズムをインテリジェントに計算します。

複雑さの水床理論

抽象化は大きな成功を収めています。すでにライブラリや言語によって処理されている複雑さのレベルを気にする必要はありません。抽象化が発明されるたびに、その下にある複雑さを確認する必要が少なくなります。

0
kamaal