¿Cuántos ingenieros de software de Google pueden escribir un árbol de búsqueda binaria equilibrado en Google Docs en la pantalla del teléfono?

No muchos ingenieros de software en Google podrían implementar un árbol de búsqueda binario equilibrado desde cero en un documento de Google en una pantalla de teléfono de 45 minutos.

Aquí está mi mejor conjetura sobre cuántos ingenieros de Google podrían administrar una solución. Esto es especulación total. (¡Los compañeros de Google se sienten libres de intervenir!)

  • Ingenieros de bibliotecas centrales: 70%
  • Graduado universitario reciente – 10%
  • Ingeniero típico – 7%
  • Ingeniero con más de 20 años de experiencia: 5% (Hemos olvidado más de lo que los otros ingenieros saben. Al menos esa es mi excusa).

EDITAR: Brian Bi sugirió en su respuesta que probablemente he sobreestimado las cifras en un orden de magnitud. Dada su experiencia en programación competitiva y su reciente estado de graduación, confiaría en su estimación sobre la mía.

¿Por qué es un problema difícil para la pantalla de un teléfono?

Considere la implementación del MIT de un árbol rojo-negro. Con comentarios, el archivo fuente principal tiene más de 600 líneas, y eso no incluye encabezados o código de soporte. Hay una implementación de árbol AVL más pequeña en GitHub en aproximadamente 250 líneas con comentarios mínimos. Es cierto que hay una implementación de 70 líneas de un árbol rojo-negro en Haskell. Sin embargo, este código es bastante denso.

Entonces, ¿cuántos desarrolladores pueden producir una línea de código C funcional cada diez segundos? ¿Por 45 minutos seguidos? ¿Bajo presión de entrevista? ¿Y sin la ayuda de un compilador o incluso el resaltado de sintaxis? Agregue a eso la complejidad del algoritmo e incluso los desarrolladores fuertes pueden encontrar bastante difícil completar la pregunta dentro del tiempo asignado.

Además de eso, muchos desarrolladores no han tenido que implementar un árbol de búsqueda binaria equilibrado desde la universidad. Y algunos pueden haber leído solo sobre los algoritmos. Por ejemplo, encontré árboles de separación en un curso de posgrado de CS, pero nunca me pidieron que implementara uno. Cubrí los árboles rojo-negros con más detalle en uno de los cursos de pregrado, pero eso fue hace bastante tiempo que olvidé si realmente implementamos uno.

Además de ser demasiado difícil, hay varias razones por las cuales esto no sería una buena pregunta para la entrevista.

  • La pregunta requiere conocimiento de dominio específico. Los candidatos que no hayan visto los detalles de implementación antes están en grave desventaja con respecto a los candidatos que sí lo han hecho. La pregunta filtraría inadvertidamente a algunos ingenieros fuertes solo porque no habían estado expuestos a la implementación de una estructura de datos en particular.
  • No prueba la creatividad de un candidato. Los candidatos que logran resolver el problema probablemente replicarán alguna forma de solución encontrada previamente. Por ejemplo, implementarían un árbol AVL en lugar de un enfoque nuevo y novedoso del problema. Los buenos problemas de entrevista son aquellos que los candidatos no han visto antes, ya que les permite demostrar habilidades para resolver problemas.
  • La habilidad que se prueba no es lo suficientemente general. Dada la gran cantidad de implementaciones existentes, muy pocos ingenieros tienen que implementar un árbol binario equilibrado. Hay algunas personas en Google que trabajan en algoritmos centrales como este, pero la mayoría de los desarrolladores simplemente usan lo que producen. Por otro lado, poder usar un árbol binario equilibrado y razonar sobre su tiempo de ejecución son habilidades generales que pueden probarse. Y aunque podría esperar que un candidato pueda nombrar y describir aproximadamente al menos una implementación de un árbol binario equilibrado, probablemente aún evitaría esa pregunta porque podría dar lugar a un falso negativo.
  • Alentaría las trampas. ¿Cuántos candidatos buscarían una implementación y la usarían como referencia para su propia implementación? ¿O copiarlo directamente? Esa es otra razón por la cual no es una buena idea hacer preguntas sobre cosas que están bien cubiertas en Internet, en particular para la pantalla de un teléfono.

Por lo tanto, no muchos ingenieros de Google harían bien en tal problema. Sin embargo, no importa ya que a) este tipo de preguntas generalmente no se hacen yb) ¡ya tienen trabajos en Google!

Si no soy la persona que necesitas, te lo diré y recomendaré a alguien. Aquí, diría que puedo hacerlo después de presionar una referencia o dos, pero los patrones de búsqueda no son lo mío. En la memoria caché n-way? Oh si, todo el día. Sin embargo, no lo codificaré para ti. Le agradecería su tiempo y luego colgar o salir. Soy un profesional.

Tengo mucha experiencia y amo absolutamente mi trabajo. No escribiré código en una entrevista de trabajo por más tiempo. Ninguna. Háblame de mi experiencia. Ve a ver mis patentes. Háblame sobre el ajuste dentro de la empresa. Revisa mis referencias. Ve a través de mi github. Hable con los capitalistas de riesgo que me han arrojado dinero. Sin embargo, pedirle a un desarrollador experimentado que codifique como parte de la entrevista es simplemente insultante. Alguien recién salido de la escuela? Seguro. Alguien haciendo la transición a un nuevo idioma? Quizás. Sin embargo, soy un profesional y puedes tratarme así o contratar el tipo de personas que lo tolerarán. Intenta pedirle a un arquitecto que te dibuje una casa antes de contratarlo y ver qué tan lejos llegas. Me alejé de varias compañías interesantes cuando comienzan con estas cosas. Amazon ha tratado de reclutarme todos los meses durante casi 5 años. Y cada vez que los rechazo porque no voy a saltar por sus aros. Obtenga un gerente de contratación que sepa cómo contratar personas. Lo que preguntas es insultante. No puedo decir eso más fuerte. 100% insultante.

Comencemos con las estructuras de datos populares que implementan un árbol de búsqueda binario equilibrado:

  • 2-3 árboles
  • Árbol AA
  • Árbol AVL
  • Árbol rojo-negro
  • Árbol chivo expiatorio
  • Árbol de separación
  • Treap

Hay alrededor de 20,000 ingenieros de software en Google con todo tipo de antecedentes diferentes, especializaciones en ingeniería, diferentes universidades con programas de estudio variados y niveles de interés en aprender sobre las estructuras de datos anteriores.

De estos 20,000 ingenieros de software, casi todos deben haber leído sobre los árboles de búsqueda binarios balanceados más comunes: AVL y árboles negros rojos. Podemos dejar los otros.

Pero solo alrededor del 70-80% de ellos los habrían implementado realmente en sus tareas o tal vez ellos mismos si tuvieran una formación / especialidad diferente y se prepararan para entrevistas ~ 15000

De ellos, alrededor del 30-40% se habrían olvidado de la implementación hasta que llegaran las entrevistas. Entonces nos quedamos con ~ 10000 que habrían practicado su implementación varias veces y los recordarían el día de la pantalla del teléfono.

Fuera de eso, alrededor del 50% lo habría acertado en Google Docs el día de la entrevista porque pudieron recordar la memoria correcta en el momento correcto ~ 5000.

Entonces, (5000 / 20,000) x 100 = 25% + – 1

Muy pocos. Aquí está la cosa: no es necesario que un ingeniero de software recuerde los detalles exactos de implementación de un BST equilibrado. Ese es el punto de abstracción. Si un ingeniero necesitara conocer los detalles exactos de todo lo que trabajaron hasta el final, no haría nada. Lo que necesitamos saber son las compensaciones, los beneficios de rendimiento, las propiedades, etc. Sin embargo, si un ingeniero fuerte lee la descripción de la implementación de un BST equilibrado, él o ella podría implementarlo desde cero.

Supongo que muy pocos ingenieros en Google podrían lograr esto en una entrevista telefónica. Además, nunca escuché que un entrevistador le pidiera a un candidato que hiciera esto. E incluso si lo hicieran, no se exigiría la perfección. Y si fuera así, el comité de contratación probablemente desestimaría los comentarios del entrevistador y probablemente hablaría con el entrevistador sobre las preguntas apropiadas.

Tenga en cuenta que simplemente usar un árbol de búsqueda binario balanceado no requiere implementar uno. Una de las cosas buenas de no codificar con un compilador real es que simplemente puede “fingir” ciertas cosas, como que su lenguaje de programación admite árboles de búsqueda binarios equilibrados.

No recuerdo cómo implementar uno. Sé usar uno. Pensando en cómo haría esto ahora, probablemente podría llegar a una implementación correcta de algo parecido a un árbol rojo negro. Fui contratado en Microsoft hace 16 años después de varias preguntas de la entrevista, incluida la implementación de un árbol de búsqueda binario equilibrado (mi primer gerente me hizo esa pregunta). La mejor pregunta es: ¿le harías esta pregunta a un candidato? Yo no lo haría ¿Qué aprende de un candidato al hacer esa pregunta?

Hola-

Soy ingeniero de software en Google y recién graduado de la universidad y gané medallas en IOI y ACM-ICPC.

No pude escribir un BBST que funcione perfectamente en 45 minutos sin consultar una referencia. La respuesta cambia si relaja algunas de las limitaciones.

Eso debería decirle algo sobre qué porcentaje de ingenieros de software en Google tendrían éxito en la pregunta con todas sus limitaciones. Creo que la estimación de Paul K. Young del 10% es inferior en un orden de magnitud.

No muchos, pero debes admitir que hay personas que pueden hacerlo. Por lo general, no tenemos estos problemas en la entrevista, ya que no son habilidades esenciales para los programadores de la empresa. Pero para aquellos que han participado en concursos en China, es una habilidad requerida, y se supone que también tiene la capacidad de usar esta estructura de datos en otros algoritmos (como usarla para optimizar la programación dinámica).

El único BST que podría escribir sin buscar una referencia es el árbol AVL. Sin embargo, dudo que pueda obtener una versión libre de errores en 45 minutos y en la pantalla de un teléfono. Olvídalo.

Un ingeniero de software típico probablemente no haya tenido que escribir ningún tipo de programa de árbol durante mucho tiempo (simplemente usaría un árbol existente de la biblioteca). Así que mi suposición es bastante cercana a cero.

¿Tal vez hay un malentendido entre usted y su amigo o su amigo y el entrevistador? Si realiza un pequeño cambio en la pregunta, se vuelve mucho más factible.

“Generar un árbol de búsqueda binario equilibrado a partir de una lista (ordenada)” es una pregunta mucho más fácil.

Existe una estructura de datos llamada treap, que es tan fácil de implementar como un BST no equilibrado y ofrece el tiempo O (log (n)) esperado para todas las operaciones elementales. Puedes leer sobre esto en wikipedia.