¿Por qué tantos graduados de CS responden preguntas de entrevistas simples sobre algoritmos? Trabajo en una gran empresa de tecnología y entrevisto a muchos candidatos para puestos técnicos (pero no de codificación directa), y muchos parecen haber olvidado cosas básicas.

Porque olvidas que las cosas básicas son, de hecho, no tan obvias. Las entrevistas técnicas que se basan en un problema son esencialmente un programa de preguntas para recordar.

Solo por un ejemplo: hablemos sobre el problema de la lista vinculada. ¿Cómo detecta si una lista enlazada individualmente contiene un ciclo, en el espacio O (1)? He hecho esta pregunta a cientos de personas en la universidad y en el trabajo después. O lo respondes de inmediato, o te tomas muuuucho tiempo. En tus estándares (no para atacarte personalmente, pero las cosas básicas realmente me molestan), estos últimos carecen de fundamentos.

La respuesta es el enfoque clásico de tortuga y liebre; toma dos punteros y los hace recorrer la lista a diferentes velocidades. Obvio. ¿No es así?

No.

Este problema ha sido realmente un problema abierto durante doce años . Hasta que un científico informático muy inteligente decidió trabajar en el problema, y ​​trabajó muy duro para resolverlo, y luego publicarlo, nadie sabía cómo hacerlo.

Ahora, si no ha escuchado este problema antes de la entrevista y se espera que lo resuelva en treinta minutos, ¿sería justo?

Te contaré una historia.

Terminé uni hace 8 años (comencé a trabajar a tiempo parcial 2 años antes de graduarme). En la universidad, era súper bueno con los algoritmos, incluso era parte de un grupo algorítmico de estudiantes de élite. Entonces, no, no es que no lo entendí, sí, había muchas personas en mi curso que en realidad no lo entendieron, pero yo fui uno de los mejores. Sabía esas cosas de adentro hacia afuera.
Trabajo como desarrollador de Java, principalmente en finanzas. Soy práctico, hice algunas cosas interesantes (incluido el último zumbido de NoSQL y tal), muchas personas me dijeron que soy uno de los mejores desarrolladores con los que han trabajado.
Recientemente, un cazador de cabezas de Facebook se me acercó si me gustaría entrevistarlos y les dije que lo pensaba. Sabiendo cuál es su (y Google y tal) procedimiento estándar de entrevista, obtuve uno de estos libros de práctica algorítmica / codificación previa a la entrevista. Empecé a pasar por esto y ¿sabes qué? Al principio me deprimí un poco lo que olvidé. Y luego, después de enfriarme un poco, simplemente decidí que no podía molestarme y que no presentaría la solicitud.
¿Por qué? Porque aunque aprecio que hay ciertas cosas realmente BÁSICAS que todo el mundo debería saber (por ejemplo, cuál es la diferencia entre la lista y el conjunto, o entre la lista vinculada y la lista de la matriz, o la diferencia entre los primeros recorridos de amplitud y profundidad), también creo lo que fue dicho aquí antes. Lo que estás preguntando es IMO, no cosas básicas, son cosas que solo recuerdas si las usas activamente. Si no lo usa, lo pierde. Y aunque fui brillante con todos los algoritmos bajo el sol hace 8 años, en este momento apenas puedo recordarlos vagamente, pero ¿sabes qué? No lo necesito La mayoría de ellos están implementados y listos para usar en bibliotecas gratuitas de código abierto. No necesito reinventar la rueda. La ordenación y cualquier otra operación en las estructuras de datos están listas, solo necesito saber cuál aplicar. Necesito saber sus pros y sus contras (lo que hago, para las cosas que realmente uso). No necesito saber la implementación exacta (o poder hacerlo yo mismo). En las raras ocasiones en que necesito algo más sofisticado, no necesito poder hacer estas cosas en el acto, dentro de los 30-45 minutos de una entrevista. Existe esta cosa brillante llamada Google y Wikipedia.

Sí, podría dedicar tiempo a prepararme, sí, podría volver a revisar todo eso y sé que ENTONCES podría pasar esta entrevista. Pero prefiero pasar mi tiempo en cosas más interesantes y, francamente, más útiles (al menos en mis ojos), como jugar con Neo4j o Hadoop, o lo que sea que sea el nuevo chico genial en el bloque. Solo hay tantas horas en un día. No tengo ganas de desperdiciarlos en volver a aprender algo que aprendí en la universidad y en 8 años encontré muy poco uso práctico (y, por lo tanto, olvidé mucho de eso ahora).

Y tal vez donde estás estas cosas realmente se usan a diario. Tal vez no lo olvidaste por eso. Tal vez trabajas tan bajo nivel con algoritmos y reevaluando continuamente su complejidad de espacio y tiempo que parece obvio y básico. Pero si ese es el caso, aún más, * personalmente * no quisiera trabajar en ese lugar. Parece aburrido como el infierno. Para mí, la diversión es un nivel de abstracción mucho más alto, y proviene más de resolver problemas de la vida real para personas reales, y desde mi experiencia hasta ahora, los algoritmos casi nunca son la parte más difícil de la solución.
Pero sí. Su kilometraje puede variar 😉

¿Tienes idea de a cuántos algoritmos podría haber estado expuesta una persona durante su carrera académica o post-académica? No los mantienen a todos “en caché” por así decirlo. Pueden pasar un tiempo antes de que recuerden un algoritmo para un problema específico, e incluso entonces podría ser diferente al que tenía en mente. Considerando eso, ¿les estás dando suficiente tiempo? ¿Aceptas respuestas que no son las que esperabas? ¿Te habrías acordado de estos algoritmos si no los hubieras usado en la última entrevista o los hubieras buscado en un libro hace una hora? La primera pregunta es razonable, la cuarta es límite, y el resto son demasiado específicos.

En algún momento, solo por diversión, invítelos a asarlo de la misma manera. Apuesto a que la mayoría de ellos podrían pensar en un algoritmo que habías olvidado (o que nunca supiste), y tú serías el que “fallara” en la entrevista. Lo mismo para mí y para todos los que leen esto. El propósito de una entrevista no es que pruebes cómo eres más inteligente que el candidato. Cualquiera que pudieras contratar de esa manera estaría entrevistando para su próximo trabajo en solo un par de meses. Bájese y trate de concentrarse en lo que los candidatos saben en lugar de lo que no saben.

Muchos programas de ciencias de la computación se diluyeron con menos trabajo práctico debido a una alta tasa de lavado que fue malo para los ingresos del departamento. Joel Spolsky informó 40-70%. Supuestamente 1/3 de mi clase de Estructuras de datos (las tareas consistían en implementar estructuras de datos en ‘C’, las calificaciones provenían de la fracción de pruebas automáticas definidas por TA que aprobaron) fallaron, aunque nuestros graduados de contratación de tasa de rechazo pasaron de ser insignificantes a aproximadamente 50% cuando eso al profesor ya no se le permitía enseñarlo.

Sin trabajo práctico, los estudiantes tampoco internalizan la información. Es posible que las pruebas solo requieran memorización, lo que permite a los estudiantes graduarse que no pueden aplicar lo que aprendieron incluso cuando todavía lo recuerdan. No puedo contar con cuántos candidatos con los que he hablado que pueden recitar características de gran O de todas las estructuras de datos básicas, pero no elegir uno para la inserción aleatoria y la eliminación de orden secuencial o aleatoria (incluso cuando las cosas están relajadas para permitir la especificación contenedores STL apropiados).

El sesgo de selección también impide la selección de una muestra representativa de ingenieros que trabajan. Los mejores candidatos tienden a conseguir trabajo a través de sus redes personales y rara vez aparecen en el mercado. Los aceptables rápidamente consiguen trabajo. El resto corresponde al 95 – 99.5% y sus currículums se envían a numerosas empresas. Es por eso que los programas de pasantías son excelentes: comienzan con una distribución normal de candidatos y esencialmente tienes el primer derecho de rechazo cuando los estudiantes se gradúan. Joel Spolsky cubre esto más elocuentemente en Finding Great Developers.

Todas las preguntas son básicas. Solo la pregunta de hash requiere dragar algo de la memoria; aunque eso es algo tan común que un ingeniero que no lo sabe es casi como un escritor que no puede usar adjetivos “¡Corre, corre!” No pensé en aplanar un árbol en una lista vinculada hasta que escribí la respuesta de Drew Eckhardt a la lista de enlaces de árbol ordenado a circular doble: una función no recursiva treeToList (raíz de nodo) que toma un árbol binario ordenado y reorganiza los punteros internos para hacer una lista circular doblemente vinculada de los nodos del árbol? y no es algo que esperaría que apareciera un candidato a la entrevista.

  • 110% Doble de la parte n de n log n. log 2 1M es 20 para fines prácticos, lo que le da 21/20 por el múltiplo adicional de 1.05.
  • Divide los datos en fragmentos del tamaño de la memoria. Ordene aquellos en los servidores en paralelo usando algo conveniente. Utilice tipos de fusión externos en los resultados. Utilice flujos TCP / IP como entradas para esos tipos. Combine subconjuntos de máquinas con más niveles de fusión para flotas realmente grandes.
  • Sin punteros principales: en orden, recorridos utilizando pilas con O (log n) complejidad de espacio. Omita los nodos interiores con un hijo como optimización del espacio. Si la mutación de los árboles es aceptable, puedo aplanarlos en listas doblemente vinculadas descartando los nodos interiores para el espacio O (1). Con punteros principales: en orden, recorridos utilizando el espacio O (1).
  • Use algo de f (x) que proporcione una distribución de salida razonable, módulo sobre el tamaño de la tabla hash que debería ser primo para menos colisiones. Al usar listas vinculadas para el manejo de colisiones, se obtienen inserciones de O (n) en el caso degenerado.

Como estudiante, no utilicé ninguna biblioteca más allá de libc, que es lo que esperaría (o el análogo en esquema, java, etc.) en un programa de ciencias de la computación; esas deberían ser sobre los fundamentos inmutables que se aplican a lo largo de las carreras de las personas, no cualesquiera habilidades simples que sean populares hoy en día. Incluso los recién graduados deberían poder aplicar esos fundamentos.

Algunos trabajos no requieren más que unir las bibliotecas; aunque estos se subcontratan fácilmente a ingenieros que viven en lugares donde $ 1500 alquila una mansión con sirvientes que no son la mitad de un apartamento de una habitación con salarios que coinciden. Los estudiantes que solo aprenden lo suficiente para competir en ese mercado laboral no se están haciendo ningún favor.

Algunos no lo hacen. Necesito árboles Merkle con solo los nodos de hoja persistentes para que la verificación de integridad de extremo a extremo funcione en mi producto de copia de seguridad en línea cuando utilizo el procesamiento paralelo dentro de un archivo que nos hace viables en el espacio de copia de seguridad de imagen. Necesitaba un tipo de fusión externa para hacer que el reinicio de sincronización funcionara después de un apagado forzado para fusionar las copias nuevas y antiguas de mi caché de metadatos del lado del cliente que usa solo IO de disco secuencial. Un trie fue apropiado para rastrear el subconjunto en memoria del árbol de directorios en el que se está operando. Cuatro colas prioritarias procesan las cosas de manera eficiente en un orden que minimiza la huella de memoria. Las máquinas de estado eran la forma más sencilla de impulsar el proceso de sincronización dada la entrada asíncrona de la caché de metadatos, los recorridos de directorio y la finalización del procesamiento descendente de directorio.

A veces es porque el entrevistador que hace estas preguntas realmente no comprende los algoritmos tan bien y, por lo tanto, no puede evaluar el conocimiento o la capacidad de los algoritmos de una manera verdaderamente significativa.

Conozco algoritmos, porque he estado haciendo un doctorado en teoría CS en algoritmos. Probablemente he estudiado algoritmos en más del 99.9% de los entrevistadores de la industria que rutinariamente hacen preguntas sobre algoritmos, pero eso realmente me molesta aún más cuando me hacen esa pregunta en una entrevista.

Con la mayoría de estas preguntas, probablemente siento lo mismo que sentiría un doctorado en matemáticas si alguien les pidiera que resolvieran un problema de división larga para demostrar que saben matemáticas.

Hubo una compañía en particular (que permanecerá anónima) donde el entrevistador ni siquiera tenía una licenciatura en CS pero decidió que necesitaba darme un problema de algoritmos durante la entrevista, ya que ese era mi historial.

Inmediatamente reconocí que el problema que me dio se resolvió mediante programación dinámica. Aproximadamente 5 minutos después, le di un pseudocódigo perfecto para resolver el problema. Desafortunadamente, el entrevistador no reconoció mi solución como correcta porque difería de lo que tenía en mente. Seguí tratando de explicarle por qué la solución era correcta, pero él no la entendió (y su inglés tampoco era tan bueno). Después de la entrevista, me di cuenta de que la razón por la que no entendió mi solución es porque la solución que tenía en mente era defectuosa (algo estúpido como un error), pero no pudo reconocer ese sutil detalle porque probablemente Ni siquiera sabía cómo resolver el problema por su cuenta. Este era solo un estúpido problema que había encontrado en Internet.

Regla 1. Nunca pruebe a alguien con un problema que no puede resolver usted mismo.

También estoy bastante molesto por el hecho de que los entrevistadores hacen preguntas estúpidas sobre algoritmos, porque eso significa que cada vez que enseño una clase de algoritmos de pregrado, eso es lo único que les importa a mis alumnos. Realmente no quieren saber los conceptos de alto nivel. Solo quieren saber qué les ayudará a realizar las entrevistas de su empresa.

Mira, si quieres hacer preguntas sobre buenos algoritmos en una entrevista, debes consultar a un experto. No dude en ponerse en contacto conmigo si desea sugerencias. También necesita saber cómo establecer sus expectativas. Aquí hay algunas pautas:

  • Nadie debería tener todos los CLRS memorizados. Ciertamente no. Por lo tanto, no pruebe a las personas sobre su conocimiento de algoritmos aleatorios y estructuras de datos. Esto generalmente demuestra un sesgo, porque los algoritmos y las estructuras de datos que ha memorizado son los que más utiliza. Al igual que si ha codificado mergesort un millón de veces, probablemente lo sepa de memoria, pero eso no tiene nada que ver con lo bueno que es en los algoritmos. Ser bueno con los algoritmos no tiene nada que ver con la memoria.
  • Cualquier problema de algoritmos que pruebe significativamente la creatividad de un candidato requerirá al menos una hora para resolverlo. He descubierto esto con los estudiantes a los que enseño algoritmos. Tal vez los candidatos más hábiles puedan resolver estos problemas en 30 minutos o menos, pero en general no tendrá tiempo suficiente para evaluar la creatividad de un candidato en una entrevista. En caso de que se lo pregunte, los exámenes dados en las clases de algoritmos tampoco ponen a prueba la creatividad. El tipo de problemas de algoritmos dados en las entrevistas son problemas de memoria o requieren que el candidato vea rápidamente algún truco que haga que el problema sea trivial.
  • En mi opinión, las preguntas de entrevista de buenos algoritmos no evalúan la creatividad, la inteligencia o la memorización, sino que prueban la capacidad del alumno para sintetizar los conceptos básicos que deberían haber aprendido en sus clases de algoritmos.

    Permítanme dar un ejemplo de una buena pregunta de algoritmos que nunca he visto en una entrevista:

    ¿Cuándo utilizaría un algoritmo O (n ^ 2) en lugar de un algoritmo O (n log n)?

    Para poder responder a esta pregunta, primero el candidato debe saber qué es la complejidad asintótica, por lo que puede estar seguro de eliminar a aquellos que no tienen idea.

    Pero en segundo lugar, esta es una buena pregunta porque es poco probable que el candidato haya recibido la respuesta a esta pregunta en sus clases o libros de texto, por lo que demuestra su capacidad para comprender un concepto más allá de lo que aprendieron de memoria.

    Comprender verdaderamente un concepto como la complejidad asintótica de cualquier manera práctica significa que también comprende las limitaciones del concepto. Y dado que esta pregunta es muy abierta con muchas respuestas justificables, le da una buena idea de cómo piensa el candidato.

    Lamentablemente, nunca una vez un estudiante me hizo esa pregunta cuando enseñaba algoritmos. Creo que es una pregunta natural si piensas críticamente sobre lo que estás aprendiendo.

Llevemos esta pregunta un paso más allá: ¿por qué tantos entrevistados cuestionan los algoritmos?

Esto se remonta a un viejo cliché: si no lo usa, lo pierde.

¿Sabes cuántas veces, en 15 años de trabajo profesional (aunque esto en la universidad para las clases), he tenido que implementar un algoritmo de clasificación comparativo?
Cero.

Número de veces que he implementado un b-tree:
Cero.

¿Cuántas veces he implementado una tabla hash?
Cero.

Número de veces que he implementado un algoritmo de clasificación de cubos:
Dos veces (trie)

¿Cuántas veces he implementado una lista vinculada?
3 veces (solo cuando estaba escribiendo el código C).

Aquí es por qué los he hecho tan infrecuentemente:
Porque todo se ha hecho antes.

Todavía no he visto una clasificación generalizada (recientemente vi un TrieMap en la colección apache pero no lo he usado), pero la clasificación comparativa se implementa en todos los idiomas que conozco, incluido C. HashTable / LinkedList / RBTree todo hecho e implementado y código de biblioteca reutilizable

La única razón por la que he tenido la oportunidad de escribir listas vinculadas es porque, en ese momento, glibc no tenía nada para ellos. Pero incluso ahora, hay soporte incorporado en glibc para estos tipos de datos.

A menos que esté escribiendo código incrustado para sistemas militares o RT donde el uso de la biblioteca no está permitido, entonces aprovechará las bibliotecas de otras personas para realizar estos trabajos.

Como programador profesional, sus prioridades serán:

  1. Entrega de funciones (por fecha límite):
  2. Libre de errores:
  3. mantenible:

¿Quiere saber cómo es más efectivo en los 3 objetivos prioritarios anteriores? Ajustar bibliotecas preexistentes.

En pocas palabras: la gente los “critica” porque les preguntas sobre cosas que pudieron haber hecho hace una década.

La premisa de su pregunta es incorrecta. Por ejemplo, puedo asegurarle que no aprendimos sobre el procesamiento de datos multiservidor de 64 bits en la clase de algoritmos. La exposición de los estudiantes a tal problema dependería en gran medida de los proyectos y trabajos avanzados en los que terminaron trabajando DESPUÉS de los cursos básicos. Investigar sobre ese trabajo y luego pedirles que adapten esas ideas a nuevos contextos le dará una idea mucho mejor de cuán capaz es el candidato para aplicar el conocimiento.

Si realmente le preocupa la capacidad de los candidatos para manejar un tema en particular, encontrará más éxito al tener una “lección interactiva” con ellos. No tiene sentido rechazarlos por no recordar (o nunca haber encontrado) una información en particular que no haya sido relevante para su trabajo; en su lugar, proporcióneles esta información y luego vea qué pueden hacer con ella. Es una conversación, no una prueba. Estás probando su inteligencia, no si han memorizado sus libros de texto de algoritmos.

Estás haciendo las preguntas equivocadas. ¿Estás contratando a alguien que escribirá un compilador o diseñará un nuevo lenguaje de programación? La mayoría de los programadores usarán bibliotecas para la mayoría de los algoritmos. Si no lo son, entonces están complicando las cosas. Entiendo cómo funciona una tabla hash, pero si me preguntaras eso en una entrevista, terminaría la entrevista allí. ¿Por qué perderías el tiempo con eso? Debería hacer preguntas relacionadas con la resolución de problemas y los problemas del mundo real.

EDITAR: parece que la gente perdió el punto, así que déjame explicarte un poco mejor. Hablando como un programador veterano y uno que ha entrevistado a muchos, contrató a muchos, despidió a muchos y trabajó con muchos otros programadores, no puedo decir lo poco que realmente importa el conocimiento real de programación conocido durante el proceso de la entrevista. Con el tiempo, por supuesto, la comprensión de varios marcos y algoritmos hará la diferencia. Las habilidades más importantes que toco para un programador son la creatividad, la resolución de problemas y las habilidades sociales básicas. Sin ellos, les resultará difícil contribuir a cualquier equipo.

Una vez trabajé con un tipo que sabía más sobre informática que el resto del equipo combinado. Escribió un código súper optimizado, pero estaba tan por delante del resto del equipo que solo él podía soportar ese código. También tenía una ansiedad social terrible y era completamente incapaz de explicar nada a los demás. Con el tiempo, yo y algunos otros pudimos descifrar su código. Resultó que estaba haciendo algunas cosas bastante simples pero de una manera altamente optimizada. Reescribimos el código usando un código de biblioteca estándar y un marco especializado existente. Era tan bueno como el código que escribió, pero era compatible con todo el equipo. Finalmente lo dejamos ir. Siempre reinventaba las ruedas, era una pesadilla social y ocasionalmente se agrietaba bajo presión.

Casi todo ya está dicho.

Llevo más de 20 años trabajando en la industria del software en muchos niveles diferentes, desde el desarrollo de bajo nivel hasta el uso de estas herramientas y marcos de “casi todo”, y he estado trabajando solo y con todo tipo de socios y equipos. Y al final estoy desarrollando y asesorando sobre seguridad.

Para mí, el principal problema es un problema de “industria”. Pregúntele a alguien cuántas veces ha estado usando cálculo o teoría booleana en sus soluciones a los problemas en los que trabaja todos los días. Si no pueden responder a esto, sería muy difícil que también estén usando la teoría de algoritmos que trabajaron en la época universitaria.

La industria pide soluciones rápidas, nunca buenas. Piensan que tener servidores extremadamente potentes y lenguajes efectivos no tendrán que preocuparse por crear software no óptimo, y en muchos casos funciona así.

Lo que la industria no tiene en cuenta es que “si” dejan que sus trabajadores apliquen las matemáticas correctamente (y los algoritmos son las matemáticas), sus soluciones serán mucho mejores, incluso haciendo “magia”. No se trata de un gurú, se trata de lo que debe ser el conocimiento básico y lo importante que es usarlo.

Mientras trabajo por seguridad, entiendo que muchas veces las soluciones, prácticas y bibliotecas “tradicionales” no funcionarán porque tienen varios problemas que no puedo permitir que existan en mis productos. Los problemas que surgen del uso incorrecto, incluso la elección de estructuras de datos particulares, el mal manejo de la memoria y / u otros recursos, para olvidar dónde están los elementos “temporales” porque no se comprende el flujo de datos, etc.

Esto me muestra que la industria está trabajando en un curso de colisión. No podemos seguir creando castillos en la arena. No puedo asegurarme de que podré responder a todas sus preguntas tal como han sido formuladas, pero soy consciente de los problemas involucrados y la “gran O” es extremadamente importante. Los programadores de hoy no prestan atención a la rapidez con que usan los recursos hasta que es muy tarde y no tienen idea de cómo resolver sus problemas de manera novedosa, porque olvidaron toda la teoría que se enseñaba en los días escolares.

Ya hay muchas buenas respuestas, pero me gustaría agregar algo yo mismo. Como maestra de CS trato diariamente con estudiantes de pregrado y me he hecho la misma pregunta para ayudar a mis alumnos cuando se gradúen.

Parte del problema es lo que la industria espera de los candidatos de CS recién graduados. A medida que los estudiantes progresan en sus cursos, acumulan los conocimientos necesarios para convertirse en un futuro desarrollador profesional. Sin embargo, también necesitan madurar como desarrolladores para poder calificar completamente en ese tipo de entrevistas. Y eso no se puede lograr para cuando obtengan su título.
Esto puede explicarse utilizando las cinco etapas del modelo Dreyfus como se describe en Pragmatic Thinking and Learning. Aproximadamente, en las dos primeras etapas, principiante y principiante avanzado, el estudiante no se centra en “¿Por qué funciona y cómo?” pero al obtener resultados lo más rápido posible. Tenía casos aislados en los que el estudiante se vuelve competente (la tercera etapa de Dreyfus) antes de su primer trabajo.
El tipo de preguntas formuladas en varias entrevistas solo se puede responder al programador recordando los algoritmos o desarrollando una solución allí mismo en la entrevista. A menos que alguien haya estado trabajando recientemente en ese tipo de problemas específicos que pregunta el entrevistador, es poco probable que recuerde las respuestas de un libro de texto o una clase tomada hace un par de años o incluso meses. Y desarrollar una solución allí mismo en la entrevista requiere que el entrevistado esté al menos en la tercera etapa del modelo Dreyfus. Me atreveré a decir que hoy las entrevistas esperan que los candidatos sean al menos Competentes (nivel cuatro).
Los requisitos para ir más allá del principiante avanzado generalmente son diferentes para cada estudiante y es muy probable que necesiten enfrentar un problema del mundo real para llegar a etapas más avanzadas. Las condiciones cuando se enfrentan a problemas del mundo real son difíciles de recrear en las aulas porque los estudiantes no enfrentan los mismos riesgos si no encuentran una solución.

Permíteme ser la respuesta definitiva a tu pregunta.

Si me hicieras la pregunta Big 0, te preguntaría qué tiene que ver mi vida sexual con la entrevista.

Por lo tanto, contrataría a todas las buenas personas que dejaron respuestas legítimas y me contrataron para que usara blusas de escote y, tal vez, contestara un teléfono o dos.

Deja de hacer la vida tan difícil para todos, incluyéndote a ti mismo. El genio melancólico que lamenta la falta de descendencia brillante del mundo, generalmente es la única persona que lo ve como tal.

Las preguntas auténticas relacionadas con el trabajo, en cualquier campo, le permitirán encontrar rápidamente a las personas que realizarán el trabajo y lo harán lucir bien para encontrarlas. La mayoría de las personas tienen miedo de contratar a las personas que pueden hacer lo que no pueden y, por lo tanto, están destinadas a la oscuridad. Los que son inteligentes, que siempre parecen encontrar a las personas que más contribuyen a la industria, siempre estarán empleados y serán muy buscados. Sus multimillonarios rara vez son genios, solo tienen una habilidad especial para encontrar personas que hagan el trabajo del que pueden apropiarse y monetizar.

Sé el multimillonario, Danny. Se el multimillonario.

Lo que no se menciona en su pregunta puede ser el hecho más importante: lo que la posición espera de estos candidatos con respecto a los algoritmos. Dicho de otra manera, ¿por qué el conocimiento algorítmico es crítico o un predictor del éxito de un candidato para este puesto?

Si desea determinar si un candidato puede “usar” algoritmos, o “aprender” algoritmos, o “seleccionar” cuál es el mejor de los que comprende, entonces haga una pregunta de descripción de comportamiento , en lugar de una pregunta de conocimiento de libros de texto .

Ejemplo: cuénteme sobre un tiempo que tuvo que usar | aprender | selecciona un algoritmo apropiado para resolver un problema en el trabajo?

Con preguntas de seguimiento sobre el algoritmo, el proyecto, el contexto para comprender si el candidato tiene experiencia “haciendo” trabajo algorítmico.

Francamente, cualquier idiota que pueda usar un motor de búsqueda puede encontrar casi cualquier algoritmo con código de ejemplo en cualquier idioma. ¿Por qué alguien los “memorizaría”?

Deje que su candidato le cuente sobre los algoritmos que ha utilizado, aprendido y seleccionado para resolver problemas específicos. Esto requiere que comprenda que si pueden usar, aprender o seleccionar uno, pueden aplicar esta habilidad a otros.

Si está contratando graduados recientes, entonces su tarea es diferente, pero similar, ya que nunca han “trabajado” con algoritmos, solo han “practicado”. Es bastante injusto que esperes que todos los graduados universitarios conozcan el mismo “subconjunto” de algoritmos. Hay cientos de algoritmos e incluso en un “curso” de algoritmos: un estudiante solo puede usar 10-20 y leer más de 30-50. Piense en algoritmos como enchufes en un conjunto de llaves, una vez que tenga el concepto de encontrar e implementar un algoritmo – solo está investigando y luego enchufándolo.

Deje que el candidato graduado reciente defina un subconjunto de algoritmos que conozca, y seleccione de ese conjunto, uno con el que esté menos familiarizado , y pídales que le expliquen. Si pueden explicarlo para que usted lo entienda, tenga en cuenta que tienen habilidades de comunicación decentes y cierta comprensión de los algoritmos.

Las personas fallan porque piensan como los demás aquí que estas habilidades no serán útiles. Al menos en una gran empresa, están equivocados. Permítanme dar ejemplos de cómo cada pregunta está directamente relacionada con un problema del mundo real.
* Si la complejidad de tiempo de un algoritmo es O (n log n), ¿aproximadamente cuánto más tiempo se tarda en aplicarlo para n = 2e6 vs. n = 1e6? Ejemplo real: mi servicio está obteniendo más clientes pronto. ¿Cuántos servidores más necesito comprar?
* Si tuviera una gran cantidad de números de 64 bits en una gran cantidad de servidores, ¿cuál sería una buena manera de ordenarlos? Ejemplo real: estamos almacenando un montón de blobs de datos en diferentes servidores. Proporcionar un índice ordenado al usuario.
* ¿Cómo compararía la secuencia de nodos terminales / hoja de dos árboles (misma franja)? ¿Cuál es la complejidad espacial de su solución? ¿Puedes hacerlo mejor? Ejemplo real: Implementar reproducción de audio en firmware.
* Explicar cómo funcionan las tablas hash. ¿Cuál es su complejidad en el peor momento? Ejemplo real: la implementación probablemente rara vez sea necesaria, pero conocer las compensaciones de implementación de espacio-tiempo de las tablas hash a menudo es muy importante, y tenía que comprender cómo funcionan para hacerlo. Por ejemplo, un criptógrafo te dice que debes cambiar los algoritmos hash porque el que estás usando no es seguro. ¿Tienen razón, le importa y si cambia, cómo se verá afectado su programa?

Es cierto que en muchos casos tendrá un marco disponible para hacer esto por usted. Esos son los fáciles. Estamos buscando personas para resolver los difíciles. Por lo que vale, estoy diez años fuera de la universidad, no he codificado en ocho, y todavía sé la respuesta a todas estas preguntas, aunque no estoy seguro sobre el gráfico uno. No creo haberlo sabido nunca.

Es totalmente aceptable que los candidatos olviden los detalles. Siempre se espera que el entrevistador aquí en Microsoft conozca las mejores y más completas respuestas a su pregunta. La expectativa es que el candidato tenga un conocimiento práctico y haga preguntas sobre detalles clave. Si no recuerda los detalles de cómo una tabla hash se degrada a una lista vinculada, pero sabe que hay una compensación espacio-temporal, está bien. Si no sabe que una tabla hash es lo que debe usar para un rendimiento de tiempo constante, eso es un problema.

Eché un vistazo a tu pregunta y solo la primera respuesta tengo una respuesta definitiva.
La verdad es que, a menos que la persona esté escribiendo sus propios algoritmos, no pasa suficiente tiempo trabajando en cosas relacionadas con sus preguntas.

La gran mayoría de los estudiantes usan bibliotecas o hacen modificaciones del código existente. Muy pocas personas escriben código central que hace la mayor parte del poder de procesamiento. Y hay una buena razón para ello y se enfatiza en la escuela, que es no reinventar la rueda.

Cuando necesito usar una estructura de árbol, lo primero que pienso es cómo puedo transformar un árbol binario tradicional para que se ajuste a lo que estoy haciendo. No confío en mí mismo para escribir y depurar algo completamente nuevo cuando hay implementaciones de código abierto que puedo extraer de GitHub y simplemente cambiar para satisfacer mis necesidades.

Como se mencionó anteriormente, encuentro estas preguntas molestas. (Tienen más aire de “Búsqueda Trivial” que algo directamente aplicable a un trabajo de programación).

De hecho, me gustaría escuchar tu respuesta a 4, (explica cómo funciona el hashing) porque, para ser honesto (la forma en que está redactado) me hace pensar que quizás no sabes realmente lo que significa la palabra “hashing”.

(Si estamos hablando de cómo funciona un Hash Map específico, entonces esto depende completamente de la implementación, ya que algunos se implementan como un “depósito” con una lista de respaldo que es susceptible a los ataques del cliente DOS al generar datos que se convierten en el mismo depósito

Vulnerabilidad de la aplicación debido a funciones de hash no aleatorias

Las implementaciones “más inteligentes” utilizan algún tipo de árbol equilibrado para almacenar colisiones (en lugar de una lista de tiempo lineal), pero de nuevo eso no depende del hashing

Odio entrevistas como estas porque, sinceramente, es algo que hice hace muchos años. La única razón por la que aprendí esto es 1. para mejorar mis habilidades de entrevista 2. Tuve que comprar un libro que me mostró cosas como estos problemas.

Sí, algunas cosas son básicas y una persona debe saber cómo superarlas. Ej: Encuentra instancias de ‘x’ en una oración dada. Cosas así deberían ser simples.

La sociedad también ha comenzado a enfatizar que todos necesitan aprender a codificar y todos necesitan la informática en su vida. Luego obtienes personas que toman estos largos programas o se enseñan a sí mismos a codificar como .net o desarrollo web y salen y encuentran un gran trabajo donde no tienen que responder preguntas como estas. Mientras tanto, el otro tipo que ha estado programando durante aproximadamente 5 años puede no conocer todos los algoritmos, pero ciertamente sabe cómo manejar una bolsa de papel, no lo entiende porque le hacen este tipo de preguntas. Haga preguntas relacionadas con el trabajo primero y luego salga de la caja. O hágales una pregunta de la vida real y vea cómo abordan eso con un algoritmo o código. Hacer las preguntas anteriores es como decirle a una persona que deletree reglas lógicas y dé una definición, ejemplo, propósito y representación semántica.

En una nota al margen: para ver qué tan bien piensan fuera de la caja, les pregunto:
Si tuviera acceso al vehículo explorador Marte, ¿qué mejoraría con la tecnología actual y la tecnología no desarrollada?
Déles un gran problema para resolver, pero desglose, en lugar de comenzar
haciendo directamente “preguntas difíciles”

El 99.9% de los programadores nunca resuelve ninguna de las preguntas que enumeró. Tales preguntas tenían sentido cuando hace 20 años, las personas escribieron sus propias bibliotecas y la compilación de código tomó más de unas pocas horas y la memoria era una limitación seria. Hoy, cuando hay bibliotecas, IDEs, infraestructura escalable mejorada, no tiene ningún sentido hacer estas preguntas. Siempre que una persona tenga más de 100 IQ y pueda escribir un código para poner elementos en un bucle y extraer datos de ellos según ciertos criterios con conocimiento de conjunto, árbol, lista, conjunto como estructuras de datos, esa persona puede hacer el trabajo. Esa es la razón por la cual algunas de las innovaciones más innovadoras están siendo realizadas por adolescentes que crean sus propias startups y pueden hacer las cosas rápidamente en lugar de preocuparse por estos conceptos teóricos pero prácticamente inútiles.

¿Te estás burlando de mí? Tu pregunta es ingenua y absurda. Primero, está implícito que debe graduarse hace mucho tiempo para mirar hacia atrás a los graduados de hoy. En segundo lugar, una entrevista no es un lugar para preguntas frívolas sobre un tema abstruso de ningún tipo. El mundo de hoy tiene demasiada complejidad para recordar temas que no se usan todos los días para problemas que parecen relevantes para usted, pero no para la persona que entrevista. Su expectativa es que la persona que entreviste esté íntimamente involucrada en el problema que intenta resolver, su conocimiento y su comprensión del problema o que tenga alguna relevancia para el problema del puesto para el que el candidato está entrevistando.

Ahora puedo hacerle preguntas, de poca importancia sobre cualquier cosa, cualquier cosa en la que no trabaje. Hazlo complicado y te doy un campo de diferentes idiomas y bibliotecas que no has usado y te conviertes en un tonto, no porque no lo hayas hecho porque no hablas el código. En segundo lugar, si domina la codificación, no le importa más la teoría, por lo tanto, es bueno codificando y utilizando el compilador, pero le faltan los fundamentos. Estás confundido. ¿Quiere dar una conferencia o habla sobre lo que sus compañeros deben saber el primer día? En segundo lugar, es probable que haya tenido diferentes maestros que hayan usado diferentes libros de texto para trabajar en diferentes problemas

Ahora quiero hablar con la arrogancia de que sacas a una persona de su entorno normal y espero que esa persona te descubra en el acto.

No motiva su mundo problemático: ¿no aclara sus expectativas y ahora quiere juzgar a una persona por una estúpida pregunta aleatoria? Podría hacer una pregunta de crucigramas para ese asunto y fracasaría porque esto no tiene nada que ver con la vida real y le falta en su pregunta cada decencia humana, cada cualidad humana y simpatía.

En realidad, podría ser mentor y tutor si este graduado se uniera a su equipo. Pero supongo que por su pregunta no enseña ni es mentor ni es un compañero agradable. Estás asustado y temeroso y nadie es lo suficientemente bueno, porque no piensan como tú.

Tengo en mi trabajo vivir más para cuidar el código mal escrito o documentado. Ninguna de las grandes teorías que he aprendido tiene nada que ver con los problemas que tengo que resolver. La realidad es que el código rara vez se reutiliza. Es más fácil reescribir el código que hacer que el proyecto anterior haga lo que hará el próximo proyecto. Agregue presión de tiempo, no expectativas comunicadas sobre dónde está el proyecto y hacia dónde desea llevarlo, y este es el mundo real de la mayoría de los trabajos de CS.

Alguien renuncia y tengo más miedo de heredar el código de la persona que se fue, ya que no tengo tiempo en el día para tratar de averiguar dónde se atascó la persona y cómo trataron de terminar este proyecto sin documentación. me deja guiarme.

En pocas palabras, para todas las personas que les gusta juzgar a los demás por sus propias preguntas estúpidas, ustedes son personas miserables a las que no les importa hacer el trabajo. Eres incapaz de colaboración, comunicación y trabajo en equipo hacia un objetivo común. Le gusta dominar, intimidar, ocultar información que nunca compartirá, pero espera que todos sepan lo que usted sabe.

Por favor deja de entrevistar. Hazte un favor y usa una camiseta que no juegue bien con los demás.

Esto es lo que está mal con las personas técnicas en las entrevistas. Olvidan cómo conectarse con la otra persona. Es un duelo y le digo a la entrevista que la mayor parte de la codificación se realiza por seguimiento y error y la guía del compilador y un ejemplo y la clara expectativa articulada del resultado.

Porque no todos los estudiantes de CS tienen estas cosas en su plan de estudios. De hecho, pensar que todo lo que hace es bastante vano. No me enseñaron la notación O grande, no se me mostró ninguna teoría gráfica, pero lo sé a través del autoestudio. Los grados de CS no son iguales en absoluto.

Sin embargo, me enseñaron programación procesal, oo y funcional. Me enseñaron el código de máquina y el código intermedio. Se me mostró en pseudocódigo docenas de algoritmos y cómo convertir los problemas en soluciones. En mi opinión, el conocimiento que obtuve me permite optimizar todo lo que escribo.

Conozco a varios desarrolladores europeos en Microsoft que tampoco saben mucho, pero son las mentes más brillantes que conocerás.

Mi respuesta es que estás haciendo preguntas de un libro de texto de un libro que tal vez no hayan visto. En cambio, denles un problema y vean cómo lo resuelven. Aprendí la gran teoría de gráficos y en dos horas, ahora escribo y mantengo un motor de análisis de código.

Dos razones por las cuales:

En primer lugar, como lo han indicado otros encuestados, lo que no usa regularmente, no necesariamente lo recuerda. Solía ​​recordar detalles sobre los árboles b, hoy en día, probablemente tendría que buscarlos en un libro.

En segundo lugar, obtener algoritmos no triviales correctos (el reequilibrio de árboles es un buen ejemplo) es bastante difícil. Si hay bibliotecas existentes que hacen lo correcto, entonces la mayoría de los programadores reutilizarán las bibliotecas existentes. Claro, si quieres que desarrolle el algoritmo de reequilibrio para un árbol AVL, puedo hacerlo, pero probablemente me tomará algunas horas sentarme y resolverlo desde los primeros principios. Un buen código depurado vale su peso en oro y, como dice el refrán, “el código no se oxida”.

Entonces, la gente se olvida de los problemas fáciles porque están resueltos. ¿Yo y otros programadores trabajamos con algoritmos personalizados? ¡Seguro! ¿Es probable que me pregunten sobre esos algoritmos en las preguntas estándar de la entrevista? Ummm … probablemente no, porque son específicos del campo en el que estoy trabajando.