Технические экраны телефонов - важный шаг в процессе технического собеседования. Часто от того, пройдете вы или нет, технический экран телефона будет определять, будете ли вы приглашены на собеседование на месте.

Технические экраны телефонов могут быть сложными, потому что вы должны думать вслух, работая над проблемой, не имея возможности лично присутствовать на собеседовании. Когда вы проводите собеседование с кем-то по телефону или по видео, вам может быть трудно передать все ваше присутствие. Обычно вы работаете в общем редакторе, поэтому, пока вы работаете над проблемой, интервьюер сможет только слышать вас и видеть, что вы набираете. Многим людям сложнее общаться таким образом, чем при личной встрече.

Хорошая новость заключается в том, что технические экраны телефонов - это то, что вы можете практиковать и совершенствоваться. Как и в случае с любым другим навыком, чем больше вы их применяете, тем лучше вы становитесь. Со временем вы начнете видеть результаты, так как вас будут приглашать на собеседование на месте с все большим количеством компаний.

Хотя все технические собеседования по телефону разные, большинство из них потребует от вас думать на ногах. Итак, лучший способ подготовиться - это просто попрактиковаться в работе с вопросами. Вы можете пройти их самостоятельно, выговорив их, а также можете потренироваться с другом. Если вы тренируетесь самостоятельно, вы можете даже записать себя, чтобы прослушать запись и посмотреть, имеет ли смысл то, как вы объяснили свой мыслительный процесс.

Наконец, вы можете попрактиковаться на собеседовании с компаниями! Когда я в последний раз проходил собеседование на новую должность, я начал с поиска компаний, которые мне были интересны, но не расстроился бы, если бы не прошел технический экран телефона. Таким образом, я все еще чувствовал давление, чтобы подготовиться, но я ожидал, что сначала несколько раз проиграю. Тогда было меньше разочарований, когда я не перешел к следующему этапу.

В этом посте я рассмотрю вопрос, который я получил на экране технического телефона, чтобы дать вам основу для подхода к этим типам собеседований. Я надеюсь, что это будет полезно, и приветствую ваши комментарии и отзывы!

Давайте погрузимся.

Вопрос

Это был актуальный вопрос, который я получил от интервьюера. Мне нравится этот вопрос, потому что есть несколько способов его решить. То, как вы ее решаете, отражает ваш стиль программирования и помогает интервьюеру оценить, подходите ли вы для этой должности.

Вот образец вопроса для собеседования:

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]

ВРЕМЯ РАБОТЫ: O (n) = линейный

С этим изменением я объявляю переменную с именем length внутри области действия функции, а затем использую ее в качестве разделителя для моего цикла for. Несмотря на то, что размер моего массива теперь меняется, цикл for по-прежнему останавливается после 5-й итерации, потому что переменная длины не изменяется при изменении array.length.

Теперь я могу протестировать свой код с крайними случаями, которые я придумал раньше, и убедиться, что результаты такие, как ожидалось:

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

Альтернативные решения

Вышеупомянутое - один из способов решить этот вопрос, но есть и пара других альтернатив. Помните, когда я задавал вопрос выше, предлагая вызвать функцию, написав что-то вроде myArray.double()? Если вы знакомы с объектно-ориентированным программированием, вы можете узнать этот синтаксис. В этом случае общая идея состоит в том, что вы фактически добавили бы метод массива с именем double, используя цепочку прототипов, который затем можно было бы вызвать.

Вот пример того, как я мог бы сделать это, используя структуру цикла for из моего исходного решения:

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]

Определяя функцию с помощью цепочки прототипов JavaSacript, мне фактически не нужно ничего передавать в нее, потому что у меня есть доступ к массиву, в котором метод вызывается с this. Чтобы узнать больше о ключевом слове this, прочтите Документы MDN.

Эти решения прекрасны, но как насчет ответа на этот вопрос без использования цикла for? Один из способов - использовать встроенный метод JavaScript forEach. Это та же идея, что и цикл for, но вместо того, чтобы сообщать программе, как выполнять наш код (императивное программирование), мы собираемся сообщить ей, каков результат (декларативное программирование). Вы можете узнать больше об императивном и декларативном программировании здесь.

Вот пример того же решения с использованием 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]

ВРЕМЯ РАБОТЫ: O (n) = линейный

Наконец, вот еще одно решение этой проблемы, которое я нашел с помощью нескольких быстрых поисков в Google.

Существует также встроенный метод массива под названием concat, который вы можете использовать:

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]

ВРЕМЯ РАБОТЫ: O (n) = линейный

ПРИМЕЧАНИЕ. Если вы задаетесь вопросом о поиске в Google на экране телефона, вот мой вывод после участия в более чем дюжине технических экранов телефонов: обычно это вполне приемлемо.

Технические экраны телефонов часто рассчитаны на от 45 минут до 1 часа. Часть этого времени отводится интервьюеру, чтобы задать вопросы о вашем опыте, а часть времени отводится вам, чтобы задать вопросы. Время, которое вы тратите на кодирование, может составлять от 30 до 45 минут в зависимости от компании и интервьюера.

Во многих случаях ваш интервьюер сможет помочь вам быстрыми советами и небольшими подсказками, если у вас есть общее представление о том, как что-то делать, но вам нужно изучить детали. Например, однажды у меня был интервьюер, который знал, какое регулярное выражение мне нужно для выполнения определенной функции, поэтому мне не нужно было тратить время на его выяснение. Это позволило продолжить интервью более гладко.

Тем не менее, у меня также был опыт, когда интервьюер просил меня реорганизовать исходное решение другим способом и недвусмысленно заявлял, что можно искать документацию. Обычно это так, потому что многие разработчики ежедневно тратят время на чтение или ссылки на документы. Возможность следовать той же схеме на телефонном собеседовании по техническим вопросам - хороший знак.

Однако поиск решения в Google во время собеседования также может занять много времени, особенно если вы ищете не только правильную фразу (именно здесь, чем больше вы будете искать, тем лучше вы станете).

В этом конкретном примере, если бы я уже знал о методе concat в JavaScript, он мог бы прийти в голову, когда я столкнулся с этой проблемой. Тогда было бы приемлемо погуглить, чтобы напомнить себе о том, как работает concat.

Но если бы я вместо этого потратил время на поиски в Google способов удвоения массива, прежде чем даже попытался бы решить проблему самостоятельно, это могло бы стать красным флажком для интервьюера. Технические экраны телефонов - это хороший способ для интервьюера понять, как вы думаете, и это действительно зависит от того, что они ищут с точки зрения должности, на которую они нанимают.

С другой стороны, некоторые компании прямо сообщают вам, что вам не разрешено использовать Google для получения помощи, поэтому в таких случаях лучше не делать этого. Конечно, если вы в чем-то не уверены, спросите своего интервьюера.

Заключение

Почему я показываю вам все эти примеры? Как видите, не существует единственного способа решения этой проблемы. Есть несколько подходов, которые вы можете использовать, и то, как вы подходите к проблеме, все зависит от сочетания вашего опыта и того, как вы думаете о решении проблем. Что касается меня, я часто склоняюсь к циклам, так как for циклы были одной из исходных концепций программирования, которые я изучил. Но тот, кто раньше использовал concat, может подумать об этом сразу же.

Я подумал, что эта проблема была хорошим примером, потому что сначала она кажется относительно простой. Однако есть способы запутаться (как вы видели с моим бесконечным циклом выше), и есть несколько решений, которые демонстрируют различные уровни конкретных знаний. Тем не менее, вы также можете решить эту проблему с помощью твердой идеи, написанной в псевдокоде и с помощью Google.

Имейте в виду, что вы не всегда будете проходить технические собеседования по телефону, но чем больше вы их проведете, тем лучше у вас получится. И, если вы узнали что-то из интервью, даже если это было что-то незначительное, это, вероятно, того стоило.

Последний совет

Всегда не забывайте благодарить своего собеседника по электронной почте, желательно до конца того же рабочего дня, когда вы с ним беседовали. Даже если компания не является вашим лучшим выбором, кто-то нашел время в своем плотном графике, чтобы взять у вас интервью, поэтому важно поблагодарить их. И, если вы узнали что-то новое, быстрое письмо с благодарностью - отличный способ повторить это.

Каким был ваш опыт проведения технических телефонных собеседований? Ты их любишь? Вы их ненавидите? Какая проблема была самой интересной, которую вас попросили решить? Оставьте комментарий ниже или дайте мне знать, написав мне по электронной почте jane [at] fullstackinterviewing [dot] com.

Тебе понравилась эта статья? Вы заинтересованы в том, чтобы получить работу своей мечты в области разработки программного обеспечения? Подпишитесь на мою рассылку.