SeniorSMM Manager > Общее > Рекламные платформы и медиазакупка
Короткий ответ Нужно сначала разобрать техническую причину перерасхода (например, общий бюджет на уровне кампании при включённой оптимизации бюджета кампании и ускоренном pacing против ожидания дневного лимита), внедрить процесс контроля с автоматическими алертами и регулярными чек-поинтами, и честно признать перед клиентом зону ответственности команды за недостаточный контроль, не перекладывая вину целиком на «особенности площадки». Как это работает подробнее перерасход в таких случаях обычно связан с недопониманием механики распределения бюджета, а не со злым умыслом или случайностью площадки. Что использовать на практике Подход. системное решение — внедрение алертов на расход (например, уведомление при достижении 80% дневного или недельного лимита), регулярный ручной аудит настроек бюджета перед длинными выходными или праздниками, когда нет возможности быстро отреагировать. Пример. Разбор показывает, что оптимизация бюджета кампании была включена без понимания, что дневной лимит распределяется между группа
campaign-optimizationmedia-planning
SeniorPython Developer > Основы Python > Asyncio и асинхронность
Короткий ответ Варианты — вынести CPU-bound код в отдельный процесс (run_in_executor с ProcessPoolExecutor), вынести его в отдельный сервис-воркер за очередью задач, либо разбить вычисление на мелкие шаги с периодическими await; выбор зависит от того, насколько тяжёлые и частые эти вычисления относительно общего профиля нагрузки сервиса. Как это работает подробнее Event loop однопоточен — любой синхронный участок без await полностью занимает поток выполнения, пока не завершится. run_in_executor(ProcessPoolExecutor, func) выносит вызов в отдельный процесс и возвращает await-able future, не блокируя сам event loop; отдельный сервис-воркер за очередью убирает CPU-bound нагрузку из процесса, обслуживающего запросы, полностью. Компромисс. ProcessPoolExecutor решает блокировку локально без изменения архитектуры API, но ограничен ресурсами одной машины и добавляет задержку на сериализацию данных между процессами; выделенный воркер-сервис с очередью масштабируется независимо и изолирует нагрузку, но превращает синхро
asynciocoroutines
MiddlePerformance Marketer > Google Ads > Стратегии ставок
Короткий ответ В отчёте Auction Insights по пересекающимся ключевым словам будет виден высокий показатель наложения показов (Impression Share) между собственными кампаниями аккаунта; решение — объединить пересекающиеся ключевые слова в одну кампанию/группу объявлений или развести их по разным, не пересекающимся типам соответствия и минус-словам. Как это работает подробнее Если две кампании аккаунта таргетируют по сути одни и те же запросы, они участвуют в одном и том же аукционе и формально считаются разными рекламодателями с точки зрения аукционного механизма — в большинстве случаев это не повышает позицию искусственно, но распыляет бюджет, данные для обучения ставок и может повышать общий CPC за счёт неоптимального распределения показов между двумя менее зрелыми по данным кампаниями вместо одной зрелой. Что использовать на практике На практике. Нужно сравнить список ключевых слов и типы соответствия обеих кампаний, найти пересечения, и либо объединить их в одну кампанию/группу, либо развести по строго разны
ad-platformsbidding-strategies
SeniorPython Developer > Основы Python > ООП и модель объектов
Короткий ответ Метакласс оправдан, когда нужно контролировать сам процесс создания класса (изменить namespace до создания, проверить структуру нескольких классов согласованно, вмешаться в наследование на уровне, недоступном для __init_subclass__), но для большинства задач регистрации подклассов или простой валидации достаточно более простых и предсказуемых механизмов — __init_subclass__ (хук, вызываемый при создании любого подкласса) или декоратора класса — которые не меняют семантику наследования для всей иерархии и легче понимаются командой. Как это работает подробнее Метакласс — это "класс класса": он управляет вызовом type(name, bases, namespace) и может переопределить __new__/__init__ на уровне создания самого класса, то есть видит весь процесс до того, как класс полностью сформирован, включая возможность менять набор атрибутов, список базовых классов и порядок MRO. __init_subclass__(cls, kwargs) — это обычный classmethod-хук, который Python вызывает автоматически на базовом классе при создании любого ег
decoratorsfunctools
MiddleData Analyst > SQL и данные > Инструменты и инженерные практики
Короткий ответ Нужно вырезать нужный столбец (cut или awk), отсортировать значения (sort) и посчитать количество повторений каждого уникального значения (uniq -c) — связка этих утилит в конвейере обрабатывает файлы такого размера за секунды без загрузки всего файла в память целиком. Как это работает подробнее Как это работает: каждая утилита в конвейере (|) читает поток построчно и передаёт результат следующей команде, не требуя, чтобы весь файл помещался в память; awk -F',' '{print $N}' извлекает N-й столбец по разделителю, sort упорядочивает строки (необходимо перед uniq, так как uniq схлопывает только соседние одинаковые строки), а uniq -c считает количество повторений. Пример кода Что использовать на практике На практике: такой подход значительно быстрее, чем открывать файл в Excel (который может не осилить 2 млн строк) или грузить весь CSV в pandas только ради value_counts() по одному столбцу; это особенно удобно для быстрой диагностики прямо на сервере, где хранятся логи, без необходимости скачивать фай
awkbash
MiddlePython Developer > Основы Python > Наблюдаемость и ресурсы
Короткий ответ Нужно снять снимки памяти через tracemalloc или объектный граф через objgraph в разные моменты времени и сравнить, какие типы объектов накапливаются быстрее всего, что укажет на место утечки — обычно это растущие кэши, незакрытые ресурсы или циклические ссылки, недоступные для сборщика мусора из-за __del__. Как это работает подробнее tracemalloc фиксирует место выделения памяти для каждого объекта и позволяет сравнить два снимка (snapshot.compare_to), показывая, какие строки кода ответственны за наибольший прирост; objgraph.show_growth() показывает, какие типы объектов стали чаще встречаться между вызовами. Пример кода Что использовать на практике Практика. Типичные источники роста — необновляемые кэши без ограничения размера (словарь, растущий без TTL/maxsize), подписчики событий, на которые никто не отписывается, соединения или файлы, не закрытые в блоке finally, а также объекты с циклическими ссылками и __del__, которые не собираются обычным reference counting. Подводные камни Риск. Сразу по
memory-leaksobservability
JuniorData Analyst > SQL и данные > Коммуникация с бизнесом
Короткий ответ Уточню, есть ли у постановщика задачи уже готовая гипотеза причины (например, «из-за нового дизайна») или вопрос действительно открыт — это меняет подход: при наличии гипотезы её нужно явно проверить, а не просто подтвердить, а при открытом вопросе — начать с описательного анализа и сузить круг причин. Как это работает подробнее фраза «узнай, почему» часто скрывает скрытое ожидание конкретного ответа у постановщика задачи (confirmation bias), и аналитик рискует просто подтвердить ожидаемую причину, не проверив альтернативы. Пример кода Что использовать на практике Применение. спрашиваю прямо: «У вас есть предположение о причине, которое нужно проверить, или это действительно открытый вопрос?» Если гипотеза есть — явно формулирую её и ищу данные, которые могут её как подтвердить, так и опровергнуть. Если вопрос открыт — начинаю с разбивки конверсии по сегментам (канал, устройство, этап воронки), чтобы локализовать, где именно падение. Проверка или пример. Задача: «Конверсия упала, наверное, из-з
conversion-ratehypothesis-testing
MiddlePerformance Marketer > Google Ads > Бюджет и пейсинг
Короткий ответ План на 10-й день — около 33% бюджета (10/30), факт — 55%, то есть кампания опережает план примерно на 22 п.п.; это повод проверить, не включён ли accelerated-пейсинг, не выросли ли ставки/конкуренция или не изменилась ли аудитория/бюджет недавно. Как это работает подробнее Пейсинг сравнивают не абсолютным расходом, а долей потраченного бюджета относительно доли прошедшего времени периода. Отклонение на 15–20 и более процентных пунктов — значимый сигнал, который требует разбора причины, а не только фиксации факта. Что использовать на практике На практике. Проверку начинают с истории изменений кампании (не менялся ли бюджет, ставка, аудитория, тип пейсинга), затем смотрят динамику CPM/CPC по дням — рост стоимости аукциона при том же числе кликов/конверсий тоже ускоряет расход бюджета без умышленного решения специалиста. Пример. Месячный бюджет 300 000 руб., на 10-й день потрачено 165 000 руб. (план — 100 000 руб.). Проверка истории правок показывает, что 3 дня назад пейсинг был переключён со sta
ad-platformsbudget-pacing
SeniorPerformance Marketer > Google Ads > Инструменты и автоматизация
Короткий ответ Для автоматизации ставок задайте независимые лимиты бюджета, проверяйте полноту и свежесть данных, тестируйте правило на исторических данных и применяйте изменения постепенно. Чем выше автономность, тем важнее мониторинг, аварийное отключение и ручное подтверждение рискованных действий. Как это работает подробнее Разделите вычисление решения и выполнение изменения. Перед действием проверьте период метрик, задержку конверсий, границы CPA и максимальный шаг ставки; ограничьте дневной расход независимо от основной логики. Начинайте с режима наблюдения или малой аудитории, регистрируйте каждое изменение и предусмотрите остановку по сигналу. Независимые предохранители. Лимит на платформе должен ограничивать ущерб даже при ошибке в скрипте или правиле. Проверка свежести. Не сравнивайте метрику неполного дня с порогом, рассчитанным на полные сутки; учитывайте окно дозревания конверсий. Пример кода Что использовать на практике Режимы внедрения. Начните с симуляции, затем ручного подтверждения, ограниче
api-automationbidding
JuniorPython Developer > Основы Python > Транзакции и конкурентность
Короткий ответ COMMIT фиксирует все изменения текущей транзакции безвозвратно, а ROLLBACK отменяет их полностью; явный контроль над ними нужен там, где несколько операций должны либо выполниться все вместе, либо не выполниться вообще, и где нужно корректно обработать ошибку. Как это работает подробнее При открытии транзакции все последующие изменения видны только внутри неё до COMMIT; при ROLLBACK СУБД откатывает их, используя MVCC-версии строк в PostgreSQL. Пример кода Что использовать на практике Практика. В веб-приложении типичный паттерн — одна транзакция на HTTP-запрос или бизнес-операцию: если все шаги успешны — commit в конце, если возникло исключение — rollback. ORM (Django, SQLAlchemy) предоставляют контекстные менеджеры atomic()/begin(), делающие это автоматически. Подводные камни Ошибка. Забывают явный rollback после исключения, оставляя соединение в состоянии «aborted transaction»; делают commit после каждой отдельной операции там, где нужна атомарность нескольких операций вместе.
concurrencypostgresql