Συνεντεύξεις κωδικοποίησης πίσω από τις σκηνές - το καλό και το κακό

Η συνέντευξη είναι μια ικανότητα από μόνη της. Μπορείς να είσαι ο καλύτερος προγραμματιστής στον κόσμο, αλλά μπορείς να συνεχίσεις μια συνέντευξη

Google: 90% των μηχανικών μας χρησιμοποιούν το λογισμικό που γράψατε (Homebrew), αλλά δεν μπορείτε να αντιστρέψετε ένα δυαδικό δέντρο σε έναν πίνακα, οπότε σκατά.

- Max Howell (@mxcl) 10 Ιουνίου 2015

Πόσες φορές βγήκες από μια συνέντευξη και αναρωτήθηκες τι έκανα λάθος; Γιατί με απέρριψαν;

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

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

Θα συγκρίνουμε και θα συγκρίνουμε δύο διαφορετικές συνεντεύξεις και θα μάθουμε από καθεμία από αυτές, ώστε να μπορείτε να τροποποιήσετε τις ενέργειές σας ώστε να ταιριάζει με τις προσδοκίες.

Πρώτη συνέντευξη

Επιτρέψτε μου να κάνω την ίδια ερώτηση παραπάνω "Αντιστροφή δυαδικού δέντρου".

Συνέντευξη (I) : Γεια, Καλώς ήλθατε στην εταιρεία μας. Είμαι xxx κάνει yyy. Λοιπόν πές μου για εσένα.

Υποψήφιος (C) : Είμαι xxx. Έχω περίπου 5 χρόνια εμπειρίας στην ανάπτυξη Backend. Λατρεύω την επίλυση τεχνικών προβλημάτων .....

Εγώ : Είναι υπέροχο. Θα προχωρήσουμε λοιπόν στο μέρος της επίλυσης προβλημάτων;

Γ : Σίγουρα!

Ε : Σας δίνεται ένα δυαδικό δέντρο. Θέλω να αναστρέψετε το δυαδικό δέντρο και να εκτυπώσετε το δέντρο που προκύπτει.

C : (Σκέψη στο κεφάλι) Χμμμ Εντάξει. Ένα δυαδικό δέντρο έχει δύο παιδιά. Υποθέτω λοιπόν ότι η αντιστροφή σημαίνει εκτύπωση από φύλλο σε ρίζα. Ο ευκολότερος τρόπος λοιπόν είναι να διασχίσετε το δέντρο μέχρι το τέλος και να βρείτε τα φύλλα ...

Εγώ : (Μετά από 5 λεπτά πλήρους σιωπής)  Καταλαβαίνετε την ερώτηση; Χρειάζεστε διευκρινίσεις;

C : Είμαι ξεκάθαρος . Τώρα σκέφτομαι απλώς έναν τρόπο εκτύπωσης των κόμβων ξεκινώντας από το φύλλο.

I : Τι εννοείτε να εκτυπώσετε τους κόμβους ξεκινώντας από το φύλλο;

Γ : Οπότε βασικά πρέπει να εκτυπώσω από φύλλο σε ρίζα, σωστά; Είναι εύκολο να διασχίσει μέχρι το φύλλο. Αλλά το σκληρό μέρος περνά πίσω;

Εγώ : Χμμμ. Είστε σίγουροι ότι καταλαβαίνετε την ερώτηση σωστά; Η αναστροφή ενός δέντρου σημαίνει ότι πρέπει να ανταλλάξετε τα αριστερά και τα δεξιά παιδιά .

Γ : Συγγνώμη δεν είμαι ξεκάθαρος. Όταν είπατε αντιστροφή, υποθέτω ότι εννοούσατε εκτύπωση από φύλλο σε ρίζα.

Εγώ : Αυτό είναι εντάξει (Εδώ χάσατε τη δουλειά) . Τώρα που είστε ξεκάθαροι ας προχωρήσουμε.

C : Ναι, είμαι σαφής. Τώρα πρέπει να αλλάξω τον αριστερό και τον δεξιό κόμβο. Αυτό είναι εύκολο, σωστά.

(Γράφει κώδικας σε σιωπή)

def invert(node) t = node.left node.left = node.right node.right = t return node end 

C : Έχω τελειώσει με τον κωδικό.

Εγώ : Ωραία. Τι έκανες λοιπόν εδώ;

C : Ανέστρεψα το δέντρο με εναλλαγή των αριστερών και δεξιών κόμβων. Έτσι διατηρώ μια μεταβλητή temp για να επιτύχω το ίδιο.

Εγώ : (Προσπαθώντας να προωθήσω μια σωστή λύση) Αλλά αυτό ανταλλάσσει μόνο τον ριζικό κόμβο σωστά;

C : (προβληματικό) Χμμ ναι, έτσι τα αριστερά και τα δεξιά παιδιά θα αντιστραφούν. Αυτή είναι η ερώτηση, σωστά;

Εγώ : (Ακόμα δεν υπάρχει καμία σαφήνεια) Έτσι, το ερώτημα είναι ότι το πλήρες δέντρο πρέπει να αντιστραφεί. Όχι μόνο η ρίζα.

Γ : Θεέ μου. Άρα δεν είναι μόνο η ρίζα αλλά το πλήρες δέντρο. Είμαι σωστός?

Ι : Ναι αυτό είναι σωστό.

Γ : Εντάξει. Ασε με να το σκεφτώ.

(Μετά από 2 λεπτά)

C : Νομίζω ότι το κατάλαβα. Επομένως βασικά πρέπει να κάνω τον ίδιο αλγόριθμο που έγραψα για ολόκληρο το δέντρο. Είμαι σωστός?

Εγώ : Ναι, αλλά πώς το κάνετε αυτό;

C : (Αρχίζει να γράφει κώδικα)

def invert(node) n = Node.new(node.val) invert(node.left) invert(node.right) n.left = node.right n.right = node.left return n end

Υποθέτω λοιπόν ότι αυτό πρέπει να λειτουργήσει.

Εγώ : Χμμμ, επιτρέψτε μου να δω. (Βρίσκει το πρόβλημα. Μπορείτε;) Δεν είμαι σίγουρος αν λειτουργεί. Μπορείτε παρακαλώ να με δοκιμάσετε;

Γ : Σίγουρα. Πρώτα αναστρέφω το αριστερό υποδένδρο, μετά το δεξί υποδένδρο και μετά τα ανταλλάσσω έτσι ώστε η ρίζα να αντιστραφεί.

Εγώ : Χμμμ. Αλλά ο αριστερός και ο δεξί κόμβος επιστρέφουν νέους κόμβους μετά την ανταλλαγή δεξιά; Αλλάζετε ακόμη τους παλιούς κόμβους.

C : Δεν είμαι σίγουρος τι εννοείς με αυτό. Νομίζω ότι αυτό θα λειτουργήσει για όλες τις περιπτώσεις.

Εγώ : Υπέροχος! Έχουμε εξαντλήσει τον χρόνο. Ευχαριστώ για το χρόνο σας, ήταν υπέροχο να σας μιλήσω. Το HR θα επικοινωνήσει μαζί σας.

Ανατροφοδότηση

Τώρα, ποια πιστεύετε ότι ήταν η τελική απόφαση και ποια ήταν τα σχόλια του ερευνητή; Η υποθετική ανατροφοδότηση θα ήταν κάτι τέτοιο:

  • Ο υποψήφιος ανέλαβε πολλά πράγματα και δεν διευκρίνισε το πρόβλημα.
  • Ο υποψήφιος βρήκε την προσέγγιση από το πουθενά και δεν υπήρχε κατάλληλος λόγος πίσω από την προσέγγιση που ακολουθήθηκε. (Θυμάστε τη σιωπή στη συνέντευξη;)
  • Ο υποψήφιος δεν ήταν ξεκάθαρος με τις απαιτήσεις ακόμη και στο στάδιο της εφαρμογής.
  • Ο υποψήφιος αγωνίστηκε με την εφαρμογή και δεν μπόρεσε να πάρει υποδείξεις που δείχνουν προς τη λύση.
  • Ο υποψήφιος απέτυχε να εντοπίσει τα σφάλματα στον κώδικα, ακόμη και αφού έδωσε αρκετό χρόνο και διερεύνησε για να ελέγξει αν η λύση είναι σωστή.

Εάν αυτή ήταν μια πραγματική συνέντευξη, ο υποψήφιος θα είχε απορριφθεί. Τώρα πώς πρέπει να πάει η ιδανική συνέντευξη;

Δεύτερη συνέντευξη

Συνέντευξη (I) : Γεια, Καλώς ήλθατε στην εταιρεία μας. Είμαι xxx κάνει yyy. Λοιπόν πές μου για εσένα.

Υποψήφιος (C) : Είμαι xxx. Έχω περίπου 5 χρόνια εμπειρίας στην ανάπτυξη Backend. Λατρεύω την επίλυση τεχνικών προβλημάτων .....

Εγώ : Είναι υπέροχο. Θα προχωρήσουμε λοιπόν στο μέρος της επίλυσης προβλημάτων;

Γ : Σίγουρα!

Ε : Σας δίνεται ένα δυαδικό δέντρο. Θέλω να αναστρέψετε το δυαδικό δέντρο και να εκτυπώσετε το δέντρο που προκύπτει.

C : (Σκέφτεται δυνατά) Ωραία. Έτσι, ένα δυαδικό δέντρο έχει δύο κόμβους. Τι ακριβώς αντιστρέφει; ανταλλάσσει αριστερά και δεξιά;

I : Ακριβώς. Επομένως, ο αριστερός κόμβος πρέπει να είναι στα δεξιά και το αντίστροφο.

Γ : Εντάξει. Σε αυτήν την περίπτωση λοιπόν τι συμβαίνει;

Παρέχει ένα παράδειγμα και διευκρινίζει την είσοδο και την έξοδο

Εγώ : Έχετε δίκιο σε κάποιο βαθμό. Αλλά αυτό πρέπει να συμβεί για ολόκληρο το δέντρο, όχι μόνο για τη ρίζα και μόνο. (Παρατηρήστε πόσο νωρίς στερεοποιήθηκαν οι απαιτήσεις)

Γ : Το κατάλαβα! Έτσι σκέφτομαι ότι πρέπει να το κάνω αναδρομικά. Φίλε, είναι δύσκολο! Ασε με να δω. Αλλά πριν από αυτό, θα ελέγξω μόνο την κατανόησή μου με ένα ακόμη παράδειγμα.

Παρέχει ένα ακόμη π.χ. για να διευκρινίσει τυχόν κομμάτια που λείπουν

Εγώ : Ναι έχετε δίκιο. Αυτό είναι το αποτέλεσμα. Νομίζω ότι έχετε το πρόβλημα εντελώς. Λοιπόν, πώς το προσεγγίζετε;

C : Επιτρέψτε μου να δω. Για να αλλάξω αριστερά και δεξιά, μπορώ απλά να χρησιμοποιήσω ένα temp. Αλλά πώς θα το κάνω για να παραμείνω; Ω ναι, θα μπορούσα απλώς να επαναλάβω για τους άλλους και να κάνω το ίδιο.

Εγώ : Ωραία. Υπάρχει πρόβλημα με αυτήν την προσέγγιση;

Γ : Χμμμ. Ναι, αν αλλάξω αναδρομικά το αριστερό και το δεξί, πώς θα παρακολουθήσω το παλιό και το νέο δέντρο;

Εγώ : Δεν είμαι σίγουρος ότι σε ακολουθώ. Τι είναι παλιό και νέο;

Γ : Αυτό που εννοούσα είναι ότι θα υπάρχουν ενημερωμένα παιδιά, πρέπει να τα ανταλλάξω και όχι τα παλιά παιδιά.

Ι : Ναι, διορθώστε.

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

Εγώ : Ωραία. Οτιδήποτε άλλο λείπει;

C : Όχι νομίζω. Έτσι θα χρειαστεί χρόνος O (n) και O (1) χώρος καθώς δεν χρησιμοποιώ επιπλέον χώρο. (Παρατηρήστε πόσο ενεργά ο υποψήφιος συζητά το χρόνο και το χώρο)

I : Είμαι μια χαρά. Μπορείτε να ξεκινήσετε την κωδικοποίηση.

Γ : Σίγουρα. (Συζητά μέσω του κώδικα κατά την κωδικοποίηση)

def invert(node) invert(node.left) invert(node.right) node.left,node.right = node.right, node.left return node end 

Γ : Έτσι τελείωσα. Επιτρέψτε μου να σας καθοδηγήσω στον κωδικό μου. Έτσι, για ένα δέντρο σαν ... (Εξηγεί και ξηρό τρέχει με ένα παράδειγμα)

Εγώ : Υποθέτω ότι έχετε δίκιο. Λειτουργεί για όλες τις περιπτώσεις;

Γ : Χμμμ. Υποθέτω ότι θα λάβω εξαίρεση δείκτη Null για ένα άδειο δέντρο. Επιτρέψτε μου να το διορθώσω προσθέτοντας έναν μηδενικό έλεγχο.

Εγώ : Τώρα φαίνεται καλό. Οτιδήποτε άλλο λείπει.

Γ : Όχι, νομίζω ότι άλλα πράγματα που έχω καλύπτονται, όπως δεν αφήνει, ένα φύλλο, κλπ (Παρατηρήστε πως ο ίδιος φωνάζει κάθε περίπτωση θα εξεταστεί)

Εγώ : Ωραία. Ειμαι καλος. Καμιά ερώτηση? :)

Ανατροφοδότηση

Τι πιστεύετε λοιπόν για αυτήν τη συνέντευξη;

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

συμπέρασμα

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

Αυτό το άρθρο δημοσιεύθηκε για πρώτη φορά στο //kaizencoder.com. Αν σας άρεσε αυτό το άρθρο, επισκεφθείτε για να διαβάσετε περισσότερα σαν αυτό ή μάθετε περισσότερα για εμένα!