Al leer este sitio y SO, he visto muchas historias de preguntas y respuestas de entrevistas que dicen que un candidato tuvo que implementar una lista vinculada desde cero. Por lo general, este es un ejercicio "dame" para programar candidatos a roles como escribir FizzBuzz. La idea es que si el candidato no puede hacer esto, no puede programar y debe ser rechazado casi de inmediato.
Sin embargo, no puedo evitar pensar que esto podría ser una mala práctica por las siguientes razones:
- Los lenguajes modernos de nivel superior como C # y Python usan de forma nativa las listas de manera extensa; escribir su propio objeto de lista vinculada solo sería necesario en circunstancias inusuales e incluso entonces probablemente desaconsejado.
- Los lenguajes de nivel inferior como C ++ tienen bibliotecas estándar con iteradores / contenedores de listas y objetos.
- A la luz de los primeros dos puntos, los codificadores pueden pasar años sin siquiera pensar en implementar una lista (vinculada, doblemente vinculada, etc.). Es posible que algunos ni siquiera vean tales cosas desde los días de la universidad.
- El poder de cálculo tampoco es el factor que era hace años, por lo que la eficiencia a través de punteros no es el problema que solía ser (en general).
- Una simple búsqueda en la web de algo como "ejemplo de lista enlazada" generaría muchos ejemplos de código que podrían memorizarse y escupirse, sin indicar realmente la verdadera competencia del solicitante.
Debo decir que usar una lista vinculada para conducir a preguntas abiertas / discusiones sobre la capacidad de resolución de problemas / pensamiento crítico de los candidatos es muy probablemente una muy buena práctica de entrevista. De cualquier manera, un entrevistador puede ver realmente cómo es un solicitante y cómo cree que es enormemente beneficioso.
Creo que este enfoque binario de "sin código de lista vinculada, sin trabajo" para los programadores que trabajan en una aplicación de escritorio o web está un poco desactualizado. También podría ser bastante dañino; un candidato que no puede recordar cómo trabajar adecuadamente con el líder de una lista podría ser un codificador y compañero de trabajo excelente y perderse en la mezcla. Pensamientos?
EDITAR : Hay muchos comentarios (buenos) que sugieren que si esta es una pregunta buena o mala, depende del contexto del trabajo. Estoy totalmente de acuerdo, así que permítanme reformular esta pregunta: la implementación de una lista vinculada es una pregunta de entrevista común para una amplia gama de trabajos de codificación, similar a preguntas como FizzBuzz o escribir una función recursiva para calcular factoriales. ¿Esta pregunta tiene suficiente utilidad para ser utilizada comúnmente para evaluar candidatos de programación en todos los ámbitos? ¿O debería considerarse una mala pregunta para hacer excepto para los puestos de "Desarrollador Senior, Equipo de Listas Vinculadas Integradas"?
fuente
Respuestas:
Si responder la pregunta te dice lo que quieres saber sobre un candidato, entonces es una buena pregunta para la entrevista. Si no te dice eso, es una mala pregunta.
Preguntas fáciles como FizzBuzz tienen un propósito específico. Si un candidato no puede codificar FizzBuzz, simplemente no puede codificar y puede finalizar la entrevista antes de tiempo. Calificaría la implementación de una lista vinculada solo un poco más difícil, pero puede iniciar una conversación sobre estructuras de datos en general que revelará mucho.
Solo recuerda que ninguna pregunta de la entrevista te dirá todo lo que quieres saber. Realmente necesita tener un grupo de preguntas listo. Debe hacer preguntas en una secuencia de la más fácil a la más difícil para poder encontrar el límite de lo que sabe el candidato. Si haces una pregunta y la clavan, aún no sabes qué más hacen o no saben.
Con respecto a su edición:
Creo que es una buena pregunta de propósito general que podría usarse para evaluar prácticamente cualquier candidato de programación. Solo necesita ser parte de un grupo más grande de preguntas. Sería un buen rompehielos para muchos tipos de posición (incluso si el candidato no puede implementar una lista vinculada desde cero, tal vez pueda explicar cómo han usado una antes y cuáles son las funciones clave), o el comienzo de una larga secuencia de preguntas más avanzadas para el puesto de "Desarrollador sénior, equipo de listas enlazadas integradas".
fuente
Me he perdido algunos trabajos simplemente porque mi mente se quedó en blanco en rompecabezas simples como este. También he hecho brillantemente en tales acertijos en otras entrevistas: sé cómo implementar una lista vinculada en un entorno sin presión. Nunca he tenido una queja sobre mis habilidades de alguien con quien he trabajado, así que tal vez no debería pensar que me he perdido mis trabajos, debería pensar que se me han perdido.
Así que sí, creo que es una práctica cuestionable en el mejor de los casos, pero lo entiendo. También he considerado la posibilidad de que no sea culpa de la pregunta sino del interlocutor, por hacerla una situación de alta presión.
Personalmente, prefiero hacer preguntas abiertas sobre un problema que el candidato ya ha resuelto, recientemente, si es posible, y que cubre tanto los problemas de codificación como de proceso. Si pueden traer muestras de código, fantástico.
fuente
Uno tiene que definir el tipo de trabajo de programación. Si está en el negocio de desarrollar compiladores y algoritmos, se deben esperar preguntas sobre tales cosas. Si está en aplicaciones de tipo de línea de negocio y espera que el candidato haga aplicaciones CRUD, entonces, puede ser que el conocimiento del concepto (sin escribir un programa) sea suficiente. Hoy en día, el conocimiento de las diferentes tecnologías requeridas para realizar el trabajo especialmente en el tipo de aplicaciones LOB reemplaza la necesidad de algoritmos limpios.
fuente
Mi respuesta es "depende". Haría esta pregunta si un candidato ha incluido C o C ++ en su currículum. Pedir implementar una lista vinculada es una buena prueba para la comprensión de los punteros, que es absolutamente esencial para un programador C o C ++.
Por otro lado, si un candidato no afirma saber C o C ++, no le pediría que implemente una lista vinculada, pero consideraría hacer preguntas al respecto. Explique a alto nivel cómo funciona una lista vinculada. ¿Cuál es la complejidad de agregar un elemento al encabezado de la lista? La cola de la lista? ¿Insertar un elemento en el medio de la lista? ¿Cuándo usarías una lista en lugar de una matriz? Estos son conceptos fundamentales de la estructura de datos que, en mi humilde opinión, todo programador debería saber.
fuente
No lo consideraría una mala pregunta de entrevista. Una gran cantidad de comprensión y programación de la estructura de datos comienza con una muy buena comprensión de las listas enlazadas. Dicho esto, hay algunas advertencias:
1) Es una pregunta tipo fizz-buzz. Simplemente está validando algo muy básico: ¿La persona entiende una lista vinculada? Pregúntalo y sigue adelante.
2) Las listas vinculadas tienen el desafío de que los idiomas que son muy adecuados para mostrar su comprensión de los conceptos de listas vinculadas (por ejemplo, C) pueden no coincidir con el idioma con el que trabajarán en el trabajo. Puede demostrar una comprensión básica en cualquier idioma con estructuras, por supuesto, pero pedirle a un candidato que vuelva a implementar una lista vinculada en Erlang sin usar [] no es el mismo desafío y no le dirá lo mismo sobre la comprensión de un candidato como pedirles que lo hagan en C. Pidiéndoles que lo hagan en C si el trabajo está alrededor de Java, también se pierde un poco el punto.
3) Con eso en mente y los desafíos generales de la "programación de pizarra", al hacer este tipo de preguntas, aceptaría pseudocódigo o diagramas siempre que demuestren comprensión de los principios básicos. No les pido a las personas que escriban código en una pizarra que sea sintáctica y lógicamente perfecta, especialmente si pueden dar la vuelta e identificar cualquier problema lógico cuando se les pide que lo revisen nuevamente. YMMV.
fuente
Cuando daba entrevistas, a menudo me pedían implementaciones de listas vinculadas y algunos algoritmos centrados en listas vinculadas. Resolví la mayoría de ellos, y algunos de ellos me obligaron a ejercitar mis neuronas un poco.
Si alguna vez tomara una entrevista, buscaría algún tipo de implementación de lista enlazada, no para probar qué tan buena es una persona en la codificación, sino para verificar cuánta atención presta una persona a los detalles. Cualquiera puede escribir una lista vinculada, pero es en los casos límite en los que incluso algunos buenos programadores fallan. No le pregunte:
Write a code for linked list in C/C++
. Pídale que escriba una lista genérica vinculada en C (no C ++), etc.Cambie el problema y ponga algunas otras condiciones en la lista vinculada, y tendrá una buena pregunta para hacer. Algunas personas están obligadas a cometer errores entonces.
fuente
void
punteros están ahí solo para eso ... :) El primer enlace que encontré en Google para "lista genérica enlazada en c" fue: daniweb.com/software-development/c/threads/109260 y otro fue una entrevista técnica .com / ... ¡Pensé que todos sabían esto!void
punteros no es genérica, sino general en cualquier momento. Pueden contener cualquier tipo de cosas e incluso mezclarlas todo lo que quieran, y eso exactamente lo hace no genérico para mí. Es como usar el tipo baseobject
en lenguajes orientados a objetos ...En mis cerca de 10 años hasta ahora programando profesionalmente (y alrededor de otros diez años como pasatiempo), no creo que alguna vez haya necesitado implementar una lista vinculada. Si alguien me pidió que lo hiciera durante una entrevista, podría responder preguntando si eso es algo que haré regularmente en el trabajo.
Por supuesto, es casi seguro que son puestos de trabajo allí donde se va a necesitar para escribir las implementaciones más o menos-sala limpia de algoritmos conocidos comúnmente - al igual que implementar una lista enlazada desde cero. Pero para la mayoría de los trabajos de programación, ¿qué valor específico tiene para la empresa que un candidato pueda hacerlo durante una entrevista? ¿Es realmente tan importante en un entorno tal que el candidato proporciona una implementación perfecta que maneja los casos límite correctamente, informa fallas de acuerdo con la práctica común en el lenguaje o marco, y así sucesivamente? ¿O puede pasar por alto eso y enfocarse en cómo abordan realmente un problema que quizás no hayan enfrentado en 10-20 años?
Cuando me entrevisté para mi trabajo actual, tenía muy poca experiencia con la pila de tecnología en uso en la empresa. Ahora, unos años después, regularmente tengo colegas que vienen a mí y me hacen preguntas no solo sobre los productos, la implementación de ellos y los estándares implementados por ellos, sino también sobre problemas de programación mucho más generales (justo ayer me preguntaron qué las implicaciones eran de una dependencia circular en una restricción predeterminada en SQL Server en el contexto de una tabla en particular y su uso en nuestro caso, razonando a través de ella, resultó que no había implicaciones en ese caso en particular). Tampoco necesitaba una nueva implementación de la lista vinculada para eso.
Haga preguntas que sean relevantes para el trabajo que probablemente se le asignará al candidatoe intente hacerse una idea de cómo se sienten al adquirir nuevos conocimientos. ¿Cómo iban a averiguar el significado de una sintaxis oscura que nunca han visto? (Si usted es una tienda de C, por ejemplo, entonces podría intentar una pregunta que involucre trigrafos). Para una posición de programación, ¿leen o contribuyen regularmente en foros como Stack Overflow? Si se les pidiera que realizaran alguna tarea en un lenguaje o marco de programación con el que tienen poca o ninguna experiencia (digamos, si usted es principalmente una tienda de Java, ¿qué pasa con Clojure o .NET?), Entonces, ¿cómo abordarían el problema? Tal vez elimine un error real de su rastreador de errores (incluso podría ser uno que se haya resuelto hace mucho tiempo) y pregúnteles cómo se enfrentarían en términos generales para resolverlo, y esté listo para explicar las partes relevantes del producto en cuestión.
Si el candidato puede manejar tipos de problemas relevantes para el caso de negocios y tiene una buena actitud hacia el aprendizaje de cosas nuevas, ese es probablemente un mejor indicador de ajuste para esa posición en particular que ser capaz de proporcionar respuestas enlatadas a preguntas bien conocidas, ya sea las preguntas son sobre FizzBuzz, listas enlazadas u otra cosa Agregue qué tan bien encaja el candidato con el equipo y creo que está en un terreno bastante seguro.
fuente
Por supuesto, la mayoría de las personas nunca necesitarían implementar una lista vinculada, pero para implementarlas desde cero probablemente necesitará manejar los punteros correctamente. Entonces, la idea es que haber formado un modelo mental consistente para punteros se correlaciona con el dominio del lenguaje, entendiendo lo que sucede en un nivel de máquina (abstracto) y la capacidad de abstraer en general.
No estoy diciendo que esta sea necesariamente la mejor medida, sino solo que hay alguna correlación.
fuente
Empiezas diciendo que son preguntas de 'dame', pero luego señalas que la gente comprensiblemente no podrá hacerlas. Estoy confundido.
Así es como lo pienso:
Creo que eso los hace buenas preguntas para hacer. Si te preocupa que estudien previamente para la entrevista, entonces envía una lista. Pídales que lo escriban circular y pregunten cuál es el tiempo de ejecución asintótico de su implementación. O haga que escriban otra estructura de datos común y / o rápida ... ¿Un árbol de búsqueda binario? ¿Una cola (FIFO)? ¿Una pila (FILO)? ¿Una ingenua (
O(n)
) cola de prioridad? Mucha gente que conozco piensa que un BST esO(log n)
solo porque es un árbol .Si usted está buscando a alguien que va a trabajar el metal, y necesita una muy sólida base en estructuras de datos ... estos pueden incluso ser mucho demasiado trivial para los candidatos que está buscando contratar.
Esto supone, por supuesto, que desea un desarrollador que tenga los fundamentos / fundamentos de las estructuras de datos y su posición se beneficiaría de esos fundamentos. Si quieres a alguien que pueda armar una página asp en segundos, entrevista para eso. El punto no es elegir una pregunta de entrevista porque todos los demás lo hacen, sino elegir una que mida las habilidades que estás buscando. Personalmente, creo que las preguntas sobre estructuras de datos son buenas, lista enlazada o no.
fuente
No absolutamente no. Dependiendo de cómo esté redactado, lo que le dirá irá desde "este candidato sabe cómo diseñar una lista vinculada" hasta "este candidato puede programar una lista vinculada en el lenguaje X". Si solicita un pseudocódigo, tenderá más hacia el primero. Si solicita una implementación en un lenguaje en particular, obtendrá más información sobre su comprensión del lenguaje (especialmente con C y C ++, donde puede tratar con punteros, referencias y estructuras).
Incluso iría tan lejos como para decir que no es posible evaluar a todos los candidatos con las mismas preguntas. Debe adaptar sus preguntas de entrevista para evaluar las habilidades que está buscando en el puesto.
Si la persona va a estar en posición de escribir código, pensaría en incluir una pregunta de algoritmo y / o estructura de datos, siempre que sea relevante para la posición. Intentaría elegir algo que podría haber sido discutido o usado antes. También me enfocaría en otras cosas además de la implementación de dichos algoritmos y estructuras de datos, como el tiempo de ejecución y el consumo de memoria (cosas como la notación big-O). Estos conceptos son relevantes no solo para crear la estructura de datos, sino también para elegir qué implementación es la más adecuada (como, por ejemplo, una
ArrayList
versusLinkedList
).fuente
No creo que un trabajo de programación regular sea una pregunta que elimine a un candidato. Pero es bueno ver si se trata de un programador realmente senior o alguien que solo ha estado usando códigos de mono durante muchos años. Y aun así, no debería ser un criterio fundamental para elegir un programador. Quizás es un gran programador con mala memoria y no ha leído las palabras "lista vinculada" en años (o no recuerda el nombre), pero aún puede hacer buenas aplicaciones.
Entonces, como algunos dijeron, si va a ser un trabajo que necesita trabajar con una lista vinculada y muchos algoritmos sofisticados, etc., entonces está bien. Si para los datos de entrada habituales en un formulario, validar y mostrar es un poco inútil e injusto.
fuente
Creo que este es un mal ejemplo de una pregunta de entrevista, pero por una razón diferente. Una lista vinculada es un concepto tan simple que saber qué es es saber cómo implementarla. Si la persona no sabe qué es una lista vinculada, entonces debe explicar cómo funciona y, al hacerlo, da la respuesta sin descubrir nada sobre si sabe o no cómo resolver problemas . Entonces, la pregunta se puede reducir a "¿ya sabe qué es una lista vinculada y cómo funciona?", Lo que no le dice nada útil sobre su idoneidad como programador.
fuente
Escribir una implementación de lista enlazada es una buena pregunta para la entrevista, porque revelará mucho sobre la forma de codificación del candidato:
¿Sabe él qué es una API? ¿Puede usar el código de otras personas? ¿Puede escribir código para que otras personas puedan usarlo?
¿Sabe él qué es una lista vinculada? ¿Conoce colecciones, estructuras de datos, algoritmos?
Si ni siquiera sabe qué métodos debe ofrecer una Lista Vinculada, es probable que nunca haya usado uno, o sabe cuándo usar uno.
¿Cómo maneja el problema? ¿Comienza con un análisis primero, una pequeña especificación, algunas pruebas de antemano? ¿O simplemente comienza a hackear felizmente?
¿Maneja casos extremos? ¿Qué pasa con la eliminación del último nodo de la lista vinculada? ¿Qué sucede si alguien intenta agregar una referencia a la propia lista vinculada a la lista vinculada y luego borra todo?
¿Maneja las excepciones? Cada lenguaje de programación tiene sus propias convenciones para manejar excepciones: en Java, esperará que LinkedList arroje una NoSuchElementException cuando haga un getFirst () en una lista vacía. Otros idiomas pueden devolver indefinido, -1 o una constante.
fuente