有能なプログラマーは、彼自身の最短経路アルゴリズムを考え出すことができますか?


58

私は、コンピュータープログラマーとしての能力に自信の危機に直面しています。

昨日、グラフ用に自分の最短経路アルゴリズムを考え出そうとしましたが、数時間後にタオルを投げてダイクストラのアルゴリズムを学びました。

これは、優れたプログラマーが数時間で「再発明」できるはずの種類ですか、それとも非現実的ですか?

まあ、少なくとも私はバブルソートを再発明することができました:D


7
20年間UIを作成した人は、別のドメインの問題の解決策を短時間で見つけるのに苦労するでしょう。
コーダー

38
SEサイトに多くの時間を費やすことで、誰もが自信の危機にさらされると思います!(それは悪いことではありません)。人生の幸福とは、あるものを受け入れることとそれを変えたいという欲求との完璧なバランスを見つけることです。
TrojanName

2
私は自分でそれを再発明することはできませんでしたが、私はそれがどのように機能するかを思い出そうとします。このアニメーションを確実に理解してください:upload.wikimedia.org/wikipedia/commons/2/23/…–
ジョブ

6
地元の天才のブライアンの悲劇。あなたはこれ以上最高のものになることはほとんどありません。
宮坂

7
優秀なコンピューター科学者は、必ずしもコンピュータープログラマーまたはソフトウェアエンジニアである必要はありません
ニールマクギガン

回答:


118

優れたプログラマーは、問題を解決するための優れたアルゴリズムが既に作成されており、車輪の再発明に時間を浪費しないことを理解する必要があります。

ダイクストラが数時間で最短経路アルゴリズムを思いついたのではないかと思うので、だれかが「良いプログラマー」であるかどうかを判断するために使用するのに非常に高い基準のようです


25
@Nakilon-既存のソリューションを無視するプログラマーは時間を浪費しているだけであり、時間を無駄にしないなら、彼らはより悪いソリューションを作っています。参照:誰もが独自のパスワードハッシュスキームとbcryptを作成しています。
モニカを

10
@GSto:ウィキペディアによると、ダイクストラは1時間以内にアルゴリズムを作成しました:20分、ウィキペディアの最初のメモによると:en.wikipedia.org/wiki/Dijkstra%27s_algorithm
woliveirajr

9
これは比較的単純なアルゴリズムですが、ダイクストラは非常に才能があり、理論物理学と高度な数学の訓練を受けていました。アルゴリズムを設計する能力を向上させるための証拠を書くのに数年かかるようなものはありません。
ケビンクライン

19
@woliveirajr-まあ、ニュートンは運動の法則を考え出すのに同じ時間を費やしたと確信しています。最初に20年間考えた後。
ルーク

6
@Nakilon-はい、だから誰もがすべてをCで書くのです。ああ、アセンブリを意味します。それ以外の場合は、誰か他の人の低レベル言語を使用しているだけです。ああ、私はスイッチをひっくり返して電気回路を変更することを意味します。または、既にあるものを使用して、何か新しいものを作成することに取り組むことができます。ダイクストラのアルゴリズムを再発明するのに、それを使用するプログラムのような新しいものを発明できるのに、なぜ時間を無駄にするのですか?
モニカを

54

これは、優れたプログラマーが数時間で「再発明」できるはずの種類ですか、それとも非現実的ですか?

まず、プログラミングと理論的なコンピューターサイエンスを混同している可能性があります。素晴らしいプログラマーは、コンピューターサイエンスの優れた基礎を必要としますが、優れている必要はありません。ダイクストラはコンピューターサイエンスが素晴らしかった。

第二に、グラフについて十分に理解している人なら、少し考えてから独自のグラフ走査を開発することを期待します。しかし、最短経路アルゴリズムではありません。特にダイクストラのアルゴリズムは非常に高度です。ひとたび理解すれば、目がくらむほど明らかです。しかし、ほとんどのものはそのようです。

いくつかのことを試し、アイデアをしばらく与えた後、おそらくある種の最短パスアルゴリズムを導き出すことができます。しかし、それが数時間または数日かかる場合でもがっかりしないでください。これは完全に正常で正常です。

(警告:まあ、数時間で問題をブルートフォースすることができるはずですが、これはかなり小さなグラフでも有効なアルゴリズムを生成しません。)


56
心配しないでください。ブルートフォースが機能していなくても、十分に使用しているわけではありません。
ロビー

2
理論上のCSとプログラミングの違いを明らかにするために+1。プログラミングは現実世界の問題解決であり、理論的なCSはプログラミングをサポートするためにあります。しかし、ほとんどの人の日常的なプログラミングでは、理論上のCSは100%不可欠ではありません。
フィル

17

これは、優れたプログラマーが数時間で「再発明」できるはずの種類ですか、それとも非現実的ですか?

間違いなく非現実的。人々は、数時間でアルゴリズムを「やってくる」だけではありません。それには多くの努力と仕事が必要です。このブログを引用するには:

Programming Pearlsでは、BentleyがDonald Knuthを引用して、「最初のバイナリ検索は1946年に公開されましたが、nのすべての値に対して正しく機能する最初のバイナリ検索は1962年まで現れませんでした。」

また、Bentleyのバージョンは、大規模なセットに実装した場合にも問題がありました。

さらに、優れたプログラマーは、どのツールが自由に使えるのか、いつそれらのツールを使用するのかを知っています。オリジナリティや物事のやり方を変えることで余分なポイントを獲得することはありません。


1
ブラックジャック、私はこのフォーラムに参加して、ベントレーがあなたが言ったことを言っていないことを指摘しなければなりませんでした。クヌースが言ったので、ベントレーは彼を引用しました。あなたのコメントを読んだとき、私はあなたが良い点を述べたと思ったが、私は私の出典を検証するのが好きで、ベントレーのことを聞いたことがなかった。しかし、私はクヌースについて聞いたことがあり、彼の言うことを信頼することができます。次回ソースをよりよく確認してください。
リチャード

8
@Richard-コメントは「プログラミングパールで、Bentleyが言っています。」と最初に言ったのはKnuthでしたが、私の情報源はTAoCPではなく、Programming Pearlsです。私はベントレーが創始者であると主張しませんでした-私は単に本で言われたことを引用しました。本の中の多くの資料は著者自身によって発明されたものではないので、なぜあなたはそれをそのように見るのか分かりません。
ブラックジャック

引用をBentleyのみに帰属させることにより、Knuthクレジットを支払うことに失敗し、「Bentleyの」声明が間違っていた場合、Bentleyは単に情報を広めるのではなく、誤った情報を生み出したという立場になります。厳密に言えば、あなたはベントレーが言ったことを言わなかった:あなたが持っていたなら、あなたは言ったでしょう、「ベントレーはクヌースが言ったことを言った...」。引用はここではよく使われていますが、それが言われた文脈から外れています。
リチャード

3
@Richard-私がリストした引用はブログから直接引用したもので、本から直接引用しています(文字通り、私はそれが初版の57ページだと思います)。ステートメントにこれほど多くの問題がある場合は、ブログの作成者に連絡して、変更してもらってください。
ブラックジャック

1
@RichardとBlackJack:あなたはどちらも正しいですが、元の著者への帰属は、声明に信用と文脈を追加します。私の編集で十分なはずです。
スティーブンエバーズ

9

選択可能なソリューションよりも優れたソリューションを見つけることができる可能性は非常に低いです。

「最高」(あなたの場合は最短)と見なされるアルゴリズムよりも優れたアルゴリズムを使用することは、誰もができることではありません。おそらくそれも不可能です。

優れたプログラマーは、アルゴリズムの背後にあるロジックと、同じ問題を解決しようとする他のアルゴリズムよりも優れているか劣っている(または単にその特定の問題に対して不十分である)理由を理解できるはずです。

(s)彼はまた、それが本当にその特定の問題を解決するための最善の方法であるかどうかを知ることができるはずです。

とにかく練習したい場合でも、自分の心を使って問題を解決しようとして、アルゴリズムの個人的な実装を書くことを試みることができます。それは最良ではないかもしれませんが、問題解決のための良い習慣です。


6

これは、「ソフトウェアエンジニアリング」(プログラミングと呼ぶ)と他のエンジニアリング分野との違いについて読んだことを思い出させます。考えてみると、元のデザインパターンの本だったと思います。私はここの誰かが彼の頭の上からそれを引用できると確信しています。

とにかく、ポイントは(厳密にはアルゴリズム設計向けではありませんが)エンジニアリング分野が体系化されていることです。土木技師がIビームの再発明に時間を費やすことはないでしょうが、プログラマは常にそれを行っています。問題(そして、私は単に多くの人々の感情を反映しているに過ぎないことを認識しています)は、この動作が無駄でエラーが発生しやすく、ソリューションよりもエゴに役立つことです。

コンピューターサイエンスは私をプログラミングに導いてくれました。しかし、私はコンピューター科学者よりもはるかに優れたプログラマーです。あなたが午後にダイクストラのアルゴリズムを再発明することができなかったので、私はあなたが無能であると非難しません。最短経路グラフアルゴリズムで解決できる問題を認識できない場合、プログラマとしてのあなたの能力に疑問を呈します。

とはいえ、アルゴリズムについて考え、新しいアルゴリズムを設計して実装しようとすることは、(潜在的に)楽しく、(ほとんど)常に有益だと思います。私は、CS時間とプログラミング時間を明確に分離しようとしています。プログラマーにとって、私たちの(特に支払われた)時間は、抽象的な問題よりも実際的な問題の解決に費やしたほうがよいでしょう。その上、CS時間はほとんど常に私の自信を押しつぶします。


皮肉なことに...どこでもコメントできるようになったので、その特権を得た答えを削除する必要がありますか?そのためのバッジが必要です。
キースレイン

規律がありますが、評判が再計算されると、1に戻ります。
ChrisF

はい、それはまさに私のポイントです...私はそのポイントIMOで規律を超えて行くでしょう。削除する前に回答をコメントに変換した場合、それをすべて持つことができます...削除すると、新しいユーザーステータスに戻る原因となるUberDisciplinedという新しいバッジを提案します。:)
キースレイン

3

他の人と同じことに気付かないでしょう。それは私たちが共に生きなければならない人生の事実に過ぎないと思います。その多くは、受動的学習と、それらの結果として開発したメンタルモデルに帰着します。

一貫してそれを行う前に学校でDeMorganの法則を教えられなければならなかった非常に知的で有能なプログラマーを知っています。私はたまたまダイクストラのアルゴリズムを自分で理解しました(そして、私はそれを少し誇りに思っていることを認めなければなりません)が、バブルのソートを理解するまでに長い時間がかかりました。

もっと有名なのは、結び目の理論の専門家だと思うアインシュタインは、彼が10歳くらいになるまで自分の靴ひもを結ぶことができなかった。

あなたが知らないうちに多くのことを知らずに再発明したのは良いことです。


3

私は、ほとんどの答えが言っていることについて異なることを請います。どんなレベルのプログラマーでもダイクストラのアルゴリズムについて独力で考え出すことは期待できませんが、間違いなく彼が問題を解決するためのあらゆる方法(効率的かどうか)を考え出すことを期待します。

たとえば、サイドコメントとして、自分でバブルソートを思いつくことができたと言いました。ソートアルゴリズムの中で最も賢い方法を知っていますが、問題を解決する方法を見つけたので、プログラマーができることを期待しています。問題を解決する方法を見つけてください。

もちろん、他の人が行った解決策を調査して見つけることもできますが、そのポイントの極端な点は、自分自身を考えず、プログラムがGoogle検索の大要である人です。

私は実際に望んでいるよりも厳しいと思っていますが、私のポイントは、プログラマが問題の解決策を考え出すのに十分な創造性を期待することです。


したがって、あなたのケースに戻って、ダイクストラのアルゴリズムを考え出す必要はないと思いますが、いくつかの可能性を試して無限ループで終了することなく最短経路を見つけるためのアルゴリズムを書くことができるなら、その後、あなたは私の承認を得ています。

(ところで、私の承認は、無料の洗車クーポンと同じ重要度でカウントされます。)


3
はい、有能なプログラマーはバブルソートまたはそれに相当するものを考え出すことができるはずです。おそらく問題をよりよく理解するために、実際に実装して試してみるのは時間の生産的な使用かもしれません。しかし、有能なプログラマーが実稼働コードで実際にそれを使用することはないと言う必要があると思います。そうすることで、来年顧客が戻ってきて、処理するデータが増えたため、O(n!)アルゴリズムが完了するには宇宙の時代の2倍の時間がかかると不平を言うのです...
Thomas Padron-McCarthy

あなたがアルゴリズムを発明することができるかどうか、誰がそれを吸うかを認識できない場合は誰が気にしますか?プログラマーにとって、自己批判は創造性と同じくらい重要です。私はむしろ、自分の解決策に時間がかかりすぎている、または最善ではない可能性があると知っているときにすぐに認めるプログラマーと協力します。
宮坂

私は両方の点に同意しますが、私たちは2つの異なることを測定していると思います。1つは、プログラマーが問題を解決する能力です(私が不可欠だと思うもの)。その他は、自己批判(私はこれを不可欠であると考えていますが、プログラミングのためではありません:生涯)およびコードを判断する能力(非常に望ましい)です。私はまた、永遠にかかる解決策は本当に解決策ではないと言うでしょう。;)
アルファ

2

はい、彼/彼女はすべきです。

それはバブルソートの道徳的な等価物かもしれませんが、優秀なプログラマーは少なくともそれが機能するかもしれませんが、それは非効率かもしれません。

言うまでもなく、その特定の問題が発生した場合、優れたプログラマーは、自分のためにそれを行うライブラリがあるか、またはどの公開アルゴリズムがそれを実行し、簡単に実装できるかを最初に調べます。

もちろん、多くのプログラミングタスクはそれほど難しくなく、誰もがそのような難しい問題に取り組むことができる必要はありません。しかし、以前の科学的研究の負荷に頼ることができない複雑なプロジェクト特有の問題を抱えているかもしれないので、あなたはチームにそのような心を持った人を持ちたいと思うでしょう。


1

心配しないでください

Perlプログラマーとして、私は決して車輪を再発明することはありません。それがCPANの仕事です。シンプルで十分にサポートされているアルゴリズムまたはモジュールがある場合は、それを使用します。良いモジュールが存在しない場合には、その後、我々は考案ホイールを。これは、Perlの最大の利点の1つです。

だから私が言っているのはこれです:

  1. 車輪の再発明はお勧めしませんが、そうするときは...
  2. 完全に再発明しないようにしてください...
  3. できない場合でも心配しないでください。だからこそプログラミングコミュニティがあります:-)。

それは、一般的な問題を解決することを再発明することではありません。自分で物事を発明しようとしない場合、あなたは決して改善しません。
ニルス

0

グラフ理論とそれに適用されるアルゴリズムは、表面上は単純に見えますが、一般的にはそこからはかけ離れています。たとえば、一見すると、非交差(平面)グラフの形成は簡単だと思います。昨年、私はこの問題(クラトフスキーの部分グラフの消去による平面性)を詳細に調査しました。その経験から、これらのアルゴリズムを作成する人々は通常、博士課程の研究期間を費やし、時にはチームで研究が行われることを伝えることができます。そして、研究者として、それはその期間中の彼らの唯一の作業焦点です。現場のエンジニアが同じことを期待できると考えるのは賢明ではありません。ここで他の誰かが正しく言ったように、解決策があなたの目の前にあるとき、それは盲目的に明白です。それは常に事実のようです!


0

これは、優れたプログラマーが数時間で「再発明」できるはずの種類ですか、それとも非現実的ですか?

Shortest Pathのようなよく知られている問題のアルゴリズムを独力で発明できるとすれば、あなたは悪いプログラマーだと言えます。

それはあなたが無視しているわけでしょう最短経路問題にはかなりの歴史を(| V |が^ 4)ダイクストラのである(1984年に発表されたO(E + VログV)アルゴリズムを1955年に発表されそのアルゴリズム、Oから行きますフィボナッチツリーを使用したアルゴリズム)。すでに考案されたアルゴリズムよりも悪い結果を出すことはほぼ保証されています。さらに悪いことに、アルゴリズムにギャップやエラーがあり、正しくない可能性があります。さらに、既存のアルゴリズムを再利用するのにかかる時間よりも、アルゴリズムの検討、実装、およびテストに多くの時間をほぼ確実に費やします。

アルゴリズムの設計はアルゴリズム設計者に任せてください。プログラマーは結果の消費者です。プログラマーはアルゴリズムを組み合わせて、実際のタスクで動作するようにします。警察官は、働くことができるように、または優れた警官になるために法律を改革する必要はありません。

適度に複雑なアルゴリズムに自分でアルゴリズムを実装するのではなく、専門家が作成した実装を使用することをお勧めします。それは正しい可能性が高く、おそらくあなたがこれまでよりも速くし、多くの時間を節約できる可能性があります。これは、暗号化アルゴリズムの場合に特に当てはまります。これは、通常は専門家だけが提供できるセキュリティの追加の需要が得られるためです。


暗号化アルゴリズムは、実装の検証が簡単です。既知の正しいテストベクトルは、公的に指定されたアルゴリズムでは数十ドルであり、正しいかどうかはわかりません。(カスタム実装では最適以下のパフォーマンスが得られる可能性がありますが、それが正しい場合にのみ対処できます。)暗号化の難しい部分は、乱数生成、生のキーの適切な処理、メモリ内のキー拡張テーブル、適切なものですユーザー入力の処理(塩漬けなど)、復号化されたデータが有効かどうかを判断できるように何かを保存するなど。
CVn

私は、タイミング攻撃など、プログラマーがほとんど知らないことについて考えていました。それは常に問題ではありませんが、それでも重要な問題です。また、暗号プリミティブを組み合わせることは通常、期待するようには機能しません。これはセキュリティの難しい部分でもあります。
アレックス10ブリンク

タイミング攻撃などは確かに有効な懸念事項です(暗号化だけでなく)が、そのような実装の影響を受けやすさはその正確性に影響を与えないと主張します。そして、タイミング攻撃を有効にするだけでなく、暗号化の方法でファウルする方法はたくさんあります。ブルース・シュナイアーはかつて彼のドッグハウスシリーズを運営していました。最近は何も見ていませんが、注意すべき例がたくさんあります。google.com/search?q=site%3Aschneier.com+%22the+doghouse%22
CVn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.