È una cattiva pratica di intervista far scrivere ai candidati un'implementazione di liste collegate? [chiuso]

43

Leggendo questo sito e SO ho visto molte storie di domande e risposte di interviste che dicevano che un candidato doveva implementare una lista collegata da zero. Di solito questo è un esercizio "gimme" per programmare candidati di ruolo come scrivere FizzBuzz. L'idea è che se il candidato non può farlo, non può programmare e dovrebbe essere respinto quasi immediatamente.

Tuttavia, non posso fare a meno di pensare che questa potrebbe essere una cattiva pratica per i seguenti motivi:

  • I linguaggi di livello superiore moderni come C # e Python utilizzano in modo estensivo elenchi; scrivere il proprio oggetto lista collegata sarebbe richiesto solo in circostanze insolite e anche allora probabilmente sconsiderato.
  • I linguaggi di livello inferiore come C ++ hanno librerie standard con iteratori / contenitori di elenchi e oggetti.
  • Alla luce dei primi due punti, i programmatori possono passare anni senza nemmeno pensare di implementare una lista (collegati, doppiamente collegati, ecc.). Alcuni potrebbero non vedere davvero cose del genere fin dai tempi del college.
  • Anche il potere di calcolo non è il fattore che è stato anni fa, quindi l'efficienza tramite i puntatori non è il problema che era (in generale).
  • Una semplice ricerca sul Web di qualcosa come "esempio di elenco collegato" farebbe apparire un sacco di esempi di codice che potrebbero essere semplicemente memorizzati e replicati, senza indicare realmente la vera competenza del richiedente.

Dovrei dire che l'uso di un elenco collegato per condurre a domande e discussioni di tipo aperto sulle capacità di risoluzione dei problemi / pensiero critico dei candidati è molto probabilmente una buona pratica di intervista. In ogni modo un intervistatore può davvero vedere che cosa è un candidato e come pensano che sia enormemente vantaggioso.

Penso che questo approccio binario di "nessun codice di elenco collegato, nessun lavoro" per i programmatori che lavorano su un'applicazione desktop o web sia un po 'obsoleto. Potrebbe anche essere abbastanza dannoso; un candidato che non riesce a ricordare come lavorare correttamente con la testa di una lista potrebbe essere un programmatore e un collega di lavoro altrimenti eccellente e si perderebbe nel mix. Pensieri?

EDIT : ci sono molti (buoni) commenti che suggeriscono che questa è una buona o una cattiva domanda da porsi dipende dal contesto del lavoro. Sono assolutamente d'accordo, quindi lasciatemi riformulare questa domanda: L'implementazione di una lista collegata è una domanda di intervista comune per una vasta gamma di lavori di codifica, simili a domande come FizzBuzz o la scrittura di una funzione ricorsiva per calcolare i fattoriali. Questa domanda ha abbastanza utilità da essere usata comunemente per valutare i candidati alla programmazione in generale? O dovrebbe essere considerata una brutta domanda da porre, ad eccezione delle posizioni di "Senior Developer, Embedded Linked Lists Team"?

    
posta joshin4colours 11.01.2012 - 18:29
fonte

13 risposte

52

Se rispondere alla domanda ti dice cosa vuoi sapere su un candidato, allora è una buona domanda di intervista. Se non ti dice che è una brutta domanda.

Domande semplici come FizzBuzz servono a uno scopo specifico. Se un candidato non è in grado di codificare FizzBuzz, semplicemente non può codificarlo e puoi terminare l'intervista in anticipo. Valuterei l'implementazione di un elenco collegato solo leggermente più difficile, ma è possibile avviare una conversazione sulle strutture di dati in generale che rivelerà molto.

Ricorda che nessuna domanda di intervista ti dirà tutto quello che vuoi sapere. Hai davvero bisogno di avere un gruppo di domande pronto. Dovresti fare domande in una sequenza dal più semplice al più difficile in modo da poter trovare il limite di ciò che il candidato sa. Se fai una domanda e la inchioda, non sai ancora che cosa fanno o non sanno.

Per quanto riguarda la modifica:

Does this question have enough utility to be used commonly for evaluating programming candidates across the board? Or should considered a bad question to ask except for "Senior Developer, Embedded Linked Lists Team" positions?

Penso che sia una buona domanda di carattere generale che potrebbe essere utilizzata per valutare praticamente qualsiasi candidato alla programmazione. Deve solo far parte di un gruppo più ampio di domande. Sarebbe una buona per rompere il ghiaccio per molti tipi di posizione (anche se il candidato non può implementare una lista collegata da zero, forse possono spiegare come hanno usato uno prima e quali sono le funzioni chiave sono), o l'inizio di una lunga sequenza di domande più avanzate per la posizione "Senior Developer, Embedded Linked Lists Team".

    
risposta data 11.01.2012 - 19:27
fonte
34

Ho perso il lavoro solo perché la mia mente ha cancellato semplici enigmi come questo. Ho anche fatto brillantemente questi enigmi in altre interviste - so come implementare una lista collegata in un ambiente non pressante. Non ho mai avuto un reclamo sulle mie capacità da parte di qualcuno con cui ho lavorato, quindi forse non dovrei pensare di essermi perso un lavoro, dovrei pensare che mi abbiano mancato.

Quindi sì, penso che sia una pratica discutibile al massimo, ma lo capisco. Ho anche considerato la possibilità che non è colpa della domanda, ma dell'interrogante, per averlo reso una situazione di alta pressione.

Personalmente, preferisco porre domande aperte su un problema che il candidato ha già risolto, di recente, se possibile, e che copre sia i problemi di codifica che di processo. Se riescono a portare esempi di codice, fantastico.

    
risposta data 11.01.2012 - 18:39
fonte
25

È necessario definire il tipo di lavoro di programmazione. Se sei nel business dello sviluppo di compilatori e algoritmi, ci si deve aspettare domande su tali cose. Se ti trovi in applicazioni di tipo line-of-business e ti aspetti che il candidato faccia applicazioni CRUD, allora potrebbe essere la conoscenza del concetto (senza scrivere un programma) è sufficiente. Oggi, la conoscenza delle diverse tecnologie necessarie per svolgere il lavoro appositamente nel tipo di applicazione LOB sostituisce la necessità di algoritmi accurati.

    
risposta data 11.01.2012 - 18:46
fonte
9

La mia risposta è "Dipende". Vorrei fare questa domanda se un candidato ha elencato C o C ++ sul suo curriculum. Chiedere di implementare una lista collegata è un buon test per la comprensione dei puntatori che è assolutamente essenziale per un programmatore C o C ++.

D'altra parte, se un candidato non pretende di conoscere C o C ++, non gli chiederei di implementare un elenco collegato, ma vorrei prendere in considerazione la possibilità di porre domande al riguardo. Spiega ad alto livello come funziona una lista collegata. Qual è la complessità dell'aggiunta di un elemento alla testa dell'elenco? La coda della lista? Inserimento di un elemento nel mezzo dell'elenco? Quando useresti una lista invece di una matrice? Questi sono concetti fondamentali della struttura dei dati che, IMHO, ogni programmatore dovrebbe sapere.

    
risposta data 11.01.2012 - 20:19
fonte
7

Non lo considererei una brutta domanda di intervista. Un sacco di comprensione e programmazione della struttura dei dati inizia con una buona comprensione degli elenchi collegati. Detto questo, ci sono alcuni avvertimenti:

1) È una domanda tipo fizz-buzz. Stai solo convalidando qualcosa di molto semplice: la persona comprende una lista collegata. Chiedilo e prosegui.

2) Esiste la sfida con le liste concatenate che le lingue che sono molto adatte a mostrare la tua comprensione dei concetti dell'elenco collegato (ad es., C) potrebbero non coincidere con la lingua con cui lavoreranno sul lavoro. Puoi dimostrare la comprensione di base in qualsiasi lingua con le strutture, naturalmente, ma chiedere a un candidato di ri-implementare un elenco collegato in Erlang senza usare [] non è la stessa sfida e non ti dirà la stessa cosa sulla comprensione di un candidato come chiedendo loro di farlo in C. Chiedendo loro di farlo in C se il lavoro è in giro per Java, manca anche il punto un po '.

3) Tenendo presente questo e le sfide generali della "programmazione della lavagna", quando faccio questo tipo di domande, accetterei pseudocodici o diagrammi a patto che dimostrino la comprensione dei principi fondamentali. Non chiedo che le persone scrivano il codice su una lavagna che sia sintatticamente e logicamente perfetto, specialmente se possono quindi girarsi e identificare eventuali problemi logici quando gli viene chiesto di guardarlo di nuovo. YMMV.

    
risposta data 11.01.2012 - 19:06
fonte
6

Quando stavo rilasciando interviste, mi è stato spesso chiesto di implementare la lista collegata e alcuni algoritmi incentrati su liste collegate. Ho risolto la maggior parte di loro, e alcuni di loro mi hanno richiesto di esercitare un po 'i miei neuroni.

Se dovessi mai sostenere un'intervista, farei una sorta di implementazione di una lista collegata, non per testare quanto brava una persona è nella codifica, ma per verificare quanta attenzione una persona paga ai dettagli. Chiunque può scrivere una lista collegata, ma sono i casi limite a cui anche alcuni buoni programmatori non riescono. Non chiederglielo: Write a code for linked list in C/C++ . Chiedigli di scrivere una lista concatenata generica in C (non in C ++), ecc.

Capovolgi il problema e inserisci alcune altre condizioni nell'elenco collegato e avrai una buona domanda da porre. Alcune persone sono destinate a commettere errori allora.

    
risposta data 11.01.2012 - 18:45
fonte
5

Nei miei 10 anni circa di programmazione professionale (e circa altri dieci anni come hobby), non penso di aver mai avuto bisogno di implementare una lista collegata. Se qualcuno mi chiedesse di farlo durante un'intervista, potrei controbattere chiedendo se è qualcosa che farò regolarmente sul posto di lavoro.

Di sicuro, ci sono quasi certamente posti di lavoro là fuori dove dovranno scrivere implementazioni più o meno pulite di algoritmi comunemente noti, come implementare una lista concatenata da zero. Ma per la maggior parte dei lavori di programmazione, quale valore specifico ha per l'azienda che un candidato può fare durante un'intervista? È davvero così importante in un contesto del genere che il candidato fornisce un'implementazione perfetta che gestisce correttamente i casi limite, riporta i fallimenti secondo la pratica comune nella lingua o nel framework e così via? Oppure puoi ignorarlo e concentrarti invece su come effettivamente affrontano un problema che forse non hanno affrontato in 10-20 anni?

Quando ho intervistato per il mio attuale lavoro, ho avuto pochissima esperienza con lo stack tecnologico in uso presso l'azienda. Ora, alcuni anni dopo, ho regolarmente colleghi che vengono da me e fanno domande non solo sui prodotti, sulla loro implementazione e sugli standard implementati da loro, ma anche su problemi di programmazione molto più generali (solo ieri mi è stato chiesto cosa le implicazioni erano di una dipendenza circolare in un vincolo predefinito in SQL Server nel contesto di una tabella particolare e il suo utilizzo nel nostro caso - ragionando attraverso di essa, si è scoperto che non c'erano implicazioni in quel caso particolare). Non ho nemmeno bisogno di una nuova implementazione della lista collegata.

Poni domande pertinenti per il lavoro che è probabile che il candidato venga assegnato e cerca di farti un'idea di come si sentono quando raccolgono nuove conoscenze. Come avrebbero fatto a capire il significato di qualche sintassi oscura che non avevano mai visto? (Ad esempio, se sei un negozio C, puoi provare una domanda che riguarda i trigrafi.) Per una posizione di programmazione, legge regolarmente o contribuisce a forum come Stack Overflow? Se gli è stato chiesto di svolgere qualche compito in un linguaggio di programmazione o in un framework che hanno poca o nessuna esperienza con (diciamo, se si è principalmente un negozio Java, e Clojure o .NET?), Allora come potrebbero affrontare il problema? Forse prendi un vero bug dal tuo bug tracker (potrebbe persino essere uno di quelli risolti da molto tempo) e chiedi loro come in termini generali potrebbero avvicinarsi a risolverlo, e sii pronto a spiegare le parti rilevanti del prodotto in questione.

Se il candidato è in grado di gestire tipi di problemi relativi al caso aziendale e ha una buona attitudine verso l'apprendimento di nuove cose, questo è probabilmente un indicatore molto migliore di adattamento per quella particolare posizione rispetto alla capacità di fornire risposte predefinite a domande ben note, sia che queste domande riguardino FizzBuzz, elenchi concatenati o qualcos'altro. Pensa a quanto bene il candidato si adatta alla squadra e penserei che tu sia su un terreno abbastanza sicuro.

    
risposta data 12.01.2012 - 10:20
fonte
4

Naturalmente la maggior parte delle persone non avrebbe mai bisogno di implementare un elenco collegato, ma per implementarle da zero si avrà probabilmente bisogno di gestire correttamente i puntatori. Loro pensano quindi che aver formato un modello mentale coerente per i puntatori sia correlato con la competenza linguistica, comprendendo ciò che accade su alcuni livelli (astratti) della macchina e la capacità di astrarre in generale.

Non sto dicendo che questa sarebbe necessariamente la misura migliore, ma solo che esiste una correlazione.

    
risposta data 11.01.2012 - 18:44
fonte
4

Inizi a dire che sono domande "dammi", ma poi fai notare che le persone non saranno comprensibilmente in grado di farle. Sono confuso.

Ecco come ci penso:

  • Raramente c'è bisogno di scriverne uno, come dici tu, così le persone si dimenticheranno facilmente.
  • Non sono incredibilmente difficili da scrivere.
  • I concetti usati per scriverli possono essere considerati fondamentali.
  • Sono usati incredibilmente spesso (anche se non ne sei a conoscenza).

Penso che facciano loro delle domande buone da porre. Se sei preoccupato per il loro studio preliminare per l'intervista, quindi inserisci una lista. Invitali a scriverlo in modo circolare e chiedi quale sia il tempo di esecuzione asintotico della loro implementazione. Oppure chiedi loro di scrivere un'altra struttura dati comune e / o rapida ... Un albero di ricerca binario? Una coda (FIFO)? Una pila (FILO)? Una coda di priorità ingenua ( O(n) )? Molte persone che conosco pensano che un BST sia O(log n) solo perché è un albero .

Se stai cercando qualcuno che lavorerà al metal, e ha bisogno di un solido fondamento molto nelle strutture dati ... anche queste potrebbero essere lontane banale per i candidati che stai cercando di assumere.

Ciò presuppone, naturalmente, che si desideri che uno sviluppatore che ha le nozioni di base / elementi fondamentali delle strutture dati e la loro posizione trarranno vantaggio da tali elementi fondamentali. Se vuoi qualcuno che possa mettere insieme una pagina asp in pochi secondi, intervista per quello. Il punto non è scegliere una domanda dell'intervista perché lo fanno tutti, ma sceglierne una che misuri le abilità che stai cercando. Personalmente, penso che le domande sulla struttura dei dati siano buone, lista concatenata o no.

    
risposta data 11.01.2012 - 19:54
fonte
3

Does this question have enough utility to be used commonly for evaluating programming candidates across the board?

No, assolutamente no. A seconda di come è formulato, ciò che dirà varierà da "questo candidato sa come progettare un elenco collegato" a "questo candidato può programmare un elenco collegato nella lingua X". Se chiedi uno pseudocodice, tenderà di più verso il primo. Se chiedi un'implementazione in una particolare lingua, acquisirai maggiore comprensione della lingua (specialmente con C e C ++, dove puoi gestire puntatori, riferimenti e strutture).

Direi addirittura che non è possibile valutare tutti i candidati usando le stesse domande. È necessario personalizzare le domande dell'intervista per valutare le competenze che si stanno cercando nella posizione.

Se la persona sarà in grado di scrivere codice, penserei di includere un algoritmo e / o una domanda sulla struttura dei dati, purché sia rilevante per la posizione. Proverò a scegliere qualcosa che potrebbe essere stato discusso o usato prima. Mi concentrerei anche su cose diverse dalla semplice implementazione di detti algoritmi e strutture dati, come il tempo di esecuzione e il consumo di memoria (cose come la notazione O grande). Questi concetti sono rilevanti non solo per creare la struttura dei dati, ma anche per scegliere quale implementazione è più adatta (ad esempio, ArrayList rispetto a LinkedList per esempio).

    
risposta data 11.01.2012 - 19:50
fonte
3

Non penso che un normale lavoro di programmazione debba essere una domanda che elimina un candidato. Ma è un buon modo per vedere se hai a che fare con un programmatore molto anziano o con qualcuno che è stato per molto tempo un modulo di codifica della scimmia. E anche così, non dovrebbe essere un criterio fondamentale per la scelta di un programmatore. Forse è un grande programmatore con una brutta memoria e non ha letto le parole "elenco collegato" per anni (o non ricorda il nome), ma può comunque fare buone app.

Quindi, come alcuni hanno detto, se sta per essere un lavoro che ha bisogno di lavorare con la lista collegata e un sacco di algoritmi elaborati, ecc. allora ok. È se per i soliti dati di input su un modulo, convalidare e mostrare sia un po 'inutile e ingiusto.

    
risposta data 12.01.2012 - 10:37
fonte
2

Penso che questo sia un cattivo esempio di una domanda di intervista, ma per una ragione diversa. Una lista collegata è un concetto talmente semplice che per sapere cos'è è sapere come implementarlo. Se la persona non sa cos'è una lista collegata, devi spiegare come funziona, e così facendo dai la risposta senza scoprire nulla su se sanno o meno come risolvere i problemi . Quindi la domanda è riducibile a "sai già cos'è una lista concatenata e come funziona?", Che non ti dice nulla di utile sulla loro idoneità come programmatore.

    
risposta data 11.01.2012 - 18:50
fonte
2

Scrivere una implementazione di liste collegate è una buona domanda di intervista, perché rivelerà molto sul modo di codifica del candidato:

  • Sa cosa è un'API? Può usare il codice di altre persone? Può scrivere codice in modo che altre persone possano usarlo?

  • Sa cosa è una lista collegata? Conosce Collezioni, Strutture dati, Algoritmi?

Se non sa nemmeno quali metodi dovrebbe offrire una lista collegata, sai che probabilmente non ne ha mai usato uno, o sa quando usarne uno.

  • Come gestisce il problema? Comincia prima con un'analisi, una piccola specifica, alcuni test in anticipo? O inizia semplicemente a hackerare allegramente?

  • Gestisce i casi limite? Che ne pensi di rimuovere l'ultimo nodo dall'elenco collegato? Cosa succede se qualcuno tenta di aggiungere un riferimento alla lista collegata stessa alla lista collegata e quindi elimina l'intera cosa?

  • Gestisce le eccezioni? Ogni linguaggio di programmazione ha le proprie convenzioni per la gestione delle eccezioni: in Java, ci si aspetta che un oggetto LinkedList lanci una NoSuchElementException quando si esegue un getFirst () in una lista vuota. Altre lingue potrebbero tornare indefinite, -1 o una costante.

risposta data 12.01.2012 - 08:36
fonte