Ci sono dei buoni libri per le domande sulle interviste di architettura e design del software?

Risposta breve:

Grokking the System Design Interview è una grande risorsa. Ha una buona serie di domande sul design del sistema. Inoltre, anche i seguenti post sono stati molto utili:

  • Come NON progettare Netflix nei tuoi 45 minuti di colloquio di System Design?
  • Anatomia di un colloquio di System Design

Risposta lunga:

Ho fatto 100 colloqui di System Design Interviews (SDI) negli anni passati e proprio come i colloqui di codifica i candidati che non hanno speso tempo per prepararsi agli SDI hanno per lo più risultati scadenti. Questo diventa ancora più significativo quando si sta intervistando nelle migliori aziende come Google, Facebook o Amazon. In queste aziende, se un candidato non si comporta sopra la media, ha una possibilità limitata di ottenere un'offerta. Inoltre, una buona prestazione in questi colloqui si traduce sempre in un'offerta migliore (finanziariamente), poiché la tua prestazione si riflette sulla tua capacità di lavorare con sistemi complessi.

Per le SDI, una cosa che è estremamente importante è conoscere i compromessi tra le diverse decisioni di design che prendi. Per esempio, dovete sapere quale schema di partizionamento dei dati si adatta meglio al vostro sistema o a quale livello potete introdurre una cache per accelerare le cose. Discutere queste opzioni durante il colloquio è l'aspetto più importante che gli intervistatori cercano in un candidato e per prepararsi a questo, è necessario studiare più problemi di progettazione.

Recentemente, quando ho esaminato Grokking the System Design Interview, l'ho trovato una risorsa abbastanza ragionevole per gli SDI. Discute una serie enorme di problemi di progettazione (come Dropbox, Netflix, Yelp, Uber, ecc.) e ha una sezione utile che si concentra sui concetti di base dei sistemi scalabili.

Dato questo, lasciatemi raccomandare alcune altre cose per gli SDI:

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: È sempre una buona idea stimare la scala del sistema che state per progettare.

Step 4: Definire il modello dei dati: Anche se non è richiesto all'inizio, questo chiarirà come i dati fluiranno tra i diversi componenti del sistema e più tardi ti guiderà anche verso il partizionamento dei dati.

Step 5: Progettazione di alto livello: Disegna un diagramma a blocchi con 5-6 caselle che rappresentano i componenti principali del tuo sistema.

Step 6: Progettazione dettagliata dei componenti: Scava più a fondo in 2-3 componenti; il feedback dell'intervistatore dovrebbe sempre guidarti verso quali parti del sistema vuole che tu spieghi ulteriormente.

Step 7: Colli di bottiglia: Cerca di discutere il maggior numero possibile di colli di bottiglia e i diversi approcci per mitigarli.

Spero che questo ti abbia aiutato! Sarò lieto di sentire il tuo feedback.