Conosco JavaScript davvero bene, ma bombardo le interviste di codifica [chiuso]


33

Quindi attualmente sono a caccia di una nuova posizione come sviluppatore front-end. Conosco molto bene JavaScript e posso parlare poeticamente di chiusure, curricula, ereditarietà prototipo, modelli di progettazione, prestazioni delle app e architettura generale del front-end. Ma ancora finisco per bombardare le interviste di lavoro. (Cordiali saluti, la maggior parte dei lavori per i quali sto intervistando sono per la costruzione di SPA con una sorta di framework MVC)

Di solito i test di codifica sono piccoli frammenti di codice di cose che non ho mai incontrato professionalmente. Come scrivere una funzione per risolvere una sorta di problema di matematica. A parte l'eredità imbarazzante di provare a scrivere il codice mentre si tiene il telefono in una mano e si vede uno sconosciuto vedere lo schermo e guardare ogni personaggio che si digita, di solito non vedo questo genere di cose nel mondo reale.

È una serie di competenze serie che mi manca o sono gli intervistatori che mi fanno domande irrilevanti. Immagino che dovrei lavorare sulla mia programmazione funzionale e sui trucchi dell'algoritmo ma non ho trovato molte buone risorse sul web (o in stampa) qualche suggerimento?


4
Prova Project Euler per alcuni esempi.
Peter K.,

11
E ottenere un kit vivavoce per il tuo telefono?
AakashM,

Perché stai facendo un test di codifica sul tuo telefono? Ci si aspetta che lavori così quando ottieni il lavoro?
Burhan Ali,

2
@BurhanAli, il telefono è per parlare, e questo è standard per la prima fase del colloquio.
Greenoldman,

3
Sì, penso che alcuni dei test di sceen al giorno d'oggi siano cazzate complete. In particolare disprezzo i test "da portare a casa", in cui ti dicono che si può fare qualcosa in un'ora, ma in realtà ci vorrebbe mezza giornata o più per farlo bene. Mi rifiuto di farlo apertamente. Sei davvero per il capriccio dell'intervistatore. Alcuni di loro escogitano buoni test che valutano le abilità del mondo reale. Altri intervistatori non sanno che diavolo stanno facendo e hanno i loro programmi e insicurezze personali.
Ringo,

Risposte:


52

La scrittura del codice è solo una parte del processo di intervista.

La risoluzione effettiva del problema logico è solo una parte dell'attività di scrittura del codice.

Gli intervistatori vogliono essere sicuri che:

  • Puoi scrivere il codice. Molti candidati con esperienza professionale decennale in una lingua non sono in grado di scrivere alcun codice e questo test ha lo scopo di respingere quei candidati.

  • Pensi a un problema prima di scrivere il codice. Molti saltano alle loro tastiere, scrivono decine di righe di codice, poi scoprono di aver frainteso il problema originale, perché non si sono presi del tempo per pensarci.

  • Sei in grado di adattarti quando scrivi il codice. Supponiamo che tu abbia trovato una soluzione, ma quando hai iniziato a implementarla, sembrava che la tua prima idea non fosse la migliore; puoi passare rapidamente a uno migliore, eventualmente rifattorizzare il codice che hai scritto?

Ciò significa anche che tali interviste dovrebbero essere più interattive . Invece di digitare con una mano, acquista un kit vivavoce o chiama tramite Skype e usa un auricolare. Digita mentre digiti sul lavoro, commentando e spiegando cosa fai: improvvisamente diventerà molto meno imbarazzante.

Hai terminato la programmazione in coppia? In caso affermativo, la situazione del colloquio è molto simile, tranne per il fatto che l'intervistatore potrebbe non darti la sua opinione e non gli chiedi di cambiare tastiera quando hai finito.

Ecco alcuni esempi di un problema puramente matematico e di come mostra abilità non matematiche di uno sviluppatore.

Esempio 1: semplice esercizio di codifica

È necessario implementare il calcolatore dei numeri di Fibonacci in JavaScript. Dovresti essere in grado di cambiare l'indice. La sequenza di Fibonacci segue queste regole:

  1. I primi due numeri della sequenza sono 0 e 1,
  2. Ogni numero successivo è la somma dei due precedenti.

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

Hai tre minuti.

Qui, l'intervistatore vuole che tu pensi il più velocemente possibile, trovi la soluzione e la realizzi rapidamente. Tale esercizio non è correlato a ciò che fanno gli sviluppatori reali ed è molto più vicino a ciò che puoi trovare quando fai una laurea in CS, ma agli intervistatori piacciono questo genere di cose, quindi facciamolo. Inoltre, il vincolo di tempo rende impossibile eseguire qualsiasi test automatizzato, quindi l'intervistatore probabilmente non si aspetta questo da te.

“La descrizione dell'algoritmo mi fa pensare alla ricorsione. La seconda regola porta alla seguente funzione ricorsiva. "

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

console.log(fibonacci(10));

"Per terminare la ricorsione, aggiungeremo i casi speciali sostituendo il corpo della fibonaccifunzione."

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

"Fatto."

Conclusione

Come ho detto, tale esercizio non è completamente correlato al lavoro effettivo di uno sviluppatore. Lo rende insignificante? Non proprio, perché almeno dimostra che la persona:

  • È in grado di pensare a un problema. Alcuni candidati saranno totalmente persi e, sotto stress, ci vorrà più del tempo assegnato solo per pensare a un possibile modo di affrontare il problema.

  • Conosce la ricorsione o è in grado di aggirare la ricorsione attraverso un normale ciclo. Successivamente, l'intervistatore può chiedere se ci sono modi di usare / non usare la ricorsione e quali sono i vantaggi / gli svantaggi della ricorsione.

  • Conosce le basi del linguaggio di programmazione. Non importa se la persona utilizzata switch, una clausola di guardia, un condizionale o un dizionario : a seconda dello sfondo, candidati diversi sceglieranno strumenti diversi per realizzare la stessa cosa.

  • Rimane concentrato sul problema, senza apportare elementi come unit test, scalabilità o prestazioni. L'intervistatore può quindi chiedere perché per quanto riguarda le prestazioni, la funzione sopra descritta è terribile, aspettandosi che il candidato spieghi cosa si dovrebbe fare per portare le prestazioni a un livello ragionevole.

Esempio 2: domande difficili

È necessario implementare il calcolatore dei numeri di Fibonacci in JavaScript. Dovrebbe essere il più veloce possibile. Dovresti essere in grado di cambiare l'indice che va da 0 a 100. La sequenza di Fibonacci segue queste regole:

  1. I primi due numeri della sequenza sono 0 e 1,
  2. Ogni numero successivo è la somma dei due precedenti.

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

Hai tre minuti.

Ora, abbiamo un vincolo interessante che dimostra che l'intervistatore non si preoccupa davvero della capacità del candidato di risolvere i problemi, ma piuttosto della sua capacità di indovinare quali modi sono più veloci di altri.

Quelle domande difficili di solito invitano risposte difficili. Qui, dato il vincolo di tempo, non c'è modo di fare più implementazioni, confrontarle, profilare la più veloce e arrivare a una soluzione ottimale.

Invece, che dire di:

“Let Me Google "numeri di Fibonacci First" ... Questo sembra essere molto promettente. Con un'espressione regolare semplice (che sarebbe un ossimoro), possiamo costruire un elenco di valori separati da virgole. ”

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

"Finalmente, il programma stesso."

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));

Conclusione

Le domande difficili invitano le risposte difficili. Non essere eroico e non iniziare il benchmarking e la profilazione quando hai solo tre minuti. Pensa a modi intelligenti per risolvere il problema durante l'utilizzo della tua esperienza. La mia esperienza mi dà un suggerimento che l'utilizzo di una mappa potrebbe essere più veloce rispetto al calcolo del numero. Potrebbe essere sbagliato, ma questo tentativo dovrebbe essere previsto dato il limite di tempo.

Conoscere i tuoi strumenti aiuta anche ed è una parte essenziale delle competenze degli sviluppatori: senza conoscere le espressioni regolari, spenderei i tre minuti assegnati a Google per un elenco separato da virgole o inizierei a scrivere un parser che costruirà l'array di cui ho bisogno.

Ricorda, un buon sviluppatore non è uno che inizia subito a programmare, ma che sa come evitare i codici quando è disponibile un'opportunità migliore. Alcuni intervistatori non esiteranno a darti incarichi che sembrano codificanti, ma che non richiedono quasi nessun codice.

Esempio 3: sviluppo completo dell'applicazione

Devi implementare la sequenza di Fibonacci in JavaScript. La lunghezza della sequenza viene determinata durante l'esecuzione del programma. La sequenza segue queste regole:

  1. I primi due numeri della sequenza sono 0 e 1,
  2. Ogni numero successivo è la somma dei due precedenti.

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

L'applicazione deve essere presentata come una pagina Web, consentendo all'utente di specificare la lunghezza della sequenza attraverso un campo di input.

Hai un'ora.

Iniziamo.

“La sequenza di esempio è molto utile, poiché mi permetterà di avere un sacco di test unitari per garantire che la mia implementazione non sembri completamente sbagliata. In generale, utilizzo Mocha per node.js o QUnit per JavaScript lato client, ma qui, per semplicità, lancerò un sacco di funzioni di test. ”

“Comincio creando index.htme fib.jsfile. Quindi, riempio index.htmcon un codice davvero minimalista e non conforme a W3C (possiamo tornare a questo in seguito se sei interessato anche alle mie competenze HTML). ”

<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>

"Ora scriviamo del codice che chiamerà la funzione del generatore di Fibonacci e mostrerà i risultati."

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
    };
}());

“È ora di eseguire il codice per la prima volta e ... non funziona. Non succede nulla. Perché?"

“OK, fibonacci.init();alla fine ho dimenticato . L'ho aggiunto e ancora non succede nulla, mentre almeno dovrebbe visualizzare il messaggio nella console. Aspetta, giusto, non lo è onclick, ma click; Uso JQuery così spesso che inizio a dimenticare i nomi degli eventi in JavaScript. "

"Aggiungiamo alcuni test."

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));
};

"Il confronto di array può essere complicato, quindi copio e incolla il Array.prototype.equalscodice da questa risposta ."

"Ora che eseguiamo l'applicazione, viene visualizzato:"

L'attuale [1, 2, 3] è diverso dall'aspettato [0].

"Il test ha avuto esito negativo, il che era molto atteso, data la nostra effettiva implementazione ( return [1, 2, 3];) della sequenza di Fibonacci. È ora di cambiare questo. "

"Dall'affermazione originale, la sequenza di Fibonacci inizia [0, 1], quindi computediventa:"

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

"Ciò consente di superare il primo test e ora possiamo scrivere il secondo."

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

"Non riesce, quindi torniamo a computee modificarlo."

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

"Ora entrambi i test passano ed è tempo di passare a casi non marginali."

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;
};

"Ora tutti e tre i test passano, tranne per il fatto che il risultato non sembra giusto per lunghezze maggiori come 100. Per ottenere i risultati giusti, avremmo dovuto usare una libreria di precisione arbitraria . Ci sono anche cose da migliorare. Ad esempio, le convenzioni di denominazione a volte sono troppo sbagliate (che cos'è fib?). Anche il codice JavaScript relativo all'HTML dovrebbe andare a un oggetto diverso, oltre al codice di prova. Inoltre, non ho testato compute(0)e non ho verificato gli input. "

Conclusione

Seguendo l'esempio, potresti vedere l'interazione prevista durante un'intervista. Non tutto è andato liscio (ho fatto diversi errori all'inizio che mi hanno portato a una situazione imbarazzante in cui non succede nulla quando eseguo l'applicazione), e l'approccio originale era lame se dobbiamo supportare una lunga sequenza, ma ho raggiunto per mostrare che:

  • Sono in grado di gestire diversi problemi,
  • Uso lo sviluppo test-driven, la sequenza di Fibonacci è un'ottima opportunità per questo,
  • Copia-incolla il codice quando l'origine è affidabile e scriverlo da zero sembra estremamente complicato e soggetto a errori,
  • Non faccio troppo affidamento su librerie come JQuery,
  • Ho scelto l'ambito giusto: poiché l'intervistatore vuole verificare le mie abilità JavaScript, non perderò tempo a scrivere HTML perfetto e pulito: non passare il tempo qui consente di dedicare più tempo alla scrittura di unit test,
  • So quando finire e dire che ho finito, tenendo presente che un sacco di cose non sono perfette (come quelle compute(0)che falliranno, ma non importa per la demo).

Questo è esattamente ciò che un intervistatore dovrebbe aspettarsi da te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.