Ich leide unter einer Vertrauenskrise in meine Fähigkeiten als Computerprogrammierer.
Gestern habe ich versucht, einen eigenen Algorithmus für den kürzesten Weg für ein Diagramm zu finden, und nach einigen Stunden habe ich einfach das Handtuch geworfen und Dijkstra's Algorithmus gelernt.
Ist das die Art von Dingen, die ein guter Programmierer in ein paar Stunden "neu erfinden" kann oder bin ich unrealistisch?
Na ja, zumindest konnte ich die Blasensorte neu erfinden: D
algorithms
Newbie Programmer
quelle
quelle
Antworten:
Ein guter Programmierer sollte erkennen, dass bereits ein großartiger Algorithmus zur Lösung eines Problems geschrieben wurde, und keine Zeit damit verschwenden, Räder neu zu erfinden.
Ich bezweifle, dass Dijkstra in ein paar Stunden den kürzesten Pfad-Algorithmus gefunden hat. Das scheint also ein wirklich hoher Standard zu sein, um festzustellen, ob jemand ein „guter Programmierer“ ist.
quelle
Zunächst verwechseln Sie vielleicht die Programmierung mit der theoretischen Informatik. Ein fantastischer Programmierer braucht ein gutes Fundament in der Informatik, aber er muss nicht fantastisch sein. Dijkstra war fantastisch in der Informatik.
Zweitens würde ich erwarten, dass jeder mit einem soliden Verständnis von Graphen nach einigem Überlegen seinen eigenen Graphendurchlauf entwickelt. Aber kein kürzester Weg Algorithmus. Insbesondere der Algorithmus von Dijkstra ist hochentwickelt. Sobald Sie es verstanden haben, ist es verblüffend offensichtlich. Aber die meisten Dinge sind so.
Sie könnten wahrscheinlich eine Art Algorithmus für den kürzesten Weg ableiten, nachdem Sie einige Dinge ausprobiert und die Idee einige Zeit gegeben haben. Aber seien Sie nicht enttäuscht, wenn das Stunden oder sogar ein paar Tage dauert. Das ist völlig in Ordnung und normal.
(Vorsichtsmaßnahme: Nun, Sie sollten in der Lage sein, das Problem in ein paar Stunden zu lösen, aber dies würde selbst bei relativ kleinen Diagrammen keinen funktionierenden Algorithmus ergeben.)
quelle
Auf jeden Fall unrealistisch. Die Leute "kommen" nicht einfach in wenigen Stunden auf Algorithmen. Es erfordert viel Mühe und Arbeit. So zitieren Sie diesen Blog:
und Bentleys Version war auch problematisch, wenn sie für große Mengen implementiert wurde.
Darüber hinaus weiß ein guter Programmierer, welche Werkzeuge ihm zur Verfügung stehen und wann sie verwendet werden müssen. Sie erhalten keine zusätzlichen Punkte für Originalität oder für eine andere Vorgehensweise - Sie möchten, dass es funktioniert und gut funktioniert.
quelle
Es ist sehr unwahrscheinlich, dass Sie eine bessere Lösung finden als die, aus denen Sie wählen können.
Es ist nicht jedermanns Sache, mit einem besseren Algorithmus als dem "besten" (in Ihrem Fall dem kürzesten) herauszukommen. Möglicherweise ist das gar nicht möglich.
Ein guter Programmierer sollte in der Lage sein, die Logik hinter dem Algorithmus zu verstehen und zu verstehen, warum er besser oder schlechter (oder für dieses bestimmte Problem einfach unangemessen) ist als andere Algorithmen, die versuchen, dasselbe Problem zu lösen.
(s) Er sollte auch wissen können, ob dies wirklich der beste Weg ist, um dieses bestimmte Problem zu lösen.
Wie auch immer, wenn Sie üben möchten, können Sie trotzdem versuchen, Ihre persönliche Implementierung eines Algorithmus zu schreiben und ein Problem mit Ihrem Verstand zu lösen. Es ist vielleicht nicht das Beste, aber es ist eine gute Methode zur Problemlösung.
quelle
Das erinnert mich an etwas, was ich über den Unterschied zwischen "Software Engineering" (was ich als Programmierung bezeichnen würde) und den anderen technischen Disziplinen gelesen habe. Ich denke, es war das ursprüngliche Design Patterns-Buch. Ich bin sicher, dass jemand hier es aus seinem Kopf zitieren kann.
Wie auch immer, der Punkt (obwohl nicht genau auf Algorithmus-Design ausgerichtet) war, dass die technischen Disziplinen kodifiziert sind; Es ist unwahrscheinlich, dass Bauingenieure Zeit damit verbringen, den I-Beam neu zu erfinden, aber Programmierer tun dies die ganze Zeit. Das Problem (und mir ist klar, dass ich nur die Gefühle vieler wiedergebe) ist, dass dieses Verhalten verschwenderisch und fehleranfällig ist und dem Ego mehr dient als der Lösung.
Die Informatik hat mich zum Programmieren geführt, und ich liebe beides. Ich bin jedoch ein viel besserer Programmierer als ein Informatiker. Ich würde Sie niemals beschuldigen, inkompetent zu sein, weil Sie den Dijkstra-Algorithmus an einem Nachmittag nicht neu erfinden konnten. Ich würde Ihre Kompetenz als Programmierer in Frage stellen, wenn Sie ein Problem nicht erkennen könnten, das mit einem Graph-Algorithmus mit kürzestem Pfad gelöst werden könnte.
Trotzdem glaube ich, dass das Nachdenken über Algorithmen und der Versuch, neue zu entwerfen und zu implementieren, (potentiell) Spaß macht und (fast) immer lehrreich ist. Ich versuche nur, meine CS-Zeit sauber von meiner Programmierzeit zu trennen. Für Programmierer ist es besser, unsere (besonders bezahlte) Zeit damit zu verbringen, praktische Probleme zu lösen, als sie zu lösen. Außerdem zerstört die CS-Zeit fast immer mein Selbstvertrauen.
quelle
Sie werden nicht die gleichen Dinge bemerken, die alle anderen tun. Ich denke, das ist nur eine Tatsache des Lebens, mit der wir leben müssen. Ein Großteil davon hängt von Ihrem passiven Lernen und den mentalen Modellen ab, die Sie als Ergebnis davon entwickelt haben.
Ich kenne einige sehr intelligente und kompetente Programmierer, denen DeMorgans Gesetz in der Schule beigebracht werden musste, bevor sie es konsequent tun konnten. Ich habe den Dijkstra-Algorithmus zufällig selbst herausgefunden (und ich muss zugeben, dass ich ein bisschen stolz darauf bin), aber es hat sehr lange gedauert, bis ich die Art der Blasen überhaupt verstanden habe.
Noch berühmter ist, dass Einstein, von dem man annehmen würde, dass er ein Experte für Knotentheorie ist, seine eigenen Schnürsenkel erst mit etwa zehn Jahren binden konnte.
Die Chancen stehen gut, dass Sie viele Dinge unwissentlich neu erfunden haben , die viele andere niemals herausgefunden hätten, wenn sie nicht explizit unterrichtet worden wären.
quelle
Ich bitte darum, mich zu unterscheiden, was die meisten Antworten aussagen. Obwohl ich nicht erwarten würde, dass ein Programmierer irgendeines Niveaus in der Lage ist, sich selbst mit Dijkstras Algorithmus auseinanderzusetzen, würde ich auf jeden Fall erwarten, dass er einen (effizienten oder nicht effizienten) Weg findet, um das Problem zu lösen.
Als Nebenkommentar haben Sie beispielsweise gesagt, dass Sie die Blasensortierung selbst durchführen können. Ich weiß, es ist der stinkigste Sortieralgorithmus, aber Sie haben einen Weg gefunden, ein Problem zu lösen, und ich erwarte, dass Programmierer in der Lage sind, einen Weg zu finden, um Probleme zu lösen.
Das Nachforschen und Finden von Lösungen, die von anderen gemacht wurden, funktioniert natürlich auch, aber das Extrem ist ein Typ, der nicht an sich selbst denkt und dessen Programme ein Kompendium der Google-Suche sind.
Ich denke, ich höre mich härter an, als ich eigentlich möchte, aber mein Punkt ist: Ich würde erwarten, dass ein Programmierer kreativ genug ist, um eine Lösung für ein Problem zu finden, selbst wenn die Lösung fehlerhaft oder chaotisch ist.
Um auf Ihren Fall zurückzukommen: Ich denke nicht, dass Sie den Dijkstra-Algorithmus entwickeln müssen, aber wenn Sie die Möglichkeit haben, einen Algorithmus zu schreiben, um mehrere Möglichkeiten auszuprobieren und den kürzesten Weg zu finden, ohne in einer Endlosschleife zu enden, dann hast du meine Zustimmung.
(Übrigens gilt meine Zustimmung in der gleichen Reihenfolge wie ein Gutschein für eine kostenlose Autowäsche.)
quelle
Ja, er / sie sollte.
Es mag das moralische Äquivalent von Bubble Art sein, aber ich denke, ein guter Programmierer sollte in der Lage sein, zumindest etwas zu finden, das funktioniert, wie ineffizient es auch sein mag.
Es erübrigt sich zu erwähnen, dass ein guter Programmierer zunächst prüfen würde, ob es eine Bibliothek gibt, die dies für ihn erledigt, oder welche veröffentlichten Algorithmen dies tun und einfach zu implementieren sind.
Natürlich sind viele Programmieraufgaben viel einfacher und nicht jeder muss in der Lage sein, solche schwierigen Probleme anzugehen. Aber Sie möchten jemanden mit einem solchen Verstand in Ihrem Team haben, da Sie möglicherweise einige komplizierte projektspezifische Probleme haben, bei denen Sie sich nicht auf eine Menge früherer wissenschaftlicher Forschungen verlassen können.
quelle
Keine Sorge
Als Perl-Programmierer geht es mir darum, das Rad nie wieder neu zu erfinden. Das ist die Aufgabe von CPAN. Wenn es einen einfachen, gut unterstützten Algorithmus oder ein Modul gibt, verwenden wir es. Wenn es kein gutes Modul ist, dann wir erfinden das Rad. Das ist eines der größten Dinge bei Perl.
Also, was ich sage, ist das:
quelle
Die Graphentheorie und die Algorithmen, die darauf angewendet werden, sehen auf der Oberfläche einfach aus, sind aber im Allgemeinen weit davon entfernt. Man könnte denken, dass die Bildung von nicht überkreuzenden (planaren) Graphen zum Beispiel auf den ersten Blick einfach ist. Letztes Jahr habe ich mich eingehend mit diesem Problem befasst (Planarität durch Eliminierung von Kuratowski-Teilgraphen). Aus dieser Erfahrung kann ich Ihnen sagen, dass die Leute, die diese Algorithmen schreiben, in der Regel die Zeit ihrer Promotion damit verbringen und manchmal in Teams recherchieren. Und als Forscher ist dies in dieser Zeit ihr einziger Arbeitsschwerpunkt. Es ist nicht sinnvoll zu glauben, dass wir Ingenieure vor Ort dasselbe erwarten können. Wie jemand anderes hier zu Recht sagte, ist es verblüffend offensichtlich, wenn die Lösung vor Ihnen liegt. Das scheint immer so zu sein!
quelle
Ich würde sogar sagen, dass Sie ein schlechter Programmierer sind , wenn Sie in der Lage sind, einen Algorithmus für ein bekanntes Problem wie Shortest Path allein zu erfinden .
Es würde bedeuten, dass Sie eine ganze Geschichte des Problems des kürzesten Pfades ignorieren , indem Sie von einem 1955 veröffentlichten O (| V | ^ 4) -Algorithmus zu dem 1984 veröffentlichten O (E + V log V) -Algorithmus übergehen (das ist Dijkstra's) Algorithmus mit Fibonacci-Bäumen). Es ist fast garantiert, dass Sie schlechter abschneiden als die bereits entwickelten Algorithmen. Schlimmer noch, es besteht eine gute Chance, dass Ihr Algorithmus Lücken oder Fehler aufweist, die ihn falsch machen. Außerdem verbringen Sie mit ziemlicher Sicherheit viel mehr Zeit damit, Ihren Algorithmus zu überdenken, zu implementieren und zu testen, als die Zeit, die erforderlich ist, um einen vorhandenen Algorithmus wiederzuverwenden.
Überlassen Sie den Entwurf von Algorithmen den Algorithmenentwicklern. Programmierer sind Konsumenten ihrer Ergebnisse. Programmierer kombinieren Algorithmen und setzen sie für reale Aufgaben ein. Ein Polizist muss nicht in der Lage sein, das Gesetz neu zu erfinden, um arbeiten zu können oder ein guter Polizist zu sein.
Ich empfehle Ihnen sogar, Implementierungen von Experten zu verwenden, anstatt die Algorithmen selbst für jeden mäßig komplizierten Algorithmus zu implementieren. Es ist wahrscheinlicher, dass es richtig ist. Wahrscheinlich haben sie es schneller als je zuvor geschafft und Sie sparen viel Zeit. Dies gilt insbesondere für kryptografische Algorithmen, da Sie den zusätzlichen Sicherheitsbedarf haben, den normalerweise nur Experten bieten können.
quelle