2009-11-07 10 views
6

Estaba buscando un puesto de trabajo recientemente y uno de los requisitos era que una persona tenga un 9/10 en sus conocimientos de STL.¿Qué preguntas debería responder un experto en STL, en una entrevista

Cuando juzgo mis habilidades, para mí un 10 es alguien que escribe libros avanzados sobre el tema, como Jon Skeet (C#), John Resig (JavaScript) o Martin Odersky (Scala).

Entonces, un 9/10 es básicamente un 10, así que no estoy seguro de lo que se esperaría en ese nivel.

Un ejemplo de algunas de las preguntas se encontraría en: http://discuss.joelonsoftware.com/default.asp?joel.3.414500.47

Evidentemente, se necesitará algo de código, pero se debe esperar todo para ser memorizados, ya que es un poco en STL.

En algunos casos, las bibliotecas de Boost amplían STL, por lo que se debe esperar que yo también use Boost, ya que a veces puedo confundir qué función proviene de cuál de las dos bibliotecas.

Estoy tratando de hacerme una idea si puedo responder a las preguntas que se esperarían de un experto en STL, aunque es extraño que ser un experto en C++ no sea un requisito.

ACTUALIZACIÓN

Después de reflexionar sobre las respuestas a mi pregunta, parece que lo que ellos pueden estar buscando es alguien que puede ver los límites de STL y ampliar la biblioteca, que es algo que no he hecho . Estoy acostumbrado a pensar dentro de los límites de lo que STL y Boost me brindan y permanecer dentro de las líneas. Puede que necesite comenzar a ver si eso ha sido demasiado limitante y ver si puedo salir de la caja. Espero que no signifiquen un 9 como lo hace Google. :)

+8

Para el registro; 9/10 no es "básicamente" un 10. Es un 9. –

+0

No estoy seguro de cuál sería la diferencia entre el 9 y el 10, ya que parecería un 9 puede escribir libros, pero tal vez no tan técnicos como los tres que listado. –

+0

Contrataría a alguien con estas credenciales, siempre que puedan decirme qué es STL _actually_. –

Respuesta

11

divertida - no lo hago me considero un 9/10 en STL (solía serlo, pero ahora estoy un poco oxidado), y estoy totalmente de acuerdo con el importante terminuo terminológico de @ joshperry (a menudo he estado en el registro como reprendiendo el abuso de STL a significa "las partes de la biblioteca estándar de C++ que originalmente fueron inspiradas por el STL de SGI"!), pero considero que su código de ejemplo es menor que "STL-ish óptimo". Es decir, para la tarea dada "poner todos los números enteros en un vector en la salida estándar.", ¿Por qué alguien alguna vez código, como sugiere @joshperry,

for(std::vector<int>::iterator it = intVect.begin(); it != intVect.end(); ++i) 
    std::cout << *it; 

en lugar de lo obvio:

std::copy(intVect.begin(), intVect.end(), std::ostream_iterator<int>(std::cout)); 

o similar ?! Para mí, eso sería clase de sugerir que no saben sobre std::ostream_iterator - especialmente si se supone que deben estar mostrando sus conocimientos STL, por qué no iban a hacerlo alarde -?)

En mi actual empleador, para ayudar a los candidatos a autocalificarse sobre la competencia en una tecnología, proporcionamos una guía útil: "10: inventé esa tecnología, 9: escribí el libro", y así sucesivamente. Entonces, por ejemplo, sería un 9/10 en Python, solo mi colega y amigo Guido puede reclamar un 10/10 allí. STL es un caso interesante: mientras Stepanov manejaba el diseño, mi colega Matt Austern hizo la primera implementación y escribió "el" libro al respecto también (this one) - así que creo que podría reclamar, si no un 10, a 9.5. Según ese estándar, podría estar entre 7 y 8 si pudiera tomarme una hora para actualizar (los asignadores y los rasgos personalizados son siempre complicados, o al menos así es como los recuerdo).

Por lo tanto, si está investigando a alguien que dice tener 9, póngalo sobre las partes más difíciles, como los asignadores y rasgos personalizados, presumiblemente, no perderán el ritmo en todos los contenedores, algoritmos e iteradores especiales , así que no pierdas mucho tiempo de entrevista con ellos (lo que sería clave si estuvieras buscando un 7 o 7.5). Tal vez les pida que den un ejemplo de la vida real donde usaron rasgos personalizados y/o asignadores, y codifiquen todos los detalles de la implementación, así como algunos usos de muestra.

Por cierto, si usted es el que necesite a Cram en C++ biblioteca estándar s en un nivel avanzado, me han dicho por amigos bien informados y no oxidadas que Josuttis 'book hoy en día es aún más útil que mi amigo Matt (Desafortunadamente, nunca he leído a Josuttis en profundidad, así que no puedo confirmarlo ni negarlo; sí veo que el libro tiene cinco estrellas en Amazon, que es impresionante ;-).

+0

Entonces, tu comprensión de 10 es más alta que la mía, lo que me preocupa más, pero antes de presentarla, supongo que la primera pregunta es hacerte una idea de la diferencia entre 9 y 10. Recuerdo una empresa que me hizo clasificarme en 3 páginas de habilidades, de 0 a 5, pero en realidad tenían una clave, con ejemplos para cada una de ellas. –

+1

No me di cuenta de que las respuestas eran para criticar las respuestas de otras personas, creo que los comentarios no son lo suficientemente obvios como para tratar de hacer que se vean mal. Toda la idea detrás de mi _sample_ era hacer una pregunta que le hiciera sentir si la persona sabía cómo usar los iteradores correctamente. Claro, si solo estuvieras produciendo un int simple, entonces mi construcción no es la mejor solución. Incluso si haces algo más complejo, puedes usar for_each, pero no creo que el ejemplo de for loop que di sea inútil en 0 casos. Solo el trato Sith en términos absolutos, como solía decir mi amigo Obi Wan. – joshperry

+0

@James, si la empresa para la que está entrevistando no explica lo que significan las calificaciones, eso es una mala señal y usted está en pleno derecho de hacer su interpretación; sería completamente razonable interpretar 10/10, carente de pautas de interpretación de los entrevistadores/empleadores potenciales, para significar "en el 10% superior de los profesionales" que fácilmente podría abarcar el rango 8-10 en la interpretación de mi empleador, por ejemplo! –

0

Bueno, podría entrar en la entrevista y decir "Me di cuenta de que su publicación solicitó a alguien con conocimientos en STL, pero ese término a veces se usa para significar: (1) biblioteca estándar C++; (2) la biblioteca Stepanov diseñado en HP; (3) las partes de [1] basadas en [2]; (4) implementaciones de proveedores específicos de [1], [2] o [3]; (5) los principios subyacentes de [2] Como tal, el término es muy ambiguo y debe usarse con extrema precaución. Si se refería a [1] e insiste en abreviar, "stdlib" es una opción mucho mejor. "*

Honestamente, ya que es biblioteca es algo finito y probablemente no composeable a infinitivo nauseabundo como un lenguaje propiamente dicho. Entonces, diría que cualquier pregunta que les hiciera usar algunos de los algoritmos stdlib sería efectiva para ver si los conocían bien.

Como los iteradores son una parte integral de stdlib, también podría pedirles que "Pongan todos los enteros en un vector como estándar". Yo esperaría algo como:

// thanks to onebyone 
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "); 

Si escriben algo como lo siguiente que probablemente no están muy familiarizados con los iteradores:

for(int i = 0; i < vec.size(); ++i) 
    std::cout << vec[i]; 

También una cosa interesante que buscar es si lo hacen en using namespace std la parte superior de su archivo de código. Pregúnteles por qué, y si no dicen algo como "Lo uso solo para el código de demostración breve" o si lo colocan en un archivo de encabezado, agradézcales por entrar y envíelos por la puerta.

Otro aspecto del stdlib es el uso intensivo de plantillas, la persona debe tener una buena comprensión de la programación básica de plantillas para la sustitución de tipos.Quizás les pida que "escriban una función que escriba todos los elementos de cualquier contenedor stdlib para que salga de forma estándar". Yo esperaría a ver algo como:

template<typename InputIter> 
void Output(InputIter it, InputIter end) { 
    while(it != end) 
     std::cout << *it++; 
} 

Estos son probablemente no 9/10 preguntas, pero las interesantes creo que un 2-3/10 debe saber.

Una dificultad de 9/10 Diría que es escribir un iostream derivado correctamente sin utilizar las clases base de la corriente de impulso. Sin embargo, es probable que haya una gran diferencia entre el uso de la stdlib y extendiéndose ... que

* (gracias a nolyc en freenode ## C++ para la cita)

+0

nolyc es un bot, así que gracias a quien haya puesto esa cita en el bot ... – joshperry

+5

"Pon todos los enteros en un vector como salida estándar". Esperaría 'std :: copy (vec.begin(), vec.end(), std :: ostream_iterator (std :: cout," ");'.En AWL, el escribir un bucle es un signo de debilidad ;-) –

+0

lol, estaba esperando respuestas alternativas a mis preguntas :) Me encantan los iteradores de salida, y definitivamente son un signo de un 6-7 +/10! – joshperry

2

Es solo un requisito estúpido para un trabajo. Al momento de contratar, usted quiere un gran programador bueno primero, segundo conocimiento específico.

Sería razonable, en este día y edad, esperar conocimiento/familiaridad/etc. con el STL. Pero a menos que el trabajo sea para volver a implementar el STL, no necesita 9/10. Aunque ese es el trabajo, usted solo necesita un programador excelente que tenga mucha experiencia con las plantillas (no solo las use).

Por ejemplo, para todas las respuestas a "dar salida a los enteros de un vector", probablemente se genere exactamente el mismo código. Solo la versión que ha sido diseñada para manejar cualquier contenedor de cualquier elemento muestra una pista de "excelente" vs bueno (solo una pista). es decir, la capacidad de abstraer.

De todos modos, solo hazlo. Esté preparado para usar el STL para ayudar a resolver otros problemas. Nada mas.

(De hecho, para la mayoría de las entrevistas en las que he estado, el requisito era NO usar el STL, es decir, escribir una función que invierte una cadena. Mi primera respuesta es que probablemente haya algo en el estándar lib que haría eso. Luego dicen, claro, por supuesto, pero ¿y si tuvieras que escribirlo tú mismo ...)

+0

Parece que tienen una prueba de tecnología que usa STL en gran medida, y parece que su juicio es que si usted es un experto en STL, entonces debe estar en C++. Entonces, un experto puede ser alguien que conoce C++ lo suficiente como para volver a implementar STL desde cero, pero puede usar STL cuando sea necesario, tal vez. –

2

Debo preceder esto al señalar que creo que los mismos criterios deberían aplicarse no solo a STL (independientemente de la definición que prefiera para eso), pero también para muchos otros tipos de cosas.

Desde mi punto de vista, simplemente conocer los componentes existentes de STL y poder aplicarlos bien probablemente no debería calificar como un 9/10. Por el contrario, consideraría ese nivel alrededor de 7/10. 8/10 es cuando la persona puede ampliar STL proporcionando nuevos componentes que sigan su filosofía y se ajusten a los componentes existentes de forma natural y fácil.

Para el 9/10, esperaría ver a alguien que no solo puede proporcionar nuevos componentes, sino que puede mejorar algunos de los existentes, como Boost :: bind. Para 10/10, esperaría ver que esto vaya más allá de las mejoras bastante ad hoc y localizadas de un 9/10, y avanzar hacia un nivel más arquitectónico, como el uso de rangos en lugar de iteradores individuales. Para un ejemplo concreto, considere la diferencia entre los rangos de Boost y las ideas de Andrei Alexandrescu para los rangos. Los rangos de Boost son prácticos, útiles y convenientes, pero cambian lo que escribe, no cómo piensa. La versión de las gamas de Andre es mucho más exhaustiva: una solución arquitectónica que cambia la forma en que diseñas y piensas el código, no solo cómo lo escribes.

1

9/10 es bastante subjetivo. Me han hecho buenas preguntas sobre STL. Estos son ejemplos:

  • ¿Cuándo se debe utilizar un deque vs un vector (el conocimiento de cómo se implementan internamente es muy útil)
  • Reconocer código AWL que utiliza referencias inválidas, o puede terminar usando referencias inválidas.
  • Implemente operaciones simples en contenedores diferentes, y sepa dónde y cuándo usar std :: algorithm vs member functions de un contenedor.
+0

Sin embargo, estos parecen bastante básicos, algo fácil de responder en el primer capítulo de Essential STL, para los primeros dos, pero incluso el tercero está en ese libro. Pero gracias por las preguntas. –

Cuestiones relacionadas