¿Cuáles son las mejores preguntas de la entrevista para evaluar un programador de sistemas?

Se contrató a una generación de ingenieros de monitores de VMware: ” ¿qué sucede cuando escribes ‘ls’? ” Se lo arranqué a Bryan Cantrill, quien me hizo esta pregunta en una entrevista en el campus cuando los dragones deambulaban por la tierra.

Esta no es una prueba de humo. Los buenos ingenieros que saben cómo funcionan las computadoras pueden hablar de esto durante una hora consecutiva y todavía solo arañar la superficie. He tenido personas de hardware que lo reducen a electrones y resortes en su teclado; los sistemas distribuidos hablan de almacenamiento en caché NFS; la gente más típica de sistemas de bajo nivel se mete en la implementación de copia en escritura de fork; La gente de ABI habla de ejecutivos; y la gente del sistema de archivos consigue encontrar los bloques que constituyen el directorio. No poder pensar en un derribo de TLB o una simple interrupción son signos preocupantes.

Realmente no puedes pasar de largo si el entrevistador está calibrado en esta pregunta; siga profundizando hasta que admitan que no saben cómo funciona una capa y pídales que razonen sobre cómo debería funcionar de todos modos.

Una pregunta que he encontrado que es bastante efectiva para comenzar es simplemente pedirle al candidato que escriba una función que cuente el número de nodos en un árbol binario (usando C.)

Los buenos candidatos pueden encontrar la respuesta perfecta en menos de 2 minutos. La mayoría de los malos candidatos hacen cosas tontas como no manejar el árbol vacío o hacer que la función sea más complicada de lo que debería ser con muchos controles adicionales.

Me gusta la pregunta porque toma muy poco tiempo hacerla (dejando mucho tiempo en la entrevista para otras preguntas) pero aún así proporciona una señal bastante fuerte.

Recibí esta pregunta de la entrevista de Arthur Rudolph.

La programación de sistemas es un término genérico para una clase de desarrollador que puede pensar en un software completo que también incluye el hardware en el que se ejecuta.

Considere el siguiente problema: comprende la aplicación que está creando y hay opciones de qué tipo de hardware desea usar. Por ejemplo, puede usar un procesador más rápido, pero eso aumenta los costos o puede usar un proceso más lento y ASIC personalizados para mejorar el rendimiento general. Comprender el comportamiento de sus aplicaciones, comprender cómo mejorarán sus ASIC con el tiempo y comprender cómo estructurar su software para que pueda explotar los ASIC y el proceso de menor potencia y ofrecer un mejor rendimiento es la esencia de la gran programación de sistemas.

Hay otras habilidades asociadas a la programación de sistemas, como la capacidad de depurar la concurrencia, poder diseñar abstracciones, etc., pero creo que las aplicaciones modernas requieren y exigen habilidades similares. Por lo tanto, no estoy seguro de volver a hacer de esas habilidades solo el dominio de la programación de sistemas.

O al menos así es como lo pienso.

Entonces, ¿cómo evalúa a alguien?

Lo primero es ver lo que han hecho en el pasado.

Pero, ¿qué cosas hay que buscar?

Un buen programador de sistemas articulará opciones en términos de su comprensión de las limitaciones de hardware subyacentes. Por ejemplo, un buen programador de sistemas puede hablar sobre cómo la arquitectura de la CPU y la arquitectura de la memoria lo llevaron a elegir algunos enfoques sobre otros. Además, un buen programador de sistemas comprende cómo está evolucionando el hardware y recomendará opciones de software que se ajusten a cómo se mueve el hardware.

Un programador de sistemas deficiente es prácticamente indistinguible de un programador de aplicaciones. Hablará sobre enfoques que están divorciados de la realidad física. Las innovaciones de hardware serán felizmente ignoradas. Las elecciones de diseño se realizarán en función de la elegancia matemática en lugar de las realidades físicas subyacentes …

Entonces, ¿cómo hacer para encontrar un buen programador de sistemas en una entrevista?

– Pídales que describan cosas que hicieron en el pasado y vean si alguna vez señalan limitaciones de hardware en sus diseños.

– Pregúnteles cómo las diferentes opciones de hardware alterarían sus diseños.

Un buen programador de sistemas podrá responder las preguntas de forma rápida y exhaustiva. Un pobre luchará tratando de conectar los puntos entre los cambios en el hardware y sus elecciones de diseño.