Parece que hay una ENORME discrepancia entre lo que espero de alguien que ha estudiado programación durante unos años en la universidad y lo que uno realmente sabe.
No siento que esté haciendo preguntas demasiado complicadas en las entrevistas. Algunas de mis preguntas habituales son:
¿Cuál es la diferencia entre un tipo de referencia y un tipo de valor?
Si parece que el entrevistado realmente no comprende su propia respuesta, o si no conoce la terminología que estoy usando, me meto en más detalles al pedirle que me explique qué sucede cuando escribo int i = 0; en un método, ¿qué pasa con el objeto o = 0, objeto o = new MyClass (), etc.
Básicamente, hago todo lo posible para engañar al entrevistado para que me cuente sobre la pila de llamadas, el montón, etc., y trato de mantener los conceptos agnósticos del lenguaje. Si el entrevistado me dice que hizo mucho C, o C ++, o c #, profundizo en el lenguaje específico y posiblemente en los detalles de implementación.
Si es necesario, le pregunto al entrevistado qué es una pila de llamadas o dónde se almacenan los argumentos pasados a una función en el idioma imperativo de su elección.
La mayoría de los entrevistados no tienen idea de lo que es una pila de llamadas, y mucho menos las consideraciones de boxeo, etc.
¿Cuál es la diferencia entre una clase abstracta y una interfaz? ¿En qué casos deberías usar uno sobre el otro?
Por lo general, también les pido que imaginen un diseño de una pequeña biblioteca con un caso de uso destinado a usar alguna herencia y algunas fábricas abstractas.
La mayoría de los entrevistados no tienen idea de cuál podría ser el verdadero propósito de la herencia. Usualmente conocen algunas palabras clave (virtual, anulación, etc.), pero realmente no saben cuándo usarlas, y mucho menos explicar qué es una tabla virtual.
Aunque reviso los CV de antemano, incluso para las personas con 5 años de experiencia en proyectos de la vida real que involucran arquitecturas complejas, diría que menos del 25% de todos mis entrevistados pueden responder esas dos preguntas correctamente. Y cuando digo correctamente, no me refiero a "en profundidad" ... solo para tener una idea aproximada de cuál es el concepto.
Con respecto a los juniors, estoy de acuerdo con contratar a alguien que no sabe cómo organizar su tiempo muy bien, o alguien que no está acostumbrado a los procesos de construcción industrial, por ejemplo, pero tengo la sensación de que si uno no ha escuchado la palabra " callstack "después de unos años de estudiar Ciencias de la Computación, es estúpido o desmotivado, o eligió su universidad muy imprudentemente.
¿Crees que soy demasiado extremista aquí? ¿Es común aprender estos conceptos básicos después de haber completado la universidad? ¿Conoces a personas que no estaban familiarizadas con esto y se convirtieron en muy buenos ingenieros de software después de unos años? ¿Y cree que mi empresa podría tener problemas para atraer a personas con talento, o experimenta el mismo tipo de problemas en su propio proceso de contratación?
Editar. con respecto al "tipo inmediato", fue solo una traducción literal del francés al inglés, como solemos hacer nuestras entrevistas en francés. Lo arreglé en mi pregunta. Pero aún así, creo que todos entienden perfectamente lo que quise decir, lo que de alguna manera hace mi punto, ¿no?