MiddleData Analyst > SQL и данные > Продуктовые и бизнес-метрики
Короткий ответ Формула LTV = ARPU / churn предполагает постоянный churn rate во всех периодах жизни пользователя (геометрическое убывание базы), но на практике churn обычно выше в первые месяцы и снижается для "выживших" пользователей, поэтому формула систематически завышает LTV, особенно для молодых когорт. Как это работает подробнее формула выводится из суммы бесконечной геометрической прогрессии: ожидаемое число периодов жизни = Σ(1-churn)^t = 1/churn при допущении константного churn; умножая на ARPU, получаем суммарную ожидаемую выручку. Пример кода Что использовать на практике Практика. правильнее оценивать LTV через интеграл (сумму) фактической retention-кривой по когортам: LTV = ARPU × Σ retention(t) по t от 0 до горизонта, где retention(t) берётся из эмпирических данных, а не предполагается постоянной; для расчёта на ограниченном горизонте (например, 12 месяцев) нужно также решить, как экстраполировать "хвост" кривой за пределами наблюдаемых данных. Подводные камни Частые ошибки. применяют формулу 1/c
arpuchurn
JuniorSMM Manager > Общее > Контент и форматы
Короткий ответ Нужно построчно сверить готовый макет с пунктами брифа (текст, цвета, пропорции, дедлайн, обязательные элементы) и отдельно проверить орфографию и фактические данные, а не просто оценивать макет «на глаз» по общему впечатлению. Как это работает подробнее бриф — это список конкретных требований, поэтому проверка сводится к тому, чтобы пройти по каждому пункту брифа и подтвердить его выполнение в макете, а не довериться общему визуальному впечатлению «выглядит неплохо». Что использовать на практике Рекомендация. удобно держать бриф и макет открытыми рядом и отмечать каждый пункт по очереди: правильный ли текст, та ли площадка и пропорции, присутствует ли логотип там, где договаривались, нет ли опечаток и устаревших цифр. Подводные камни Риск. отправлять макет клиенту без сверки с брифом, полагаясь на то, что дизайнер «и так всё понял»; не замечать, что в макете осталась старая дата или цена после правок; пропускать проверку орфографии, потому что фокус был только на визуале.
aspect-ratiocontent-production
MiddlePython Developer > Основы Python > Тестирование кода
Короткий ответ Нужно сначала воспроизвести нестабильность (прогнать тест многократно, в т.ч. в изоляции и в случайном порядке с остальными), а затем искать источник недетерминизма: общее состояние между тестами, зависимость от реального времени/сети, гонки в асинхронном или многопоточном коде, неявный порядок выполнения. Как это работает подробнее Flaky-тест обычно связан со скрытой зависимостью от внешнего или разделяемого состояния: случайных данных без фиксированного seed, реального времени, порядка выполнения тестов (если один тест оставляет данные для следующего), таймаутов в CI с ограниченными ресурсами, гонок между потоками или корутинами, которые не всегда успевают пересечься по времени. Пример кода Что использовать на практике Практика. Полезные инструменты диагностики: запуск теста в цикле (pytest --count=50 с pytest-repeat), запуск тестов в случайном порядке (pytest-randomly) для выявления скрытых зависимостей по порядку, логирование состояния перед падением. Временная карантинная маркировка (@pyte
debuggingflaky-tests
MiddlePython Developer > Основы Python > Надёжность сервисов
Короткий ответ Каскадный отказ диагностируют по цепочке деградации: растут задержки/ошибки одной зависимости, затем потоки вызывающего сервиса оказываются заняты ожиданием, что приводит к исчерпанию ресурсов и отказу уже самого вызывающего сервиса для всех клиентов. Как это работает подробнее Без таймаутов/circuit breaker медленная зависимость «съедает» воркеры вызывающего сервиса; когда свободных воркеров не остаётся, сервис не может обслуживать вообще никакие запросы, и отказ распространяется дальше по цепочке. Пример кода Что использовать на практике Практика. Диагностика начинается с метрик — рост latency и error rate на конкретной исходящей зависимости, рост использования пула соединений/потоков, затем рост ошибок на сервисе в целом; трассировка помогает увидеть, что все «зависшие» запросы ждут один и тот же downstream-вызов. Подводные камни Риск. Лечить симптом (увеличивать размер пула воркеров), не устраняя причину (отсутствие таймаутов и изоляции); не разделять ресурсы (bulkhead) между вызовами к разн
fault-tolerancereliability
MiddlePython Developer > Основы Python > Индексы и производительность
Короткий ответ Нужно собрать факты о реальном поведении в production — найти конкретный медленный запрос через pg_stat_statements или log_min_duration_statement, снять его реальный план через EXPLAIN (ANALYZE, BUFFERS) на сопоставимых по объёму данных и сравнить с локальной средой по объёму данных, статистике планировщика и настройкам. Как это работает подробнее pg_stat_statements агрегирует статистику по нормализованным запросам (общее время, число вызовов, среднее время), что помогает найти «тяжёлые» по суммарному вкладу запросы; log_min_duration_statement логирует отдельные запросы, превысившие порог. Пример кода Что использовать на практике Практика. Частая причина разницы между локальной средой и production — объём данных, устаревшая статистика (ANALYZE не выполнялся после массовой загрузки), отсутствующий в локальной БД индекс, конкуренция за ресурсы под реальной нагрузкой. Подводные камни Ошибка. Тестируют гипотезу только через EXPLAIN без ANALYZE — он показывает лишь оценку; делают выводы на локальной
indexespostgresql
MiddlePerformance Marketer > Google Ads > Рекламные платформы и форматы
Короткий ответ Диагностируй три компонента Quality Score отдельно: ожидаемый CTR, релевантность объявления и качество целевой страницы. Найди слабое место, внеси адресное изменение и оцени новые данные после достаточного периода, не меняя всё одновременно. Как это работает подробнее Слабый ожидаемый CTR может указывать на невыразительное предложение; низкая релевантность — на несоответствие текста запросу; слабая оценка страницы — на недостаток полезной информации, неудобство или медленную загрузку. Разделение причин. Группируй ключи по слабому компоненту. Измерение. Меняй одну причину за раз и дай статистике обновиться. Что использовать на практике Перепиши заголовки под тематический кластер, улучши лендинг или предложение и сравни компоненты до и после. Подводные камни Не применяй одну универсальную правку ко всем ключам и не делай вывод по слишком короткому периоду.
google-adskeyword-diagnostics
MiddleSMM Manager > Общее > SMM-аналитика и метрики
Короткий ответ Сначала проверяют частоту показа (не выросла ли из-за усталости аудитории), затем — не изменился ли состав плейсментов показа, затем — актуальность и «свежесть» креатива, и только потом рассматривают внешние факторы (сезонность, активность конкурентов, изменения алгоритма площадки). Как это работает подробнее падение CTR может иметь разные причины на разных уровнях — от усталости конкретной аудитории от конкретного креатива до изменений в автоматическом распределении показов по плейсментам; диагностика идёт от простого и проверяемого к сложному и менее управляемому. CTR упал с 1,8% до 0,7% за 10 дней. Проверка по порядку: frequency выросла с 2,1 до 5,4 за этот период (вероятная причина — усталость аудитории) при неизменном креативе 3 недели. Решение: обновление креатива и/или расширение аудитории; после изменения — повторный замер CTR через несколько дней на новых показах. Что использовать на практике Практический подход. полезно сравнивать CTR в разбивке по плейсментам и сегментам аудитории за
ctrmetrics
MiddlePerformance Marketer > Google Ads > Сквозная аналитика и отчётность
Короткий ответ Нужно оценить масштаб потери через сравнение с менее подверженным ограничениям источником, например серверным CAPI или CRM, и явно отражать в отчётности, что часть данных — оценка, а не точное измерение, вместо того чтобы выдавать заниженные цифры за полную картину. Как это работает подробнее При отказе от согласия на cookie или блокировке пикселя браузером событие конверсии может не долетать до рекламной платформы через клиентский пиксель, но если настроен серверный трекинг на основе данных из CRM или базы заказов, часть этих конверсий можно восстановить независимо от cookie-ограничений в браузере. Похожая ситуация может возникать не только из-за consent mode, но и из-за браузерных ограничений вроде ITP в Safari, которые тоже сокращают срок жизни cookie и число отслеживаемых конверсий. Что использовать на практике Практика. На практике сравнивают число конверсий, зафиксированных только клиентским пикселем, с числом реальных заказов из CRM за тот же период, чтобы оценить процент «невидимых» для
ad-blockerscapi
MiddleDevOps Engineer > Контейнеры и доставка > Мониторинг, логирование и observability
Короткий ответ Нужно последовательно проверить: не ротируется ли файл лога быстрее, чем агент успевает его прочитать; не упирается ли агент сбора логов в лимиты ресурсов (CPU/память) под нагрузкой; не возникает ли backpressure или отбрасывание (drop) на стороне приёмника при превышении его пропускной способности; не теряются ли данные на сетевом уровне между агентом и хранилищем. Как это работает подробнее агент сбора логов (Fluent Bit, Promtail) отслеживает позицию чтения файла (offset); если файл ротируется и удаляется быстрее, чем агент успел прочитать последнюю часть, эти строки теряются безвозвратно. Если приёмник (Elasticsearch, Loki) перегружен и отвечает ошибками или таймаутами, агент либо ставит данные в очередь (буфер), либо, при превышении буфера, начинает отбрасывать данные — это обычно видно по собственным метрикам агента (fluentbit_output_dropped_records_total, promtail_dropped_entries_total). Пример кода Что использовать на практике Практика. для диагностики сравнивают количество "отправленных"
centralized-logginglogging
MiddlePython Developer > Основы Python > Архитектура систем
Короткий ответ Межсервисный N+1 — это когда сервис A, обрабатывая список из N элементов, делает N отдельных вызовов к сервису B вместо одного batch-вызова, что резко увеличивает суммарную латентность и нагрузку на сеть и на сервис B. Как это работает подробнее Типичный паттерн — получить список заказов, а затем в цикле для каждого заказа отдельно запросить у User Service данные покупателя, хотя почти все запросы идут к одному и тому же сервису. Пример кода Что использовать на практике Практика. Решения — batch-эндпоинт на стороне B, предварительная денормализация часто нужных полей, или параллельное выполнение вызовов вместо последовательного, если batch невозможен. Подводные камни Риск. Распараллелить N вызовов вместо устранения их количества — это ускоряет ответ для A, но не снижает число запросов к B; добавлять batch-эндпоинт без ограничения на размер батча.
architecturedistributed-systems