Crack the System Design συνέντευξη: συμβουλές από έναν μηχανικό λογισμικού Twitter

Πρόσφατα έγραψα για το πώς προσέλκυσα προσφορές από πολλές κορυφαίες εταιρείες τεχνολογίας. Κατά τη διάρκεια της διαδικασίας προετοιμασίας της συνέντευξής μου, διάβασα πολύ υλικό και ετοίμασα ένα σύνολο σημειώσεων σχετικά με τον τρόπο αντιμετώπισης προβλημάτων σχεδιασμού συστήματος. Σε αυτό το άρθρο, θα ήθελα να μοιραστώ αυτές τις συμβουλές με όλους σας.

Εάν είστε νέος απόφοιτος χωρίς εμπειρία σε κατανεμημένα συστήματα μεγάλης κλίμακας ή ακόμα και έμπειρος μηχανικός με πολυετή εμπειρία κάτω από τη ζώνη σας, αυτό το άρθρο θα είναι χρήσιμο για εσάς.

Ενημέρωση (24/3/2019) : Εάν θέλετε να συμμετάσχετε σε μια ομάδα μαθητών για να μάθετε περισσότερα σχετικά με το σχεδιασμό του συστήματος, οργανώνω μια μικρή τάξη μαζί! Μπορείτε να μεταβείτε σε αυτόν τον σύνδεσμο για να μάθετε περισσότερα ή επισκεφθείτε τον ιστότοπό μου: zhiachong.com για περισσότερες πληροφορίες.

Αυτό το άρθρο χωρίζεται στις ακόλουθες τέσσερις ενότητες:

  • Κάντε ερωτήσεις διευκρίνισης
  • Χρησιμοποιήστε το φόντο σας
  • Αντιμετωπίστε ένα πρόβλημα συστηματικά
  • Κρατήστε τις δικές σας σημειώσεις

Κάντε ερωτήσεις διευκρίνισης

Ένας βασικός στόχος μιας συνέντευξης σχεδιασμού συστημάτων είναι να δώσει στον υποψήφιο την ευκαιρία να αποδείξει τις γνώσεις του.

Δεν υπάρχουν αυστηρά σωστές ή λάθος απαντήσεις. Μια καλή ερώτηση σχεδιασμού συστήματος ακούγεται συνήθως πολύ διφορούμενη και ο λόγος για αυτό είναι ότι θα σας δώσει την ευκαιρία να δείξετε τα εξής:

  • Πώς θα σκεφτόσασταν για τον προβληματικό χώρο
  • Πώς σκέφτεστε τα σημεία συμφόρησης
  • Τι μπορείτε να κάνετε για να αφαιρέσετε αυτά τα σημεία συμφόρησης.

Φανταστείτε ότι σας ζητείται να σχεδιάσετε ένα μαύρο κουτί. Πώς θα αντιμετωπίσετε το πρόβλημα; Δεν υπάρχουν σαφείς οδηγίες σχετικά με το τι πρέπει να δημιουργήσετε εδώ, εκτός από το ότι το κουτί είναι σε θέση να κρατήσει ορισμένα αντικείμενα μέσα σε αυτό.

Μία από τις πιο χρήσιμες στρατηγικές που χρησιμοποιώ προσωπικά είναι να κάνω ερωτήσεις διευκρίνισης. Ποιες είναι οι «καλές» ερωτήσεις διευκρίνισης, ρωτάτε;

Μια καλή ερώτηση διευκρίνισης σας βοηθά να επιτύχετε ένα ή περισσότερα από πολλά πράγματα:

  1. Σας βοηθά να περιορίσετε το πεδίο αυτού που πρέπει να κάνετε
  2. Βοηθά να διευκρινιστεί ποια είναι η προσδοκία του χρήστη από το σύστημα
  3. Σας δίνει κατεύθυνση για το πού να προχωρήσετε
  4. Σας ενημερώνει για πιθανά σημεία συμφόρησης / προβληματικές περιοχές

Στο παράδειγμα του μαύρου κουτιού, μπορείτε να ρωτήσετε, "καλά, τι κρατάει το κουτί; Πόσα αντικείμενα κρατάει; Και ποιος είναι ο προοριζόμενος χρήστης; "

Για αυτό θα μπορούσα να πω, ας φτιάξουμε ένα κίτρινο κουτί με ένα χαμόγελο πάνω του που θα πρέπει να κρατά το πολύ 1 μπάλα του τένις. Ωστόσο, αυτό δεν είναι μια συνηθισμένη μπάλα του τένις. Θα έχει τουλάχιστον 0,5 μέτρα σε ακτίνα και ζυγίζει περίπου 1 κιλό. Σκοπεύει να αγκαλιαστεί, να μην κρατηθεί, οπότε δεν θέλω καμία λαβή σε αυτό.

Ορίστε, αυτό είναι το κουτί.

Πάντα να υποβάλλετε ερωτήσεις διευκρίνισης. Δεν κρίνετε εάν ρωτήσατε μια συγκεκριμένη ερώτηση κατά τη διάρκεια της συνέντευξης, αλλά κρίνετε πώς σκέφτεστε για τον προβληματικό χώρο.

Για παράδειγμα, αν ήθελα να σας ζητήσω να σχεδιάσετε το Twitter τώρα, πώς θα το κάνατε; Αφιερώστε λίγα λεπτά για να το σκεφτείτε και ίσως ακόμη και να το σχεδιάσετε σε ένα κομμάτι χαρτί. Πηγαίνετε όσο πιο βαθιά και ευρύτερα μπορείτε και μετά επιστρέψτε σε αυτό το άρθρο. Ακόμα καλύτερα, μπορείτε να αφήσετε τις σημειώσεις σας στα παρακάτω σχόλια και μπορούμε να συζητήσουμε περαιτέρω.

Εάν δεν το έχετε συνειδητοποιήσει ακόμα, το τελικό αποτέλεσμα της παραπάνω άσκησης θα έχει σημαντικά διαφορετικά αποτελέσματα. Για το δικό μου συγκεκριμένο υπόβαθρο, θα μπορούσα να ερευνήσω πολύ βαθιά το σχεδιασμό API και την υποδομή backend. Πιθανότατα να εξερευνήσω συγκεκριμένα προβλήματα iPhone, λόγω της εμπειρίας μου. Θα μιλήσω για το πώς αλληλεπιδρά ο πελάτης με τα τελικά σημεία μεσαίου επιπέδου, πώς θα λειτουργούσε η καταγραφή, πώς θα σχεδίαζα το backend για να διασφαλίσω το χρόνο λειτουργίας και ούτω καθεξής.

Αυτές είναι αρκετά ενδιαφέρουσες συζητήσεις που μπορείτε να κάνετε με έναν συνάδελφο, και αυτό είναι ένα πολύ δυνατό μήνυμα που αναζητά ένας ερευνητής.

Χρησιμοποιήστε το φόντο σας προς όφελός σας

Συχνά, βλέπω μηχανικούς να προσπαθούν να καταλάβουν τι προσπαθεί να ρωτήσει ο ερευνητής και στη συνέχεια να ανταποκρίνεται στις απαντήσεις τους ώστε να ταιριάζει στις προσδοκίες.

Στην πραγματικότητα αποθαρρύνω πολύ κανέναν να το κάνει για διάφορους λόγους:

  1. Ο καθένας έχει ένα μοναδικό υπόβαθρο. Σε μια συνέντευξη σχεδιασμού συστημάτων, είναι μια ευκαιρία για να δείξετε ποια είναι τα δυνατά σας σημεία. Μην χάνετε την ευκαιρία προσπαθώντας να καταλάβετε τι μπορεί να περιμένει κάποιος άλλος από εσάς.
  2. Ο ερευνητής μπορεί να κουνάει τις απαντήσεις σας, αλλά ίσως ήξεραν ότι απλώς μπλοκάρετε το δρόμο σας και δεν σκέφτεστε πραγματικά το πρόβλημα.

Η εμπειρία και το ιστορικό σας μπορεί να διαφέρει πολύ από τον επόμενο υποψήφιο. Φέρτε ένα σύνολο τιμών και εμπειρογνωμοσύνης στο τραπέζι που κανείς άλλος δεν μπορεί. Αυτό είναι που σε κάνει πολύτιμο και αναντικατάστατο. Ανεξάρτητα από το πεδίο στον οποίο βρίσκεστε, οι άνθρωποι ενδιαφέρονται για το τι μπορείτε να φέρετε στο τραπέζι.

Αντιμετωπίστε το πρόβλημα συστηματικά

Τώρα, έχοντας κατά νου την εμπειρία μου, υπάρχουν πολλά πράγματα που σκέφτομαι όταν αντιμετωπίζω ένα νέο σύστημα. Συνιστώ ανεπιφύλακτα να διαμορφώσετε ένα σύνολο κριτηρίων ή βημάτων για τον εαυτό σας επίσης.

Μερικά από τα πράγματα στο μυαλό μου όταν δουλεύω σε ένα νέο σύστημα είναι:

  • Ποιος είναι ο στόχος του συστήματος;
  • Ποιοι είναι οι χρήστες του συστήματος;
  • Με ποια κλίμακα δουλεύουμε;
  • Αυτό είναι ένα νέο / παλιό σύστημα; Πώς χειριζόμαστε την έκδοση;

Μεταξύ άλλων…

Βλέπε, το σύνολο των κριτηρίων μου θα είναι διαφορετικό από ένα σύνολο κριτηρίων ενός μηχανικού front-end. Χρησιμοποιώ αυτά τα κριτήρια για να διαμορφώσω μια εικόνα στο μυαλό μου, και αυτά θα καθοδηγήσουν τη διαδικασία λήψης αποφάσεών μου.

Οπλισμένοι με απαντήσεις σε αυτές τις ερωτήσεις, μπορώ να αρχίσω να αντιμετωπίζω το πρόβλημα και μετά να το χωρίζω συστηματικά σε μεμονωμένα στοιχεία.

Μια καλή άσκηση που μου αρέσει είναι να σχεδιάσω ένα σύστημα παραγγελίας καφέ . Το σκέφτηκα αυτό ενώ καθόμουν στο Starbucks μια μέρα και συνειδητοποίησα ότι θα ήταν ωραίο αν μπορούσα να παραγγείλω ένα smoothie στο τηλέφωνό μου και να το παραλάβω στο τοπικό μου Starbucks.

Το μυαλό μου άρχισε σε διάφορες κατευθύνσεις:

  • Τι κάνει αυτή η μηχανή παραγγελίας καφέ;
  • Αν το φτιάξω, μπορώ να το πουλήσω στο Starbucks ή να το προσθέσω σε λευκή ετικέτα και να το πουλήσω ως υπηρεσία;
  • Πόσους χρήστες χρειάζομαι να υποστηρίξω εάν το πουλήσω στο Starbucks;
  • Εναλλακτικά, εάν το επισημαίνω λευκά, μπορώ να πουλήσω τη διεπαφή στην υπηρεσία παραγγελίας καφέ και, στη συνέχεια, να βοηθήσω τους πελάτες να δημιουργήσουν ένα backend ώστε να μπορούν να αποθηκεύουν τις παραγγελίες στα τοπικά τους μηχανήματα;

Μόλις λάβω απαντήσεις σε αυτές τις ερωτήσεις, μπορώ επιτέλους να σχηματίσω μια πλήρη εικόνα του τι κάνει η υπηρεσία παραγγελίας καφέ. Δείτε πώς θα ήταν η έκδοση της υπηρεσίας παραγγελίας καφέ:

Η υπηρεσία παραγγελίας καφέ μου είναι ένα λογισμικό ως υπηρεσία (SAAS). Προσφέρει μια διεπαφή για διάφορους συνεργάτες για σύνδεση.

  • Έχει ένα API, που ονομάζεται addCoffeeForMerchant , το οποίο εισάγει το όνομα του καφέ, την τιμή του καφέ και τα συστατικά του καφέ.
  • Έχει ένα API GET, που ονομάζεται getCoffeesForMerchant , το οποίο επιστρέφει μια λίστα καφέ για ένα δεδομένο αναγνωριστικό εμπόρου.
  • Το αναγνωριστικό εμπόρου είναι ένα μοναδικό αναγνωριστικό (UUID) που δημιουργείται χρησιμοποιώντας κάποιο μηχανισμό κατακερματισμού, το οποίο μπορεί να διευκρινιστεί περαιτέρω με τον πελάτη.
  • Το λογισμικό έχει βελτιστοποιηθεί για λειτουργίες μόνο για ανάγνωση, επειδή οι περισσότεροι από τους πελάτες μου δημιουργούν το μενού τους μία φορά και το διαβάζουν πολλές φορές όλη την ημέρα.
  • Διαθέτει έναν μηχανισμό προσωρινής αποθήκευσης που χρησιμοποιεί τη στρατηγική απομάκρυνσης του Least-πρόσφατα χρησιμοποιημένου (LRU), επειδή εάν το στοιχείο μενού δεν έχει παραγγελθεί για λίγο, ο πελάτης μου δεν με νοιάζει αν είναι ελαφρώς πιο αργός στην εμφάνιση στο μενού.
  • Σε περίπτωση που ένα από τα αποθηκευμένα δεδομένα εκραγεί, η υπηρεσία παραγγελίας καφέ μου θα αναπαράγει δεδομένα σε διαφορετικές ομάδες σε δυτική και ανατολική ακτή των ΗΠΑ, επειδή στοχεύω στην αγορά των ΗΠΑ μόνο προς το παρόν.

Εναλλακτικά, οποιαδήποτε άλλη υπηρεσία παραγγελίας καφέ που μπορείτε να σκεφτείτε θα ήταν επίσης πολύ πιθανή. Είναι απλώς θέμα για το οποίο βελτιστοποιείτε. Νομίζω ότι αυτά είναι πολύ ενδιαφέροντα προβλήματα και είναι μια μεγάλη ψυχική άσκηση για να διατηρήσετε το μυαλό σας απασχολημένο.

Κρατήστε τις δικές σας σημειώσεις

Ως μηχανικός λογισμικού, είναι μια ατελείωτη διαδικασία μάθησης. Συνιστώ ανεπιφύλακτα να χρησιμοποιείτε είτε το Evernote είτε το Moleskin για να κρατάτε σημειώσεις. Φέρνω προσωπικά ένα μικρό σημειωματάριο για γρήγορες ιδέες που πρέπει να σημειώσω και διατηρώ διάφορα άλλα πράγματα στο Evernote όποτε μπορώ.

Έχω ένα σημειωματάριο με το όνομα "Προγραμματισμός" στο Evernote. Όποτε συναντώ κάτι νέο, ή κάτι ενδιαφέρον, το σημειώνω στο σημειωματάριό μου για περαιτέρω αναφορά.

Περνάω και εκχωρώ ετικέτες σε αυτές τις νέες σημειώσεις σε μηνιαία ή τριμηνιαία βάση για να βεβαιωθώ ότι οι σημειώσεις είναι οργανωμένες. Για παράδειγμα, έχω μια ετικέτα "Design" για οτιδήποτε έχει να κάνει με το σχεδιασμό του συστήματος. Θα μπορούσε να είναι κάτι σαν σύνδεσμος σε ένα βίντεο του YouTube που βρήκα ενδιαφέρον, ή ένα ενδιαφέρον επιχείρημα που έθεσε ο συνάδελφός μου που δεν είχα σκεφτεί.

Αυτό είναι ένα δείγμα της εμφάνισης μιας από τις σημειώσεις μου:

Ένα από τα πράγματα που έμαθα πρόσφατα από έναν συνάδελφο είναι ότι το NoSQL είναι ιδανικό για πρωτότυπα, επειδή δεν χρειάζεται να υποβληθείτε σε συζητήσεις σχήματος με άλλες ομάδες. Αν ήθελα να αλλάξω το σχήμα, μπορώ να το κάνω πολύ γρήγορα με μια βάση δεδομένων NoSQL. Αυτή ήταν μια βασική εκμάθηση από την εργασία που εισήγαγα στο σημειωματάριό μου «Προγραμματισμός».

Αναλύω τις σημειώσεις μου σε:

  1. Σχεδιασμός συστημάτων
  2. Συνέντευξη (εμπειρία + κριτική διαφορετικών συνεντεύξεων που είχα στο παρελθόν, ομαδοποιημένη κατά όνομα εταιρείας)
  3. Τυχαία tid-bits, CS καλά γνωστά, όπως χρήσιμα σενάρια bash ή κόλπα γραμμής εντολών
  4. Αναγνώσεις / βίντεο YouTube

Όλες οι παραπάνω σημειώσεις βρίσκονται στην ενότητα "Προγραμματισμός". Με την πάροδο του χρόνου, διαπιστώνω ότι έχω μια ψευδο-οργανωμένη συλλογή πραγμάτων που έχω διαβάσει ή εξερευνήσει στο παρελθόν.

Ως οποιοσδήποτε με γνωρίζει σε προσωπικό επίπεδο, δεν είμαι πολύ οργανωμένος άνθρωπος. Έτσι, έχω συγκεντρώσει μόνο το 10 - 15% των πραγμάτων, οπότε απομένουν πολύ περισσότερα να κάνουμε εκεί.

Η γνώση και η πρακτική συμβαδίζουν για να βελτιωθούν στα σχέδια συστημάτων. Εάν πιστεύετε ότι η τρέχουσα εργασία σας δεν σας δίνει την ευκαιρία να κάνετε σχέδια συστημάτων, τότε θα πρέπει είτε να βρείτε αυτό που το κάνει, είτε να προσπαθήσετε να σχεδιάσετε ένα μικρό μέρος μιας υπάρχουσας αρχιτεκτονικής έτσι ώστε είτε να είναι γρηγορότερο, φθηνότερο, πιο στιβαρό, ή ευκολότερη τροποποίηση στο μέλλον.

Πόροι που προτείνω

Εισαγωγή σε: Αρχιτεκτονική και Σχέδια Συστημάτων - Εξαιρετικό σεμινάριο Youtube από έναν πρώην μηχανικό του Facebook σχετικά με τον τρόπο προσέγγισης των προβλημάτων σχεδιασμού συστημάτων.

Σχεδιασμός εφαρμογών υψηλής έντασης δεδομένων - Ένας άλλος καλός πόρος για να μάθετε πώς να σχεδιάζετε κλίμακα. Μιλά για διάφορα πράγματα που ένας τυπικός μηχανικός λογισμικού θεωρεί δεδομένο - πώς λειτουργούν οι βάσεις δεδομένων (mySQL και noSQL), πότε να χρησιμοποιηθούν καθένα, τα πλεονεκτήματα και τα μειονεκτήματα διαφόρων τεχνικών για τον χειρισμό κλίμακας κ.λπ. Το συνιστώ ανεπιφύλακτα;

Mock Συνεντεύξεις - Ένα προσομοιωμένο περιβάλλον που μιμείται την πραγματική συνέντευξη είναι εξαιρετικά χρήσιμο στην προετοιμασία για συνεντεύξεις. Εάν μπορείτε να βρείτε έναν φίλο να το κάνει για εσάς, τότε το συνιστώ ανεπιφύλακτα. Έχω επίσης πλαστές συνεντεύξεις, οπότε αν σας ενδιαφέρει, μη διστάσετε να επικοινωνήσετε μαζί μου στο zhiachong.com!

Τι πρέπει να γνωρίζει κάθε μηχανικός λογισμικού για την ενοποιητική αφαίρεση δεδομένων σε πραγματικό χρόνο - Μια πολύ χρονοβόρα και τεχνική συζήτηση σχετικά με τα αρχεία καταγραφής, τις ανταλλαγές. Δεν το έχω τελειώσει ακόμα, αλλά συνιστάται ιδιαίτερα από έναν συνάδελφο.

Evernote - Το καλύτερο; εφαρμογή τήρησης σημειώσεων που έχω χρησιμοποιήσει. Υπάρχουν πολλά σεμινάρια σχετικά με τον καλύτερο τρόπο χρήσης του Evernote. Δεν τα έχω περάσει ακόμα, απλώς και μόνο επειδή το χρησιμοποιώ μόνο ως σημειωματάριο. Καταγράφω όλα όσα μαθαίνω εκεί, και στη συνέχεια περνάω περιστασιακά και τα αναδιοργανώνω.

Moleskin notebook - Μου αρέσει πολύ αυτό. Η ποιότητα είναι εξαιρετικά υψηλή. Η τιμή είναι ελαφρώς υψηλότερη, αλλά δεδομένου ότι το χρησιμοποιώ σε καθημερινή βάση, το θεωρώ καλή επένδυση. Κρατώντας ένα όμορφο σημειωματάριο στα χέρια μου καθημερινά με κάνει πιο ενθουσιασμένο να γράφω περισσότερες σημειώσεις.

Pilot G2 (Μαύρο) - Εύκολα τα καλύτερα στυλό που έχω χρησιμοποιήσει ποτέ και τα μόνα στυλό που θα χρησιμοποιήσω. Τα αγοράζω χύμα από την Amazon και τα κρατάω παντού. Έχω ένα στο σακίδιο μου, ένα στο γραφείο και ένα στο γραφείο μου για να έχω πάντα ένα στυλό. Γράφει υπέροχα, το μελάνι ρέει ομαλά και μου αρέσει πολύ η αίσθηση της γραφής μαζί του. Σε συνδυασμό με το Moleskin, μερικές φορές θέλω απλώς να πάρω το G2 για να γράψω τυχαία πράγματα εκεί γιατί αυτά τα δύο είναι τόσο τέλεια μαζί.

Grokking the System Design Interview - Αυτό έρχεται ως σύσταση από φίλους. Είναι ένα διαδικτυακό μάθημα που διδάσκει πώς να σχεδιάζετε λεπτομερώς το κατανεμημένο σύστημα. Ωστόσο, είναι ένα μάθημα 79 $. Υπάρχει ομαδική τιμολόγηση. Αν υπάρχει ενδιαφέρον, θα επικοινωνήσω μαζί τους για να δω αν είναι δυνατό να σχηματιστεί ομάδα για ομαδική έκπτωση.

Ακολουθήστε με στο Twitter, στο Facebook και στο LinkedIn. Εγγραφείτε στη λίστα αλληλογραφίας μου όπου στέλνω τακτικά συμβουλές, κόλπα και μαθήματα στον κλάδο.

Εάν σας άρεσε αυτό το άρθρο, σχολιάστε παρακάτω: ποια είναι η συμβουλή σας για τη δημιουργία ενός κλιμακούμενου και αξιόπιστου συστήματος;