Wie der Titel schon sagt, was ist Ihr Lieblingsproblem bei einem Whiteboard-Interview und warum hat es sich für Sie als effektiv erwiesen?
Junior, Senior, Java, C, Javascript, PHP, SQL, Pseudocode usw.
interview
algorithms
NickC
quelle
quelle
Antworten:
Ich bitte den Kandidaten, eine Lösung für ein Problem zu entwerfen, auf das ich in meiner täglichen Arbeit gestoßen bin. Dabei versuche ich, einen Dialog zwischen mir und dem Kandidaten herzustellen. Ich versuche über das Design zu diskutieren, das er erstellt, als hätte ich noch nie über das Problem nachgedacht.
Ich versuche zu bewerten, ob wir uns verstehen und ob wir über ein technisches Problem ohne Verwirrung sprechen können.
Konkretes Beispiel
(Für einen Java-Desktop-Entwickler)
Entwerfen Sie eine API für den Navigationsverlauf eines Webbrowsers (vorherige Seite, nächste Seite, Liste der 10 vorherigen Seiten), die in vielen Teilen der Anwendung wiederverwendbar ist (hier gebe ich konkrete Beispiele in unserer App). Skizzieren Sie anschließend eine Implementierung.
Ich mag dieses, weil es einfach genug ist, leicht zu veranschaulichen ist, Schritt für Schritt gelöst werden kann (zusätzliches Verhalten hinzufügen, ohne alles zu beschädigen), es ermöglicht, über Randfälle und Fehlerbehandlung zu sprechen und es ermöglicht auch, über Daten zu sprechen Strukturen.
quelle
Ich fand diese extrem aufschlussreich, wenn ich Kandidaten interviewte und diejenigen herausfilterte, die nichts zu suchen hatten. Es ist ähnlich komplex wie Fizz Buzz, konzentriert sich jedoch auf Datenbankkenntnisse.
Ich lasse sie es in jeder SQL-Variante schreiben, die sie wollen, und bin nicht zu wählerisch bei kleineren Syntaxproblemen. Ich möchte vor allem wissen, dass sie grundlegende relationale DB-Konzepte verstehen.
Die meisten Kandidaten kommen ohne Probleme durch Teil 3. Sie werden erstaunt sein, wie viele glauben, dass die Antwort auf Teil 4 darin besteht, den Operator in der where-Klausel von OR in AND zu ändern.
quelle
"Zeichnen Sie für mich das Design des letzten Projekts, an dem Sie gearbeitet haben, auf die Pinnwand, ohne mir sensible Details preiszugeben."
quelle
Implementieren
strcpy
,strcmp
und Freunde.quelle
atoi()
.strdup()
.strrev()
Funktion zum Umkehren der Zeichenfolge zu implementieren . Meine Whiteboard-Lösung hat sie beeindruckt und ich mache jetzt meine Arbeit.Mein Favorit, der einige Disziplinen umfasst, ist das Zählen der Anzahl von Knoten in einem Binärbaum unter Berücksichtigung der Schnittstelle (in C #):
und nur zum Spaß, hier ist die Implementierung, obwohl der Befragte dies nicht sehen muss.
und die Assistenzklasse:
Die Lösung, die ich sehen möchte, ist folgende:
Wie es Kenntnisse von demonstriert:
quelle
Zwei Fragen, die für mich interessante Whiteboard-Diskussionen ausgelöst haben, sind:
Sie beginnen einfach und werden dann immer komplexer.
quelle
Ich mag es nicht, ein Puzzle oder eine Designfrage als Whiteboard-Frage zu verwenden. Ich bevorzuge einfache Fragen, die die Fähigkeit des Kandidaten testen, Code zu schreiben. Meine Favoriten sind:
1) Schreiben Sie eine Funktion, um eine einfach verknüpfte Liste umzukehren. (Es dauert eine Weile, bis sie feststellen, dass sie 3 Zeiger benötigen.)
2) Bestimmen Sie bei einem gegebenen Binärbaum die Tiefe des Binärbaums. (Diese Frage testet ihre Fähigkeit, rekursiven Code zu schreiben. Lassen Sie mich prüfen, ob der Basisfall intakt ist.)
3) Schreiben Sie eine Prozedur für die binäre Suche in einem Array von Ganzzahlen. (Wie Jon Bentley (in Programming Pearls) sagt, neigen viele Menschen dazu, Fehler beim Schreiben einer binären Suche zu machen. Man kann dann Fehler finden, Testfälle schreiben, den Code durchlaufen usw.)
quelle
Wir haben das bei einer Firma benutzt, für die ich gearbeitet habe.
Wir gaben dem Kandidaten ein Stück Papier, das zur Verfolgung der Zeit verwendet wurde. Es war eine echte Arbeitszeittabelle, die von einer oder unseren Abteilungen verwendet wurde. Wir haben den Kandidaten gebeten, uns durch den Entwurfsprozess zu führen, um ein besseres Zeiterfassungstool zu entwickeln. Keine Grenzen, keine Angabe der Sprache usw., ich möchte nur sehen, wie gut der Kandidat im "vollen Lebenszyklus" war. Es gab uns einen echten Einblick, wie sie Anforderungen sammelten. Wie sie Datenbanktabellen strukturiert haben, welche Art von Benutzeroberfläche sie möglicherweise verwenden. Kommunikationsfähigkeiten waren offensichtlich für diese Aufgabe erforderlich. Es wurde in der Regel in einem Raum mit mehreren großen weißen Brettern durchgeführt und dauerte bis zu 2 Stunden.
Wir haben mehrere Personen mit diesem Verfahren eingestellt, und wenn sie die Aufgabe wirklich gut gemeistert haben, haben sie es wirklich gut für uns gemacht. Wenn sie marginal waren und wir beschlossen, sie trotzdem einzustellen (separates Thema), waren sie marginale Programmierer.
quelle
Ich verwende ein Problem, das für meine Programmierdomäne relevant ist.
Wenn ich Webanwendungen entwickle, möchte ich wissen, wie sie ein Webformular erstellen, mit dem Datensätze gelöscht werden, und wie sie beispielsweise den Datensatz aus der Datenbank entfernen. Dies sagt mir, ob sie grundlegende Datenbankprinzipien kennen, wie sie mit dem Benutzer interagieren, um das Löschen zu überprüfen, und ob sie wissen, was ein weiches Löschen ist.
Ich habe keinen Favoriten. Das Problem, das ich wähle, hängt stark vom jeweiligen Job ab.
Es ist mir egal, ob sie das Problem in einem Interview vollständig lösen können oder nicht, welche Technologien und Sprachen sie verwenden oder wie beschissen ihr Code auf einem Whiteboard aussieht. Ich suche ein Gedankenmuster; Ich möchte sehen, ob sie wissen, wie sie Probleme durchdenken und lösen können.
quelle
Mein Favorit war einer, den ein Freund von mir benutzt hat.
Es funktioniert gut, weil:
Da es sich um eine algorithmische Frage handelt, muss der Befragte in der Lage sein, zu denken und dann sein Denken zu erklären - damit Sie sehen können, wie sein Gehirn funktioniert.
Es ist sprachunabhängig.
Kaum jemand versteht es richtig (es gibt normalerweise einen Randfall, den er übersieht (1 oder 2 normalerweise), oder er handhabt keine negativen Zahlen, so dass man sieht, wie er mit Fehlern umgeht und dass ihm gesagt wird, dass er falsch liegt.
Die meisten tun dies als einfaches, aber sehr langsames Sieb (z. B. überprüfen 80% der Leute, ob n eine Primzahl ist, indem sie n durch alle ganzen Zahlen teilen, die kleiner als n sind), was Ihnen viel Raum für Gespräche darüber gibt, wie sie den Algorithmus verbessern könnten bei räumlichen / zeitlichen Kompromissen, z. B. "Warum teilen Sie eine Zahl durch 4, wenn Sie bereits wissen, dass sie nicht durch 2 teilbar ist?" oder "Sie haben herausgefunden, dass Sie nur durch alle Primzahlen dividieren müssen, die kleiner als sqrt (n) sind, aber dazu müssen Sie diese Zahlen irgendwo speichern. Was bedeutet das?")
Sie müssen nicht die richtige Antwort finden. Wenn jemand denken und erklären kann, ist er ein langer Weg, um ein guter Kandidat zu sein.
quelle
Etwas mit dem Namen aff_z, das Teil der C-Prüfungen meiner Ingenieurschule war und als "Dummy" -Test verwendet wurde, damit Schüler nach der Rückkehr aus dem Urlaub versagen den gesamten Test ungültig machen. Zwingt Sie dazu, schwachsinnige Details zu beachten. Ich habe es ein oder zwei Mal in Interviews wiederverwendet.
Wie auch immer ... Ich habe die genaue Formulierung vergessen, aber es war so etwas ...
Das Traurige ist, dass nicht nur einige Studenten extrem komplizierte Lösungen finden würden, wenn die Antwort ziemlich offensichtlich ist, sondern dass einige sogar scheitern würden.
Und ob Sie es glauben oder nicht, es geschah auch während der Interviews.
Es hat ziemlich viel Spaß gemacht, es in Interviews zu führen, da einige Bewerber anfingen, die möglichen Zweige zu schreiben und dann erkannten, was falsch ist (natürlich, wenn Sie sie nur mündlich fragen, ist es ziemlich verständlich, dass sie dies tun, wenn Sie sprechen ... aber wenn Sie gib es schriftlich, ich finde es rätselhaft ...)
Es ist dumm, aber ich denke, es ist ein minimalistisches Screening (ähnlich wie bei der Einstellung von JS-Programmierern immer gefragt wird, wie eine Variable deklariert werden soll und je nach ihrer Antwort, ob die Verwendung von var überhaupt einen Unterschied macht oder nicht. Sehr oft ein trauriger Moment, ehrlich.)
quelle
variablename = variablevalue;
" nicht bestanden hatten, während die Guten nur am Telefon oder persönlich lachten und mir direkt sagten, was die anderen mit oder ohne warenvar
).Es kommt wirklich darauf an, wonach Sie suchen. Als Organisation, die viel dynamische Webarbeit mit Bildern leistet, neige ich dazu, eine Geometrie-Frage zu stellen, die für den Job relevant ist. Auf jeden Fall neige ich dazu, eine Geometrie-Frage zu stellen, da ich es als guten Mathe-Test betrachte, der schön und visuell ist und dem Kandidaten die Fähigkeit zeigt, seine Arbeit visuell darzustellen und ein Problem methodisch zu bearbeiten.
Für fortgeschrittene Kandidaten stelle ich gelegentlich folgende Frage:
Für eine einfachere Frage gebe ich normalerweise die gleiche Art von Frage, benutze aber das Beispiel "Quadrat innerhalb eines Kreises innerhalb eines Quadrats". Obwohl dies sehr einfach ist, würde ich eine perfekte Algebra erwarten.
Darüber hinaus neige ich dazu, sie zu bitten, einen Algorithmus zum Erzeugen aller Kombinationen eines Datensatzes variabler Länge zu starten.
quelle
Die besten FizzBuzz- Antworten, die ich gesehen habe, sind:
SQL Server 2008
C # (einfach)
C # (clever)
quelle
Ich suche nach ein paar Dingen in Kandidaten, die ich interviewt habe. Aus einem Grund, den ich online nicht beschreiben kann, bekommen wir ziemlich schlechte Kandidaten, und ich habe damit gerechnet, also bin ich ziemlich locker mit ihnen. Trotzdem suche ich:
Designbewusstsein.
"Zeigen Sie mir die Tabellenstruktur für ein Adressbuchprogramm mit Kontakten mit Vor- und Nachnamen an, die mehrere Telefonnummern mit einer Beschreibung der Nummer enthalten können (Zelle / Zuhause / Arbeit / etc.)"
Ich suche hier kein UML 2.0-Spezifikationsdiagramm, hier ist ein einfaches Blasendiagramm in Ordnung. Solange es vernünftig ist.
Kenntnisse im Umgang mit einer Datenbank (zB SQL)
Testkenntnisse
Angenommen, es gibt eine Methode mit der Signatur
public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)
, die die Ergebnisse Ihrer Abfrage von früher zurückgibt. Angenommen, wenn Sie der Methode eine Null übergeben, wird eine NullReferenceException ausgelöst. Schreiben Sie einen Test, um diese Funktionalität zu demonstrieren.Schreiben Sie einen Test, der zeigt, dass GetPhoneNumbers eine private Telefonnummer von (123)456-7890 für jemanden mit dem Nachnamen "smith" zurückgibt.
Kenntnisse, wie man Code schreibt
Implementieren Sie eine Methode, die die Anforderungen der von Ihnen geschriebenen Tests erfüllt.
Angesichts der Anzahl und Qualität der Bewerber, die wir bekommen haben, habe ich alle interviewt, die sich jemals ernsthaft beworben haben. Ich habe niemanden eingestellt.
quelle
Ich lasse sie normalerweise ein Blockdiagramm des letzten Systems skizzieren, an dem sie gearbeitet haben, und frage sie nach den Beziehungen zwischen den Blöcken und lasse sie dann den Block ausarbeiten, an dem sie arbeiten / verantwortlich sind. Sie können aus dieser Übung viele Dinge lernen, wie zum Beispiel, wie man über seinen kleinen Bereich hinausschaut, wie wichtig es für ihn ist, zu wissen, wo er handelt. Sie können auch lernen, welche Rolle er gespielt hat, ob es sich um einen Schlüssel oder eine Seite handelt Rolle.
quelle
Schreiben Sie einen Algorithmus für das folgende Problem: Geben Sie bei einer gegebenen Zahl n die Gesamtzahl der (eindeutigen) Binärbäume mit n Knoten aus.
Für n = 0 und n = 1 lautet die Antwort also 1. Für n = 2 haben Sie 2: den Wurzelknoten und dann den zweiten Knoten entweder links oder rechts.
Sie erhalten Einblick in Designtechniken und können prüfen, ob diese an Rekursion oder Memoisierung oder an die dynamische Programmierlösung denken.
[Siehe auch diese StackOverflow- Diskussion für den verwandten, aber unterschiedlichen Fall von Binärsuchbäumen.]
quelle
Wenn ich einen Softwareentwickler interviewen würde, würde ich ihn bitten, eine Software zu entwerfen und die Hardwareanforderungen zu beschreiben, um doppelte Einträge aus einer beliebig großen Datei zu entfernen, die in jeder Zeile einen vollständigen Namen enthält. Ich lasse einige Teile der Problembeschreibung zielstrebig. Dann fordere ich ihn auf, herauszufinden, ob er die Analyse und Klärung von Anforderungen, verschiedene Kompromisse, Datenstrukturen und -algorithmen, E / A (Sekundärspeicher), Software- und Hardwaretechnologien, Skalierbarkeit usw. versteht.
Ich denke, es ist ein kleines, aber herausforderndes Problem, das die Kenntnisse und Fähigkeiten des Bewerbers in vielen Bereichen der Datenverarbeitung offenbart.
quelle
Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence
Viele Jungs könnten sich daran halten. Wenn eine Lösung angegeben wird, wird normalerweise eine Rekursion verwendet. Nachdem:
Implement the same via 'for'-loop
Ich kann Ihnen nicht sagen, wie viele Stipendiaten beide Aufgaben nicht erfüllen - 50% der Kandidaten.
Deswegen mag ich es :)
quelle
fib(n)=round(power(PHI,n)/SQRT5)
. PHI und SQRT5 sind Konstanten, die den Goldenen Schnitt (1.618 ...) bzw. die Quadratwurzel von 5 darstellen.Für Datenbanken gehe ich mit:
Schreiben Sie mir eine SQL-Anweisung, die eine Tabelle wie diese anhand des Namens desupliziert (und es ist mir egal, welche ID ich zurückerhalte, aber welche zurückgegeben wird, muss für diesen Namen gültig sein). Wenn die Tabelle mit dem richtigen SQL-Code versehen ist, sieht sie folgendermaßen aus:
Ich mag es weil:
(Hier finde ich, dass es einen ganz trivialen Weg gibt, und ich habe es die ganzen Jahre über kompliziert).
quelle
SELECT min(ID), Name FROM Things GROUP BY Name
würde funktionieren, oder?HAVING count(Name) > 1
, aber in Ihrer Beispielantwort sollten Bodkin Van Horn, Hot Shot, Snimm und Dave weggelassen werden.DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
. Haben Sie eine bevorzugte Lösung?Mein Lieblingsproblem beim C ++ - Whiteboard ist die Implementierung des Kandidaten
Daraus kann ich lernen
quelle
Wie würden Sie ein Standardkartenspiel mit 52 Karten darstellen? Jede Programmiersprache ist in Ordnung. Wie würden Sie die Karten mischen?
quelle
Am liebsten frage ich zuerst den Prototyp von printf. Dann implementieren Sie printf, wenn Sie ein Low-Level-API printc (char c) erhalten, das ein Zeichen druckt. Gibt alle möglichen interessanten Antworten aus, als wäre der Stack Teil der CPU. Wie Sie vielleicht erraten haben, bin ich von einem C und einem eingebetteten Hintergrund.
quelle
varargs()
Funktion aufrufen oder so. Hab ich recht? Ich habe es nur einmal getan, um zu sagen, dass ich es vor einiger Zeit getan habe.Sie haben eine Schüssel mit 200 Fischen. Von diesen Fischen sind 99% keine Guppys. Wie viele Fische sollten Sie entfernen, damit 2% der verbleibenden Fische Guppys sind. Zeigen Sie Ihre Arbeit.
Hier geht es um verwirrende Anforderungen. Es wird gesagt, dass auf diese Weise die Perspektiven während derselben Frage mehrmals geändert werden. Es ist beabsichtigt zu sehen, ob sie herausfinden können, was wirklich los ist.
Sie wären überrascht, wie viele Leute es falsch verstehen.
quelle
answer = 100
. [Vorausgesetzt, Sie können die anderen Fische selektiv auswählen. Wenn Sie Guppys entfernen, gibt es andere Antworten.] Gute Frage, Sie wären überrascht, wie wenig Leute damit umgehen, obwohl es für einen Programmierer ein Kinderspiel sein sollte.Ich habe ein paar Favoriten, aber hier sind ein paar, die fast immer auftauchen. Die meiste Zeit mache ich technische Interviews in der Endrunde (C ++), also bevorzuge ich längere und offenere Fragen, die zu neuen Interessensgebieten führen. Es gibt keine "richtige" Antwort, nur eine Öffnung für andere Gespräche.
1) Implementieren eines gemeinsamen Basiszeigers, Erklärungen, wo es Mängel im Vergleich zu den gemeinsamen Zeigern von tr1 oder boost in ihrer Implementierung gibt, wie sie verwendet werden sollten usw.
2) Eine Codeüberprüfung. Für erfahrene Mitarbeiter erwarten wir, dass sie in der Lage sind, einen bereitgestellten Code auf Designprobleme, Fehler, Codierungshorror und potenzielle Wartbarkeitsprobleme zu überprüfen. Natürlich auch, wie sie das beheben würden; und manchmal, wie sie diese Nachricht an den Junior-Entwickler weitergeben, den sie abschießen.
quelle
Eine Frage, die ich verwendet habe, seit sie bei mir verwendet wurde, ist die folgende:
Ein großer Teil des Grundes, warum ich es benutzt habe, ist auf die Tatsache zurückzuführen, dass Sie dann die Lösung nehmen und sich in verschiedene Richtungen bewegen können:
Ihre Antworten auf diese Fragen können Ihnen Aufschluss darüber geben, wie sie auf sich ändernde Anforderungen reagieren und ob sie Leistungsaspekte erkennen können. Ein starker Kandidat könnte mit einer Frage antworten, was die Funktion benötigt und wie oft sie aufgerufen werden würde.
In eine andere Richtung bewegen:
Ich benutze dies, um ihr Querdenken zu überprüfen. Da die Berechnung von Primzahlen mit zunehmendem Maximalwert langsam sein kann, ist es manchmal sinnvoller, nur eine berechnete oder vorberechnete Nachschlagetabelle zu verwenden, die auf der Grundlage des zu lösenden Problems angepasst wird.
quelle
Hier ist eine, die zum Nachdenken anregt: Es ist unkompliziert, erfordert ein wenig Mathematik und überprüft die Kenntnisse des Kandidaten über das grundlegende Computerdesign (Überlauf, numerische Darstellung usw.):
Schreiben Sie ein Programm (oder eine Prozedur), das / die ein Paar Ganzzahlen X, Y als Eingabe verwendet und festlegt, ob X * Y gleichmäßig durch 10 teilbar ist auf Ihrer Maschine.
Musterlösung:
quelle
Füllen Sie die folgende Methode aus: PS Ein Modus einer Zahl ist die Zahl (in der Liste), die am häufigsten vorkommt.
Dies ist zu sehen, dass Ihr Code effizient ist.
quelle
Wie würden Sie eine Ersatzmatrix darstellen, die relativ groß ist, z. B. 1000x1000, aber höchstens 100 Einträge ungleich Null enthält?
quelle