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

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

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

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

Ответ

Для эффективного управления потоками применяются паттерны, такие как 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
Вопрос

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

Ответ

Мониторинг в распределённой системе строится на сборе метрик, логов и трассировок с каждого микросервиса для контроля состояния и быстрого выявления аномалий. Применяется централизованное логирование с помощью систем, таких как ELK Stack или Loki, а для трассировки запросов через сервисы используются инструменты OpenTelemetry или Jaeger. Для оповещений на основе мониторинга метрик применяют Prometheus и Alertmanager. Важно обеспечить корреляцию логов и метрик по общим идентификаторам запросов для эффективной диагностики и локализации проблем.

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

Какие есть стратегии маршрутизации сообщений в RabbitMQ? Приведите примеры использования различных типов обменников (exchange) для реализации этих стратегий.

Ответ

Стратегии маршрутизации сообщений в RabbitMQ реализуются через различные типы обменников: direct, fanout, topic и headers. Direct обменник отправляет сообщение в очередь, совпадающую с точным routing key; fanout рассылает сообщение во все привязанные очереди, реализуя широковещательную рассылку. Topic обменник позволяет направлять сообщения согласно шаблонам routing key, что удобно для гибкой фильтрации, а headers маршрутизирует сообщения по значениям заголовков. Выбор типа обменника зависит от бизнес-логики: direct для точечных сообщений, fanout для уведомлений всем подписчикам, topic для тематической маршрутизации и headers для сложных условий.

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

Какие потенциальные проблемы могут возникнуть при использовании raw types в Java и как этого избежать с помощью generics? Приведите пример кода и объясните.

Ответ

Использование raw types в Java приводит к потере типовой безопасности, что может вызвать ClassCastException во время выполнения. Generics позволяют определять типы параметров, обеспечивая проверку типов на этапе компиляции и исключая необходимость ручных кастов. Например, List<String> гарантирует, что список содержит только строки, тогда как List без параметров может содержать любые объекты, приводя к ошибкам. Чтобы избежать проблем с raw types, рекомендуется всегда использовать параметризованные типы и избегать необобщённых коллекций.

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

Какое поведение и жизненный цикл у Spring-бина с областью видимости singleton? Приведите пример, когда это предпочтительно.

Ответ

Spring-бин с областью видимости singleton создаётся один раз при старте контейнера и существует в течение всего времени жизни приложения. Все запросы к такому бину возвращают одну и ту же инстанцию, что обеспечивает экономию ресурсов и состояние, если оно требуется. Такой scope подходит для безсостоянийных сервисов или компонентов, где общий доступ к ресурсам безопасен и желателен. Например, бины-сервисы, реализующие логику бизнес-процессов, часто объявляют singleton для повышения производительности.

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

Как в Spring Boot настроить профили, чтобы автоматически выбирать конфигурацию базы данных для разных окружений? Расскажите, какие файлы properties или yaml для этого используются и как их приоритет определяется.

Ответ

Для настройки профилей в Spring Boot используют файлы application-{profile}.properties или application-{profile}.yaml, где {profile} — имя профиля, например, dev или prod. Профиль активируется через свойство spring.profiles.active, которое можно задавать в основном application.properties, переменных окружения или аргументах командной строки. Spring Boot загружает сначала основной application.properties, затем перекрывает его значениями из файла активного профиля, определяя приоритет конфигураций. Это позволяет удобно переключать настройки базы данных и другие параметры для разных окружений.

#lexicon #собеседование #java #middle #spring_boot #backend
📘 Разбор опроса

Анализ плана выполнения SQL-запроса

Вопрос: Что показывает explain plan для анализа производительности запроса?

Правильный ответ: План выполнения и операции СУБД

Explain plan показывает последовательность операций СУБД (сканирование, индексы, соединения) для оптимизации запроса.
👍1
Вопрос

Как ты объяснишь основное различие между checked и unchecked исключениями в Java, и почему важно это различие при проектировании API?

Ответ

Checked исключения требуют обязательной обработки или декларации с помощью throws, что обеспечивает явное управление ошибками на этапе компиляции. Unchecked исключения не требуют явного перехвата и обычно сигнализируют о проблемах, которые можно считать программными ошибками. При проектировании API важно различать эти типы исключений для балансировки контроля над ошибками и удобства использования, обеспечивая правильное информирование пользователей API о возможных ошибках.

#lexicon #собеседование #java #junior #java_errors #backend
👍1
📘 Разбор опроса

Эффективное кеширование в backend

Вопрос: Какой подход помогает избежать устаревших данных в кеше?

Правильный ответ: Регулярная инвалидация кеша

Инвалидация кеша при изменении данных предотвращает использование устаревших значений.
Вопрос

Как реализовать аутентификацию с помощью JWT в REST API? Опишите конкретные шаги и примеры использования.

Ответ

Аутентификация с помощью JWT в REST API включает создание и подпись токена при успешной проверке учетных данных пользователя, обычно после логина. Токен содержит полезную нагрузку с идентификатором пользователя и временем истечения, защищен секретным ключом. При последующих запросах сервер проверяет подпись и валидность токена из заголовка Authorization, что позволяет обеспечивать доступ к защищенным ресурсам без сессий. Важно реализовать обновление токенов и обработку ошибок в случае истечения срока действия или подделки токена.

#lexicon #собеседование #java #middle #backend_security #backend #core
📘 Разбор опроса

Spring Security: UserDetailsService

Вопрос: Какой метод нужно реализовать в UserDetailsService?

Правильный ответ: loadUserByUsername

Метод loadUserByUsername загружает данные пользователя по имени для аутентификации.