Почему вы должны прочитать это руководство?

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

Получение работы в компании FAANG (Facebook, Amazon, Apple, Netflix, Google) может дать вам, среди прочего, следующие преимущества:

  • Отличная компенсация
  • Фантастическая рабочая среда
  • Сложная работа
  • Умные коллеги
  • Впечатляющее резюме

Я сделал это и могу сказать, что оно того стоило.

Это не будет очередное руководство «Как пройти собеседование в Google», перефразирующее одни и те же общие советы: усердно учитесь, практикуйтесь, расслабляйтесь и хорошо высыпайтесь за день до собеседования. Это основано на многолетнем опыте как кандидата, так и интервьюера.

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

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

Отсутствие работы в компании FAANG (Facebook, Amazon, Apple, Netflix, Google) не означает, что вы плохой разработчик. Это только означает, что вы еще не взломали интервью. Продолжайте читать, если хотите получить пошаговое руководство о том, как подготовиться к получению этой работы.

Контур

Это то, что я расскажу в этой статье:

  • Правильный настрой до, во время и после собеседования
  • Как практиковаться в решении задач кодирования
  • Требуются технические знания
  • Книги и веб-сайты, которые я использовал
  • Ошибки, которых следует избегать до и во время собеседования
  • Примеры

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

Как приготовиться

Разработчики компаний FAANG не боги. Они обычные люди, которые прошли через тот же процесс, что и вы, со своими проблемами и неуверенностью. Еще они страдали синдромом самозванца — наверное, до сих пор этим страдают. Не ставьте их на пьедестал. Всегда помните об этом, особенно когда вы получаете работу.

Образ мышления

Я встречал интервьюеров, которым нравилось мучить кандидатов. Некоторые интервьюеры не нанимали некоторых из своих товарищей по команде. К счастью, их меньшинство, но вы можете столкнуться с одним из них во время интервью. Единственный разумный выход — сосредоточиться на том, что вы можете контролировать: на своей подготовке. Сосредоточьтесь на процессе. Если вы хорошо подготовитесь и проявите настойчивость, получение желаемой работы станет вопросом времени. Оказавшись там, вы сможете легко перейти в другую компанию, если захотите.
У вас будет 4, 5 или 6 раундов задач, которые помогут вам, если вы потерпите неудачу в одном или найдете еще один психо-интервьюеров, о которых я говорил ранее. Вы можете проиграть в одном из раундов и все же получить работу.

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

  • Что прошло хорошо?
  • Где мне нужно улучшить?

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

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

Люди в конце концов уходят из этих компаний, будь то через 1, 2, 3 или 5 лет. Это не рай, просто еще одна работа, но этому я не могу вас научить. Вы должны увидеть это сами.

Как практиковать

Имитируйте настройку интервью

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

Время себя

В зависимости от компании у вас будет около одного часа, чтобы решить проблему. В Amazon, например, этот час включает вопросы, связанные с принципом лидерства, что сокращает время на технический вопрос примерно до 40–45 минут.

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

Никаких отвлекающих факторов

Отключите звук телефона. Нет музыки. Нет интернета. Вы хотите, чтобы ваши практические занятия были максимально реалистичными.

Если вы застряли, продолжайте пробовать. Не сдавайтесь.

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

Подумайте вслух

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

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

Расширьте свой набор инструментов

Запишите все новое, чего вы не знали. Функции, которые вы никогда не видели, крутые трюки, новые концепции и т. д. Часто просматривайте этот список, пока они не станут частью вашего арсенала и не станут естественными, когда вы решаете проблемы самостоятельно.

Например, вот трюк, чтобы перебрать всех соседей (по горизонтали и вертикали) ячейки в матрице с координатами (строка, столбец):

const vector<vector<int>> dirs = {{1,0}, {-1,0}, {0, 1}, {0, -1}};
for (const auto& d:dirs) {
  const nextRow = row + d[0];  
  const nextCol = col + d[1];
}

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

Ведите журнал типичных ошибок, которые вы совершаете

Это одна из вещей, которая сильно повлияла на мое выступление. Вам нужно знать, где вы обычно неэффективны, чтобы вы могли это исправить. Это может быть что угодно: Big (O), задачи динамического программирования, рекурсивные функции, задачи, связанные с деревьями и т. д.

Часто просматривайте этот список. Просмотрите их и потренируйтесь, чтобы убедиться, что вы не повторяете их во время собеседования.

Итерации

Насколько я понимаю, в вашей подготовке есть два этапа.

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

Этап 1

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

  • Какой алгоритм и/или структура данных подходят для такого типа задач?
  • Почему?
  • Почему этот другой подход хуже или неверен?
  • Какова временная и пространственная сложность этого подхода?
  • Могу ли я обменять время на пространство?

Речь идет не о запоминании решений. Я повторяю. Не запоминайте решения. Это бесполезно и хуже, чем пустая трата времени. Полагаться на него — значит покупать билет, чтобы дать идеальное решение неправильной проблемы. Идея здесь состоит в том, чтобы научиться применять все структуры данных и алгоритмы, которые вы изучили. Применение теории на практике.

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

  • Задавайте уточняющие вопросы
  • Убедитесь, что я понимаю, каковы входные и ожидаемые выходные данные
  • Придумайте пошаговый план решения проблемы комбинирования (примеры есть в конце этого руководства)
  • Большой (О) анализ

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

Если во время собеседования вы не можете пройти этот этап, не имеет значения, насколько хорошо вы владеете Python. Ты вне игры.

Этап 2

Теперь вы можете сосредоточиться на написании кода для проблем, которые вы «уже решили». Некоторые советы:

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

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

Вы не можете позволить себе потратить 5 минут на написание цикла while. Вы должны быть в хорошей форме кодирования. Будьте очень удобны в предпочитаемом вами языке программирования (обычно вы можете выбрать его). Чем лучше вы знаете язык и чем более свободно владеете им, тем больше времени у вас будет во время интервью, чтобы сосредоточиться на реальной проблеме, которую вам нужно решить, и донести свои мысли до интервьюера.

Технические знания

То, что вы должны знать

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

Структуры данных

Теоретически и как их использовать в коде

  • Массивы
  • Струны
  • Списки
  • Стеки и очереди
  • Деревья (и попытки)
  • Бинарные деревья поиска (сбалансированные)
  • Хэш-таблицы
  • Наборы (также непересекающиеся наборы, если можете)
  • Графики

Алгоритмы

  • Бинарный поиск
  • Сортировка
  • Рекурсия
  • Разделяй и властвуй
  • Динамическое программирование
  • Жадный
  • Алгоритмы на строках

На графиках (очень важно):

  • ДФС
  • БФС
  • Минимальные остовные деревья: Kruskal и Prim
  • Кратчайший путь: Дейкстра и Флойд-Уоршалл

Немного дискретной математики тоже может помочь.

Языки программирования

Я всегда использовал C++, но для интервью также хороши следующие:

Так как большинство интервьюеров знают их. Большинство кандидатов предпочитают Python. Что бы вы ни выбрали, убедитесь, что вы хорошо его знаете.

Дополнительные ресурсы

Курсы MIT по алгоритмам

Этот курс — хорошее введение в большинство понятий, которые вам понадобятся на собеседовании.

Введение в алгоритмы

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

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

Элементы интервью по программированию

Это отличная книга. Я постоянно возвращаюсь к ней перед каждым интервью. Вопросы сложные, так что вы будете очень хорошо подготовлены. Существуют версии C++, Python и Java.

Взлом интервью по кодированию

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

Для большего количества задач я использовал только Leetcode. У вас будет более чем достаточно бесплатных задач.

Ошибки, которых следует избегать

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

1. Не готовиться

да. Люди идут неподготовленными. Я видел много людей, пустых во время интервью. Мне приходилось прерывать интервью через 20 минут. Это случается чаще, чем вы думаете.

Напоминаем, что вы должны быть хороши в следующем:

  • Алгоритмы
  • Структуры данных
  • Язык(и) по вашему выбору
  • Основы КС

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

2. Не сообщать, что вы думаете

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

3. Не задавать уточняющих вопросов

Вопросы будут намеренно расплывчатыми. Убедитесь, что вы изложили все свои предположения до начала решения проблемы. Например:

  • Отсортирован ли ввод?
  • Есть ли повторяющиеся элементы?
  • Если нет решения, что я должен вернуть?
  • Нужно ли проверять недопустимые входные данные?
  • Сколько пользователей мы ожидаем?
  • Компромиссы: увеличить пространство, чтобы быть быстрее?

4. Решение неправильной проблемы

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

5. Трата времени

Если вы не помните API, просто скажите: «Предположим, функция такая» и продолжайте. Вы можете предположить, что у вас есть функция, которая вам нужна, а затем вернуться к ней и подробно описать ее. «Несовершенное» решение лучше, чем ничего.

6. Не тестировать свой код

Это огромный красный флаг, поэтому убедитесь, что вы не потерпите неудачу здесь. Придумайте несколько тестовых случаев (сам код писать не нужно):

  • «Счастливый путь»
  • Пограничные случаи
  • Пустой/нулевой ввод
  • Повторяющиеся элементы

7. Не отлаживать

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

8. Плохой анализ времени и пространства

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

9. Поиск оптимального решения

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

Оттуда попытайтесь найти узкие места и найти эффективное решение (обычно с использованием другой структуры данных или после сортировки ввода). Это лучше, чем не иметь ничего в конце интервью, потому что вы пытались найти решение O(1).

10. Недостаточно свободно говорите на выбранном вами языке

Обычно вы можете выбрать язык программирования, который хотите, на собеседовании. Если вы говорите, что можете программировать на Python, JavaScript или Java, убедитесь, что вам не нужно 3 минуты, чтобы написать цикл for (я видел это много раз). Это не конец света, если вы забудете детали API или точку с запятой.

11. Пограничные случаи

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

12. Некачественный код

Пишите чистый код. Не только для интервью. Хорошее название, короткие функции, которые делают одну вещь и т. д. Читайте Code Complete или Clean Code. Это повысит качество вашего кода.

13. «Взломать» ошибки

Если вы обнаружили ошибку в своем коде (например, неверную ошибку), не пытайтесь взломать правильный код. Найдите минутку, чтобы прочитать то, что вы написали, а не то, что, как вам кажется, вы написали. Запишите несколько небольших примеров и попытайтесь найти на их основе решение. Будьте систематичны. Мы оцениваем и это, а не только конечный результат.

14. Прыжок прямо в код

НЕ сразу приступайте к написанию кода.

  1. Решить проблему «вручную».
  2. Объясните свое решение
  3. Проанализируй это (в Big O)
  4. Найдите узкие места и попытайтесь придумать что-то более эффективное

После всего этого можно приступать к кодированию.

15. Недостаточно хорошо распоряжаться пространством

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

16. Просьба оставить отзыв в конце

Не просите оставить отзыв в конце интервью. Интервьюеры не могут дать вам обратную связь (обычно существуют политики компании, запрещающие это), и это производит очень неприятное впечатление: неуверенность и неспособность оценить вашу работу.

Примеры

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

Пример 1

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

Решение

Это очень простая задача, но ее достаточно, чтобы сосредоточиться на процессе. Что приходит на ум:

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

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

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

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

Обычно сортировка и хеш-таблицы могут упростить многие проблемы. Это одна из них.

Вы можете попробовать решить эту проблему здесь.

Пример 2

Имея двухмерную карту сетки «1» (суша) и «0» (вода), подсчитайте количество островов. Остров окружен водой и образован путем соединения соседних земель по горизонтали или вертикали. Вы можете предположить, что все четыре края сетки окружены водой.

Решение

Мысли:

Подсчитайте количество островов. Мне нужен счетчик (очевидно)

2D карта сетки:

  • Могу ли я смоделировать это как график? Я знаю БФС и ДФС
  • Острова соединены горизонтально (та же строка) или вертикально (тот же столбец), а не по диагонали.
  • Я могу посетить остров только один раз, поэтому мне нужен какой-то механизм, чтобы не учитывать один и тот же остров дважды. Например, измените «1» на «0» (будь то в матрице, которую мы получаем, или в копии, которую мы создаем, если мы не можем изменить ввод) или набор хэшей, в котором вы храните пару индексов, которые определяют посещенные ячейки. Я бы выбрал первый вариант, но лучше знать второй, так как его можно использовать в других задачах.

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

Убедитесь, что вы рассматриваете случай пустой матрицы, матрицы, полной «0» — ноль островов, заполненной «1» — только 1 остров — и другие тестовые случаи. Что произойдет, если вы увидите «2» при сканировании матрицы? Это также следует обсудить с вашим интервьюером, как и любое другое предположение. В случае сомнений лучше высказать свои мысли.

Вы можете закодировать это? Попробуйте здесь.

Вывод

Как вы видели, здесь мало кода. Это потому, что написание кода происходит только после обдумывания и анализа проблемы. Превратить его в код — это простая часть (очевидно, что это зависит от проблемы). Кроме того, вы можете увидеть, как я следовал процессу, описанному в предыдущем разделе: прояснить проблему, придумать решения, пообщаться с воображаемым интервьюером, продумать крайние случаи и т. д. Это то, что вы должны делать, пока она не станет второй. природа.

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

Первоначально опубликовано на https://www.yourdevopsguy.com 27 сентября 2020 г.