# Чеклист Backend разработчика

Практическая база для backend-разработки: API, данные, транзакции, безопасность, производительность, наблюдаемость, деплой и эксплуатация.

## Архитектура

Backend начинается с понимания домена, границ ответственности, контрактов и того, где система должна быть простой, а где масштабируемой.

### Определить границы сервиса

Понять, за что сервис отвечает, а что остается вне его ответственности.

**Что это дает:** Четкие границы уменьшают связность, упрощают поддержку и помогают избежать сервиса, который знает слишком много.

**Как выполнить:**
- Опишите доменные сущности и операции сервиса.
- Зафиксируйте внешние зависимости.
- Согласуйте, какие данные сервис хранит сам, а какие получает извне.

**Критерии приемки:**
- Границы описаны.
- Зависимости перечислены.
- Команда понимает, где источник истины.

### Зафиксировать архитектурное решение

Описать важный технический выбор в ADR: контекст, варианты, решение и последствия.

**Что это дает:** ADR сохраняет инженерный контекст и помогает будущей команде понимать, почему выбран именно этот путь.

**Как выполнить:**
- Опишите проблему и ограничения.
- Сравните 2-3 варианта.
- Зафиксируйте выбранное решение и последствия.

**Критерии приемки:**
- ADR опубликован.
- Решение связано с задачей.
- Последствия и trade-off описаны.

### Спроектировать модель ошибок

Определить типы ошибок, формат ответа и правила логирования.

**Что это дает:** Единая модель ошибок упрощает frontend-интеграцию, поддержку и диагностику production-инцидентов.

**Как выполнить:**
- Разделите validation, auth, business и system errors.
- Опишите формат error response.
- Не раскрывайте чувствительные детали во внешнем ответе.

**Критерии приемки:**
- Формат ошибок документирован.
- Коды ошибок стабильны.
- Логи содержат диагностический контекст.

## API и интеграции

API должен быть предсказуемым для клиентов: с понятными ресурсами, статусами, ошибками, версиями и документацией.

### Описать API-контракт

Зафиксировать endpoints, параметры, схемы ответов, ошибки и авторизацию.

**Что это дает:** API-контракт снижает трение между backend, frontend, QA и внешними интеграторами.

**Как выполнить:**
- Опишите ресурсы и методы.
- Добавьте request/response schemas.
- Укажите status codes, ошибки и требования авторизации.

**Критерии приемки:**
- OpenAPI или аналог опубликован.
- Контракт покрывает успешные и ошибочные ответы.
- Frontend и QA используют документацию.

### Настроить валидацию входных данных

Проверять входные данные на границах системы до бизнес-логики.

**Что это дает:** Валидация защищает доменную модель, снижает количество неожиданных ошибок и улучшает пользовательскую обратную связь.

**Как выполнить:**
- Опишите обязательные поля, типы, длины и форматы.
- Разделите syntactic и business validation.
- Верните понятные ошибки для клиента.

**Критерии приемки:**
- Некорректные данные не попадают в бизнес-логику.
- Ошибки валидации имеют стабильный формат.
- Покрыты граничные значения.

### Продумать версионирование API

Определить, как будут выпускаться несовместимые изменения и поддерживаться клиенты.

**Что это дает:** Версионирование снижает риск сломать мобильные приложения, партнерские интеграции и старый frontend.

**Как выполнить:**
- Определите правила backward compatibility.
- Выберите подход к версиям: URL, header или contract version.
- Подготовьте deprecation policy.

**Критерии приемки:**
- Правила версионирования описаны.
- Breaking changes не ломают текущих клиентов без плана.
- Deprecation communicated.

## Данные

Работа с данными требует аккуратности: схема, индексы, миграции, консистентность и восстановление часто важнее красивого кода.

### Спроектировать схему данных

Определить таблицы, связи, ограничения, индексы и правила владения данными.

**Что это дает:** Хорошая схема данных сохраняет консистентность и упрощает запросы, миграции и развитие продукта.

**Как выполнить:**
- Опишите сущности и связи.
- Добавьте constraints: not null, unique, foreign keys.
- Проверьте запросы, которые будут самыми частыми.

**Критерии приемки:**
- Схема покрывает бизнес-правила.
- Индексы соответствуют запросам.
- Есть план миграции.

### Писать безопасные миграции

Планировать изменение схемы так, чтобы не сломать production и не остановить сервис надолго.

**Что это дает:** Безопасные миграции снижают риск downtime, блокировок таблиц и потери данных.

**Как выполнить:**
- Разделяйте destructive changes на несколько релизов.
- Проверяйте время выполнения на похожем объеме данных.
- Готовьте rollback или forward-fix план.

**Критерии приемки:**
- Миграция протестирована.
- Нет долгих блокировок без плана.
- Rollback/forward-fix описан.

### Анализировать медленные запросы

Находить запросы, которые замедляют API, блокируют базу или плохо масштабируются.

**Что это дает:** Оптимизация запросов улучшает latency, снижает нагрузку на базу и уменьшает риск отказов при росте трафика.

**Как выполнить:**
- Соберите slow query log.
- Проверьте план выполнения через EXPLAIN.
- Добавьте индекс или измените запрос только после проверки.

**Критерии приемки:**
- Медленные запросы измерены.
- EXPLAIN показывает улучшение.
- Нет лишних индексов без пользы.

## Безопасность

Безопасность backend держится на корректной аутентификации, авторизации, валидации, защите секретов и безопасной обработке ошибок.

### Реализовать надежную аутентификацию

Проверить, что система корректно устанавливает личность пользователя или сервиса.

**Что это дает:** Authentication является основой доступа: если она сломана, остальные проверки безопасности теряют смысл.

**Как выполнить:**
- Используйте проверенные механизмы: sessions, OAuth2, JWT по необходимости.
- Настройте срок жизни токенов и refresh flow.
- Защитите brute force и credential stuffing.

**Критерии приемки:**
- Auth flow описан.
- Секреты не попадают в код.
- Неуспешные попытки контролируются.

### Проверить авторизацию на уровне ресурса

Гарантировать, что пользователь может работать только с разрешенными ему данными.

**Что это дает:** Authorization защищает от IDOR и утечек данных между пользователями, командами и организациями.

**Как выполнить:**
- Проверяйте доступ не только к endpoint, но и к конкретному объекту.
- Покройте тестами чужие ID и разные роли.
- Держите правила доступа рядом с доменной логикой.

**Критерии приемки:**
- Чужие ресурсы недоступны.
- Роли и permissions описаны.
- Есть тесты на отрицательные сценарии доступа.

### Защитить секреты и конфигурацию

Хранить ключи, пароли и токены вне репозитория и логов.

**Что это дает:** Утечка секретов часто приводит к компрометации данных, инфраструктуры или платежных систем.

**Как выполнить:**
- Используйте env и secret manager.
- Проверяйте, что секреты не логируются.
- Настройте rotation для важных ключей.

**Критерии приемки:**
- Секретов нет в репозитории.
- Production secrets хранятся отдельно.
- Есть процесс замены ключей.

## Эксплуатация

Сервис должен быть не только написан, но и наблюдаем, диагностируем, безопасно выкатываем и понятен тем, кто будет поддерживать его после релиза.

### Добавить структурированные логи

Логировать важные события с request id, пользователем, операцией и контекстом ошибки.

**Что это дает:** Структурированные логи позволяют быстро расследовать инциденты и связывать действия между сервисами.

**Как выполнить:**
- Добавьте correlation id.
- Логируйте бизнес-события и ошибки.
- Исключите персональные данные и секреты.

**Критерии приемки:**
- Логи можно фильтровать.
- Есть request/correlation id.
- Чувствительные данные не попадают в лог.

### Настроить health checks

Сделать проверки состояния сервиса и зависимостей для мониторинга и оркестрации.

**Что это дает:** Health checks помогают балансировщику и команде понять, жив ли сервис и готов ли он принимать трафик.

**Как выполнить:**
- Разделите liveness и readiness.
- Проверяйте критические зависимости осторожно.
- Не делайте health endpoint тяжелым.

**Критерии приемки:**
- Health endpoint работает.
- Readiness учитывает критические зависимости.
- Мониторинг использует checks.

### Подготовить runbook сервиса

Описать, как деплоить, диагностировать, откатывать и поддерживать сервис.

**Что это дает:** Runbook снижает зависимость от одного разработчика и ускоряет реакцию на инциденты.

**Как выполнить:**
- Опишите основные команды и dashboards.
- Добавьте типовые симптомы и действия.
- Укажите владельцев и каналы эскалации.

**Критерии приемки:**
- Runbook доступен команде.
- Есть инструкция rollback.
- Новый участник может выполнить базовую диагностику.
