Qual è la migliore domanda per l'intervista in C ++? [chiuso]


28

Se potessi porre una domanda a un programmatore C ++ per misurare le sue abilità in C ++, quale sarebbe?

La domanda che penso sia la migliore è: puoi chiamare "elimina questo;" all'interno di una funzione membro? (Ho inserito questo come link in modo che tu possa prima pensarci su, poi vai a La migliore domanda di intervista in C ++ - Mai! Per vedere la risposta corretta.)

Non lo chiedo perché mi aspetto che molte persone conoscano la risposta. Se lo facessero, non sarebbe utile una domanda. Chiedo di vedere se riescono a trovare la risposta corretta e come lo fanno.

Risposte:


8

Vorrei chiedere loro il motivo per cui la funzione di membro virtuale non può essere utilizzata con il modello in C ++. Certo, ci sono solo poche persone che possono effettivamente rispondere immediatamente alla domanda. Ma se un intervistato comprende correttamente la meccanica di base del C ++ (come funziona il modello in C ++, come viene implementata la funzione virtuale, in che modo compilatore e linker generano un eseguibile dal codice sorgente, ecc.), Potresti ottenere una risposta con l'appropriata procedura dettagliata- domande anticipate.

Aggiunto: la funzione di membro virtuale modello in questa risposta indica la funzione di modello che è la funzione di membro virtuale di una classe - non una normale funzione di membro nella classe di modello. Ci scusiamo per la confusione :(


3
@summerlight: mescolo funzioni e template dei membri virtuali e finora non è successo niente di male ... Quindi temo di non aver capito cosa stavi ottenendo. Vuoi illuminarmi :)?
Matthieu M.

2
Questa risposta è quasi ma non del tutto corretta. Non puoi avere funzioni membro virtuale modello, ma puoi avere funzioni membro virtuale di una classe modello.
catphive

1
@summerlight: ah capito! Domanda divertente sì, spesso si apre;)
Matthieu M.

2
@nikie: Questa è una funzione membro virtuale nella classe template - non una funzione membro template virtuale come template <typename T> virtual void doSomethingWithGenericTypeT (T arg);
summerlight

2
@summerlight: avresti dovuto includere quell'esempio nel tuo post. Non avevo idea di cosa volevi dire fino ad ora.
Bella

57

La migliore domanda di intervista in C ++ sarebbe un problema di programmazione, non una domanda a quiz.


Concordato. Non chiedere informazioni sulla sintassi che può essere cercata su Google. Invece, chiedi al candidato di scrivere una funzione semplice (anche se non banale), preferibilmente qualcosa che hai scritto nel tuo codice a un certo punto.
chrisaycock,

4
Anche qualcosa di semplice come "scrivere una funzione per invertire una stringa" posso dire molto su un programmatore esperto: Usano CString, char*, std::string, ecc .; restituiscono una nuova stringa o il contrario al loro posto? fanno scorrere manualmente i caratteri o chiamano una funzione di libreria? E ovviamente se non possono fare qualcosa di semplice come invertire una stringa, questo ti dice molto su di loro! Ci sono anche molte domande di follow-up, come funziona con Unicode, funziona con UTF-8, ecc.
Gabe,

16
@Ernelli: il C ++ non è mai veramente decollato? Sul serio?
Steven Evers,

1
@Gabe - buon punto. Ad esempio, fare un modello inverso sul posto con un parametro di politica non sarebbe molto generico, o (probabilmente la politica piuttosto che la funzione) piuttosto complesso, quando si tratta di stringhe di byte variabili per carattere. Non so se l'ottimizzazione non prematura (crea una nuova stringa perché è più facile essere generale) o l'agilità (non preoccuparti di quel caso fino a quando non accade, e il contrario sul posto non è più difficile, forse un po ' più semplice, per stringhe di caratteri a larghezza fissa) vincerebbe.
Steve314,

1
@Ernelli - stai dimenticando wchar_t e std :: wstring e loro significano cose diverse su Windows / Unix
Martin Beckett

32

Vorrei chiedere loro cosa gli piace di C ++ 0x. Da questo ho potuto "seccarli" in vari stereotipi:

  • super old school, usa i compilatori C ++ per compilare il codice C.
  • vecchia scuola, impaurita (o non ha senso) STL, non ha tenuto il passo con i cambiamenti
  • adora lambdas, adora STL che va più veloce dai riferimenti di valore, grande fan RAII, caldo da usare shared_ptr, unique_ptr ecc
  • è amaro perché tutto il codice boost scritto negli ultimi anni dovrà essere adattato per usare gli equivalenti C ++ 0x
  • metaprogrammer modello folle che mi fa esplodere la testa mentre risponde a una domanda relativamente breve

È probabile che alcuni di questi secchi siano perfetti per te e alcuni sono "grazie per essere entrati". Come domanda che ti fornisce molte informazioni velocemente, questo è il mio vincitore.


1
+1 per una buona domanda iniziale che incoraggia molte discussioni sull'argomento.
Gary Rowe,

8
Hai dimenticato la categoria di persone che non hanno idea di cosa sia C ++ 0x. Immagino che sarebbe più una risposta e si adatterebbe ai primi due tipi.
Fast Fish,

1
@Fast Fish, sì, le persone che sono come C ++ 0 whatnow? sarà generalmente una delle prime due categorie e in genere la illuminerà nella loro risposta.
Kate Gregory,

28

Sono un po 'confuso sul perché "puoi cancellarlo?" è considerata una domanda interessante. Chiunque abbia scritto codice COM in C ++ sa che la prima cosa che impari il primo giorno della programmazione COM di base è come usare correttamente "elimina questo". Suppongo che potrebbe essere utile determinare se, per esempio, qualcuno sta mentendo sul suo curriculum sull'avere scritto programmi COM, ma come domanda C ++ di conoscenza generale, se qualcuno non è in grado di rispondere immediatamente, allora non saranno adatti per la mia squadra.

Ad ogni modo, se il tuo obiettivo è quello di formulare una domanda che misura le competenze C ++, scegliere una domanda è la strada sbagliata da percorrere. Giralo. La domanda giusta da porre è:

Su una scala da uno a dieci, quanto sei bravo un programmatore C ++?

Questa non è la domanda che ti dà la risposta che desideri. Tutti dicono "otto" a prescindere. La domanda che ti dà la risposta che desideri è:

OK, quindi hai otto anni. Qual è un'area problematica con cui pensi che un sette avrebbe difficoltà a lavorare?

E boom , ora li hai. Se il candidato pensa che "qualcosa a che fare con la ricorsione" o "quando usare un distruttore virtuale" è il genere di cose con cui un sette ha difficoltà, allora sai che sanno un po 'di ricorsione o distruttori o altro e che la loro conoscenza non va molto oltre.

Ciò dovrebbe darti una calibrazione molto migliore di quella di fare qualche domanda banale. Se dovessi costringermi a farmi una buona domanda su un fatto su C ++, probabilmente farei una domanda del tipo "come progetteresti l'analizzatore semantico e il generatore di codice per la parte di un compilatore C ++ che si occupa di metodi virtuali chiamato in un distruttore di classe base? " Dovresti porre domande che hanno a che fare con cose reali su cui lavori e su cui è probabile che il candidato lavori. Questo è un problema su cui ho dovuto lavorare una volta, e penso che darebbe una visione abbastanza buona di come una persona progetta analizzatori semantici e generatori di codice, così come la loro conoscenza del C ++.


3
Inizierò a usare questo: OK, quindi sei un otto. Qual è un'area problematica con cui pensi che un sette avrebbe difficoltà a lavorare?
David Thielen,

10
Un'altra buona domanda qui: cosa potrebbero fare nove con cui avresti problemi?
David Thornley,

È così fantastico che è incredibile.
UpAndAdam,

14

Solo per divertimento, ho avuto programmatori C ++ che si divertivano con questo piccolo bambino:

Perché questo viene eseguito in un ciclo infinito (e sì, è digitato correttamente)?

int x=0;
while (x<3) {
  x = x++;
}

È incredibile quanti siano inciampati. Certo, non posso più usarlo dopo che è apparso su Stack Overflow . Mormora ... Mormora ...

(Per ottenere la risposta corretta leggi la confessione e leggi sicuramente i commenti)

Aggiunta domanda bonus

C'è il classico FizzBuzz di tutti i tempi (come appare nell'ormai famoso articolo Coding Horror ). Non l'ho mai usato in un'intervista da solo, ma dopo averlo buttato in giro per il team di sviluppo una volta a pranzo i risultati erano ... ehm ... sorprendentemente precisi.

Confessione

Sono stato coinvolto nella risposta standard "x ++ restituisce il valore originale". Tuttavia, la risposta corretta è che il comportamento non è definito a causa di punti sequenza. Nessuno ha mai menzionato i punti sequenza in tutte le volte che l'ho usato fino a quando non l'ho pubblicato qui.

Sono stato educato e vorrei sinceramente ringraziare tutti coloro che hanno avuto il tempo di commentare.


1
Gary Rowe: Anche se adoro quell'esempio (la prima volta che l'ho visto). Mi rattrista il fatto che le persone non lo vedano abbastanza rapidamente, figuriamoci non lo sappiano.
Orbling

2
Quando ero in Microsoft ho iniziato a chiedere ai candidati di fare un inserimento in un elenco collegato. Perché? Perché circa l'80% non ha potuto farlo. Incredibile ...
David Thielen il

43
Questo non è necessariamente un ciclo infinito. Qui stai invocando un comportamento indefinito (x viene modificato due volte senza punti di sequenza intermedi). E infatti, con la mia particolare compilatore, gcc (Debian 4.3.2-1.1) 4.3.2 sul mio particolare arco (86) che fa terminare.
Logan Capaldo,

2
@Logan +1 per menzionare i punti della sequenza. Avresti sicuramente una seconda intervista ;-)
Gary Rowe il

4
Questa è davvero un'ottima domanda per l'intervista perché dice al candidato se vale la pena tornare per un'altra intervista ;-). Se il colloquio pensa davvero che il codice si traduca in un ciclo infinito (e si suppone che l'intervistatore sia tecnicamente competente), allora il candidato può tranquillamente perdere "l'opportunità".
CB Bailey,

8

La prima cosa da fare è una semplice domanda sui puntatori. Sono rimasto stupito nel vedere quante persone che affermano di conoscere C ++ o, peggio ancora, C, non sono in grado di rispondere. Quindi vorrei porre una semplice domanda sulle funzioni virtuali. Questa combinazione ti dice molto rapidamente se la persona conosce davvero il C ++.


4
dipende dal loro background, non ha mai incontrato qualcuno con un background hardware che non capiva i puntatori ma alcuni che non avevano davvero incapsulamento o polimorfismo
jk.

7

Dipende molto dal tipo di C ++ scritto nella tua azienda. (Quando ho dovuto assumere programmatori C ++, non ho mai chiesto informazioni delete, perché ho chiesto loro delle tecniche per evitare di dover scrivere del deletetutto.)

Idealmente, vuoi assumere persone che scrivono codice al di sopra del livello di quello che il tuo team attualmente scrive, ma non troppo in alto, a meno che tu non voglia combinarlo con l'addestramento del team per portarlo a un livello superiore.



6

Credo che vorrei chiedere loro cos'altro sanno, o più probabilmente dare loro una domanda in qualcosa di completamente diverso.

Troppi programmatori C ++ su chi ha poca esperienza in altre lingue. L'esperienza ristretta è generalmente restrittiva.


6

La migliore domanda per un grande sviluppatore di C ++ è "Dimmi i motivi per cui NON dovremmo usare C ++?"


4

Non penso che ci sia una domanda C ++ migliore. Il C ++ è un linguaggio così grande, e con il C ++ 0X è cresciuto, che puoi essere forte in un certo sottodominio della lingua e non poco su un'altra parte della lingua. Una domanda "one shot" eserciterà solo la conoscenza di qualcuno di una piccola parte della lingua e rischia di trascurare la sua conoscenza di altri aspetti della lingua.



3

La mia domanda preferita da porre è semplice:

a) Hai iniziato con C e poi sei passato a C ++?

b) In tal caso, quali sono state le prime cose che hai imparato a fare diversamente?

Questa risposta di solito mi dà un'idea di come il programmatore si avvicina al C ++ e alla sua comprensione di OOP e C ++ in generale.

non c'è una risposta "giusta" o "sbagliata" qui, ma di solito è un ottimo modo per capire da dove proviene il candidato.


1

In realtà vorrei presentare alla persona un po 'di codice da un altro linguaggio di programmazione orientato agli oggetti e preferibilmente non nell'elenco dei linguaggi che conoscono. Il codice dovrebbe rappresentare un semplice compito svolto in quella lingua.

Il punto di tutto ciò non sarebbe determinare la loro conoscenza del C ++ ma scoprire quanto capiscono bene la programmazione. Quando capisci i concetti di base alla base della programmazione, puoi risolvere i problemi.


1

Come implementare le funzioni virtuali in C ++, spiegare uno scenario del mondo reale.


1

Al momento, direi: "Come faresti per implementare un costruttore di mosse per un container?"

La mia logica è che, poiché i costruttori di mosse sono una caratteristica del prossimo standard e non di quello attuale, la risposta del candidato indicherà se lo sviluppatore in questione persegue attivamente la conoscenza della propria lingua o si attiene solo ai trucchi che conoscono.


1

Penso che mi piacerebbe chiedere il loro parere del disegno di, diciamo, std::string. Vorrei anche chiedere loro se sono utilizzati altri progetti (ad esempio, MFC / ATL CString, wxStringe così via) e assumendo che hanno, chiedono loro di confrontare e contrapporre i disegni.

Le stringhe sono ampiamente utilizzate e quasi chiunque con esperienza reale nell'uso del C ++ avrebbe dovuto usare almeno una o due delle precedenti. Quasi tutti i design presentano alcuni compromessi tra purezza teorica e uso pratico. Alcuni possono funzionare davvero bene, ma solo se usati esattamente come previsto, mentre altri commerciano una maggiore versatilità per alcuni possibili goffaggini. In breve, quasi chiunque abbia esperienza reale dovrebbe essere in grado di esprimere alcune opinioni significative dei loro disegni e le opinioni dovrebbe dirvi una discreta quantità di come pensano, come si progettano codice, il grado in cui essi valore pragmatismo contro la purezza teorica, e così via.

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.