Beim Lesen dieser Website und SO habe ich viele Geschichten über Interviewfragen und -antworten gesehen, in denen gesagt wurde, ein Kandidat müsse eine verknüpfte Liste von Grund auf neu implementieren. Normalerweise ist dies eine "Gimme" -Übung zum Programmieren von Rollenkandidaten wie dem Schreiben von FizzBuzz. Die Idee ist, dass wenn der Kandidat dies nicht kann, er nicht programmieren kann und fast sofort abgelehnt werden sollte.
Ich kann jedoch nicht anders, als zu glauben, dass dies aus den folgenden Gründen eine schlechte Praxis sein könnte:
- Moderne höhere Sprachen wie C # und Python verwenden Listen häufig. Das Schreiben eines eigenen verknüpften Listenobjekts wäre nur unter ungewöhnlichen Umständen erforderlich und selbst dann wahrscheinlich nicht ratsam.
- Untergeordnete Sprachen wie C ++ haben Standardbibliotheken mit Iteratoren / Listencontainern und Objekten.
- In Anbetracht der ersten beiden Punkte können Programmierer Jahre vergehen, ohne überhaupt daran zu denken, eine Liste (verknüpft, doppelt verknüpft usw.) selbst zu implementieren. Einige mögen solche Dinge seit College-Tagen nicht mehr wirklich sehen.
- Die Rechenleistung ist auch nicht der Faktor, der vor Jahren war, daher ist die Effizienz über Zeiger (im Allgemeinen) nicht mehr das Problem, das es früher war.
- Eine einfache Websuche nach so etwas wie "Beispiel für verknüpfte Listen" würde viele Codebeispiele hervorbringen, die einfach auswendig gelernt und ausgespuckt werden könnten und nicht wirklich die wahre Kompetenz des Antragstellers anzeigen.
Ich sollte sagen, dass die Verwendung einer verknüpften Liste, die zu offenen Fragen / Diskussionen über die Fähigkeiten zur Problemlösung / zum kritischen Denken der Kandidaten führt, höchstwahrscheinlich eine wirklich gute Interviewpraxis ist. Auf jede Weise kann ein Interviewer wirklich sehen, wie ein Bewerber aussieht und wie er dies für äußerst nützlich hält.
Ich denke, dass dieser binäre Ansatz von "kein Code für verknüpfte Listen, kein Job" für Programmierer, die an einem Desktop oder einer Webanwendung arbeiten, etwas veraltet ist. Es könnte auch ziemlich schädlich sein; Ein Kandidat, der sich nicht erinnern kann, wie man richtig mit dem Kopf einer Liste arbeitet, kann ein ansonsten ausgezeichneter Kodierer und Mitarbeiter sein und in der Mischung verloren gehen. Gedanken?
EDIT : Es gibt viele (gute) Kommentare, die darauf hindeuten, dass es vom Kontext des Jobs abhängt, ob es sich um eine gute oder eine schlechte Frage handelt. Ich stimme voll und ganz zu, also lassen Sie mich diese Frage umformulieren: Das Implementieren einer verknüpften Liste ist eine häufige Interviewfrage für eine Vielzahl von Codierungsaufgaben, ähnlich wie bei Fragen wie FizzBuzz oder dem Schreiben einer rekursiven Funktion zur Berechnung von Fakultäten. Hat diese Frage genug Nutzen, um allgemein für die Bewertung von Programmierkandidaten verwendet zu werden? Oder sollte es eine schlechte Frage sein, die man sich stellen sollte, mit Ausnahme der Stellen bei "Senior Developer, Embedded Linked Lists Team"?
quelle
Antworten:
Wenn Sie bei der Beantwortung der Frage wissen, was Sie über einen Kandidaten wissen möchten, ist dies eine gute Interviewfrage. Wenn es Ihnen das nicht sagt, ist es eine schlechte Frage.
Einfache Fragen wie FizzBuzz erfüllen einen bestimmten Zweck. Wenn ein Kandidat FizzBuzz nicht codieren kann, kann er einfach nicht codieren und Sie können das Interview vorzeitig beenden. Ich würde die Implementierung einer verknüpften Liste als etwas schwieriger einstufen, aber es kann eine Unterhaltung über Datenstrukturen im Allgemeinen beginnen, die viel enthüllt.
Denken Sie daran, dass Ihnen keine einzelne Interviewfrage alles sagt, was Sie wissen möchten. Sie müssen wirklich eine Gruppe von Fragen bereit haben. Sie sollten Fragen in einer Reihenfolge von der einfachsten bis zur schwierigsten stellen, damit Sie die Grenze dessen finden , was der Kandidat weiß. Wenn Sie eine Frage stellen und sie es verstehen, wissen Sie immer noch nicht, was sie sonst noch tun oder nicht wissen.
In Bezug auf Ihre Bearbeitung:
Ich denke, es ist eine gute allgemeine Frage, die für die Bewertung praktisch aller Programmierkandidaten verwendet werden kann. Es muss nur Teil einer größeren Gruppe von Fragen sein. Es wäre ein guter Eisbrecher für viele Positionstypen (selbst wenn der Kandidat eine verknüpfte Liste nicht von Grund auf implementieren kann, kann er möglicherweise erklären, wie er eine zuvor verwendet hat und welche Schlüsselfunktionen zu Beginn vorhanden sind) oder Eine lange Reihe weiterführender Fragen für die Position "Senior Developer, Embedded Linked Lists Team".
quelle
Ich habe Jobs nur deshalb verpasst, weil ich mich nur mit einfachen Rätseln wie diesen beschäftigt habe. Ich habe solche Rätsel auch in anderen Interviews hervorragend gelöst - ich weiß, wie man eine verknüpfte Liste in einer drucklosen Umgebung implementiert. Ich habe mich noch nie über meine Fähigkeiten bei jemandem beschwert, mit dem ich zusammengearbeitet habe. Vielleicht sollte ich nicht denken, dass ich Jobs verpasst habe, ich sollte denken, dass sie mich verpasst haben.
Also ja, ich denke, es ist bestenfalls eine fragwürdige Praxis, aber ich verstehe es. Ich habe auch die Möglichkeit in Betracht gezogen, dass nicht die Frage, sondern der Fragesteller daran schuld ist, dass es sich um eine Hochdrucksituation handelt.
Persönlich bevorzuge ich es, offene Fragen zu einem Problem zu stellen, das der Kandidat bereits gelöst hat - wenn möglich in jüngster Zeit - und dabei sowohl Codierungs- als auch Prozessprobleme zu behandeln. Wenn sie Codebeispiele mitbringen können, fantastisch.
quelle
Man muss den Programmierauftragstyp definieren. Wenn Sie in der Entwicklung von Compilern und Algorithmen tätig sind, sollten Sie Fragen zu solchen Dingen haben. Wenn Sie sich in Branchenanwendungen befinden und erwarten, dass der Kandidat CRUD-Anwendungen durchführt, ist möglicherweise die Kenntnis des Konzepts (ohne ein Programm zu schreiben) ausreichend. Das Wissen über die verschiedenen Technologien, die für die Erledigung der Aufgaben speziell für LOB-Anwendungen erforderlich sind, ersetzt heutzutage die Notwendigkeit sauberer Algorithmen.
quelle
Meine Antwort lautet "Es kommt darauf an". Ich würde diese Frage stellen, wenn ein Kandidat C oder C ++ in seinem Lebenslauf aufgeführt hat. Die Anforderung, eine verknüpfte Liste zu implementieren, ist ein guter Test für das Verständnis von Zeigern, der für einen C- oder C ++ - Programmierer unbedingt erforderlich ist.
Wenn ein Kandidat hingegen nicht behauptet, C oder C ++ zu kennen, würde ich ihn nicht bitten, eine verknüpfte Liste zu implementieren, aber ich würde in Betracht ziehen, Fragen dazu zu stellen. Erklären Sie auf hoher Ebene, wie eine verknüpfte Liste funktioniert. Wie komplex ist es, dem Kopf der Liste ein Element hinzuzufügen? Der Schwanz der Liste? Einfügen eines Elements in die Mitte der Liste? Wann würden Sie eine Liste anstelle eines Arrays verwenden? Dies sind grundlegende Datenstrukturkonzepte, die IMHO jeder Programmierer kennen sollte.
quelle
Ich würde es nicht als schlechte Interviewfrage ansehen. Viel Verständnis für Datenstrukturen und Programmierung beginnt mit einem wirklich guten Verständnis der verknüpften Listen. Das heißt, es gibt einige Einschränkungen:
1) Es ist eine Frage vom Fizz-Buzz-Typ. Sie validieren nur etwas sehr Grundlegendes: Versteht die Person eine verknüpfte Liste? Fragen Sie es und fahren Sie fort.
2) Bei verknüpften Listen besteht die Herausforderung, dass die Sprachen, mit denen Sie Ihr Verständnis der Konzepte für verknüpfte Listen zeigen können (z. B. C), möglicherweise nicht mit der Sprache übereinstimmen, mit der sie im Job arbeiten werden. Natürlich können Sie in jeder Sprache mit Strukturen grundlegendes Verständnis demonstrieren, aber die Aufforderung an einen Kandidaten, eine verknüpfte Liste in Erlang erneut zu implementieren, ohne [] zu verwenden, ist nicht die gleiche Herausforderung und wird Ihnen nicht das Gleiche über das Verständnis eines Kandidaten sagen Wenn man sie bittet, es in C zu tun, wenn der Job in Java ausgeführt wird, fehlt auch etwas der Punkt.
3) Vor diesem Hintergrund und angesichts der allgemeinen Herausforderungen der "Whiteboard-Programmierung" würde ich Pseudocode oder Diagramme akzeptieren, wenn ich diese Art von Frage stelle, sofern sie das Verständnis der Kernprinzipien demonstrieren. Ich fordere die Leute nicht auf, Code auf ein Whiteboard zu schreiben, der syntaktisch und logisch perfekt ist, besonders wenn sie sich dann umdrehen und logische Probleme erkennen können, wenn sie gebeten werden, ihn erneut zu betrachten. YMMV.
quelle
Wenn ich Interviews gab, wurde ich oft nach Implementierungen von verknüpften Listen und einigen Algorithmen gefragt, die sich auf verknüpfte Listen konzentrierten. Ich habe die meisten von ihnen gelöst und bei einigen musste ich meine Neuronen ein bisschen trainieren.
Wenn ich jemals ein Interview führen würde, würde ich mich für eine Art Linked-List-Implementierung entscheiden, nicht um zu testen, wie gut eine Person im Codieren ist, sondern um zu überprüfen, wie viel Aufmerksamkeit eine Person den Details schenkt. Jeder kann eine verknüpfte Liste schreiben, aber es sind die Grenzfälle, an denen selbst einige gute Programmierer scheitern. Fragen Sie ihn nicht
Write a code for linked list in C/C++
. Bitten Sie ihn, eine generische verknüpfte Liste in C (nicht C ++) usw. zu schreiben.Wenn Sie das Problem lösen und einige andere Bedingungen in die verknüpfte Liste aufnehmen, haben Sie eine gute Frage. Manche Menschen sind dann gezwungen, Fehler zu machen.
quelle
void
Zeiger sind nur dafür da ... :) Der erste Link, den ich bei Google für "generic linked list in c" gefunden habe, war: daniweb.com/software-development/c/threads/109260 und ein anderer war ein technisches Interview .com /… Ich dachte, das wüsste jeder!void
Zeiger verwendet, nicht generisch, sondern nur allgemein gültig . Sie können jede Art von Dingen darin aufnehmen und sie sogar mischen, was sie wollen - und genau das macht es für mich nicht generisch. Es ist so, als würde man den Basistypobject
in objektorientierten Sprachen verwenden ...In meinen bisher rund 10 Jahren als Programmierer (und etwa weiteren zehn Jahren als Hobby) habe ich nicht gedacht, dass ich jemals eine verknüpfte Liste implementieren musste. Wenn mich jemand während eines Vorstellungsgesprächs darum bittet, könnte ich mich dagegen erkundigen, ob ich das regelmäßig tun werde.
Sicherlich gibt es mit ziemlicher Sicherheit Arbeitsplätze dort , wo Sie werden mehr oder weniger Reinraum- Implementierungen von allgemein bekannten Algorithmen schreiben müssen - wie eine verknüpfte Liste von Grund auf neu implementieren. Welchen besonderen Wert hat es für das Unternehmen bei den meisten Programmieraufgaben, dass ein Kandidat dies während eines Vorstellungsgesprächs tun kann? Ist es in einem solchen Umfeld wirklich so wichtig, dass der Kandidat eine perfekte Implementierung bietet, die Kantenfälle korrekt behandelt, Fehler gemäß gängiger Praxis in der Sprache oder im Framework meldet und so weiter? Oder können Sie das übersehen und sich stattdessen darauf konzentrieren, wie sie sich einem Problem nähern, mit dem sie in 10 bis 20 Jahren vielleicht nicht konfrontiert waren?
Als ich für meinen aktuellen Job interviewt habe, hatte ich sehr wenig Erfahrung mit dem im Unternehmen verwendeten Technologie-Stack. Jetzt, ein paar Jahre später, kommen regelmäßig Kollegen zu mir und fragen nicht nur nach den Produkten, deren Implementierung und den von ihnen implementierten Standards, sondern auch nach viel allgemeineren Programmierproblemen (erst gestern wurde mir was gefragt) Die Auswirkungen bestanden aus einer zirkulären Abhängigkeit in einer Standardeinschränkung in SQL Server im Kontext einer bestimmten Tabelle und deren Verwendung in unserem Fall (aus diesem Grund stellte sich heraus, dass es in diesem bestimmten Fall keine Auswirkungen gab). Ich brauchte auch keine brandneue Implementierung für verknüpfte Listen.
Stellen Sie Fragen, die für die Arbeit relevant sind, die dem Kandidaten wahrscheinlich zugewiesen wirdund versuchen, eine Vorstellung davon zu bekommen, wie sie sich fühlen, wenn sie neues Wissen erwerben. Wie würden sie herausfinden, was eine obskure Syntax bedeutet, die sie noch nie gesehen haben? (Wenn Sie zum Beispiel ein C-Shop sind, könnten Sie eine Frage zu Trigraphen stellen.) Lesen Sie für eine Programmierposition regelmäßig Foren wie Stack Overflow oder tragen Sie dazu bei? Wenn sie gebeten würden, eine Aufgabe in einer Programmiersprache oder einem Framework auszuführen, mit der bzw. dem sie wenig oder keine Erfahrung haben (z. B. wenn Sie in erster Linie ein Java-Shop sind, was ist mit Clojure oder .NET?), Wie würden sie dann das Problem angehen? Nehmen Sie vielleicht einen echten Bug aus Ihrem Bug-Tracker heraus (vielleicht sogar einen, der längst behoben ist) und fragen Sie sie, wie sie es im Allgemeinen angehen würden, um ihn zu lösen, und erklären Sie die relevanten Teile des fraglichen Produkts.
Wenn der Kandidat geschäftsfallrelevante Probleme bewältigen kann und ein gutes Gespür dafür hat, neue Dinge zu lernen, ist dies wahrscheinlich ein viel besserer Indikator für die Eignung für diese bestimmte Position, als in der Lage zu sein, gezielte Antworten auf bekannte Fragen zu geben, ob diese Fragen beziehen sich auf FizzBuzz, verknüpfte Listen oder etwas anderes. Werfen Sie einen Blick darauf, wie gut der Kandidat in das Team passt, und ich denke, Sie befinden sich auf ziemlich sicherem Boden.
quelle
Natürlich müssten die meisten Leute niemals eine verknüpfte Liste implementieren, aber um sie von Grund auf neu zu implementieren, muss man wahrscheinlich mit Zeigern richtig umgehen. Die Idee ist dann, dass die Bildung eines konsistenten mentalen Modells für Zeiger mit den Sprachkenntnissen korreliert, mit dem Verständnis, was auf einer (abstrakten) Maschinenebene passiert, und der Fähigkeit, allgemein zu abstrahieren.
Ich sage nicht, dass dies notwendigerweise das beste Maß wäre, sondern nur, dass es eine gewisse Korrelation gibt.
quelle
Sie fangen an zu sagen, dass es sich um "gimme" Fragen handelt, aber dann weisen Sie darauf hin, dass die Leute verständlicherweise nicht in der Lage sein werden, sie zu beantworten. Ich bin verwirrt.
So denke ich darüber nach:
Ich denke, das macht sie zu guten Fragen. Wenn du dir Sorgen machst, dass sie vor dem Vorstellungsgespräch lernen, dann füge eine Liste hinzu. Lassen Sie sie das Rundschreiben schreiben und fragen Sie, wie lang die asymptotische Laufzeit ihrer Implementierung ist. Oder lassen Sie sie eine andere gemeinsame und / oder schnelle Datenstruktur schreiben ... Einen binären Suchbaum? Eine Warteschlange (FIFO)? Ein Stapel (FILO)? Eine naive (
O(n)
) Prioritätswarteschlange? Viele Leute, die ich kenne, denken, dass eine BSTO(log n)
nur deshalb ist, weil es ein Baum ist .Wenn Sie jemanden suchen, der im Metallbereich arbeitet und eine sehr solide Grundlage für Datenstrukturen benötigt, sind diese für die Kandidaten, die Sie einstellen möchten, möglicherweise sogar viel zu trivial.
Dies setzt natürlich voraus, dass Sie einen Entwickler suchen, der die Grundlagen von Datenstrukturen besitzt und dessen Position von diesen Grundlagen profitieren würde. Wenn Sie jemanden haben möchten, der in Sekundenschnelle eine Asp-Seite zusammenstellt, interviewen Sie ihn. Es geht nicht darum, eine Interviewfrage auszuwählen, die alle anderen beantworten, sondern eine, die die Fähigkeiten misst, nach denen Sie suchen. Persönlich denke ich, Datenstrukturfragen sind gut, verknüpfte Liste oder nein.
quelle
Nein auf keinen Fall. Je nachdem, wie es formuliert ist, können Sie zwischen "Dieser Kandidat weiß, wie man eine verknüpfte Liste erstellt" und "Dieser Kandidat kann eine verknüpfte Liste in der Sprache X programmieren" wählen. Wenn Sie nach einem Pseudocode fragen, tendiert dieser eher zum ersten. Wenn Sie nach einer Implementierung in einer bestimmten Sprache fragen, erfahren Sie mehr über deren Verständnis der Sprache (insbesondere in C und C ++, wo Sie sich mit Zeigern, Referenzen und Strukturen befassen können).
Ich würde sogar sagen, dass es nicht möglich ist, alle Kandidaten mit denselben Fragen zu bewerten. Sie müssen Ihre Interviewfragen anpassen, um die Fähigkeiten einzuschätzen, nach denen Sie in der Position suchen.
Wenn die Person in der Lage sein wird, Code zu schreiben, würde ich darüber nachdenken, einen Algorithmus und / oder eine Frage zur Datenstruktur aufzunehmen, sofern dies für die Position relevant ist. Ich würde versuchen, etwas auszuwählen, das vorher diskutiert oder verwendet worden sein könnte. Ich würde mich auch auf andere Dinge konzentrieren als nur die Implementierung der Algorithmen und Datenstrukturen, wie die Laufzeit und den Speicherverbrauch (Dinge wie die Big-O-Notation). Diese Konzepte sind nicht nur für die Erstellung der Datenstruktur relevant, sondern auch für die Auswahl der Implementierung, die am besten geeignet ist (z. B.
ArrayList
versus aLinkedList
).quelle
Ich denke nicht, dass ein regulärer Programmierjob eine Frage sein sollte, die einen Kandidaten ausschaltet. Aber es ist gut zu sehen, ob Sie es mit einem wirklich erfahrenen Programmierer oder mit jemandem zu tun haben, der seit vielen Jahren Affen-Codierungsformen verwendet. Und trotzdem sollte es kein grundlegendes Kriterium für die Auswahl eines Programmierers sein. Vielleicht ist es ein großartiger Programmierer mit schlechtem Gedächtnis und hat die Wörter "verknüpfte Liste" seit Jahren nicht gelesen (oder erinnert sich nicht an den Namen), kann aber trotzdem gute Apps ausführen.
Also, wie einige sagten, wenn es sich um einen Job handelt, der mit verknüpften Listen und vielen ausgefallenen Algorithmen usw. arbeiten muss, dann ist das in Ordnung. Ist, wenn für die üblichen Eingabedaten auf einem Formular, validieren und zeigen irgendwie nutzlos und unfair ist.
quelle
Ich denke, dass dies ein schlechtes Beispiel für eine Interviewfrage ist, aber aus einem anderen Grund. Eine verknüpfte Liste ist ein so einfaches Konzept, dass man wissen muss, wie man sie implementiert. Wenn die Person nicht weiß, was eine verknüpfte Liste ist, müssen Sie erklären, wie sie funktioniert, und dabei die Antwort weitergeben, ohne zu wissen, ob sie weiß, wie sie Probleme lösen kann oder nicht . Die Frage lässt sich also reduzieren auf "Wissen Sie bereits, was eine verknüpfte Liste ist und wie sie funktioniert?", Was Ihnen nichts Sinnvolles über ihre Eignung als Programmierer sagt.
quelle
Das Schreiben einer Linked-List-Implementierung ist eine gute Interviewfrage, da sie viel über die Codierungsweise des Kandidaten verrät:
Weiß er, was eine API ist? Kann er den Code anderer Leute verwenden? Kann er Code schreiben, damit andere ihn verwenden können?
Weiß er, was eine verknüpfte Liste ist? Kennt er Sammlungen, Datenstrukturen, Algorithmen?
Wenn er nicht einmal weiß, welche Methoden eine verknüpfte Liste bieten sollte, wissen Sie, dass er wahrscheinlich nie eine verwendet hat oder wann er eine verwenden muss.
Wie geht er mit dem Problem um? Beginnt er zuerst mit einer Analyse, einer kleinen Spezifikation, einigen Tests im Voraus? Oder fängt er einfach an, sich glücklich abzuhacken?
Behandelt er Edge Cases? Was ist mit dem Entfernen des letzten Knotens aus der verknüpften Liste? Was ist, wenn jemand versucht, der verknüpften Liste einen Verweis auf die verknüpfte Liste selbst hinzuzufügen und dann das Ganze löscht?
Behandelt er Ausnahmen? Jede Programmiersprache hat ihre eigenen Konventionen für die Behandlung von Ausnahmen: In Java wird von einer LinkedList erwartet, dass sie eine NoSuchElementException auslöst, wenn Sie getFirst () für eine leere Liste ausführen. Andere Sprachen können undefiniert, -1 oder eine Konstante zurückgeben.
quelle