Я не упоминаю здесь название компании. Упомянутые примеры вопросов фактически не использовались в интервью.

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

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

Подготовка

Обычно я работаю с бэкендом, но я был взволнован этим интервью. Он был настроен за 2 недели, чтобы я мог подготовиться к тому, чтобы быть максимально четким. Я был в порядке со структурами данных. Мне нужно было быть нетронутым. Итак, я начал ежедневный полк, я реализовывал эти структуры данных в Javascript несколько раз каждый день, пока не запомнил реализации:

  • Связанный список (однократно и дважды)
  • Стеки и очереди
  • Двоичные деревья поиска (включая DFS и BFS)
  • Графики (включая DFS и BFS)

Для графиков мне пришлось реализовать DFS и BFS самостоятельно и фактически проверить, работает ли реализация. Мне потребовалось много размышлений и немного жульничества, чтобы узнать, как другие делают это на Java/Python, и применить это к Javascript. Это было весело.

Я реализовал каждую структуру не менее 3 раз в день в своем блокноте. Я запускал код дословно один раз в день, чтобы убедиться, что у меня есть работающий код в моей записной книжке. К концу 2 недель я был чист.

Насколько чисто? Иногда в структурах данных вам нужно вернуться и добавить строку, чтобы настроить следующую строку. Например, при поиске в ширину (BFS) в двоичном дереве поиска вам необходимо сохранить указатель в очереди. Но вы не понимаете, что вам нужен этот указатель, пока через несколько строк. То же самое касается BFS с графом. Я реализовал очередь до того, как она мне понадобилась. Мощность ноутбука!

Я был готов.

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

Интервью

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

На официальном собеседовании он задал мне несколько основных вопросов о HTML, CSS и Javascript. Некоторые из вопросов были книжными (например, назовите каждое допустимое свойство «очистить»), а другие были практическими (например, как бы вы центрировали текст по вертикали в div). Я бы сказал, что у меня как минимум 70/100. Затем последовала задача по кодированию.

(Это более наглядно, не волнуйтесь, вы можете увидеть jsbin в конце)

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

Подождите, это не вопрос о структурах данных. Это обычный вопрос веб-разработчика. Интервьюер напоминает мне, что я могу использовать jQuery. Я ржавый, но я согласен использовать его. Это было очень просто, когда я в последний раз использовал его, верно? 7 месяцев назад...

— Э-э, ладно, я сначала внесу вклад. Затем я создаю кнопку? Затем я помещу его в div. Дай мне спроектировать это, нарисовав это на секунду… Хорошо, мне нужен выходной div. Я получаю ввод с помощью ```$('#output').val```, я думаю. Подождите, я думаю, это метод. Добавить его в DOM с помощью append? Позвольте мне проверить документацию. ```$('document').append('span')``` Это не работает. Подождите, вы хотите сказать, что я могу использовать метод ```html````? Это уязвимо для инъекций? Хорошо, я думаю, что это так…»

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

Подчеркну, что я сделал не так:

  • Я использовал jQuery, хотя был ржавым. Не смущайтесь. Вы знаете, в чем вы лучше всего разбираетесь. Держитесь за свое оружие. В следующий раз я просто буду использовать ваниль, даже если интервьюер предпочитает jQuery. Я заново изучу jQuery, если попаду на другое собеседование.
  • Я намеренно перестал работать над проектами, чтобы сосредоточиться на укреплении своих слабых сторон. Мне никогда не приходилось использовать свои знания структур данных при работе над какими-либо проектами.
  • Вызовом оказались открытые заметки. Даже если бы это был вопрос о структурах данных, я мог бы заглянуть в свои заметки.
  • Я не уточнял у рекрутера формат. Я вообще ничего не спрашивал у рекрутера. Послать электронное письмо. По крайней мере, вы можете сказать, что пытались.
  • Требуется всего 3 недели, чтобы стать очень ржавым во всем. Продолжайте заниматься.

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

После отличного старта я бросил вызов. Я усвоил эти ценные уроки, упустив прекрасную возможность. Надеюсь, вы не сделаете того же.

Кстати, если вам нужен человек, умеющий писать ванильный Javascript, я все еще ищу вакансию!

Бонус с закрытием Javascript!

Интервьюер спросил меня, как бы я реализовал кнопку удаления. Я сказал ему: «Я бы использовал закрытие и поместил обработчик кнопки в закрытие. Я бы сохранил родителя в локальной переменной. Затем, по нажатию кнопки, я удалял родительский элемент через локальную переменную. Таким образом, мы можем создать 100 записей, и каждая кнопка автоматически сопоставляется со своим родительским элементом div».

Он звучал сомнительно. Я не собирался спорить со своим собеседником. Может быть, я должен был? Я все еще не уверен.

Мне довелось использовать замыкания с обработчиками нажатия кнопки удаления в более раннем личном проекте, поэтому я был уверен, что это работает. Я не уверен, как еще можно использовать замыкания. Вот jsbin: http://jsbin.com/zuhoqox/edit?html,js,output

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