¿Es una mala práctica de entrevista hacer que los candidatos escriban una implementación de lista enlazada? [cerrado]

43

Leyendo este sitio y SOY he visto muchas historias de preguntas y respuestas de entrevistas que dicen que un candidato tenía que implementar una lista vinculada desde cero. Por lo general, este es un ejercicio "dame" para los candidatos de rol de programación, como escribir FizzBuzz. La idea es que si el candidato no puede hacer esto, no puede programar y debe ser rechazado casi inmediatamente.

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 las listas de forma nativa en forma nativa; escribir su propio objeto de lista enlazada solo sería necesario en circunstancias inusuales e incluso en ese caso probablemente no sería aconsejable.
  • Los lenguajes de nivel inferior como C ++ tienen bibliotecas estándar con iteradores / contenedores y objetos de listas.
  • A la luz de los dos primeros puntos, los programadores pueden pasar años sin pensar siquiera en implementar una lista (vinculados, doblemente vinculados, etc.). Es posible que algunos ni siquiera vean esas cosas desde los días de la universidad.
  • La potencia de cálculo tampoco es el factor que era hace años, por lo que la eficiencia a través de los punteros no es el problema que solía ser (en general).
  • Una simple búsqueda en la web de algo así como "ejemplo de lista enlazada" mostraría muchos ejemplos de código que podrían simplemente ser memorizados y escupidos, sin realmente indicar la verdadera competencia del solicitante.

Debo decir que el uso de una lista enlazada para llevar a preguntas / discusiones abiertas sobre la capacidad de resolución de problemas / pensamiento crítico de los candidatos es probablemente una buena práctica de entrevista. De cualquier manera, un entrevistador puede ver realmente cómo es un solicitante y cómo piensan que es enormemente beneficioso.

Creo que este enfoque binario de "no hay código de lista enlazado, no hay trabajo" para los programadores que trabajan en un escritorio o aplicación 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 jefe de una lista podría ser un excelente codificador y compañero de trabajo y estar perdido en la mezcla. ¿Pensamientos?

EDITAR : hay muchos (buenos) comentarios que sugieren que si esta es una pregunta buena o mala que se debe hacer depende del contexto del trabajo. Estoy totalmente de acuerdo, así que permítame reformular esta pregunta: implementar una lista enlazada es una pregunta de entrevista común para una amplia gama de trabajos de codificación, similar a las preguntas como FizzBuzz o escribir una función recursiva para calcular factoriales. ¿Esta pregunta tiene la utilidad suficiente para ser utilizada comúnmente para evaluar a los candidatos de programación en general? ¿O debería considerarse una mala pregunta, a excepción de las posiciones de "Desarrollador principal, Equipo de listas vinculadas incrustadas"?

    
pregunta joshin4colours 11.01.2012 - 18:29

13 respuestas

52

Si responder a la pregunta le dice lo que quiere saber sobre un candidato, entonces es una buena pregunta para una entrevista. Si no te dice eso, es una mala pregunta.

Preguntas sencillas como FizzBuzz sirven para un propósito específico. Si un candidato no puede codificar FizzBuzz, simplemente no puede codificar y usted puede terminar la entrevista antes. 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 entrevista te dirá todo lo que quieres saber. Realmente necesitas tener un grupo de preguntas listas. Debes hacer preguntas en una secuencia de la más fácil a la más difícil para que puedas encontrar el límite de lo que sabe el candidato. Si haces una pregunta y la responden, aún no sabes qué más hacen o no saben.

En cuanto a tu edición:

  

¿Esta pregunta tiene la utilidad suficiente para ser utilizada comúnmente para evaluar a los candidatos de programación en general? ¿O debería considerarse una mala pregunta, a excepción de las posiciones de "Desarrollador principal, Equipo de listas vinculadas incrustadas"?

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 enlazada desde cero, tal vez pueda explicar cómo ha usado una antes y cuáles son las funciones clave), o el principio de una larga secuencia de preguntas más avanzadas para la posición de "Desarrollador Senior, Equipo de Listas Integradas Incrustadas".

    
respondido por el Bill the Lizard 11.01.2012 - 19:27
34

Me he perdido en trabajos simplemente porque mi mente se quedó en blanco en rompecabezas simples como este. También lo he hecho de manera brillante en este tipo de rompecabezas en otras entrevistas: sé cómo implementar una lista enlazada en un entorno sin presiones. Nunca he recibido una queja sobre mis habilidades por parte de alguien con quien he trabajado, así que tal vez no debería pensar que me he perdido en puestos de trabajo, 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 interrogador, lo que la convierte en 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 ejemplos de código, fantástico.

    
respondido por el pdr 11.01.2012 - 18:39
25

Uno tiene que definir el tipo de trabajo de programación. Si usted está en el negocio de desarrollar compiladores y algoritmos, debe esperar preguntas sobre tales cosas. Si se encuentra en aplicaciones de tipo de línea de negocio y espera que el candidato realice las aplicaciones de CRUD, entonces es posible que el conocimiento del concepto (sin escribir un programa) sea suficiente. Hoy en día, el conocimiento de las diferentes tecnologías necesarias para realizar el trabajo especialmente en el tipo de aplicaciones LOB supera la necesidad de algoritmos nítidos.

    
respondido por el NoChance 11.01.2012 - 18:46
9

Mi respuesta es "depende". Me gustaría hacer esta pregunta si un candidato ha incluido C o C ++ en su currículum. Pedir la implementación de una lista enlazada es una buena prueba para comprender los punteros que es absolutamente esencial para un programador de C o C ++.

Por otro lado, si un candidato no dice saber C o C ++, no le pediría que implementara una lista vinculada, pero consideraría hacer preguntas al respecto. Explique a un alto nivel cómo funciona una lista enlazada. ¿Cuál es la complejidad de agregar un elemento al encabezado de la lista? ¿La cola de la lista? ¿Insertando un elemento en medio de la lista? ¿Cuándo utilizarí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.

    
respondido por el Dima 11.01.2012 - 20:19
7

No lo consideraría una mala 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 de tipo fizz-buzz. Solo está validando algo muy básico: ¿la persona entiende una lista enlazada? Pregúntalo y sigue adelante.

2) El desafío con las listas vinculadas es 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. Por supuesto, puede demostrar un entendimiento básico en cualquier lenguaje con estructuras, 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 el entendimiento de un candidato como pedirles que lo hagan en C. Pedirles que lo hagan en C si el trabajo es alrededor de Java también falta algo en este punto.

3) Teniendo esto en cuenta y los desafíos generales de la "programación de la pizarra", al formular este tipo de pregunta, aceptaría pseudocódigo o diagramas siempre que demuestren comprensión de los principios fundamentales. No le pido a la gente que escriba código en una pizarra que sea sintáctica y lógicamente perfecta, especialmente si luego pueden darse la vuelta e identificar cualquier problema lógico cuando se les pide que lo vean nuevamente. YMMV.

    
respondido por el dclements 11.01.2012 - 19:06
6

Cuando daba entrevistas, a menudo me pedían implementaciones de listas vinculadas y algunos algoritmos centrados en las listas vinculadas. Resolví la mayoría de ellos, y algunos de ellos me obligaron a ejercitar mis neuronas un poco.

Si alguna vez me hiciera una entrevista, buscaría algún tipo de implementación de lista enlazada, no para probar qué tan buena es una persona en codificación, sino para verificar cuánta atención presta una persona a los detalles. Cualquiera puede escribir una lista enlazada, pero son los casos de límites en los que incluso algunos buenos programadores fallan. No le preguntes: Write a code for linked list in C/C++ . Pídale que escriba una lista vinculada genérica en C (no en C ++), etc.

Tuerza el problema y coloca algunas otras condiciones en la lista vinculada, y tendrás una buena pregunta que hacer. Algunas personas están obligadas a cometer errores entonces.

    
respondido por el c0da 11.01.2012 - 18:45
5

En mis aproximadamente 10 años de programación profesional (y alrededor de otros diez años como pasatiempo), no creo que haya necesitado implementar una lista enlazada. Si alguien me pidiera que lo hiciera durante una entrevista, podría responder preguntando si es algo que haré regularmente en el trabajo.

Por supuesto, es casi seguro que existen trabajos en los que tendrá que escribir más o menos implementaciones en la sala limpia de algoritmos conocidos comúnmente, como implementar una lista vinculada 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 que el candidato proporcione una implementación perfecta que maneje los casos perimetrales correctamente, informe fallas de acuerdo con la práctica común en el lenguaje o el marco, etc.? ¿O puede pasar eso por alto y centrarse en cómo abordan realmente un problema que tal vez no hayan enfrentado en 10 a 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 más tarde, regularmente me acompañan colegas que me hacen preguntas no solo sobre los productos, su implementación y los estándares implementados por ellos, sino también sobre problemas de programación mucho más generales (ayer mismo me preguntaron qué las implicaciones fueron de una dependencia circular en una restricción predeterminada en SQL Server en el contexto de una tabla particular y su uso en nuestro caso (razonando a través de ella, resultó que no había implicaciones en ese caso particular). Tampoco necesitaba una nueva implementación de lista vinculada para eso.

Haga preguntas que sean relevantes para el trabajo que probablemente se asignará al candidato , y trate de tener 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 es una tienda C, por ejemplo, puede intentar una pregunta que involucre trigraphs). Para una posición de programación, ¿leen o contribuyen regularmente a foros como Stack Overflow? Si se les pidiera que realizaran alguna tarea en un lenguaje de programación o marco con el que tienen poca o ninguna experiencia (por ejemplo, si usted es principalmente una tienda de Java, ¿qué hay de Clojure o .NET?), ¿Cómo abordarían el problema? Tal vez saque 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 lo abordarán en términos generales para resolverlo, y estará listo para explicar las partes relevantes del producto en cuestión.

Si el candidato puede manejar los tipos de problemas relevantes para el caso del negocio y tiene una buena actitud para aprender cosas nuevas, es probable que ese sea un indicador mucho mejor de la capacidad para esa posición en particular que ser capaz de proporcionar respuestas enlatadas a preguntas bien conocidas, ya sean preguntas sobre FizzBuzz, listas vinculadas u otra cosa. Averigüe qué tan bien encaja el candidato con el equipo y creo que está en un terreno bastante seguro.

    
respondido por el a CVn 12.01.2012 - 10:20
4

Por supuesto, la mayoría de las personas nunca necesitarían implementar una lista enlazada, pero para implementarlas desde cero, probablemente será necesario manejar los punteros correctamente. La idea es entonces que haber formado un modelo mental coherente para los punteros se correlaciona con el dominio del idioma, 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, pero solo que hay alguna correlación.

    
respondido por el Benjamin Bannier 11.01.2012 - 18:44
4

Empiezas diciendo que son preguntas "dame", pero luego señala que la gente, comprensiblemente, no podrá hacerlas. Estoy confundido.

Así es como lo pienso:

  • Rara vez es necesario escribir uno, como dices, para que la gente se olvide fácilmente.
  • No son increíblemente difíciles de escribir.
  • Los conceptos utilizados para escribirlos pueden considerarse fundamentales.
  • Se usan increíblemente a menudo (incluso si no lo sabes).

Creo que eso las hace buenas preguntas para hacer. Si estás preocupado por ellos antes de estudiar para la entrevista, haz una lista. Pídales que lo escriban de forma 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 cola de prioridad ingenua ( O(n) )? Mucha gente que conozco piensa que un BST es O(log n) solo porque es un árbol .

Si está buscando a alguien que trabajará en el metal y necesita una base sólida muy en las estructuras de datos ... estos pueden incluso estar lejos Trivial para los candidatos que buscas 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 juntar una página asp en segundos, entrevista para eso. El punto no es elegir una pregunta de la 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, listas vinculadas o no.

    
respondido por el Steven Evers 11.01.2012 - 19:54
3
  

¿Esta pregunta tiene la utilidad suficiente para ser utilizada comúnmente para evaluar a los candidatos de programación en general?

No, absolutamente no. Dependiendo de cómo esté redactado, lo que le dirá va desde "este candidato sabe cómo diseñar una lista enlazada" a "este candidato puede programar una lista enlazada en el idioma X". Si pides pseudocódigo, tenderá más hacia el primero. Si solicita una implementación en un idioma en particular, comprenderá mejor el lenguaje (especialmente con C y C ++, donde puede tratar con punteros, referencias y estructuras).

Incluso me atrevería a decir que no es posible evaluar a todos los candidatos utilizando las mismas preguntas. Debe adaptar sus preguntas de la entrevista para evaluar las habilidades que está buscando en la posición.

Si la persona va a estar en posición de escribir código, pensaría en incluir un algoritmo y / o una pregunta sobre la estructura de datos, siempre y cuando sea relevante para la posición. Intentaría elegir algo que podría haber sido discutido o usado antes. También me concentrarí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 (por ejemplo, ArrayList versus LinkedList , por ejemplo).

    
respondido por el Thomas Owens 11.01.2012 - 19:50
3

No creo que un trabajo de programación regular deba ser una pregunta que elimine a un candidato. Pero es bueno ver si se trata de un programador realmente importante o de alguien que solo ha estado codificando monos durante muchos años. Y aun así, no debería ser un criterio fundamental para elegir un programador. Tal vez es un gran programador con mala memoria y no ha leído las palabras "lista enlazada" en años (o no recuerda el nombre) pero aún puede hacer buenas aplicaciones.

Entonces, como han dicho algunos, si va a ser un trabajo que necesite trabajar con una lista enlazada y muchos algoritmos sofisticados, etc. entonces está bien. Es si para los datos de entrada habituales en un formulario, validar y mostrar es algo inútil e injusto.

    
respondido por el H27studio 12.01.2012 - 10:37
2

Creo que este es un mal ejemplo de una pregunta de entrevista, pero por una razón diferente. Una lista enlazada es un concepto tan simple que saber qué es saber cómo implementarlo. Si la persona no sabe qué es una lista vinculada, entonces tiene que explicar cómo funciona y, al hacerlo, entrega la respuesta sin descubrir nada sobre si saben o no cómo resolver problemas . Entonces, la pregunta se puede reducir a "¿Ya sabes qué es una lista vinculada y cómo funciona?", Lo que no te dice nada útil sobre su idoneidad como programador.

    
respondido por el Mason Wheeler 11.01.2012 - 18:50
2

Escribir una implementación de lista enlazada es una buena pregunta de entrevista, porque revelará mucho sobre la forma de codificación del candidato:

  • ¿Sabe qué es una API? ¿Puede usar el código de otras personas? ¿Puede escribir código para que otras personas puedan usarlo?

  • ¿Sabe qué es una Lista Vinculada? ¿Sabe colecciones, estructuras de datos, algoritmos?

Si ni siquiera sabe qué métodos debería ofrecer una Lista Vinculada, probablemente nunca usó 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 piratear felizmente?

  • ¿Maneja los casos de borde? ¿Qué pasa con la eliminación del último nodo de la lista vinculada? ¿Qué sucede si alguien intenta agregar una referencia a la lista enlazada en sí misma a la lista enlazada y luego elimina todo?

  • ¿Él maneja las excepciones? Cada lenguaje de programación tiene sus propias convenciones para manejar excepciones: en Java, esperará que una lista enlazada arroje una excepción NoSuchElementException cuando realice una getFirst () en una lista vacía. Otros idiomas pueden devolver indefinido, -1 o una constante.

respondido por el Konerak 12.01.2012 - 08:36

Lea otras preguntas en las etiquetas