Este artículo hace parte de la serie "Entrevistas de Ingeniería Silicon Valley".

Durante cada entrevista, los entrevistadores evalúan una o más de los siguientes habilidades:
Análisis y algoritmia
Capacidad de análisis algorítmico, entendiendo, conceptualizando y desglosando un problema complejo de naturaleza computacional, para definir claramente la secuencia de pasos lógicos y elementos requeridos para su solución, más allá de un lenguaje de programación específico. Usualmente involucran el uso de conceptos matemáticos y estadísticos básicos.
Codificación
Capacidad de traducir un algoritmo a código funcional de computadora. Se consideran elementos como:
Estructuras de datos: Manejo apropiado de estructuras de datos (vectores, colas, conjuntos, pilas, listas enlazadas, listas doblemente enlazadas, grafos, heap, hashes, mapas, árboles -binario, binario de búsqueda, B, RBT-, multi-conjuntos) óptimas para almacenar y procesar la información.
Recorridos y recursividad: Recorridos típicos sobre las estructuras de datos para realizar búsquedas y ordenamientos usando soluciones recursivas y no recursivas.
Modularidad: Uso apropiado de métodos, clases e interfaces que faciliten alta cohesión y bajo acoplamiento usando principios como Single Responsibility (SRP). De igual forma, extracción de funcionalidad en métodos para facilitar su posterior reuso.
Limpieza del código: Nombramiento de variables y métodos apropiado para su posterior lectura.
Análisis de complejidad: Análisis de Big-O y soluciones óptimas bajo diferentes condiciones, teniendo en cuenta el balance entre procesamiento y almacenamiento.
Prácticas de industria: Entendimiento de patrones, e.g. patrones de diseño, y el impacto negativo de ciertos anti-patrones, e.g. uso de herencia en lugar de composición, uso de Singleton.
Testing: Capacidad de identificar tests unitarios que confirman que el código escrito funciona correctamente.
Uno de los mitos existentes en la industria es que el código escrito debe compilar, algo que es totalmente falso dada la complejidad para lograrlo y el poco valor que agrega esta señal al entrevistador.
Lenguaje de programación
Conocimiento puntual del lenguaje de programación usado durante la entrevista, principalmente considerando elementos como:
Sintaxis y API: Claridad en el uso de la sintaxis y el API (los paquetes, clases y métodos más comunes).
Performance: Criterios de eficiencia y concurrencia, e.g. hilos y seguridad en el uso del código bajo condiciones de multi-procesamiento.
Tipo de lenguaje: De igual forma, se suelen cubrir elementos genéricos del tipo de Lenguaje, e.g. bajo nivel (C/C++), orientado a objetos fuertemente tipados (Java/C#) o scripting (Python/Ruby/PHP/Perl). Aunque no se espera que el candidato conozca en detalle múltiples lenguajes, se espera que entienda las principales fortalezas y debilidades con respecto a otras alternativas.
No se suelen incluir preguntas puntuales relacionadas con frameworks, IDEs o herramientas de propósito específico, especialmente si no fueron listadas en la hoja de vida.
Diseño
Este tipo de preguntas usualmente se reservan para posiciones Senior o managers de equipos de Ingeniería. Se refieren a preguntas que involucran elementos de Arquitectura y diseño de sistemas de gran escala, considerando diferentes elementos básicos de áreas como:
Redes de datos
Almacenamiento
Sistemas Operativos
Balanceo de cargas
Computación y procesamiento distribuido
Estrategias de manejo de caché para aplicaciones en tiempo real
Estrategias de pre-procesamiento vs. procesamiento en tiempo real
Interpersonales
Habilidades interpersonales como comunicación, liderazgo, capacidad de aclaración de problemas (y supuestos) ambiguos, apertura a escuchar recomendaciones del entrevistador y en general qué tan bueno se percibe al candidato para trabajar en equipo de forma efectiva. Esto incluye qué tan amigable parece el candidato y cómo encajaría con la cultura laboral de la empresa.