Домашние задания

Теория и практика — отдельно. Репозитории с решениями и отчёты.

Общие правила сдачи

  • Формат: GitHub/GitLab репозиторий + README с инструкциями запуска.
  • Язык: Python (FastAPI/Flask допустимы), тесты: pytest (по возможности).
  • Оценивание: корректность (40%), архитектура (40%), чистота кода (20%).
  • Запрещено: копипаст чужих решений. Разрешено: обсуждать идеи.

Шкала сложности

S легко • M средне • L сложно

1) CQRS (с CQS) M

Тема: разделение команд и запросов, отдельные модели чтения/записи.

Задание

  • Сервис заказов: Commands (создать/отменить заказ), Queries (список/детали).
  • Write-модель: PostgreSQL (нормализовано). Read-модель: MongoDB/Elasticsearch/SQLite (денормализовано).
  • Синхронизация через события (in-memory bus/Redis/Kafka — на выбор).

Критерии приёмки

  • Чёткая CQS (ни один handler не смешивает чтение и запись).
  • Read-модель обновляется асинхронно и отвечает быстро (без джойнов).
  • README с диаграммой потоков данных.

2) Event Sourcing L

Тема: хранение событий и построение проекций.

Задание

  • Аккаунтинг/кошелёк: события пополнения/списания, восстановление состояния из истории.
  • Снимки (snapshots) каждые N событий.
  • Проекция баланса и истории операций для быстрого чтения.

Критерии приёмки

  • Идемпотентные обработчики событий.
  • Тесты на восстановление состояния к произвольной дате.
  • Документация рисков (reordering, duplicates).

3) Message Queues & Streams M

Тема: очереди задач vs потоковые платформы.

Задание

  • Сервис генерации PDF/скриншотов: API ставит задания в очередь (RabbitMQ/Redis), worker обрабатывает.
  • Dead Letter Queue для падений, retry с экспоненциальной задержкой.
  • Метрики в Prometheus (кол-во задач, ошибки, среднее время).

Критерии приёмки

  • Гарантии at-least-once и идемпотентность обработчиков.
  • Наглядные метрики/дашборд (скриншот в README).
  • Сценарий нагрузочного теста (скрипт + результаты).

4) Microservices + API Gateway L

Тема: изоляция сервисов, API Gateway, resiliency.

Задание

  • Три сервиса: users, orders, payments. Взаимодействие через HTTP.
  • API Gateway (FastAPI/Nginx) — маршрутизация и rate-limiting.
  • Сircuit breaker и retry (lib/паттерн) на межсервисных вызовах.

Критерии приёмки

  • Изоляция падений (падение payments не валит весь поток).
  • Чёткие контракты (OpenAPI), негативные тесты контрактов.
  • Диаграмма сервисной топологии.

5) ORMs: Data Mapper vs Active Record M

Тема: слой доступа к данным и миграции.

Задание

  • Реализовать одинаковый функционал двумя способами: SQLAlchemy (Data Mapper) и Django ORM (Active Record).
  • Написать заметку-сравнение: DX, сложность запросов, тестируемость, производительность.
  • Показать решение N+1 и eager loading.

Критерии приёмки

  • Рабочие миграции и воспроизводимые шаги запуска.
  • Примеры сложных запросов в обоих подходах.
  • Таблица сравнения в README.

6) DDD (Entities, Value Objects, Repositories) M

Тема: богатая модель домена.

Задание

  • Смоделировать домен бронирования (User, Booking, DateRange, Money).
  • Инварианты: пересечение дат, отмена/изменение, расчёт цены.
  • Repository-интерфейсы и in-memory реализации для тестов.

Критерии приёмки

  • Value Objects неизменяемы и валидируют инварианты.
  • Юнит-тесты на бизнес-правила.
  • Инфраструктура отделена от домена.

7) Serverless S/M

Тема: функции как сервис.

Задание

  • Lambda/Functions endpoint: загрузка файла в S3/Blob, событие — обработчик-ресайзер.
  • Стейт-машина/оркестрация (AWS Step Functions/Azure Durable) — по желанию.

Критерии приёмки

  • Инфраструктура как код (serverless.yml/terraform — базово).
  • Схема событий и ретраев.
  • Описанные лимиты (cold start, timeout) и как вы их учитываете.

8) Use Cases + DTOs + Mappers S/M

Тема: слой приложения и контракты.

Задание

  • API для профилей: create/update (Use Case), DTO валидация (Pydantic), мапперы.
  • Контроллеры тонкие, бизнес-логика в Use Case.

Критерии приёмки

  • Наличие позитивных и негативных тестов Use Case.
  • Чёткое разделение слоёв.
  • Документация контракта (OpenAPI или схематично).

Формат отчёта

  • Краткая архитектурная записка (1–2 страницы): решения, trade-offs, ограничения.
  • Диаграмма (PlantUML/mermaid/картинка) ключевых компонентов.
  • Инструкция запуска и smoke-тестов.