Lexicon | Java вопросы
13 subscribers
15 photos
14 links
Подготовка к собеседованиям для Java разработчиков.

Публикуем вопросы и разборы задач, которые встречаются на интервью backend разработчиков. Подходит для подготовки к позициям от junior до senior.

Новые вопросы выходят регулярно.
Download Telegram
Вопрос

При проектировании API с использованием checked исключений, какие конкретные шаги и соглашения ты применяешь для стандартизации обработки ошибок клиентом?

Ответ

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

#lexicon #собеседование #java #senior #errors
Вопрос

Расскажите, как работает ReentrantLock и приведите пример, когда повторное захватывание блокировки может быть полезным в вашем коде.

Ответ

ReentrantLock — это реализация интерфейса Lock, позволяющая одному потоку повторно входить в уже захваченную им же блокировку без блокировки самого себя. Это обеспечивает гибкость в управлении синхронизацией, например, при вызове вложенных методов, которые требуют одной и той же блокировки. Повторное захватывание полезно, когда внутри критической секции вызываются другие методы, также защищённые той же блокировкой, что предотвращает взаимную блокировку и упрощает структуру кода. Для корректного использования необходимо явно вызывать lock() и unlock(), обеспечивая освобождение блокировки в блоке finally.

#lexicon #собеседование #java #middle #concurrency
Вопрос

Какие файлы конфигураций и структуры каталогов вы используете для разделения настроек разных окружений? Как предлагаете управлять секретами и чувствительными данными в таких файлах?

Ответ

Разделение настроек разных окружений осуществляется с помощью отдельных конфигурационных файлов или профилей (например, application-dev.yml, application-prod.yml), которые содержат параметры, специфичные для каждого окружения. Структура каталогов обычно отражает логическое разделение, где базовые настройки лежат в общем файле, а окруженческие расширяются и переопределяются в специализированных файлах. Для управления секретами и чувствительными данными применяются защищённые хранилища, такие как Vault или KMS, либо переменные окружения, чтобы не хранить их напрямую в конфигурационных файлах и избежать утечек.

#lexicon #собеседование #java #junior #spring #boot
Вопрос

Какие метрики и логи вы анализируете, чтобы оценить эффективность настроек JVM по снижению пауз GC? Приведите пример конкретного подхода мониторинга в продакшне.

Ответ

Для оценки эффективности настроек JVM по снижению пауз GC анализируют метрики времени пауз сборки мусора, частоты GC, объема освобождаемой памяти, а также количество и длительность Full GC. Логи GC с подробным выводом (например, с опциями -XX:+PrintGCDetails и -XX:+PrintGCDateStamps) используются для выявления паттернов и аномалий. В продакшне популярным подходом является сбор этих метрик с помощью инструментов мониторинга (например, Prometheus с экспортером JVM) и визуализация в Dashboards, что позволяет быстро реагировать на ухудшение производительности.

#lexicon #собеседование #java #middle #jvm #garbage
Вопрос

Опишите, как настроить ограничение доступа к конкретным эндпоинтам REST API с помощью аннотаций @PreAuthorize или @Secured в Spring. Приведите пример выражения для роли и дополнительные условия доступа.

Ответ

Для ограничения доступа к REST API в Spring используются аннотации @PreAuthorize или @Secured, которые применяются к методам контроллеров или сервисов. @PreAuthorize позволяет задавать сложные выражения на языке SpEL, например '@PreAuthorize("hasRole('ADMIN') and #userId == authentication.principal.id")' ограничит доступ по роли и дополнительному условию. @Secured поддерживает упрощённый синтаксис с перечислением ролей, например '@Secured("ROLE_ADMIN")'. Важно, чтобы включена поддержка методной безопасности через @EnableGlobalMethodSecurity.

#lexicon #собеседование #java #junior #spring #security
Вопрос

Опиши, как настройка connection pool может помочь справиться с узкими местами при большом количестве одновременных запросов. Что именно ты настраиваешь и почему?

Ответ

Настройка connection pool позволяет ограничить и управлять количеством одновременных подключений к базе данных, что предотвращает переполнение ресурсов и снижает время ожидания запросов. Основные параметры для настройки — это максимальное и минимальное количество соединений, время жизни соединения и время ожидания в очереди. Правильная конфигурация помогает снизить задержки при пиковых нагрузках и повысить стабильность работы приложения, обеспечивая эффективное использование закрытых ресурсов.

#lexicon #собеседование #java #senior #backend #optimization
Вопрос

Какие типы индексов существуют в реляционных базах и в каких случаях какой тип лучше использовать?

Ответ

В реляционных базах данных существуют основные типы индексов: B-деревья, хеш-индексы, и битмап-индексы. B-деревья подходят для упорядоченных данных и диапазонных запросов, обеспечивая быструю сортировку и поиск. Хеш-индексы эффективны для точного поиска по равенству, но не поддерживают диапазонные запросы. Битмап-индексы применяются для столбцов с низкой кардинальностью, где важна компактность и высокая скорость фильтрации.

#lexicon #собеседование #java #junior #core #backend #sql
Вопрос

Опишите пошагово, как вы настраивали интеграцию метрик трассировки с системой алертинга для своевременного обнаружения деградации и восстановления устойчивости сервиса.

Ответ

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

#lexicon #собеседование #java #senior #backend #observability
Вопрос

Как можно конфигурировать BeanPostProcessor для изменения поведения бина с конструкторной инъекцией и в каких сценариях это будет полезно?

Ответ

BeanPostProcessor можно сконфигурировать, реализовав методы postProcessBeforeInitialization и postProcessAfterInitialization, чтобы модифицировать созданный бин или его свойства после конструкторной инъекции. Это полезно для добавления дополнительной логики, валидации или проксирования бинов без изменения их исходного кода. Особенно эффективно используется для внедрения аспектов, кэширования или динамического изменения поведения объектов на этапе инициализации.

#lexicon #собеседование #java #middle #spring #injection
Вопрос

Какие основные паттерны хранения данных вы используете в NoSQL базах? Опишите, как вы выбираете между key-value хранилищем и document storage в ваших проектах.

Ответ

Основные паттерны хранения данных в NoSQL включают key-value, документное, колонковое и графовое хранение. При выборе между key-value и документным хранилищем учитывают структуру данных и требования к запросам: key-value подходит для простых, быстро доступных пар ключ-значение, тогда как document storage удобен для более сложных, вложенных данных с возможностью гибкого поиска по атрибутам. Важны также масштабируемость, производительность и требования к консистентности при принятии решения.

#lexicon #собеседование #java #middle #backend #storage
Вопрос

Объясните разницу между lazy и eager загрузкой в JPA. Какие преимущества и недостатки у каждого подхода?

Ответ

Lazy загрузка откладывает извлечение связанных данных до момента их непосредственного использования, что снижает начальную нагрузку на базу и улучшает производительность при работе с большими объемами данных. Eager загрузка сразу загружает все связанные объекты, что упрощает доступ, но может привести к избыточным запросам и снижению производительности при ненужном извлечении данных. Выбор между подходами зависит от сценария использования и требований к производительности и памяти.

#lexicon #собеседование #java #junior #spring #data
Вопрос

Какие методы и статус-коды вы используете для обработки ситуаций, когда клиент делает запросы с устаревшей версией API? Опишите конкретные сценарии и ответы сервера.

Ответ

Для обработки запросов на устаревших версиях API обычно применяется контроль версии через заголовки или URL. При обнаружении устаревшей версии сервер может вернуть 426 Upgrade Required или 400 Bad Request с описанием необходимости обновления. В некоторых случаях используют 301/302 редиректы на актуальную версию API. В ответах желательно указывать рекомендации по обновлению клиента и поддерживать документацию для разных версий API.

#lexicon #собеседование #java #senior #backend #http
Вопрос

Как вы реализуете rate limiting на уровне backend, чтобы предотвратить перегрузку сервиса? Приведите пример конкретного подхода или инструмента и опишите шаги его внедрения.

Ответ

Реализация rate limiting на уровне backend обычно включает выбор подходящего алгоритма (например, Token Bucket или Leaky Bucket) и инструмента (например, Redis для хранения состояния лимитов). Основные шаги — определить порог запросов за единицу времени, внедрить промежуточное ПО (middleware) или фильтр, который учитывает количество запросов от каждого пользователя или IP, и при превышении лимита возвращает соответствующий HTTP-статус (например, 429). Использование распределенного хранилища обеспечивает согласованность лимитов при масштабировании сервиса.

#lexicon #собеседование #java #middle #backend #scalability
Вопрос

Опишите, как вы организуете сбор и анализ метрик из production-приложения для выявления bottlenecks: какие инструменты внедряете, как дашборды и алерты помогают в ранней диагностике проблем?

Ответ

Для сбора и анализа метрик из production-приложения используют инструменты мониторинга, такие как Prometheus или Grafana, которые позволяют получать данные о производительности в реальном времени. Внедряют трассировку и профилирование с помощью APM-систем (например, Elastic APM или Jaeger) для выявления узких мест и hot spots. Дашборды настраивают для визуализации ключевых метрик, а алерты — для оперативного уведомления о проблемах, что обеспечивает раннюю диагностику и своевременное реагирование на деградацию производительности.

#lexicon #собеседование #java #junior #performance
Вопрос

Приведите пример сценария, когда асинхронная коммуникация между сервисами может привести к проблемам целостности данных. Как бы вы решили эту проблему на практике?

Ответ

Асинхронная коммуникация между сервисами может привести к рассогласованию данных, если один сервис обновляет состояние, а другой обрабатывает события с задержкой или ошибками. Такая ситуация возникает, например, при обновлении заказа и списании средств в двух разных сервисах, где сообщения могут быть доставлены некорректно или повторно. Для решения этой проблемы применяют паттерны компенсации (saga), ведут аудит событий и используют идемпотентные операции для предотвращения дублирования и потери данных.

#lexicon #собеседование #java #senior #backend #arch
Вопрос

Объясните, как устанавливается TCP-соединение и какие основные этапы этого процесса.

Ответ

Установка TCP-соединения происходит через процесс трехстороннего рукопожатия (three-way handshake). Сначала клиент отправляет серверу SYN-пакет для инициации соединения, сервер отвечает SYN-ACK пакетом, подтверждая получение и готовность, затем клиент отправляет ACK-пакет для подтверждения. Этот механизм обеспечивает согласование параметров соединения и синхронизацию номеров последовательности перед передачей данных.

#lexicon #собеседование #java #junior #backend #networking
Вопрос

Опишите пошагово, как внедрить в event-driven систему механизм дедлайнов (TTL) для сообщений, чтобы избежать обработки устаревших событий. Какие настройки используете в Kafka или RabbitMQ для этого?

Ответ

Для реализации механизма TTL в event-driven системе необходимо ограничить время жизни сообщений, чтобы устаревшие события не обрабатывались. В RabbitMQ можно использовать свойство TTL на уровне очереди или отдельных сообщений, задавая параметр x-message-ttl или x-expires, после чего сообщения автоматически удаляются. В Kafka можно настроить retention.ms для топиков, что определит время хранения сообщений на брокере, после которого они становятся недоступны для потребителей. Важно также корректно обрабатывать время жизни сообщений на уровне потребителей, проверяя timestamp и игнорируя старые события при необходимости.

#lexicon #собеседование #java #middle #backend #messaging
Вопрос

Какие проблемы могут возникнуть при переопределении equals() и hashCode() в классах с генериками и как вы их решаете на практике?

Ответ

При переопределении equals() и hashCode() в классах с дженериками важно учитывать, что тип параметра во время выполнения подвергается стиранию, поэтому нельзя полагаться на конкретные типы. Также в реализации нужно применять меры для предотвращения ошибок при сравнении null и обеспечивать согласованность между equals() и hashCode(). Практически используют сравнение полей, значимых для идентичности объекта, с учетом возможных null, и включают все эти поля в формирование хэш-кода, часто с помощью встроенных утилит, таких как Objects.equals() и Objects.hash().

#lexicon #собеседование #java #senior #fundamentals
Вопрос

Какие паттерны асинхронного программирования вы используете для эффективного управления потоками и как они помогают избежать проблем с блокировками и конкуренцией?

Ответ

Для эффективного управления потоками применяются паттерны, такие как ExecutorService для управления пулом потоков, Future и CompletableFuture для обработки асинхронных задач с возможностью композиции, а также паттерн Producer-Consumer для разделения задач на производящие и потребляющие. Эти паттерны помогают избежать блокировок благодаря ограничению количества одновременно выполняемых потоков и асинхронному ожиданию результатов без удержания ресурсов. Использование неблокирующих структур данных и механизмов синхронизации снижает риск условий гонки и конкуренции.

#lexicon #собеседование #java #senior #asynchronous
Вопрос

Какие HTTP-заголовки рекомендуете использовать для защиты API при аутентификации и авторизации, и как их правильно настраивать на сервере?

Ответ

Для защиты API при аутентификации и авторизации обычно используются заголовки Authorization с токенами типа Bearer, содержащими JWT или другие схемы аутентификации. Важно правильно настроить CORS-заголовки (Access-Control-Allow-Origin, Access-Control-Allow-Headers) для контроля доступа из браузера. Также стоит применять заголовки безопасности, такие как Strict-Transport-Security для принудительного использования HTTPS и Content-Security-Policy для ограничения источников контента. На сервере необходимо валидировать и парсить заголовки, обеспечивая корректную проверку полномочий и защиту от подделки запросов.

#lexicon #собеседование #java #junior #backend #security