MiddleDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ Нужно описать новый backend в конфигурации, выполнить terraform init -migrate-state, которая скопирует существующий state в новое хранилище и подтвердит это, а также немедленно удалить terraform.tfstate из git и добавить файл в .gitignore; просто скопировать файл в S3 вручную недостаточно, потому что Terraform должен сам обновить метаданные backend и включить locking, а ручное копирование не гарантирует согласованность и не настраивает блокировки. Как это работает подробнее блок backend в конфигурации описывает, где Terraform хранит state и как блокирует его; при смене backend Terraform сравнивает текущий (locally known) state с целевым хранилищем и при -migrate-state переносит содержимое, сохраняя serial-номер версии state, чтобы не создать рассинхронизацию между старым и новым источником истины. Пример кода Что использовать на практике Практика. перед миграцией стоит сделать резервную копию текущего state (terraform state pull > backup.tfstate), выполнить миграцию на некритичном окне, когда н
configuration-managementiac
SeniorPython Developer > Основы Python > Asyncio и асинхронность
Короткий ответ Решение должно опираться на то, действительно ли узкое место сервиса — это I/O-bound ожидание, где asyncio даёт реальный выигрыш за счёт конкурентного ожидания, или нагрузка в основном CPU-bound/ограничена синхронными зависимостями без async-аналогов — в последнем случае переход на asyncio не решит проблему и добавит стоимость полного переписывания. Как это работает подробнее Синхронный Flask-сервис обычно масштабируют горизонтально через несколько worker-процессов, каждый из которых обрабатывает по одному запросу за раз — под высокой конкурентной I/O-bound нагрузкой это требует много процессов для перекрытия ожиданий. Asyncio-фреймворк позволяет одному процессу обслуживать много конкурентных запросов за счёт неблокирующего ожидания, но только если весь стек вызовов в обработчике также асинхронный — любой синхронный блокирующий вызов в цепочке обнуляет большую часть выигрыша. Компромисс. Полное переписывание на asyncio даёт наибольший потенциальный выигрыш в throughput для действительно I/O-bou
asynciocoroutines
MiddleData Analyst > Метрики и эксперименты > A/B-тесты
Короткий ответ При проверке множества метрик без поправки вероятность получить хотя бы одну ложноположительную значимость существенно выше заявленного alpha для одной метрики — это проблема множественных сравнений. Для контроля общей ошибки применяют поправки, например Bonferroni или Holm, или заранее ограничивают число ключевых метрик. Как это работает подробнее при независимых метриках и alpha=0.05 вероятность хотя бы одного ложного срабатывания среди m метрик растёт примерно как 1-(1-alpha)^m; при m=10 это уже около 40%, а не 5%. Пример кода Что использовать на практике поправка Bonferroni делит alpha на число сравнений (alpha/m для каждой метрики) — простая, но консервативная; поправка Holm менее консервативна и последовательно применяет пороги к отсортированным p-value. Альтернатива — заранее выделить 1-2 основные метрики, а остальные считать вторичными/guardrail без строгого вывода о значимости. Ожидаемый результат: после поправки Holm часть из изначально 'значимых' p-value (0.01, 0.02, 0.03, 0.04) могу
bonferroniholm
MiddlePerformance Marketer > Google Ads > Данные, комплаенс и безопасность рекламных аккаунтов
Короткий ответ Используйте официальные механизмы нескольких аккаунтов, вводите их постепенно и избегайте паттернов, похожих на обход модерации, например резких скачков бюджета и идентичного контента между новыми кабинетами. Как это работает подробнее Платформы могут расценивать множество несвязанных аккаунтов, одинаковые объявления и резкий рост трат как подозрительную активность. Прозрачная структура и легитимные способы оплаты уменьшают неопределённость. Сначала оцените необходимость. Для теста креативов часто подходят A/B-тесты или дополнительные кампании в уже прогретом аккаунте. Что использовать на практике Масштабируйте поэтапно. Согласуйте план с платформой при наличии контактного менеджера, заполните профили и наращивайте бюджеты постепенно. Подводные камни Не запускайте сразу много свежих кабинетов. Одинаковые креативы и крупный бюджет с первого дня повышают риск автоматических ограничений.
ad-accountsad-policy
SeniorDevOps Engineer > Контейнеры и доставка > Надёжность и инцидент-менеджмент
Короткий ответ Однозначно правильного ответа нет: полный freeze снижает риск нового инцидента от релиза именно в критичный момент, но полностью останавливает возможность быстро исправить баг, найденный во время самой кампании, и может маскировать более глубокую проблему — отсутствие уверенности в безопасности собственного процесса релизов; альтернативой может быть не полный freeze, а усиленный процесс (canary, обязательный review, более конкретные критерии) без полной остановки. Как это работает подробнее полный freeze релизов — грубый, но простой и предсказуемый инструмент снижения риска, который легко коммуницировать всей организации ("ничего не трогаем на время кампании"); однако он не отличает безопасные изменения (например, конфигурационный фикс с низким риском) от рискованных (миграция схемы БД), и не даёт механизма для экстренного исправления critical bug, найденного именно во время замороженного периода, кроме как через "экстренное исключение", которое на практике часто становится лазейкой, обесценива
data-integrityerror-budget
SeniorPython Developer > Основы Python > ООП и модель объектов
Короткий ответ Дескриптор позволяет один раз описать логику валидации/преобразования и переиспользовать её декларативно на множестве полей многих классов без повторения кода property для каждого поля, но переносит часть логики на менее очевидный уровень протокола __get__/__set__, что увеличивает порог входа для разработчиков, не знакомых с этим механизмом, и усложняет отладку по сравнению с явным property на каждом поле. Как это работает подробнее Дескриптор — объект, определяющий __get__, __set__ и/или __delete__, который при присвоении атрибуту класса (не экземпляра) перехватывает доступ к этому имени у всех экземпляров класса: instance.field фактически вызывает Field.__get__(descriptor, instance, owner), а instance.field = value — Field.__set__(descriptor, instance, value). В отличие от property, которая создаётся заново для каждого атрибута через декоратор прямо в классе, дескриптор — это отдельный переиспользуемый класс, который можно параметризовать (тип, диапазон значений, обязательность) и применять к
custom-exceptionsexceptions
SeniorPython Developer > Основы Python > WSGI, ASGI и серверы приложений
Короткий ответ Главный риск — скрытые блокирующие вызовы (синхронный ORM, сторонние SDK без async-версии), которые при наивном переносе блокируют весь event loop и снижают, а не повышают производительность; реальный выигрыш появляется только если весь путь запроса действительно асинхронный, а нагрузка преимущественно I/O-bound. Как это работает подробнее Django с 3.1+ поддерживает async view и ASGI, но исторический ORM синхронный — вызов внутри async def view без sync_to_async выбросит ошибку либо, при обёртке, выполнится в отдельном потоке, что добавляет overhead переключения, а не даёт истинного ускорения. Пример кода Что использовать на практике Рекомендация. нужен аудит всех внешних вызовов на пути запроса — для каждого найти async-альтернативу или вынести в sync_to_async; миграцию делают постепенно, view за view, с нагрузочным тестированием каждого изменённого участка. Компромисс. полный переход с переписыванием критического пути даёт потенциальный выигрыш при высокой I/O-bound конкурентности, но требует
application-serverasgi
SeniorData Analyst > SQL и данные > Аналитическое мышление
Короткий ответ Решение зависит от стоимости ошибки и стоимости задержки: если ошибочный запуск легко откатить и дёшево стоит, можно принять решение раньше при более широком интервале; если откат дорог или эффект может быть сильно отрицательным, разумнее продлить тест ради точности — единого правильного ответа без учёта контекста бизнеса нет. Как это работает подробнее доверительный интервал отражает текущую неопределённость оценки эффекта; расширение выборки сужает интервал, но стоит времени (упущенная выгода или продолжающееся воздействие потенциально плохой фичи на часть пользователей), поэтому решение «ждать точности» или «решать сейчас» — это сопоставление стоимости неопределённости и стоимости задержки, а не чисто статистический вопрос. Пример кода Что использовать на практике На практике: оцениваю: (1) асимметрию последствий — если нижняя граница интервала (−2%) при реализации означает небольшую приемлемую потерю, а верхняя (+10%) — значимый выигрыш, то риск от ошибки может быть приемлем; (2) обратимост
ab-testinganalytical-thinking
SeniorPython Developer > Основы Python > Фоновые задачи
Короткий ответ Выбор зависит от характера задач (CPU-bound или I/O-bound), требуемой надёжности при сбоях (нужна ли устойчивость к падению процесса и повторные попытки), объёма и пиковости нагрузки, а также от готовности команды поддерживать дополнительную инфраструктуру (брокер сообщений, воркеры) в обмен на масштабируемость и изоляцию от основного процесса. Как это работает подробнее Встроенные потоки/процессы/asyncio-таски живут в рамках процесса приложения — просты в реализации, но при падении процесса незавершённые задачи и их состояние теряются без отдельного механизма персистентности. Выделенная очередь задач с брокером (Redis, RabbitMQ) хранит задачи вне процесса-исполнителя — воркер может упасть и перезапуститься, а задача останется в очереди и будет подхвачена снова. Компромисс. Встроенное решение проще в разработке и не требует дополнительной инфраструктуры, но не переживает перезапуск процесса и плохо масштабируется горизонтально; очередь задач с брокером даёт надёжность и масштабируемость, но доб
background-taskspython
SeniorData Analyst > SQL и данные > Качество данных
Короткий ответ Единого рецепта нет — распространённое решение — ввести «контракт данных» (data contract) между командой-источником и аналитикой: формальная схема событий с версионированием и обязательным уведомлением/review перед breaking change, но это добавляет процессный overhead и может восприниматься инженерами как бюрократия, замедляющая релизы. Как это работает подробнее Data contract фиксирует ожидаемую схему события (обязательные поля, типы, допустимые значения) в машиночитаемом виде (например, JSON Schema), и CI инженерной команды проверяет соответствие контракту перед деплоем; несовместимые изменения требуют явного версионирования события (purchase_v2) вместо тихой замены purchase. Пример кода Что использовать на практике На практике. Внедрение начинают с критичных для бизнеса событий (например, purchase, signup), а не со всех сразу, и встраивают проверку контракта в пайплайн CI/CD инженерной команды, чтобы breaking change не мог попасть в прод без уведомления аналитиков или автоматического провала
ci-cddata-contract