Собеседование на должность программиста -опыт не из легких. Чтобы устроиться на работу мечты, ты в течении часа с ходу отвечаешь на вопросы совершенно незнакомого тебе человека. Чувствуешь себя как под микроскоп: твои ответы, твой код - все это тщательно анализируется. За потеющим лбом в панике носятся мысли: "Как мне решить поставленную задачу?" "Выбрал ли я правильный подход?" "Сколько минут у меня осталось?" "Что, блин, означает его выражение лица?" Согласен... Это непростой опыт.
1. Начните с планирования. Прежде чем приступить к написанию кода, составь решения поставленной задачи. На это рекомендую потратить от 5 до 20 минут. Обычно мой план включает в себя построение диаграмм и выполнение тестовых примеров. Например, всякий раз, когда у меня возникает проблема с графиком или проблема рекурсии, я рисую дерево, которое помогает структурировать работу, понять логику действий (с тем же самым поиском возвратов, например).
С составленным планом ты получишь несколько преимуществ. Во-первых, интервьюер может сообщить тебе, если ты движешься в неправильном направлении. Это поможет тебе сэкономить время, ведь не надо будет исправлять код! Во-вторых, легко определить, какие структуры данных и переменные потребуются для решения задачи.
Если твой первоначальный план не самый эффективный, ничего страшного! Не беспокойся об этом на раннем этапе. Лучше иметь рабочий код, чем сломанный или, что еще хуже, не иметь кода. Это часто приводит к провалу многих кандидатов на собеседование.
После того, как ты составил первичный план, подумай над наиболее оптимальным подходом.
2. Общайтесь. Поскольку интервьюер не знает, что происходит у тебя в голове, расскажи о своем мыслительном процессе интервьюеру. Это важный софт скилл, по нему интервьюер оценит твои навыки решения задач.
Я, например, благодаря эффективному общению получил предложение о работе в топовой компании. Во время собеседования старший инженер задавал мне сложные вопросы по динамическому программированию продолжительностью 45 минут подряд. Я нарисовал 2D-матрицу и различные состояния в матрице. Однако я дольше всех застревал в выражении правильного отношения рекуррентности. Я проверял свое рекуррентное соотношение на множестве крайних случаев, и иногда мой подход давал неверный ответ. Я объяснил, почему мое рекуррентное соотношение было неправильным, и обсудил подходы к его уточнению. Я сообщал каждый шаг своего мыслительного процесса.
На исходе времени у меня было определенное отношение повторения, но код не был написан. Нулевой код. Вся доска была заполнена кучей матриц и стрелок. Выйдя из офиса, я был уверен, что провалил это интервью. Через несколько дней мне позвонили и сказали, что я получил работу.
Итак, когда нужно общаться? Тебе нужно общаться:
- когда ты составляешь план;
- когда ты замечаешь, что есть несколько подходов к решению задачи, и определяешь, какой из них наиболее эффективен;
- когда ты видишь ошибку в своем коде;
- когда ты тестируешь свой код с помощью примера для его проверки
- Всегда проверяй свой код. Когда дописал до точки, это приятно. Гордишься тем, что справился с задачей в стрессовой ситуации. Однако, финишную линию ты пока не пересек. Если скажешь интервьюеру, что закончил со своим кодом, не проверив его с помощью тестовых примеров, шансы на успех снизятся.
Если интервьюер обнаружит ошибки в коде, он отметит в обратной связи, что «кандидат на собеседование не тестировал код, и я обнаружил ошибки вместо него». Отказ от тестирования кода означает несоблюдение самых фундаментальных практик разработки ПО. Никто не пишет идеальный код с первого раза. Всегда необходимо проверять свой код, чтобы завоевать и сохранить доверие клиентов.
Поэтому всегда обязательно пиши свой код как минимум с двумя тестовыми случаями, и один из них должен быть пограничным. Обязательно общайся во время тестирования с интервьюером.
3. Говорите о вводе. Прежде чем приступить к написанию кода, подумай о различных формах ввода. Это поможет тебе составить план.
Задай интервьюеру следующие вопросы:
- Может ли мой ввод быть нулевым?
- Мой массив отсортирован или не отсортирован?
- Это двусвязный список или односвязный список?
- Будет ли мой массив содержать отрицательные числа?
Зачем это делать?
Предположим, задача - найти целевое число в массиве. Если интервьюер подтверждает, что массив отсортирован, можешь выполнить двоичный поиск, время выполнения которого равно O (журнал N). Однако, если интервьюер говорит, что массив не отсортирован, необходимо выполнить линейный поиск, время выполнения которого равно O (N). Характер вводимых данных может изменить подход к решению проблемы.
5. Не стесняйся просить о помощи, но в меру. Могут быть ситуации, когда ты не знаешь, что делать. Это нормально - попроси совета у интервьюера, чтобы он задал правильное направление, но не выдавал готового решения.
Если сможешь предложить правильное решение с помощью пары подсказок, это будет плюсом. Значит, ты сохраняешь независимость мышления, будучи под грамотным руководством.
Тем не менее, чтобы не показаться неспособным решать проблемы, лучше спрашивать в меру. Безопасное количество подсказок - 2. Если больше - шансы на получить работу могут снизиться.
Еще один совет: сиди на Leetcode Нет, это не панацея и не ЕГЭ. Не надо просто запоминать все существующие решения leetcode. Есть люди, которые сделали там более 500 задач, но их не выбирают на собеседованиях.
Сосредоточься на методах и подходах. Часто эти методы могут применяться и в других задачах.
Некоторые важные методы, на которых стоит сосредоточиться:
- кролик и черепаха двухпозиционный подход
- обход порядка уровней с использованием очереди
- поиск возврата
- рисование дерева рекурсии
Причина поделиться своими советами: я хочу помочь людям, которые ищут работу своей мечты. Поверьте, я знаю, о чем говорю. Это непростой, истощающий процесс, который иногда может вызывать уныние.
Никто не давал мне никаких советов и уловок, чтобы пройти собеседования. Мне пришлось пройти бесчисленное количество интервью, чтобы понять суть этой игры. Я надеюсь, что мои советы могут хоть кому-то помочь! Пожалуйста, свяжитесь со мной, если вы это сделаете.