JuniorPerformance Marketer > Google Ads > Специфика рекламных площадок и каналов
Короткий ответ Частотный лимит — ограничение на то, сколько раз один и тот же пользователь увидит объявление за заданный период; он нужен, чтобы избежать избыточных повторных показов, которые ведут к раздражению аудитории, падению CTR и неэффективному расходу бюджета. Как это работает подробнее платформа подсчитывает число показов на уникального пользователя за выбранный интервал и прекращает показывать объявление этому пользователю после достижения лимита; в некоторых системах с оптимизацией по конверсиям (например, стандартный аукцион Meta) явный ручной контроль частоты недоступен напрямую, а регулируется алгоритмом через механику аукциона. Что использовать на практике На практике. частоту важно отслеживать в отчётах даже без жёсткого лимита — рост показателя Frequency при неизменном бюджете на фиксированную аудиторию обычно сигнализирует об исчерпании аудитории и приближающемся падении CTR; в программатике частотный лимит особенно важен, так как закупка идёт по множеству площадок одновременно. Пример. В от
frequencyfrequency-cap
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ Шаблон в Django — это текстовый документ, обычно HTML-файл, который задаёт внешний вид и структуру страницы сайта; это презентационный компонент архитектуры MVT. Внутри HTML шаблон использует переменные в {{ }} и логические теги вроде {% if %} и {% for %}, чтобы подставлять данные динамически. Как это работает подробнее Представление передаёт данные в шаблон, а язык шаблонов Django (DTL) формирует итоговый HTML для пользователя. Синтаксис. Переменные записываются в двойных фигурных скобках — {{ variable }}, логика — в тегах {% tag %}, например {% if %} и {% for %}. Наследование. Базовый шаблон объявляет блоки {% block %}, а дочерние расширяют его через {% extends %}, избегая дублирования разметки. Подключение. Шаблоны лежат в едином каталоге на уровне проекта или в каталоге templates внутри каждого приложения. Движки. Помимо стандартного DTL в Django можно применять альтернативный движок Jinja2. Разделение. Django — преимущественно бэкенд-фреймворк, поэтому шаблоны отвечают только за представле
djangohtml
JuniorPython Developer > Основы Python > Основы Python
Короткий ответ В языке с динамической типизацией проверка типов происходит во время исполнения программы, а не на этапе компиляции. В Python не нужно объявлять тип переменной: интерпретатор выводит его из присвоенного значения, поэтому одна переменная может хранить объекты разных типов. Как это работает подробнее Динамическая типизация в Python сочетается с сильной: это разные оси, и вместе они определяют поведение языка. Вывод типа по значению. Переменная не привязана к типу: интерпретатор назначает его в момент присваивания, и позже переменной можно присвоить значение другого типа. Сильная типизация. Python не выполняет неявных преобразований, если они небезопасны: например, сложение строки с числом приводит к ошибке TypeError. Проверка в рантайме. Ошибки, связанные с типами, обнаруживаются при выполнении кода, а не до запуска, что требует внимательности и тестов. Пример кода Что использовать на практике Компактный код. Отсутствие объявлений типов ускоряет написание и сокращает объём кода. Аннотации типов.
duck-typingdynamic-typing
JuniorData Analyst > Метрики и эксперименты > A/B-тесты
Короткий ответ A/A-тест — это эксперимент, где обеим группам показывают одинаковую (контрольную) версию продукта, чтобы проверить, что система сплитования, трекинга и статистического анализа работает корректно и не даёт ложных значимых результатов на пустом месте. Как это работает подробнее поскольку группы идентичны, ожидается, что доля значимых результатов при многократных A/A-тестах близка к заявленному alpha (например, около 5% при alpha=0.05), а распределение пользователей между группами близко к ожидаемому сплиту. Пример: провели 20 независимых A/A-тестов на одной и той же платформе; если в 6 из них получили p<0.05 (30% вместо ожидаемых ~5%), это сигнал, что система сплитования или сбора данных работает некорректно — например, из-за дублирования событий или неравного трафика. Что использовать на практике A/A-тесты проводят при запуске новой платформы экспериментов или при подозрении на проблему в трекинге, чтобы валидировать инфраструктуру перед тем, как доверять ей реальные продуктовые тесты. Подводные
aa-testeksperimentalnaya-platforma
JuniorPerformance Marketer > Google Ads > Эксперименты
Короткий ответ В тесте меняют одну основную переменную и заранее выбирают метрику успеха. Результат оценивают после достаточного объёма данных, учитывая статистическую неопределённость. Как это работает подробнее Трафик случайным образом делится между вариантами одновременно и в одинаковых условиях, после чего сравнивается ключевая метрика — CTR, CPA или CR — с учётом статистической значимости различия. Помимо встроенного инструмента A/B-теста платформы, тест можно проводить и через раздельные кампании с одинаковым бюджетом и таргетингом, но это менее надёжно, так как аукцион для двух отдельных кампаний формируется независимо. Что использовать на практике Используйте встроенное распределение аудитории платформы, ограничьте число вариантов и задайте длительность и целевую метрику до запуска. Подводные камни Несопоставимые периоды, одновременная смена текста и изображения и преждевременный выбор по нескольким кликам превращают тест в шумное наблюдение.
ab-testingcreative-testing
MiddlePython Developer > Основы Python > Архитектурные решения
Короткий ответ ADR — это короткий документ, фиксирующий конкретное архитектурное решение, рассмотренные альтернативы и причины выбора; его стоит заводить для решений, которые сложно будет отменить позже или которые вызывают споры в команде. Как это работает подробнее ADR обычно содержит контекст (какая проблема решалась), рассмотренные варианты, выбранное решение и его последствия (в том числе отрицательные). Он хранится рядом с кодом (например, в папке docs/adr) и доступен всей команде, в отличие от решения, принятого устно на созвоне и нигде не зафиксированного, которое легко забывается или искажается при пересказе. Пример кода Что использовать на практике Практика. ADR особенно полезен для решений вроде выбора брокера сообщений, схемы разбиения на сервисы или отказа от какого-то паттерна — то есть там, где через полгода кто-то неизбежно спросит «а почему мы сделали именно так» и где отмена решения стоит дорого. Для мелких технических деталей, которые легко поменять, заводить ADR избыточно и только добавляе
adrarchitecture
JuniorPython Developer > Основы Python > API и контракты
Короткий ответ API — формальный контракт взаимодействия (методы, форматы данных, ошибки); явные границы нужны, чтобы сервисы могли меняться внутри независимо, не ломая друг друга. Как это работает подробнее Контракт описывает входы/выходы, не детали реализации; потребитель зависит от контракта, а не от кода. Пример кода Что использовать на практике Практика. Используют схемы (OpenAPI, protobuf) для документирования и валидации; изменения проводят через версионирование или обратно совместимые поля. Подводные камни Риск. Отсутствие формального контракта («договорились на словах»), прямой доступ к БД другого сервиса вместо вызова его API.
apiapi-design
JuniorPython Developer > Основы Python > Согласованность и репликация
Короткий ответ API-контракт — согласованное описание структуры запросов/ответов между сервисами; менять поле ответа без согласования нельзя, так как потребители, написанные под старый контракт, могут сломаться. Как это работает подробнее Контракт обычно явно описан (OpenAPI/JSON Schema/protobuf) или подразумевается по факту использования; потребитель парсит ответ, ожидая конкретные поля и типы. Пример кода Что использовать на практике Практика. Безопасные изменения — добавление нового необязательного поля; небезопасные — удаление поля, смена типа, переименование без переходного периода. Подводные камни Риск. Удалять «неиспользуемое» поле без проверки реальных потребителей; менять тип поля (строка → число) без оповещения.
apiconsistency
MiddlePython Developer > Основы Python > Многопоточность и асинхронность
Короткий ответ Ключевые слова async и await позволяют писать асинхронный код: функция async def становится корутиной, а await приостанавливает её до готовности ожидаемого объекта, возвращая управление циклу событий. Как это работает подробнее При вызове корутина не исполняет тело, а возвращает объект корутины, который должен работать внутри цикла событий asyncio. Корутина. Функция, объявленная через async def; без await или asyncio.run() её код не выполнится. Ожидание. await приостанавливает корутину до завершения другой корутины, asyncio-задачи или Future. Конкурентность. Пока одна корутина ждёт сеть или диск, цикл событий выполняет другие корутины. Запуск. Стандартный вход в асинхронную программу — asyncio.run(), либо await из другой корутины. Пример кода Что использовать на практике Точка входа. Запускай верхнеуровневую корутину через asyncio.run(). Группировка задач. Запускай несколько корутин конкурентно через asyncio.gather(). Тайм-ауты. Ограничивай долгие ожидания через asyncio.wait_for(). Подводные ка
asyncasyncio
MiddleJava Developer > Java Core > Multithreading
Короткий ответ BlockingQueue — интерфейс из пакета java.util.concurrent, описывающий потокобезопасную очередь с блокирующими операциями: put() ждёт, пока в заполненной очереди освободится место, а take() ждёт появления элемента в пустой. Это готовая модель «производитель — потребитель», которая избавляет от ручной синхронизации через wait/notify. Как это работает подробнее Блокирующие операции приостанавливают поток до выполнения условия: put() не завершится, пока в ограниченной очереди не освободится место, а take() — пока не появится элемент. Помимо них есть неблокирующие offer() и poll(): они сразу возвращают false или null, а версии с таймаутом ждут строго ограниченное время. Интерфейс избавляет от ручной синхронизации: не нужны ни явные блокировки, ни wait/notify, ни бесконечные циклы опроса. Очередь сама координирует потоки производителя и потребителя. ArrayBlockingQueue — ограниченная очередь на массиве с фиксированной ёмкостью. LinkedBlockingQueue — очередь на связных узлах, опционально ограниченная.
blockingqueueconcurrent