Ich kenne JavaScript sehr gut, aber ich bombardiere Coding-Interviews [geschlossen]

33

Also bin ich gerade auf der Suche nach einer neuen Position als Front-End-Entwickler. Ich kenne JavaScript sehr gut und kann mich poetisch mit Closures, Currying, prototypischer Vererbung, Entwurfsmustern, App-Leistung und der gesamten Front-End-Architektur auseinandersetzen. Trotzdem bombardiere ich immer noch Vorstellungsgespräche. (Zu Ihrer Information: Die meisten Jobs, für die ich ein Vorstellungsgespräch führe, sind für die Erstellung von SPAs mit einer Art MVC-Framework.)

Normalerweise sind die Codierungstests kleine Codeausschnitte von Dingen, die mir beruflich nie begegnen. Wie schreiben Sie eine Funktion, um eine Art mathematisches Problem zu lösen. Abgesehen von der Unbeholfenheit, zu versuchen, zu codieren, während Sie das Telefon in einer Hand halten und einen Fremden Ihren Bildschirm sehen und jedes Zeichen sehen, das Sie eingeben, sehe ich dieses Zeug in der realen Welt normalerweise nicht.

Ist dies eine ernsthafte Fähigkeit, die mir fehlt, oder stellen mir die Interviewer irrelevante Fragen? Ich denke, ich sollte an meinen funktionalen Programmier- und Algorithmus-Chops arbeiten, aber ich habe im Internet (oder in gedruckter Form) keine guten Ressourcen gefunden.

Mike Fisher
quelle
4
Probieren Sie Project Euler für einige Beispiele.
Peter K.
11
Und eine Freisprecheinrichtung für Ihr Handy bekommen?
AakashM
Warum machst du einen Codierungstest auf deinem Handy? Wird von Ihnen erwartet, dass Sie so arbeiten, wenn Sie den Job bekommen?
Burhan Ali
2
@BurhanAli, Telefon ist zum Sprechen da, und dies ist Standard für die erste Phase des Interviews.
Greenoldman
3
Ja, ich denke, einige der Szenetests sind heutzutage völliger Quatsch. Ich verachte besonders die "Take-Home" -Tests, bei denen angegeben wird, dass in einer Stunde etwas getan werden kann, aber in Wirklichkeit würde es einen halben Tag oder länger dauern, um es richtig zu machen. Ich weigere mich, das direkt zu tun. Sie sind wirklich auf die Laune des Interviewers. Einige von ihnen denken sich gute Tests aus, die reale Fähigkeiten bewerten. Andere Interviewer wissen nicht, was zum Teufel sie tun und haben ihre eigenen persönlichen Pläne und Unsicherheiten.
Ringo

Antworten:

52

Das Schreiben von Code ist nur ein Teil des Interviewprozesses.

Das eigentliche Lösen des logischen Problems ist nur ein Teil der Code-Schreibaufgabe.

Interviewer möchten sicher sein, dass:

  • Sie können Code schreiben. Viele Kandidaten mit zehnjähriger Berufserfahrung in einer Sprache können überhaupt keinen Code schreiben, und dieser Test soll diese Kandidaten ablehnen.

  • Sie denken über ein Problem nach, bevor Sie Code schreiben. Viele sprangen zu ihren Tastaturen, schrieben zig Zeilen Code und stellten fest, dass sie das ursprüngliche Problem missverstanden hatten, weil sie sich keine Zeit nahmen, darüber nachzudenken.

  • Sie können sich beim Schreiben von Code anpassen. Angenommen, Sie haben eine Lösung gefunden, aber als Sie mit der Implementierung begannen, schien Ihre erste Idee nicht die beste zu sein. Kannst du schnell zu einem besseren wechseln und den Code, den du geschrieben hast, eventuell überarbeiten?

Dies bedeutet auch, dass solche Interviews interaktiver sein sollten . Kaufen Sie eine Freisprecheinrichtung oder rufen Sie über Skype an und verwenden Sie ein Headset, anstatt mit einer Hand zu tippen. Tippen Sie, während Sie bei der Arbeit tippen, während Sie kommentieren und erklären, was Sie tun: Es wird plötzlich viel unangenehmer.

Haben Sie die Paarprogrammierung durchgeführt? Wenn ja, ist die Interview-Situation sehr ähnlich, mit der Ausnahme, dass der Interviewer Ihnen möglicherweise nicht seine Meinung mitteilt und Sie ihn nicht auffordern, mit Ihnen die Tastatur zu tauschen, wenn Sie fertig sind.

Hier sind einige Beispiele für ein rein mathematisches Problem und wie es nicht-mathematische Fähigkeiten eines Entwicklers zeigt.

Beispiel 1: einfache Codierung Übung

Sie müssen den Fibonacci-Zahlenrechner in JavaScript implementieren. Sie sollten in der Lage sein, den Index zu ändern. Die Fibonacci-Sequenz folgt diesen Regeln:

  1. Die ersten beiden Zahlen der Folge sind 0 und 1,
  2. Jede nachfolgende Zahl ist die Summe der beiden vorhergehenden.

Beispiel: F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, F 10 = 55.

Sie haben drei Minuten.

Hier möchte der Interviewer, dass Sie so schnell wie möglich nachdenken, die Lösung finden und diese schnell umsetzen. Diese Übung hat nichts mit dem zu tun, was Entwickler tatsächlich tun, und kommt dem, was Sie bei einem CS-Abschluss finden, sehr viel näher, aber Interviewer mögen diese Art von Dingen. Außerdem ist es aus Zeitgründen unmöglich, automatisierte Tests durchzuführen, sodass der Interviewer dies wahrscheinlich nicht von Ihnen erwartet.

„Die Beschreibung des Algorithmus lässt mich über Rekursion nachdenken. Die zweite Regel führt zur folgenden rekursiven Funktion. “

var fibonacci = function (n) {
    return fibonacci(n - 2) + fibonacci(n - 1);
};

console.log(fibonacci(10));

"Um die Rekursion zu beenden, werden wir die Sonderfälle durch Ersetzen des fibonacciFunktionskörpers hinzufügen ."

switch (n) {
    case 0: return 0;
    case 1: return 1;
    default: return fibonacci(n - 2) + fibonacci(n - 1);
}

"Getan."

Fazit

Wie ich bereits sagte, ist eine solche Übung völlig unabhängig von der tatsächlichen Arbeit eines Entwicklers. Macht es es sinnlos? Nicht wirklich, denn zumindest zeigt es, dass die Person:

  • Kann über ein Problem nachdenken. Einige Kandidaten werden völlig verloren sein und unter Stress mehr als die zugewiesene Zeit in Anspruch nehmen, um über eine mögliche Herangehensweise an das Problem nachzudenken.

  • Kennt die Rekursion oder kann die Rekursion durch eine gewöhnliche Schleife umgehen. Später kann der Interviewer fragen, ob es Möglichkeiten gibt, die Rekursion zu verwenden / nicht zu verwenden, und welche Vor- / Nachteile die Rekursion hat.

  • Kennt die Grundlagen der Programmiersprache. Es spielt keine Rolle, ob die verwendete Person switcheine Schutzklausel, eine Bedingung oder ein Wörterbuch verwendet : Je nach Hintergrund wählen verschiedene Kandidaten unterschiedliche Tools aus, um dasselbe Ziel zu erreichen.

  • Konzentriert sich auf das Problem, ohne auf Unit-Tests, Skalierbarkeit oder Leistung zu verzichten. Der Interviewer kann dann fragen, warum die oben genannte Funktion in Bezug auf die Leistung schrecklich ist, und erwarten, dass der Kandidat erklärt, was getan werden sollte, um die Leistung auf ein angemessenes Niveau zu bringen.

Beispiel 2: knifflige Fragen

Sie müssen den Fibonacci-Zahlenrechner in JavaScript implementieren. Es sollte so schnell wie möglich sein. Sie sollten in der Lage sein, den Index zwischen 0 und 100 zu ändern. Die Fibonacci-Sequenz folgt diesen Regeln:

  1. Die ersten beiden Zahlen der Folge sind 0 und 1,
  2. Jede nachfolgende Zahl ist die Summe der beiden vorhergehenden.

Beispiel: F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, F 10 = 55.

Sie haben drei Minuten.

Nun haben wir eine interessante Einschränkung, die zeigt, dass es dem Interviewer nicht wirklich wichtig ist, ob der Kandidat Probleme lösen kann, sondern vielmehr, ob er erraten kann, welche Wege schneller sind als andere.

Diese kniffligen Fragen laden normalerweise zu kniffligen Antworten ein. Angesichts der Zeitbeschränkung gibt es hier keine Möglichkeit, mehrere Implementierungen vorzunehmen, sie zu bewerten, die schnellste zu profilieren und eine optimale Lösung zu finden.

Was ist stattdessen mit:

"Lassen Sie mich Google" Erste Fibonacci-Zahlen "... Das sieht vielversprechend aus. Mit einem einfachen (das wäre ein Oxymoron) regulären Ausdruck können wir eine durch Kommas getrennte Liste von Werten erstellen. “

sed -e "s;\([0-9]*\) \([0-9]*\);'\2',;g" fbncc10.txt | tr '\n' ' '

"Endlich das Programm selbst."

var map = ['0', '1', '1', '2', '3', '5', '8', '13', '21', '34', '55', '89', '144', '233', '377', '610', '987', '1597', '2584', '4181', '6765', '10946', '17711', '28657', '46368', '75025', '121393', '196418', '317811', '514229', '832040', '1346269', '2178309', '3524578', '5702887', '9227465', '14930352', '24157817', '39088169', '63245986', '102334155', '165580141', '267914296', '433494437', '701408733', '1134903170', '1836311903', '2971215073', '4807526976', '7778742049', '12586269025', '20365011074', '32951280099', '53316291173', '86267571272', '139583862445', '225851433717', '365435296162', '591286729879', '956722026041', '1548008755920', '2504730781961', '4052739537881', '6557470319842', '10610209857723', '17167680177565', '27777890035288', '44945570212853', '72723460248141', '117669030460994', '190392490709135', '308061521170129', '498454011879264', '806515533049393', '1304969544928657', '2111485077978050', '3416454622906707', '5527939700884757', '8944394323791464', '14472334024676221', '23416728348467685', '37889062373143906', '61305790721611591', '99194853094755497', '160500643816367088', '259695496911122585', '420196140727489673', '679891637638612258', '1100087778366101931', '1779979416004714189', '2880067194370816120', '4660046610375530309', '7540113804746346429', '12200160415121876738', '19740274219868223167', '31940434634990099905', '51680708854858323072', '83621143489848422977', '135301852344706746049', '218922995834555169026', '354224848179261915075'];

var fibonacci = function (n) {
    return map[n];
};

console.log(fibonacci(10));

Fazit

Heikle Fragen laden heikle Antworten ein. Sei nicht heroisch und beginne nicht mit Benchmarking und Profiling, wenn du nur drei Minuten Zeit hast. Überlegen Sie, wie Sie das Problem mit Ihrer Erfahrung lösen können. Meine Erfahrung gibt mir einen Hinweis, dass die Verwendung einer Karte möglicherweise schneller ist als die Berechnung der Zahl. Es kann falsch sein, aber dieser Versuch sollte angesichts der zeitlichen Beschränkung erwartet werden.

Die Kenntnis Ihrer Tools ist ebenfalls hilfreich und ein wesentlicher Bestandteil der Entwicklerfähigkeiten: Ohne Kenntnis der regulären Ausdrücke würde ich entweder die zugewiesenen drei Minuten für das Durchsuchen einer durch Kommas getrennten Liste aufwenden oder einen Parser schreiben, der das von mir benötigte Array erstellt.

Denken Sie daran, dass ein guter Entwickler nicht derjenige ist, der sofort mit dem Codieren beginnt, sondern der es versteht, das Codieren zu vermeiden, wenn eine bessere Gelegenheit zur Verfügung steht. Einige Interviewer zögern nicht, Ihnen Aufträge zu erteilen, die wie Codierungen aussehen, für die jedoch fast kein Code erforderlich ist.

Beispiel 3: alle Anwendungsentwicklung

Sie müssen die Fibonacci-Sequenz in JavaScript implementieren. Die Länge der Sequenz wird während der Ausführung des Programms festgelegt. Die Reihenfolge folgt diesen Regeln:

  1. Die ersten beiden Zahlen der Folge sind 0 und 1,
  2. Jede nachfolgende Zahl ist die Summe der beiden vorhergehenden.

Beispiel: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89.

Die Anwendung sollte als Webseite dargestellt werden, auf der der Benutzer die Länge der Sequenz über ein Eingabefeld festlegen kann.

Sie haben eine Stunde Zeit.

Lasst uns beginnen.

„Die Beispielsequenz ist sehr hilfreich, da ich dann eine Reihe von Komponententests durchführen kann, um sicherzustellen, dass meine Implementierung nicht völlig falsch aussieht. Im Allgemeinen verwende ich Mocha für node.js oder QUnit für clientseitiges JavaScript, aber hier werde ich der Einfachheit halber nur ein paar Testfunktionen ausgeben. “

„Ich beginne mit der Erstellung index.htmund fib.jsDateien. Dann fülle ich mich index.htmmit wirklich minimalistischem und nicht W3C-konformem Code (wir können später darauf zurückkommen, wenn Sie sich auch für meine HTML-Kenntnisse interessieren). “

<label>Length</label> <input id="length" value="15" />
<input id="compute" type="button" value="Compute" />
<div id="result" style="font-weight:bold;"></div>
<div id="tests"></div>
<script src="fib.js"></script>

"Schreiben wir nun einen Code, der die Fibonacci-Generatorfunktion aufruft und die Ergebnisse anzeigt."

fibonacci = (function () {
    var compute,
        init;

    compute = function (length) {
        // TODO: Implement Fibonacci sequence.
        return [1, 2, 3];
    };

    init = function () {
        var button = document.getElementById('compute');
        button.addEventListener('onclick', function () {
            var length = parseInt(document.getElementById('length').value, 10),
                result;

            console.log(
                'Computing Fibonacci sequence of length ' + length + '.'
            );

            result = compute(length);
            document.getElementById('result').innerText = result.join(', ');
        });
    };

    return {
        compute: compute,
        init: init
    };
}());

„Es ist Zeit, den Code zum ersten Mal auszuführen und ... es funktioniert nicht. Nichts passiert. Warum?"

„OK, ich habe das fibonacci.init();am Ende vergessen . Ich habe es hinzugefügt und trotzdem passiert nichts, während es zumindest die Nachricht in der Konsole anzeigen sollte. Warten Sie, richtig, es ist nicht onclick, aber click; Ich benutze JQuery so oft, dass ich die Namen der Ereignisse in einfachem JavaScript vergesse. “

"Lass uns ein paar Tests hinzufügen."

ensureAreEqual = function (expected, actual) {
    var testResultsContainer = document.getElementById('tests');
    testResultsContainer.innerText += (expected.equals(actual) ?
            '.' :
            ('Actual [' + actual.join(', ') + '] is different from ' +
             'expected [' + expected.join(', ') + '].'));
};

test = function () {
    ensureAreEqual([0], compute(1));
};

"Das Vergleichen von Arrays kann schwierig sein. Deshalb kopiere ich einfach den Array.prototype.equalsCode aus dieser Antwort ."

"Nachdem wir die Anwendung ausgeführt haben, wird Folgendes angezeigt:"

Tatsächlich [1, 2, 3] unterscheidet sich von erwartet [0].

„Der Test ist fehlgeschlagen, was angesichts unserer tatsächlichen Implementierung ( return [1, 2, 3];) der Fibonacci-Sequenz sehr erwartet wurde . Es ist Zeit, das zu ändern. “

„Von der ursprünglichen Anweisung beginnt Fibonacci - Folge durch [0, 1], so computewird:“

compute = function (length) {
    var fib = [0];
    return fib;
};

"Dadurch ist es möglich, den ersten Test zu bestehen, und wir können jetzt unseren zweiten schreiben."

ensureAreEqual([0, 1], compute(2));

"Es schlägt fehl, also kehren wir zurück computeund ändern es."

compute = function (length) {
    var fib = [0, 1];
    return length === 1 ? [0] : fib;
};

"Jetzt sind beide Tests erfolgreich, und es ist an der Zeit, sich auf Fälle zu konzentrieren, bei denen es sich nicht um Edge-Fälle handelt."

compute = function (length) {
    var fib = [0, 1],
        i,
        next,
        current = 1,
        previous = 0;

    for (i = 2; i < length; i += 1) {
        next = current + previous;
        previous = current;
        current = next;
        fib.push(next);
    }

    return length === 1 ? [0] : fib;
};

„Alle drei Tests bestehen jetzt, mit der Ausnahme, dass das Ergebnis bei größeren Längen wie 100 nicht richtig aussieht. Um diese Ergebnisse richtig darzustellen , hätten wir eine beliebige Präzisionsbibliothek verwenden müssen . Es gibt auch Dinge zu verbessern. Beispielsweise sind Namenskonventionen manchmal zu schlecht (was ist das fib?). HTML-bezogener JavaScript-Code sollte auch zu einem anderen Objekt gehen und den Code testen. Außerdem habe ich compute(0)die Eingaben nicht getestet und auch nicht überprüft. “

Fazit

Wenn Sie durch das Beispiel gehen, sehen Sie möglicherweise die während eines Interviews erwartete Interaktion. Nicht alles verlief reibungslos (ich habe am Anfang mehrere Fehler gemacht, die mich zu einer peinlichen Situation führten, in der beim Ausführen der Anwendung nichts passiert), und der ursprüngliche Ansatz war lahm, wenn wir eine große Sequenzlänge unterstützen müssen, aber ich habe es geschafft zu zeigen, dass:

  • Ich kann verschiedene Probleme behandeln,
  • Ich benutze testgetriebene Entwicklung, Fibonacci-Sequenz ist eine ausgezeichnete Gelegenheit dafür,
  • Ich kopiere und füge Code ein, wenn die Quelle vertrauenswürdig ist und das Schreiben von Grund auf kompliziert und fehleranfällig erscheint.
  • Ich verlasse mich nicht zu sehr auf Bibliotheken wie JQuery,
  • Ich habe den richtigen Umfang gewählt: Da der Interviewer meine JavaScript-Kenntnisse überprüfen möchte, werde ich keine Zeit damit verschwenden, perfektes und sauberes HTML zu schreiben.
  • Ich weiß, wann ich fertig sein muss und sage, dass ich fertig bin, wobei ich bedenke, dass einige Dinge nicht perfekt sind (wie compute(0)das, was scheitern wird, aber für die Demo spielt es keine Rolle).

Genau das sollte ein Interviewer von Ihnen erwarten.

Arseni Mourzenko
quelle