Студија случаја техничког телефонског интервјуа: Како удвостручити низ у ЈаваСцрипт-у

Технички телефонски екрани су пресудан корак у процесу техничког разговора. Да ли ћете бити позвани на разговор на лицу места често зависи од тога да ли ћете проћи технички екран телефона или не.

Технички телефонски екрани могу бити тешки јер морате размишљати наглас док радите са проблемом, а да не будете у могућности да будете тамо лично са својим анкетером. Када интервјуишете некога путем телефона или видеа, може бити тешко да прође цело ваше присуство. Обично ћете радити у заједничком уређивачу, па док будете решавали проблем, испитивач ће моћи само да вас чује и види шта куцате. Многи људи теже комуницирају на овај начин него лично.

Добра вест је да су технички екрани телефона нешто у чему можете вежбати и бити бољи. Као и било која вештина, што их више будете радили, то ћете бити бољи. На крају ћете почети да видите резултате, јер ћете бити позвани да разговарате на лицу места са све већим бројем компанија.

Иако су сви технички телефонски разговори различити, за већину ће бити потребно да размишљате на ногама. Дакле, најбољи начин припреме је једноставно вежбање рада на питањима. Можете сами проћи кроз њих изговарајући их, а можете и вежбати са пријатељем. Ако вежбате сами, могли бисте чак и сами да се снимите како бисте могли преслушати снимак и видети да ли је начин на који сте објаснили свој мисаони процес имао смисла.

Коначно, можете вежбати интервјуисањем компанија! Када сам последњи пут интервјуисао нову улогу, започео сам са проналажењем компанија које су ме занимале, али не бих био узнемирен ако не бих прошао поред техничког екрана телефона. На овај начин сам и даље осећао притисак да се припремим, али очекивао сам да ћу прво неколико пута пропасти. Тада је било мање разочаравајуће када нисам прешао на следећу фазу.

У овом посту проћи ћу кроз питање које сам добио на техничком екрану телефона како бих вам дао оквир за приступ овим врстама интервјуа. Надам се да је ово корисно и поздрављам ваше коментаре и повратне информације!

Уронимо.

Питање

Ово је стварно питање које сам добио од анкетара. Свиђа ми се ово питање, јер постоји неколико начина за његово решавање. Начин на који га решавате одражава ваш стил програмирања и помаже анкетеру да процени да ли бисте одговарали тој позицији или не.

Ево примера питања за интервју:

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);

Now, this seems pretty straightforward, right? However, there’s a small trick to this question that I only discovered by coding up my solution and trying to run it. That brings me to the final step!

5. Test your solution using the test cases you came up with earlier

If you’re an experienced programmer, you might easily spot the bug in my solution above. But it wasn’t until I ran my code that I realized I had created a dreaded infinite loop!

Why does this create an infinite loop? The array.length that I was using to know when my for loop would stop was dynamically increasing as I was pushing new elements into the array! So, when the for loop started, array.length was equal to 5. But after the first iteration of the for loop, array.length was equal to 6, and on and on ad infinitum.

However, there is a simple change that will make this solution work:

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) = linear

With this change, I’m declaring a variable called length inside the scope of the function and then using that as the delimiter for my for loop. Even though my array size is now changing, the for loop still stops after the 5th iteration, because the length variable does not change when array.length changes.

Now I can test my code with the edge cases I came up with ealier and see that the results are as expected:

// 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]

Alternate solutions

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

Увек не заборавите да се захвалите анкетару путем е-поште, по могућности до краја истог радног дана када сте разговарали с њима. Чак и ако компанија није ваш најбољи избор, неко је узео времена из свог заузетог распореда да вас интервјуише, па је важно да му захвалите. А ако сте сазнали нешто ново, брза е-пошта са захвалницом одличан је начин да то поновите.

Какво је било ваше искуство са техничким телефонским интервјуима? Да ли их волите? Да ли их мрзиш? Који је најзанимљивији проблем који сте тражили да решите? Оставите коментар испод или ме обавестите е-поштом на јане [ат] фуллстацкинтервиевинг [дот] цом.

Да ли вам се свидео овај чланак? Да ли сте заинтересовани за посао из снова који сте започели у развоју софтвера? Пријавите се за моју маилинг листу.