четверг, 12 ноября 2015 г.

15 вопросов к техническому интервью Java программиста с 5-6 летним опытом работы

Источник - 15-вопросов-к-техническому-интервью-Java-программиста-с-5-6-летним-опытом-работы
С ростом опыта программиста от уровня начинающего разработчика (от 2 до 4 лет опыта работы) до уровня старшего разработчика( от 5 до 7 лет) меняются и вопросы на интервью по Core Java.
Конечно такие основы как структуры данных, алгоритмы И объектно-ориентированное программирование остаются, но вопросы и ответы становятся более подробными. Я часто получаю вопросы о том какие вопросы по Core Java задают старшим разработчикам, или каких вопросов стоит ожидать на собеседовании на позицию старшего разработчика Java. Это меня на некоторое время озадачивает, ведь как только вы станете старшими разработчиками, вы автоматически начнете принимать участие в собеседованиях и вам надо иметь представление о том, чего ожидать от собеседования, но в то же самое время, я понимаю, что зная вопросы собеседовании, вам будет легче к нему подготовиться. Конечно, вы не получите вопросов которые задают программистам с 2-3 годами опыта работы с Java, хотя в начале собеседования это не исключено. Я не вижу отличий между телефонными интервью и собеседованиями с глазу на глаз. Какие то вопросы остаются теми же, какие то вопросы требуют более подробных ответов. В этой статье я поделюсь 15 техническими вопросами по Core Java, которые задавались при собеседованиях старших разработчиков во время телефонного интервью. Я не публикую все ответы, но вы можете найти их в текущем блоге или в блогеJavarevisited.

15 вопросов по Core Java для программистов с 5-6 опытом разработки.
Все вопросы были получены от работающих старших разработчиков, имеющих более чем 5 летний опыт работы. Разработчики встречались с этими вопросами на разных этапах трудоустройства, включая телефонные интервью и собеседования с глазу на глаз.

1) Как работает метод HashMap в Java?
Да, это по-прежнему один из самых популярных вопросов для старшего разработчика, вы должны ожидать его на телефонном интервью, после него возможно будет много смежных вопросов, посмотрите ответы на нихздесь.

2) Какие 2 метода должен реализовать объект ключа HashMap ? equals и hashcode

3) Почему объекты, используемые в качестве ключа должны быть иммутабельными(неизменяемыми) ? что бы хэш-код всегда возвращал одно и то же значение

4) Благодаря чему в ConcurrentHashMap достигается масштабируемость ? Иногда этот вопрос звучит на интервью как: разница между ConcurrentHashMap и Hashtable в Java, поищите ответы здесь.

5) Как сделать объект общим для разных потоков? Или как передать объект от одного потока к другому ? Есть много путей реализации этого, такие как очереди, обменники, но блокируемые очереди с шаблоном проектирования Producer/Consumer это самый простой способ, чтобы передать объект из одного потока в другой.

6) Как узнать что в вашей программе есть взаимная блокировка?( Получив дамп потока, используя kill -3, применяя JConsole или VisualVM). Я предлагаю подготовиться к этому вопросу на интервью очень тщательно, так как интервьюеры любят детали, они спрашивают бывали ли в вашем проекте подобные проблемы и как вам удалось их решить. 

7) Как избежать взаимных блокировок при кодировании ? Что бы разобраться с блокировками и получить полную информацию о теме, прочтите это.

8) Что такое ожидание занятости(«Busy spinning»)? Почему вы должны использовать его ? Один из интереснейших вопросов многопоточности для старшего разработчика Java, Busy spinning это стратегия ожидания, когда поток выполняет ожидание в цикле, при этом не используя ресурсы процессора и как бызасыпая. Эту стратегию используют когда время ожидания очень мало, при этом не нагружается процессор и не останавливается поток, сохраняются все данные, которые могут быть потеряны при запуске потока на другом ядре процессора. Этот вопрос популярен у программистов создающих высоко нагруженные проекты, где программисты 
добиваются чрезвычайно низких задержек в работе, в диапазоне микро- и мили- секунд.

9) Что такое блокировка Чтения и Записи (ReadWriteLock)? Использует ли ConcurrentHashMap ReadWrite блокировки ? Блокировка Чтения и Записи это такая реализация блокировки, когда несколько разных потоков пытаются произвести операцию чтения и записи с одним объектом. сама по себе операция чтения не изменяет объект, что допускает многопоточные операции чтения без блокировок. Java предоставляет реализацию ReadWriteLock с которой стоит ознакомиться. Например ConcurrentHashMap не применяет ReadWriteLock, вместо этого он делит Hash на отдельные части и блокирует их отдельно, таким образом в любой момент времени заблокирована только часть хеша, а не он весь. Этот вопрос популярен у опытных разработчиков, обычно просят ответить подробнее, спрашивают разные реализации ReadWriteLock для разных случаев.

10) Как сделать объект иммутабельным(не изменяемым) в Java? Зачем делать объект иммутабельным ? Иммутабельность предполагает несколько преимуществ включая потокобезопасность, возможность кеширования, а так же делает многопоточный код более читаемым.
Посмотрите это и научитесь делать объекты иммутабельными. На собеседовании по этому вопросу возможны дополнительные уточнения, в зависимости от полноты вашего ответа. Например когда вы говорите, что Spring иммутабельный, будьте готовы ответить почему строки так же иммутабельны в Java.

11) Какие шаблоны проектирования в используете ?
Всегда ожидайте вопрос о шаблонах проектирования на собеседовании к вакансии старшего разработчика. Лучше отметить любой GOF шаблон, а не Singleton или MVC который использует каждый второй Java программист. Лучший ответ может быть шаблон Декоратор или шаблон Внедрение зависимости, которые довольно популярны в Spring Framework. Так же хорошо если называемые вами шаблоны проектирования вы действительно использовали и знаете к какому компромиссу ведет их применение. Как только вы произнесете название шаблона проектирования, например: «Фабрика», интервьюер тут же спросит: «Вы использовали это в своих проектах ?» Поэтому будьте готовы привести примеры и рассказать почему вы выбрали в своем проекте именно этот шаблон.

12) Знаете ли вы о принципе Открытости/Закрытости или Принцип подстановки Барбары Лисков? 
Шаблоны проектирования основаны на принципах объектно-ориентированного проектирования.
Настоятельно рекомендую посмотреть мою статью 10 принципов объектно ориентированного дизайна, которые должен знать программист Java, по крайней мере иметь представление о том как эти принципы помогут вам писать объектно ориентированный код. Если у вас нет ответа на этот вопрос, вы можете вежливо ответить «нет», никто не ожидает от вас знания ответов на все вопросы. Однако зная ответ на вопрос, который вызывает затруднения у большинства разработчиков, вы делаете свою кандидатуру на собеседовании очень сильной.

13) Какой шаблон проектирования будете использовать, что бы защитить ваш код от сторонней библиотеки, которая будет заменена через пару лет ? 
Это всего лишь один из возможных вариаций вопроса о шаблонах проектирования, которые могут быть заданы вам в зависимости от того о чем вы говорите сейчас на собеседовании. Один из способов как оградить свой код от сторонней библиотеки, это зависимость от интерфейса, а не от реализации и использование зависимостей что бы обеспечить конкретную реализацию. Подобные вопросы часто задают старшим разработчикам с 5-7 годами опыта работы.

14) Как предотвратить SQL инъекцию в коде на Java ?
Этот вопрос чаще задают Java EE разработчикам, чем обычным Java программистам, тем не менее это отличный повод узнать о PreparedStatement. PreparedStatement — это объект, который представляет предварительно скомпилированный SQL-оператор. PreparedStatement не только обеспечивает более высокую производительность, но и защищает от SQL инъекций. Если вы работаете по большей части с Java EE или J2EE, вы должны быть знакомы с некоторыми вопросами безопасности, в том числе «атака Фиксации Сессии» или «межсайтовый скриптинг», так же вам нужно уметь избегать этих атак.

15) Расскажите об отличиях типов ссылок в Java, таких как WeakReference, SoftReference иPhantomReference? И почему вы должны их использовать ?
По сути, различие между всеми типами ссылок только одно — поведение Java Garbage Collector с объектами, на которые они ссылаются. В Java объекты, создаваемые через оператор new создаются по strong ссылке. Сборщик мусора (garbage collector) уничтожает такие объекты только тогда, когда на них больше не остается сильных (strong) ссылок. В пакете java.lang.ref есть 3 класса, которые описывают 3 типа ссылок, соответственно SoftReference, WeakReference, PhantomReference. Объекты, созданные через SoftReference, будут собраны в случае, если JVM требует память. То есть имеется гарантия, что все SoftReference объекты будут собраны перед тем, как JVM выбросит исключение OutOfMemoryError. SoftReference часто используется для кешей, потребляющих большое количество памяти. WeakReference не спасает объект от финализации, даже если имеется достаточное количество свободной памяти. Как только на объект не останется strong и soft ссылок, он может быть финализирован. Используется для кешей и для создания цепей связанных между собой объектов. Объекты, созданные через PhantomReference, уничтожаются тогда, когда GC определяют, что ссылаемые объекты могут быть освобождены. Этот тип ссылок используется как альтернатива финализации (для более гибкого освобождения ресурсов).

Это весь список вопросов для интервью старшего Java разработчика. Я не включил в него многие важные вопросы об обработке исключений, сборщике мусора, настройке JVM, которые очень популярны у старших разработчиков, возможно я включу их в следующей части. Но если вы не находите ответов на какой либо из вопросов, дайте мне знать и я обновлю данный пост для моих постоянных читателей.

Оригинальная статья: 15 Technical Core Java Questions Answers for 5 to 6 Years Experienced Programmer 
Перевел dio