Уроки, благодаря которым я получил работу в Amazon и Meta, не имея диплома специалиста по информатике

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

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

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

Отказ от ответственности

  1. Эта статья основана исключительно на моем опыте кандидата, а не на каких-либо внутренних знаниях о процессах интервьюирования. Она основана на моем опыте прохождения собеседований в Amazon, Meta (Facebook), Google & Apple, но я полагаю, что она применима ко многим крупным технологическим компаниям.
  2. Проведите собственное исследование компании и команды до собеседования. Некоторые компании проводят онлайн-сессии, помогающие подготовиться к собеседованию, которые очень полезны для изучения специфики конкретной компании.

1 Перед собеседованием

1.1 Пройдите собеседование, безусловно

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

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

1.2 Построение алгоритмов

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

Для этого существует множество курсов в Интернете. Лично я пользуюсь курсом Princeton Algorithms Course Part 1 & Part 2.

Часть 1

Coursera https://www.coursera.org/learn/algorithms-part1
Youtube https://www.youtube.com/watch?v=9diDWV-fOnE

Вы должны знать большинство алгоритмов из части 1, но сосредоточьтесь на более оптимизированных решениях, таких как quicksort & merge sort.

Часть 2

Coursera https://www.coursera.org/learn/algorithms-part2
Youtube https://www.youtube.com/watch?v=0qF7tPSQdCg и https://www.youtube.com/watch?v=6TW3JSVEJQE

Вам понадобится только несколько тем из части 2, например, графы и попытки.

Также есть шпаргалка из курса здесь https://algs4.cs.princeton.edu/cheatsheet/.

Ваша цель — понять основные идеи из курса, затем вы будете больше практиковаться в кодировании, когда начнете решать проблемы. Постарайтесь не тратить больше 1-2 месяцев на изучение этого курса.

1.3 Практика решения задач

Существует множество сайтов для тренировки решения задач по кодированию, но я нашел наиболее полезным Leetcode, который имеет платную функцию, показывающую точные вопросы, которые задавались в конкретной компании, а также сортировку по наиболее часто задаваемым вопросам, так что вы можете практиковаться с наиболее вероятными & реалистичными вопросами, например: https://leetcode.com/company/amazon/.

Премиум-план Leetcode стоит $35 в месяц, и он понадобится вам только на 1-2 месяца, когда вы будете готовиться. Если это слишком дорого в вашей местной валюте или вы студент, вы можете связаться с Leetcode и спросить, есть ли у них скидки для вашего случая. Многие технологические компании с радостью предложат специальную скидку, даже если они не афишируют это публично.

Важно охватить как можно больше идей проблем, даже если вы думаете о проблеме несколько минут, а затем переходите к просмотру решений. Не думайте слишком долго над проблемами с пометкой «трудные» или проблемами динамического программирования, так как они вряд ли появятся на собеседовании, просто проверьте решение и двигайтесь дальше. Старайтесь кодировать 1 задачу на каждом занятии и думать над несколькими другими задачами, а затем читать их решения. Тренируйтесь думать вслух и рассказывать решение в процессе кодирования.

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

Кроме того, этот хороший сайт будет присылать вам случайные задачи по алгоритмам каждый день https://www.dailycodingproblem.com/.

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

1.4 Отлаживайте свой код БЕЗ его выполнения

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

На собеседовании по решению проблем вы обычно не сможете запустить свой код, а интервьюеры ожидают, что вы сможете просмотреть свой код и найти ошибки. Подумайте об этом, как о просмотре запроса и попытке найти в нем проблемы. Вы должны попытаться найти все ошибки и нестандартные ситуации ДО запуска кода, как вы будете делать это на собеседовании. Ваша цель — пройти все тесты с первого раза. Более подробно о том, как это сделать, будет рассказано ниже.

1.5 Практика проведения интервью

Лучшая практика проведения собеседований — это собеседования. Старайтесь проходить собеседования чаще. Не ждите 4-5 месяцев, чтобы подготовиться перед собеседованием. Провалив собеседование, вы узнаете больше, чем от любой подготовки, а большинство компаний разрешают повторно подавать документы через 6-12 месяцев.

Если вам предстоит важное собеседование в понравившейся компании, постарайтесь устроить перед ним 1-2 собеседования в других компаниях (с аналогичным процессом) в качестве тренировки. Таким образом, вы будете меньше волноваться перед важным собеседованием, а если в итоге получите несколько предложений, у вас будет больше возможностей для ведения переговоров.

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

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


2 На собеседовании

2.1 До кодирования

  • Большинство компаний перешли от досок к редактору кода для проведения интервью по кодированию. Если у вас есть выбор, я рекомендую использовать текстовый редактор, так как в нем гораздо проще и быстрее вносить изменения в код, чем на доске.
  • Если у вас есть выбор, какой язык программирования использовать, выбирайте тот, с которым вам удобнее всего работать. Вы хотите сосредоточиться на решении проблемы, а не на запоминании синтаксиса. Если вы знаете несколько языков, выбирайте тот, на котором быстрее писать. Например, работать со списками и картами проще на JavaScript или Python, чем на Java.
  • Задавайте вопросы, чтобы прояснить проблему и подтвердить свое понимание.
  • Спросите о форматах ввода и вывода, а также о допустимых диапазонах.
  • Упомяните все сделанные вами предположения (не думайте, что деревья являются деревьями двоичного поиска или сбалансированными).
  • Нарисуйте/решите проблему устно с некоторыми примерами для подтверждения ваших идей.
  • Кратко упомяните неоптимальные решения, но постарайтесь придумать более эффективное решение, прежде чем приступать к коду.
  • Укажите ожидаемую пространственную и временную сложность вашего решения и если есть ограничения на сложность, например: если вы должны проверить все элементы массива, сложность не может быть ниже O(n). Убедитесь, что вы включили в сложность такие шаги, как сортировка или копирование списков.
  • Подумайте о возможных сценариях предварительной обработки, которые могут оптимизировать общее решение, например, сортировка массива перед обходом.
  • Некоторые задачи могут быть оптимизированы путем мутации входных данных, спросите у интервьюера, допустимо ли такое решение.
  • Не начинайте кодирование, пока вы и интервьюер не почувствуете, что решение приемлемо.

2.2 Во время кодирования

  • Набросайте скелет решения с комментариями, это не позволит вам забыть какой-либо шаг и поможет интервьюеру следить за ходом работы.
  • Пишите правильный код, а не псевдокод. Незначительные синтаксические ошибки обычно не являются проблемой.
  • Применяйте все лучшие практики языка, который вы используете. Покажите интервьюеру, что вы можете писать чистый, удобный в обслуживании код.
  • Если вы используете необычный язык или язык, который не используется в компании, объясните все используемые вами дополнительные возможности языка, с которыми интервьюер может быть не знаком.
  • Разделите код на более мелкие функции с выразительными именами, чтобы прояснить замысел и облегчить тестирование. Возможно, вам не придется реализовывать некоторые небольшие функции, если на собеседовании будет сказано, что они не важны, что может сэкономить вам время.
  • Объясняйте свое решение и решения по ходу написания кода. Подумайте, какая альтернатива дает более точное решение, является ли это решение мнением или общим?
  • Оставьте // TODO для валидации ввода и других некритичных шагов, если вы не хотите тратить на них время изначально. Интервьюер заметит ваше внимание к этим деталям.
  • Используйте четкие и выразительные имена переменных, чтобы помочь интервьюеру понять и помочь себе избежать ошибок. Вместо имен типа i или j используйте что-то вроде currentBookIndex.
  • Используйте переменные для доступа к массивам, чтобы прояснить смысл, например: currentCell = grid[rowIndex][columnIndex].
  • Подумайте о ранних условиях возврата и оптимизации.
  • Для большинства проблем решение не должно быть слишком длинным или слишком сложным. Если ваш код превышает ~30 строк и имеет несколько ветвей if/else, попробуйте переосмыслить его.
  • Если вы застряли, подумайте вслух и попробуйте нарисовать свои мысли на бумаге. Слушайте интервьюера, если он дает подсказки, он не обманет вас.
  • Упоминайте о любых ограничениях или потенциальных оптимизациях. Вы можете оставить комментарии, чтобы вернуться к ним позже, если у вас будет время.

2.3 После кодирования

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

  • Пробегитесь по коду устно. Внимательно читайте реальный код, который вы написали, а не то, что, как вам кажется, вы написали. Забудьте о том, что вы написали код, и изучайте его так, будто это мусорный код, который какой-то идиот опубликовал на Stack Overflow. Вы предвзято считаете, что ваш собственный код не содержит ошибок, и нужно приложить усилия, чтобы побороть это предубеждение. Если вы не можете найти 1-2 ошибки, значит, вам нужно постараться еще больше.
  • Ищите специфические части кода, которые обычно вызывают ошибки, например: ошибки в циклах, математические вычисления, условия выхода из рекурсии, что если цикл не имеет элементов, что если стек/очередь становится пустым, что если входные данные равны null, пустой входной массив, массив из 0/1/2 элементов, входные данные с дубликатами, 0 или отрицательные числа, …
  • Убедитесь, что сложность пространства и времени соответствует вашим ожиданиям.
  • Спросите интервьюера, нужно ли вам придумывать тестовые примеры для кода. Перечислите тестовые случаи со всеми различными сценариями, как если бы вы писали модульные тесты для своего кода.
  • Спросите интервьюера, нужно ли вам проследить код с помощью тестовых примеров. Выберите небольшой, но не прямолинейный тестовый пример для трассировки и отладки кода на бумаге/картоне. Пройдитесь по коду строка за строкой, отслеживая значения переменных, найдите ошибки и при необходимости измените код.

Заключительные замечания

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

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

Оцените статью
Procodings.ru
Добавить комментарий