244 lines
12 KiB
Markdown
244 lines
12 KiB
Markdown
## 📋 Инструкции для интервьюера
|
||
|
||
**Длительность:** 90 минут
|
||
**Формат:** Техническое интервью
|
||
**Подготовка:** IDE/редактор для coding, листок бумаги для диаграмм
|
||
|
||
---
|
||
|
||
## 🤝 1. Знакомство и мотивация (10 минут)
|
||
|
||
### **Открытие собеседования**
|
||
|
||
_"Добро пожаловать! Меня зовут Андрей, я руководитель группы разработки. Сегодня мы проведем техническое интервью, которое займет около 90 минут. Расскажите, пожалуйста, немного о себе и своем опыте."_
|
||
|
||
### **Вопросы для знакомства:**
|
||
|
||
1. **Расскажите о своем текущем проекте и роли в команде**
|
||
2. **Какие технологии изучаете сейчас или планируете изучить?**
|
||
3. **Что мотивирует вас в разработке ПО?**
|
||
4. **Есть ли вопросы о нашей компании или команде?**
|
||
|
||
### **Краткий рассказ о компании:**
|
||
|
||
_"Мы разрабатываем корпоративные системы с высокой нагрузкой. Работаем с Java, Spring Boot, Kafka, микросервисами. Команда из [X] разработчиков, Agile процессы, современный стек технологий."_
|
||
|
||
---
|
||
|
||
## 💻 2. Техническое интервью - Теория (30 минут)
|
||
|
||
### **Java Core (5-7 минут)**
|
||
|
||
**Вопрос 1:** _"Объясните разницу между `equals()` и `hashCode()`. Почему важно переопределять их вместе?"_
|
||
|
||
**Ожидаемый ответ:**
|
||
|
||
- `equals()` проверяет логическое равенство объектов
|
||
- `hashCode()` возвращает числовое представление для хеш-таблиц
|
||
- Контракт: если `a.equals(b) == true`, то `a.hashCode() == b.hashCode()`
|
||
- Нарушение контракта ломает работу HashMap, HashSet
|
||
- Пример с переопределением в User или Product классах
|
||
|
||
**Вопрос 2:** _"Расскажите о Stream API. Приведите пример обработки списка пользователей."_
|
||
|
||
**Ожидаемый ответ:**
|
||
|
||
- Функциональное программирование в Java 8+
|
||
- Операции: filter, map, reduce, collect
|
||
- Пример: фильтрация активных пользователей, группировка по ролям
|
||
- Ленивые вычисления, parallel streams
|
||
|
||
**Углубляющий вопрос:** _"Какие есть алгоритмы Garbage Collection? Когда использовать G1GC?"_
|
||
|
||
---
|
||
|
||
### **Spring Framework (8-10 минут)**
|
||
|
||
**Вопрос 3:** _"Что такое Dependency Injection? Какие способы DI поддерживает Spring?"_
|
||
|
||
**Ожидаемый ответ:**
|
||
|
||
- Инверсия управления, внедрение зависимостей
|
||
- Constructor injection (предпочтительный)
|
||
- Setter injection, Field injection
|
||
- @Autowired, @Qualifier, @Primary
|
||
- Преимущества: тестируемость, слабая связанность
|
||
|
||
**Вопрос 4:** _"Объясните жизненный цикл Spring Bean. Какие есть scopes?"_
|
||
|
||
**Ожидаемый ответ:**
|
||
|
||
- Создание, инициализация, использование, уничтожение
|
||
- @PostConstruct, @PreDestroy
|
||
- Scopes: singleton, prototype, request, session
|
||
- BeanPostProcessor для кастомной логики
|
||
|
||
**Вопрос 5:** _"Как работает Spring Boot Auto-configuration?"_
|
||
|
||
**Ожидаемый ответ:**
|
||
|
||
- @EnableAutoConfiguration, @SpringBootApplication
|
||
- Условная конфигурация: @ConditionalOnClass, @ConditionalOnProperty
|
||
- spring.factories, автоконфигурация стартеров
|
||
- Возможность переопределения через @Configuration
|
||
|
||
**Углубляющий вопрос:** _"Как настроить JWT аутентификацию в Spring Security для REST API?"_
|
||
|
||
---
|
||
|
||
### **Базы данных (5-7 минут)**
|
||
|
||
**Вопрос 6:** _"Объясните ACID свойства транзакций на примере банковского перевода."_
|
||
|
||
**Ожидаемый ответ:**
|
||
|
||
- **Atomicity:** перевод денег - или обе операции (списание/зачисление), или никакие
|
||
- **Consistency:** балансы всегда корректные, бизнес-правила соблюдены
|
||
- **Isolation:** параллельные транзакции не мешают друг другу
|
||
- **Durability:** подтвержденные операции сохраняются навсегда
|
||
|
||
**Вопрос 7:** _"Что такое N+1 проблема в ORM? Как решить для списка постов с комментариями?"_
|
||
|
||
**Ожидаемый ответ:**
|
||
|
||
- 1 запрос для постов + N запросов для комментариев каждого поста
|
||
- Решения: @EntityGraph, join fetch, batch loading
|
||
- Lazy vs Eager loading стратегии
|
||
- Projection для оптимизации
|
||
|
||
**Углубляющий вопрос:** _"Какие индексы создать для таблицы пользователей с частыми поисками по email и имени?"_
|
||
|
||
---
|
||
|
||
### **Микросервисы (8-10 минут)**
|
||
|
||
**Вопрос 8:** _"Какие преимущества и недостатки микросервисной архитектуры?"_
|
||
|
||
**Ожидаемый ответ:**
|
||
|
||
- **Плюсы:** независимое развертывание, масштабирование, технологическое разнообразие
|
||
- **Минусы:** сложность взаимодействия, распределенные транзакции, мониторинг
|
||
- Bounded Context, DDD подходы
|
||
- Подходит для больших команд и сложных доменов
|
||
|
||
**Вопрос 9:** _"Как обеспечить консистентность данных между сервисами пользователей и платежей?"_
|
||
|
||
**Ожидаемый ответ:**
|
||
|
||
- Saga pattern (orchestration/choreography)
|
||
- Event sourcing, CQRS
|
||
- Eventual consistency
|
||
- Compensation actions при ошибках
|
||
- Distributed transactions (2PC) - почему избегать
|
||
|
||
**Вопрос 10:** _"Что такое Circuit Breaker? Когда применять?"_
|
||
|
||
**Ожидаемый ответ:**
|
||
|
||
- Паттерн для предотвращения каскадных сбоев
|
||
- Состояния: Closed, Open, Half-Open
|
||
- Hystrix, Resilience4j библиотеки
|
||
- Применение при вызовах внешних API, медленных сервисов
|
||
|
||
**Углубляющий вопрос:** _"Как организовать Service Discovery в Kubernetes?"_
|
||
|
||
---
|
||
|
||
### **Message Brokers (2-3 минуты)**
|
||
|
||
**Вопрос 11:** _"В чем разница между Kafka и RabbitMQ?"_
|
||
|
||
**Ожидаемый ответ:**
|
||
|
||
- **Kafka:** высокая пропускная способность, хранение логов, streaming
|
||
- **RabbitMQ:** AMQP протокол, точка-точка сообщения, более простая настройка
|
||
- **Kafka:** append-only log, горизонтальное масштабирование
|
||
- **RabbitMQ:** routing, exchange types, dead letter queues
|
||
|
||
---
|
||
|
||
## 🏗️ 3. Архитектурное мышление (10 минут)
|
||
|
||
### **Проектирование системы**
|
||
|
||
_"Представьте, что нужно спроектировать систему уведомлений для социальной сети. Миллионы пользователей, разные типы уведомлений (push, email, SMS), персонализация. Как бы вы подошли к архитектуре?"_
|
||
|
||
### **Ожидаемое обсуждение:**
|
||
|
||
1. **Входные данные:** REST API, events от других сервисов
|
||
2. **Обработка:** Event-driven архитектура, message queues
|
||
3. **Персонализация:** правила, пользовательские настройки
|
||
4. **Доставка:** адаптеры для разных каналов (push, email, SMS)
|
||
5. **Масштабирование:** горизонтальное масштабирование, partitioning
|
||
6. **Надежность:** retry механизмы, dead letter queues
|
||
|
||
### **Дополнительные вопросы:**
|
||
|
||
- _"Как обеспечить exactly-once delivery уведомлений?"_
|
||
- _"Что делать с пользователями, которые временно оффлайн?"_
|
||
- _"Как организовать A/B тестирование разных типов уведомлений?"_
|
||
|
||
---
|
||
|
||
## ✅ 4. Подведение итогов (5 минут)
|
||
|
||
### **Вопросы кандидата**
|
||
|
||
_"Какие у вас есть вопросы о проекте, команде или технологиях?"_
|
||
|
||
### **Следующие шаги**
|
||
|
||
_"Спасибо за интервью! У нас есть еще [X] кандидатов для интервью. Обратную связь дадим в течение [Y] дней. Если у вас появятся дополнительные вопросы, всегда можете написать."_
|
||
|
||
---
|
||
|
||
## 📊 Система оценки
|
||
|
||
### **Для каждого блока (1-10 баллов):**
|
||
|
||
**Java Core:**
|
||
|
||
- 9-10: Глубокое понимание, может объяснить внутренние механизмы
|
||
- 7-8: Знает основы, может применять на практике
|
||
- 5-6: Базовые знания с пробелами
|
||
- <5: Серьезные пробелы в базовых концепциях
|
||
|
||
**Spring Framework:**
|
||
|
||
- 9-10: Эксперт, знает продвинутые фичи и best practices
|
||
- 7-8: Уверенно работает с основными компонентами
|
||
- 5-6: Знает основы, но не все нюансы
|
||
- <5: Путается в базовых концепциях
|
||
|
||
**Архитектурное мышление:**
|
||
|
||
- 9-10: Продумывает все аспекты, предлагает несколько вариантов
|
||
- 7-8: Логичный подход, учитывает основные требования
|
||
- 5-6: Базовое понимание, нужно направление
|
||
- <5: Не может структурированно подойти к проблеме
|
||
|
||
---
|
||
|
||
## 🎯 Заметки для интервьюера
|
||
|
||
### **Что отмечать:**
|
||
|
||
- Четкость объяснений
|
||
- Практический опыт vs теоретические знания
|
||
- Способность к дискуссии и аргументации
|
||
- Готовность признать незнание
|
||
- Интерес к обучению новому
|
||
|
||
### **Red flags:**
|
||
|
||
- Неуверенность в базовых концепциях
|
||
- Неспособность объяснить решения
|
||
- Отсутствие вопросов о проекте
|
||
- Негативные отзывы о предыдущих местах работы
|
||
|
||
### **Green flags:**
|
||
|
||
- Конкретные примеры из опыта
|
||
- Вопросы о best practices
|
||
- Интерес к новым технологиям
|
||
- Системное мышление |