Javenue logo

Javenue

Программирование на Java

Информационные технологии

Собеседование на java-программиста (java-developer interview). Часть 2: Вопросы

Это продолжение цикла статей о собеседовании на java-программиста:

Java-related технологии и фреймворки рождаются и умирают, а без знания java core далеко не уедешь. Как можно знать Hibernate, но не знать JDBC и SQL? Как можно разбираться в Spring MVC или Struts, но при это плавать в сервлетах? Как можно пользоваться блокирующими очередями, экзекьюторами и локами, но при этом не понимать, как работают wait/notify? Для меня это до сих пор остается загадкой.

С другой стороны, меня иногда удивляют вопросы сотрудников, которые они задают кандидатам. Зачем спрашивать о Vector и Hashtable - на дворе уже скоро 4-ое тысячелетие. Или "зачем нужен UNION"? Так и хочется ответить - для SQL-инъекций. На счет паттернов проектирования и UML я вообще молчу - неужели до сих пор не наигрались? Но это еще полбеды. Иногда интервьюеры сами допускают довольно грубые ошибки. Об этом чуть позже.

Ниже приведен список вопросов (точнее небольшая его часть), которые я задаю на собеседовании, с моими комментариями. Вся прелесть в том, что в зависимости от позиции (junior java developer, mid-level, senior developer) и специализации некоторые из вопросов превращаются в более короткие либо более продолжительные диалоги с кандидатом и проверяют не только технические знания, но и умение мыслить и делать логические умозаключения. После многих пунктов вы найдете ссылки на статьи по соответствующей тематике.

[Disclamer: В статье выражается до безобразия субъективное мнение. Резкие выражения используются исключительно для донесения своих мыслей до читателя: никого обижать я не собирался и не собираюсь. Людям с расшатанной психикой или зашкаливающим ЧСВ читать, и тем более комментировать, категорически воспрещается. К спамерам и троллям это не относится: каждый ваш комментарий как лучик света в этом царстве тьмы, и дай вам бог всем здоровьечка.]

Вопросы собеседования по Core Java

Для позиций типа Senior эти вопросы можно пропустить. Но иногда все же стоит перестраховаться.

1. Модификаторы в Java.

Особо глубоко спрашивать не нужно - вкратце о назначении и вариантах использования. Можно спросить о контекстах использования этих модификаторов (класс/поле/метод). Подробные вопросы о модификаторах доступа, расширении модификаторов при наследовании, переопределение и сокрытие методов, модификатор abstract и final для классов/методов лучше оставить для вопросов по ООП в Java. Подробное знание модификаторов synchronized и volatile можно проверить в вопросах по многопоточности.

Небольшая статья про модификаторы - здесь.

2. Иерархия коллекций в Java.

Рассматриваем Collection, Set, List, Queue, Map и их основные реализации. Можно в принципе спросить о методах, которые есть в интерфейсе Collection, но лучше не надо. Стоит поинтересоваться, какими коллекциями человек пользовался, но опять же без фанатизма. Напоминаю, Vector и Hashtable (и Stack кстати тоже) - прошлый век, тем более в случае работы с legacy кодом всегда можно посмотреть сорцы. Еще можно поговорить о массивах, а следующий код может привести к интересному диалогу:

Object a = new Integer[10];
Object[] b = new Integer[10];

По поводу свойств и контракта equals/hashCode спросить стоит и о поломке коллекций тоже, но сильно не увлекайтесь, так как это может привести к любимому вопросу большинства интервьюеров об устройстве HashMap. В свою очередь это напрямую ведет нас к вопросам о структурах данных, алгоритмах и их сложности. Мое мнение по этому поводу - с алгоритмами хорошо знакомы олимпиадники и те, у кого в университете это преподавалось на должном уровне. Мне, например, в этом плане не повезло ни с тем, ни с другим. И разбирался в алгоритмах/АТД по ходу своей работы только тогда, когда возникали соответствующие задачи или просто было время и желание почитать и осознать. В результате - quick sort, merge sort, radix sort напишу; hash map, linked list, binary search tree напишу; semaphore, thread pool, blocking queue тоже напишу. Что-то еще нужно? Окей, напишу.

Что делать, если шило все же мешает и хочется хоть раз в жизни показать свои глубочайшие знания в области алгоритмов и структур данных и без того напуганному кандидату... Начнем с того, что такие вопросы стоит задавать только senior разработчику и только если задачи такого плана встречаются на проекте достаточно часто (что встречается достаточно редко). Так уж и быть, спрашивайте об устройстве HashMap и скорости поиска, об устройстве LinkedList и сложности операций над ним. Можно попросить, чтобы человек своими словами рассказал, откуда в quick/merge sort берется log2n. Можно еще какую-нибудь задачу алгоритмическую задать. Но помните, возможно с этим человеком вам еще придется работать в одной команде...

3. Иерархия исключений и ошибок.

Тут как бы все понятно, но бывает, что люди не знают элементарных вещей. Стоит спросить об иерархии, о checked и unchecked ошибках/исключениях, когда используются те или иные, как и когда их нужно обрабатывать. Можно даже начать небольшой диалог по поводу OutOfMemoryError. Если человек знаком с JDBC, можно поговорить об SQLException и поинтересоваться, оно chekced или unchecked и нормально ли это по мнению кандидата.

Ответ на этот вопрос можно найти здесь

4. Вложенные классы в Java.

Некоторые считают, что этот вопрос не нужен. Лично я так не думаю. Стоит спросить о классификации, вариантах использования, о нарушении инкапсуляции и самое интересное - зачем они нужны по мнению кандидата.

Моя статья о вложенных классах на Quizful - здесь.

И статья об анонимных классах - здесь.

Вопросы по ООП в Java

5. Основы ООП

Здесь уже подробно рассматриваем модификаторы доступа и прочие вещи, которые я упомянул в комментариях к первому вопросу. Можно спросить об интерфейсах и абстрактных классах. Пусть человек своими словами расскажет о полиморфизме и инкапсуляции. Если хотите послушать рассуждения человека, можно спросить о таком фрагменте кода:

class A {
    Number method(Number arg) { return null; }
}
class B extends A {
    Integer method(Number arg) { return null; }
}

Как продолжение, на этом же примере можно поговорить о расширении/сужении типов в аргументах переопределяемых методов в случае, если бы в Java список формальных параметров не входил бы в сигнатуру метода.

6. Паттерны проектирования

Напоминаю, не стоит глубоко спрашивать о паттернах проектирования. И ни в коем случае не поучайте кандидата рассказами о том, "насколько они полезные" и "как их правильно реализовывать". Кстати, по поводу красоты/понятности кода и быстроты его написания мой друг говорит следующее: "Чтобы уметь круто хачить на Java, нужно дохера хачить на Java".

Каталог паттернов проектирования можете найти здесь

Вопросы собеседования по многопоточности в Java

7. Многопоточность в Java.

Хочу посвятить этой теме цикл статей: одним абзацом не отделаешься. Если вкратце, спросите, зачем нужна многопоточность, что такое монитор объекта, спросите о модификаторах syhcnronized и volatile, методах wait/notify/notifyAll, а так же о пакете java.util.concurrent. А следующий фрагмент кода должен привести к достаточно интересному разговору:

class A {
    private Object o;
    public void method() {
        o.wait();
    }
}

Интересная статья про методы wait/notify доступна здесь.

Вопросы, связанные с базами данных

8. SQL

Для начала стоит задавать вопросы по ANSI SQL. Далее, в зависимости от СУБД, используемой на проекте, можно спрашивать о важных отличиях ее диалекта. Итак, пусть человек расскажет об основных элементах баз данных - таблицах, процедурах, функциях, констрейнтах и т.д. О констрейнтах можно поспрашивать чуть подробнее. Стоит поинтересоваться, как человек понимает null в базах данных. Переходите к агрегатным функциям и о том, как они работают с null, не забудьте о group by и having. Можно дать пару маленьких задачек на эту тему (см. задачи 1-2 ниже). Поспрашивайте о типах join и дайте пару задачек (см. задачи 3-4 ниже).

Задача 1. Дана таблица T с колонкой A целого типа, содержащая значения 10, 20, 30, null. Чему будут равны результаты выражений "AVG(A)" и "SUM(A) / COUNT(*)"?

Задача 2. Дана таблица T с колонкой A целого типа. Напишите запрос, который вернет все положительные значения встречающиеся в таблице более одного раза.

Задача 3. Даны таблицы T1 и T2. В каждой есть колонка A целого типа. Значения в первой таблице - 1, 2, а во второй - 2, 3. Что вернут запросы с inner join, left/right/full outer join и cross join вида "select T1.A, T2.A from T1 ... join T2 on T1.A = T2.A".

Задча 4. Даны 2 таблицы с колонками A целого типа. Напишите запрос, который вернет все значения колонки А из первой таблицы, для которой нет соответствия в колонке A второй.

Статья о конструкции Join доступна здесь

9. JDBC API

Тут тоже без особых извращений. Спросите о Connection, Statement, PreparedStatement, CallableStatement, ResulSet, зачем каждая из этих сущностей нужна. Можно поинтересоваться о том, чем они являются: абстрактными классамм, конкретными классами или интерфейсами и почему.

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

Читайте на блоге подробный туториал по JDBC.

Вопросы собеседования по веб-программированию

10. Servlet API

Для начала надо спросить об HTTP в целом. Что такое хедеры запроса, какие вообще типы запросов бывают, что такое HTTP Status Code.

Далее нужно спросить про класс HttpServlet, в каком виде можно работать с запросом и ответом. Что такое сессия (HttpSession) и как ее получить. Не забудьте спросить про ServletFilter и варианты их использования.

Организм требует сна. Статью завершу через некоторое время. Удачи всем.


Комментариев: 10

  Выйти

  * для публикации комментариев нужно  

Artem:

Большое спасибо тебе, Костя, за отличные статьи. Я в студенческие годы (2002-2007) изучал Java, затем какого-то черта меня понесло в 1С. Теперь решил все исправить и вернуться к тому - к чему душа (и мозги) лежит. Твои статьи, особенно вопросы на собеседования, очень помогают выбрать направление изучения Java, что так не просто и важно для начинающего разработчика.
С огромным удовольствием и интересом читаю твой блог.

mantonov:

А вы никогда не задаете вопросы по вещам, которые “каждый уважающий себя разработчик отлично знает”, но мало кто может обосновать? На мой взгляд, иногда это может показать, насколько человек любит и умеет заниматься сам исследованиями (а значит, повышает свой уровень), + насколько он доверяет своему опыту, насколько постам в блогах и форумах, насколько документации, книгам и исходникам. Правильного ответа тут не может быть, так как в любой такой вопрос можно углубляться бесконечно. Но по мере углубления это показывает то, насколько глубоко кандидат понимает те или иные аспекты.

Например - быстро ли работает Reflection в Java? Любой студент знает что медленно? Замечательно, а почему? Не хмыкайте, попробуйте описать подробно процесс прямого вызова метода в JVM (может кандидат вспомнит про invokevirtual, например, и прочие байткоды), и как выполняется вызов через reflection? Через JNI и требует переключения из JVM-кода в нативный и обратно? Отлично, а в чем заключается переключение контекста и почему она дорого (кстати, а дорого - это сколько?) ? А вы знаете, что вызов через refledction можно очень сильно ускорить, если перед ним вызвать setAccessible(true)? А вы знаете, что для часто вызываемых методов создается Java-stub, через который в дальнейшем выполняются прямые вызовы?

- Если кандидат дошел до сюда - делайте оффер

sasha:

Спасибо за статью, Костя, и хотелось бы спросить…как на твой взгляд, есть ли шанс пройти собеседование на должность junior’a со знанием только лишь core java и SQL?(плюс ООП и паттерны)

c0nst:

2 sasha: лучше поразбираться хотя бы на самом простом уровне с технологиями, которые сейчас “в моде”. Лишним точно не будет. Тем более с такими базовыми знаниями на джуниора точно возьмут без проблем.

Еще не мешало бы выбрать себе для начала некоторое направление и поразбираться чуть глубже в нем. Естественно, потом специализацию можно будет сменить. Главное, чтобы сейчас вы смогли заинтересовать работодателя. Примеры:

  • Java Swing;
  • Servlets (опционально JSP/HTML/CSS/JavaScript);
  • Networking
  • Web-services
  • XML (DOM, SAX, StAX, XML Schema)

и т.д.

sdv:

Великолепная статья. И комментарии хороши. Спасибо, ребята.

Самому приходится и собеседовать и собеседоваться, поэтому статья очень полезна.

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

николай:

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

Самый реалистичный вариант - поговорите с кандидатом о том, что он реально делал в прошлом, какие проблемы видел и как решал. Сами (!) соотнесите услышанное с тем, что ему придется делать и оцените риски. Многие “незнания” на самом деле очень дешевы в смысле их решения. Например, цена вопроса может быть 2 дня за книжкой. Это напряжет компанию? Скорее, нет. Но если человек в принципе не умеет абстрактно мыслить, то нужен ли он компании на программистской должности?

Alexey:

Еще на уровень junior задают вопросы про generic. Вчера на собеседовании в luxsoft засыпался на этом вопросе в итоге ляпнув, что возвращаемое значение входит в сигнатуру метода. Хотя когда-то, во время сдачи экзаменов в универе, на подобные вопросы отвечал правильно и без колебаний. А все дело в том, что на практике за год работы с такими вопросами даже не сталкивался. Моему руководителю было просто до лампочки, до фонаря, до мамкиной норки, насколько я знаю generic, colections, etc. пока я выдаю удовлетворительные решения поставленных задач. С другой стороны проблема такого рабочего места в том, что забираешься в свою частную берлогу “мой код - посторонним вход воспрещен” и никакого профессионального роста. Но в итоге жизнь показала, что все равно теорию нужно знать.

Так вот такой вопрос: наличие Oracle Certified Java Programmer (бывший SCJP) полученного за полгода до собеседования удовлетворит любопытство работодателя или каждый раз придется заново вспоминать матчасть?

Дмитрий:

Ребята, случайно набрел на статью, и хотел бы откомментировать.

Сначала о себе, так получилось что в своей практике писал начиная от ASM заканчивая @Formula, и Lotus Script для Lotus Notes, в том числе и Java, С++. Приходилось как подбирать так и работать в командах. Сейчас вырос до ПМ-а.

Так вот что для себя определил, из негатива в поисках кандидатов:

1) знание теории никогда не перекликается с практикой, и по сути не имеет никакого значения. А умение на салфетке нашкрябать идеальный код, это понты для беседы за чашкой чая, к реальным проектам они не применимы.

2) “гаджетомания” - первая и основная проблема любых проектов. Поясню, мания попробывать что то новенькое, новенький сырой модуль, БД, технологию итд… всегда почти со 100% вероятностью вредит проекту, приводит к необоснованным затратам, нестабильности приложения, и головной боли у целых отделов, и компаний. Кроме случаев когда это обосновано естественно, но опять таки применяя новую технологию сознательно идём на риск.

Что для себя позитивного отметил:

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

2) успешный кандидат, не зависимо от опыта, должен знать и применять на практике ряд стандартных алгоритмов О них можно вечно говорить, спорить ещё дольше, но я думаю те кто это делает понимает о чём речь.

В итоге подобные собеседования когда речь заходит о “идеальном кодинге”, теории, и всяких глубоких знаниях латыни, у меня вызывает изжогу и нежелание общатся с заказчиком. Потому что я понимаю что заказчик в таком случае ищет “мартышку-очкарика”, который будет кодить, а не решать интересные задачи, а мне хочется решать интересные задачи, как думаю всем.

Aleks:

Для чего все эти вопросы на собеседовании? Такое чувство, что менталитет у нашего брата никогда не поменяется!!! Кто там из работодателей….. Вот Вам нормальное взрослое решение! Подготовьте нормальные тесты на бумаге из тех вопросов, которые реально применяются в вашей практике и толкайте кандидатам! Если процентов на 80-90 подходит, тогда уже и болтайте о “любви” и других достоинствах! Или воспользуйтесь нормальным адекватным онлайн сервисом для решения задач. Не будьте прошлым веком. Да и кандидатам будет с вами легче и приятнее общаться, а то такое чувство, что постоянно на собеседованиях приходится меряться одним местом, у кого оно больше, извиняюсь за прямоту)). По поводу интересных проектов, то всё что было интересного уже давно не новшество, все уже сделали и реализовали. Назовите хоть один проект, который можно назвать интересным? Чего программист среднего уровня не сможет реализовать и вывести на экран? Или сеньор? Задачи разного уровня решают люди соответствующие. Сеньоры решают серверные задачи, мидлы клиентские. Ну а джуниоры строят сервлеты и рисуют интерфейсы. Все на своих местах. Так что Господа работодатели, выкиньте весь этот хлам из своей головы с вопросами и дайте знающим парням зарабатывать Вам на хлеб.

Ольга Горобец:

Разрешите дополнить список еще одним: «327 вопроса на собеседование Java Developer». Как видим, учить не переучить.http://becomejavasenior.com/blog/2015/07/01/327-interview-questions-java-developer/