¿Cuál es la mejor pregunta de entrevista C ++? [cerrado]

28

Si pudieras hacerle una pregunta a un programador de C ++ para medir sus habilidades en C ++, ¿cuál sería?

La pregunta que creo que es mejor es: ¿Puedes llamar a "eliminar esto"? dentro de una función miembro? (Pongo esto como un enlace para que pueda pensarlo primero, luego vaya a La mejor pregunta de entrevista de C ++ - ¡Nunca! Para ver la respuesta correcta).

No pregunto esto porque espero que la mayoría de la gente sepa la respuesta. Si lo hicieran, no sería una pregunta tan útil. Pido ver si pueden llegar a la respuesta correcta y cómo lo hacen.

David Thielen
fuente

Respuestas:

8

Les preguntaría la razón por la cual la función miembro virtual no se puede usar con la plantilla en C ++. Por supuesto, solo unas pocas personas pueden responder la pregunta de inmediato. Pero si un entrevistado comprende adecuadamente la mecánica central de C ++ (cómo funciona la plantilla en C ++, cómo se implementa la función virtual, cómo el compilador y el enlazador generan un ejecutable a partir del código fuente, etc.), puede obtener una respuesta con el paso a paso apropiado. Paso preguntas principales.

Agregado: la función de miembro virtual de plantilla en esta respuesta significa función de plantilla que es función de miembro virtual de alguna clase, no una función de miembro normal en la clase de plantilla. Perdón por confundir :(

summerlight
fuente
3
@summerlight: Mezclo funciones y plantillas de miembros virtuales y no ha pasado nada malo hasta ahora ... Así que me temo que no entendí a qué se refería. ¿Te importaría iluminarme :)?
Matthieu M.
2
Esta respuesta es casi pero no del todo correcta. No puede tener funciones de miembro virtual de plantilla, pero puede tener funciones de miembro virtual de una clase de plantilla.
catphive
1
@summerlight: ¡ah! Pregunta divertida sí, a menudo aparece;)
Matthieu M.
2
@nikie: Esa es una función de miembro virtual en la clase de plantilla, no una función de miembro de plantilla virtual como template <typename T> virtual void doSomethingWithGenericTypeT (T arg);
Summerlight
2
@ verano: Deberías haber incluido ese ejemplo en tu publicación. No tenía idea de lo que querías decir hasta ahora. Buena pregunta, sin embargo, ahora que lo entiendo ;-)
nikie
57

La mejor pregunta de entrevista de C ++ sería un problema de programación, no una pregunta de prueba.

Steven Evers
fuente
Convenido. No pregunte acerca de la sintaxis que se puede buscar en Google. En su lugar, haga que el candidato escriba una función fácil (aunque no trivial), preferiblemente algo que haya escrito en su propio código en algún momento.
chrisaycock
44
Incluso algo tan simple como "escribir una función para revertir una cadena" se puede decir mucho acerca de un experto programador: ¿Utilizan CString, char*, std::string, etc .; ¿Devuelven una nueva cadena o invierten en su lugar? hacen un bucle manual sobre los caracteres o llaman a una función de biblioteca. Y, por supuesto, si no pueden hacer algo simple como invertir una cadena, ¡eso también te dice mucho sobre ellos! También hay muchas preguntas de seguimiento, como si funciona con Unicode, si funciona con UTF-8, etc.
Gabe
16
@Ernelli: ¿C ++ nunca despegó realmente? ¿Seriamente?
Steven Evers
1
@ Gabe: buen punto. Por ejemplo, hacer una plantilla en el lugar inverso con un parámetro de política no sería muy general, o (probablemente la política más bien la función) bastante complejo, cuando se trata de cadenas de bytes variables por carácter. No sé si la optimización no prematura (crea una nueva cadena porque es más fácil ser general) o la agilidad (no te preocupes por ese caso hasta que suceda, y el reverso en el lugar no es más difícil, tal vez un poco más fácil, para cadenas de caracteres de ancho fijo) ganaría.
Steve314
1
@Ernelli: estás olvidando wchar_t y std :: wstring y ellos significan cosas diferentes en Windows / Unix
Martin Beckett
32

Les preguntaría qué les gusta de C ++ 0x. A partir de esto, podría "agruparlos" en varios estereotipos:

  • super old school, usa compiladores C ++ para compilar código C
  • vieja escuela, asustada (o no ve ningún punto para) STL, no ha estado al día con los cambios
  • le encantan las lambdas, le encanta STL cada vez más rápido de las referencias de valor, gran fan RAII, caliente para usar shared_ptr, unique_ptr, etc.
  • es amargo porque todo el código de refuerzo escrito en los últimos años deberá adaptarse para usar equivalentes C ++ 0x
  • metaprogramador de plantillas loco que hace explotar mi cabeza al responder una pregunta relativamente corta

Lo más probable es que algunos de estos cubos sean perfectos para usted y otros "gracias por venir". Como una pregunta que le brinda mucha información rápidamente, este es mi ganador.

Kate Gregory
fuente
1
+1 para una buena pregunta principal que fomenta muchas discusiones sobre el tema.
Gary Rowe
8
Olvidó la categoría de personas que no tienen idea de qué es C ++ 0x. Supongo que sería más una respuesta, y encajaría en los dos primeros tipos.
Fast Fish
1
@ Fast Fish, sí, ¿personas que son como C ++ 0-whatnow? generalmente será una de las dos primeras categorías, y típicamente iluminará eso en su respuesta.
Kate Gregory
28

Estoy algo desconcertado de por qué "¿puedes eliminar esto?" Se considera una pregunta interesante. Cualquiera que haya escrito código COM en C ++ sabe que lo primero que aprende el primer día de la programación COM básica es cómo usar "eliminar esto" correctamente. Supongo que podría ser útil determinar si, por ejemplo, alguien está mintiendo en su currículum sobre haber escrito programas COM, pero como una pregunta general de C ++, si alguien no puede responder de inmediato, entonces no encajarán bien para mi equipo

De todos modos, si su objetivo es llegar a una pregunta que mida las habilidades de C ++, elegir una pregunta es el camino equivocado. Voltealo. La pregunta correcta es:

En una escala del uno al diez, ¿qué tan bueno eres un programador de C ++?

Esta no es la pregunta que te da la respuesta que deseas. Todos dicen "ocho" independientemente. La pregunta que te da la respuesta que deseas es:

OK, entonces eres un ocho. ¿Cuál es un área problemática con la que crees que un siete tendría dificultades para trabajar?

Y boom , ahora los tienes. Si el candidato piensa que "algo que ver con la recursividad" o "cuándo usar un destructor virtual" es el tipo de cosas con las que un siete tiene dificultades, entonces sabe que sabe un poco sobre la recursividad o los destructores o lo que sea , y que su conocimiento no va mucho más allá de eso.

Eso debería darle una calibración mucho mejor que hacer una pregunta de trivia. Si me obligara a formular una buena pregunta sobre un hecho sobre C ++, probablemente le preguntaría algo como "¿cómo diseñaría el analizador semántico y el generador de código para la parte de un compilador de C ++ que se ocupa de métodos virtuales? llamado en un destructor de clase base? " Debes hacer preguntas que tengan que ver con cosas reales en las que trabajas y en las que es probable que el candidato trabaje. Ese es un problema en el que tuve que trabajar una vez, y creo que daría una idea bastante buena de cómo una persona diseña analizadores semánticos y generadores de código, así como su conocimiento de C ++.

Eric Lippert
fuente
3
Voy a comenzar a usar este: OK, entonces eres un ocho. ¿Cuál es un área problemática con la que crees que un siete tendría dificultades para trabajar?
David Thielen
10
Otra buena pregunta aquí: ¿qué podría hacer un nueve con el que tendrías problemas?
David Thornley
Eso es tan brillante que es increíble.
UpAndAdam
14

Solo por diversión, he tenido programadores de C ++ tambaleándose con este pequeño bebé:

¿Por qué esto se ejecuta en un bucle infinito (y sí, está escrito correctamente)?

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

Es sorprendente cuántos se tropiezan. Por supuesto, no puedo usarlo más después de que apareció en Stack Overflow . Murmurar ... murmurar ...

(Para obtener la respuesta correcta, lea la confesión y definitivamente lea los comentarios)

Pregunta de bonificación añadida

Existe el clásico de todos los tiempos FizzBuzz (como aparece en el ahora famoso artículo Coding Horror ). En realidad, nunca lo usé en una entrevista, pero después de compartirlo con el equipo de desarrollo una hora de almuerzo, los resultados fueron ... mmm ... sorprendentemente precisos.

Confesión

Estaba atrapado en la respuesta estándar "x ++ devuelve el valor original". Sin embargo, la respuesta correcta es que el comportamiento no está definido debido a los puntos de secuencia. Nadie mencionó los puntos de secuencia en todas las veces que usé esto hasta que lo publiqué aquí.

He sido educado y realmente me gustaría agradecer a todos los que se han tomado el tiempo para comentar.

Gary Rowe
fuente
1
Gary Rowe: Aunque me encanta ese ejemplo (la primera vez que lo veo). Me entristece que la gente no vea eso con bastante rapidez, y mucho menos no lo sepa.
Orbling
2
Cuando estaba en Microsoft comencé a pedirles a los solicitantes que hicieran una inserción en una lista vinculada. ¿Por qué? Porque alrededor del 80% no pudo hacerlo. Increíble ...
David Thielen
43
Esto no es necesariamente un bucle infinito. Aquí está invocando un comportamiento indefinido (x se modifica dos veces sin ningún punto de secuencia intermedio). Y de hecho, en particular con mi compilador gcc (Debian 4.3.2-1.1) 4.3.2 en mi arquitectura en particular (x86) que no termina.
Logan Capaldo
2
@Logan +1 para mencionar puntos de secuencia. Seguramente tendrías una segunda entrevista ;-)
Gary Rowe
44
Esta es una pregunta de entrevista realmente buena porque le dice al candidato si vale la pena volver para otra entrevista ;-). Si la entrevista realmente piensa que el código resulta en un bucle infinito (y se supone que el entrevistador es técnicamente competente), entonces el candidato puede perder la "oportunidad" con seguridad.
CB Bailey
8

Lo primero que debe hacer es una pregunta simple sobre punteros. Me sorprendió ver cuántas personas que afirman conocer C ++ o, lo que es peor, C, no pueden responder. Luego haría una pregunta simple sobre las funciones virtuales. Esta combinación le dice muy rápidamente si la persona realmente conoce C ++ o no.

Dima
fuente
44
depende de sus antecedentes, nunca conoció a alguien con experiencia en hardware que no entendiera los punteros pero algunos que realmente no obtuvieran encapsulación o polimorfismo
jk.
7

Eso depende mucho de qué tipo de C ++ está escrito en su empresa. (Cuando tuve que contratar programadores de C ++, nunca pregunté deleteporque les pregunté sobre técnicas para evitar tener que escribir por deletecompleto).

Idealmente, desea contratar personas que escriban código por encima del nivel de lo que su equipo escribe actualmente, pero no demasiado por encima, a menos que desee combinar esto con la capacitación del equipo para llevarlo a un nivel superior.

sbi
fuente
7

Cuéntame sobre el constructor de copias.

flujo libre
fuente
2
+1. Ese elimina a los candidatos incompetentes en cinco segundos.
Nemanja Trifunovic
6

Creo que les preguntaría qué más saben, o más probablemente les haría una pregunta en algo muy diferente.

Demasiados codificadores de C ++ sobre quienes tienen poca experiencia con otros lenguajes. La experiencia estrecha suele ser restrictiva.

Orbling
fuente
6

La mejor pregunta para un gran desarrollador de C ++ es "¿Dime las razones por las que NO deberíamos usar C ++?"

amadvance
fuente
4

No creo que haya una mejor pregunta de C ++. C ++ es un lenguaje tan grande, y con C ++ 0X ha crecido, que puede ser fuerte en un cierto subdominio del lenguaje y no poco sobre otra parte del lenguaje. Una pregunta de 'una sola vez' solo ejercitará el conocimiento de alguien de una pequeña parte del idioma y se arriesgará a pasar por alto su conocimiento de otros aspectos del idioma.

Sashang
fuente
3

Mi pregunta favorita es simple:

a) ¿Comenzó con C y luego cambió a C ++?

b) Si es así, ¿cuáles fueron las primeras cosas que aprendió a hacer de manera diferente?

Esta respuesta generalmente me da una idea de cómo el programador se acerca a C ++ y su comprensión de OOP y C ++ en general.

Aquí no hay una respuesta "correcta" o "incorrecta", pero generalmente es una excelente manera de tener una idea de dónde viene el candidato.

mohaps
fuente
1

En realidad, le presentaría a la persona un poco de código de otro lenguaje de programación que estaba orientado a objetos y preferiblemente no en la lista de lenguajes que conoce. El código debe representar una tarea simple realizada en ese idioma.

El objetivo de esto no sería determinar su conocimiento de C ++ sino descubrir qué tan bien entienden la programación. Cuando comprenda los conceptos básicos detrás de la programación, podrá resolver problemas.

Paul
fuente
1

¿Cómo implementar funciones virtuales en C ++? Explicar un escenario del mundo real.

usuario616
fuente
1

Por el momento, diría: "¿Cómo implementaría un constructor de movimiento para un contenedor?"

Mi razonamiento es que, dado que los constructores de movimientos son una característica del próximo estándar y no el actual, la respuesta del candidato indicará si el desarrollador en cuestión persigue activamente el conocimiento sobre su lenguaje o simplemente se atiene a los trucos que conoce.

Dragón Kaz
fuente
1

Creo que me gustaría pedir su opinión sobre el diseño de, por ejemplo, std::string. También me pregunto si han usado otros diseños (por ejemplo, MFC / ATL CString, wxStringetc.) y asumiendo que tienen, les piden que comparar y contrastar los diseños.

Las cadenas se usan lo suficiente como para que casi cualquier persona con experiencia real en el uso de C ++ debería haber usado al menos uno o dos de los anteriores. Casi todos los diseños incorporan algunos compromisos entre la pureza teórica y el uso práctico. Algunos pueden funcionar realmente bien, pero solo si se usan exactamente como se esperaba, mientras que otros intercambian una mayor versatilidad por alguna posible torpeza. En definitiva, casi cualquier persona que tenga experiencia real debe ser capaz de expresar algunas opiniones significativos de sus diseños y las opiniones que debe contar una buena cantidad acerca de cómo piensan, cómo se diseñan código, el grado en el que el valor pragmatismo frente a la pureza teórica, y así.

Jerry Coffin
fuente