Qual è il tuo problema di intervista sulla lavagna preferito? [chiuso]


52

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.


4
Un problema che odiavo era un enigma di Einstein. stanford.edu/~laurik/fsmbook/examples/Einstein'sPuzzle.html Non sono riuscito a farlo in 30 minuti. Ma poi mi sono incazzato e ho scoperto questo: games.flowix.com/en/index.html Quindi mi sono allenato a fare un problema 6 x 6 x 6 in media in 20 minuti. Penso di poter gestire 5 x 5 x 5 in 30 minuti ora. Qualunque stupido enigma che il datore di lavoro mi lancerà, me li ricorderò e li avrò la prossima volta. Ci sono così tanti buoni puzzle.
Lavoro il

20
@Job: nessuno dei quali ti dirà nulla su come un dipendente si esibirà nel lavoro. A meno che, ovviamente, non passi tutto il tuo tempo di lavoro a risolvere questo tipo di enigmi invece di fare il vero lavoro.
Robert Harvey,

1
@Robert Harvey vuoi dire che sei in un business che fa soldi in qualche modo diverso dalla risoluzione di enigmi? Non avevo idea ...;) Ma quel puzzle è divertente. Come nota a margine, una società con cui ho lavorato per test di QI effettivi usati come primo passo nella loro selezione. Vorrei trovare alcune buone domande sulla lavagna per separare i migliori candidati, non semplicemente per selezionarli.
Nicole,

4
@Renesis: Come sviluppatore, posso vedere come risolvere un puzzle identifica le capacità di problem solving e analisi, ma anche gli sviluppatori devono sapere come tradurre quella soluzione in codice. Risolvere un puzzle mostra solo metà di quella esecuzione. È la differenza tra risolvere un cubo di Rubix e scrivere un algoritmo per risolvere un cubo di Rubix.
Robert Harvey,

@Robert Harvey Sono d'accordo, sto specificatamente cercando problemi di codifica, non solo problemi di pensiero.
Nicole,

Risposte:


22

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


40

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.


2
Ah, vedo il problema w / # 4. I tuoi documenti hanno solo una parola chiave per riga, quindi non puoi avere una cella uguale a quella dei rubinetti
glasnt

8
Ops! Riesco a vedermi cadere per (4) in un'intervista. @Job: Come intervistatore , chiederei al candidato di spiegare la domanda, sperando che si imbattesse nel suo problema per vedere come lo affronta. (che di solito ti dice più di un candidato che risponde alle tue domande al primo tentativo.)
peterchen

3
@Renesis, non sono così sicuro che questo stia davvero scavando in profondità. Questo sembra abbastanza buono per scoprire se qualcuno ha abilità di query SQL di base. In realtà sono scioccato dal fatto che pochi sviluppatori abbiano queste competenze di base in questi giorni.
Mark Freedman,

2
@ jk01, forse ho un atteggiamento da vecchia scuola su questo, ma IMO uno sviluppatore a tutto tondo dovrebbe avere una certa conoscenza del DB, se non per accedere tramite codice, ma almeno per capire il dominio sperimentando le query. Senza questo, uno sviluppatore ha un punto cieco piuttosto significativo. È inoltre ESTREMAMENTE utile per il supporto del sistema e la risoluzione dei problemi. L'astrazione va bene per aiutare a semplificare lo sviluppo e aumentare la produttività, ma ho visto troppe ipotesi fatte perché questo è così spesso sottratto. Potrei continuare, ma questo potrebbe essere un altro dibattito, sono sicuro che si svolgerà altrove;)
Mark Freedman,

4
@ back2dos - Senti, non ti offendere solo perché non puoi rispondere. Potrebbero esserci molte altre tecnologie che rendono questo più semplice, ma usiamo molti database SQL e io recluto persone che sanno come usare le tecnologie che utilizziamo, non scusando il motivo per cui non dovrebbero rispondere alle mie domande sul colloquio .
JohnFx,

20

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


Come definiresti il ​​design? Stai cercando un diagramma di classe? Un altro diagramma UML? Uno schizzo di base dei livelli?
solo dal

1
Li chiamo baloongrams. ;) Basta disegnare cicles, mettere i nomi e collegarli con le frecce denominate. Non mi interessa la sua domanda, ma il fatto che l'abbia capito.
Uberto,

5
+1. Per le persone, che in precedenza avevano un lavoro, questa è sicuramente una delle cose migliori che puoi fare. Se riescono a spiegare come è stato strutturato il progetto, ne vale già la pena. Se hanno un'idea del perché sia ​​stato strutturato in quel modo particolare, o di come alcune cose potrebbero essere fatte meglio, allora questo è davvero un vantaggio enorme.
back2dos,

3
@justkt: L'importanza è che l'intervistato ottenga le informazioni. Poco importa come. Ho incontrato persone, che conoscono davvero UML, che non riescono a spiegare nulla con esso, e persone, che possono spiegare sistemi complessi con poche linee ondulate.
back2dos,

2
Come mai qualcuno dovrebbe disegnare il progetto di un progetto senza rivelare alcun dettaglio sensibile?
Nemanja Trifunovic,

14

Implementare strcpy, strcmpe gli amici.


4
Chiedo ai candidati di attuare atoi().
chrisaycock,

2
Saresti sorpreso di quante persone non possono implementare strdup().
Tim Post

10
Questo è giusto solo se l'apertura del lavoro è per un programmatore C.

Nell'intervista per il mio attuale lavoro, l'intervistatore mi ha chiesto di implementare strrev()la funzione di inversione delle stringhe. La mia soluzione alla lavagna bianca li ha impressionati e sto facendo un lavoro ora.
Gulshan,

@crisaycock atoi () è facile. itoa () è subdolo
Michael Brown,

14

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 in che modo i casi di base bloccano la ricorsione
  • cosa significa contare un singolo nodo
  • si interfaccia come un contratto
  • (meno importante) conoscenza della sintassi di C #:
    • farmaci generici
    • metodi di estensione
    • operatore ternario

Potrebbe essere un metodo di estensione?
Gulshan,

In questi tempi, sì. All'epoca stavamo codificando in VS 2005, quindi la sintassi sparsa.
Jesse C. Slicer,

Perché usare un metodo di estensione quando hai il codice sorgente per la classe originale? Non è a questo che servono i metodi di estensione.
Batibix,

'Spose avrei potuto fare un livello più profondo e mostrare al candidato un'interfaccia che questa classe implementa. L'essenza è che la classe originale non dovrebbe essere modificata - alcuni sviluppatori entry-level adorerebbero aggiungere elementi alla classe per rendere "più semplice" la richiesta.
Jesse C. Slicer,

merda santa che assomiglia molto a java!
prova il

12

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 funziona Java Hibernate"

Iniziano in modo semplice e diventano progressivamente più complessi.


31
ehi, non sono nemmeno qualificato per giudicare le risposte ... Penso che per la seconda hai bisogno di 12 candele nere e una capra ...
Uberto

4
Il secondo è semplice, il tuo sistema operativo salva la cache e lo stack del processore e il contenuto della RAM sul disco rigido, quindi lo ripristina quando il computer viene riacceso.
Malfist,

Tuttavia, la prima domanda potrebbe richiedere giorni per spiegare.
Malfist,

@Malfist Intendevo il framework di persistenza di Hibernate Java.
Gary Rowe,

2
@Paul Stephenson Sì, ma per essere sicuro ...
Gary Rowe,

8

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


+1, mi piace che il tuo approccio non abbia alcun senso chiedere a qualcuno programmini dinamici o concetti simili quando sono poco utilizzati nella programmazione aziendale + L'enfasi dovrebbe essere anche sulla qualità del codice e non sulla sola soluzione.
Geek,

Non mi dispiace fare domande sul design, ma una volta ho intervistato un ragazzo il cui hobby stava facendo enigmi, e aveva alcune domande orribili. Era come me fare a qualcuno delle domande sulle arti marziali.
Bob Murphy,

Probabilmente dovresti assicurarti che le persone sappiano che intendi "array ordinato" in (3) giusto?
Avere il

7

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.


6

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.


2
+1 Per l'ultimo paragrafo, che è tutto importante. Di solito non è la risposta che conta in tali cose, ma il percorso intrapreso per arrivarci. Come tutti i miei insegnanti di matematica hanno mai detto "mostra il tuo lavoro!"
Orbling

4

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

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

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


Una volta ho ricevuto una domanda di intervista, in cui mi è stato dato un blocco molto offuscato di codice C, e mi è stato chiesto di scoprire cosa ha fatto. In un modo molto arrotondato, ha stampato ogni altro numero primo. 300 persone hanno fatto domanda e mi hanno offerto il lavoro perché apparentemente ero l'unico candidato a dire loro quale fosse lo scopo, invece di ottenere i valori. Quindi sì, +1, i numeri primi sono un buon controllo. Soprattutto se escono con un setaccio, anche se questo scambia la complessità computazionale con la complessità dello spazio.
Orbling

1
1 non è un numero primo ..

2
@ Thorbjørn - beh ovviamente, ma una buona percentuale delle routine che ho visto scritto per risolvere questo problema mi ha detto che lo è
Rhys Gibson

quindi hanno un bug :)

3

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


1
Hai mai avuto candidati nelle interviste sentiti insultati da questo? O pensi che ti stavi semplicemente divertendo a loro spese invece di condurre un'intervista seria?
Nicole,

@Renesis: prima ho visto qualcuno che mi guardava con un sorrisetto. Alcuni dei quali hanno fallito il test. In generale, i buoni candidati ridono se sono spenti. Per i programmatori di JS, ad esempio, ho avuto un sacco di candidati che non hanno risposto all'intervista con un "duh", variablename = variablevalue;mentre i bravi ridevano solo al telefono o di persona e mi dicevano direttamente con che cosa sarebbe diverso o senza. var).
Haylem,

1
@Renesis: Inoltre, non me ne potrebbe fregare di meno se qualcuno si offende. Non è discriminatorio in alcun modo. Se si offendono, suppongo che siano il tipo di persona a cui non piace essere messa alla prova o messa in discussione. Tuttavia, non ho mai avuto candidati che mi sentissero a mio agio a loro spese. Di solito mi scuso persino prima di porre domande molto semplici in quanto potrebbe sembrare una perdita di tempo per quelle buone. Ma il fatto è che non è una perdita di tempo per me. Non chiedere loro non ne sarebbe, a lungo termine.
Haylem,

@Renesis: E più spesso, quello che ho ottenuto dopo lo sguardo ghigno / risata / offeso era un'espressione vergognosa e delle scuse da parte di chi ha fallito o ha iniziato a scrivere la ramificazione per l'intero test quando si sono resi conto che era inutile. Sì, mi diverto un po 'a dare questo test, ma non lo darei se non fosse per una buona ragione.
Hayylem,

Personalmente, avrei avuto un volto mentale quando lo leggevo e mi chiedevo se qualcun altro avesse scritto la domanda per l'intervistatore di prenderlo in giro.
Wildpeaks,

3

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

Quadrato all'interno di un cerchio all'interno di un quadrato

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.


1
La risposta per a) è 128,75? (non so se ho fatto un errore). Mi piace, ma si tratta più di geometria.
Hoàng Long,

2
Inoltre, scusate il ritardo nei commenti. Non mi piace di sottovalutare di regola e doppiamente senza commentare il perché. Il mio downvote non riguarda la domanda in sé, ha certamente uno scopo per te, non penso che abbia un contesto adeguato in un'intervista di programmazione.
Philip Regan,

7
-1 perché la geometria è un buon candidato per Just In Time Learning e non riflette sulla mia capacità di creare software di qualità.
Malfist,

2
Mi è piaciuto questo problema. Spero non ti dispiaccia se condivido la mia soluzione con la parte (a). I diametri differiscono di 9 cm, quindi se il cerchio interno ha raggio r, il cerchio esterno ha raggio r + 4.5. L'area della mezzaluna è la differenza nelle aree dei cerchi: pi (r + 4.5) ^ 2 - pi * r ^ 2. Non resta che trovare r. Definire C come punto (0,0), quindi il punto E è a (0, r - 0,5) (poiché CE è 5 cm in meno del raggio maggiore). Il cerchio interno viene spostato a destra di 4,5 cm, quindi la sua equazione è (x - 4,5) ^ 2 + y ^ 2 = r ^ 2. Collegare (x, y) = (0, r - 0,5) e risolvere per r.
Tim Goodman,

2
+1 perché penso sia una buona domanda per un lavoro che richiede geometria. Ci sono molti ragionamenti coinvolti, non solo l'inserimento di una formula. Detto questo, conosco alcuni bravi programmatori che sarebbero inciampati solo perché non hanno dovuto pensare alle cerchie in 10 anni, ma la domanda non pone una domanda adatta per qualsiasi intervista con gli sviluppatori. La domanda SQL attualmente più votata (che mi piace anche) è almeno specifica per il lavoro.
Tim Goodman,

3

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

1
Potresti voler aggiungere in quale particolare dialetto SQL è scritto questo.

Sembra bello con lo stile funzionale.
Orbling

2

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


In SQL # 2, stai parlando di fare tutto in una query? Lo scopo è solo quello di valutare la comprensione dei join sinistro / destro o interno?
Nicole,

@Renesis: Sì, lo è.
Steven Evers,

2

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

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


Quindi un programmatore dell'interfaccia utente che non conosce la programmazione dinamica è un cattivo programmatore? Per la verità, qualsiasi programmatore aziendale che non è in grado di ricordare la programmazione dinamica è male? Molti ragazzi di topcoder affrontano un problema di programmazione dinamica ma dai un'occhiata al codice che scrivono.
Geek,

@Geek: ricorda che i problemi della "lavagna" sono un modo per vedere il processo di pensiero di qualcuno. In questa discussione dovrebbero rientrare i problemi di programmazione dinamica, in quanto sono molto apprezzati da Google, tra gli altri.
Macneil,

Non sono d'accordo, ma ho due domande. 1. Risolvere l'ignoto? I problemi di DP diventano una passeggiata nel parco se hai risolto alcuni problemi nel recente passato o ricordi ancora il concetto al di fuori del college. Qualcuno che l'ha dimenticato sicuramente non farà bene sulla lavagna. 2. Se qualcuno sta lottando per risolvere un problema, non è possibile quantificare la qualità del suo codice. Che dire di dare un problema su qualcosa come una LinkList o Stringhe o array in modo tale che la persona possa risolvere il problema e scrivere codice.
Geek,

Non mi aspetterei necessariamente che un intervistato lo faccia bene, comunque alcune aziende lo faranno.
Macneil,

@Geek: "un ... programmatore che non conosce la programmazione dinamica è un cattivo programmatore?" - . Detto questo, concordo sul fatto che pensare nella programmazione dinamica non sia banale quando non ci si è abituati. Ma sapere che è un must assoluto.
Konrad Rudolph,

2

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

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


Cosa succede se la prima implementazione viene eseguita tramite un ciclo for?
Darknight,

2
Si propone di implementare la versione ricorsiva. Di solito dopo che i ragazzi del for-loop implementano con successo la versione ricorsiva.
alexb,

Oppure si potrebbe implementare questa come una singola istruzione: 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.
oosterwal,

2

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

  • 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 per farlo e sono stato troppo complicato per tutti questi anni).


1
Immagino di non sapere cosa contenga come "del tutto banale" ... Qualcosa del genere SELECT min(ID), Name FROM Things GROUP BY Namefunzionerebbe, giusto?
Tim Goodman,

@Tim - Questo ti dà il conto di tutto. Voglio solo quelli con duplicati. I risultati modificati manualmente non contano, supponiamo che si ridimensioni in milioni di righe. È un problema facile, ma nella mia esperienza l'80% delle persone che affermano di conoscere SQL non può arrivare fino al primo colpo.
Jon Hopkins,

@Jon: Non sono sicuro di cosa intendi con "Questo dà il conto di tutto". Dalla tua soluzione di esempio, sembra che ciò che desideri sia una riga per ciascun nome distinto. Dai tuoi commenti sembra che forse intendi qualcosa del genere HAVING count(Name) > 1, ma immagino che la tua risposta del campione dovrebbe omettere Bodkin Van Horn, Hot Shot, Snimm e Dave.
Tim Goodman,

@ Tim - Hai ragione, non è molto chiaro. Modificherò quando avrò qualche minuto.
Jon Hopkins,

1
Credo che avrei fatto questo: DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name). Hai una soluzione preferita?
Tim Goodman,

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

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


vector <Card> con funzione shuffle C ++ :)
piega a destra

1

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.


Non capisco la cosa "lo stack fa parte della CPU".
Barjak,

Chiunque sappia qualcosa sull'architettura del computer lo saprebbe. Per me è completamente indipendente, quindi il ragazzo sta dimostrando la sua ignoranza.
Michael K,

@aufather: se ricordo bene, devi chiamare varargs()o alcune funzioni del genere. Ho ragione? L'ho fatto solo una volta per dire che l'ho fatto poco fa.
Michael K,

@barjak - Una volta che inizi a implementare printf, dovrai accedere al tuo stack e ho le risposte che lo stack è nella CPU.
aufather il

@Michael - Nel mondo embedded, devi conoscere davvero bene l'architettura della tua piattaforma. Quindi questa domanda elimina rapidamente l'ignorante abbastanza presto.
aufather

1

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.


4
Aggiungi due Oscar da 12 pollici nella ciotola e rimuoveranno molto presto il 98% dei guppy.
Geek,

Cosa succede se rimuovi un guppy?

1
1% guppy, = 200 x 1% = 2 (200-2 = 198 altri pesci), dove 2 = 2%, restante pesce = 98% = 98 (1: 1). 98 = 198 - 100 => 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.
Orbling

1

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.


1

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.


1

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.


Soluzione di esempio:


T_BOOL MultipleOfTen(int x, int y)
{
    return((x%2==0 || y%2==0) && (x%5==0 || y%5==0));
}

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.


-2

Come rappresenteresti una matrice di riserva che è relativamente grande ... diciamo 1000x1000 ma ha al massimo 100 voci diverse da zero?

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.