И я намеренно не пишу, для кого предназначен этот план подготовки: для 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 factory, 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. Еще один сайт с алгоритмическими задачами. Здесь задачи структурированы по категориям.
Удачи!
Комментарии (14)
sshikov
30.10.2019 20:50Я бы посоветовал Java Concurrency in Practice. Она хоть и не слишком новая, но пожалуй ничего принципиально лучше по многопоточности все еще не написано.
NikitOS9
31.10.2019 08:37если для java то The Art of Multiprocessor Programming детальнее будет наверное
viktor-zh
31.10.2019 15:12Она детальнее, более академична и чуть более сложна для восприятия из-за стиля изложения. Вот тут вскользь упомянуты сложности восприятия примеров из книги. Java Concurrency in Practice все-же ближе к практике и больше подходит для введения.
NikitOS9
31.10.2019 17:44ближе к практике еще пару
Java Concurrency Guidelines, Programming Concurrency on the JVMsshikov
31.10.2019 19:35Programming Concurrency on the JVM — тут все же немного другие темы. Сложно сказать, лучше это или хуже. Но все-таки, STM или Akka — это не про JDK, это более широкий взгляд на вещи. Вероятно будет хороша как дополнение.
sshikov
31.10.2019 19:27Эта тоже неплохая. Но я соглашусь с мнением ниже, что JCIP более конкретная и практичная, что-ли.
dim2r
31.10.2019 11:37Eсли хочется вникнуть в многопоточность, то надо начинать с того, как работает кэш процессора и протокол MESI. www.youtube.com/watch?v=VcesAbhnGKU
В противном случае придется слушать рафинированные сказки про то, как все круто.sshikov
31.10.2019 19:31Ну тут как-бы про интервью на Java разработчика говорили. Мне кажется, если у вас на подобном интервью спросят такие вещи — то вы устраиваетесь в Оракл пилить Java runtime :) Обычный разработчик без этого проживет, хотя знание — оно конечно не помешает никогда.
dim2r
01.11.2019 11:40Ну, когда спросят, что такое volitale, — надо понимать как это устроена в java. Что в java реализован надежный с точки зрения программирования механизм, но далеко не самый быстрый, потому что всегда обеспечивается полная когерентность кэша, что далеко не всегда нужно. Поэтому high performance и low latency в понимании java отличается от традиционного.
DimaIceberg
31.10.2019 18:54Коротко и просто.
Мне сейчас как «не java разработчику», который изучал/изучает java, было интересно сравнить/оценить свои знания пробегая по перечню.
Спасибо!
puyol_dev2
Нужно отталкиваться от конкретной вакансии, а не знать, условно, все, по сути не зная ничего