Тестовое собеседование Java разработчика #19 - Михаил Гончаренко
Запись тестового Java-интервью: теория Java и Spring, алгоритмическая задача и системный дизайн высоконагруженного сервиса изображений. Собеседующий уточняет и проверяет ответы кандидата на практических сценариях.
Тестовое интервью Java-разработчика Михаила Гончаренко охватывает Streams, многопоточность, асинхронность, ООП, коллекции и жизненный цикл Spring Bean. Кандидат решает задачу удаления дубликатов из списка, а затем проектирует высоконагруженный сервис изображений в духе Instagram: хранение, кэширование, масштабирование, CI/CD и тестирование. В части про CompletableFuture и конкретные технологии кэширования кандидат прямо отмечает, что не имеет практического опыта или не готов дать точный ответ.
Подготовить чёткое объяснение Java Stream: intermediate-операции строят конвейер, terminal-операция запускает его; отдельно объяснять, почему parallelStream не гарантирует ускорения.
Различать ExecutorService, Runnable и Callable, а также лимит потоков FixedThreadPool и постановку избыточных задач в очередь.
Уметь сравнить Future и CompletableFuture на примере неблокирующих цепочек вычислений, обработчиков завершения и случаев, когда get() всё же блокирует поток.
Для удаления дубликатов проговаривать компромисс: HashSet даёт ожидаемую линейную сложность, но требует дополнительной памяти; сортировка с последующим линейным проходом — O(n log n), меняет порядок элементов и требует аккуратной обработки списка.
В системном дизайне разделять объектное хранилище изображений вроде S3 и реляционную БД с метаданными публикаций, пользователей и ссылками на объекты.
Быть готовым описать pipeline: ветки Gitflow, unit- и интеграционные тесты, статический анализ Sonar, тестовая среда, rolling deployment и откат версии при инциденте.
Повторить порядок жизненного цикла Spring Bean и назначение BeanDefinition, BeanFactoryPostProcessor, BeanPostProcessor, @PostConstruct и @PreDestroy.