Μελέτη περίπτωσης τεχνικής τηλεφωνικής συνέντευξης: Πώς να διπλασιάσετε έναν πίνακα σε JavaScript

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

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

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

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

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

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

Ας βουτήξουμε.

Το ερώτημα

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

Ακολουθεί το δείγμα της ερώτησης συνέντευξης:

Given an array, write a function that doubles the array.Example: given [1,2,3,4,5], your function should return [1,2,3,4,5,1,2,3,4,5].You could call it like so: myArray.double().

Απαντώντας στην ερώτηση

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

1. Διευκρινίστε την ερώτηση

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

3. Ψευδοκωδικοποιήστε τη λύση σας (προαιρετικά)

4. Μεταφράστε τον ψευδοκώδικα σας σε πραγματικό κώδικα

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

1. Διευκρινίστε την ερώτηση

Το πρώτο πράγμα που πρέπει να κάνετε όταν δοθεί μια ερώτηση συνέντευξης όπως αυτό είναι να κάνετε διευκρινιστικές ερωτήσεις.

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

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

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

// What happens when the given array is empty?[] => []
// What happens when the given array has only 1 element?[1] => [1,1]
// What happens when the given array has only 2 elements?[1,2] => [1,2,1,2]
// What happens when the given array has N elements?[1...N] => [1,2,3,4,5...N,1,2,3,4,5...N]

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

3. Ψευδοκωδικοποιήστε τη λύση σας (προαιρετικά)

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

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

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

Έτσι, επιστρέφοντας στην ερώτηση που ακολουθεί, ακολουθεί κάποιος ψευδοκώδικας που θα μπορούσατε να γράψετε:

// Define a function that takes in an array// Loop over the array// Push each element from the array back into the array// Return the array

4. Μεταφράστε τον ψευδοκώδικα σας σε πραγματικό κώδικα

Τώρα που έχετε γράψει ψευδο-κώδικα, ήρθε η ώρα να κάνετε κάποια κωδικοποίηση. Για αυτήν την ερώτηση, η πρώτη (λανθασμένη) λύση που βρήκα έμοιαζε ως εξής:

var array = [1,2,3,4,5];
var double = function(array) {
 for (var i = 0; i < array.length; i++) { array.push(array[i]); }
 return array;
}
double(array);

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

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

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

Γιατί αυτό δημιουργεί έναν άπειρο βρόχο; Αυτό array.lengthπου χρησιμοποιούσα για να ξέρω πότε forθα σταματούσε ο βρόχος μου αυξανόταν δυναμικά καθώς έσπρωχνα νέα στοιχεία στον πίνακα! Έτσι, όταν forξεκίνησε ο βρόχος, array.lengthήταν ίσος με 5. Αλλά μετά την πρώτη επανάληψη του forβρόχου, array.lengthήταν ίσος με 6, και συνεχώς και κατά την άπειρη διαφήμιση.

Ωστόσο, υπάρχει μια απλή αλλαγή που θα κάνει αυτή τη λύση να λειτουργεί:

var array = [1,2,3,4,5];
var double = function(array) {
 var length = array.length;
 for (var i = 0; i < length; i++) { array.push(array[i]); }
 return array;
}
double(array);=> [1,2,3,4,5,1,2,3,4,5]

RUNTIME: O (n) = γραμμικό

Με αυτήν την αλλαγή, δηλώνω μια μεταβλητή που ονομάζεται lengthμέσα στο πεδίο της συνάρτησης και στη συνέχεια τη χρησιμοποιώ ως οριοθέτη για το forβρόχο μου . Παρόλο που το μέγεθος του πίνακα μου αλλάζει τώρα, ο forβρόχος σταματά ακόμα μετά την 5η επανάληψη, επειδή η μεταβλητή μήκους δεν αλλάζει όταν array.lengthαλλάζει.

Τώρα μπορώ να δοκιμάσω τον κωδικό μου με τις άκρες που βρήκα το ealier και να δω ότι τα αποτελέσματα είναι όπως αναμενόταν:

// Passing in an empty array yields an empty array correctly:[] => []
// Passing in an array with only 1 element yields the correct array with 2 elements:[1] => [1,1]
// Passing in an array with only 2 elements yields the correct array with 4 elements:[1,2] => [1,2,1,2]
// Passing in an array with 10 elements yields the correct array with 20 elements:[1,2,3,4,5,6,7,8,9,10] => [1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]

Εναλλακτικές λύσεις

The above is one way to solve this question, but there are a couple of other alternatives as well. Remember when I introduced the question above with the suggestion of calling the function by writing something like myArray.double()? If you’re familiar with object oriented programming, you may recognize this syntax. In this case, the general idea is that you would actually add an array method called double using the prototype chain, that you would then be able to call.

Here’s an example of how I could do that using the for loop structure from my original solution:

Array.prototype.double = function() { var length = this.length;
 for (var i = 0; i < length; i++) { this.push(this[i]); }
 return this;}
var myArray = [1,2,3,4,5];
myArray.double();=> [1,2,3,4,5,1,2,3,4,5]

By defining the function using the JavaSacript prototype chain, I don’t actually have to pass anything into it because I have access to the array that the method is being called on with this. To learn more about the this keyword, read the MDN docs.

Now, these solutions are great, but what about answering this question without using a for loop? One way is to use the built in JavaScript method forEach. This is the same idea as a for loop, but instead of us telling the program how to execute our code (imperative programming) we’re going to tell it what the result is (declarative programming). You can read more about imperative vs. declarative programming here.

Here’s an example of the same solution using forEach:

var array = [1,2,3,4,5];
var double = function(array) {
 array.forEach(function(value) { array.push(value); });
 return array;}
double(array);=> [1,2,3,4,5,1,2,3,4,5]

RUNTIME: O(n) = linear

Finally, here’s another solution to this problem, which I found with a few quick Google searches.

There is also a built in array method called concat that you can use:

var array = [1,2,3,4,5];
var double = function(array) { var doubled = array.concat(array);
 return doubled;}
double(array);=> [1,2,3,4,5,1,2,3,4,5]

RUNTIME: O(n) = linear

NOTE: If you’re wondering about Google searching during your phone screen, here’s my take after participating in more than a dozen technical phone screens: usually it’s completely acceptable.

Technical phone screens are often scheduled for 45 mins to 1 hour. Some of that time is reserved for the interviewer to ask questions about your experience, while some is also reserved for you to ask questions. The time you spend coding can be anywhere from 30–45 mins based on the company and interviewer.

In many cases, your interviewer will be able to help you with quick tips and small hints if you have a general idea about how to do something but need to look up the specifics. For example, I once had an interviewer who knew the regex I needed off the top of their head to perform a specific function, so I didn’t need to spend time figuring it out. This allowed the interview to continue more seamlessly.

However, I’ve also had experiences where an interviewer has asked me to refactor my original solution in a different way and explicitly said it was fine to look up documentation. This is usually the case, because many developers spend time daily reading or referencing docs. Being able to follow that same pattern in a technical phone interview is a good sign.

However, Googling for a solution during your interview can also be a time sink, especially if you’re not searching with just the right phrase (this is where the more you search, the better you will become).

For this specific example, if I had already known about JavaScript’s concat method, it might have come to mind when I was confronted with this problem. Then, Googling to remind myself of how concat worked would have been acceptable.

But if I had instead spent time Googling how to double an array before even trying to think through the problem myself, this might have been a red flag for the interviewer. Technical phone screens are a good way for an interviewer to get a sense of how you think, and it really depends what they are looking for in terms of the position they’re hiring for.

On the other hand, some companies will explicitly tell you that you’re not allowed to use Google for help, so in those cases, it’s best not to. Of course, if you’re unsure at all, ask your interviewer.

Conclusion

Why am I showing you all of these examples? As you can see, there is not just one single way to approach this problem. There are several approaches you can take, and how you approach the problem all depends on a combination of what your background is and how you think about problem solving. For me, I often gravitate toward loops since for loops were one of the original programming concepts I learned. But someone who’s used concat before might think of that right off the bat.

I thought this problem was a good example, because it seems relatively simple at first. However, there are ways to get tripped up (as you saw with my infinite loop above), and there are several solutions that demonstrate various levels of specific knowledge. Still, you could also solve this with a solid idea written in pseudo-code and some Googling.

Keep in mind that you won’t always pass technical phone interviews, but the more you do them, the better you will get. And, if you learned something from the interview, even if it was something small, it was probably worth your time.

One final tip

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

Πώς ήταν η εμπειρία σας με τεχνικές τηλεφωνικές συνεντεύξεις; Τους αγαπάς; Τους μισείς; Ποιο ήταν το πιο ενδιαφέρον πρόβλημα που σας ζητήθηκε να επιλύσετε; Αφήστε ένα σχόλιο παρακάτω ή ενημερώστε με μέσω email στο jane [at] fullstackinterviewing [dot] com.

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