Proprio come dice il titolo, qual è il tuo problema di intervista sulla lavagna preferito e perché si è dimostrato efficace per te?
Junior, senior, Java, C, Javascript, PHP, SQL, pseudo-codice, ecc.
Proprio come dice il titolo, qual è il tuo problema di intervista sulla lavagna preferito e perché si è dimostrato efficace per te?
Junior, senior, Java, C, Javascript, PHP, SQL, pseudo-codice, ecc.
Risposte:
Chiedo al candidato di progettare una soluzione a un problema che ho effettivamente riscontrato nel mio lavoro quotidiano. In questo modo, provo a creare un dialogo tra me e il candidato. Cerco di discutere del progetto che sta costruendo come se non avessi mai pensato al problema prima.
Quello che cerco di valutare è se siamo in grado di capirci l'un l'altro e se possiamo parlare di un problema tecnico senza confusione.
(Per uno sviluppatore desktop java)
Progettare un'API per gestire la cronologia di navigazione di un browser Web (pagina precedente, pagina successiva, elencare le 10 pagine precedenti) e che può essere riutilizzabile in molte parti dell'applicazione (qui fornisco esempi concreti nella nostra app). Quindi, disegna un'implementazione.
Mi piace questo, perché è abbastanza semplice, è facile da illustrare, può essere risolto passo dopo passo (aggiungi comportamenti aggiuntivi senza rompere tutto), consente di parlare di casi limite e gestione degli errori e consente anche di parlare di dati strutture.
Ho trovato questo estremamente illuminante quando intervista i candidati e filtra quelli senza affari. È simile nella complessità a Fizz Buzz, ma si concentra sulle competenze del database.
Assuming the following basic table structure
Documents (DocID, DocDate)
Keywords (KeyWordID, KeyWord)
DocumentKeywords (DocID,KeywordID)
Write a query to return the following:
Part 1: Documents with a DocDate after 4/1/1995
Part 2: Documents that contain the keyword "Blue"
Part 3: Documents that contain the either the keyword "Blue" or "Yellow"
Part 4: Documents that contain the both the keywords "Blue" and "Yellow"
Ho lasciato che lo scrivessero in qualsiasi variante SQL desiderassero e non sono troppo esigente per problemi di sintassi minori. Voglio principalmente sapere che comprendono i concetti base di DB relazionale.
La maggior parte dei candidati può superare la parte 3 senza problemi. Sareste sorpresi da quanti pensano che la risposta alla parte 4 sia solo quella di cambiare l'operatore da OR a AND nella clausola where.
"Disegna per me sulla lavagna il disegno dell'ultimo progetto a cui hai lavorato, senza rivelarmi alcun dettaglio sensibile."
Implementare strcpy
, strcmp
e gli amici.
atoi()
.
strdup()
.
strrev()
la funzione di inversione delle stringhe. La mia soluzione alla lavagna bianca li ha impressionati e sto facendo un lavoro ora.
Il mio preferito che comprende alcune discipline è contare il numero di nodi in un albero binario data l'interfaccia (in C #):
public interface IBinaryTree<T>
{
IBinaryTree<T> Left
{
get;
}
IBinaryTree<T> Right
{
get;
}
T Data
{
get;
}
// Other properties and methods not germane to this problem.
}
e solo per divertimento, ecco l'implementazione, sebbene l'intervistato non debba vederlo.
public sealed class BinaryTree<T> : IBinaryTree<T>
{
private readonly IBinaryTree<T> left;
private readonly IBinaryTree<T> right;
private readonly T data;
public BinaryTree(
IBinaryTree<T> left,
IBinaryTree<T> right,
T data)
{
this.left = left;
this.right = right;
this.data = data;
}
public IBinaryTree<T> Left
{
get
{
return this.left;
}
}
public IBinaryTree<T> Right
{
get
{
return this.right;
}
}
public T Data
{
get
{
return this.data;
}
}
// Other properties and methods not germane to this problem.
}
e la classe assistente:
public static class BinaryTreeNodeCounter
{
public static int CountNodes<T>(this IBinaryTree<T> tree)
{
// TODO: What goes here?
}
}
La soluzione che mi piace vedere è questa:
public static class BinaryTreeNodeCounter
{
public static int CountNodes<T>(this IBinaryTree<T> tree)
{
return tree == null
? 0
: 1 + tree.Left.CountNodes() + tree.Right.CountNodes();
}
}
Come dimostra la conoscenza di:
Sono due domande che hanno suscitato interessanti discussioni sulla lavagna per me
Iniziano in modo semplice e diventano progressivamente più complessi.
Non mi piace usare un puzzle o una domanda di design come una domanda sulla lavagna. Preferisco domande chiare, semplici, che mettono alla prova la capacità del candidato di scrivere del codice. I miei preferiti sono:
1) Scrivi una funzione per invertire un elenco collegato singolarmente. (Ci vuole un po 'prima che si rendano conto di aver bisogno di 3 puntatori.)
2) Dato un albero binario, trova la profondità dell'albero binario. (Questa domanda mette alla prova la loro capacità di scrivere codice ricorsivo. Mi consente di verificare se il loro caso base è intatto.)
3) Scrivi una procedura per la ricerca binaria di un array di numeri interi. (Come dice Jon Bentley (in Programming Pearls), molte persone tendono a fare errori scrivendo la ricerca binaria. Si può quindi continuare a trovare bug, scrivere casi di test, scorrere il codice, ecc.)
L'abbiamo usato in un'azienda per cui ho lavorato.
Abbiamo consegnato al candidato un pezzo di carta utilizzato per il monitoraggio del tempo. Era una vera scheda attività utilizzata da una o dalle nostre divisioni. Abbiamo chiesto al candidato di guidarci attraverso il processo di progettazione per creare uno strumento di monitoraggio del tempo migliore. Nessun limite, non ho detto quale lingua ecc., Voglio solo vedere quanto è stato bravo il candidato a "ciclo di vita completo". Ci ha dato una visione reale di come hanno raccolto i requisiti. Come hanno strutturato le tabelle del database, che tipo di interfaccia utente potrebbero fare. Le abilità comunicative erano ovviamente necessarie per questo compito. Di solito veniva fatto in una stanza con diverse grandi lavagne bianche e durava fino a 2 ore.
Abbiamo assunto diverse persone usando questo processo e se hanno fatto davvero bene il compito hanno fatto davvero bene per noi. Se erano marginali e decidemmo di assumerli comunque (argomento separato) erano programmatori marginali.
Uso un problema rilevante per il mio dominio di programmazione.
Se sviluppo applicazioni Web, voglio vedere come potrebbero redigere un modulo Web che elimina i record e quale approccio potrebbero adottare per rimuovere il record dal database, ad esempio. Questo mi dice se conoscono i principi di base del database, come interagiscono con l'utente per verificare la cancellazione e se sanno cos'è una cancellazione soft.
Non ho un preferito. Il problema che scelgo varierà notevolmente a seconda del lavoro.
Non mi interessa se riescono a risolvere il problema completamente o meno in un'intervista, quali tecnologie e lingue usano o quanto il loro codice sia scadente su una lavagna. Sto cercando un modello di pensiero; Voglio vedere se sanno come riflettere e risolvere i problemi.
Il mio preferito era uno dei miei amici.
Scrivimi una funzione per generare / stampare / memorizzare i primi "n" numeri primi e poi spiegare come funziona e quanto è efficiente.
Funziona bene perché:
È una domanda algoritmica, quindi richiede che l'intervistato sia in grado di pensare e quindi spiegare il proprio pensiero, in modo da poter vedere come funziona il loro cervello.
È indipendente dalla lingua.
Quasi nessuno capisce perfettamente (c'è un caso marginale che manca (1 o 2 normalmente), o non gestiscono numeri negativi, quindi puoi vedere come gestiscono i bug e ti viene detto che hanno torto.
La maggior parte lo fa come un setaccio semplice ma molto lento (ad esempio, l'80% delle persone verificherà che n sia un numero primo dividendo n per tutti i numeri interi inferiori a n), il che offre un ampio margine di conversazioni su come potrebbero migliorare l'algoritmo basato su scambi spazio / tempo, ad es. "perché dividi un numero per 4 se sai già che non è divisibile per 2?" o "Hai capito che devi solo dividere per tutti i numeri primi meno di sqrt (n), ma ciò richiede che tu li memorizzi da qualche parte, quindi quali sono le implicazioni?")
Non è necessario che abbiano la risposta giusta. Se qualcuno può pensare e spiegare il proprio modo di pensare, allora sono molto lontani dalla strada per essere un buon candidato.
Qualcosa chiamato aff_z, che faceva parte degli esami C della mia scuola di ingegneria ed era usato come test "fittizio" per far fallire gli studenti quando tornavano dalle vacanze (il nostro sistema di marcatura implicava che il fallimento di un test interrompeva la marcatura, quindi fallire quel test fittizio avrebbe invalidare l'intero test. Ti obbliga a prestare attenzione ai dettagli idioti). L'ho riutilizzato una o due volte durante le interviste.
Comunque ... ho dimenticato la formulazione esatta ma era qualcosa del genere ...
Write a function taking a single char parameter named c and returning nothing (void).
You function must satisfy the following requirements:
- if c is bigger or equal to 0, then print 'z' to standard output
- if c is stricly smaller than 0 , then print 'z' to standard output
- in any other case, print the letter 'z' to standard output
La cosa triste è che non solo alcuni studenti potrebbero trovare soluzioni estremamente complicate quando la risposta è abbastanza ovvia, ma alcuni potrebbero anche fallire.
E che ci crediate o no, è successo anche durante le interviste.
Eseguirlo nelle interviste è stato abbastanza divertente, poiché alcuni candidati avrebbero iniziato a scrivere i possibili rami e poi avrebbero capito cosa non va (ovviamente, se li chiedi solo oralmente, è abbastanza comprensibile che lo facciano mentre parli ... ma se tu darlo per iscritto, lo trovo sconcertante ...)
È stupido, ma immagino sia uno screening minimalista (allo stesso modo, quando assumo programmatori JS, chiedo sempre come dichiarare una variabile, e quindi a seconda della loro risposta se usare var fa qualche differenza o no. Abbastanza spesso un momento triste, onestamente.)
variablename = variablevalue;
mentre i bravi ridevano solo al telefono o di persona e mi dicevano direttamente con che cosa sarebbe diverso o senza. var
).
Dipende molto da ciò che stai cercando, in quanto organizzazione che svolge un sacco di lavoro web dinamico che coinvolge immagini, tendo a farmi una domanda sulla geometria pertinente al lavoro. In ogni caso, tendo a porre una domanda sulla geometria, poiché trovo che sia un buon test di matematica che sia piacevole e visivo e che possa mostrare ai candidati la capacità di presentare visivamente il loro lavoro e metodicamente di risolvere un problema.
Per i candidati avanzati, di tanto in tanto faccio la seguente domanda:
Questa immagine mostra una falce di luna. La larghezza della mezzaluna da B a D è di 9 cm e tra E e F, 5 cm. C è il centro del cerchio più grande.
a) Calcola l'area della mezzaluna.
b) Descrivere i calcoli necessari per ridimensionare un'immagine per adattarla al cerchio interno da una data dimensione e posizionarla all'interno del cerchio se il punto centrale è noto.
Per una domanda più semplice di solito faccio lo stesso tipo di domanda, ma uso l'esempio "quadrato all'interno di un cerchio all'interno di un quadrato". Anche se questo è molto semplice, mi aspetterei una perfetta algebra.
Oltre a ciò, tendo a chiedere loro di mettere a dura prova un algoritmo per generare tutte le combinazioni di un set di dati a lunghezza variabile.
Le migliori risposte FizzBuzz che ho visto sono:
SQL Server 2008
;WITH mil AS (
SELECT TOP 100 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
FROM master.sys.all_columns as c
CROSS JOIN master.sys.all_columns as c2
)
SELECT CASE WHEN n % 3 = 0 THEN
CASE WHEN n % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
WHEN n % 5 = 0 THEN 'Buzz'
ELSE CAST(n AS char(6))
END + CHAR(13)
FROM mil
C # (semplice)
foreach (int number in Enumerable.Range(1, 100))
{
bool isDivisibleBy3 = (number % 3) == 0;
bool isDivisibleBy5 = (number % 5) == 0;
if (isDivisibleBy3)
Console.Write("Fizz");
if (isDivisibleBy5)
Console.Write("Buzz");
if (!isDivisibleBy3 && !isDivisibleBy5)
Console.Write(number);
Console.WriteLine();
}
C # (intelligente)
Enumerable
.Range(1, 100)
.Select(i =>
i % 15 == 0 ? "FizzBuzz" :
i % 5 == 0 ? "Buzz" :
i % 3 == 0 ? "Fizz" :
i.ToString())
.ToList()
.ForEach(s => Console.WriteLine(s));
Cerco un paio di cose nei candidati che ho intervistato. Per la ragione che non riesco a descrivere online, otteniamo candidati piuttosto scarsi, e sono arrivato ad aspettarmelo, quindi sono abbastanza facile con loro. Anche ancora, cerco:
Consapevolezza del design.
"Mostrami la struttura della tabella per un programma di rubrica che ha Contatti con nome e cognome che possono avere più numeri di telefono con una descrizione del numero (cella / casa / lavoro / ecc.)"
Non sto cercando un diagramma delle specifiche UML 2.0 qui, un semplice diagramma a bolle qui va bene. Finché è ragionevole.
Conoscenza di come lavorare con un database (es. SQL)
Conoscenza dei test
Supponiamo public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)
che esista un metodo con la firma che restituisce i risultati della query in precedenza. Supponiamo che se si passa un null nel metodo, viene generata una NullReferenceException. Scrivi un test per dimostrare questa funzionalità.
Scrivi un test che dimostri che GetPhoneNumbers restituirà un numero di telefono di casa di (123)456-7890 per qualcuno con il cognome "smith".
Conoscenza di come scrivere del codice
Implementa un metodo che soddisfi i requisiti dei test che hai scritto.
Considerando il numero e la qualità dei candidati che abbiamo ottenuto, ho intervistato tutti coloro che hanno mai fatto domanda seriamente. Non ho assunto nessuno.
Di solito gli permetto di disegnare uno schema a blocchi dell'ultimo sistema su cui hanno lavorato, chiedendo delle relazioni tra i blocchi e poi di lasciarli elaborare sul blocco su cui stavano lavorando / incaricati. Puoi imparare molti da questo esercizio, come il modo in cui uno guarda al di là del suo piccolo dominio, quanto è importante per lui sapere "dove" recita, inoltre puoi conoscere il ruolo che stava recitando, era una chiave o un lato ruolo.
Scrivi un algoritmo per il seguente problema: Dato un numero n , genera il numero totale di alberi binari (univoci) che hanno n nodi.
Pertanto, per n = 0 e n = 1, la risposta è 1. Per n = 2, hai 2: il nodo principale, quindi il secondo nodo a sinistra oa destra.
È possibile ottenere informazioni sulle tecniche di progettazione e vedere se pensano alla ricorsione o alla memoizzazione o alla soluzione di programmazione dinamica.
[Vedi anche questa discussione su StackOverflow per il caso correlato, ma diverso, di alberi di ricerca binaria.]
Se dovessi intervistare uno sviluppatore di software, gli chiederei di progettare un software e descrivere i requisiti hardware per rimuovere voci duplicate da un file arbitrariamente grande contenente un nome completo su ogni riga. Lascio alcune parti della descrizione del problema ambigue intenzionalmente. Quindi lo sfido a capire se comprende l'analisi e il chiarimento dei requisiti, diversi compromessi, strutture di dati e algoritmi, I / O (memoria secondaria), tecnologie software e hardware, scalabilità, ecc.
Penso che sia un problema piccolo ma impegnativo, che rivela le conoscenze e le capacità del candidato in molte aree informatiche.
Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence
Molti ragazzi potrebbero rimanere bloccati su questo. Se viene fornita una soluzione, di solito utilizza la ricorsione. Dopo di che:
Implement the same via 'for'-loop
Non posso dirti, quanti compagni non riescono a completare entrambi i compiti - il 50% dei candidati.
Ecco perché mi piace :)
fib(n)=round(power(PHI,n)/SQRT5)
. PHI e SQRT5 sono costanti che rappresentano rispettivamente il rapporto aureo (1.618 ...) e la radice quadrata di 5.
Per i database vado con:
Tabella: cose Nome ID 1 Bodkin Van Horn 2 Hoos-Foos 3 Hoos-Foos 4 hot-shot 5 Marvin O'Gravel Balloon Face 6 Snimm 7 Marvin O'Gravel Balloon Face 8 Marvin O'Gravel Balloon Face 9 Dave
Scrivimi un po 'di SQL che de-duplicherà una tabella come questa in base al nome (e non mi interessa quale ID ottengo, ma qualunque sia il valore restituito deve essere valido per quel nome). Quindi la tabella una volta applicato l'SQL corretto presenterà qualcosa del tipo:
Tabella: cose Nome ID 1 Bodkin Van Horn 2 Hoos-Foos 4 hot-shot 5 Marvin O'Gravel Balloon Face 6 Snimm 9 Dave
Mi piace perché:
(È qui che trovo che ci sia un modo del tutto banale per farlo e sono stato troppo complicato per tutti questi anni).
SELECT min(ID), Name FROM Things GROUP BY Name
funzionerebbe, giusto?
HAVING count(Name) > 1
, ma immagino che la tua risposta del campione dovrebbe omettere Bodkin Van Horn, Hot Shot, Snimm e Dave.
DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
. Hai una soluzione preferita?
Il mio problema preferito con la lavagna C ++ è avere l'attrezzo candidato
Vector3 a(1, 0, 0), b(0, 1, 0); // Mathematical 3D vectors
double c = 7.0;
double d = a * c;
Vector3 e = a * b;
Da questo posso imparare
Come rappresenteresti un mazzo standard da 52 carte? Qualsiasi linguaggio di programmazione va bene. Come mischerai le carte?
Il mio preferito è iniziare chiedendo il prototipo di printf. Quindi, dato un API di basso livello printc (char c), che stamperà un carattere, implementa printf. Fornisce ogni tipo di risposta interessante come lo stack fa parte della CPU. Come avrai intuito, vengo da una C e da un background incorporato.
varargs()
o alcune funzioni del genere. Ho ragione? L'ho fatto solo una volta per dire che l'ho fatto poco fa.
Hai una ciotola con 200 pesci al suo interno. Di questi pesci il 99% non è guppy. Quanti pesci dovresti rimuovere in modo che il 2% di ciò che rimane sia guppy. Mostra il tuo lavoro.
Si tratta di confondere i requisiti. Si dice in questo modo di cambiare più volte le prospettive durante la stessa domanda. È pensato per vedere se riescono a capire cosa sta realmente succedendo.
Saresti sorpreso da quante persone sbagliano.
answer = 100
. [Supponendo che sia possibile selezionare selettivamente gli altri pesci. Se rimuovi i guppy, ci sono altre risposte.] Buona domanda, rimarrai sorpreso dal fatto che poche persone lo gestiscano bene, anche se dovrebbe essere un gioco da ragazzi per un programmatore.
Ho alcuni preferiti, ma qui ci sono un paio che quasi sempre escono. Il più delle volte sto facendo interviste tecniche di round finale (C ++), quindi favorisco domande più lunghe e più aperte che portano a nuove aree di interesse. Non c'è una risposta "giusta", solo un'apertura ad un'altra conversazione.
1) Implementazione di un puntatore condiviso di base, spiegazioni di dove ci sono carenze rispetto a tr1 o boost di puntatori condivisi nella loro implementazione, come dovrebbe essere usato ecc.
2) Una revisione del codice. Per i noleggiatori esperti ci aspettiamo che siano in grado di rivedere con sicurezza alcuni codici forniti per problemi di progettazione, errori, errori di codifica e potenziali problemi di manutenibilità. Inoltre, ovviamente, come lo avrebbero risolto; e a volte come darebbero quel messaggio allo sviluppatore junior che stanno abbattendo.
Una domanda che utilizzo da quando è stata usata su di me è la seguente:
Scrivi una funzione per stampare tutti i numeri tra 1 e 100.
Gran parte del motivo per cui l'ho usato è dovuto al fatto che puoi quindi prendere la soluzione lì e muoverti in varie direzioni:
Come modifichereste la funzione per stampare tutti i numeri tra 1 e 1000, 10000 o n ?
Le loro risposte a queste domande potrebbero darti un'idea di come rispondono alle mutevoli esigenze e se sono in grado di riconoscere le considerazioni sulle prestazioni. Un candidato forte potrebbe rispondere con una domanda in merito a quale funzione è necessaria per la frequenza con cui verrà chiamata.
Muoversi in una direzione diversa:
Come cambieresti le cose se sapessi che questa funzione verrà chiamata più volte al minuto e le prestazioni sono un problema?
Lo uso come un modo per controllare il loro pensiero laterale. Poiché il calcolo dei numeri primi può essere lento man mano che il valore massimo aumenta, a volte ha più senso utilizzare una sorta di tabella di ricerca calcolata o pre-calcolata che viene regolata in base al problema che si sta tentando di risolvere.
Eccone uno per provocare qualche pensiero: è semplice, comporta un po 'di matematica e controlla la conoscenza del candidato sulla progettazione di base del computer (overflow, rappresentazione numerica, ecc.):
Scrivi un programma (o una procedura) che accetta come input una coppia di numeri interi X, Y e determina se X * Y è uniformemente divisibile per 10. NOTA IMPORTANTE: X e Y possono essere abbastanza grandi da consentire a X * Y di superare il tipo intero più grande disponibile sulla tua macchina.
T_BOOL MultipleOfTen(int x, int y)
{
return((x%2==0 || y%2==0) && (x%5==0 || y%5==0));
}
Compilare il seguente metodo: PS Una modalità di un numero è il numero (nell'elenco) che presenta il maggior numero di occorrenze.
public int getMode(List<Integer> numberList) {
}
Questo per vedere efficace è il tuo codice.
Come rappresenteresti una matrice di riserva che è relativamente grande ... diciamo 1000x1000 ma ha al massimo 100 voci diverse da zero?