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 deIEnumberable
API / basic LINQ, problema típico – faltausing (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
enSomeAbstractClass
;
(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
(oStringBuilder
)? 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étodoGetHashCode
, pero no anulaEquals
? - 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
/ enawait
. 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.
- ¿Los reclutadores generalmente le piden que complete la solicitud de empleo después de dos rondas de entrevistas?
- ¿Cuáles son algunas señales de alerta que le permiten saber que algo está mal en su proceso de reclutamiento?
- ¿Los reclutadores de booking.com en otros países son holandeses o locales?
- ¿Hay reclutadores en el campo de las redes sociales?
- ¿Cuáles son algunos de los desafíos que enfrentan los reclutadores?
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.