Вы решали задачи на LeetCode, но не чувствуете, что на самом деле становитесь лучше и увереннее на собеседованиях? Чувствуете, что можете придумывать решения, но никогда не доходите до оптимального? У вас не хватает времени, чтобы закончить задачу? Вам постоянно трудно решать сложные задачи (относящиеся к категории hard)?
Как бывший инженер-программист, а ныне тренер по карьере и собеседованиям, многие из моих клиентов сталкивались с этой проблемой на протяжении многих лет. И если бы вы были моим клиентом, я бы сказал вам, что проблема не в том, что вы недостаточно умны. И дело не в том, что вы недостаточно усердно работаете.
Скорее всего вы просто не правильно тренируйтесь.
Может быть, вы работали с Blind 75. Или, может быть, вы просто используете примеры задач из Cracking the Coding Interview. Вы можете брать задачи откуда хотите, мне все равно. Если вы используете неправильную стратегию, она не очень вам поможет, независимо от того, сколько вопросов вы практикуете.
Любой, кто занимался тяжелой атлетикой в тренажерном зале, знает, что хорошая форма и гибкость необходимы. Эти элементы необходимы для получения максимальной отдачи от тренировки. Точно так же вам нужно практиковать хорошие методы решения проблем, когда вы решаете задачи на LeetCode, чтобы максимально продуктивно использовать время, потраченное на задачи.
Помни о реальном интервью
Многие из вас неправильно решают задачи на LeetCode, потому что просто незнакомы с тем, как проходят настоящие технические собеседования в реальной жизни.
Самая большая проблема с LeetCode заключается в том, что все задачи решайте только вы сами. В задаче указаны все детали, необходимые для решения проблемы заранее(как правило). В реальном интервью ваш интервьюер, вероятно, будет скрывать некоторую информацию, чтобы увидеть, как вы справляетесь с двусмысленностью. Другими словами, они хотят знать, будете ли вы задавать уточняющие вопросы или нет.
Кроме того, задача на LeetCode не может дать вам подсказки, если вы движетесь в неправильном направлении, только указать ваши ошибки. Там нет обратной связи, вам никто не скажет является ли ваше решение оптимальным или нет. Все это важно, потому что ваш интервьюер будет оценивать, как вы справляетесь с обратной связью. Если я, как ваш интервьюер, спрошу вас о том, можете ли вы оптимизировать свое решение, я буду ожидать чего-то большего, чем «я не знаю».
Да, и, кстати, ваш интервьюер не обязан предоставлять вам примеры или тестовые случаи. Некоторые могут сделать это, чтобы облегчить вам жизнь, но это происходит не часто. Поэтому если вы привыкли, что все это предоставляется вам в ваших задачах на LeetCode, то вам будет трудно на реальном собеседовании придумывать хорошие примеры и тестовые случаи.
Лучший способ
Установив необходимый контекст, давайте поговорим о том, как, по моему мнению, вам следует правильно изучать примеры задач. Следующая стратегия — это то, что я использовал, чтобы получить максимальную отдачу от каждого вопроса на собеседовании. Эти шаги покажут, как я применял свою собственную схему решения проблем (7 шагов), чтобы отрабатывать вопросы и задачи для интервью.
1. Используйте что-то для разработки (только не IDE)
Прежде чем начать, убедитесь, что вы правильно настроены для пробного собеседования. Вы можете написать код с помощью доски, карандаша и бумаги или с помощью компьютера и текстового редактора или облегченного редактора кода, такого как Notepad++ или TextPad. Старайтесь не использовать полноценные IDE, так как они часто включают в себя функции, которые вам вряд ли предоставят на реальном собеседовании.
2. Проводите фективное собеседование
Лучший способ попрактиковаться в задачах на LeetCode — это поговорить с другим человеком, который оценит вас как интервьюер. Может это будет шоком, но ему не обязательно быть кодером! Конечно, идеально иметь коллегу-программиста или разработчика, но важно найти кого-то, с кем вы можете поговорить и кто может дать вам обратную связь. Готовясь к собеседованию в Google, я полагался на свою жену, которая определенно не разбиралась в технических вопросах, но дала отличные отзывы о моем присутствии и поведении.
3. Включите таймер
Решая задачи на LeetCode, внезависимости о ее сложности, сколько времени у вас уходит в среднем? Может вы вообще не знайте? Сначала вы должны определить, сколько времени мне дадут на собеседовании на задачу такой сложности, а затем поставить таймер на соответсвуюшее время. Большинство интервью рассчитано на 45–60 минут. Решите, сколько времени вы собираетесь потратить на фиктивное интервью, исходя из того, что вы можете ожидать от реального интервью. Помните, вы хотите, чтобы все было максимально реалистично. Как только ваше время истекло, перестаньте работать. Важно научиться хорошо работать в условиях ограниченного времени.
4. Сформулируйте проблему
Крайне важно, чтобы вы делали заметки во время вашего собеседования чтобы вам не приходилось повторно запрашивать информацию у интервьюера, которую он уже вам дал. Никому не нравятся работники, которым все нужно разжевывать и не по одному разу.
5. Задавайте вопросы и предполагаете
Вот полезный совет для любого собеседования. Всегда задавайте вопросы в качестве интервьюируемого. Даже если вы думаете, что знаете все о том, как решить проблему, и даже если вы уже решали ее раньше — все равно задавайте вопросы. Вот несколько вопросов, которые вы можете задать практически по любому техническому заданию:
- Каков тип входных данных и диапазон допустимых данных?
- Помещаются ли данные ввода в память?
- Могу ли я ожидать получения неверных входных данных?(данные которые сломают программу)
- Отсортированы ли входные данные?
По сути ответами на эти вопросы в любой задаче на LeetCode является та самая информация внизу страницы. Там есть и диапазон входных данных и ограничения по памяти или времени. Можете сами открыть любую задач уи сформировать ещё пару таких полезных вопросов.
Помните, что вам следует избегать задавать вопросы, ответы на которые уже есть в самой постановке задачи. Тем не менее, важно и поощряется переформулировать свои предположения в ходе слушания вашего интервьюера, исходя из вашего понимания проблемы. Например, если в задаче упоминается сортировка целых чисел, вы можете предположить, что собираетесь сортировать 32-разрядные целые числа со знаком. Четко сформулируйте это предположение или спросите, так ли это. На самом деле проблема может потребовать от вас сортировки значений, которые помещаются в короткое целое число, что позволит вам сэкономить место (или длинное 64-битное целое число, которое, очевидно, потребует больше памяти).
6. Придумывайте сами примеры входных и выходных данных
На этом этапе важны две вещи. Во-первых, просмотрите все предоставленные вам примеры и проанализируйте их, чтобы выяснить, какие подробности они раскрывают о проблеме или ее ограничениях. Во-вторых, добавьте пару собственных примеров, чтобы продемонстрировать свое понимание этих ограничений или вызвать дополнительные вопросы. Один из способов думать о примерах — относиться к ним как к тестовым примерам. Прочтите о разработке через тестирование (TDD) и модульном тестировании в рамках подготовки к собеседованию, если вы обычно изо всех сил пытаетесь придумать хорошие тестовые примеры, но ничего не выходит.
7. Оптимизация решения
Вы можете не знать некоторых ключевых слов, внезависимости от языка на котором работайте. В этом нет ничего страшного, в первую очередь вы должны понимать структуру. Вот на что смотрят интервьюеры. Вы точно должны знать логарифмичнские сложности методов поиска и сортировки взависимости от типа данных. Именно эти знания позволяют прийти к оптимального решению задачи. Выучите таблицу сложностей наизусть, сколько это займёт у вас? Каждый день уделяя всего 20 минут на это, я думаю через неделю вы будете знать большую часть этой таблицы. Это очень важно.
Это основные моменты на которые обращают внимание большинство интервьюеров, в том числе и я. Следуйте этим шагам и вы будете сильно выделяться из общего потока разработчиков. Удачи!