Каждый раз, готовясь к собеседованиям на позицию «Java разработчик», я понимаю, что мне бы очень помог конкретный план подготовки. Поэтому все свои записи, накопившиеся в ходе прохождения собеседований, было решено структурировать и опубликовать. Надеюсь, кому-то этот план будет полезен.
И я намеренно не пишу, для кого предназначен этот план подготовки: для senior, middle или junior разработчика — все зависит от конкретной вакансии и от требований работодателя. Поэтому опирайтесь на этот план, но фильтруйте и в то же время не воспринимайте его как исчерпывающее руководство.
- Java core. Здесь можно ориентироваться например на книгу «OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide: Exam 1Z0-809» для подготовки к Java сертификации уровня Professional. Есть подобная книга «OCA: Oracle Certified Associate Java SE 8 Programmer I Study Guide: Exam 1Z0-808» для уровня Associate — на нее тоже можно взглянуть. Пройдитесь по оглавлению и выделите для себя, что можно повторить. Конечно же, не стоит пускаться во все тяжкие и читать книгу от корки до корки — многие темы из этой книги можно обойти стороной, например форматирование дат. Выделите самое основное. Например для меня это были следующие темы: коллекции (стандартные вопросы «Как устроена HashMap?» или «Чем отличается LinkedList от ArrayList?» все также часто задают на собеседованиях), дженерики, функциональные интерфейсы, многопоточность (тут тоже фильтруйте — не нужны вам cyclic barrier и fork join framework).
Также не забывайте проецировать знания на свой опыт. Например, когда вам приходилось использовать многопоточное программирование? Какие проблемы вы решали? Какие блокировки использовали? - Многопоточность. Я все-таки выделю эту тему в отдельный пункт — так как в книге выше не объясняется, что такое volatile, locks и wait/notify. Если не работали с многопоточным программированием ранее — так честно и говорите на собеседовании. Но некоторые вещи, которые например были перечислены выше, было бы неплохо знать хотя бы в теории (тем более вопрос «Что такое volatile?» был у меня почти на каждом собеседовании).
- Алгоритмы. Эта тема актуальна не только для java разработчиков. Маловероятно, что вас попросят написать какой-нибудь алгоритм сортировки. Интервьюеру не интересно узнать, как замечательно вы заучили код сортировки слиянием (скорее всего он просто попросит рассказать общий принцип). Но решить алгоритмическую задачу, оценить сложность своего решения или например объяснить на словах принцип поиска в глубину — вполне возможный вариант.
- Структуры данных. Чем дерево отличается от графа? Что такое АВЛ деревья? Чем стек отличается от очереди?
Касаемо java: какие классы в java реализуют стек или очередь? Чем LinkedList отличается от ArrayList? Что такое HashSet? Чем он отличается от TreeSet? Как работает HashMap?
Эти и подобные вопросы с большой долей вероятности могут быть на интервью. Но стоит заметить, что вопросы про деревья и графы гораздо реже фигурируют на собеседовании — эти структуры на практике используются не так часто. От вас скорее ожидают хорошие знания того, что вы использовали ранее. Не знаете или не использовали красно-черное дерево? Так и скажите, вы не можете знать все. - Базы данных. Реляционные и нереляционные. В чем разница? Что и когда использовать?
Если говорить о реляционных, то повторите все объекты таких баз данных: таблицы, представления, индексы. Повторите sql — как строится запрос, какие виды join-ов существуют, чем having отличается от where. Также отдельно повторите транзакции — уровни изоляции, свойства ACID. Вспомните, были ли у вас в практике случаи оптимизации запросов? Приходилось ли смотреть план выполнения запроса?
Также не забудьте повторить jpa (если эта спецификация требуется в вакансии). Что такое entity manager? Что такое persistence context? И прочее, с чем приходилось сталкиваться. - Фреймворки. Какие именно фреймворки нужно повторить — зависит от конкретной вакансии. В большинстве случаев требуется Spring. Тогда не забудьте повторить, как вообще работает Spring, этапы инициализации бина. Вспомните, какие Spring фреймворки вы использовали (например Spring mvc, Spring security, Spring data) и для чего. Повторите основные аннотации (не забудьте про Qualifier, Primary и Conditional — о них любят спрашивать особенно часто). И не забудьте про bean scopes.
Отдельно хочу коснуться аннотации Transactional. Как она работает? Что в ней можно дополнительно настроить? - Устройство Jvm. Что такое куча и стек? Как хранятся объекты в jvm? Что такое string pool? Что обеспечивает принцип happens before? Как работает сборщик мусора? Повторите по возможности — лишним не будет.
- Паттерны. Не надо загоняться — никто не потребует перечислять все существующие паттерны. Но некоторые, используемые в Java или Spring, знать надо (например Immutable, Singleton, Prototype, Builder, Proxy, Abstract fabric, Wrapper).
- Алгоритмические задачки. Часто на собеседованиях просят решить ту или иную задачку. Иногда на листочке, иногда на доске, иногда на конкретном сайте, если это скайп интервью. Будьте готовы что код придется писать без использования любимой среды разработки. Также попрактикуйтесь решать задачки, например на Leetcode.
- Сети. Повторите уровни модели OSI. И не забудьте чуть более подробно повторить основные протоколы: tcp, udp, http, https.
- Архитектура. SOLID, service discovery, очереди сообщений. Когда использовать микросервисы и когда монолит? Использовали ли вы eureka или consul?
- Остальное. Agile, Git и Gitflow, REST/SOAP, Linux (если работали), Docker и Kubernetes (если работали). А еще тесты — функциональные, интеграционные и юнит. Чем отличаются, какие писали, использовали ли TDD?
- Английский. Только если требуется. Разумеется, не надо повторять правила грамматики английского языка. Достаточно потренироваться рассказать о себе, возможно запомнить некоторые заранее подготовленные фразы.
- Про себя. Будьте готовы ответить на подобные вопросы: «Какую интересную проблему приходилось решать на работе?», «Расскажите, чем гордитесь больше всего.», «Расскажите о своих достижениях.», «Расскажите о своих неудачах.», «Как вы самообразовываетесь?», «Почему ушли с прежнего места работы?». Если у вас есть свои проекты, статьи или выступления — обязательно о них расскажите. Этими вещами очень интересуются и обязательно попросят рассказать подробнее.
Кроме того, обязательно подготовьте свои вопросы компании. Выделите основные моменты, которые вам важны, прямо по пунктам. На хабре есть замечательный пост об этом.
И дам несколько советов от себя.
Лично я всегда ставлю первые 2 собеседования как тренировочные. То есть обычно это компании, которые меня интересуют меньше всего. Эти собеседования нужны просто для того, чтобы войти в ритм и не бояться последующих.
Также будьте готовы рассказать про свой опыт из резюме. Что делали, зачем, какие проблемы решали.
Помните, что вы — не энциклопедия, и не должны сходу перечислить например все функциональные интерфейсы в Java. Будет вполне нормально, если расскажете только про то, с чем работали.
И помните, что собеседование — это прежде всего беседа. Вас не допрашивают и не хотят пристыдить, если вы что-либо не знаете. Работодатель выясняет, подходящая ли вы кандидатура, а вы выясняете, подходит ли вам эта работа.
А еще хорошая книга — Cracking the Coding Interview. Можно взглянуть, особенно если собираетесь проходить интервью в иностранные компании типа Google, Facebook.
Полезные ресурсы, которые могут понадобится при подготовке:
- Cracking the Coding Interview.
- OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide: Exam 1Z0-809.
- Пост «Я вам перезвоню».
- Leetcode.
- Interviewbit. Еще один сайт с алгоритмическими задачами. Здесь задачи структурированы по категориям.
Удачи!
Автор: WhiteDwarf