«Неужели кто-то всерьез это спрашивает?»: вопросы на собеседовании по Java, которые нельзя задавать
Разработчик программного обеспечения Арнольд Галович нашел в интернете еще несколько вопросов по Java, которые не стоит задавать на собеседовании в 2022 году. Первую часть найдете здесь. О чем еще нельзя спрашивать кандидата, чтобы не тратить время зря и не опозориться, читайте далее.
Вот что он написал.
Примечание: в материале рассмотрены вопросы, которые задают IT-специалистам уровня Middle и выше. Они взяты из Google.
Почему массив символов предпочтительнее, чем строка, для хранения конфиденциальной информации?
Даже я, имея десятилетний опыт разработки, не смог бы ответить на этот вопрос. Если вы тоже не можете — не расстраивайтесь. Дело не в том, что ответ сложный, а в том, что он специфичен для определенной среды. Разберемся.
Как известно, String
в Java неизменна. Она будет храниться в пуле String, пока ее не удалит сборщик мусора, то есть бесконечно долго. Если злоумышленник получит доступ к памяти, он может создать дамп, который будет содержать значения строк в пуле. Если эта строка — имя пользователя/пароль, данные могут быть украдены.
Символьный массив, так как это изменяемая структура, можно заполнить данными, использовать их, а потом заменить какими-нибудь нерелевантными символами. Таким образом, злоумышленник не сможет украсть важную информацию.
Меня всегда раздражало, что люди чересчур заботятся о безопасности в обычной Java-среде. Я не говорю, что это не важно, но представьте, что Java-приложение работает в Docker. Контейнеры работают в кластере k8s на AWS или другом облачном провайдере. Если хакер получит доступ к приложению и его памяти, станет ли дамп памяти самой большой проблемой в ситуации, когда произошел взлом облачной инфраструктуры? Если у злоумышленника есть доступ к контейнерам в кластере ks8, разработчику явно будет, о чем беспокоиться. Если кто-то получает доступ к памяти приложения, это полная жо**.
Поставленный вопрос может иметь смысл, если речь идет о критичной к безопасности среде, где специалист знает, что безопасность приложения в приоритете.
В чем разница между JVM, JRE и JDL в Java?
Интервьюер пытается проверить, смотрел ли кандидат первые пять минут ютуб-курса Java 101? Слишком легко.
В чем важность рефлексии в Java?
Рефлексия в Java осуществляется с помощью Java Reflection API
и часто используется для фреймворков, таких как Spring. Мне не нравится, когда айтишники для решения одной проблемы создают сложную систему, которую причем затратно и сложно поддерживать.
Обычному бэкенд-разработчику на Java не нужно быть экспертом в рефлексии. Если будет необходимость разобраться в этой теме, он сделает это.
Способы использования потоков (нитей) в Java
Ответ на этот вопрос, по мнению его автора, заключается в использовании класса Thread
и интерфейса Runnable
. И даже в случае с Runnable
автор считает, что использовать его нужно в связке с классом Thread
.
Вопрос к Java-разработчикам: когда вы последний раз использовали класс Thread
? Наверняка лет десять назад.
Он вообще больше не используется. Даже если разработчик хочет использовать обычную потоковую обработку данных JDK, то как минимум использует ExecutorService
, а не обычный Thread
.
Нужно соответствовать реальности. Нельзя продолжать задавать такие вопросы, когда мы просто реализуем обычные API. Такова суровая правда.
С таким же успехом можно спросить кандидата, что такое Object#wait
и Object#notify
, или задать любой другой вопрос о функциях, которые были актуальны в 1990-е годы.
В чем разница между конструктором и методом класса в Java?
Что это за вопрос? Неужели кто-то всерьез его задает?
Это тоже самое, что спросить:
- в чем разница между
static
иfinal
? - в чем разница между
public
иstatic
? - в чем разница между сборкой мусора и кучей?
Как запретить сериализацию атрибутов класса в Java?
Помню, как мы в университете делали лабы по выполнению вызовов RPC (Remote Procedure Call — удаленный вызов процедур). Когда JSON был менее известен и часто в качестве формата взаимодействия между компонентами использовался XML, возникла идея RPC. Он выглядел как обычный вызов метода, но под капотом превращался в удаленный вызов удаленной JVM.
Казалось, это отличная идея для упрощения действий разработчиков, но на практике она была едва пригодна для использования. Проблемы были с нестабильностью: классы должны были быть одинаковыми на обеих сторонах. Например, если разработчик передавал POJO (простой Java-объект) методу, который был RPC, объект должен был быть одинаковым с обеих сторон. Как это проверялось? У класса объекта был атрибут serialVersionUID
, который определял номер версии для конкретного класса. Если они не совпадали, выдавалась ошибка.
private static final long serialVersionUID = 42L;
Сериализация и интерфейс Serializable в Java — это устаревшая концепция. Никто ее не использует, но вопросы на собеседовании постоянно задают.
В Java для предотвращения сериализации атрибутов есть ключевое слово transient, но блин, когда вы последний раз его использовали или хотя бы слышали о нем? За мою карьеру, а это уже более десяти лет, я ни разу не пользовался этим ключевым словом.
Перестаньте задавать этот вопрос. В мире, где есть JSON, он не имеет смысла!
Что произойдет, если модификатор Static не будет включен в сигнатуру главного метода в Java?
Этот вопрос ничего не скажет о способности кандидата писать функционально корректный и сопровождаемый код. К тому же, если использовать Spring или любой другой стартер проекта, скорее всего не придется иметь дело с main-классами напрямую, потому что такие программы генерируют их предварительно (start.spring.io).
Что произойдет, если внутрь одного класса в Java поместить несколько main-методов?
Зачем кому-то вообще пытаться это сделать? Почему интервьюер думает, что кандидат сможет ответить на этот вопрос?
Что такое клонирование объектов в Java, и как его произвести?
Какого черта? Сначала сериализация, теперь клонирование? Это, наверное, шутка!
Самое ужасное, что автор вопроса отвечает на него, даже не объясняя, что реализация интерфейса Cloneable
— плохая идея.
Это очередной глупый вопрос из времен Java 1.0. Пожалуйста, перестаньте его задавать.
Заключение
Старайтесь думать о вопросах, которые позволят оценить мыслительный процесс кандидата, а не его лексические знания. Что же касается вышеописанных вопросов, то они способны направить кандидата в неправильное русло и только навредить при подготовке к собеседованию. Не надо так.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: