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?
Respuestas:
La terminología es una caída común en una situación de entrevista.
Usted le hace una pregunta al entrevistado usando una terminología que significa algo para usted, pero el entrevistado puede saberlo por un término diferente, o simplemente puede conocer la teoría genérica sin aplicación a lenguajes o entornos específicos. Se producen malentendidos. Ninguna de las partes es feliz.
En realidad, el entrevistado comprende perfectamente que algunos valores pueden almacenarse directamente en un registro y otros hacen referencia a un trozo de memoria en otro lugar, pero debido a que hace la pregunta en un dominio específico, el punto de lo que está preguntando y lo que usted quiere que el entrevistado le cuente, realmente no se transmite.
Tal vez tenga muchas situaciones en las que el entrevistado de repente hace clic y dice 'Oh, de eso es de lo que está hablando', y luego explica de manera bastante adecuada.
Es un equilibrio difícil porque los programadores recién salidos de la universidad no tendrán la experiencia diversa que les brinda el desarrollo del mundo real en un entorno de equipo. Mientras tanto, los desarrolladores experimentados a menudo no van a recordar (o incluso estar interesados en) todo lo que aprendieron en la universidad porque es simplemente irrelevante para su uso diario.
Estos dos tipos de personas (sí - que es el entrevistado y el entrevistador) necesidad de aprender a comunicarse con uno al otro antes de que pueda aprender acerca de uno al otro. La responsabilidad recae en la persona con mayor experiencia (el entrevistador) para garantizar que esto suceda.
Sin mencionar el hecho de que algunas personas tienen fallas completas de memoria en las entrevistas. Yo incluido Recuerdo que me pidieron que escribiera un programa en C y no pude recordar el símbolo utilizado para acceder a un miembro desde un puntero (->) y tuve que preguntarle a alguien. Ni siquiera fue para mi primer trabajo. El chico me ha acosado ese momento durante los últimos 15 años :-)
Mucho más útil en mi opinión es la capacidad de comunicarse, poder resolver problemas de manera eficiente y completa; recoger las cosas rápidamente mostrar una actitud positiva positiva; interactuar bien con otras personas y otros valores fundamentales.
No renuncies a los entrevistados porque no saben qué es un tipo inmediato. Siga adelante.
fuente
Está solicitando conocimientos específicos del idioma, y los términos que utiliza no se utilizan 100% de la misma manera en todos los idiomas. Yo, por mi parte, no tengo idea de qué es un "tipo inmediato".
Además, tenga en cuenta que lo que se enseña en una universidad no es cómo generar código estándar en X, sino haber aprendido muchos conceptos subyacentes y visto varios paradigmas de programación. En otras palabras, es muy parecido a una licencia de conducir: aunque conozca la teoría básica, aún necesita mucha práctica real.
fuente
"Escucho y olvido. Veo y recuerdo. Lo hago y entiendo". (Y, en mi opinión, la comprensión conduce a una mejor retención de la memoria).
En pocas palabras, un recién graduado no tiene mucha experiencia, por lo que, como alguien más notó, no van a tener mucho más que el mínimo conocimiento, sin importar cuál sea su idioma "elegido".
Fui a una universidad que fue diseñada específicamente para simplificar el aprendizaje sobre la especialidad elegida (por ejemplo, no tendrías Literatura Histórica si fueras un experto en CS; lo más cerca que podrías estar de Literatura Histórica es Ciencia Ficción), y en línea recta de la universidad, no habría sido capaz de decirle lo que una interfaz era mucho menos su diferencia a una clase abstracta, aunque no nos enteramos de la abstracción (y abundan las interfaces en .Net, la tecnología aprendí). Es posible que hayamos tocado las interfaces, pero se perdió en todas las demás cosas que necesitábamos saber para aprobar la clase. No fue hasta mi primer trabajo fuera de la universidad que aprendí acerca de las interfaces, particularmente de alguna manera significativa.
Usted mencionó hacer entrevistas en francés, lo que hace obvio que estamos en diferentes países, por lo que su kilometraje puede variar, pero aquí en los EE. UU., Las universidades están notoriamente atrasadas en lo que respecta a la tecnología. Por lo tanto, a menos que esté tratando con lenguajes maduros (C / C ++, COBOL, etc.), también es bastante probable que lo que ha estado utilizando incluso durante años no esté disponible en la versión en la que los estudiantes han aprendido. Por ejemplo, .Net 3.0 introdujo Entity Framework, WPF, WCF y una serie de otras cosas interesantes, pero incluso mi escuela todavía estaba atrapada en .Net 1.1 y 2.0 (lo que significaba estar atascado con ADO.NET y ni siquiera aprender sobre Object -Mapeo relacional). Una escuela que usa PHP puede estar atascada en PHP 4 (no OOP).
Tenga en cuenta también que un estudiante tiene que tomar una tonelada de información que a menudo solo se usa por un corto período de tiempo. Los conceptos "avanzados", como la abstracción, a menudo se enseñan hacia el final de la clase, donde el estudiante solo puede tener una semana más o menos para jugar con él, mientras lucha con las otras clases que tiene que tomar, y posiblemente, en inicio de un trabajo a tiempo parcial o completo. Combina todos esos elementos y es una maravilla que la persona pueda recordar algo , mucho menos mantenerlo todo en orden.
En los EE. UU., Al menos, a menudo se supone que un graduado reciente no sabe nada más allá de los conceptos básicos genéricos (la diferencia entre pasar por valor y pasar por referencia, tal vez), porque se entiende que la teoría genérica y la resolución de problemas es la parte principal de escuela, no aprender los entresijos de un idioma determinado.
Recomiendo usar las preguntas que ha tenido más como un indicador de lo que necesitará enseñar / volver a enseñar (recuerde, es muy posible que simplemente no hayan aprendido el término que está tratando de usar, incluso si cree que es omnipresente), a diferencia de si el entrevistado es "inútil" o no. Combine eso con la medición de cuán dispuestos están a aprender y cómo son sus habilidades generales para resolver problemas (en serio, deles un acertijo para resolver y vea cómo lo hacen), y muy bien puede tener una futura estrella de rock que usted puede haber pasado por alto porque no sabían a qué se refería con "pila de llamadas".
fuente
Tiene bastantes vistas estrechas y las asume implícitamente.
Que yo sepa no hay universidad, donde la gente estudia programación durante unos años. Las universidades ofrecen cursos de informática, de los cuales la programación es un aspecto.
Regla de oro: si Lisp puede prescindir de la distinción, es solo desorden;)
Hablar de conceptos independientes del lenguaje es una buena idea. Sin embargo, ni el montón ni la pila son independientes del idioma.
Todos estos idiomas tienen especificaciones. La implementación no está definida por el idioma. C y C ++ pueden compilarse de forma cruzada utilizando LLVM para ejecutarse en Flash Player o en cualquier tiempo de ejecución de JavaScript. Esto hace que sus suposiciones sobre el montón y la asignación de pila sean nulas.
Con C #, es casi lo mismo. C # se JITED antes de la ejecución con mucha optimización, eso se puede hacer. Las variables locales, que son capturadas por los cierres finalmente terminarán en el montón, en lugar de en la pila, mientras que el análisis de escape permite almacenar objetos locales de alcance (que normalmente deberían ir al montón) para ser almacenados en la pila. La asignación adecuada del registro también reducirá en gran medida la necesidad de la asignación de la pila.
¿Qué le preguntarías a alguien que solo tiene una amplia experiencia en programación con Haskell? :PAGS
La idea básica detrás del autoboxing es que las primitivas también pueden tratarse como objetos (o al menos valores cuyo tipo se puede descubrir en tiempo de ejecución). Con respecto a esa abstracción, hay tres tipos de idiomas:
No veo por qué las personas no deberían usar idiomas de categoría 1 (en realidad es una buena idea). No veo por qué las personas que usan idiomas de categoría 2 realmente deberían molestarse. Y creo que todos los que usan un lenguaje de categoría 3, es decir, uno en el que una característica semántica básica simplemente se rompe, están usando el lenguaje incorrecto.
Ahora que es altamente subjetivo y realmente depende del idioma. C ++ no tiene interfaces. Objective-C no tiene clases abstractas. Yo diría que cualquier lenguaje que tenga ambos tiene una gran necesidad de rediseño. Muchos lenguajes modernos usan rasgos, mixins, categorías, roles y construcciones similares para proporcionar soluciones mucho más limpias para la reutilización de código que la herencia de implementaciones parciales. Los lenguajes basados en prototipos no tienen clases del todo de todos modos.
En definitiva, este es un tema difícil y controvertido. Una entrevista no es el lugar adecuado para resolver esta pregunta y realmente no convencería a nadie que solicite un puesto junior por no darme una buena respuesta.
Hay una serie de lenguajes orientados a objetos que no usan herencia ni vtables clásicas.
Mi consejo:
Lo importante es que comprenda cómo se pueden aplicar estos hechos simples y aislados para diseñar soluciones flexibles y mantenibles a problemas complejos.
Para llegar a la pregunta real:
Todas las empresas tienen problemas para atraer personas hábiles, excepto quizás los grandes jugadores. Eso es porque hay pocos de ellos. Y debido a la suposición, esa universidad hace que las personas sean hábiles. No lo hace. Los hace conocedores (suponiendo que tanto el estudiante como la universidad cumplan con su parte del trato). La experiencia es lo que hace que las personas sean hábiles.
Hay algunos que han acumulado experiencia antes de ingresar a la universidad y que continúan haciéndolo durante sus estudios. Porque les gusta la programación y porque cuando recogen alguna idea nueva durante un curso, tratarán de ver cómo pueden ponerla en práctica, lo primero que vuelven a casa. Este es el tipo de personas que te encantaría contratar. Pero hay pocos de ellos.
Es la pasión por la programación y la superación personal y su búsqueda lo que hace que los programadores sean buenos. A tiempo.
Creo que debes darte cuenta de que, lamentablemente, la mayoría de las personas entrarán y abandonarán la universidad sin suficiente experiencia en programación.
Al mismo tiempo, nuestra industria tiene una gran necesidad de programadores experimentados. Por lo tanto, creo que la misión de nuestra industria es tratar de intervenir. Y al entrevistar a candidatos para puestos junior, lo que realmente está buscando es gente dispuesta a aprender y mejorar. Y debe elegir con cuidado, porque necesitará invertir mucha energía y no quiere que se desperdicie.
Piense en ello como contratar una sangre fresca para convertirse en un piloto para su equipo de carreras: un buen piloto tiene una comprensión suficiente de la mecánica para hacer el mejor uso de su automóvil, pero este conocimiento por sí solo no sirve de nada (ni siquiera es una gran ventaja comienzo). Lo que está buscando es alguien dispuesto a trabajar duro en su propia mejora y bien con su equipo.
fuente
Independientemente del término "tipo inmediato" del que no tengo ni idea (¿tipo de valor? OK, no estaba seguro, gracias por actualizar), creo que tiene razón sobre sus preguntas y no es extremista. Estas son preguntas que se deben responder si uno sale de la escuela. Aun así, no descartaré a los candidatos de inmediato, todavía hay algunos que pueden tener potencial porque quieren aprender.
Para continuar con la analogía de la licencia de conducir: a algunas personas no les importa lo que sucede cuando insertan la llave (o presionan el botón "Inicio"). Simplemente lo hacen y conducen. Esto tampoco significa que no valen nada, solo que les tomará tiempo alcanzar el estrellato ;-)
Solo un comentario personal sobre el título / diploma: actualmente estoy trabajando con personas con antecedentes bioquímicos e industriales que tienen algunos años de experiencia en el campo de TI y también algunos tipos "experimentados" con experiencia en CS, y adivinen quiénes son los más conocedores. ¿Cómo funciona el motor del vehículo? ¡Sí, no son los chicos los que han estudiado CS! ¡Entonces estoy experimentando el hecho de que el diploma no siempre importa!
fuente
Generalmente no hago preguntas específicas sobre terminología o definiciones durante las entrevistas. Como han señalado otras respuestas, las personas tienen diferentes términos para diferentes conceptos y, si bien pueden comprender conceptualmente el tema, es posible que no puedan transmitírselo.
Con Juniors estoy intensamente enfocado en sus pasantías o proyectos escolares. Hago preguntas sobre preguntas sobre ellos, les dejo articular respuestas y luego empiezo a profundizar en su participación real en el proyecto, lo que aprendieron, lo que sintieron.
En general, si la persona tenía un peso muerto en el proyecto, entonces no pueden darme respuestas satisfactorias, por lo que es bastante fácil saberlo. Solo tenga cuidado de no confundir nervioso e introvertido con desinteresado y no involucrado.
Ser capaz de determinar el buen candidato que es tímido e introvertido es un poco difícil, pero la cultura en la que trabajo no sería buena para un desarrollador introvertido y tímido, por lo que si no pueden mantener una conversación productiva detallada conmigo, entonces No encajan bien.
fuente
Eso es muy injusto. Cuando eres estudiante, todo lo que puedes hacer es elegir la universidad mejor calificada en la que tus calificaciones te meterán, o tal vez aquella que anuncia que te permite jugar con perros robóticos que juegan al fútbol. Nada mas. Solo puede evaluar un curso universitario después de haberlo hecho, luego se fue y trabajó en la industria durante unos años y construyó algunos proyectos no triviales.
Incluso si muestra un gran letrero de neón en cada curso que dice "NO ENSEÑAMOS LA PILA DE LLAMADAS", ¿qué espera que hagan los estudiantes al respecto? ¿Pasar meses investigándolo para que realmente puedan entender lo que eso significa y cuánto necesitarían uno que lo enseñe? ¿Para cada curso con cada combinación de signos?
La gente no puede elegir su educación de manera realista.
fuente
Al entrevistar a nuevos graduados, me quedo con los temas enumerados en su CV. Si usaron Java, les preguntaré sobre Java. Si usaban Blub, me paso media hora leyendo sobre Blub y les pregunto sobre eso. Pero siempre pregunto usando las palabras clave del idioma. Si se trata de Java, preguntaré sobre "extiende" e "implementa", pero no sobre "subclase" y "hereda". Espero que los nuevos graduados puedan hablar sobre el código que han escrito, poder resolver un problema de programación simple y tener una idea de las estructuras básicas de datos (tablas hash y árboles).
fuente
Como Director que diseñó el proceso de entrevista, puedo informarle sobre lo que nuestra empresa espera de los nuevos graduados: espero que las personas puedan leer la documentación y aplicar los conocimientos. Por lo tanto, tenemos algunas tareas muy prácticas que les pedimos que realicen. Estas son tareas de codificación simples, no mucho más difíciles que el ejercicio promedio de la clase universitaria (los desarrolladores "buenos" experimentados pueden eliminarlo en aproximadamente 15 minutos). El candidato recibe una estación de trabajo con acceso a Internet, un compilador (en nuestro caso, un estudio visual) y archivos de ayuda.
Si no pueden escribir el código en estas condiciones, no reciben contrataciones. Simple como eso. Toda la excusa de "bueno, no sé el idioma" realmente nunca se me ocurrió porque cada candidato que viene a entrevistar aquí sabe que habrá una prueba, saben los idiomas y las herramientas que usamos por adelantado. Puede descargar Visual Studio Express en casa y hacer algunos conceptos básicos antes de pasar y pasar la prueba de nivel de entrada, aquellos que no se molestan ... bueno, eso es lo que yo llamo una bandera roja.
fuente