JuniorData Analyst > SQL и данные > Аналитическое мышление
Короткий ответ Раскладываю оценку на предположения: доля MAU, обращающихся в поддержку за месяц, и перевожу обращения в месяц в обращения в день, явно проговаривая все допущения. Как это работает подробнее Fermi-оценка — это не точный расчёт, а структурированное рассуждение через цепочку правдоподобных допущений, каждое из которых можно скорректировать при появлении реальных данных. Пример кода Что использовать на практике Порядок действий. пример цепочки: пусть 5% MAU обращаются в поддержку хотя бы раз в месяц → 5 000 обращений/месяц → в среднем 1.2 обращения на обратившегося → 6 000 тикетов/месяц → делим на ~22 рабочих дня → ≈270 тикетов в день. Явно проговариваю, что 5% — предположение, которое нужно свериться с реальными данными, если они есть. Подводные камни Частые ошибки. выдавать Fermi-оценку за точный прогноз без оговорки о допущениях; использовать недопустимо точные цифры (например, «273.4 тикета») вместо порядка величины; не указывать, какое из допущений наиболее неопределённое и сильнее всего влия
assumptionsfermi-estimation
MiddleDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Нужно посмотреть тайминги отдельных стадий/джоб в интерфейсе CI, найти самую долгую и выяснить причину (рост числа тестов без параллелизации, отсутствие/поломка кэша зависимостей, нехватка раннеров и очередь ожидания, увеличившийся объём скачиваемых артефактов), а затем применить точечное решение — параллелизацию независимых джоб, шардирование тестов, восстановление кэширования или увеличение числа раннеров — вместо общего «ускорения всего». Как это работает подробнее большинство CI-систем показывают breakdown по времени каждой стадии и джобы, включая время ожидания в очереди (queue time) отдельно от времени выполнения (run time) — это ключевое различие: рост queue time говорит о нехватке раннеров/concurrency, а рост run time — о самой работе (больше тестов, больше зависимостей, медленный диск). Пример кода Что использовать на практике На практике. для долгих тестовых сьютов эффективно шардирование (разбиение тестов на N параллельных джоб по времени выполнения) и выделение быстрых smoke-тестов
artifactscicd-and-release-management
MiddleDevOps Engineer > Контейнеры и доставка > Dockerfile и сборка
Короткий ответ FROM node:20 (без уточнения патч-версии или digest) указывает на изменяемый тег: издатель образа может опубликовать обновлённую минорную/патч-версию под тем же именем, и новая сборка молча подтянет другое содержимое базового образа — решение — фиксировать базовый образ по digest либо по максимально точному тегу и обновлять его осознанно. Как это работает подробнее теги в реестрах (кроме неизменяемого digest) — это просто указатели, которые владелец репозитория может переставить на новый манифест в любой момент; node:20 на практике означает "последняя опубликованная версия ветки 20.x" и со временем начинает указывать на другой набор слоёв, с другими версиями системных библиотек и npm/node patch-релизом. Пример кода Что использовать на практике Практика. для воспроизводимости сборки закрепляют базовый образ по digest (FROM node:20@sha256:...), либо как минимум по максимально точной версии (node:20.11.1-slim), и обновляют эту фиксацию сознательно через отдельный процесс (например, автоматический P
container-imagesdocker
JuniorData Analyst > Метрики и эксперименты > A/B-тесты
Короткий ответ Нужно посмотреть на размер эффекта (lift), его доверительный интервал или p-value, а также на то, достигнут ли запланированный размер выборки — и только после этого делать вывод о значимости и о том, стоит ли раскатывать изменение. Как это работает подробнее таблица обычно содержит базовую метрику по группам, разницу (абсолютную и относительную), p-value или доверительный интервал, и иногда отдельно мощность или размер выборки — все эти колонки нужно читать вместе, а не по одной. Таблица: | Группа | Users | CR | Разница | 95% ДИ | p-value | | A | 20 000 | 4.8% | - | - | - | | B | 20 050 | 5.1% | +0.3 п.п. | [-0.05; +0.65] | 0.09 | Вывод: эффект направлен в плюс, но p-value=0.09 > 0.05, а ДИ пересекает ноль — результат не достиг заявленной значимости, нужно либо продолжить тест, либо признать эффект неподтверждённым при текущих данных. Что использовать на практике сначала проверяют, что выборка набрана полностью (иначе результат предварительный), затем смотрят на знак и величину эффекта, затем н
doveritelnyy-intervalinterpretatsiya
MiddleDevOps Engineer > Контейнеры и доставка > Скриптинг и автоматизация
Короткий ответ Историю приводят в порядок через git rebase -i — объединяя (squash/fixup) промежуточные коммиты в логичные смысловые блоки с понятными сообщениями; это безопасно для ветки, которой пользуетесь только вы, но рискованно для ветки, которую уже вытянул себе кто-то другой, так как переписывание истории меняет хэши коммитов и ломает их локальные копии. Как это работает подробнее git rebase -i HEAD~15 открывает список коммитов, где можно пометить их как pick, squash, fixup или reword, после чего Git пересоздаёт их в новом виде с новыми хэшами; это чисто локальная операция, пока изменения не запушены. Пример кода Что использовать на практике Рекомендация. безопасный порядок — выполнить интерактивный rebase локально, проверить, что тесты всё ещё проходят после объединения коммитов, и запушить веткой с --force-with-lease (не просто --force, чтобы не затереть чужие изменения, появившиеся в ветке без вашего ведома). Если над той же веткой уже работает кто-то другой, перед rebase стоит явно согласовать с ни
commit-historyforce-with-lease
MiddleData Analyst > SQL и данные > Качество данных
Короткий ответ Нужно провести QA на ограниченной выборке (staging-окружение или небольшая группа пользователей/тестовый релиз) — сверить, что событие действительно отправляется при ожидаемом действии, содержит все нужные свойства, не дублируется и не отправляется при отсутствии действия (ложные срабатывания). Как это работает подробнее Валидация нового события обычно включает: (1) ручное воспроизведение действия в тестовой среде и проверку, что событие появилось в сыром потоке данных с ожидаемыми properties, (2) проверку на дубли при повторных действиях (например, повторный клик play/pause), (3) сверку объёма событий с ожидаемым порядком величины после раскатки на небольшую долю пользователей. Пример кода Что использовать на практике На практике. Полезно сравнить новое событие с уже существующим похожим (например, "video_started" против "video_watched") на предмет согласованности именования, типов свойств и единиц измерения (секунды vs миллисекунды), чтобы не создавать несогласованность в будущей аналитике. П
analyticsdata-quality
JuniorData Analyst > SQL и данные > Инструменты и инженерные практики
Короткий ответ Можно посмотреть размер файла, количество строк, заголовок и несколько первых/последних строк без полной загрузки в память с помощью ls -lh, wc -l, head и tail, что помогает оценить, стоит ли вообще читать весь файл в pandas сразу. Как это работает подробнее Как это работает: wc -l file.csv построчно считает файл не загружая его целиком в оперативную память, head -n 5 file.csv и tail -n 5 file.csv печатают первые/последние строки, а ls -lh показывает размер файла на диске. Пример кода Что использовать на практике На практике: это особенно полезно перед работой с файлами, которые не помещаются комфортно в память: по числу строк и размеру можно прикинуть, нужен ли pd.read_csv(..., chunksize=...), стоит ли сразу выбрать только нужные столбцы через usecols, или достаточно обычной загрузки. Пример и проверка. Вывод показывает размер 4.8G, 42 000 001 строк (включая заголовок) и что разделитель — запятая, а первый столбец — order_id. Проверка: после pd.read_csv('orders.csv', nrows=5) число столбцов и
bashcommand-line
JuniorData Analyst > SQL и данные > Визуализация и BI
Короткий ответ Дубликаты искусственно завышают счётчики и суммы (двойной учёт клиентов), а пропуски в email могут занижать метрики, основанные на уникальности по этому полю; нужно выбрать надёжный ключ дедупликации и явно обработать пропуски до построения графиков. Как это работает подробнее Дашборды агрегируют «сырые» строки; дубли строк или некорректный ключ напрямую искажают счётчики, суммы и распределения на графиках. Пример кода Что использовать на практике Рекомендация. Используйте в качестве ключа дедупликации стабильный идентификатор (например, customer_id), а не email, который может отсутствовать или быть общим. Рекомендация. Применяйте COUNT(DISTINCT key) вместо COUNT(*), где это уместно. Рекомендация. Явно решите и задокументируйте, как показывать пропуски (исключать или выносить в «Неизвестно»). Подводные камни Риск. Использование COUNT(*) в предположении «одна строка — один клиент» без проверки дублей. Риск. Молчаливое исключение строк с NULL email, занижающее итоговые показатели. Риск. Отсутстви
dashboardsdata-quality
MiddleDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ Нужно задать в объявлении переменной блок validation с условием (condition) и понятным сообщением об ошибке (error_message), а также по возможности ограничить тип через type (например, number, string) — тогда при передаче недопустимого значения Terraform остановится с явной ошибкой ещё до обращения к provider, а не при apply с малопонятным сообщением от API. Как это работает подробнее блок validation выполняется Terraform локально на этапе обработки конфигурации (во время plan/apply, до построения графа ресурсов), вычисляя булево выражение condition для значения переменной; если оно ложно, Terraform прерывает выполнение с заданным error_message, что происходит гораздо раньше и понятнее, чем ошибка от облачного провайдера при попытке создать ресурс с недопустимым параметром. Пример кода Что использовать на практике Практика. стоит добавлять валидацию для всех переменных, значения которых ограничены бизнес-правилами или возможностями провайдера (диапазоны, допустимые enum-строки, формат CIDR и т.
cloud-infrastructureconfiguration-management
SeniorPython Developer > Основы Python > Надёжность API
Короткий ответ Нужен обязательный клиентский ключ идемпотентности, атомарно привязанный к результату операции на уровне БД (уникальный индекс + транзакция), плюс идемпотентная обработка на стороне интеграции с платёжным провайдером (который сам может повторно доставить уведомление); "exactly-once" в строгом смысле недостижимо в распределённой системе, поэтому цель — эффективно-однократное выполнение (effectively-once) через идемпотентность на каждом шаге цепочки. Как это работает подробнее клиент генерирует Idempotency-Key перед первой попыткой; сервер должен атомарно "зарезервировать" ключ (например, INSERT ... ON CONFLICT DO NOTHING с уникальным индексом по ключу) до начала фактического списания, чтобы параллельные повторные запросы с тем же ключом не прошли через бизнес-логику параллельно. Отдельно — вызов самого платёжного провайдера также должен быть идемпотентным (большинство провайдеров поддерживают свой idempotency key), потому что retry может произойти и на этом уровне, независимо от вашего API. Прим
deduplicationidempotency