Pregunta de la entrevista de codificación: ¿cómo sentirse lo suficientemente cómodo haciendo una determinada tarea que, naturalmente, no sucedería muy a menudo?

Me da ansiedad cuando hago la codificación de las entrevistas y las preguntas que normalmente podría completar me quedo atascado en los escenarios de las entrevistas. He leído esta pregunta que trata sobre cómo superar la ansiedad de la entrevista. Una de las principales respuestas que da es practicar. Acabo de tener una entrevista técnica que no especificaba qué practicar, entonces, ¿cómo puede uno prepararse?

Aquí hay un ejemplo particular: invertir una lista enlazada. Sé lo que es una lista enlazada, las he usado antes, las he implementado antes y he estudiado sus complejidades de tiempo. Es posible que en algún momento haya implementado un algoritmo de reversión, pero ciertamente no podía recordar cómo hacerlo bajo la presión de una entrevista.

Mis pensamientos fueron:

1) Muchos idiomas tienen una biblioteca de lista enlazada con una operación inversa (al menos Java la tiene y ese era el idioma que se usaba)

2) Incluso si necesitara implementar una lista vinculada y un método inverso, solo tendría que hacerlo una vez por proyecto. Entonces, ¿cómo puede uno estar muy familiarizado con tal método?

No estoy discutiendo si es una buena o mala pregunta, estoy preguntando ¿cómo se sabe estudiar cosas así antes de una entrevista técnica? Incluso si hubiera leído sobre estructuras de datos, probablemente no habría memorizado tales funciones. El hecho de que el entrevistador siguiera hablándome y diciéndome que explicara las cosas me impidió descifrar las cosas en el momento. En un momento preguntó "¿por qué necesita esa variable?" y respondí "Puede que no, solo estoy pensando", ¿fue una mala respuesta?

¿Existen otras formas de combatir la ansiedad de la entrevista que estar muy familiarizado y haber practicado las mismas preguntas?

No es una respuesta completa aquí, pero si usaría una referencia en línea para hacer la pregunta en el mundo real, generalmente diría que es razonable preguntarle al entrevistador si puede buscarlo en Google (o buscarlo en otro lugar). Al final del día, si tiene las habilidades para completar la tarea, es muy posible que eso sea lo que están buscando.
echa un vistazo al libro Cracking the Coding Interview (asociado con el sitio web de CareerCup). El libro tiene ejemplos de preguntas y respuestas y también consejos más generales sobre cómo abordar la entrevista. Como sugieren algunas de sus reseñas de Amazon, es un muy buen recurso para las personas que ya tienen un trabajo: si puede comprender todo el material del libro, debería estar en condiciones de hacer un buen trabajo y obtener el trabajo.
Esta pregunta parece estar fuera de tema porque es una pregunta específica de la industria que pertenece a Programmers.SE.
No pretendo ser insultante, pero en mi opinión honesta, si no puede revertir una lista enlazada de la parte superior de su cabeza, entonces es exactamente el tipo de desarrollador que están tratando de filtrar. Cualquiera debería poder escribir ese código mientras duerme.
Recursivamente, por supuesto
@BrianGordon Conozco a un excelente desarrollador (en el sentido de "excelente" se le asigna una tarea, desaparece un poco, regresa con la tarea terminada, de una manera que no puedo criticar) que nunca ha visto una lista vinculada en su vida. Contrataría a esa persona en un santiamén.

Respuestas (6)

No hay absolutamente ninguna manera de que debas esperar poder practicar todas las preguntas posibles.

No se trata de memorizar nada, se trata de tener suficiente exposición a las estructuras de datos y algoritmos para que pueda resolverlo y rápidamente. Y obtienes esta exposición con la práctica.

  • Tome algunos cursos en línea de estructura de datos y algoritmos (por ejemplo, de Coursera , son gratuitos). Aprendí mucho de algunos de estos cursos, que se suponía que eran de pregrado, aunque ya tenía mi título. La diferencia entre las diferentes universidades es tan grande que es absolutamente necesario tomar algunos de estos cursos para asegurarse de que está a la altura.

  • Pase algún tiempo en sitios de programación competitivos (por ejemplo , HackerRank , CodeChef , Topcoder ).

  • Hay muchos blogs y similares (por ejemplo, CareerCup y GeeksforGeeks.com ) sobre la codificación de preguntas de entrevistas: no lea las soluciones de inmediato, escriba el código de trabajo real en papel y cuente cuánto tiempo le lleva: su objetivo es decir bajo un hora desde que comienzas a leer la pregunta, ya que eso es aproximadamente la duración de las entrevistas.

  • Stack Overflow ciertamente puede ayudar, específicamente las etiquetas de estructuras de datos y algoritmos : ni siquiera tiene que responder nada (al principio), solo puede leer las preguntas, tratar de resolverlo usted mismo (intente escribir el código) y luego Lee las respuestas. Si bien es posible que muchas de las preguntas no sean preguntas de entrevista, cosas como encontrar errores en el código de otros también contribuirán bastante a que usted sea un mejor programador.

    Leer y escribir respuestas comprensibles también ayuda mucho a que te expliques mejor, lo cual es muy útil en una entrevista (no publiques respuestas que solo incluyan código).


En términos de consejos genéricos para entrevistas, habla.

Me doy cuenta de que algunas personas pueden pensar mejor en silencio, pero el problema de no decir nada es que el entrevistador no tiene idea de lo que estás pensando. Explica lo que planeas hacer. Si tiene algunas ideas, incluso si cree que son malas o no funcionarán, simplemente compártalas (incluso puede decir que cree que son malas, lo crea o no, pero las malas ideas a menudo ayudan mucho a sus posibilidades). ).

Si no dice nada y no está escribiendo nada, lo más probable es que el entrevistador le haga preguntas para determinar si necesita una pista o qué es exactamente lo que está pasando por su mente.

Sin embargo, debe esperar responder a una pregunta en cualquier momento: es posible que le pidan su motivación para tomar decisiones particulares o que traten de guiarlo en la dirección correcta con algunas preguntas capciosas.

Tenga en cuenta que una solución 'mala', realmente obvia, es mejor que ninguna solución; para su ejemplo, incluso si solo escribe código para recorrer la lista vinculada e insertar los elementos al principio de otra lista vinculada, eso terminaría con una lista invertida, eso es mucho mejor que no dar una solución. Si alguna vez se queda atascado, retroceda dos pasos e intente pensar en alguna forma realmente ineficiente de resolver el problema; con las preguntas de la entrevista, a menudo hay una.

Además, no haga suposiciones: pedir aclaraciones es bueno . Intente activamente no comenzar a escribir código de inmediato: intente encontrar al menos algo en la pregunta que no esté claro que pueda preguntar. Derecha: ¿qué tipo de lista enlazada es? ¿Doble o individual? Puede preguntar sobre la complejidad del tiempo y el espacio, pero para empezar no me preocuparía demasiado, ya que pueden servir como distracciones importantes para una solución algo peor que aún puede considerarse aceptable y terminar consiguiendo el trabajo.


En términos de practicar entrevistas reales, consígase un amigo programador para que haga algunas entrevistas de práctica reales con usted.

Consígase una pizarra (o un bloc de notas también podría funcionar), pídale que le pregunte algo como "invertir una lista vinculada" y escriba el código real en la pizarra. Que él/ella:

  • Comprueba que estás pidiendo una aclaración.
  • Verifique que no esté callado y sin hacer nada durante demasiado tiempo (no estoy seguro de cuánto tiempo es demasiado, ¿30 segundos?)
  • Aparece aleatoriamente con una pregunta sobre por qué tomó una decisión en particular o le pide que explique su código

Podrían obtener sus preguntas de un blog sobre la codificación de las preguntas de la entrevista, por lo que no tiene idea de lo que viene (podría ser una pregunta intencionalmente subespecificada, por lo que debe solicitar una aclaración (bien) o hacer un montón de suposiciones (malo)) .

También mezclaría algunas preguntas de entrevista que no son de codificación (es decir, recursos humanos), ya que es probable que las obtenga en entrevistas reales, y responderlas puede requerir diferentes mentalidades, y está tratando de hacerlo lo más real posible. posible.


Para terminar, practique la escritura de código que funcione completamente sin un IDE, sin probarlo antes de que esté completamente terminado (y luego pruébelo exhaustivamente para asegurarse de que funciona). Si no está acostumbrado a prescindir de toda la ayuda que le brinda un IDE, podría tener dificultades con ese aspecto solo.

Buena respuesta. Una cosa más. Encontré este sitio web que está diseñado para dar pequeñas tareas a los estudiantes/nuevos graduados para ayudarlos a ganar experiencia y tener algo para mostrar y tomar crédito al final. riipen.com ¿Qué opinas? youtube.com/watch?v=YuOG1bPRuwg ¿vale la pena?
Gracias. Nunca había oído hablar de eso, lo siento. Tendrás que comprobarlo por ti mismo. Podría ser genial, una gran pérdida de tiempo, o algo peor.
riipen.com resultó ser una decepción
En un trabajo, se le pedirá que haga cosas que no se han hecho antes, al menos no exactamente de la misma manera. Así que te están haciendo una pregunta que espero que no hayas respondido antes, para ver cómo la manejas, para asegurarte de que no estás totalmente atascado si tu trabajo requiere que crees un algoritmo tú mismo.

Hace décadas, tuve un profesor de ingeniería química que era muy inteligente y muy resistente. Nos diría exactamente lo que nos haría en sus exámenes, nos diría exactamente qué preguntas nos iba a hacer. Y luego, nos eliminaría sin importar cuánto estudiáramos. Fue desconcertante para nosotros, ya que fue humillante: por lo general, no ingresas a la escuela de ingeniería porque eres un tonto.

Los estudiantes finalmente nos dimos cuenta y encontramos la clave:

(1) una buena noche de sueño. En serio. Si va a estar bajo un estrés extremo, reaccionará mejor y con mayor eficacia cuando esté completamente descansado. O lo más descansado que puedas estar cuando vayas a la escuela de ingeniería :)

(2) Espere lo inesperado, pero deje de preocuparse por ello. El problema/limitación con el estudio excesivo y el pensamiento insuficiente es que no hay forma de que practiques para cada eventualidad. El universo de preguntas potenciales es demasiado grande. Lo que puede hacer es reconocer elementos de preguntas que ha estudiado antes y trabajar a partir de ahí.

(3) Sea absolutamente seguro de sí mismo. Si lo jodiste, lo jodiste. Pero si te consideras inteligente, fuerte y listo para cualquier cosa, eso es lo que te conviertes: inteligente, fuerte y listo para cualquier cosa. Así es como te vuelves exitoso. Porque la Diosa del Éxito es voluble con lealtades superficiales y ama a aquellos que son inteligentes, duros y están listos para cualquier cosa.

(4) Trabaja en tus fundamentos. Sigue trabajando en tus fundamentos hasta que puedas hacerlos mientras duermes. No se trata de memorizar y abarrotar, se trata de tener comprensión y control sobre lo que estás haciendo.

Al final del día, ganar es una cuestión de confianza: confianza en sus habilidades, confianza en su entrenamiento, confianza en su conocimiento de sus fortalezas y debilidades, confianza en su capacidad para un autoexamen intransigente pero justo, confianza en que usted Ganaré sin importar qué más pueda salir mal. Y sabes qué, a los empleadores les gustan las personas seguras de sí mismas. Porque saben o deberían saber que están poniendo su destino en manos de sus empleados.

expect the unexpected- gran punto, lo que suele pasar...

Las preguntas de codificación de la pizarra tienen que ver con la comunicación, no con la memorización . Si bien puede saber cuál es técnicamente la respuesta correcta en términos de código al final, ¿se da cuenta de que lo que realmente se está evaluando aquí es qué tan bien comunica lo que piensa, hace preguntas aclaratorias, qué consideraciones secundarias aporta? y en general, ¿qué tan bien presentas tu respuesta?

Mi sugerencia es tomar al menos un puñado de tareas de programación bastante simples como invertir una lista vinculada, invertir una cadena, crear una cola de prioridad, resolver Fizzbuzz y considerar seguir los pasos de cómo configurar su solución. ¿Qué preguntas haces al principio? ¿Dónde busca aclaración sobre si el tiempo o el espacio es una prioridad para la solución? ¿Qué idiomas usa y hay otros que pueden ser interesantes para ver cómo sería la solución en esos idiomas que quizás no conoce tan bien?

Recuerdo haber recibido un curso acelerado de un reclutador cuando vivía en Seattle, Washington, sobre esto y fue muy útil tener el marco para saber dónde escribiría el código, dónde colocaría los casos de prueba, dónde ¿Declararía las complejidades, etc. para tener un punto de partida para organizarme y avanzar a través del problema, ya que se supone que son lo suficientemente simples como para que si tuviera que resolverlo, probablemente podría hacerlo en la entrevista tal como es? No se trata del truco para encontrar el algoritmo, sino de qué tan bien puedes demostrar que tienes una buena solución al final.

Si desea algo con fines de comparación, considere los problemas de matemáticas en la escuela. En el grado 2 es suficiente acertar el número al final, mientras que en el grado 7 es más importante señalar cuál fue el enfoque que utilizó para justificar su respuesta. Mientras que en el grado 2 el maestro sabe la respuesta y puede reconocer al niño que la encontró, en los grados superiores es más importante poder saber por qué algo es correcto para que alguien no justifique: "Bueno, solo supongo que bien, así que pensé que esto funcionaría..."

Tu trabajo como ingeniero de software no es escribir código, es resolver problemas. A menos que haya salido recientemente de la universidad, esperaría que (léase: cualquier persona competente que solicite un trabajo de programación que requiera experiencia previa) descubra cómo revertir una lista vinculada con un poco de tiempo. ¿Por qué? Porque tendrá que hacer cosas muy similares en su trabajo, pero no cosas que ya existen en alguna biblioteca estándar.

No me den una mierda sobre la presión de la entrevista: es muy probable que su trabajo diario involucre a sus clientes o a su jefe presionándolo constantemente.

Esto puede ser duro, pero las entrevistas no son para que las estudies. Están allí para asegurarse de que pueda hacer su trabajo. Si no puede hacer su trabajo (resolver problemas aleatorios, posiblemente bajo presión), entonces no debería obtener el trabajo .

Estudiar para pasar la entrevista solo para llegar a un trabajo donde no puedes estudiar para cada nuevo problema es solo prepararte para el fracaso.

Párrafo 1: de acuerdo. Párrafo 2: (i) "No me den una mierda sobre la presión de la entrevista", esto parece innecesariamente duro, al borde de la ofensiva. ¿Cómo sabes que el OP no sufre de ansiedad innecesaria (mucha gente lo hace)? (ii) Algunos trabajos de software tienen una presión increíblemente baja: ¿cómo puede estar seguro de cuál está solicitando el OP? Párrafo 3: de acuerdo, si el OP no puede hacer el trabajo, no debería obtener el trabajo. Pero al estudiar para las entrevistas, espero que los candidatos se preparen para ellas como lo harían para las reuniones con los clientes. Para 4, entiendo tu punto, pero aprender a pasar estas entrevistas también ayuda en el trabajo.
@TooTone: claro, pero la pregunta original pierde el punto ... Si tiene problemas con los problemas de la entrevista, no debe estudiar los problemas de la entrevista, debe estudiar la resolución de problemas.
No se ofenda, pero para que su respuesta sea más útil, ¿por qué no discutir cómo "estudiar la resolución de problemas"?
@TooTone Me atrevería a decir que la mayoría de los trabajos de software son trabajos de mucha presión . La mayoría de las veces, algunos tipos con traje contrataron a algunos "chicos informáticos" para "hacer algunas cosas informáticas". Y te acosarán hasta que produzcas exactamente lo que quieren, sin importar si te dijeron lo que era.
@corsiKa Mi experiencia es que es mucho más variado que eso. Mi primer trabajo (hace mucho tiempo) fue en el departamento de TI de una gran empresa y era tan relajado que un empleado permanente allí admitió que podía hacer su trabajo en la mitad del tiempo si era necesario. En el medio, he tenido varios roles de alta presión que (en su mayoría) disfruté. Una de las razones por las que dejé mi último puesto fue porque era demasiado relajado: podía obtener lo que necesitaba para parecer productivo en unas pocas horas cada día, casi sin consecuencias reales por cometer errores, etc.
Estoy de acuerdo, @TooTone, a menudo veo el argumento de que la presión de la entrevista es un indicador de la presión laboral, pero esta es una falacia de falsa equivalencia. Son dos tipos muy diferentes de presión que el cerebro procesa de manera muy diferente. La presión de observación/juicio directo puede desviar el enfoque mental más significativamente que una fecha límite inminente. Solo pregúntale a alguien que no puede orinar cuando alguien está mirando. Apuesto a que no tienen ningún problema cuando tienen prisa, pero aún así tienen privacidad.

No deberías tener que practicar todas las preguntas y es probable que específicamente quieran verte trabajar en algo que no hayas practicado específicamente. Ejercicios como ese son útiles porque presumiblemente tienes una idea de cuál es el problema, por lo que les evita perder el tiempo teniendo que exponer todos los detalles, pero como es algo que no haces a menudo, pueden ver un ejemplo. de cómo trabajaría en un escenario de trabajo real donde está programando el código de algo que no ha hecho o que normalmente no hace.

Decir "Puede que no, solo estoy pensando" fue una buena respuesta, siempre y cuando lo dijeras en un tono cortés. La mitad de la razón por la que tiene que hacer un problema como ese es para ver la implementación real que hizo (¿usó demasiadas variables? ¿Tuvo una solución O (n ^ 4) donde estaba presente una solución O (n)? ). En ese caso, haga lo mejor que pueda y si ve un problema en su solución, hágaselo saber (es decir, "Por ahora tengo una función de marcador de posición aquí, puedo hacerla más eficiente con un poco más de tiempo. "). Sin embargo, la otra mitad es solo para ver cómo trabajas. De esta manera, tu respuesta les hará saber eso. Es posible que te hayan preguntado porque querían ver cómo abordas los problemas y en qué cosas piensas. Si obtiene un entrevistador que realmente se enfoca en los detalles y hace preguntas como esa,

Al postularme para puestos de "Ingeniero de software sénior", es muy probable que me hagan una de tres preguntas en algún momento durante el proceso de entrevista (ya sea durante la pantalla del teléfono o en el sitio), que son:

  • Implementar una lista doblemente enlazada.
  • Implementar una tabla hash.
  • Implementar una búsqueda binaria.

Mi sugerencia sería que, como parte de la preparación de su entrevista (antes de cada entrevista), implemente los tres con los métodos adecuados de inserción, búsqueda y eliminación.

Será tedioso al principio, pero después de un tiempo habrá memorizado la estructura básica de cada uno y podrá simplemente escribirlos (o escribir en una pizarra) de memoria.

Puede parecer una pérdida de tiempo, pero simplemente, poder eliminar esos tres de la memoria podría significar que su oferta es 5-10K más alta de lo que sería de otra manera, por lo que consideraría que vale la pena la inversión de tiempo.