Инженерные принципы и правила ведения разработки
Обновлён 1 апр. 2026 г., 12:41 · 0 комментариев
Инженерные принципы и правила ведения разработки
Паспорт документа
- Статус документа: living standard
- Актуально на: 30 марта 2026 года
- Владелец: backend/platform-команда
- Пересмотр: при изменении правил разработки, ownership-модели или документационного процесса
- Область применения: нормативный слой инженерных и документационных правил проекта
- Связанные документы:
Цель документа
Этот документ фиксирует обязательные инженерные правила Qadam. Проект должен развиваться так, чтобы его можно было без болезненной потери контекста передать другой команде, масштабировать и сопровождать без зависимости от отдельных людей.
Это не рекомендательный текст, а канонический набор принципов, по которым принимаются архитектурные, процессные и эксплуатационные решения.
Главный принцип
Qadam должен строиться как передаваемая система, а не как проект, который держится на памяти текущей команды.
Это означает:
- знания должны жить в коде, тестах, контрактах и документации;
- production не должен зависеть от ручных действий “только этот человек знает как”;
- новая команда должна иметь возможность понять архитектуру, запустить проект, проверить изменения и безопасно продолжить разработку.
1. Принцип передаваемости
Любое важное решение должно быть воспроизводимо и объяснимо без устных договорённостей.
Обязательные следствия
- нет скрытых серверных правок, которые не отражены в документации;
- нет критичных процессов, завязанных на локальную память одного разработчика;
- нет неописанных env-переменных, доменов, секретных зависимостей и обходных путей;
- новая команда должна получить проект вместе с runbook, roadmap, требованиями, контрактами и тестовым контуром.
2. Один источник истины
У проекта должен быть понятный слой канонической документации.
Канонические документы
docs/project/current-state.md— реальное состояние платформы и инфраструктуры;docs/project/requirements.md— текущие продуктовые и инженерные требования;docs/project/roadmap.md— стратегический и ближайший план;docs/project/execution-checkpoints.md— поэтапный фактический статус реализации;docs/project/project-change-log.md— отдельный changelog завершённых change packages;docs/operations/deployment-runbook.md— текущая эксплуатационная модель;docs/architecture/api-routes.mdи далее OpenAPI/Swagger — канонический API-контракт;docs/governance/documentation-standard.md— обязательный стандарт структуры и lifecycle канонических markdown-документов;docs/governance/change-package-standard.md— обязательный процесс упаковки, проверки и документирования change package;docs/frontend/frontend-change-log.md— обязательный change-log для frontend-команды по backend API changes;specs/— детальные решения по конкретным направлениям.
Правило
Если код, инфраструктура и документация расходятся, это считается дефектом проекта, а не “нормальной ситуацией”.
3. Русский язык как канонический язык документации
Вся каноническая проектная документация должна вестись на русском языке.
Это касается:
- roadmap;
- runbook;
- текущего состояния;
- инженерных требований;
- правил разработки;
- проектных планов migration;
- продуктовых и архитектурных документов в каноническом слое.
Допустимые исключения
- технические термины, если русская замена ухудшает точность;
- имена технологий, библиотек, паттернов и API;
- код, команды, имена переменных, типов и интерфейсов.
Недопустимо
- держать канонический документ наполовину на русском, наполовину на английском;
- создавать новый важный документ вне
docs/, если он претендует на роль источника истины; - сохранять устаревшие англоязычные черновики как “равноправные” версии канонического документа.
Дополнительное правило по change management
Commit messages и итоговые squash merge messages для канонических репозиториев проекта должны формулироваться на русском языке.
Допускается сохранять технические префиксы и scope в conventional commit-стиле, например feat(api): ..., но смысловая часть сообщения должна оставаться русскоязычной и описывать уже достигнутый результат, а не намерение. Предпочтительная форма: добавлен, исправлен, стабилизирован, синхронизированы, вынесен, переведён.
4. Контрактность и явные границы
Проект должен быть разделён на части с явными границами, а не на “удобные на сегодня” импорты между внутренними слоями.
Обязательные правила
- frontend и backend взаимодействуют через явный API-контракт;
- DTO, response shape и auth-flow должны быть формализованы;
- переход к OpenAPI/Swagger обязателен для дальнейшего роста команды;
- нельзя плодить ручные frontend-типы, если уже есть канонический backend-контракт;
- нельзя усиливать связанность frontend с внутренними backend/workspace-исходниками, если проект должен быть готов к repo split.
5. Тесты обязательны, а не желательны
Проект должен покрываться тестами детально. Отсутствие тестов на критичные участки считается техническим долгом высокого приоритета.
Обязательная модель покрытия
Unit
Unit-тесты обязательны для:
- бизнес-логики сервисов;
- auth-flow;
- статусных моделей;
- критичных преобразований данных;
- доменных инвариантов;
- багфиксов, которые уже однажды ломались.
Integration
Интеграционные тесты обязательны для:
- ключевых HTTP endpoint;
- auth refresh и logout;
- buyer/seller/admin критичных сценариев;
- модулей с нетривиальной работой с БД;
- миграционных и контрактных сценариев, где unit-тест недостаточен.
E2E / Smoke
E2E или минимальный smoke-контур обязателен для:
- публичного каталога;
- карточки айтема;
- login / refresh / logout;
- buyer profile flow;
- seller item flow;
- admin moderation;
- production health-проверок после деплоя.
Жёсткое правило
Каждый исправленный production-баг должен сопровождаться регрессионной проверкой того уровня, на котором этот баг реально проявлялся.
6. Документация обновляется вместе с кодом
Если изменение влияет на архитектуру, контракты, инфраструктуру, эксплуатацию или roadmap, документация обновляется в том же пакете работ.
Обязательно обновлять
current-state.md— если поменялась реальная инфраструктура, домены, сервисы, контур деплоя;requirements.md— если поменялись инженерные или продуктовые требования;roadmap.md— если меняется последовательность больших пакетов разработки;execution-checkpoints.md— если change package меняет фактический статус этапа;project-change-log.md— если завершён значимый change package;deployment-runbook.md— если меняется эксплуатационная модель;api-routes.mdи OpenAPI — если меняется API-контракт;frontend-change-log.md— если меняются endpoint'ы, response shape, auth-поведение или другой frontend-значимый API-контракт;- frontend feedback loop на
qadam-roadmap.2fab.app— если backend-пакет требует действий от frontend-команды и должен попасть в живой operational board; documentation-standard.md— если меняется обязательная структура, lifecycle или quality gate документационного слоя;specs/— если реализация изменила согласованное проектное решение.
Недопустимо
- “сделаем потом” для документации на изменениях, которые уже повлияли на систему;
- держать актуальное состояние только в сообщениях чата или в голове команды;
- вносить infra/API change без синхронного обновления канонических docs.
7. Definition of Done для каждой значимой задачи
Задача считается завершённой только если одновременно выполнены условия:
- Код написан и проходит релевантную сборку.
- Добавлены или обновлены тесты нужного уровня.
- Обновлена каноническая документация на русском языке.
- Если затронут API, обновлён контракт.
- Если API-изменение затрагивает frontend-команду, обновлён
frontend-change-log.md. - Если frontend должен выполнить действия по этому пакету, пакет опубликован в frontend-блоке на
qadam-roadmap.2fab.app, а не остаётся только текстом в changelog. - Если затронута инфраструктура, обновлён runbook и текущее состояние.
- Обновлён
project-change-log.md, а если этап сдвинулся —execution-checkpoints.md. - Репозиторный quality gate пройден там, где он существует.
- Есть понятный rollback или хотя бы оценка риска отката.
- Изменение может понять другой разработчик без устного сопровождения автора.
8. Принципы архитектуры и кода
Архитектура
- предпочитать явные модули и вертикальные срезы вместо хаотичных cross-import;
- избегать скрытой связанности через общие внутренние пакеты без долгосрочного плана;
- проектировать систему с учётом будущего frontend repo split и docker-контура;
- делать transport contract независимым от внутренней структуры репозитория.
Код
- код должен быть читаемым без археологии по пяти файлам;
- сложные решения должны сопровождаться кратким объяснением, если без него контекст теряется;
- нельзя тащить legacy-паттерны в новый слой просто потому, что “так уже было”;
- багфикс без понимания причины считается незавершённой работой.
9. Инфраструктурные принципы
- production не должен зависеть от ручной сборки “как получится”;
- целевая модель — воспроизводимый image-based delivery и управляемый docker-контур;
- rollout и rollback должны быть описаны явно;
- домены, TLS, ingress, env и service topology должны быть документированы;
- server state должен быть минимально “снежинкой” и максимально воспроизводимым.
10. Правила code review и change management
Каждый нетривиальный change оценивается не только по “работает у меня”, но и по следующим критериям:
- не усиливает ли он связанность;
- не создаёт ли новый неописанный контур;
- не ломает ли передаваемость проекта;
- достаточно ли покрыт тестами;
- обновлены ли docs;
- не создал ли он новый drift между кодом и документацией.
Repo-side automation не заменяет review. Машинный quality gate и human review считаются двумя разными обязательными слоями.
Обязательный security review
Для следующих зон security review обязателен даже если unit-тесты и build зелёные:
- auth, JWT, refresh/logout, cookies и session delivery;
- permissions, roles, guards и access boundaries;
- uploads, file storage и публичная раздача файлов;
- secrets, env, proxy trust, rate limiting и ingress behavior;
- Prisma migrations, которые трогают PII, auth-данные или статусные модели аккаунтов.
Минимальный operational baseline такого review фиксируется в .gitea/PULL_REQUEST_TEMPLATE.md и не должен обходиться устными комментариями.
Обязательные вопросы к любому большому change
- Как это будет поддерживать другая команда через 6 месяцев?
- Как это проверить автоматически?
- Что нужно обновить в документации?
- Что будет точкой отказа при handover?
- Как это откатывается?
11. Что запрещено
- Хранить критичное знание только в головах команды.
- Держать production-процесс в виде “ручной магии”.
- Добавлять новый критичный flow без тестового покрытия.
- Менять API без обновления контракта.
- Менять или добавлять endpoint'ы без записи в
frontend-change-log.md, если эти изменения важны для frontend-команды. - Закрывать значимый change package без записи в
project-change-log.md. - Мержить нетривиальный change без прохождения repo-side quality gate, если он уже заведен для репозитория.
- Обходить PR review/security checklist для auth, permissions, uploads, proxy, secrets и migration-sensitive изменений.
- Добавлять новые env/domain/infra зависимости без документирования.
- Оставлять устаревшие документы как будто они всё ещё канонические.
- Считать отсутствие документации нормальным состоянием для важных решений.
12. Критерии готовности проекта к передаче другой команде
Проект можно считать реально передаваемым, только если:
- есть актуальный roadmap и текущее состояние;
- есть runbook эксплуатации и деплоя;
- API-контракт формализован;
- ключевые сценарии покрыты тестами;
- окружение и зависимости воспроизводимы;
- frontend и backend можно развивать без скрытых связей;
- новая команда может поднять проект и продолжить разработку без постоянных устных пояснений.
13. Практический приоритет на ближайшие этапы
Эти принципы прямо означают следующие инженерные приоритеты:
- Довести документацию до полностью канонического состояния.
- Укрепить тестовый контур, особенно для web.
- Формализовать API через OpenAPI/Swagger.
- Подготовить frontend к repo split без скрытой связанности.
- Перевести delivery в управляемый docker-контур.
14. Как использовать этот документ
Этот документ должен использоваться как baseline при:
- планировании roadmap;
- review архитектурных решений;
- определении Definition of Done;
- оценке технического долга;
- подготовке handover другой команде;
- принятии решений по frontend repo split и docker migration.