it-swarm.it

Qual è il tuo problema di intervista sulla lavagna preferito?

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.

52
Nicole

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.

Esempio concreto

(Per a Java desktop developper)

Progettare un'API per gestire 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 Edge e gestione degli errori e consente anche di parlare di dati strutture.

22
barjak

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.

40
JohnFx

"Disegna per me sulla lavagna il disegno dell'ultimo progetto a cui hai lavorato, senza rivelarmi alcun dettaglio sensibile."

20
Uberto

Implementa strcpy, strcmp e amici.

14
fredoverflow

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:

  • come funziona un albero (albero binario in particolare)
  • la definizione ricorsiva di un albero binario
  • metodi ricorsivi e come i casi base interrompono la ricorsione
  • cosa significa contare un singolo nodo
  • si interfaccia come un contratto
  • (meno importante) conoscenza della sintassi C #:
    • farmaci generici
    • metodi di estensione
    • operatore ternario
14
Jesse C. Slicer

Sono due domande che hanno suscitato interessanti discussioni sulla lavagna per me

  1. "Per favore, puoi spiegare con quanti più dettagli desideri come un browser web ottiene una pagina generata"
  2. "Spiega come Java Hibernate funziona"

Iniziano in modo semplice e diventano progressivamente più complessi.

12
Gary Rowe

Non mi piace usare un puzzle o una domanda di design come una domanda sulla lavagna. Preferisco domande chiare, semplici, che mettano 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.)

8
pyNem

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 capacità 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.

7
Bill Leeper

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 completamente il problema 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.

6
Robert Harvey

La mia preferita era una mia amica usata.

Scrivimi una funzione per generare/stampare/memorizzare i primi numeri "n" primi e poi spiegare come funziona e quanto è efficiente.

Funziona bene perché:

  1. È 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.

  2. È indipendente dalla lingua.

  3. Quasi nessuno capisce perfettamente (c'è un caso Edge che manca (normalmente 1 o 2) o non gestiscono numeri negativi, quindi puoi vedere come gestiscono i bug e ti viene detto che hanno torto.

  4. 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 sugli scambi di 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.

4
Rhys Gibson

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 di risolvere metodicamente 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. Crescent Moon Maths Question

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.

Square inside a circle inside a square

Inoltre, tendo a chiedere loro di mettere a dura prova un algoritmo per generare tutte le combinazioni di un set di dati a lunghezza variabile.

3
Orbling

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));
3
Simon Hughes

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 troverebbero soluzioni estremamente contorte quando la risposta è abbastanza ovvia, ma che alcuni riusciranno persino a 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 che 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. Abbastanza spesso un momento triste, onestamente.)

3
haylem

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)

    1. Scrivi una query per ottenere tutti i numeri di telefono delle persone con il cognome "smith"
    2. Scrivi una query per ottenere tutti i clienti nel database e i numeri di telefono per quelli con il cognome "smith"
  • Conoscenza dei test

    Supponiamo che esista un metodo con la firma public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName) 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.

2
Steven Evers

Scrivi un algoritmo per il seguente problema: Dato un numero n, visualizza il numero totale di alberi binari (unici) 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 questo StackOverflow discussione per il caso correlato, ma diverso, degli alberi di ricerca binaria.]

2
Macneil

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.

2

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

  • se il candidato riconosce che non è possibile sovraccaricare il tipo di ritorno (indicazione del livello C++ di Juniour)
  • se il candidato sa come restituire un temporaneo e implementare operatori di casting (indicazione di livello C++ intermedio)
  • se il candidato è in grado di eseguire la matematica vettoriale di base (importante per il nostro dominio di applicazione)
2
smithco

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

2
alexb

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-duplichi una tabella come questa in base al nome (e non mi interessa quale ID ottengo, ma qualunque sia restituito deve essere valido per quel nome). Quindi la tabella una volta applicato l'SQL corretto presenterà qualcosa del tipo:

Tabella: Cose 
 
 ID Nome 
 1 Bodkin Van Horn 
 2 Hoos-Foos 
 4 Hot-Shot 
 5 Marvin O 'Gravel Balloon Face 
 6 Snimm 
 9 Dave

Mi piace perché:

  • La deduplicazione è un problema del mondo reale
  • Ci sono molti modi per farlo
  • Penso che praticamente tutti questi modi abbiano bisogno che tu capisca (leggermente) un SQL più complesso (essenzialmente GROUP BY e HAVING) o la capacità di ragionare attraverso il concatenamento di più istruzioni più semplici.
  • A causa di quest'ultimo aspetto, anche se stanno lottando con la sintassi o altro, puoi chiedere loro cosa stanno pensando e parlarne in quel modo.
  • Fa riferimento al dottor Seuss

(È qui che trovo che ci sia un modo del tutto banale di fare questo e ho esagerato a complicarlo in tutti questi anni).

2
Jon Hopkins

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.

2
Assimiz

Come rappresenteresti un mazzo standard da 52 carte? Qualsiasi linguaggio di programmazione va bene. Come mischerai le carte?

2
MrDatabase

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 prospettiva più volte durante la stessa domanda. È pensato per vedere se riescono a capire cosa sta realmente succedendo.

Saresti sorpreso da quante persone sbagliano.

1
dacracot

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

1
rjzii

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 traboccare 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));
}
1
oosterwal

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.

1
aufather

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 su dove ci sono carenze rispetto a tr1 o sui puntatori condivisi boost 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.

1
Alaric

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.

0
Buhake Sindi