私は、コンピュータープログラマーとしての能力に自信の危機に直面しています。
昨日、グラフ用に自分の最短経路アルゴリズムを考え出そうとしましたが、数時間後にタオルを投げてダイクストラのアルゴリズムを学びました。
これは、優れたプログラマーが数時間で「再発明」できるはずの種類ですか、それとも非現実的ですか?
まあ、少なくとも私はバブルソートを再発明することができました:D
私は、コンピュータープログラマーとしての能力に自信の危機に直面しています。
昨日、グラフ用に自分の最短経路アルゴリズムを考え出そうとしましたが、数時間後にタオルを投げてダイクストラのアルゴリズムを学びました。
これは、優れたプログラマーが数時間で「再発明」できるはずの種類ですか、それとも非現実的ですか?
まあ、少なくとも私はバブルソートを再発明することができました:D
回答:
優れたプログラマーは、問題を解決するための優れたアルゴリズムが既に作成されており、車輪の再発明に時間を浪費しないことを理解する必要があります。
ダイクストラが数時間で最短経路アルゴリズムを思いついたのではないかと思うので、だれかが「良いプログラマー」であるかどうかを判断するために使用するのに非常に高い基準のようです
これは、優れたプログラマーが数時間で「再発明」できるはずの種類ですか、それとも非現実的ですか?
まず、プログラミングと理論的なコンピューターサイエンスを混同している可能性があります。素晴らしいプログラマーは、コンピューターサイエンスの優れた基礎を必要としますが、優れている必要はありません。ダイクストラはコンピューターサイエンスが素晴らしかった。
第二に、グラフについて十分に理解している人なら、少し考えてから独自のグラフ走査を開発することを期待します。しかし、最短経路アルゴリズムではありません。特にダイクストラのアルゴリズムは非常に高度です。ひとたび理解すれば、目がくらむほど明らかです。しかし、ほとんどのものはそのようです。
いくつかのことを試し、アイデアをしばらく与えた後、おそらくある種の最短パスアルゴリズムを導き出すことができます。しかし、それが数時間または数日かかる場合でもがっかりしないでください。これは完全に正常で正常です。
(警告:まあ、数時間で問題をブルートフォースすることができるはずですが、これはかなり小さなグラフでも有効なアルゴリズムを生成しません。)
これは、優れたプログラマーが数時間で「再発明」できるはずの種類ですか、それとも非現実的ですか?
間違いなく非現実的。人々は、数時間でアルゴリズムを「やってくる」だけではありません。それには多くの努力と仕事が必要です。このブログを引用するには:
Programming Pearlsでは、BentleyがDonald Knuthを引用して、「最初のバイナリ検索は1946年に公開されましたが、nのすべての値に対して正しく機能する最初のバイナリ検索は1962年まで現れませんでした。」
また、Bentleyのバージョンは、大規模なセットに実装した場合にも問題がありました。
さらに、優れたプログラマーは、どのツールが自由に使えるのか、いつそれらのツールを使用するのかを知っています。オリジナリティや物事のやり方を変えることで余分なポイントを獲得することはありません。
選択可能なソリューションよりも優れたソリューションを見つけることができる可能性は非常に低いです。
「最高」(あなたの場合は最短)と見なされるアルゴリズムよりも優れたアルゴリズムを使用することは、誰もができることではありません。おそらくそれも不可能です。
優れたプログラマーは、アルゴリズムの背後にあるロジックと、同じ問題を解決しようとする他のアルゴリズムよりも優れているか劣っている(または単にその特定の問題に対して不十分である)理由を理解できるはずです。
(s)彼はまた、それが本当にその特定の問題を解決するための最善の方法であるかどうかを知ることができるはずです。
とにかく練習したい場合でも、自分の心を使って問題を解決しようとして、アルゴリズムの個人的な実装を書くことを試みることができます。それは最良ではないかもしれませんが、問題解決のための良い習慣です。
これは、「ソフトウェアエンジニアリング」(プログラミングと呼ぶ)と他のエンジニアリング分野との違いについて読んだことを思い出させます。考えてみると、元のデザインパターンの本だったと思います。私はここの誰かが彼の頭の上からそれを引用できると確信しています。
とにかく、ポイントは(厳密にはアルゴリズム設計向けではありませんが)エンジニアリング分野が体系化されていることです。土木技師がIビームの再発明に時間を費やすことはないでしょうが、プログラマは常にそれを行っています。問題(そして、私は単に多くの人々の感情を反映しているに過ぎないことを認識しています)は、この動作が無駄でエラーが発生しやすく、ソリューションよりもエゴに役立つことです。
コンピューターサイエンスは私をプログラミングに導いてくれました。しかし、私はコンピューター科学者よりもはるかに優れたプログラマーです。あなたが午後にダイクストラのアルゴリズムを再発明することができなかったので、私はあなたが無能であると非難しません。最短経路グラフアルゴリズムで解決できる問題を認識できない場合、プログラマとしてのあなたの能力に疑問を呈します。
とはいえ、アルゴリズムについて考え、新しいアルゴリズムを設計して実装しようとすることは、(潜在的に)楽しく、(ほとんど)常に有益だと思います。私は、CS時間とプログラミング時間を明確に分離しようとしています。プログラマーにとって、私たちの(特に支払われた)時間は、抽象的な問題よりも実際的な問題の解決に費やしたほうがよいでしょう。その上、CS時間はほとんど常に私の自信を押しつぶします。
他の人と同じことに気付かないでしょう。それは私たちが共に生きなければならない人生の事実に過ぎないと思います。その多くは、受動的学習と、それらの結果として開発したメンタルモデルに帰着します。
一貫してそれを行う前に学校でDeMorganの法則を教えられなければならなかった非常に知的で有能なプログラマーを知っています。私はたまたまダイクストラのアルゴリズムを自分で理解しました(そして、私はそれを少し誇りに思っていることを認めなければなりません)が、バブルのソートを理解するまでに長い時間がかかりました。
もっと有名なのは、結び目の理論の専門家だと思うアインシュタインは、彼が10歳くらいになるまで自分の靴ひもを結ぶことができなかった。
あなたが知らないうちに多くのことを知らずに再発明したのは良いことです。
私は、ほとんどの答えが言っていることについて異なることを請います。どんなレベルのプログラマーでもダイクストラのアルゴリズムについて独力で考え出すことは期待できませんが、間違いなく彼が問題を解決するためのあらゆる方法(効率的かどうか)を考え出すことを期待します。
たとえば、サイドコメントとして、自分でバブルソートを思いつくことができたと言いました。ソートアルゴリズムの中で最も賢い方法を知っていますが、問題を解決する方法を見つけたので、プログラマーができることを期待しています。問題を解決する方法を見つけてください。
もちろん、他の人が行った解決策を調査して見つけることもできますが、そのポイントの極端な点は、自分自身を考えず、プログラムがGoogle検索の大要である人です。
私は実際に望んでいるよりも厳しいと思っていますが、私のポイントは、プログラマが問題の解決策を考え出すのに十分な創造性を期待することです。
したがって、あなたのケースに戻って、ダイクストラのアルゴリズムを考え出す必要はないと思いますが、いくつかの可能性を試して無限ループで終了することなく最短経路を見つけるためのアルゴリズムを書くことができるなら、その後、あなたは私の承認を得ています。
(ところで、私の承認は、無料の洗車クーポンと同じ重要度でカウントされます。)
それはバブルソートの道徳的な等価物かもしれませんが、優秀なプログラマーは少なくともそれが機能するかもしれませんが、それは非効率かもしれません。
言うまでもなく、その特定の問題が発生した場合、優れたプログラマーは、自分のためにそれを行うライブラリがあるか、またはどの公開アルゴリズムがそれを実行し、簡単に実装できるかを最初に調べます。
もちろん、多くのプログラミングタスクはそれほど難しくなく、誰もがそのような難しい問題に取り組むことができる必要はありません。しかし、以前の科学的研究の負荷に頼ることができない複雑なプロジェクト特有の問題を抱えているかもしれないので、あなたはチームにそのような心を持った人を持ちたいと思うでしょう。
Perlプログラマーとして、私は決して車輪を再発明することはありません。それがCPANの仕事です。シンプルで十分にサポートされているアルゴリズムまたはモジュールがある場合は、それを使用します。良いモジュールが存在しない場合には、その後、我々は考案ホイールを。これは、Perlの最大の利点の1つです。
だから私が言っているのはこれです:
グラフ理論とそれに適用されるアルゴリズムは、表面上は単純に見えますが、一般的にはそこからはかけ離れています。たとえば、一見すると、非交差(平面)グラフの形成は簡単だと思います。昨年、私はこの問題(クラトフスキーの部分グラフの消去による平面性)を詳細に調査しました。その経験から、これらのアルゴリズムを作成する人々は通常、博士課程の研究期間を費やし、時にはチームで研究が行われることを伝えることができます。そして、研究者として、それはその期間中の彼らの唯一の作業焦点です。現場のエンジニアが同じことを期待できると考えるのは賢明ではありません。ここで他の誰かが正しく言ったように、解決策があなたの目の前にあるとき、それは盲目的に明白です。それは常に事実のようです!
これは、優れたプログラマーが数時間で「再発明」できるはずの種類ですか、それとも非現実的ですか?
Shortest Pathのようなよく知られている問題のアルゴリズムを独力で発明できるとすれば、あなたは悪いプログラマーだと言えます。
それはあなたが無視しているわけでしょう最短経路問題にはかなりの歴史を(| V |が^ 4)ダイクストラのである(1984年に発表されたO(E + VログV)アルゴリズムを1955年に発表されそのアルゴリズム、Oから行きますフィボナッチツリーを使用したアルゴリズム)。すでに考案されたアルゴリズムよりも悪い結果を出すことはほぼ保証されています。さらに悪いことに、アルゴリズムにギャップやエラーがあり、正しくない可能性があります。さらに、既存のアルゴリズムを再利用するのにかかる時間よりも、アルゴリズムの検討、実装、およびテストに多くの時間をほぼ確実に費やします。
アルゴリズムの設計はアルゴリズム設計者に任せてください。プログラマーは結果の消費者です。プログラマーはアルゴリズムを組み合わせて、実際のタスクで動作するようにします。警察官は、働くことができるように、または優れた警官になるために法律を改革する必要はありません。
適度に複雑なアルゴリズムに自分でアルゴリズムを実装するのではなく、専門家が作成した実装を使用することをお勧めします。それは正しい可能性が高く、おそらくあなたがこれまでよりも速くし、多くの時間を節約できる可能性があります。これは、暗号化アルゴリズムの場合に特に当てはまります。これは、通常は専門家だけが提供できるセキュリティの追加の需要が得られるためです。