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


37

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, Maps, verknüpfte Listen, Mengen usw. verwendet und überall dort, wo ich mit Menschen wie mir gearbeitet habe. Aber wann immer ich interviewt werde, ist es sehr wahrscheinlich, dass Leute mich zu Hashes, Bäumen, Stapeln und Warteschlangen befragen. Einige Fragen beziehen sich auf das Jonglieren einiger Sortieralgorithmen. Ich weiß nicht, ob ich sie wirklich kennen sollte oder ob ich aufhören sollte, mich selbst Programmierer zu nennen. Da ist etwas in mir, das mir auch sagt, wenn Leute, die all diese Fragen stellen, mich auswählen, werden sie mich niemals dazu bringen, mit diesen Dingen zu arbeiten. Muss ich das alles wirklich wissen?


10
Das hängt davon ab, wo Sie arbeiten und wen Sie als Programmierer bezeichnen möchten.
Tim

1
Ja, wenn ohne negative Adjektive.
Duros

Antworten:


79

Wenn Sie nur Klebercode schreiben können, können Sie sich selbst einen Code-Affen nennen. Es muss viel Klebercode geschrieben werden, und Sie können als Code-Affe anständig leben. Um sich als Real Programmer TM zu bezeichnen und vertrauenswürdig zu sein, wenn Code von Grund auf neu geschrieben werden muss, müssen Sie Algorithmen, Datenstrukturen, Speicherverwaltung, Zeiger, Assemblersprache usw. kennen und verstehen, wie Sie dieses Wissen zur Bewertung von Kompromissen verwenden können.


6
Wow, ich hatte halbwegs damit gerechnet, dass dies von übermäßig politisch korrekten Leuten in Vergessenheit gerät, weil sie den Begriff "Code Monkey" verwenden.
dsimcha

15
"Software Simian" ist immer die bevorzugte Terminologie
STW

3
Ich stimme nicht ganz zu. Die Art der Software, die von Grund auf neu geschrieben wird, hat großen Einfluss darauf, wer in der Lage ist, sie zu schreiben. Manche Software erfordert von Natur aus weniger (oder mehr) Raffinesse als andere.
Nick Spreitzer

8
+1, 20%, weil ich zustimme, 5%, weil "Real Programmer TM" und 75%, weil ich Assemblersprache gelernt habe und so tun will, als wäre es den Schmerz wert
Carson Myers

3
Die meisten der vorhandenen Jobs erfordern nur "Code Monkeys". Es ist normal, dass Leute in Jobs mit "Code-Affen" dazu neigen, alle seine Vorkenntnisse zu vergessen und sich trotz seines Potenzials jeden Tag ein bisschen mehr "Code-Affe" zu machen. :(
cag

32

Wer die Geschichte nicht kennt, ist dazu verdammt, sie neu zu erfinden


75
Tatsächlich sind diejenigen, die die Geschichte nicht kennen, dazu verurteilt, sie mit O (N 2) - oder O (N 3) -Methoden neu zu erfinden , anstatt mit bekannten O (N log N) -Methoden, die alt genug sind, um Alkohol zu kaufen Zustände.
John R. Strohm

@ John ROFLMAO - zu wahr!
Steven A. Lowe

3
.... sind dazu verdammt, es erneut zu bestätigen

30

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.

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

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

Wenn es um Sortieralgorithmen geht, ist es nicht erforderlich, sie zu kennen oder zu verstehen, da Sie nie einen eigenen Algorithmus 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 als Programmierer Karriere machen, ohne sich auf solche Kenntnisse verlassen zu müssen.
  2. Es wird dir auf keinen Fall schaden, sie zu kennen.

Datenstrukturen und Algorithmen sind einfach eine Sache, die gut zu verstehen ist. Und es ist etwas sehr klares und formalisiertes und damit im Vergleich zu den Feinheiten der Anwendungs- oder Systemtechnik recht Triviales. Sie sind nur ein kleiner Teil des Puzzles, aber sie sind leicht zu erfassen - wenn Sie bereit sind, etwas Zeit zu investieren.

Also nein, Sie brauchen sie nicht, aber es wäre nur zu Ihrem Vorteil , sie zu kennen.


13

Dies könnte eine Gelegenheit sein, bei der eine semantisch bedeutsame Unterscheidung zwischen "Programmierer" und "Softwareentwickler" möglich ist. Insbesondere in diesem Zusammenhang stellen wir fest, dass Sie über Kenntnisse in mehreren Programmiersprachen und verwandten Technologien verfügen und mit diesen die gewünschten Ergebnisse erzielen können. Dies ist eine genaue Definition des Begriffs "Computerprogrammierer".

Ich betrachte mich als Softwareentwickler. In den meisten Bereichen meiner täglichen Arbeit mache ich wahrscheinlich das Gleiche wie Sie. Ich benutze Computersprache und verwandte Technologien, um ein gewünschtes 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 an jedem Tag - besteht meine Aufgabe darin, Lösungen für komplexe Probleme zu finden, für die es keine offensichtlichen Lösungen gibt, nichts, was von den Merkmalen des von mir verwendeten Frameworks oder den Fähigkeiten der Sprache, in der ich arbeite, direkt angesprochen wird mit. Dabei muss ich das Problem analysieren und eine Lösung finden, und gelegentlich bewegt sich dieser Prozess im Bereich einer groß angelegten Architektur.

Ein exzellentes Verständnis dieser tieferen Themen ist für diese Art von Arbeit zwar erforderlich, aber 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 für die Bewältigung 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 damit zufrieden sind, das zu tun, was Sie tun, möchten Sie möglicherweise nur genügend Datenstrukturen und Algorithmen erlernen, um die weitgehend willkürlichen Interviewfragen zu bewältigen, mit denen Sie konfrontiert sind.

Wenn Sie in Ihrer Karriere wachsen wollen und die Leidenschaft dafür haben, die entscheidend ist, sollten Sie sich diesen Themen so genau wie möglich annehmen. Wenn Sie etwas Zeit haben, um daran zu arbeiten, einen offenen Geist und echte Begeisterung, werden Sie einige wundervolle 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 bestimmte den Großteil meines restlichen Lebens, und ich könnte nicht dankbarer dafür sein. Jetzt kann ich mir nicht mehr vorstellen, außer als Software-Ingenieur zu arbeiten.

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


2
Es gibt immer offensichtliche Lösungen. Sie hören einfach auf zu arbeiten, wenn sich die Anforderungen ändern. Ich denke nicht, dass fundierte Kenntnisse über Algorithmen und Datenstrukturen eine echte Voraussetzung für einen guten Softwareentwickler sind. Es ist nur so, dass man selten einen ohne sieht, denn was ein guter Softwareentwickler hat, ist ein unbefriedigender Wissensdurst.
back2dos

+1 Gut formuliert: "Um Ihre Frage zu beantworten, sollten Sie sich vermutlich die Frage stellen:" Was möchte ich sein? Wohin gehe ich mit meiner Karriere? "
Bill

12

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 - schon gar nicht auf einen Job, bei dem die von Ihnen aufgelisteten Technologien zum Einsatz kommen.

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

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


1
Danke für deine Antwort. Ich werde unter anderem lustige Interviews mit Leuten teilen, die mich interviewen und jemanden benötigen, der auf der Seite der Benutzeroberfläche gut mit json css ajax javascript jquery etc. ist. Sie fragten mich, wie Sie einen Webserver schreiben würden. Und was passiert, wenn Speichern in einer Word-Datei gedrückt wird
sushil bharwani

2
@sushil - Ich denke, das ist die Art von Ort, an dem Sie nicht arbeiten wollen ...
Jon Hopkins

@sushil: Ich stimme @ Jon Hopkins voll und ganz zu. Lieber als Kellner arbeiten und auf einen guten Job warten, als einen solchen Job anzunehmen. Inkompetente Idioten als Vorgesetzte zu haben, wird Sie extrem frustrieren und Sie in Ihrer persönlichen Entwicklung behindern.
back2dos

6

Gute Frage. Javascript, Java oder VC ++ sind intelligente Programmiersprachen, in denen Sie niemals eine verknüpfte Liste oder eine Hash-Tabelle von Grund auf neu erstellen müssen. Aber Sie müssen immer noch die Fähigkeit haben, zu entscheiden, wann Sie eine über die andere einsetzen, welche Leistungsabzüge und Boni jeweils anfallen usw.

Ich habe viele API-Programmierer, auch bekannt als Code Monkeys, interviewt und in den meisten Interviews ist es ihnen routinemäßig nicht gelungen, Systeme zu entwerfen, die leistungsfähig und skalierbar sind. Fazit: Wenn Sie viele APIs kennen, erhalten Sie das Brot, aber für Butter müssen Sie mit den Grundlagen des Computing beginnen.


Vielen Dank, ich nehme Ihren Rat an und beginne, etwas über diese Themen zu lernen
Mahmoud Hossam

3

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 theoretische Grundlagen. Sie wissen, warum sie sich für eine bestimmte Datenstruktur / einen bestimmten Algorithmus entschieden haben und welche Kompromisse damit einhergehen. Ich gehe davon aus, dass jeder Entwickler, den ich interviewe, zumindest ein grundlegendes Verständnis hat, auch wenn er nicht den gleichen Jargon verwendet (obwohl es schwieriger ist, mit anderen Entwicklern zu kommunizieren, wenn Sie den Jargon nicht kennen).


2

Kenntnisse über Algorithmen ermöglichen es Ihnen, sicher zu sagen, wie sich Ihre Auswahl skalieren lässt ! Ich persönlich halte dies für notwendig, um ein leitender Programmierer zu sein



1

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

Ich habe viel Zeit damit verbracht, im Design zu arbeiten (Testen, Dokumentieren, Code-Design). Aber wenn ich einen Fehler (oder eine schlechte Leistung) finde oder eine neue Datenstruktur codieren muss (weil 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

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

  • Sie sind möglicherweise in der Lage, Dinge effektiver und schneller zu erledigen. Sogar Leute, die bereits einen Abschluss in Informatik haben und viele dieser Themen kennen, würden dazu neigen, mit den neuesten Fortschritten Schritt zu halten, um sich zu verbessern.

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

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


0

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-Skripte. Sie sollten auf jeden Fall Bäume verstehen, damit Sie gut mit dem DOM arbeiten können. Aber wenn Sie nur Skripte schreiben müssen, sind Sie wahrscheinlich in Ordnung. Für einen echten Programmierer werden Sie die meisten Tools des Fachs nicht benötigen. Aber das liegt daran, dass es einen großen Unterschied zwischen dem String-Jonglieren gibt, aus dem die meisten Web-Skripte bestehen, und dem, was die meisten von uns als "Schreiben von Programmen" betrachten.

Ich arbeite fast täglich mit Hashes und Bäumen und staple und reihe mich seltener, aber häufig genug ein. Das Sortieren ist im Grunde genommen ein gelöstes Problem. Fast jede Sprache verfügt über eine in die Standardbibliothek integrierte QuickSort-Methode, eine Sortiermethode für grundlegende Auflistungstypen usw. Sie sollten jedoch wissen, unter welchen Umständen die Leistung von QuickSort erheblich beeinträchtigt werden kann, und über die richtigen Strategien zum Verzögern des Sortierens.

Wenn ich diese Prinzipien und ihre Funktionsweise nicht wüsste, könnte ich möglicherweise funktionierende Codierungslösungen hacken, aber es wären keine qualitativ hochwertigen Lösungen. Sie liefen langsam, waren schwer zu lesen und schwer zu ändern, wiederzuverwenden oder zu erweitern. 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.