Как потерять работу в сфере IT за 10 минут

NOP
NOP::Nuances of Programming
8 min readAug 8, 2018

Перевод статьи Albino Tonnina: How to Lose an IT Job in 10 Minutes

Недавно я был очень близок к тому, чтобы получить работу в одной из пяти крупнейших IT компаний. Я прошел первоначальный отбор кандидатов и тестовое задание, но, к сожалению, ряд собеседований меня подвел:

  • Whiteboard-собеседование: спрашивали про алгоритмы
  • Техническое собеседование: спрашивали про JavaScript, CS, React
  • Оценка ценностей персонала (culture fit): простой психологический тест
  • Второе Whiteboard-собеседование: расскажу как-нибудь в другой раз

Все пошло не так

Что же, признаюсь, я допустил несколько ошибок, которые, в свою очередь, привели меня к полному провалу.

С техническим и психологическим собеседованиями никаких проблем у меня не возникло. А вот с Whiteboard-собеседованием у меня с самого начала не заладилось и в итоге я его провалил.

Если вспомнить тот злополучный день — другого результата я и не ожидал.

Правда заключается в том, что в тот момент я был совершенно не готов к прохождению Whiteboard-собеседования.

Whiteboard- собеседование

Whiteboard- собеседование — это, в некотором роде, гибрид из технического собеседования и психологического упражнения.(ресурс)

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

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

В любом случае, что эти собеседования могут рассказать о кандидате?

Кто-то когда-то сказал:

В реальной жизни, вы, наверняка, редко ни с того ни с сего пытаетесь вспомнить давно забытый алгоритм и без всякой подготовки реализовать его, в середине процесса написания кода. Скорее всего, вы используете библиотеку алгоритмов, проверенную годами.

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

Мое мнение, как правило, совпадает с одним из вышеупомянутых анонимных авторов, хотя мне и нравится думать, что у Whiteboard- собеседования есть свои плюсы.

Сначала поговорим о смягчающих обстоятельствах

Я сделал этот список, потому что, кто-то из вас, возможно, тоже может с этим столкнуться.

  • Собеседование проходило не на моем родном языке. Находясь в самом центре внимания, было легко забыть нужные слова.
  • Я разработчик-самоучка. Мне не хватает академической подготовки.
  • В моей карьере было не так уж и много собеседований, тем более по типу Whiteboard.
  • Я редко выступаю на публике. Точнее, именно на данный момент редко.

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

Я попытаюсь мысленно пройти то проваленное Whiteboard- собеседование так, как должен был его пройти в тот день, а весь процесс опишу в этой статье.

Задача

['Tokyo', 'London', 'Rome', 'Donlon', 'Kyoto', 'Paris']
// YOUR ALGORITHM
[
[ 'Tokyo', 'Kyoto' ],
[ 'London', 'Donlon' ],
[ 'Rome' ],
[ 'Paris' ]
]

Вот и все.

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

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

В общем-то, да.

Теперь притворимся, что в тот день все пошло иначе.

Идеальное Whiteboard- собеседование

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

Я: Большое спасибо, я с превеликим удовольствием решу эту задачу для вас.

Я: Первый вопрос — буквы можно просто менять местами или перемешивать как угодно?

Ларри (Ради конфиденциальности, я поменял настоящие имена интервьюеров на вымышленные): Просто менять местами. Первую букву с последней и т.д. По одной за раз.

ВАЖНОЕ ПРИМЕЧАНИЕ

Несколько людей в комментариях предложили свой способ решения этой задачи. Огромное вам спасибо, когда-нибудь я все их просмотрю и что-нибудь с ними сделаю :) Но смысл статьи не в том, чтобы получить самое эффективное решение. Обратите, пожалуйста, внимание на мой последний вопрос, заданный интервьюеру. Многие пропускают тот факт, что буквы меняются местами по одной за раз. Этого недостаточно для того, чтобы применять методы .split и .sort. Если вы пропустите вышеупомянутый факт, такие комбинации, как tokyo и yookt будут соответствовать, а они не должны. Tokyo соответствует только: okyoT, kyoTo, yoTok, oToky. Видите? 5 букв, 5 возможных комбинаций. Теперь продолжим.

Я: Хорошо.

Ларри: Хорошо.

Я: Хорошо! Для начала мне нужно поменять местами буквы в каждом из предложенных городов. Tokyo станет okyoT, затем kyoTo. Окей, в дальнейшем я воспользуюсь function.

Я: Также мне понадобится какой-то способ, чтобы перебирать входящие (input) города, менять местами буквы, сопоставлять города, и наконец группировать их вместе. Я вижу, что исходящие и выходящие (output) города являются массивами и содержат одни и те же значения. Единственное отличие — в размерности двух массивов, плоского массива и массива массивов.

Все еще я: Сейчас я собираюсь написать псевдокод, чтобы проверить свои предположения. 😏

function groupCitiesByRotatedNames(cities) {
// use a variable to contain the output.
let output = [];
// loop through each of the cities
// rotate the name in any possible combination
// check if the output contains a city that matches a combination
// add that city to the array containing the match
// otherwise add the city to the output as a new array
return output;
}

Я, уверенный в себе как никогда: Теперь псевдопротестируем мой псевдокод (😛).

const input = ["Tokyo", "London", "Rome", "Donlon", "Kyoto", "Paris"];
console.log(groupCitiesByRotatedNames(input));
// That's how it would build up. The final output would be the last array:
// [
// ["Tokyo"]
// ]
// [
// ['Tokyo'],
// ['London']
// ]
// [
// ['Tokyo'],
// ['London'],
// ['Rome']
// ]
// [
// ['Tokyo'],
// ['London', 'Donlon'],
// ['Rome']
// ]
// [
// ['Tokyo','Kyoto'],
// ['London', 'Donlon'],
// ['Rome']
// ]
// [
// ['Tokyo','Kyoto'],
// ['London', 'Donlon'],
// ['Rome'],
// ['Paris']
// ]

Приступим к реализации данного алгоритма.

Во-первых, создадим функцию утилиты для перестановки букв имен городов:

Я: Давайте сделаем функцию более плавной (и менее читаемой). Моя самоуверенность достигла своего пика.

Я: Отлично! Мне нравится метод reduce, я буду использовать его и дальше.

Метод reduce() позволяет вызвать функцию обратного вызова один раз для каждого элемента массива в порядке возрастания индекса (слева-направо).(Источник)

Итак, подведем итог тому, что делает этот алгоритм:

Мы проверяем каждый город в массиве, чередуем названия и сопоставляем каждую комбинацию со значением аккумулятора. Если мы находим совпадение, тогда добавляем полученный город в массив с совпадениями (с функцией array.splice), в противном случае создаем новый массив, содержащий наш город.

И вуаля:

Теперь все на месте!

По ссылке вы найдете код, размещенный на Github.

Да, решение получилось не самым изящным, но это то, что пришло мне в голову в тот день. Вы, в свою очередь, можете решить эту задачу с помощью алгоритма линейной сложности O(n).

Мое реальное Whiteboard-собеседование

Я решил: хорошо, для решения мне нужен reduce метод. Я сразу же подошел к доске, чтобы написать код, не имея никакого общего плана ни по решению задачи, ни по моему выступлению в целом. На самом деле, у меня действительно было общее представление по решению задачи, которое я написал в предыдущей главе, но я не сформулировал свой ответ: я не смог объяснить свое решение интервьюеру. В итоге, я потерялся в собственном коде и несколько раз потерял ход своих мыслей. Свой код я писал в неудачном сочетании реального и псевдокода — что привело к появлению нескольких синтаксических ошибок и у меня просто не было шансов переломить всю сложившуюся ситуацию. В совокупности, все эти ошибки и недочеты могут нанести огромный ущерб вашему успешному прохождению собеседования. Особенно, если вы не сможете все это вовремя исправить.

Что мне теперь делать

Практиковаться, практиковаться и еще раз практиковаться.

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

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

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

Мой примерный план на собеседование:

  • Я потрачу некоторое время на изучение требований и условий задачи (примерно 1 минуту)
  • Если будет необходимо, то задам несколько вопросов интервьюеру и, возможно, выслушаю ответы (примерно 3 минуты)
  • Сделаю небольшую паузу и начну думать над решением самой задачи (этот процесс может занять у вас некоторое время — не бойтесь долго молчать)
  • Поделюсь своим предварительным решением с интервьюером и выслушаю его комментарии (примерно 5 минут)
  • Снова сделаю небольшую паузу и еще раз все проанализирую (примерно 2 минуты)
  • Начну писать псевдокод (примерно 5 минут)
  • Перепроверю псевдокод (примерно 5 минут)
  • Закончу тем, что преобразую свой псевдокод в настоящий (если в этом будет необходимость)

Таким образом, примерно за 30 минут я справлюсь с поставленной задачей в удобной и скоординированной форме.

Заключение

PS

В этой статье началась интересная дискуссия в комментариях на эту тему: https://dev.to/albinotonnina/how-to-lose-a-it-job-in-10-minutes-35pi

Ресурсы

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

Она сказала:

После нескольких собеседований я составила целый список ресурсов, которые могут помочь вам с успешным прохождением собеседования. Сам список составлен в порядке приоритетности ресурсов: сначала идут книги, затем список сайтов и затем список курсов. А вот и сам список:

Книги:

  1. Cracking the coding interview
  2. Introduction to Algorithms
  3. Programming Interviews Exposed
  4. Clean code
  5. Algorithm Design Manual
  6. How to Think About Algorithms
  7. Programming Pearls
  8. Data Structures And Algorithms Made Easy In Java 2nd Edition 2nd Edition

Веб-сайты:

  1. InterviewBit
  2. HackerRank
  3. Codewars
  4. Codefights
  5. AlgoExpert
  6. CarrerCup
  7. Interview Cake
  8. LeetCode
  9. Geeks for geeks
  10. Pramp
  11. HackerEarth
  12. HiredInTech

Кусры:

  1. Coderust 2.0

Спасибо за прочтение!

И спасибо Адаму Макинтошу и Джошу Комо за приведенные доказательства в пользу этой статьи!

--

--