it-swarm.dev

Muss ich Algorithmen und Datenstrukturen verstehen, um als Programmierer bezeichnet zu werden?

Es ist sechs Jahre her, seit ich programmiert habe. Codierung in alle möglichen Dinge wie ActionScript, JavaScript, Java, PHP, Ajax, XML, HTML, ASP usw. Ich habe Arrays, Karten, verknüpfte Listen, Sets usw. verwendet und überall dort, wo ich gearbeitet habe, Leute wie ich. Aber wenn ich interviewt werde, ist es sehr wahrscheinlich, dass mir Leute Fragen zu Hashes, Bäumen, Stapeln und Warteschlangen stellen. Einige Fragen beziehen sich auf das Jonglieren einiger Sortieralgorithmen. Ich weiß nicht, ob ich sie wirklich kennen sollte oder ob ich aufhören soll, mich Programmierer zu nennen. Es gibt etwas in mir, das mir auch sagt, selbst wenn Leute, die all diese Fragen stellen, mich auswählen, werden sie mich niemals dazu bringen, an diesen Dingen zu arbeiten. Muss ich das alles wirklich wissen?

38
sushil bharwani

Wenn Sie nur wissen, wie man Klebercode schreibt, können Sie sich selbst als Code-Affe bezeichnen. Es muss viel Klebercode geschrieben werden, und Sie können als Code-Affe einen anständigen Lebensunterhalt verdienen. Um sich selbst als echten Programmierer zu bezeichnen TM Wenn Sie Code von Grund auf neu schreiben müssen, müssen Sie Algorithmen, Datenstrukturen, Speicherverwaltung, Zeiger, Assemblersprache usw. kennen und wissen, wie Sie dieses Wissen zur Bewertung von Kompromissen verwenden können.

80
dsimcha

diejenigen, die die Geschichte nicht kennen, sind dazu verdammt, sie neu zu erfinden

33
Steven A. Lowe

Wenn Sie in einer Sprache wie JavaScript arbeiten, ist dies ziemlich veraltet, da ein Array eine Mischung aus einem Vektor, einem Hash und einem Baum ist und als Stapel oder Warteschlange verwendet werden kann. Es ist sehr unwahrscheinlich, dass Sie jemals eine Datenstruktur in JavaScript implementieren müssen oder können, die die Array-Klasse übertrifft. Dies ist auch in PHP der Fall.

Für Java OTOH gibt es einen Unterschied. Ich nehme an, die Standardbibliothek von Java bietet Ihnen Informationen zu jeder Datenstruktur, die Sie benötigen.

  1. Sie müssen diese Datenstrukturen kennen und unterscheiden und verstehen, wie sie in verschiedenen Situationen funktionieren, damit Sie die richtige auswählen können.
  2. In Java ist es nicht absolut unwahrscheinlich, dass Sie irgendwann eine eigene Implementierung für eine Hashmap schreiben möchten, um in einem bestimmten Fall eine bessere Geschwindigkeit zu erzielen (z. B. wenn die Schlüssel, die Sie verarbeiten möchten, einige spezielle Einschränkungen erfüllen, die eine Optimierung ermöglichen).

Wenn es um Sortieralgorithmen geht, müssen Sie sie nicht unbedingt kennen oder verstehen, da Sie sie niemals selbst implementieren müssen. Wenn Ihnen jedoch ein solcher Algorithmus zur Verfügung gestellt wird, sollten Sie ihn verstehen und implementieren können.

Zwei Dinge sind sicher:

  1. Sie können eine Karriere als Programmierer machen, ohne sich auf solche Kenntnisse zu verlassen.
  2. Es wird definitiv nicht schaden, sie zu kennen.

Datenstrukturen und Algorithmen sind einfach eine Sache, die gut zu verstehen ist. Und es ist äußerst klar und formalisiert und daher im Vergleich zu den Feinheiten der Anwendungs- oder Systemtechnik recht trivial. Sie sind nur ein kleines Puzzleteil, aber leicht zu verstehen - wenn Sie bereit sind, etwas Zeit zu investieren.

Also nein, du brauchst sie nicht, aber es wäre nur zu deinem Vorteil , sie zu kennen.

30
back2dos

Dies könnte eine Gelegenheit sein, bei der es eine semantisch bedeutsame Unterscheidung zwischen "Programmierer" und "Softwareentwickler" geben kann. Insbesondere in diesem Zusammenhang sehen wir, dass Sie über Kenntnisse in mehreren Programmiersprachen und verwandten Technologien verfügen und diese verwenden können, um die gewünschten Ergebnisse zu erzielen. Dies ist eine gute betriebliche Definition von "Computerprogrammierer".

Ich betrachte mich als Softwareentwickler. In den meisten alltäglichen Aspekten meiner Arbeit mache ich wahrscheinlich die gleichen Dinge wie Sie. Ich verwende Computersprache und verwandte Technologien, um das gewünschte Ergebnis zu erzielen. Ich verstehe jedoch Datenstrukturen und Algorithmen und betrachte dieses Wissen als eine grundlegende Grundlage für meine Fähigkeit, viel mehr zu tun.

Oft - wenn auch nicht jeden Tag - besteht meine Aufgabe darin, eine Lösung für komplexe Probleme zu finden, für die es keine offensichtlichen Lösungen gibt, nichts, was direkt durch die Merkmale des von mir verwendeten Frameworks oder die Fähigkeiten der Sprache, in der ich arbeite, angesprochen wird mit. Dabei muss ich das Problem analysieren und eine Lösung finden, und gelegentlich geht dieser Prozess in den Bereich der Großarchitektur.

Während ein exzellentes Verständnis dieser tieferen Themen notwendig ist, um diese Art von Arbeit zu erledigen, ist es nicht ausreichend. Mit anderen Worten, nur zu wissen, wie eine Hash-Tabelle funktioniert oder warum eine Heap-Sortierung normalerweise gute Leistungseigenschaften aufweist, reicht nicht aus, um ein Systemarchitekt oder ein leitender Ingenieur zu sein. Es ist der logische Ausgangspunkt, und von dort aus können Sie tiefer graben und weiter reisen und die Erfahrung sammeln, die auch zur Lösung der größeren Probleme erforderlich ist.

Ich nehme an, um Ihre Frage zu beantworten, sollten Sie sich fragen: "Was möchte ich sein? Wohin gehe ich mit meiner Karriere?" Wenn Sie zufrieden sind, weiterhin das zu tun, was Sie tun, möchten Sie möglicherweise nur genügend Datenstrukturen und Algorithmen lernen, um die weitgehend willkürlichen Interviewfragen zu beantworten, mit denen Sie konfrontiert sind.

Wenn Sie in Ihrer Karriere wachsen möchten und die Leidenschaft dafür haben, die wichtig ist, sollten Sie diese Themen so eng wie möglich annehmen. Wenn Sie etwas Zeit haben, um daran zu arbeiten, einen offenen Geist und echte Begeisterung, werden Sie einige wunderbare und aufregende Dinge finden. Ich werde nie den Tag vergessen, an dem ich Quicksort zum ersten Mal verstanden habe. Das Gefühl der Aufregung und Entdeckung hat die Weichen für einen Großteil meines restlichen Lebens gestellt, und dafür könnte ich nicht dankbarer sein. Jetzt kann ich mir nicht vorstellen, etwas anderes zu tun als als Software-Ingenieur zu arbeiten.

Viel Glück mit was auch immer Sie wählen.

13
Adam Crossland

Es kommt darauf an, wofür die Jobs sind. Diese Art von Dingen sind ziemlich normale Interviewfragen, aber sie sind auch ziemlich einfallslos und beziehen sich wahrscheinlich überhaupt nicht auf den Job - sicherlich nicht auf einen Job, der die von Ihnen aufgelisteten Technologien verwendet.

Für mich sind Interviewfragen eine gute Beurteilung, ob Sie einen Abschluss in Informatik gemacht haben (und sich daran erinnern können), und nicht ein Maß für die allgemeinen Programmierfähigkeiten oder -kenntnisse.

Ich würde vorschlagen, dass Sie entweder dieses Zeug lernen, damit Sie durch das Interview kommen, oder einfach akzeptieren, dass es nichts für Sie ist, diese Dinge zu fragen, aber nein, Sie müssen sie nicht kennen, um sich selbst als Programmierer zu bezeichnen.

12
Jon Hopkins

Gute Frage. Javascript oder Java oder VC++ sind super intelligente Programmiersprachen, in denen Sie niemals eine verknüpfte Liste oder Hash-Tabelle von Grund auf neu erstellen müssen. Sie müssen jedoch weiterhin entscheiden können, wann Sie eine verwenden möchten Zum anderen fallen jeweils Leistungsstrafen und Boni an usw.

Ich habe viele API-Programmierer aka Code Monkeys interviewt, und in den meisten Interviews haben sie es routinemäßig versäumt, Systeme zu entwerfen, die leistungsfähig und skalierbar sind. Fazit: Wenn Sie eine Menge API kennen, erhalten Sie das Brot, aber für Butter müssen Sie mit den Grundlagen des Rechnens beginnen.

6
Fanatic23

Ich werde hinzufügen "Ja, natürlich können Sie sich immer noch als Programmierer bezeichnen". Aber was für ein Programmierer möchten Sie sein? Ich denke, die besten Programmierer haben zumindest einige Grundlagen in den theoretischen Grundlagen. Sie wissen warum sie haben eine bestimmte Datenstruktur/einen bestimmten Algorithmus sowie die damit verbundenen Kompromisse gewählt. Ich erwarte, dass jeder Entwickler, den ich interviewe, zumindest ein grundlegendes Verständnis hat, auch wenn er nicht denselben Jargon verwendet (obwohl es für Sie schwieriger ist, mit anderen Entwicklern zu kommunizieren, wenn Sie den Jargon nicht kennen).

3
Martijn Verburg

Die Kenntnis der Algorithmen ermöglicht es Ihnen, sicher zu sagen, wie Ihre Entscheidungen Skala! Ich persönlich halte dies für notwendig, um ein leitender Programmierer zu sein

2
user1249

"Wenn Sie ein guter Programmierer sein möchten, programmieren Sie einfach zwei Jahre lang jeden Tag. Wenn Sie ein Weltklasse-Programmierer sein möchten, können Sie zehn Jahre lang jeden Tag programmieren, oder Sie können zwei Jahre lang jeden Tag programmieren und an einem Algorithmuskurs teilnehmen . "

Charles E. Leiserson

Guter Rat aus der Analyse von Algorithmen von Charles E. Leiserson - MIT

2
milan-j

Sie mögen im Moment ein guter Programmierer sein, aber Kenntnisse über Datenstruktur, Algorithmen und Kenntnisse über andere Themen in der Informatik würden sicherlich viel dazu beitragen, sich in vielerlei Hinsicht zu verbessern:

  • Möglicherweise können Sie Dinge effektiver und schneller erledigen. Sogar Leute, die bereits einen Abschluss in Informatik haben und viele dieser Themen kennen, neigen dazu, sich über die neuesten Fortschritte auf dem Laufenden zu halten, um sich zu verbessern.

  • Dieses Wissen ist auch gut, wenn auch in geringerem Maße, wenn Sie später vom Programmierer zum Management-Track wechseln, da Sie mit diesem Wissen die technischen Aspekte von Projekten immer noch besser verstehen können.

  • Natürlich werden Datenstruktur und Algorithmen in Interviews häufig gefragt, daher ist dies ein weiterer Grund, warum es nützlich sein kann, sie zu kennen.

1
aditya

Es kommt auf das Projekt an: Ich bin ein BEng in Computer Engineer und arbeite als Analyst Programmierer.

Ich habe viel Zeit damit verbracht, im Design zu arbeiten (Testen, Dokumentieren, Code-Design). Wenn ich jedoch einen Fehler (oder eine schlechte Leistung) finde oder eine neue Datenstruktur codieren muss (da die Anforderung für die Anwendung sehr NEU ist), muss ich verstehen, wo das Problem im Algorithmus liegt, und ich muss ihn korrigieren ( Ich habe das nicht sehr gut gemacht, also :))

Die klassischen Algorithmen und Datenstrukturen sind eine Art "Wörterbuchmuster" in der Welt der Entwickler.

Einige ausgezeichnete Links:

1
alepuzio

Sie erwähnen Hashes, Bäume, Stapel, Warteschlangen und Sortieralgorithmen. Nun, die Technologien, die Sie erwähnt haben, beziehen sich hauptsächlich auf Webseiten und Web-Scripting. Sie sollten auf jeden Fall zumindest Bäume verstehen, damit Sie gut mit dem DOM arbeiten können. Aber wenn Sie nur Skripte erstellen müssen, sind Sie wahrscheinlich in Ordnung. Sie werden die meisten Werkzeuge des Handels für einen echten Programmierer nicht benötigen. Aber das liegt daran, dass es einen großen Unterschied zwischen dem String-Jonglieren gibt, das den größten Teil des Web-Scripting ausmacht, und dem, was die meisten von uns als "Schreiben von Programmen" betrachten.

Ich arbeite praktisch täglich mit Hashes und Bäumen und staple und stelle mich seltener, aber häufig genug. Das Sortieren ist grundsätzlich ein gelöstes Problem. In nahezu jeder Sprache ist eine Quicksortierung in die Standardbibliothek integriert, eine Sortiermethode für grundlegende Sammlungstypen usw. Sie sollten jedoch wissen, unter welchen Umständen die Leistung von Quicksort erheblich beeinträchtigt werden kann und welche Strategien zur Verzögerung der Sortierung geeignet sind.

Wenn ich diese Prinzipien und ihre Funktionsweise nicht kennen würde, könnte ich wahrscheinlich Codierungslösungen hacken, die funktionieren, aber sie wären keine sehr guten Qualitätslösungen. Sie würden langsam laufen, schwer zu lesen und schwer zu modifizieren, wiederzuverwenden oder zu erweitern sein. Wenn Sie also lernen möchten, ein guter Programmierer zu sein, sollten Sie sich unbedingt über Ihre Algorithmen und Datenstrukturen informieren. Sie werden die Qualität Ihres Codes wirklich verbessern.

0
Mason Wheeler