Warum sind Datenstrukturen in Interviews so wichtig? [geschlossen]


106

Ich muss gestehen, dass ich nach meinem College-Abschluss nicht so stark in Datenstrukturen war. Während des gesamten Praktikums auf dem Campus während meines Studiums habe ich miterlebt, dass sich die meisten Biggie-Tech-Unternehmen wie Amazon, Microsoft usw. hauptsächlich auf Datenstrukturen konzentrierten. Es scheint, als ob Datenstrukturen das einzige sind, was sie von einem Absolventen erwarten.

Um ehrlich zu sein, fühlte ich mich schlecht dabei. Ich schreibe guten Code. Ich folge Standard-Entwurfsmustern der Codierung, verwende Datenstrukturen, aber auf oberflächlicher Ebene wie in Java-exponierten APIs wie ArrayList, LinkedList usw. Die Unternehmen konzentrierten sich jedoch normalerweise auf die komplizierten Aspekte von Datenstrukturen wie zeigerbasierte Speichermanipulation und zeitliche Komplexität.

Wahrscheinlich aufgrund meines Java-Hintergrunds verstand ich damals Codeeffizienz und -logik nur, wenn ich über objektorientierte Programmierung wie Objekte, Instanzen usw. sprach, aber ich ging nie auf die Ebene der Bits und Bytes ein. Ich wollte nicht, dass die Leute wegen meines Wissensdefizits in Data Structures auf mich herabblicken.

Warum also wirklich all diese Betonung auf Datenstrukturen?


36
Ich verstehe deine Frage nicht wirklich. Sie sagen "Ich schreibe guten Code" - wie können Datenstrukturen nicht Teil eines guten Codes sein? Und ich bezweifle, dass ein aufrichtiger Interviewer übermäßig von ihnen besessen wäre.
Treecoder

6
@greengit: Es gibt einen Unterschied zwischen der Implementierung einer Hash-Map und der Verwendung ihrer API. Was ich in einem Interview schätzen würde, wäre, wenn sie eine Anwendung für mich beschreiben und mich dann auffordern würden, die zentralen Datenstrukturen aufzubauen und meine Auswahl zu erläutern.
György Andrasek

7
Was möchten Sie gefragt werden?
Versuchung

13
@Jurily - Um zu verstehen, wann eine Containerbibliothek verwendet werden muss, ist es hilfreich zu wissen, wie die zugrunde liegende Datenstruktur funktioniert. Es ist schwer zu akzeptieren, dass Sie sich mit der Effizienz von Code auskennen, wenn Sie die zeitliche und räumliche Komplexität der von Ihnen verwendeten Bibliotheken nicht kennen - nur weil es für kleine Testdatensätze gut funktioniert, bedeutet dies nicht, dass es für größere Datensätze gut skalierbar ist in der echten Welt. IMO, das Verstehen der zeitlichen und räumlichen Komplexität gehört ebenso zum Verständnis der API wie die Kenntnis der Klassen- und Methodennamen - vielleicht noch mehr, da Intellisense Ihnen die Komplexität nicht verrät.
Steve314

2
Eine gute Datenstruktur ergibt einen sauberen, einfachen Code. Eine schlechte Datenstruktur ergibt einen komplexen Code. Es ist wichtig, richtig zu machen.

Antworten:


121

Die meisten Biggie-Tech-Unternehmen wie Microsoft konzentrieren sich hauptsächlich auf Datenstrukturen. Es scheint, als ob Datenstrukturen das einzige sind, was sie von einem Absolventen erwarten.

Nein, da ist noch mehr. Zum Beispiel erwarten wir auch, dass Sie ein schneller Lerner sind, der in kurzer Zeit neue Frameworks, APIs oder sogar Programmiersprachen erlernen kann. Das ist ein Minimum an Bar. Wer lange braucht, um ein neues Framework, eine neue API oder eine neue Sprache zu erlernen, wird in den meisten Teams von Microsoft kein erfolgreicher Entwickler sein.

Und natürlich gibt es noch viel mehr Aspekte, auf die wir uns in Interviews konzentrieren, als nur Rohwissen über Datenstrukturen. Fähigkeit, mit mehrdeutigen Spezifikationen umzugehen oder Codierungsmuster zu erkennen, die unsicheren Code erzeugen, oder ein Dutzend anderer Dinge. Die Fähigkeit, Datenstrukturen zu verstehen, ist jedoch mit Sicherheit sehr groß.

Es ist insbesondere der Fall, dass die Befragung darauf abzielt, Kenntnisse über Datenstrukturen für neuere CS-Absolventen zu testen. Von jüngeren Absolventen, von denen die meisten nicht viel Erfahrung in der Praxis haben, wird nicht erwartet, dass sie in den gleichen Dingen gut sind, in denen jemand mit fünfzehnjähriger Branchenerfahrung gut sein würde.

Ich muss gestehen, dass ich in Datenstrukturen nicht so stark war

Es ist gut, dass du das über dich selbst weißt. Wenn Sie nicht in der Lage oder nicht bereit sind, dies zu ändern, empfehle ich, dass Sie sich nicht für eine Stelle bewerben, die eine Einrichtung mit Datenstrukturen erfordert.

Es gibt die allgemeine Sichtweise, dass ein guter Programmierer notwendigerweise ein Mensch mit guten Kenntnissen über Datenstrukturen ist.

Es ist tautologisch, dass ein guter Programmierer ein Programmierer ist, der gut darin ist, die Art von Programmen zu erstellen, die erstellt werden müssen. Viele Programmierer arbeiten an Aufgaben, die keine umfassenden Kenntnisse der Datenstrukturen erfordern. Einige von ihnen arbeiten beispielsweise an Aufgaben, die ein tiefes Wissen über das Design von Benutzeroberflächen erfordern. Oder Datenbanknormalisierung. Oder Wasauchimmer. Diese Leute können immer noch "gute Programmierer" in ihren Domänen sein.

warum all diese Betonung auf Datenstrukturen?

Ich stelle Interviewfragen zu Datenstrukturen, weil die Entwickler in meinem Team jeden Tag komplexe Datenstrukturen entwerfen, implementieren und manipulieren. Gestern hatten wir vier Stunden Meetings, in denen ein halbes Dutzend Entwickler die Vor- und Nachteile des Hinzufügens eines einzelnen Booleschen Felds zu einem bestimmten Baumknoten diskutierten. In meinem Team gibt es wahrscheinlich keine Fertigkeit, die wichtiger ist als die Fähigkeit, Datenstrukturen auf einer tiefen Ebene zu verstehen. Es wäre dumm, keine Interviewfragen zu stellen, da wir das tun.

Beeinträchtigt das Fehlen von Kenntnissen in Datenstrukturen wirklich die Programmierkarriere?

Nun, es wird Sie sicher davon abhalten, einen Job in meinem Team zu bekommen. Aber wie ich schon sagte, ist das Programmieren ein riesiges Feld. Es gibt viele Arten der Computerprogrammierung, für die keine Kenntnisse über Datenstrukturen erforderlich sind.

Ist das Wissen in diesem Fach wirklich eine ausreichende Grundlage, um einen guten und einen schlechten Programmierer zu unterscheiden?

Nein. Es reicht jedoch fast immer aus, Entwickler zu erkennen, die bei Microsoft wahrscheinlich nicht erfolgreich sind. Da es mir in erster Linie um das Erkennen geht, ist die Kenntnis von Datenstrukturen einer der Faktoren, auf die ich in Interviews teste.


10
Vielen Dank Eric! Dies ist die am wenigsten demotivierende Antwort, die ich auf meine Frage bekommen habe. :-)
Vamsi Emani

2
@ EricLippert, danke für diese hervorragende Antwort. Empfehlen Sie als autodidaktischer Entwickler, der noch nicht von seinem Mangel an formalen Kenntnissen über Datenstrukturen gebissen wurde, ein Buch, das mir zeigen könnte, was ich vermisst habe?
Schließung Cowboy

5
@Closure Cowboy: Für die Grundlagen von Datenstrukturen und Algorithmen ist "Introduction to Algorithms" von Cormen, Leieserson und Rivest das Standardlehrbuch. Wenn Sie an funktionalen Datenstrukturen interessiert sind, ist Chris Okasakis Buch sehr gut, aber ziemlich fortgeschritten.
Eric Lippert

2
@ClosureCowboy Schauen Sie sich Courseras 'Algorithms I'-Kurs an, der von Princeton angeboten wird. Ich bin auch ein Autodidakt und es trägt viel dazu bei, meine Lücken in der CS-Theorie zu schließen.
Evan Plaice

133

Ein wichtiger Punkt bei Datenstrukturen ist, dass sie universell und zeitlos sind, zumindest für praktische Zwecke. Jeder, der in den letzten 30 Jahren Entwickler war, sollte grundlegende Datenstrukturen wie einfach / doppelt verknüpfte Listen, Binärbäume oder Diagramme kennen. Wenn Sie zwei Entwickler nach ihnen fragen, können Sie das Wissen der Entwickler anhand ihrer Antworten vergleichen. Für Frameworks oder sogar Sprachen lässt sich das kaum sagen: Wenn Sie zwei Entwickler nach Rails fragen und einer viel mehr weiß als der andere, was sagt Ihnen das wirklich? Wie Sie in der Frage sagen, kann ein intelligenter Entwickler ein neues Framework schnell genug erlernen, sodass das Testen seines aktuellen Wissens nicht viel Sinn macht.

Wirkt sich das Fehlen von Kenntnissen in Datenstrukturen wirklich auf die Programmierkarriere aus?

Ja. Bestimmt. Es sei denn, Sie möchten Ihr ganzes Leben damit verbringen, CRUD-Anwendungen zu schreiben.

Oder ist das Wissen in diesem Fach wirklich eine ausreichende Grundlage, um einen guten und einen schlechten Programmierer zu unterscheiden?

Nein, das reicht nicht aus. Es gibt jedoch einige Dinge, die Sie in einem Vorstellungsgespräch fragen können, die ausreichen. Und ich würde sagen, Algorithmenwissen ist einer der besseren Indikatoren, zumindest für Schulabgänger, bei denen man nicht nach Arbeitserfahrungen fragen kann.


Ein kleiner Trottel, ich würde nicht sagen, dass Datenstrukturen per se zeitlos sind. Viele Strukturen sind für die Lösung von Problemen mit der heutigen Hardware modelliert. Zum Beispiel verwenden wir einen B + Tree, um die Suche über Dateiseiten zu optimieren, aber die zugrunde liegende Hardware ändert sich. Möglicherweise erfordern SSDs andere Algorithmen oder bewegen sich eher in Richtung RAM-Zugriff als auf Festplatte. Während der Algorithmus an sich "zeitlos" sein mag, ist er doch nicht der
richtige

3
@konrad: Das habe ich mit "aus praktischen Gründen" gemeint. Ich kann mir keine Datenstruktur oder keinen Algorithmus vorstellen, die "veraltet" sind, und ich bezweifle, dass Sie in einem Vorstellungsgespräch auf eine solche stoßen würden. Und da die meisten Algorithmen / Datenstrukturen lange vor unserer aktuellen Hardware entwickelt wurden und immer noch nützlich sind, würde ich sogar vermuten, dass eine Art Koevolution stattfindet, bei der neue Hardwareentwicklungen von den uns bekannten Datenstrukturen geleitet werden.
Nikie

Wenn Parallelität de facto obligatorisch wird, kann ich mir sehr viele Datenstrukturen
vorstellen

9
@konrad: Und wenn / wenn Quantencomputer Standard werden, kann ich mir ein paar mehr vorstellen. Aber ich
gehe

3
... oder wenn unsere neuen KI-Overlords mickrige menschliche Programmierer überflüssig machen
Homde,

45

Ich lerne schnell und kann innerhalb kürzester Zeit neue Frameworks, APIs oder sogar Programmiersprachen erlernen.

Nicht zu hart klingen, aber jeder halbwegs anständige Entwickler wird in der Lage sein, in relativ kurzer Zeit eine neue Sprache oder ein neues Framework zu erlernen.

Datenstrukturen sind universell, sie sind ein grundlegender Baustein der Informatik - ein rot-schwarzer Baum ist im Grunde derselbe, egal ob er in Java, Python, PHP oder was auch immer implementiert ist. Anstatt also bestimmte Sprachen oder Frameworks zu testen, testet ein Arbeitgeber (zumindest ein Arbeitgeber, der herausragende Entwickler sucht), ob Sie die Grundlagen der Informatik kennen, und nicht nur, was für einen Geschmack sie haben. Wird derzeit verwendet.

(Zumindest sollten sie die Grundlagen zusätzlich zu dem testen , was sie gerade verwenden ... es macht keinen Sinn, einen Informatik-Assistenten einzustellen, wenn er noch nie eine Codezeile in seinem Leben geschrieben hat.)


1
Informatik ist hier eines der Schlüsselwörter. Datenstrukturen werden in der Regel im Master eingehend betrachtet und sind anscheinend ein wichtiges Thema.
James P.

1
Datenstrukturen sind universell, bis Sie sich auf rein funktionale Programmierung einlassen: P.
Tikhon Jelvis

30

Glauben Sie , dass F1 - Rennfahrer nur fahren schnelle Autos? Nein, sie verstehen das Auto, das sie fahren, und sie arbeiten mit den Mechanikern / Ingenieuren zusammen, um es zu tunen. Natürlich fährt ein normaler Fahrer nur.

Sie können ein normaler / durchschnittlicher Programmierer sein, der nur Code schreibt . Du verstehst nicht, was dahinter steckt. Sie erledigen die Dinge. Das ist alles, bis zum nächsten Tag.

Aber viele Unternehmen suchen nach F1-Entwicklern. Menschen, die wissen, was sich hinter ihrem Code verbirgt. Menschen, die auch dem Unternehmen helfen, etwas Besseres aufzubauen.

Es ist ziemlich gut, Datenstrukturen zu kennen, nicht nur, weil Sie sie häufig in einer "vorgekochten" Form verwenden werden. Es ist auch gut, weil Sie etwas schaffen, das von ihrer Idee abgeleitet ist.



Warten Sie also, wollen Sie damit sagen, dass es einen Zusammenhang zwischen meiner Arbeit als Programmierer und meiner ungewöhnlichen Angewohnheit gibt, ein Auto vor dem Fahren gründlich kennenzulernen?
Robbie

@Robbie: +1 LOL Zerlegst du gerne Dinge?
Verkehr

2
Jep. Mein Vater hat mir beigebracht, wie man etwas auseinander nimmt. Er hat es versäumt, mir beizubringen, wie ich die Dinge wieder zusammenbaue, und das mein ganzes Leben lang herausgefunden.
Robbie

17

In meiner Klasse über Datenstrukturen sagte der Professor als erstes: In dieser Klasse geht es nicht darum, wirklich schnell suchen zu können. Wir haben dann ein halbes Jahr damit verbracht, die bestmöglichen Datenstrukturen und Algorithmen zu finden, um wirklich schnell zu suchen.

Trotzdem blieb er richtig. Datenstrukturen analysieren, die richtige Datenstruktur auf ein bestimmtes Problem anwenden oder sogar neue Datenstrukturen entwickeln zu können, erfordert viele Qualitäten eines Ingenieurs:

  • Abstraktionen finden, um ein konkretes Problem zu modellieren
  • Probleme auflösen können
  • Logisch / formal argumentieren können
  • Kreativität
  • usw.

Wenn Amazon und Microsoft Leute einstellen, stellen sie keine Fragen zu Datenstrukturen, weil sie hoffen, die nächste Quicksortierung zu erfinden . Sie wollen sicherstellen, dass sie jemanden mit den oben genannten Eigenschaften einstellen.

Natürlich ist es möglich, einen großen Teil dieser Eigenschaften zu haben und trotzdem Datenstrukturen auszunutzen. In diesem Fall dauert es jedoch nicht lange, bis Sie ein Experte für Datenstrukturen werden.


ArrayListDavon abgesehen gibt es immer noch ein Problem, das nicht ganz so groß ist. Wenn Systeme groß werden, sind besser angepasste Lösungen für die Ausführung des Auftrags erforderlich. Und ohne ein gutes Verständnis der Datenstrukturen können Sie keine Strukturen und Algorithmen finden und zusammenstellen, die in Ihrem konkreten Szenario insgesamt skalierbar sind.


3
Und ArrayListwenn Sie die Datenstrukturen nicht genau verstehen , werden Sie vielleicht gar nicht bemerken , dass ArrayListsie nicht ganz skaliert sind, und Sie müssen Strukturen und Algorithmen finden und komponieren, die skalieren.
Phoog

12

Im Allgemeinen werden Algorithmen und Datenstrukturen als zwei der "härtesten" Themen in der Programmierung angesehen. Dies liegt daran, dass es in der Informatik eine Menge Arbeit und Forschung gibt, die sich mit ihnen befassen. Sie ziehen auch die typischen "Left-Lobe" -Programmierer an, die Dinge wie Mathematik und Naturwissenschaften mögen (was eine ganze Reihe von Programmierern sind).

Davon abgesehen kann das Wissen darüber Ihre Karriere in Bezug auf Interviews beeinträchtigen, insbesondere wenn Sie an ingenieurorientierten Arbeitsplätzen wie Google interviewen. Andere Unternehmen könnten sich jetzt jedoch überhaupt um diesen Aspekt kümmern.

Nach meiner Erfahrung können Algorithmus- / Datenstrukturanforderungen manchmal als "Programmiererelitismus" empfunden werden, bei dem Alpha-Geeks gegeneinander antreten, um zu zeigen, wer der Klügste ist. Es ist immer gut zu wissen, was da draußen ist, aber es gibt sehr viele verschiedene Programmieraufgaben, bei denen Sie nie wissen müssen, wie man einen rot / schwarzen Baum verwendet oder eine Boyer-Moore-Suche codiert.

Ich würde empfehlen, mehr über die Themen zu lernen, wenn Sie sie interessant finden und ein persönliches Projekt haben, in dem Sie daran basteln können. Andernfalls können Sie wahrscheinlich vorerst ohne sie auskommen

PS. Kenntnisse über rudimentäre Datenstrukturen (verknüpfte Listen, Wörterbücher, Hashtabellen usw.) sollten für jeden Programmierer-DS ein Muss sein.


7

Warum also wirklich all diese Betonung auf Datenstrukturen?

Zwei Gründe.

Zum einen zeigt es, dass Sie das Problem abstrakt und nicht in einer bestimmten Programmiersprache betrachten können. Wissen Sie, warum eine Hash-Tabelle in einer bestimmten Situation eine bessere oder schlechtere Wahl sein kann als ein rot-schwarzer Baum, unabhängig von der zugrunde liegenden Implementierung?

Zum anderen gibt es eine beängstigende Anzahl von Leuten, die für Jobs interviewen, die einfach über ihre Erfahrung lügen und nur sehr wenig oder gar keine Programmierfähigkeiten haben. Datenstrukturfragen sind eine schnelle Möglichkeit, diese Leute auszusondern.


Ich werde hier eine Stellungnahme abgeben, die wahrscheinlich umstritten ist. Die Frage, warum die eine oder andere Datenstruktur auf Effizienz und Leistung zurückzuführen ist. Was raten wir Entwicklern, nicht zu tun? Keine vorzeitige Optimierung! Wenn Sie nicht wissen , dass die Auswahl der Datenstruktur zu Leistungsproblemen führt, ist die richtige Auswahl diejenige, mit der Sie am besten vertraut sind. Jede andere Entscheidung ist eine vorzeitige Optimierung und daher böse!
Tom W

2
Die Auswahl der richtigen Datenstruktur im Voraus auf der Grundlage der Anwendbarkeit und der erwarteten Leistungsmerkmale unabhängig von der zugrunde liegenden Implementierung ist kein Beispiel für eine vorzeitige Optimierung.
John Bode

Fibonacci-Haufen über binären Haufen auswählen kann sein. Verwenden von Heap vs Liste (wenn Heap geeignet ist) ist nicht.
user470365

5

Sie sind von grundlegender Bedeutung, aber zu welchen Themen würden Sie Absolventen befragen? Sie können oder können nicht Erfahrung außerhalb ihrer Kursarbeit haben. Ihr Kurs hat möglicherweise mehr Microsoft-Technologien als Java oder umgekehrt behandelt. Datenstrukturen sind untrennbar miteinander verbunden.


+1 für was sonst würdest du Absolventen ausfragen, da es nichts anderes gibt, das alle Absolventen von Comp-Wissenschaften wissen sollten, das du auch weißt.
Ian

4

Oftmals vermeidet der beste Code die Neuerfindung von Datenstrukturen auf niedriger Ebene. Dies gilt insbesondere für Hochsprachen. Ich habe selbst bei CRUD-Jobs einen Trend zu Datenstrukturfragen auf niedriger Ebene festgestellt. YMMV, aber es scheint, dass die Betonung der Expertise von Hacker-Wissenschaftlern die anderen Fähigkeiten, die einen großartigen Entwickler ausmachen, überschattet hat:

  • Projekt- / Zeitmanagement: In der Lage sein, mit der realen Welt Schritt zu halten, die vom Geschäft bestimmt wird, und nicht mit einer neuen verknüpften Liste, die 1% schneller arbeitet.
  • ein Minimum an sozialen Fähigkeiten: Ein Entwickler, der arrogant ist und nicht auskommt, ist nichts anderes als ein Anker.
  • die Fähigkeit, schnell und kontinuierlich Neues zu lernen: Datenstrukturen ändern sich im Laufe der Jahre kaum ... aber alles andere tut es. Datenstrukturen sind großartige Grundlagen, und jeder Entwickler sollte sie gut kennen, aber ein Buchhalter wird nicht auf seine Fähigkeiten in Bezug auf lange Abteilungen getestet, wenn er ein Interview führt. Gute Entwickler sind die Art von Leuten, die neue Dinge herausfinden können und es mögen.

Datenstrukturen sind großartig. Datenstrukturen sind wichtig. Jeder Programmierer sollte sie verstehen. Wir sind jedoch davon besessen, diese Grundlagen von ihrem Platz zu verdrängen. Es geht nicht nur um Datenstrukturen, und in 99% der Fälle müssen keine Fragen gestellt werden, die über die Grundlagen von Datenstrukturen hinausgehen. Wenn Sie einen Buchhalter befragen, fragen Sie ihn, was 81 geteilt durch 9 ist, aber wenn Sie immer wieder fragen: "Was ist die Kubikwurzel von 98425454242412 * 4512324? ... ohne Taschenrechner!" Dann erschrecken Sie einen guten Prozentsatz der vernünftigen, klugen, talentierten und angenehmen Menschen, die Sie hätten haben können. Fragen Sie, ob sie ein grundlegendes relationales Datenmodell erstellen können, und ob sie die erweiterten Array-Strukturen verwenden können, die vom jeweiligen Framework bereitgestellt werden. und fragen Sie, ob sie erklären können, wann eine binäre Suche schneller ist als eine flache Suche, aber es gibt nicht viel Sinn, darüber hinauszugehen. Wenn sie diese Dinge können, dann fangen Sie an, die nettesten, professionellsten und kreativsten zu suchen.

Ich liebe Joels Schreiben, aber ich denke, dass seine "Java Schools" Sache absolut falsch ist. Es gibt viele Dinge, die beweisen können, dass jemand nicht nur C ++ beherrscht. Denken Sie darüber nach, Sie können 10 Minuten lang mit jemandem sprechen, ohne ihn nach Zeigerarithmen zu fragen, und erhalten eine ziemlich gute Vorstellung davon, ob er der Typ ist, der Dinge erledigen und Dinge herausfinden kann. Wir müssen nicht so sein:

Interviewer: "Erzählen Sie mir von Ihren Leistungen."

Coder: "In meiner letzten Position war ich der einzige Entwickler eines benutzerdefinierten ERP-Systems für ein Milliarden-Dollar-Finanzunternehmen. Wir haben Monate früher als geplant geliefert und das System ist seit 3 ​​Jahren in Produktion."

Interviewer: "Lassen Sie mich klarstellen. Erzählen Sie mir von Ihren Programmierleistungen. "

Coder: "Umm ..."

Interviewer: "Haben Sie zum Beispiel jemals eine eigene verknüpfte Liste erstellt?"

Coder: ... geht raus


Interessant - gute Liste. Wie wäre es mit einem etwas anderen Blick darauf? 1. Projekt- / Zeitmanagement: Dinge so vorbereiten können, dass Datenstrukturen nur einen kleinen Teil der Interviewzeit verschwenden. 2. ein Minimum an sozialen Fähigkeiten: Ein Entwickler, der verstehen kann, dass Interviewer in der Regel nur schnell grundlegende Datenstrukturen überprüfen möchten, bevor sie sich interessanteren Bereichen zuwenden. 3. die Fähigkeit, schnell und kontinuierlich Neues zu lernen, ohne Ablenkungen, die durch mangelndes Wissen über die Grundlagen von Datenstrukturen verursacht werden könnten.
gnat

@gnat - Das ist auch gut. Ich vermute, ich stelle fest, dass das tiefgreifendste Verständnis der Grundlagen nicht über einen bestimmten Punkt hinaus für die Gesamtfähigkeit spricht, aber es gibt einen Trend, genau das Gegenteil anzunehmen. Datenstrukturen werden von den meisten Menschen von einer anderen Person (normalerweise einem Lehrer) unterrichtet. Ich möchte wissen, was sie selbst lernen können, denn so funktioniert die reale Welt. Gute Programmierer können vernünftige Systeme basierend auf Best Practices entwerfen. Großartige Programmierer können die verrückten Systeme, die von schrecklichen Programmierern geschrieben wurden, mit den schlechtesten Methoden erlernen und zum Laufen bringen.
Morgan Herlocker

1
Ich kann mir vorstellen, dass der Typ, der am ERP-System gearbeitet hat, nicht gut zum Team passt.
Christopher Mahan

4

Ein guter Programmierer zu sein, bedeutet nicht, Sprachen und Frameworks lernen zu können. Es geht darum, Lösungen für komplexe Probleme zu finden. Damit diese Lösungen effizient und zuverlässig sind, sind fast immer gute Algorithmen und eine angemessene Verwendung von Datenstrukturen erforderlich. Zu wissen, dass die Datenstrukturen vorhanden sind, reicht nicht aus. Sie müssen die Datenstrukturen verstehen, um die richtige für das Problem zu verwenden. Listen und Karten bieten einige wertvolle Funktionen, die jedoch mit Kosten verbunden sind. Wenn Sie die falsche Funktion verwenden, kann dies die Leistung Ihrer Software erheblich beeinträchtigen.

Ein guter Interviewer weiß das und versucht festzustellen, ob Sie für sein Team oder Unternehmen wertvoll sind. Die Sprache (n), die Sie in 2 Jahren verwenden werden, können sehr unterschiedlich sein, aber der Bedarf an effektiven Algorithmen und Datenstrukturen wird sich nicht ändern.


2

Datenstrukturen, Zeitkomplexität, Speichermanipulation und Zeiger sind alles Grundlagen, die jemand, der sich Informatiker nennt, von Natur aus kennen sollte. Jeder Code-Affe kann eine Sprache lernen und lernen, wie man sie benutzt, aber wo sich CS-Profis und Studenten abheben sollten, ist zu wissen, nicht nur wie man eine verknüpfte Liste oder eine Hash-Map benutzt, sondern WARUM.

Das WARUM ist es, was uns alle wirklich von den Grundskripten Kiddie, Code Monkey und Grunzen der Computerwelt unterscheidet. WARUM eine Hash-Tabelle anstelle einer verknüpften Liste verwenden, WARUM sollte meine Hash-Tabelle eine Clusterdichte von etwa 0,6 bis 8 aufweisen, WARUM sollte ich hier eine zirkulär verknüpfte Liste anstelle einer doppelt verknüpften Liste verwenden. WARUM sollte mein Code im schlimmsten Fall mit der Effizienz 'x' und im Durchschnitt 'y' ausgeführt werden?

Diese grundlegenden Datenstrukturen und Kenntnisse nicht nur darüber, wie sie verwendet werden (wie sie ohnehin in jedem Programmierer wiedergegeben werden sollten), sondern auch über das sprachunabhängige WARUM, nach dem sie verwendet werden.

Viele Orte werden Sie dazu bringen, den Code in einer Sprache zu schreiben, mit der Sie vertraut sind, aber das ist eher eine Allgemeingültigkeit, da C wirklich nicht mehr die Sprache der Programmierwelt ist und das Strukturieren von Pseudocode ein Missgeschick sein kann über den Platz und in den meisten Fällen mit Pseudo-Code / P & P-Code nicht wirklich gelehrt wird, rechts unmöglich zu behandeln.


0

Datenstrukturen sind das Fundament aller Programme. Sie müssen nicht unbedingt ein tiefes Verständnis für sie haben, aber Sie müssen unbedingt wissen, wie sie funktionieren.

Warum? Weil Ihr gesamter Code mit Daten interagiert und diese manipuliert. Wenn der Datensatz nicht in einer Struktur gespeichert werden kann, kann er nicht verwendet werden. Daten sind wie Baumaterialien eines Hauses. Bis Sie es zu einer Struktur zusammenfügen, haben Sie nur einen nutzlosen Stapel Bretter.

Sobald Sie sich entschieden haben, wie , darüber nachzudenken , und Ihre Daten Satz definieren, dann können Sie mit ihr anfangen , Dinge zu tun, den klassischen Algorithmus Teil des Duos. Jedes einzelne Programm, das Sie schreiben, verwendet eine Datenstruktur, obwohl diese Struktur in vielen Fällen so simpel ist, dass sie so gut wie gar nicht existiert. Ein paar Variablen für Zustandsdaten und wir sind fertig!

Sobald Sie über einfache Programme hinausgehen, erfordert fast alles eine Datenstruktur. Was würden Sie bevorzugen, einen professionellen Architekten, der Ihren Wolkenkratzer mit Best Practices und Mathe entwirft, oder Onkel Joe Bob, der sofort mit dem Bau beginnt?


-2

Um auf @Pelshoff aufzubauen , müssen Sie zeigen, dass Sie wissen, was Sie tun. Wenn Sie eine LinkedList für alles verwenden, zeigt dies möglicherweise, dass Sie nicht wissen, was Sie tun, oder dass Sie nicht daran interessiert sind, das Problem zu untersuchen. Darüber hinaus behandelte ich in meinem Kurs über Datenstrukturen die grundlegende Komplexitätstheorie derjenigen Datenstrukturen, die beim Umgang mit großen Datenmengen von großer Bedeutung sind. Deshalb würden Unternehmen wie Amazon oder Microsoft so etwas tun.

Ich muss sagen, bevor ich eine Datenstrukturklasse belegte, dachte ich, dass sie nicht wichtig sind, aber es ist wichtig, zumindest zu erkennen, wann eine verknüpfte Liste (oder ArrayList) nicht praktikabel ist oder welche Nachteile sie haben.


"Wenn Sie eine LinkedList für alles verwenden, zeigt das möglicherweise, dass Sie nicht wissen, was Sie tun" oder Sie sind ein Lisp-Programmierer :-)
Peter Alexander

@ Peter - was dann beweisen würde, dass Sie nicht wissen, was Sie tun! ;)
Jetti

Dies scheint auf einem toten Link zu einer gelöschten Antwort zu beruhen - ziemlich verwirrend für die Leser. Würde es Ihnen etwas ausmachen, dies zu bearbeiten ?
gnat

-2

Ob Sie guten Code schreiben oder nicht, ist eine subjektive Aussage. Es ist wichtig zu wissen, dass funktionaler Code nicht immer gut ist.

Trotzdem sind Datenstrukturen wichtig, weil sie wie die Mitarbeiter hinter den Kulissen sind, die Sie als Programmierer leiten. Es ist richtig, dass Sie Methoden für eine Struktur aufrufen können, ohne wirklich zu verstehen, was sie tut, und eine Struktur verwenden können, ohne wirklich zu wissen, wie die Daten gespeichert sind. Wenn Sie jedoch diese Details kennen, können Sie besser verstehen, wann es angebracht ist, eine Struktur zu überschreiben Ein weiterer.

Wenn Sie beispielsweise wissen, dass Sie durch eine doppelt verknüpfte Liste in beide Richtungen und nur durch eine einfach verknüpfte Liste in beide Richtungen navigieren können, können Sie leichter feststellen, welche Struktur beim Speichern von Daten wichtig ist. Sie können eine noch bessere Bildungsentscheidung treffen, indem Sie wissen, dass eine einzeln verknüpfte Liste möglicherweise weniger Speicherplatz beansprucht (da sie keine Zeiger auf vorherige Elemente enthält). Wenn Sie also nur eine Liste durchlaufen müssen, Sie können Speicherplatz sparen, indem Sie eine entsprechende Struktur verwenden.

Dies sind nur kleine Beispiele. Wenn Sie das Gefühl haben, dass Sie in Ihrer Karriere gut abschneiden, ohne über gründliche Kenntnisse der Datenstrukturen zu verfügen, müssen Sie möglicherweise nicht mehr lernen. Zu verstehen, was sich unter der Haube abspielt, kann wirklich dazu beitragen, funktionalen Code in guten Code zu verwandeln.


-3

Datenstrukturen sind Bausteine ​​für viele Aufgaben, die Sie ausführen möchten. Wenn Sie die Verwendung jeder Datenstruktur, ihre Schwächen und Stärken kennen, können Sie problemlos Probleme lösen.

Zum Beispiel mussten wir Tausende von Objekten verwalten. Von Zeit zu Zeit müssen wir den Zeitstempel eines Objekts entsprechend seiner ID aktualisieren. Hin und wieder mussten wir die Objekte entfernen, die länger als X Minuten nicht aktualisiert wurden.

Wenn Sie Ihre Datenstrukturen kennen, können Sie das Problem leicht definieren und es ist auch sehr einfach, eine Lösung zu finden. Als ein Programmierer, der nicht genügend Datenstrukturen kennt, versuchte, eine Lösung zu finden, war seine Lösung umständlich. Er war wie Sie - ein kluger Code-Programmierer, der in der Lage war, Frameworks schnell zu erlernen. Aber ohne Kenntnisse in Datenstrukturen musste er das Rad selbst erfinden. Darüber hinaus fiel es ihm schwer, einfachere Lösungen zu verstehen, da sie auf Datenstrukturen basierten, die er nicht verstand, wie z. B. rot-schwarze Bäume (Ihre alte TreeMap in Java).

Aus diesem Grund ist es wichtig zu wissen, wie und wann jede Datenstruktur zu verwenden ist, ohne darüber nachdenken zu müssen. Aber ich glaube nicht, dass es eine Möglichkeit gibt, dies zu erreichen, ohne zu verstehen, wie sie funktionieren.

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.