Wiki.js

Общие сведения

Тестовое задание для Бекенд(далее ТЗ) является универсальным тестом на способность писать JSON API проекты на любом стеке технологий. Позволяет дифференцировать оценку результата в широких пределах.

ТЗ глобально состоит из двух частей:

  1. Endpoint выборки статистики - далее п.1. ТЗ.
  2. Endpoint "покупки" конкретного количества книг в конкретном магазине - далее п.2. ТЗ.

При проверке ТЗ следует обратить пристальное внимание в т.ч. и на полное соответствие результата выполнения самому ТЗ.
Некоторые кандидаты идут на упрощение условий, например "продают" не заданное кол-во книг, а "не больше" заданного, что существенно упрощает реализацию. И т.д. Это не позволяет проверить часть чеклиста.

В более узком контексте мы проверяем качество решения при следующих ограничениях:

Каждый пункт чеклистов подразумевает обоснование выбора/решения/т.п. В случае выбора, нужно привести список достоинств и недостатков. Если недостатков нет, скорее всего у кандидата нет опыта использования того, что он выбрал.

РСУБД

Фундаментальным моментом в решении ТЗ является моделирование данных в БД. Оно может как привести к полной невозможности реализовать ТЗ, так и существенно повлиять на код реализации.

Чеклист(для РСУБД):

RESTful JSON API

Подавляющее количество наших API мы реализуем в этом формате.
RESTful часть накладывает ограничения на именование ендпоинтов и HTTP глаголы.
JSON часть - на HTTP параметры и тело запросов и ответов.
Использование более продвинутого формата тела ответа JSON:API приветствуется.

Кандидат может использовать другие подходы (RPC, JSON-RPC, GraphQL), если

Чеклист(для RESTful JSON API):

MVC (или близкий) фреймворк

Фреймворк "из коробки" предлагает набор абстракций вроде Model(доступ к данным), View(представление данных) и Controller(управление потоком запрос-ответ).
Как показывает опыт, нужен еще как минимум слой для бизнес логики, а то и для валидации, и авторизации и т.д.
Недопустимо размазывание и даже исключительное помещение бизнес-логики между/в один из слоев MVC.
Очень важно не только понимание, но и практическое следование этому правилу у всех кандидатов от уровня middle.
Нарушать его можно разве что в нано-проектах, где всегда "максимум 2.5 endpoint".

View

View в JSON API принято называть serializers. Существует множество библиотек(как входящих в фреймворки, так и отдельных) с разными подходами к описанию маппинга данных на JSON представление.
Нельзя путать их с низкоуровневыми библиотеками сериализации Hash структур в строки(в терминах RoR библиотека Oj - это не serializer, в отличие от библиотеки AMS).

Чеклист:

Controller

Чеклист:

Model

Этот слой может быть стандартным из фреймворка, либо быть реализован сторонней библиотекой.
Чеклист:

Слой бизнес логики

Часто реализуются в виде сервисных классов.
В свою очередь, этот слой в реальных приложениях разделяется на слои валидации(forms), аутентификации(policies), выборки данных(queries) и т.д. - чем больше и сложнее приложение, тем больше слоев.

Чеклист(сервисные классы - общий):

Чеклист(сервисные классы - п.1. ТЗ):

Чеклист(сервисные классы - п.2. ТЗ):

Тестирование

Кандидат должен мочь продемонстрировать знание нижеперечисленного, наличие всего-всего - необязательно.

Чеклист: