Como entrevistador, ¿qué habilidades y conocimiento de los marcos espera de un buscador de trabajo de C #?

Suponiendo que ponemos los algoritmos, las estructuras de datos y la informática en general fuera del alcance de esta pregunta, generalmente busco:

  • Comprensión de los fundamentos de C # (escribiré más sobre esto más adelante)
  • Experiencia con marcos de inyección de dependencias : Autofac, Unity o algo similar. DI es extremadamente útil en lenguajes estáticamente tipados y pruebas unitarias, por lo que la razón principal para verificar esto es entender cuánto estuvo involucrado en la codificación C # de la vida real. Casi cualquier proyecto de moderado a grande involucra algún tipo de inyección de dependencia, y si sabes cómo usarlo para, por ejemplo, burlarte de las dependencias en las pruebas, es genial.
  • Si se trata de la web, definitivamente verificaría cuánto sabe sobre ASP.NET Core / MVC / Web API . Buena comprensión de la tubería de procesamiento de solicitudes, filtros, controladores, módulos, ciclo de vida de la aplicación, etc., todo esto es una ventaja. No creo que nada de esto sea crítico, por otro lado, el hecho de que lo sepas bien actúa como una evidencia de que probablemente sepas muchas otras cosas relacionadas con .NET / codificación en general, y como resultado, eres espera cometer menos errores y encontrar problemas más rápido.
  • Desafortunadamente, no estuve involucrado en el desarrollo de aplicaciones de escritorio por un tiempo, por lo que no puedo proporcionar una respuesta confiable relacionada con esta parte. Aunque los conceptos de WPF, MVVM y XAML son probablemente los primeros temas sobre los que preguntaría en este caso.
  • Experiencia con marcos ORM. Algunas de las posibles preguntas aquí son:
    • ¿Qué ORM usaste?
    • ¿Cuáles son algunos problemas interesantes que has enfrentado?
    • ¿Cómo manejas las actualizaciones de esquema?
    • ¿Hubo algún problema de rendimiento? En caso afirmativo, ¿cómo se abordaron?
  • Experiencia con bases de datos SQL. Lo sentimos, no hay detalles aquí, probablemente debería escribir una respuesta separada relacionada con esta parte 🙂
  • ¿Qué otras bibliotecas usaste o te gustaron? Esta es una pregunta bastante abierta, pero en base a ella puede obtener una gran cantidad de información sobre el candidato:
    • ¿Se inclina hacia la reutilización de lo que ya existe o tiende a implementar las cosas por su cuenta?
    • ¿Puede mencionar algunas buenas preocupaciones que se tuvieron en cuenta para elegir X vs Y, o implementar su propia versión de X? ¿Fueron estas preocupaciones realmente críticas?
    • ¿Cuán profundamente tiende a aprender lo que usa? Por ejemplo, ¿puede responder a algunas preguntas no triviales sobre algunas de estas bibliotecas (por supuesto, si puedo formular algunas de esas preguntas)? Los “aprendices profundos” suelen cometer menos errores.
  • Herramientas de desarrollo:
    • Debe saber / usar: Visual Studio
    • Es bueno saber / usar: ReSharper, Git, TeamCity / otra herramienta de CI, JIRA / Asana / Trello.

Ahora volvamos a los fundamentos de C #. Normalmente hago las preguntas 2-3 de la lista a continuación, ajustando la complejidad según las respuestas. La mayoría de estas preguntas requieren aproximadamente 1 minuto. para proporcionar una buena respuesta para un candidato fuerte, y muchas de ellas no son preguntas en las que el candidato puede llegar a una respuesta sin algún conocimiento previo necesario para responderla. Por lo tanto, no vale la pena gastar más de 15 min. en esta parte, especialmente si ve que las respuestas son débiles, definitivamente es mejor obtener más señal en su entrevista sobre problemas de codificación y preguntas relacionadas con su experiencia pasada en lugar de hablar solo de C #. Por otro lado, esta parte debería permitirle identificar a alguien que conozca profundamente el conjunto de herramientas que utilizó día a día.

  • Muestre el código que el compilador C # genera debajo del capó de esta línea (es decir, escriba el mismo código sin la palabra clave “foreach”): foreach (var i in someIntEnumerable) doThis() ;
    (comprensión de IEnumberable API / basic LINQ, problema típico – falta using (var enumerator = ...) )
  • Lo mismo, pero para lock (someObject) doThis() ;
    (esta es una de las construcciones de uso frecuente; si veo que eres fuerte en otras preguntas de C #, podría hacerte una serie de preguntas relacionadas con el modelo de memoria de C #, sincronización de caché de CPU, barreras de memoria, otras primitivas de concurrencia, etc., aunque en realidad esto rara vez va más allá de la construcción misma)
  • Lo mismo, pero para using (someObject) doThis() ;
    (las cosas probablemente sean realmente malas si se hace esta pregunta)
  • Implementar IDisposable en SomeAbstractClass ;
    (muchos temas para debatir: la implementación correcta implica que usted sabe acerca de la finalización: problemas de orden de llamadas del finalizador, costo de finalización; los temas relacionados incluyen la recolección de basura en general, la resurrección, etc.
  • Escriba un ejemplo de alguna expresión LINQ simple y conviértala en una secuencia de llamadas generadas por C #
    (comprobar directamente si el candidato sabe algo sobre LINQ).
  • ¿Cuál es su mejor suposición sobre cómo funciona List (o StringBuilder )? Qué hace Agregar / Eliminar internamente, cuál es su complejidad temporal, etc. “¿Cuál es su mejor opción aquí?” Implica que la mayoría de los candidatos realmente no saben cómo funciona realmente ( es decir, casi nadie realmente intentó recompilarlo o estudiar su fuente). Espero que hagan una suposición razonable aquí, especialmente. si son fuertes en CS.
  • La misma pregunta sobre el Dictionary .
  • ¿Cuáles son algunas reglas que debe tener en cuenta para anular el object.Equals ? O el mismo, pero con una frase diferente: ¿por qué el compilador de C # muestra una advertencia si anula el método GetHashCode , pero no anula Equals ?
  • Cuánta memoria se asigna cuando se ejecuta esta línea de código:
    var x = new SomeClassWithNoFields();
    (preguntas relacionadas para candidatos más fuertes: diseño de objetos en memoria, búsquedas de VMT, tipos de referencia frente a valores, etc.)
  • Qué sucede cuando ejecuta esta línea de código:
    var o = (ISomeInterface) someStruct;
    (boxeo / unboxing)
  • ¿Cuáles son las expectativas predeterminadas relacionadas con la concurrencia para los tipos de C # / cómo deberían comportarse sus clases mientras se usan simultáneamente?
  • Explicar cómo funcionan las palabras clave async / en await . Esta es una de las partes bastante complicadas en C #, por lo que hay muchas preguntas relacionadas de diversa dificultad, por ejemplo, cómo funciona la cancelación, qué sucede si una de las tareas asíncronas se bloquea, cuál es el contexto de ejecución, etc.
  • Escriba un ejemplo de combinación izquierda de estilo SQL en LINQ
    (fácil para cualquiera que prácticamente haya usado LINQ en algún backend de base de datos, pero probablemente complicado para cualquier otra persona)

Definitivamente, esta no es una lista completa, pero la mayoría de las otras preguntas sobre los fundamentos de C # que me gustan son de este tipo.

Además, tenga en cuenta que a pesar del hecho de que algunas de las preguntas enumeradas aquí pueden ser bastante complicadas, no vale la pena hacer ninguna de las preguntas complejas si ve que las respuestas a las más simples son débiles. Una de las cosas que debe tener en cuenta en cualquier entrevista es que es un proceso muy estresante para cualquier candidato. Y si él (o ella) siente que falla con alguna pregunta, se vuelve aún más estresante. Por lo tanto, una buena estrategia es comenzar primero por preguntas más simples y aumentar gradualmente la complejidad, en lugar de lanzar la pregunta más compleja que conoces cuando entras: el primer enfoque podría ayudar al entrevistado a disminuir el nivel de estrés, pero el segundo una es probablemente la mejor manera de hacerlo entrar en pánico, y fallar independientemente de qué tan bien podría responder a cualquiera de sus otras preguntas.

Nivel de entrada

Sintaxis básica y estructura orientada a objetos. ¿Entienden objetos, modificadores de acceso, métodos, valor vs referencia, herencia e interfaces de implementación? ¿Pueden leer y escribir código básico como encontrar números primos, fizzbuzz, etc.

Tengo confianza en que eres entrenable, con ganas de aprender y un buen ajuste para el equipo.

Intermedio

Ahora, además de esas cosas, quiero verte demostrar que entiendes cosas como la inyección de dependencia, el acoplamiento flojo y las pruebas unitarias. Estoy buscando familiaridad básica con algunos tipos comunes como los de ADO.NET y conocimiento de algunos de los marcos como ASP .NET, WCF, WPF, etc.

En este punto, espero que sepa más de un idioma, aunque solo sea superficialmente.

Tengo confianza en que seguirá las especificaciones y los procedimientos, pero podrá reconocer y hablar si algo no funciona.

Experto

Espero que tenga una comprensión profunda de .NET Framework. Debería poder describir cómo funciona el recolector de basura, el código administrado frente al código no administrado, la pila frente al montón y familiarizarse con la mayoría de las palabras clave “azul oscuro” del idioma.

Espero que pueda mantener una conversación detallada conmigo sobre el funcionamiento de varios marcos a los que ha tenido mayor exposición. Espero que tenga opiniones razonables sobre los pros y los contras de varios conjuntos de herramientas y marcos. Al hablar sobre trabajos anteriores, quiero ver ejemplos de liderazgo y el proceso de pensamiento detrás de las decisiones técnicas que ha tomado. Debes poder defender tus elecciones sin ser un demagogo.

Lo más importante, cuando tengo estas discusiones técnicas, presto mucha atención a las preguntas que hace y a los supuestos que hace. Por lo general, no le pago a un experto para descifrar el código básico, les pago para analizar situaciones y resolver problemas con el ojo puesto en el equilibrio entre lo que es bueno para el negocio y lo que es técnicamente conveniente. Necesito saber que puedo confiar en usted para evaluar honestamente los factores y proceder sin prejuicios.

Tengo confianza en que si te arrojo cosas nuevas, lo descubrirás.

Trataré de ser lo más breve posible:

  • Nivel de entrada:

El candidato debe estar familiarizado con la sintaxis de C #, además debe mostrar comprensión de la. NET Framework. También una buena capacidad de resolución de problemas y mentalidad deben estar a la par

  • Intermedio:

El candidato debe mostrar completa familiaridad con las diversas bibliotecas incluidas en el. Net framework (trabajando con varias bases de datos y fuentes de datos, IO, XML, cifrado, UI, etc.)

  • Nivel experto:

En este nivel, la habilidad más demandada es la mentalidad de diseño / arquitectura del desarrollador, que incluye pero no se limita a:

  1. Patrones de diseño
  2. OOP / OOD
  3. SOA
  4. PODRÍA servicios
  5. Escalabilidad

Tenga en cuenta que esa es mi opinión y la respuesta varía mucho de una empresa a otra y depende del mercado

Cuando se trata de entrevistas técnicas, un candidato es evaluado por su conocimiento y capacidad. En cualquier plataforma de programación, se espera que un desarrollador de nivel de entrada tenga un conocimiento básico adecuado. Todos los fundamentos. Ignore la sintaxis porque alguien puede escribir un programa para una serie de fibbonacci sin un error, pero si no conoce la diferencia entre operadores con y sin signo, ¿qué ayuda sería?

Mi amable solicitud a todos los entrevistadores técnicos es:
No le pida al candidato que escriba un programa sofisticado para probar su conocimiento porque un candidato de nivel de entrada no puede recordar toda la sintaxis en C #. Apuesto a que nadie lo haría. En cambio, responda preguntas sobre fundamentos tales como,

¿Qué es una clase concreta, cuando dices int i, es int16 o int32? , explique la abstracción en la vida real, qué es una clase base, por qué el método principal es estático, ¿se puede cambiar un valor de variables estáticas durante el tiempo de ejecución ?, estas preguntas mostrarán la capacidad de los candidatos y le permitirán saber si realmente le gusta el idioma o solo prepd para pasar por el proceso.

Para un desarrollador experimentado, le daría un problema matemático simple para ver si puede escribir una lógica (si la sintaxis está mal, está bien) Microsoft no le dio inteligencia a tirar. Las preguntas profundizan en el marco, como cuándo elegiría una implementación de interfaz sobre una implementación de clase base, técnicas de implementación y preocupaciones de separación entre capas de código, etc.

La sintaxis por sí sola no prueba la capacidad de uno. La comprensión de lo básico sí.

En tecnología web, excavaría los conceptos básicos de Javascript para cualquier nivel de desarrollador. Por ejemplo, en jquery, para obtener un control por Id usas #, para obtener por clase usamos punto (.) Pero ¿cómo obtienes un elemento por su nombre? Es una pregunta bastante simple y directa, pero uno que nunca tuvo la intención de aprender no lo sabría.

Mi intención es encontrar al candidato apasionado, pero a veces también me conformo con candidatos promedio.

¡Buena suerte!

Varía de entrevistador a entrevistador.

Básicamente, si el candidato está en el nivel de entrada

El / ella debe saber

  • Conocimiento de programación
  • Conocimiento orientado a objetos
  • Sintaxis básica de C #
  • Buenas habilidades de resolución de programación
  • Algoritmos Fundamentales Básicos
  • Conocimiento básico de SQL

Si el candidato está en el nivel intermedio

  • Debe saber varios biblioteca, conocimiento marco
  • Fuerte conocimiento de programación orientada a objetos
  • Manejo de excepciones y conocimiento de la base de datos.
  • Mejores prácticas comunes e industriales.
  • Manejo de seguridad, etc.

Si el candidato está en nivel experto

  • Debe conocer el patrón de diseño y el conocimiento arquitectónico.
  • Fuerte en conocimiento de diseño de bases de datos
  • Profundo conocimiento sobre diferentes marcos y cómo funciona.
  • Manejo complejo de problemas
  • Gestión de equipos
  • Asignación de tareas y habilidades de gestión de proyectos
  • Conocimiento de costos de proyectos

Esta no es una respuesta completa a su consulta, sino una sugerencia útil: el entrevistador de mi empresa siempre le pidió a los candidatos para trabajos de C # que explicaran la diferencia entre estructuras y clases en C #. Dijo que la forma en que los candidatos explicaron esto le dijo mucho sobre su comprensión del lenguaje y la programación en general.

More Interesting

¿Cómo hace un reclutador para que sus candidatos seleccionen su CV?

Cómo manejar la entrevista de selección telefónica con el reclutador

¿Por qué un oficial de reclutamiento no me envía un correo electrónico si no puede comunicarse conmigo por teléfono?

¿Por qué los reclutadores no trabajan para ellos mismos, dados los bajos gastos generales?

¿Cuál es la diferencia entre entrenadores profesionales y reclutadores?

El nuevo trabajo en el que he estado durante un mes es una pesadilla. Encontré una oportunidad potencial, pero ¿debería incluir mi trabajo actual en mi currículum?

Conocí a un reclutador que me rechazó y al candidato que tomó el trabajo en una fiesta. Me sentí muy mal y me fui. ¿Cómo debería haber reaccionado?

¿Cuál es la mejor mentira que has escuchado o dicho durante una entrevista de trabajo?

Reclutadores: ¿qué haces cuando un candidato potencial para un trabajo hace un seguimiento con una llamada telefónica después de enviar su solicitud?

¿Cuáles son algunas de las mejores agencias de contratación en Kuwait?

Si un empleador me pide que sugiera un día adecuado para la entrevista, ¿cuánto tiempo se justifica?

¿Qué buscan los reclutadores en el currículum de un recién graduado a primera vista?

¿En qué medida los reclutadores confían o usan LinkedIn?

¿Cuáles son las cualidades y los antecedentes que los reclutadores buscan en los solicitantes en la sede de Facebook?

¿No odias cuando los 'reclutadores técnicos' juzgan tus habilidades y actúan arrogante mientras que en realidad casi no tienen habilidades?