La entrevista es una habilidad en sí misma. Puede ser el mejor desarrollador del mundo, pero aún puede arruinar una entrevista.
Google: el 90% de nuestros ingenieros usan el software que escribiste (Homebrew), pero no puedes invertir un árbol binario en una pizarra, así que vete a la mierda.
- Max Howell (@mxcl) 10 de junio de 2015¿Cuántas veces has salido de una entrevista y te has preguntado qué hice mal? ¿Por qué me rechazaron?
Como candidato, ayuda mucho comprender las expectativas en una entrevista.
En este artículo, quiero mostrar a cada aspirante a candidato la diferencia entre una buena y una mala entrevista y cómo la percibe el entrevistador.
Compararemos y contrastaremos dos entrevistas diferentes y aprenderemos de cada una de ellas para que pueda ajustar sus acciones para que coincidan con las expectativas.
Primera entrevista
Permítanme responder la misma pregunta anterior "Invertir un árbol binario".
Entrevistador (I) : Hola, bienvenido a nuestra empresa. Estoy haciendo xxx yyy. Así que cuentame sobre ti.
Candidato (C) : Soy xxx. Tengo alrededor de 5 años de experiencia en desarrollo de backend. Me encanta resolver problemas técnicos .....
I : Eso es genial. Entonces, ¿pasamos a la parte de resolución de problemas?
C : ¡Claro!
I : Entonces te dan un árbol binario. Quiero que invierta el árbol binario e imprima el árbol resultante.
C : (Pensando en la cabeza) Hmmm Ok. Un árbol binario tiene dos hijos. Así que supongo que invertir significa imprimir de la hoja a la raíz. Entonces, la forma más fácil de hacerlo es atravesar el árbol hasta el final y encontrar las hojas ...
E : (Después de 5 minutos de completo silencio) ¿Entiendes la pregunta? ¿Necesitas alguna aclaración?
C : Lo tengo claro . Ahora solo estoy pensando en una forma de imprimir los nodos a partir de la hoja.
E : ¿Qué quieres decir con imprimir los nodos a partir de la hoja?
C : Entonces, básicamente, debería imprimir de la hoja a la raíz, ¿verdad? Es fácil de atravesar hasta la hoja. ¿Pero lo difícil es retroceder?
Yo : Hmmm. ¿Está seguro de que entiende bien la pregunta? Invertir un árbol significa que debe intercambiar los hijos izquierdo y derecho .
C : Lo siento, no lo tengo claro. Cuando dijiste invertir, asumí que te referías a imprimir de la hoja a la raíz.
E : Está bien (aquí es donde perdiste el trabajo) . Ahora que lo tienes claro, procedamos.
C : Sí, lo tengo claro. Entonces ahora tengo que intercambiar los nodos izquierdo y derecho. Eso es fácil, ¿verdad?
(Escribe código en silencio)
def invert(node) t = node.left node.left = node.right node.right = t return node end
C : Terminé con el código.
Yo : Genial. Entonces, ¿qué has hecho aquí?
C : He invertido el árbol cambiando los nodos izquierdo y derecho. Así que mantengo una variable temporal para lograr lo mismo.
E : (Tratando de avanzar hacia una solución adecuada) Pero esto intercambia solo el nodo raíz, ¿verdad?
C : (desconcertado) Hmm sí, entonces los niños izquierdo y derecho estarán invertidos. Esa es la pregunta, ¿verdad?
E : (Todavía no hay claridad en la pregunta) Entonces la pregunta es que el árbol completo debe invertirse. No solo la raíz.
C : Oh Dios. Entonces no es solo la raíz, sino el árbol completo. Estoy en lo cierto?
Yo : Sí, eso es correcto.
C : Ok. Déjame pensar en ello.
(Después de 2 minutos)
C : Creo que lo tengo. Entonces, básicamente, necesito hacer el mismo algoritmo que escribí para todo el árbol. Estoy en lo cierto?
E : Sí, pero ¿cómo haces eso?
C : (comienza a escribir código)
def invert(node) n = Node.new(node.val) invert(node.left) invert(node.right) n.left = node.right n.right = node.left return n end
Así que estoy adivinando esto debería funcionar.
Yo : Hmmm, déjame ver. (Encuentra el problema. ¿Puedes?) No estoy seguro de si funciona. ¿Puedes explicarme por favor?
C : Claro. Primero estoy invirtiendo el subárbol izquierdo, luego el subárbol derecho y luego los estoy intercambiando para que la raíz esté invertida.
Yo : Hmmm. Pero los nodos izquierdo y derecho están devolviendo nuevos nodos después del intercambio, ¿verdad? Todavía estás intercambiando los nodos antiguos.
C : No estoy seguro de a qué te refieres con eso. Creo que esto va a funcionar para todos los casos.
I : ¡Gran hombre! Se nos acabó el tiempo. Gracias por tu tiempo, fue un placer hablar contigo. RRHH se comunicará con usted.
Retroalimentación
Ahora bien, ¿cuál crees que fue la decisión final y cuál fue la retroalimentación del entrevistador? La retroalimentación hipotética sería algo así:
- El candidato asumió muchas cosas y no aclaró el problema.
- Al candidato se le ocurrió el enfoque de la nada y no hubo un razonamiento adecuado detrás del enfoque adoptado. (¿Recuerdas el silencio de la entrevista?)
- El candidato no tenía claros los requisitos ni siquiera en la etapa de implementación.
- El candidato luchó con la implementación y no pudo captar pistas que apuntaran hacia la solución.
- El candidato no pudo identificar los errores en el código, incluso después de proporcionar suficiente tiempo y sondeo para verificar si la solución es correcta.
Si se tratara de una entrevista real, el candidato habría sido rechazado. Ahora bien, ¿cómo debería ir la entrevista ideal?
Segunda entrevista
Entrevistador (I) : Hola, bienvenido a nuestra empresa. Estoy haciendo xxx yyy. Así que cuentame sobre ti.
Candidato (C) : Soy xxx. Tengo alrededor de 5 años de experiencia en desarrollo de backend. Me encanta resolver problemas técnicos .....
I : Eso es genial. Entonces, ¿pasamos a la parte de resolución de problemas?
C : ¡Claro!
I : Entonces te dan un árbol binario. Quiero que invierta el árbol binario e imprima el árbol resultante.
C : (Pensando en voz alta) Genial. Entonces, un árbol binario tiene dos nodos. Entonces, ¿qué es exactamente invertir? ¿Está intercambiando la izquierda y la derecha?
Yo : Exactamente. Entonces, el nodo izquierdo debe estar a la derecha y viceversa.
C : Ok. Entonces, en este caso, ¿qué sucede?
Proporciona un ejemplo y aclara la entrada y la salida.
E : Tiene usted razón hasta cierto punto. Pero esto debería suceder para todo el árbol, no solo para la raíz. (Observe qué tan pronto se solidificaron los requisitos)
C : ¡Oh, lo tengo! Entonces estoy pensando que necesito hacerlo de forma recursiva. ¡Hombre, eso es duro! Déjame ver. Pero antes de eso, comprobaré mi comprensión con un ejemplo más.
Proporciona uno más, por ejemplo, para aclarar las piezas faltantes.
Yo : Sí, tienes razón. Esa es la salida. Creo que entendiste el problema por completo. Entonces, ¿cómo lo aborda?
C : Déjame ver. Entonces, para cambiar de izquierda a derecha, puedo usar un temp. Pero entonces, ¿cómo lo haré para quedarme? Oh sí, podría recurrir a los demás y hacer lo mismo.
Yo : Genial. ¿Hay algún problema con ese enfoque?
C : Hmmm. Sí, si simplemente cambio la izquierda y la derecha de forma recursiva, ¿cómo seguiré el árbol nuevo y el antiguo?
Yo : No estoy seguro de estar siguiéndote. ¿Qué es lo viejo y lo nuevo?
C : Lo que quise decir es que habrá niños actualizados, necesito intercambiarlos y no los niños mayores.
Yo : Sí, correcto.
C : Sí, puedo llamar a esta función de forma recursiva para la izquierda y la derecha y almacenar esos valores en una variable. Luego podría actualizar el árbol con esas variables. De esta manera puedo asegurarme de que todo el árbol esté invertido.
Yo : Genial. ¿Algo más que te falte?
C : No, creo. Por lo tanto, tomará O (n) tiempo y O (1) espacio ya que no uso ningún espacio adicional. (Observe la forma proactiva con la que el candidato discute el tiempo y el espacio)
Yo : estoy bien. Puedes empezar a codificar.
C : Claro. (Habla a través del código mientras codifica)
def invert(node) invert(node.left) invert(node.right) node.left,node.right = node.right, node.left return node end
C : Así que terminé. Déjame guiarte a través de mi código. Entonces, para un árbol como ... (Explica y se ejecuta con un ejemplo)
Yo : supongo que tienes razón. ¿Funciona para todos los casos?
C : Hmmm. Supongo que obtendré una excepción de puntero nulo para un árbol vacío. Permítanme arreglar eso agregando un cheque nulo.
E : Ahora se ve bien. Cualquier otra cosa que te falte.
C : No, creo que he cubierto otras cosas como sin hojas, una hoja, etc. (Fíjate en cómo menciona cada caso que consideró)
Yo : Genial. Soy bueno. ¿Alguna pregunta? :)
Retroalimentación
Entonces, ¿qué opinas de esta entrevista?
- El candidato aclaró los requisitos antes de comenzar la implementación.
- El candidato también congeló los requisitos repasando algunos ejemplos y aclarando su comprensión.
- Al candidato se le ocurrió una solución funcional sin ningún tipo de sondeo.
- El candidato discutió de manera proactiva las complejidades del tiempo y el espacio.
- Mientras codificaba, el candidato tenía una visión clara de lo que estaba haciendo y hacia dónde se dirigía.
- El candidato tenía un error en su código, y cuando se le pidió que verificara los errores, encontró el error y lo rectificó ellos mismos.
Conclusión
La entrevista es una habilidad completamente diferente a la codificación. A pesar de que eres bueno resolviendo problemas, la entrevista es un escenario en el que el entrevistador está tratando de decidir entre contratarte o no. Por lo tanto, además de la codificación, también debe comprender la perspectiva del entrevistador para facilitarle la contratación. En este artículo, quería comparar y contrastar una buena entrevista con una mediocre. Trate de practicar las habilidades para las entrevistas por separado, ya que cuanto más practique, mejor lo hará. Puede comunicarse conmigo si necesita ayuda para realizar entrevistas simuladas.
Este artículo se publicó por primera vez en //kaizencoder.com. Si te gustó este artículo, visita para leer más como este u obtener más información sobre mí.