- SOLID.
- Паттерны. Какие знаете? Каких видов бывают? Расскажите парочку (желательно разных видов)? Какие применяли на практике или встречались где-то? Чем декоратор отличается от прокси, а абстрактная фабрика от обычной?
- Что такое coupling и cohesion? Что из них (или оба) должно быть сильным (высоким) и/или слабым (низким)?
- Что такое куб масштабирования?
- Расскажите о CAP-теореме. Как MongoDB (например) удовлетворяет CAP-теореме?
- Чем композиция отличается от агрегации?
- Какие бывают тестовые объекты (заглушки)? Чем стаб отличается от мока?
- Дайте определение полиморфизму
- Что такое REST? Какое API является RESTful? Чем REST отличается от SOAP?
Обычно просто просят расшифровать, что каждая буква означает с минимальным пояснением. Никто из моих интервьюеров не стал размусоливать или обсуждать. Один раз спросили, зачем оно вообще надо. Но, я думаю, чем больше сеньорности в вакансии, тем глубже и интереснее дискуссия может возникнуть.
- S - Принцип единственной ответственности (The Single Responsibility Principle). Каждый класс должен иметь одну и только одну причину для изменений.
- O - Принцип открытости/закрытости (The Open Closed Principle). Сущности должны быть открыты для расширения, но закрыты для модификации.
- L - Принцип подстановки Барбары Лисков (The Liskov Substitution Principle). Объекты должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. Наследующий класс должен дополнять, а не изменять базовый.
- I - Принцип разделения интерфейса (The Interface Segregation Principle). Много специальных интерфейсов лучше, чем один универсальный.
- D - Принцип инверсии зависимостей (The Dependency Inversion Principle). Зависеть нужно от абстракций, а не от реализаций.
Первоисточником, сформулировавшим данные принципы стал дядюшка "Свет наш чистый код" Боб Мартин, а акроним придумал один из его читателей. Хотите погрузиться глубже? Тогда читайте часть 3 его книги "Чистая архитектура". Книжка годная, читается легко, не пожалеете. Однако пропускайте всё через свой опыт и оценивайте критически, мало ли что :)
Сама по себе тема богатая и холиворная, ибо многие начинают трактовать эти принципы по-своему. На этой почве может случиться недопонимание с собеседующим, будьте аккуратны и конструктивны. Достаточно поискать статьи на Хабре по SOLID или каким-нибудь принципам в отдельности и заглянуть в комментарии. Кому-то SOLID вообще не по душе.
Также, могу посоветовать, самостоятельно разобрать каждый принцип на практическом примере, ибо за это тоже могут спросить. Или заглянуть на Baeldung.
Паттерны. Какие знаете? Каких видов бывают? Расскажите парочку (желательно разных видов)? Какие применяли на практике или встречались где-то? Чем декоратор отличается от прокси, а абстрактная фабрика от обычной?
Обычно советуют и в вакансиях пишут про книжку GoF. Но, на мой взгляд, сейчас есть вариант даже лучше - refactoring.guru. Там и сравнение, и на родной мове (русский, украинский, английский, китайский), и примеры на вашем любимом ЯП, прекрасные иллюстрации и диаграммы. Там также можно купить книжку по паттернам. Автору большой-большой респект.
Что такое coupling и cohesion? Что из них (или оба) должно быть сильным (высоким) и/или слабым (низким)?
Coupling (Зацепление) - степень зависимости между программными компонентами. Должна быть низкой.
Cohesion (Связность) - степень сфокусированности методов класса. Должна быть высокой.
Подробнее почитать и посмотреть картинки можно тут на английском или тут на русском.
Тема периодически затрагивается на Хабре в контексте построения хорошей архитектуры и написания качественного кода. Как и всегда, особую ценность составляют комментарии:
- Создание архитектуры программы или как проектировать табуретку
- Принцип единственной ответственности: глубокое погружение. Есть раздел, где тема разобрана с примерами кода.
- Утрата слабой связанности
Также coupling и cohesion часто упоминаются или ведут к обсуждению GRASP. Об этом можно почитать на Хабре: раз и два.
Куб масштабирования (scale cube, из книги The Art of Scalability) является наглядным изображением трёх ортогональных способов увеличения производительности приложения: sharding, mirrorring и microservices.
- Sharding (data partioning) - разбиение и размещение однотипных данных по разным узлам.
- Mirroring (horizontal duplication) - дублирование или клонирование данных для уменьшения времени отклика.
- Microservices - архитекутрный подход, при котором функциональность системы разбивается на отдельные сервисы по бизнес-задачам.
Почитать подробнее:
- Упоминание в статье на Хабре.
- В статье на microservices.io.
- Даже в wiki есть с pros и cons.
- SCALING APPLICATIONS : THE SCALE CUBE.
- И вот ещё.
- А тут с картинками.
- Также куб упоминается в книгах Microservice Patterns and Best Practices и Microservices Patterns (есть на русском).
Теорема CAP - эвристическая теорема, утверждающая, что любая распределённая система может удовлетворять не более двум из трёх свойств:
- Consistency (согласованность) - во всех вычислительных узлах в один момент времени данные не противоречат друг другу - каждое чтение вернёт самую последнюю запись. Подразумевает под собой линеаризуемость - если произошла какая-либо операция, то её результат доступен сразу после того, как был получен ответ о её выполнении.
- Availability (доступность) - любой запрос получает успешный ответ без гарантии, что ответы со всех узлов системы совпадают.
- Partition tolerance (устойчивость к разделению) - система продолжает функционировать, несмотря на потерю (или задержку) произвольного числа сообщений между узлами из-за сетевых проблем (асинхронная сеть).
MongoDB, по мнению большинства (например), это - CP, но вот есть статья... Держим в уме, что теорема эвристическая и носит упрощательный характер. Также вызывает много споров.
Про большинство БД можно найти ответы в статьях по дополнительным ссылкам ниже.
Подробности:
- Есть несколько статей на Хабре: раз, два, три, четыре, пять
- Visual Guide to NoSQL Systems с красивой иллюстрацией треугольника CAP и БД на его сторонах
- The CAP FAQ
- Статья на bigdataschool
- Споры вокруг MongoDB на stackoverflow
- CAP Theorem на портале IBM
- CAP Theorem and Distributed Database Management Systems с картинками
- What is the CAP Theorem? на богомерзком medium
Композиция (composition) - отношение "является частью" (HAS-A Relationship), при котором целое явно контролирует время жизни своей составной части.
Агрегация (aggregation) - отношение "является частью" (HAS-A Relationship), при котором целое хоть и содержит свою составную часть, время их жизни не связано.
Подробнее:
Тестовый объект (Test Double) - объекты, которые необходимы в тестах для подмены внешних зависимостей тестируемого кода Типы тестовых объектов:
- Dummy - объекты, которые передаются в методы, но не используются. Например: заполнение списка параметров, часто это просто null
- Fake - заглушка, являющаяся рабочей имплементацией, но с урезанной функциональностью и неприменима в production-окружении. Например: in-memory БД (fake database)
- Stub - заглушка с жестко заданными ответами на вызовы со стороны тестируемого объекта (system under test - SUT) во время теста
- Spy - это разновидность Stub, которая записывает информацию о произошедшем с ней, какие вызовы её методов были выполнены и сколько раз, как изменилось состояние и т.п.
- Mock - заглушка с ожиданиями определённого набора вызовов, которые будут на ней выполнены в ходе теста
Из данного набора заглушек только Mock используется для верификации поведения, остальные - для верификации состояния тестируемого объекта .
Подробнее:
- В статье на Хабре
- Mock vs Stub
- Mocks Aren't Stubs от Мартина Фаулера
- Test Double
- Test Stub
- Test Spy
- Mock Object
- Fake Object
- Interaction Based Testing в Spock Framework
- Документация Mockito
- Mockito Mock vs. Spy in Spring Boot Tests
- Tag: Mockito на Bealdung
В общем виде определение полиморфизма приводит Бенджамин Пирс в своей книге Типы в языках программирования:
Термин “полиморфизм” обозначает семейство различных механизмов, позволяющих использовать один и тот же участок программы с различными типами в различных контекстах.
Полиморфизм бывает следующих видов:
- Универсальный полиморфизм. Он подразделяется на:
- Параметрический полиморфизм - описывает вычисления в общем виде, абстрагируясь от конкретных типов, которые будут использованы. Параметрически полиморфные функции также называются обобщенными (Generic).
- Полиморфизм включений (inclusive) - описывает вычисления не только для конкретного типа, но для и всех его возможных подтипов. Отражает принцип подстановки Барбары Лисков.
- Специальный полиморфизм (или ad-hoc) - диспетчеризация (перенаправление) к одной или нескольким функциям для конкретного типа аргумента. Из него выделяют подтипы:
- Перегрузка (overloading) позволяет объявлять функции с одним и тем же именем, но с разными типами аргументов и их количеством (арностью).
- Неявное приведение типов - преобразование одного типа в другой по определённым правилам, описанным в стандарте языка, и выполняемое компилятором.
Безотносительно к Java полиморфизм хорошо разобран в статье Полиморфизм простыми словами. В других источниках:
- Java Challengers #3: Полиморфизм и наследование на Хабре
- Как полиморфизм реализован внутри JVM на Хабре
- Все о переопределении в Java на Хабре
- Неформальное введение в теорию типов
- Несколько глав из Java Virtual Machine Specification: Invoking Methods, invokevirtual, Linking
- Несколько глав из Java Language Specification: Inheritance, Overriding, and Hiding, Conversions and Contexts, Type Inference
REST – это архитектурный стиль, который можно применить для реализации взаимодействия web-сервисов. Вот несколько признаков REST, которые хотят услышать большинство интервьюеров:
- Концентрация на ресурсах
- Ресурс имеет уникальный URI
- Формат передачи - обычно JSON, но можно XML
- Транспортный протокол - HTTP. Строго говоря - это необязательно, но по факту и в большинстве случаев так. Следующие пункты тоже.
- Использование различных методов HTTP в соответствии с их семантикой и предназначением. GET: получить информацию о ресурсе; POST: создать новый ресурс; PUT: обновить существующий ресурс; DELETE: удалить ресурс. Иногда спорят об обновлении - PUT vs PATCH vs POST.
- Использование кодов ответа HTTP в соответствии с их семантикой и предназначением. Хорошая картинка по определению HTTP-кода ответа.
- HATEOAS обычно не используют и не спрашивают, но это тоже относится к REST, о чём можно упомянуть
Чаще всего, на моей практике, спрашивают какой HTTP-метод для чего должен использоваться или как назвать URI, чтобы API было RESTful. Однако никакой спецификации или стандарта под это нет. И вообще, строго говоря, изначально REST - это архитектурный стиль, непривязанный ни к каким протоколам. Тема раскрыта в этой статье или в этой на Хабре - комментарии сочные.
Вот принципы REST-архитектуры по Филдингу:
- Модель клиент-сервер (Client–server)
- Отсутствие состояния (Stateless) - у клиента и сервера нет необходимости отслеживать состояние друг друга
- Кэширование (Cacheable) - ответы сервера должны помечаться как кэшируемы и некэшируемые
- Единообразие интерфейса (Uniform interface) - идентификация ресурсов, манипуляция ресурсами через представление, "самодостаточные" сообщения, HATEOAS
- Слои (Layered system) - в системе может быть больше одного слоя, но компоненты системы видит и взаимодействует только с соседним слоем. Кроме клиента и сервера может быть ещё прокси и шлюз
- Код по требованию (необязательное ограничение) (Code on demand (optional)) - отправка сервером исполняемого кода клиенту
SOAP - стандартизованный протокол обмена данными. Основные характеристики SOAP:
- Формат сообщений - XML (SOAP-XML - Envelope, Header, Body, Fault)
- SOAP-сервис должен иметь описание на языке WSDL(тоже XML)
- SOAP поддерживает множество протоколов - (TCP, UDP, HTTP, SMTP, FTP и т.д.)
- При использовании HTTP, поддерживаются методы GET и POST
Тема горячая, интересная всем web-разработчикам, поэтому на Хабре имеется уйма статей на любой вкус.
Теоритическо-практические:
- Серия постов про REST - введение, REST vs SOAP, Contract First, Code First, HATEOAS, Рекомендации и примеры на Java и Spring
- REST vs SOAP. Часть 1. Почувствуйте разницу и REST vs SOAP. Часть 2. Как проще и эффективнее организовать общение платформ?
- Дао Вебсервиса. (Или да хватит же изобретать велосипеды!)
- REST API Best Practices
- Что такое RESTful на самом деле
- Важные аспекты RESTful API для вашего проекта
- Как построить REST-like API в крупном проекте
- Разработка web API
- RESTful API для сервера – делаем правильно (Часть 1) и RESTful API для сервера – делаем правильно (Часть 2)
- Шпаргалки по безопасности: REST
- 7 вредных советов проектировщику REST API
- Самодокументированный JAX-WS с поддержкой XSD Restrictions
- REST API на Java без фреймворков
- Введение в Spring Boot: создание простого REST API на Java
- Наипростейший RESTful сервис на Kotlin и Spring boot
- SOAP-сервер на Java при участии Apache CXF и Spring
- SOAP Web-сервис средствами Spring-WS
Холиварно-дискусионные:
- REST — это новый SOAP
- REST страсти по 200
- REST API должен основываться на гипертексте
- RESTful API — большая ложь
И на всякий случай:
А кроме Хабра: