Tal como dice el título, ¿cuál es su problema favorito de entrevista en la pizarra y por qué le ha resultado eficaz?
Junior, senior, Java, C, Javascript, PHP, SQL, pseudocódigo, etc.
interview
algorithms
NickC
fuente
fuente
Respuestas:
Le pido al candidato que diseñe una solución a un problema que realmente encontré en mi trabajo diario. Al hacerlo, trato de crear un diálogo entre el candidato y yo. Trato de discutir sobre el diseño que está construyendo como si nunca antes hubiera pensado en el problema.
Lo que trato de evaluar es si podemos entendernos y si podemos hablar sobre un problema técnico sin confusión.
Ejemplo concreto
(Para un desarrollador de escritorio java)
Diseñe una API para manejar el historial de navegación de un navegador web (página anterior, página siguiente, enumere las 10 páginas anteriores), y eso puede ser reutilizable en muchas partes de la aplicación (aquí doy ejemplos concretos en nuestra aplicación). Luego, esboce una implementación.
Me gusta este, porque es bastante simple, es fácil de ilustrar, se puede resolver paso a paso (agregue comportamientos adicionales sin romper todo), permite hablar sobre casos extremos y manejo de errores, y también permite hablar sobre datos estructuras
fuente
Esto me pareció extremadamente esclarecedor al entrevistar a candidatos y filtrar a los que no tienen nada que ver. Es similar en complejidad a Fizz Buzz, pero se centra en las habilidades de la base de datos.
Les dejo escribirlo en cualquier variante SQL que quieran, y no soy demasiado exigente con problemas menores de sintaxis. Principalmente quiero saber que entienden conceptos básicos de bases de datos relacionales.
La mayoría de los candidatos pueden pasar la parte 3 sin ningún problema. Te sorprendería saber cuántos piensan que la respuesta a la parte 4 es simplemente cambiar el operador de OR a AND en la cláusula where.
fuente
"Dibuje para mí en la pizarra el diseño del último proyecto en el que trabajó, sin revelarme ningún detalle sensible".
fuente
Implementar
strcpy
,strcmp
y amigos.fuente
atoi()
.strdup()
.strrev()
una función de inversión de cadena. Mi solución de pizarra blanca los impresionó y ahora estoy haciendo el trabajo.Mi favorito, que abarca algunas disciplinas, es contar el número de nodos en un árbol binario dada la interfaz (en C #):
y solo por diversión, aquí está la implementación, aunque el entrevistado no necesita ver esto.
y la clase asistente:
La solución que me gusta ver es esta:
Como demuestra conocimiento de:
fuente
Dos preguntas que han suscitado interesantes discusiones en la pizarra para mí son
Empiezan de manera simple y luego se vuelven progresivamente más complejas.
fuente
No me gusta usar un rompecabezas o una pregunta de diseño como una pregunta de pizarra. Prefiero preguntas sencillas y sencillas que evalúan la capacidad del candidato para escribir algún código. Mis favoritos son:
1) Escriba una función para invertir una lista vinculada individualmente. (Les lleva un tiempo darse cuenta de que necesitan 3 punteros).
2) Dado un árbol binario, encuentre la profundidad del árbol binario. (Esta pregunta prueba su capacidad para escribir código recursivo. Me permite verificar si tienen su caso base intacto).
3) Escriba un procedimiento para la búsqueda binaria en una matriz de enteros. (Como dice Jon Bentley (en Programming Pearls), muchas personas tienden a cometer errores al escribir búsquedas binarias. Luego se puede seguir buscando errores, escribir casos de prueba, revisar el código, etc.)
fuente
Usamos esto en una empresa para la que trabajé.
Le entregamos al candidato una hoja de papel utilizada para el seguimiento del tiempo. Era una hoja de tiempo real utilizada por una o nuestras divisiones. Le pedimos al candidato que nos guiara por el proceso de diseño para crear una mejor herramienta de seguimiento del tiempo. Sin límites, no dije qué idioma, etc., solo quiero ver qué tan bueno era el candidato en el "ciclo de vida completo". Nos dio una idea real de cómo reunieron los requisitos. Cómo estructuraron las tablas de la base de datos, qué tipo de interfaz de usuario podrían hacer. Obviamente, se necesitaban habilidades de comunicación para esta tarea. Por lo general, se hacía en una habitación con varias pizarras blancas grandes y duraba hasta 2 horas.
Contratamos a varias personas usando este proceso y si les fue muy bien en la tarea, nos fue muy bien a nosotros. Si eran marginales y decidimos contratarlos de todos modos (tema separado), eran programadores marginales.
fuente
Uso un problema que es relevante para mi dominio de programación.
Si desarrollo aplicaciones web, quiero ver cómo pueden elaborar un formulario web que elimine registros, y qué enfoque podrían tomar para eliminar el registro de la base de datos, por ejemplo. Esto me dice si conocen los principios básicos de la base de datos, cómo interactúan con el usuario para verificar la eliminación y si saben qué es una eliminación suave.
No tengo un favorito El problema que elijo variará mucho según el trabajo.
No me importa si pueden resolver el problema por completo o no en una entrevista, qué tecnologías e idiomas usan o qué tan mal se ve su código en una pizarra. Estoy buscando un patrón de pensamiento; Quiero ver si saben cómo pensar y resolver problemas.
fuente
Mi favorito era uno que usaba un amigo mío.
Funciona bien porque:
Es una pregunta algorítmica, por lo que requiere que el entrevistado pueda pensar y luego explicar su pensamiento, para que pueda ver cómo funciona su cerebro.
Es independiente del lenguaje.
Casi nadie lo hace completamente bien (generalmente hay un caso límite que se pierden (1 o 2 normalmente), o no manejan números negativos, así que puedes ver cómo manejan los errores y que te digan que están equivocados.
La mayoría lo hace como un tamiz simple pero muy lento (p. Ej., El 80% de las personas comprobarán que n es primo al dividir n entre todos los enteros menos que n), lo que le brinda un amplio margen para conversaciones sobre cómo podrían mejorar el algoritmo basado en compensaciones espacio / tiempo, por ejemplo, "¿por qué está dividiendo un número por 4 si ya sabe que no es divisible por 2?" o "Has deducido que solo necesitas dividir entre todos los números primos menores que sqrt (n), pero eso requiere que guardes esos números en algún lugar, ¿cuáles son las implicaciones de eso?")
No es necesario que obtengan la respuesta correcta. Si alguien puede pensar y explicar su pensamiento, entonces están muy lejos de ser un buen candidato.
fuente
Algo llamado aff_z, que era parte de los exámenes C de mi escuela de ingeniería y se usó como una prueba "falsa" para que los estudiantes reprobaran cuando regresaban de vacaciones (nuestro sistema de calificación implicaba que reprobar una prueba detuvo la calificación, por lo que reprobar esa prueba falsa podría invalidar toda la prueba. Te obliga a prestar atención a los detalles imbéciles). Lo reutilicé una o dos veces durante las entrevistas.
De todos modos ... Olvidé la formulación exacta pero era algo así ...
Lo triste es que no solo algunos estudiantes encontrarían soluciones extremadamente complicadas cuando la respuesta es bastante obvia, sino que algunos incluso podrían fallar.
Y lo creas o no, también sucedió durante las entrevistas.
Ejecutarlo en entrevistas fue bastante divertido, ya que algunos solicitantes comenzarían a escribir las posibles ramas y luego se darían cuenta de lo que está mal (obviamente, si solo les preguntas oralmente, es bastante comprensible que lo hagan mientras hablas ... pero si darlo por escrito, me parece desconcertante ...)
Es tonto, pero supongo que es un examen minimalista (de manera similar, al contratar programadores de JS, siempre pregunto cómo declarar una variable, y luego, dependiendo de su respuesta, si usar var hace alguna diferencia o no). honestamente.)
fuente
variablename = variablevalue;
mientras que los buenos simplemente se reían por teléfono o en persona y me decían directamente cuáles serían las diferencias con o sin ellas.var
)Realmente depende de lo que esté buscando, como organización que realiza mucho trabajo web dinámico que involucra imágenes, tiendo a hacer una pregunta de geometría pertinente para el trabajo. En cualquier caso, tiendo a hacer una pregunta de geometría, ya que me parece una buena prueba de matemáticas que es agradable y visual y puede mostrar la capacidad de un candidato para presentar visualmente su trabajo y resolver metódicamente un problema.
Para candidatos avanzados, ocasionalmente hago la siguiente pregunta:
Para una pregunta más fácil, generalmente doy el mismo tipo de pregunta, pero uso el ejemplo "cuadrado dentro de un círculo dentro de un cuadrado". Aunque esto es muy fácil, esperaría un álgebra perfecta.
Más allá de eso, tiendo a pedirles que activen un algoritmo para generar todas las combinaciones de un conjunto de datos de longitud variable.
fuente
Las mejores respuestas de FizzBuzz que he visto son:
SQL Server 2008
C # (simple)
C # (inteligente)
fuente
Busco un par de cosas en los candidatos que he entrevistado. Por razones que no puedo describir en línea, tenemos candidatos bastante pobres, y he llegado a esperarlo, así que soy bastante fácil con ellos. Aún así, busco:
Conciencia del diseño.
"Muéstrame la estructura de la tabla para un programa de libreta de direcciones que tiene Contactos con nombres y apellidos que pueden tener múltiples números de teléfono con una descripción del número (celular / hogar / trabajo / etc.)"
No estoy buscando un diagrama de especificaciones UML 2.0 aquí, un simple diagrama de burbujas aquí está bien. Mientras sea razonable.
Conocimiento de trabajar con una base de datos (es decir, SQL)
Conocimiento de las pruebas
Suponga
public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)
que existe un método con la firma que devuelve los resultados de su consulta de antes. Suponga que si pasa un valor nulo al método, arroja una NullReferenceException. Escriba una prueba para demostrar esta funcionalidad.Escriba una prueba que demuestre que GetPhoneNumbers devolverá un número de teléfono de casa (123)456-7890 para alguien con el apellido "smith".
Conocimiento de cómo escribir un código
Implemente un método que cumpla con los requisitos de las pruebas que escribió.
Teniendo en cuenta el número y la calidad de los solicitantes que hemos recibido, he entrevistado a todos los que han presentado una solicitud seria. No he contratado a nadie.
fuente
Por lo general, dejo que dibujen un diagrama de bloques del último sistema en el que han trabajado, preguntando sobre las relaciones entre los bloques y luego les dejo que expliquen sobre el bloque en el que estaban trabajando / a cargo. Puede aprender muchos de este ejercicio, como la forma en que uno mira más allá de su pequeño dominio, cuánto es importante para él saber "dónde" está actuando, también puede aprender sobre el papel que estaba desempeñando, si era una clave o un lado papel.
fuente
Escriba un algoritmo para el siguiente problema: dado un número n , genera el número total de árboles binarios (únicos) que tienen n nodos.
Por lo tanto, para n = 0 yn = 1, la respuesta es 1. Para n = 2, tiene 2: el nodo raíz, y luego el segundo nodo a la izquierda o la derecha.
Puede obtener información sobre las técnicas de diseño y ver si piensan en la recursividad o la memorización o la solución de programación dinámica.
[Vea también esta discusión de StackOverflow para el caso relacionado, pero diferente, de árboles de búsqueda binaria.]
fuente
Si tuviera que entrevistar a un desarrollador de software, le pediría que diseñara un software y describiera los requisitos de hardware para eliminar entradas duplicadas de un archivo arbitrariamente grande que contenga un nombre completo en cada línea. Dejo algunas partes de la descripción del problema ambigua a propósito. Luego lo desafío a ver si comprende analizar y aclarar los requisitos, diferentes compensaciones, estructuras de datos y algoritmos, E / S (almacenamiento secundario), tecnologías de software y hardware, escalabilidad, etc.
Creo que es un problema pequeño pero desafiante, que revela el conocimiento y las habilidades del solicitante en muchas áreas de computación.
fuente
Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence
Muchos chicos podrían atorarse en esto. Si se da alguna solución, generalmente utiliza la recursividad. Después de esto:
Implement the same via 'for'-loop
No puedo decirle cuántos compañeros no pueden completar ambas tareas: 50% de los candidatos.
Por eso me gusta :)
fuente
fib(n)=round(power(PHI,n)/SQRT5)
. PHI y SQRT5 son constantes que representan la proporción áurea (1.618 ...) y la raíz cuadrada de 5, respectivamente.Para las bases de datos voy con:
Escríbame un SQL que elimine la duplicación de una tabla como esta en función del nombre (y no me importa qué ID recupero, pero la que se devuelva debe ser válida para ese nombre). Entonces, la tabla, una vez que se haya aplicado el SQL correcto, presentará algo como:
Me gusta porque:
(Aquí es donde encuentro que hay una forma completamente trivial de hacer esto y he estado complicando todos estos años).
fuente
SELECT min(ID), Name FROM Things GROUP BY Name
funcionaría, ¿verdad?HAVING count(Name) > 1
, pero supongo que su respuesta de muestra debería omitir a Bodkin Van Horn, Hot Shot, Snimm y Dave.DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
. ¿Tienes una solución preferida?Mi problema favorito de la pizarra C ++ es que el candidato implemente
De esto puedo aprender
fuente
¿Cómo representaría un mazo de 52 cartas estándar? Cualquier lenguaje de programación está bien. ¿Cómo barajarías las cartas?
fuente
Mi favorito es comenzar preguntando el prototipo de printf. Luego, dado un API de bajo nivel printc (char c), que imprimirá un carácter, implementa printf. Da todo tipo de respuestas interesantes como que la pila es parte de la CPU. Como habrás adivinado, soy de un fondo C e incrustado.
fuente
varargs()
o alguna función como esa. ¿Estoy en lo correcto? Solo lo hice una vez para decir que lo hice hace un tiempo.Tienes un tazón con 200 peces. De estos peces, el 99% no son guppies. ¿Cuántos peces debes eliminar para que el 2% de lo que queda sean guppies? Muestra tu trabajo.
Esto se trata de requisitos confusos. Se dice de esta manera para cambiar las perspectivas varias veces durante la misma pregunta. Está destinado a ver si pueden descubrir lo que realmente está sucediendo.
Te sorprendería cuántas personas se equivocan.
fuente
answer = 100
. [Suponiendo que puede elegir selectivamente el otro pez. Si se eliminan los guppies, hay otras respuestas.] Buena pregunta, se sorprendería de cómo pocas personas manejan tan bien, aunque debería ser un juego de niños para un programador.Tengo algunos favoritos, pero aquí hay una pareja que casi siempre aparece. La mayoría de las veces estoy haciendo entrevistas técnicas (C ++) de la ronda final, así que prefiero preguntas más largas y abiertas que conduzcan a nuevas áreas de interés. No hay una respuesta "correcta", solo una apertura a otra conversación.
1) Implementación de un puntero compartido básico, explicaciones de dónde hay deficiencias en comparación con tr1 o los punteros compartidos de impulso en su implementación, cómo se debe usar, etc.
2) Una revisión de código. Para los empleados experimentados, esperamos que puedan revisar con confianza algunos códigos proporcionados por problemas de diseño, errores, horrores de codificación y posibles problemas de mantenimiento. Además, por supuesto, cómo lo arreglarían; y, a veces, cómo le darían ese mensaje al desarrollador junior que están derribando.
fuente
Una pregunta que he estado usando desde que se usó en mí es la siguiente:
Una gran parte de la razón por la que lo he estado usando se debe al hecho de que puede tomar la solución y moverse en varias direcciones:
Sus respuestas a estas preguntas podrían darle una idea de cómo responden a los requisitos cambiantes, así como si pueden reconocer las consideraciones de rendimiento. Un candidato fuerte podría responder con una pregunta con respecto a la función que se necesita y con qué frecuencia se llamaría.
Moverse en una dirección diferente:
Utilizo esto como una forma de verificar su pensamiento lateral. Dado que el cálculo de los números primos puede ser lento a medida que el valor máximo aumenta, a veces tiene más sentido usar algún tipo de tabla de búsqueda calculada o calculada previamente que se ajusta en función del problema que está tratando de resolver.
fuente
Aquí hay uno para provocar un pensamiento: es sencillo, implica un poco de matemática y verifica el conocimiento del candidato sobre el diseño básico de la computadora (desbordamiento, representación numérica, etc.):
Escriba un programa (o procedimiento) que tome un par de enteros X, Y como entrada y determine si X * Y es divisible por 10. NOTA IMPORTANTE: X e Y pueden ser lo suficientemente grandes como para que X * Y desborde el tipo entero más grande disponible en tu máquina
Solución de muestra:
fuente
Complete el siguiente método: PS Un modo de un número es el número (en la lista) que tiene más ocurrencias.
Esto es para ver de eficacia es su código.
fuente
¿Cómo representaría una matriz de repuesto que es relativamente grande ... digamos 1000x1000 pero tiene como máximo 100 entradas distintas de cero?
fuente