Knacken Sie das System Design-Interview: Tipps eines Twitter-Softwareentwicklers

Ich habe kürzlich darüber geschrieben, wie ich Angebote von mehreren erstklassigen Technologieunternehmen erhalten habe. Während meines Interviewvorbereitungsprozesses habe ich viel Material nachgelesen und eine Reihe von Hinweisen zur Lösung von Systemdesignproblemen vorbereitet. In diesem Artikel möchte ich diese Tipps mit Ihnen allen teilen.

Wenn Sie ein frisch gebackener Absolvent ohne Erfahrung mit verteilten Großsystemen oder sogar ein erfahrener Ingenieur mit langjähriger Erfahrung sind, ist dieser Artikel für Sie hilfreich.

Update (24.03.2019) : Wenn Sie sich einer Gruppe von Studenten anschließen möchten , um mehr über das Systemdesign zu erfahren, organisiere ich gemeinsam eine kleine Klasse! Sie können zu diesem Link gehen, um mehr zu erfahren, oder meine Website besuchen: zhiachong.com für weitere Informationen.

Dieser Artikel ist in die folgenden vier Abschnitte unterteilt:

  • Stellen Sie Fragen zur Klärung
  • Verwenden Sie Ihren Hintergrund
  • Ein Problem systematisch angehen
  • Behalte deine eigenen Notizen

Stellen Sie Fragen zur Klärung

Ein zentrales Ziel eines Systemdesign-Interviews ist es , dem Kandidaten die Möglichkeit zu geben, sein Wissen zu demonstrieren.

Es gibt keine streng richtigen oder falschen Antworten. Eine gute Frage zum Systemdesign klingt normalerweise sehr zweideutig, und der Grund dafür ist, dass Sie die Möglichkeit haben sollen, Folgendes zu demonstrieren:

  • Wie würden Sie über den Problembereich denken?
  • Wie Sie über Engpässe denken
  • Was Sie tun können, um diese Engpässe zu beseitigen.

Stellen Sie sich vor, Sie werden aufgefordert, eine Black Box zu entwerfen. Wie würden Sie das Problem angehen? Es gibt keine klaren Anweisungen, was Sie hier bauen müssen, abgesehen davon, dass die Box einige Gegenstände darin aufnehmen kann.

Eine der nützlichsten Strategien, die ich persönlich verwende, besteht darin, Fragen zur Klärung zu stellen. Was sind „gute“ Klärungsfragen?

Eine gute Klärungsfrage hilft Ihnen dabei, eines oder mehrere der folgenden Dinge zu erreichen:

  1. Hilft Ihnen, den Umfang Ihrer Aufgaben einzugrenzen
  2. Hilft zu klären, was die Benutzererwartung des Systems ist
  3. Gibt Ihnen Anweisungen, wie Sie fortfahren sollen
  4. Informiert Sie über mögliche Engpässe / Problembereiche

Im Black-Box-Beispiel könnten Sie fragen: „Nun, was hält die Box? Wie viele Gegenstände enthält es? Und wer ist der beabsichtigte Benutzer? "

Dazu könnte ich sagen, bauen wir eine gelbe Box mit einem Smiley darauf, die höchstens 1 Tennisball aufnehmen sollte. Dies ist jedoch kein gewöhnlicher Tennisball. Es hat einen Radius von mindestens 0,5 m und wiegt etwa 1 kg. Es soll umarmt und nicht gehalten werden, also möchte ich es nicht in den Griff bekommen.

Los geht's, das ist die Box.

Stellen Sie immer Fragen zur Klärung. Sie werden nicht danach beurteilt, ob Sie während des Interviews eine bestimmte Frage gestellt haben oder nicht, sondern danach, wie Sie über den Problembereich denken.

Wenn ich Sie zum Beispiel jetzt bitten würde, Twitter zu entwerfen, wie würden Sie das tun? Nehmen Sie sich ein paar Minuten Zeit, um darüber nachzudenken, und skizzieren Sie es vielleicht sogar auf einem Blatt Papier. Gehen Sie so tief und weit wie möglich und kehren Sie dann zu diesem Artikel zurück. Besser noch, Sie können Ihre Notizen in den Kommentaren unten hinterlassen und wir können weiter diskutieren.

Wenn Sie es noch nicht erkannt haben, würde das Endergebnis der obigen Übung zu signifikant unterschiedlichen Ergebnissen führen. Für meinen eigenen Hintergrund könnte ich mich eingehend mit API-Design und Backend-Infrastruktur befassen. Aufgrund meiner Erfahrung würde ich wahrscheinlich auch iPhone-spezifische Probleme untersuchen. Ich werde darüber sprechen, wie der Client mit den Endpunkten der mittleren Ebene interagiert, wie die Protokollierung funktionieren würde, wie ich das Backend entwerfen würde, um die Verfügbarkeit sicherzustellen, und so weiter.

Dies sind sehr interessante Diskussionen, die Sie mit einem Kollegen führen können, und das ist ein sehr starkes Signal, nach dem ein Interviewer sucht.

Nutzen Sie Ihren Hintergrund zu Ihrem Vorteil

Oft sehe ich Ingenieure, die versuchen, herauszufinden, was der Interviewer zu fragen versucht, und dann ihre Antworten auf die Erwartungen abstimmen.

Ich rate aus mehreren Gründen davon ab, dies zu tun:

  1. Jeder hat einen einzigartigen Hintergrund. In einem Systemdesign-Interview können Sie Ihre Stärken demonstrieren. Verschwenden Sie nicht die Gelegenheit, herauszufinden, was jemand anderes von Ihnen erwarten könnte.
  2. Der Interviewer hat vielleicht zu Ihren Antworten genickt, aber er hat vielleicht gewusst, dass Sie sich nur durchbluffen und nicht wirklich über das Problem nachdenken.

Ihre Erfahrung und Ihr Hintergrund können vom nächsten Kandidaten stark abweichen. Sie bringen eine Reihe von Werten und Fachkenntnissen mit, die sonst niemand kann. Das macht dich wertvoll und unersetzlich. Unabhängig davon, auf welchem ​​Gebiet Sie tätig sind, kümmern sich die Leute darum, was Sie an den Tisch bringen können.

Bewältigen Sie das Problem systematisch

In Anbetracht meines Fachwissens gibt es einige Dinge, über die ich nachdenke, wenn ich ein neues System in Angriff nehme. Ich empfehle Ihnen dringend, auch für sich selbst eine Reihe von Kriterien oder Schritten zu formulieren.

Einige Dinge, die mir bei der Arbeit an einem neuen System in den Sinn kommen, sind:

  • Was ist das Ziel des Systems?
  • Wer sind die Benutzer des Systems?
  • Mit welcher Skala arbeiten wir?
  • Ist das ein neues / altes System? Wie gehen wir mit der Versionierung um?

Unter anderen…

Meine Kriterien unterscheiden sich von den Kriterien eines Front-End-Ingenieurs. Ich benutze diese Kriterien, um ein Bild in meinem Kopf zu formulieren, und diese werden meinen Entscheidungsprozess leiten.

Mit Antworten auf diese Fragen kann ich beginnen, das vorliegende Problem anzugehen und es dann systematisch in einzelne Komponenten aufzuteilen.

Eine gute Übung, die ich gerne mache, ist das Entwerfen eines Kaffee-Bestellsystems . Ich dachte daran, als ich eines Tages bei Starbucks saß, und erkannte, dass es schön wäre, wenn ich einen Smoothie auf meinem Handy bestellen und bei meinem örtlichen Starbucks abholen könnte.

Meine Gedanken gingen in verschiedene Richtungen:

  • Was macht diese Kaffeebestellmaschine?
  • Wenn ich eine baue, kann ich sie an Starbucks verkaufen oder sie mit einem White-Label versehen und als Dienstleistung verkaufen?
  • Wie viele Benutzer muss ich unterstützen, wenn ich es an Starbucks verkaufe?
  • Kann ich alternativ, wenn ich es mit einem White-Label versehen habe, die Schnittstelle zu meinem Kaffee-Bestellservice verkaufen und den Kunden dann helfen, ein Backend aufzubauen, damit sie die Bestellungen auf ihren lokalen Computern speichern können?

Sobald ich Antworten auf diese Fragen erhalten habe, kann ich mir endlich ein vollständiges Bild davon machen, was mein Kaffee-Bestellservice tut. So würde meine Version des Kaffee-Bestellservices aussehen:

Mein Kaffee-Bestellservice ist eine Software as a Service (SAAS). Es bietet eine Schnittstelle, an die sich verschiedene Partner anschließen können.

  • Es verfügt über eine API namens addCoffeeForMerchant , die den Namen des Kaffees, den Kaffeepreis und die Kaffeezutaten einfügt.
  • Es verfügt über eine GET-API namens getCoffeesForMerchant , die eine Liste von Kaffees für eine bestimmte Händler-ID zurückgibt.
  • Die Händler-ID ist eine eindeutige Kennung (UUID), die mithilfe eines Hashing-Mechanismus generiert wird, der mit dem Kunden weiter geklärt werden kann.
  • Die Software ist für schreibgeschützte Vorgänge optimiert, da die meisten meiner Kunden ihr Menü einmal erstellen und es den ganzen Tag über mehrmals lesen.
  • Es verfügt über einen Caching-Mechanismus, der die LRU-Räumungsstrategie (Least-Recent-Used) verwendet. Wenn der Menüpunkt eine Weile nicht bestellt wurde, ist es meinem Kunden egal, ob er etwas langsamer im Menü angezeigt wird.
  • Falls einer der Datenspeicher selbst ausbricht, repliziert mein Kaffee-Bestellservice Daten in verschiedenen Clustern an der West- und Ostküste der USA, da ich mich erst jetzt auf den US-Markt konzentriere.

Alternativ ist auch jeder andere Kaffee-Bestellservice, an den Sie denken können, sehr wahrscheinlich. Es ist nur eine Frage dessen, wofür Sie optimieren. Ich denke, das sind sehr interessante Probleme, und es ist eine großartige mentale Übung, um Ihren Geist zu beschäftigen.

Behalte deine eigenen Notizen

Als Softwareentwickler ist es ein nie endender Lernprozess. Ich empfehle dringend, entweder Evernote oder einen Moleskin zu verwenden, um Notizen zu machen. Ich persönlich trage ein kleines Notizbuch für schnelle Ideen, die ich notieren muss, und ich behalte verschiedene andere Dinge auf Evernote, wann immer ich kann.

Ich habe ein Notizbuch mit dem Namen "Programmierung" in meinem Evernote. Immer wenn ich auf etwas Neues oder Interessantes stoße, schreibe ich es zur weiteren Bezugnahme in mein Notizbuch.

Ich gehe diese neuen Notizen monatlich oder vierteljährlich durch und ordne sie zu, um sicherzustellen, dass die Notizen organisiert sind. Zum Beispiel habe ich ein "Design" -Label für alles, was mit Systemdesign zu tun hat. Es könnte so etwas wie ein Link zu einem YouTube-Video sein, das ich interessant fand, oder ein interessantes Argument, über das mein Kollege nicht nachgedacht hatte.

Dies ist ein Beispiel dafür, wie eine meiner Notizen aussieht:

Eines der Dinge, die ich kürzlich von einem Kollegen gelernt habe, ist, dass NoSQL sich hervorragend für das Prototyping eignet, da keine Schemadiskussionen mit anderen Teams erforderlich sind. Wenn ich das Schema ändern wollte, kann ich das mit einer NoSQL-Datenbank sehr schnell tun. Das war eine wichtige Erkenntnis aus der Arbeit, die ich in mein Notizbuch „Programmieren“ eingefügt habe.

Ich zerlege meine Notizen in:

  1. Systemdesigns
  2. Befragung (Erfahrung + Überprüfung verschiedener Interviews, die ich in der Vergangenheit hatte, gruppiert nach Firmennamen)
  3. Zufällige Leckerbissen, CS gut zu wissen, wie nützliche Bash-Skripte oder Befehlszeilentricks
  4. Lesungen / YouTube-Videos

Alle obigen Hinweise finden Sie unter „Programmierung“. Im Laufe der Zeit stelle ich fest, dass ich eine pseudoorganisierte Sammlung von Dingen habe, die ich in der Vergangenheit entweder gelesen oder erforscht habe.

Als jemand, der mich persönlich kennt, bin ich keine sehr gut organisierte Person. Daher habe ich vielleicht nur 10 - 15% der Dinge gesammelt, also gibt es dort noch viel mehr zu tun.

Wissen und Praxis gehen Hand in Hand, um das Systemdesign zu verbessern. Wenn Sie der Meinung sind, dass Ihre aktuelle Arbeit Ihnen nicht die Möglichkeit bietet, Systemdesigns zu erstellen, sollten Sie entweder eines finden, das dies ermöglicht, oder versuchen, einen kleinen Teil einer vorhandenen Architektur so zu entwerfen, dass sie entweder schneller, billiger oder robuster ist. oder in Zukunft einfacher zu ändern.

Ressourcen, die ich empfehle

Einführung in: Architektur und Systemdesign - Tolles Youtube-Tutorial eines ehemaligen Facebook-Ingenieurs zur Lösung von Systemdesignproblemen.

Entwerfen datenintensiver Anwendungen - Eine weitere gute Ressource zum Erlernen des Skalierens. Es geht um verschiedene Dinge, die ein typischer Softwareentwickler für selbstverständlich hält - wie Datenbanken (mySQL und noSQL) funktionieren, wann sie jeweils verwendet werden, Vor- und Nachteile verschiedener Techniken für den Umgang mit Skalierung usw. Ich kann es nur empfehlen?

Scheininterviews - Eine simulierte Umgebung, die das eigentliche Interview nachahmt, ist äußerst hilfreich bei der Vorbereitung auf Interviews. Wenn Sie einen Freund finden, der das für Sie erledigt, kann ich es nur empfehlen. Ich führe auch Scheininterviews durch. Wenn Sie interessiert sind, können Sie mich gerne unter zhiachong.com erreichen!

Was jeder Softwareentwickler über die einheitliche Abstraktion von Echtzeitdaten wissen sollte - Eine sehr lange und technische Diskussion über Protokolle und Kompromisse. Ich habe es noch nicht fertiggestellt, aber es wird von einem Kollegen sehr empfohlen.

Evernote - Das Beste? Notiz-App, die ich verwendet habe. Es gibt viele Tutorials, wie Sie Evernote am besten nutzen können. Ich habe sie noch nicht durchgesehen, einfach weil ich sie nur als Notizbuch benutze. Ich protokolliere alles, was ich dort lerne, und gehe es dann gelegentlich durch und reorganisiere es.

Moleskin-Notizbuch - ich genieße dieses wirklich. Die Qualität ist extrem hoch. Der Preis ist etwas höher, aber da ich ihn täglich benutze, halte ich ihn für eine gute Investition. Wenn ich jeden Tag ein schönes Notizbuch in den Händen halte, bin ich aufgeregter, mehr Notizen zu schreiben.

Pilot G2 (Schwarz) - Einfach die besten Stifte, die ich je verwendet habe, und die einzigen Stifte, die ich verwenden werde. Ich kaufe sie in großen Mengen bei Amazon und bewahre sie überall auf. Ich habe einen in meinem Rucksack, einen im Büro und einen in meinem Heimbüro, damit ich immer einen Stift dabei habe. Es schreibt großartig, die Tinte fließt reibungslos und ich liebe das Gefühl, damit zu schreiben. In Verbindung mit dem Moleskin möchte ich manchmal nur den G2 in die Hand nehmen, um zufällige Dinge darauf zu schreiben, weil diese beiden so perfekt zusammenpassen.

Grokking the System Design Interview - Dieses Interview wird von Freunden empfohlen. In diesem Online-Kurs erfahren Sie, wie Sie verteilte Systeme im Detail entwerfen. Es ist jedoch ein 79-Dollar-Kurs. Es gibt eine Team-Preisgestaltung. Wenn Interesse besteht, werde ich bei ihnen nachfragen, ob es möglich ist, eine Gruppe für Gruppenrabatte zu bilden.

Folgen Sie mir auf Twitter, Facebook und LinkedIn. Melden Sie sich für meine Mailingliste an, auf der ich regelmäßig Tipps, Tricks und Branchenkenntnisse sende.

Wenn Ihnen dieser Artikel gefallen hat, kommentieren Sie unten: Was ist Ihr Tipp für den Aufbau eines skalierbaren, zuverlässigen Systems?