プログラマーがアルゴリズムを知る必要がある理由

多くの場合、「プログラマーはアルゴリズムを必要としますか」などの記事があり、それらのすべてにほぼ同じテンプレートがあります。 この記事の著者は、通常次のように書いています。「私は1年間1CでWebサイト/スクリプトを書いてきましたが、アルゴリズムやデータ構造を使用したことがありません。 ここでは、赤黒木または他のエキゾチックな構造は、作者が働いている分野ではほとんど見られませんが、もし見たとしても、例として挙げられています。 そのような記事は、特定の分野では、プログラマーが複雑なデータ構造を使用せず、NP問題を解決しないという事実に帰着します。



このような質問の定式化は根本的に間違っています。 業界の専門分野の数は絶えず増加しており、.netでサイトを作成する人は、エキゾチックなOSでARMアーキテクチャのセンサーのドライバを作成する人とはまったく異なることをします。 まず、アルゴリズムとは何かを判断しましょう。 非公式には、 Cormenは、1つ以上の値を入力として受け取り、結果として1つ以上の値を返す厳密に定義された手順としてアルゴリズムを定義します。 正式には、アルゴリズムはさまざまな計算モデルで定義されています。チューリングマシンで実行できる操作、またはラムダ計算を使用します。 したがって、実質的に何かを行うコードはアルゴリズムです。 「プログラマーがアルゴリズムを必要とするかどうか」という質問は、「プログラマーがコードを書くことができる必要があるかどうか」と言い換えることができます。 正しく、そのような質問は次のように聞こえるはずです:「業界Xのプログラマーは、高度なアルゴリズムとコンピューティング理論の詳細を知る必要があります」。



これらすべての記事を見ると、それらを書いている人々は、アルゴリズム分析、複雑なアルゴリズム、データ構造の形で、彼らが使用していないように多くの複雑な資料を学ぶことを余儀なくされたため、実際に大学に腹を立てていることに気付くでしょう。 実際、論文の著者は、著者の将来の仕事の分野を予測することができず、最低限必要なスキルのみを与えることができないという事実により、大学に腹を立てています。 実際、単純なWebサイトやスクリプトを作成するために、アルゴリズムやデータ構造に関する特別な知識は必要ありません。 それともまだ必要ですか?



キャリアを成功させるために必要なスキルを習得するために、大学でプログラマーに教える必要があるものについて考えてみましょう。 図書館? フレームワーク? それらは時代遅れになり、それらへのインターフェースが変わり、それらはすべて、ほとんどの場合、学生が業界で決して使用できない1つの言語で書かれています。 すべてのサイトを書くことを学ぶ? または、すべてのOSを書くことを学びますか? 教育は可能な限り多くの聴衆を対象とし、可能な限り多くのスキルを提供する必要があります。 まず第一に、プログラマーは問題を分析して解決できる必要があります-これはコンピューターサイエンス部門の卒業生が習得すべき主要なスキルです。 コードを書くことは、単に問題を解決するために使用される必要なツールです。 将来どのようなスキルが必要になるかを誰が知ることができますか? したがって、理論を研究することは、教育の観点から最も最適です。 取得したスキルはあらゆる分野に適用でき、優れた知識ベースでライブラリまたはフレームワークを学習することは難しくありません。 原則として、アルゴリズムの必要性について質問する人々がこの分野である程度の知識を持っていることは逆説的です。 計算理論の分野の知識がなく、誇らしげにそれを必要としていないと主張して叫んだ一人の人を覚えていない。



ですから、あなたは真空の抽象的なプログラマーであり、10年以上にわたってWebサイトをリベットし、同じタイプのクライアント/会社の単純な問題を解決しています。 ニッチで快適であり、計算理論とアルゴリズム分析のクラスで時間を無駄にするだけで苦痛を感じますが、何も得られませんでした。 朝、コーヒーのカップの上にタバコを灯し、存在の虚弱性に対する哲学的考察の深さで、複雑な問題を解決しないプログラマーがなぜアルゴリズムと分析の基礎を知っているのか疑問に思うでしょう。 簡単な答え:資格のある専門家になり、作成する言語を含む利用可能なツールを効果的に使用する。 アルゴリズムと分析の理論は、エキゾチックなアルゴリズムと、AVLおよび赤黒木の形のデータ構造だけではありません。 また、データを効率的に整理する方法、最大のパフォーマンスでコードを記述する方法、システムでボトルネックが発生する可能性のある場所、およびその対処方法に関する洞察も提供します。 既製のソリューションに精通しているため、自転車を作成せず、些細なことをする必要がないたびにGoogleにアクセスすることはありません。



分析とアルゴリズムの理論に関する知識は、実際には毎日すべてのプログラマーによって使用されています。私たちはこれらのことにあまり慣れていないので、考えもしません。 データベースからデータを取得する単純なサイトであろうと、サーバー上のbashスクリプトであろうと、あなたが決める問題が何であれ、何らかのデータ構造を使用します。 少なくともプリミティブ配列、そしておそらくもっと複雑なもの。 言語は多くの異なる構造を与えており、その多くは交換可能です。 多くの場合、実装が異なる1つの抽象型のバリエーションがいくつかあります。 たとえば、C ++には、ベクターとリストのデータ構造があります。 それらはどのように異なり、どちらを使用することの利点と欠点は何ですか? マップはC ++でどのように実装されていますか?また、マルチマップとはどう違いますか? リストはPythonでどのように実装されますか-配列またはリンクされたリストを通して、そしてそれを扱う最良の方法は何ですか? C#でArrayListを使用し、代わりにListを使用することが望ましくないのはなぜですか? SortedDictionaryはどのように実装され、Dictionaryの代わりに使用された場合、プログラムの実行にどのように影響しますか? 継続はどのように機能しますか、いつ使用する必要がありますか?それを使用すると副作用がありますか? ほとんどすべての言語に備わっているカレー関数を最後に使用したのはいつですか? C ++のマップがハッシュテーブルとして実装されていると思う場合、あなたは間違っています。 赤黒木に実装され、ハッシュテーブルはunordered_mapによって実装されます。 動的プログラミングについても言及する必要があります。 それが何であるか、再帰関数をどのように最適に書き換えることができるか、そしてメモ化とは何かを理解することは、多くの場合、足で撃たれるのを避けるのに役立ちます。 したがって、記述している言語を完全かつ効果的に使用するには、データ構造、データ構造、およびプログラムの実行にどのように影響するかについて、少なくとも表面的な知識が必要です。



しかし、ライブラリはどうでしょうか? 結局のところ、彼らは非常に多くの問題を解決します! ライブラリを合理的に使用するには、ライブラリも理解する必要があります。 まず、ライブラリ関数には、アルゴリズムを理解しなければわからない副作用や動作がある場合があります。 この場合、バグを受け取ったので、それをキャッチし、いつ回避できるかを決定するために長くて一生懸命試みることができます。 次に、多くの場合、さまざまなツールとライブラリを「調整」する必要があります。内部で使用するアルゴリズム、データ構造、およびテクノロジーを伝えるためです。 基本的な知識がなければ、マナを読むか、ランダムに選択する必要があります。 第三に、ライブラリAPIまたはフレームワークを呼び出すだけでは解決できない多くのタスクがあります。 この場合、何をしますか? 可能な解決策を探して何時間も過ごし、友人に助けを求めますか? 第4に、多くのタスクは数行のコードまたは組み込みの言語ツールで非常に簡単に解決されます。 ライブラリをドラッグしてくしゃみを解決すると、プログラムは巨大なモンスターになり、ディスク上で数百メガバイト以上を占有し、サーバー上のすべてのメモリを食い尽くし、同時にかなり機能が低下します。 さらに、接続されたライブラリのヒープが存在すると互換性の問題が発生し、同じプロジェクト内のいくつかのライブラリの奇妙な動作によりプログラムがランダムにクラッシュする可能性があります。 ライブラリを軽率に使用すると、かなり悲惨な結果を招く可能性があります。ライブラリのみを使用できるが、自分で簡単な問題を解決することさえできない開発者は、ソリューションが非競争的であるため高く評価されません。



10年以上の経験を持つ1人のプログラマーが一緒に働いていました。 当時使用していたライブラリがサポートしていない関数が必要になった場合:ビジュアルコンポーネントの1つでのプリミティブテキストラップ。 この「プログラマー」は、これは標準的な手段ではできないと考え、すぐにそのような関数の実装は不可能であると宣言しました。 このタスクは、分析脳を持つインターネット3年生によって解決され、2時間で簡単なアルゴリズムを作成し、目的のコンポーネントに実装しました。 私が継承した.netのサイト形式の別のプロジェクト。 メインページはいくつかの小さなグラフであり、読み込みに約10秒かかりました。 このプロジェクトを最初に行った人は、データベースからデータを長く悲しい時間で取得し、それらをグラフに結び付けたトリプルネストループからたくさんのひどい構造を積み重ねたことが判明しました。 少しリファクタリングした後、ページはほぼ瞬時にロードを開始しました。



プログラマーは、アルゴリズムと分析理論の知識がなくてもできますか? たぶんそのような「プログラマー」がたくさんいるでしょう。 想像力の範囲でプログラマーと呼ぶことができるだけです。 多くのプログラマーが10〜15年の経験があり、彼らが何をしているのか、そしてなぜそれを理解していないのかというインタビューで私を訪ねてきます。 彼らには独自のニッチがあり、彼らは会社から会社へ行き、1年以上彼らに滞在しません。 原則として、彼らは解決できる小さなタスクのセットを持ち、あなたが側に一歩を踏み出すと、その人は失われ、彼は新しいスキルで自分を訓練する必要があります。 そのような人々はプロジェクトに招待され、自転車を発明してマナを読んで大学からすでに知っておくべきことを見つけるのに多くの時間を費やしているので、できるだけ早く彼らを取り除きます。 彼らは通常、特定のキャリアと不安定な収入を持っていません。



最後に、なぜあなたがこの知識なしで仕事をすることができるならば、あなたはアルゴリズムと分析の理論を知る必要があるのですか? あなたの職業の資格のあるスペシャリストになること、同僚のキャリアと尊敬を持つこと。 タスクを効果的に解決し、車輪を再発明しない。 ディスク上の数百メガバイトを占める膨大な数のサードパーティライブラリでモンスターを書かないために、月の満ち欠けに応じて、サーバー上のメモリを大量に積み上げ、ランダムな理由で定期的に落下します。 効果的かつ最大限の能力を発揮するには、記述している言語を使用してください。 問題を解決するためのライブラリとテクノロジーの選択に関して、情報に基づいた有意義な決定を下すこと。 あなたの仕事がSQLクエリを書いてコマンドをコンソールに送ることであるなら、私はあなたを怒らせたいです:あなたはプログラマではなく、あなたはあなたであり、あなたは本当にアルゴリズムや彼のような他の人を必要とせず、あなたはそのような仕事のために大学で時間を無駄にしましたコースを修了するか、入門書を数冊読んでください。



All Articles