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:
- I primi due numeri della sequenza sono 0 e 1,
- 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 fibonacci
funzione."
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:
- I primi due numeri della sequenza sono 0 e 1,
- 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:
- I primi due numeri della sequenza sono 0 e 1,
- 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.htm
e fib.js
file. Quindi, riempio index.htm
con 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.equals
codice 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 compute
diventa:"
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 compute
e 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.