Planen
Es ist sehr wichtig, es zu haben. Selbst wenn Sie irgendwo einen Fehler machen und in Ihrer Argumentation den falschen Weg einschlagen, spielt Ihnen der insgesamt strukturierte Ansatz in die Hände. Ganz am Anfang können Sie mäßig stumpf sein und den Befragten nach den Details fragen, aber ab einem bestimmten Punkt (der in meinem Plan unten Punkt 3 entspricht) sollten Sie die Initiative vollständig haben und es ist am besten, sie nicht bis zum Ende loszulassen. Mein Plan war ungefähr so:
- Sammeln Sie eine Liste der wichtigsten Funktionen und schreiben Sie sie in die Ecke der Tafel. Dieser einfache Trick hilft Ihnen, sich an eine wichtige Einschränkung oder Annahme zu erinnern.
- Verstehen Sie, welche technischen Eigenschaften das System haben sollte: erwarteter RPS, Bereich akzeptabler Reaktionszeiten, Erwartungen hinsichtlich Konsistenz und Zuverlässigkeit.
- Erstellen Sie die einfachste Ein-Maschinen-Lösung, die irgendwie funktioniert. Es ist nicht erforderlich, mit 20 Rechenzentren auf der ganzen Welt zu beginnen. Es ist viel besser, schrittweise darauf zurückzukommen.
- Finden Sie einen einzelnen Fehlerpunkt oder Leistungsengpass.
- Bieten Sie eine oder mehrere Optionen zur Lösung des Problems an und erläutern Sie die Vor- und Nachteile der einzelnen Optionen
- Wählen Sie eine der Optionen und fahren Sie mit Schritt 4 fort, wenn noch Zeit ist. Wenn dies endet, fahren Sie mit dem nächsten Element fort
- Schätzen Sie die Größe des Speichers, die Anzahl der Server und die Netzwerkbandbreite und notieren Sie alles sorgfältig
- Bonus: Sprechen Sie über zusätzliche Funktionen, ML-Implementierung, Produktmetriken und Experimente
Zeitsteuerung ist sehr wichtig. Ich habe versucht, 5-10 Minuten für die ersten beiden Punkte und 5 Minuten für die letzten beiden zu verwenden.
Kompromisse
Sie müssen gesprochen werden, auch wenn sie offensichtlich erscheinen. Nach der Einführung eines neuen Teils ist es wichtig zu sagen: "Wir haben ein neues Element hinzugefügt, dies wird das eine oder andere Problem lösen, aber wir werden dafür bezahlen." Kompromisse können ungefähr so sein:
- Alle neuen Systemkomponenten oder eine Erhöhung der Anzahl vorhandener Ersatzteile lösen das Problem der Lade- / Reaktionsgeschwindigkeit, verursachen jedoch zusätzliche Probleme bei der Unterstützung und Bereitstellung.
- Das Sharding löst die Last- und Platzbeschränkungen, fügt jedoch in Zukunft Probleme beim erneuten Sharding hinzu.
- Replizierter Speicher löst das Problem der Last und Zuverlässigkeit. Bei Lese- und Schreibreplikaten werden Sie jedoch über schlechte Werte und den Gegensatz von Verfügbarkeit und Konsistenz nachdenken
- Der Cache löst das Ladeproblem, lässt Sie jedoch über ranzige Werte und Cache-Kohärenz nachdenken.
- Ihre eigene Lösung kann leicht modifiziert und für Ihre Bedürfnisse optimiert werden, aber Sie müssen sie zuerst schreiben.
- Das Gute an der vorhandenen Lösung ist, dass sie bereits vorhanden ist, aber Sie müssen es herausfinden.
Zahlen
Jeder kennt die Latenzzahlen, die jeder Programmierer kennen sollte , aber die Zahlen auf dem Link sind meiner Meinung nach nicht so bequem strukturiert, und ich habe sie im Vorbereitungsprozess neu formatiert, um das Speichern zu vereinfachen.
Letztendlich ist Folgendes wichtig:
- Kennen Sie die Zeit, die Sie mit dem Lesen von Daten aus verschiedenen Ebenen von Prozessor-Caches, Speicher, SSD, HDD und Netzwerk verbracht haben.
- Denken Sie an die Zeit der Hin- und Rückfahrten innerhalb des Rechenzentrums und rund um den Globus sowie an die minimale Latenz, die eine Person als Verzögerung wahrnimmt (~ 100 ms).
- Um Bytes schnell in Gigabyte, Nanosekunden in Sekunden usw. umwandeln zu können, habe ich diese Fähigkeit im Laufe der Praxis selbst entwickelt.
Trainieren
Ich kaufte ein Whiteboard, nahm vorhandene Dienste in Anspruch und versuchte herauszufinden, wie ich sie von Grund auf neu erstellen würde. Ich zeichnete Diagramme an die Tafel, fand die Last und die erforderlichen Ressourcen heraus und suchte nach Schwachstellen in meinem Design. Ich habe auch gute Freunde, mit denen wir Pseudoabschnitte arrangiert und aufeinander trainiert haben - es war eine super lohnende Erfahrung. Nach dem Training können Sie online nachsehen, wie es tatsächlich gemacht wird, und es dann erneut versuchen. Nach 10 bis 20 Runden mit verschiedenen Diensten setzt die Erleuchtung ein und einzelne wiederkehrende Teile in vorhandenen Systemen werden deutlich sichtbar. Ersatzteile können zum Beispiel sein:
- Suche (vorzugsweise mit der Möglichkeit, den Index in Echtzeit zu aktualisieren)
- (gfs, haystack)
- kv- (cassandra, dynamo)
- Message queue pub-sub (kafka)
- (twitter, instagram, facebook)
- , , - (whatsapp, telegram, battle.net)
- , - (skype, twitch, youtube)
- Grokking the system design interview. , , .
- System design primer. , .
- ( ). . , , .
- Eine große Auswahl an High Scalability
- Die wichtigste Ressource sind Ihre Freunde und Bekannten, die wissen, wie ihre Systeme funktionieren und Ihnen davon erzählen können.
Mehrere gute Videos und Kanäle
1. Skalierbarkeit
2. Einführung in Architektur und Systemdesign Interviews
3. Vier Architekturmuster für verteilte Systeme
4. Dropbox im Jahr 2012
5. Slack
6. Twitter
7. Reddit
8. Instagram
9. Youtube im Jahr 2007
10. Kanal über Systemdesign von einem Landsmann
11 ein anderer Kanal
12. Und ein anderer Kanal
Wenn Sie keinen schwierigen Zeitrahmen haben, sich aber bereits die Aussicht auf ein Interview abzeichnet, ist es die richtigste Taktik, ständig etwas im Hintergrund zum Thema große Systeme zu lesen / zu betrachten. Das Gleiche gilt für algorithmische Rätsel: Es ist besser, sie regelmäßig zu lösen und immer in guter Form zu sein, als am Wochenende vor dem Interview zu versuchen, den gesamten Litcode zu beherrschen. Die intensive Vorbereitung auf den Architekturbereich in kurzer Zeit machte mich jedoch zu einem viel besseren Spezialisten.