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?
quelle
Antworten:
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.
quelle
Wer die Geschichte nicht kennt, ist dazu verdammt, sie neu zu erfinden
quelle
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:
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:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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).
quelle
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
quelle
Guter Rat aus der Analyse von Algorithmen Von Charles E. Leiserson - MIT
quelle
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:
quelle
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.
quelle
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.
quelle