Pe măsură ce progresăm în carierele noastre de ingineri software, pe lângă interviurile de competențe sau cele comportamentale, foarte curând vei avea de-a face cu interviurile de system design. Aceste interviuri îți vor testa abilitatea de a defini sisteme complexe, atât la nivel macro, cât și la nivel de detalii necesare pentru a face un sistem scalabil, rezilient și eficient. În primii mei ani de carieră nu am avut expunerea necesară pentru a putea să mă dezvolt. Prin urmare, și curba de învățare a fost mai abruptă atunci când, în final, am avut nevoie. În acest articol, vreau să vă prezint câteva dintre strategiile care mi-au fost de ajutor.
Primul pas este învățarea noțiunilor fundamentale. Asigură-te că ai o înțelegere foarte bună a principiilor de bază a unui design de sistem:
Scalabilitatea se referă la capacitatea unui sistem de a gestiona creșterea volumului de muncă prin adăugarea de resurse, fără a compromite performanța sau calitatea serviciului.
Disponibilitatea reprezintă procentul de timp în care un sistem este funcțional și accesibil utilizatorilor.
Fiabilitatea se referă la capacitatea unui sistem de a funcționa corect și de a îndeplini cerințele specificate, în condiții date, pentru o perioadă de timp determinată.
Consistența în contextul sistemelor distribuite se referă la starea în care toate nodurile sistemului afișează aceleași date în același moment.
Toleranța la eroare se referă la capacitatea unui sistem de a continua să funcționeze satisfăcător în cazul în care apar defecțiuni sau erori în unele componente.
Manevrabilitatea (managebility) se referă la ușurința cu care un sistem poate fi administrat și monitorizat. Acest principiu implică proiectarea unui sistem cu instrumente și interfețe care permit operatorilor să detecteze și să remedieze rapid problemele.
Al doilea pas vizează familiarizarea cu modele de design de sistem des întâlnite precum arhitecturile de tip monolit, micro servicii sau serverless. Ia în considerare că, pe lângă aspectele tehnice, alegerea unei arhitecturi trebuie să țină cont și de mărimea aplicației (are un scop finit sau trebuie extinsă pe viitor), rapiditatea cu care trebuie să ajungi pe piață cu un produs sau resursele disponibile (ai o platforma de cloud la dispoziție sau un server on-premise).
În funcție de aria în care profesezi (web, data, machine learning etc.), conceptele cheie pot să difere. Câteva dintre cel mai frecvent întâlnite indiferent de arie sunt:
Baze de date: înțelegeți diferențele dintre bazele de date SQL și NoSQL, cazurile de utilizare ale acestora și cum să alegeți între ele.
Memorarea în cache: Aflați despre diferite strategii de stocare în cache și despre cum acestea pot îmbunătăți performanța sistemului.
Load Balancing: Aflați cum funcționează echilibratoarele de încărcare și de ce sunt importante pentru distribuirea traficului și asigurarea fiabilității.
Rețea: familiarizați-vă cu conceptele de bază de rețea, cum ar fi HTTP, DNS și CDN.
Un mod excelent de a învăța este să studiezi sistemele de design ale unor companii mari, precum Google, Amazon sau Netflix. Încearcă să înțelegi arhitectura lor, deciziile de design și compromisurile pe care le-au făcut. Există multe resurse disponibile online, inclusiv studii de caz, articole de blog și videoclipuri care îți pot oferi o perspectivă valoroasă.
Practica este esențială. Poți utiliza platforme online (LeetCode, ByteByteGo etc.) pentru a face mock interviuri cu alți ingineri sau chiar cu prieteni care sunt dispuși să te ajute. Acest lucru îți va îmbunătăți abilitățile de gândire critică și te va ajuta să devii mai abil în exprimarea ideilor tale. Poți de asemenea să urmărești mock interviuri online sau să citești despre experiența altora în astfel de interviuri.
Dacă ai început să participi la interviuri de design de sistem, cere feedback după interviu. Un intervievator bun își va lua notițe pentru a putea transmite un feedback precis, lucra care te va ajuta pe tine să îți ajustezi abordarea pentru următoarele interviuri.
Încearcă regulat pe cont propriu să gândești arhitectura unor sisteme pe care le folosești în fiecare zi: un sistem de vot, o aplicație pentru parcări ori pentru rezervarea unui bilet la cinema.
Recomandarea mea cea mai mare este să începi această pregătire înainte să ai nevoie de ea. Dacă obiectivul tău în carieră este progresezi într-un rol de arhitect, sau chiar și de manager de inginerie software, inevitabil te vei lovi de sarcini de design. Cu investiții de timp mici, dar constante în direcția asta, mai rămâne de valorificat doar oportunitatea potrivită.
https://www.youtube.com/watch?v=NtMvNh0WFVM&ab_channel=Exponent