Respuesta corta:
Grokking the System Design Interview es un gran recurso. Tiene un buen conjunto de preguntas de diseño de sistemas. Además, los siguientes posts fueron muy útiles también:
- ¿Cómo NO diseñar Netflix en tu entrevista de diseño de sistemas de 45 minutos?
- Anatomía de una entrevista de diseño de sistemas
Respuesta larga:
He entrevistado a 100s de entrevistas de diseño de sistemas (SDIs) en los últimos años y al igual que las entrevistas de codificación, los candidatos que no han dedicado tiempo a la preparación de las SDIs en su mayoría tienen un mal desempeño. Esto es aún más importante cuando se entrevista a las principales empresas como Google, Facebook o Amazon. En estas empresas, si un candidato no rinde por encima de la media, tiene pocas posibilidades de conseguir una oferta. Además, un buen rendimiento en este tipo de entrevistas siempre se traduce en una mejor oferta (económicamente), ya que tu rendimiento se refleja en tu capacidad para trabajar con sistemas complejos.
Para las IDE, algo que es extremadamente importante es conocer las compensaciones entre las diferentes decisiones de diseño que se toman. Por ejemplo, hay que saber, qué esquema de partición de datos se ajusta mejor a su sistema o en qué capa se puede introducir una caché para acelerar las cosas. Discutir estas opciones durante la entrevista es el aspecto más importante que los entrevistadores buscan en un candidato y para prepararse para esto, debes estudiar múltiples problemas de diseño.
Recientemente, cuando revisé Grokking the System Design Interview, me pareció un recurso bastante razonable para las IDE. Discute un enorme conjunto de problemas de diseño (como Dropbox, Netflix, Yelp, Uber, etc.) y tiene una sección útil que se centra en los conceptos básicos de los sistemas escalables.
Dado esto, permítanme recomendar algunas otras cosas para SDIs:
a. Familiarize yourself with distributed systems concepts like Caching, Data Partitioning, Consistent Hashing, Load Balancing, Redundancy and Replication, CAP Theorem, etc.
b. Practice a few system design problems:
- Designing a URL Shortening service like TinyURL
- Designing Instagram
- Designing Twitter
- Designing Dropbox
- Designing Youtube
- Designing Typeahead Suggestion
- Designing Facebook’s Newsfeed
- Designing Yelp
- Designing Uber
c. Follow a step by step approach to attack a system design problem in an interview:
Step 1: Requirements clarifications: Always ask questions to find the exact scope of the problem you are solving.
Step 2: System interface definition: Define what APIs are expected from the system. This’ll also ensure if you haven’t gotten any requirement wrong.
Step 3: Back-of-the-envelope estimation: Siempre es una buena idea estimar la escala del sistema que vas a diseñar.
Paso 4: Definir el modelo de datos: Aunque no es necesario al principio, esto aclarará cómo fluirán los datos entre los diferentes componentes del sistema y más tarde también le guiará hacia la partición de datos.
Paso 5: Diseño de alto nivel: Dibuje un diagrama de bloques con 5-6 cuadros que representen los componentes principales de su sistema.
Paso 6: Diseño detallado de los componentes: Profundice en 2 ó 3 componentes; los comentarios del entrevistador siempre deben guiarle hacia las partes del sistema que quiere que explique más.
Paso 7: Cuellos de botella: Intenta discutir tantos cuellos de botella como sea posible, y diferentes enfoques para mitigarlos.
¡Espero que esto haya ayudado! Estaré encantado de escuchar tus comentarios.