MiddleJava Developer > Java Core > Collections
Короткий ответ HashMap внутри — это массив бакетов: массив узлов Node[] table, где каждый узел хранит hash, key, value и ссылку next на следующий узел при коллизии. Индекс корзины вычисляется из hashCode() ключа, а коллизии разрешаются цепочками узлов. Как это работает подробнее По умолчанию создаётся 16 корзин, индекс вычисляется как (n - 1) & hash, где n — текущая длина массива. Когда число записей превышает ёмкость × load factor (по умолчанию 0,75), массив увеличивается примерно вдвое и записи перераспределяются по новым корзинам. Узел: хранит четыре поля — вычисленный хэш ключа, ключ, значение и ссылку next на следующий узел той же корзины. Коллизии: разные ключи с одним индексом выстраиваются в цепочку; с Java 8 цепочка длиннее 8 узлов превращается в красно-чёрное дерево, и худший случай поиска становится O(log n) вместо O(n). null: HashMap допускает один null-ключ — он попадает в корзину с индексом 0 без вызова hashCode — и сколько угодно null-значений. Потокобезопасность: класс не синхронизирован,
big-ocollections
MiddleJava Developer > Java Core > Collections
Короткий ответ Контракт Java: если два объекта равны по equals(), их hashCode() обязаны быть одинаковыми. Обратное не требуется: одинаковый хэш-код не гарантирует равенства — это коллизия. Связь критична для HashMap и HashSet: по hashCode определяется корзина, а точное совпадение внутри корзины проверяется через equals. Как это работает подробнее Если переопределить только equals и не тронуть hashCode, контракт нарушается: равные объекты разъедутся по разным корзинам, поиск не найдёт элемент, а в Set или Map появятся дубликаты. Поэтому методы переопределяют всегда вместе и на основе одного и того же набора значимых полей. Требования к equals: рефлексивность (объект равен себе), симметричность, транзитивность, консистентность и возврат false для null. Генерация: используйте средства IDE или Objects.equals и Objects.hash — это синхронизирует поля в обоих методах. Типичный баг: нарушение контракта — одна из самых частых причин неочевидных ошибок при работе с коллекциями. Пример кода Что использовать на практике
collectionsequals
JuniorData Analyst > SQL и данные > Визуализация и BI
Короткий ответ Для сравнения величин по категориям лучше всего подходит столбчатая диаграмма; круговая диаграмма с большим числом секторов плохо читается, потому что человеку сложно точно сравнивать углы и площади. Как это работает подробнее Столбцы кодируют значение длиной от общей базовой линии, и такие длины легко сравнивать визуально; круговая диаграмма кодирует долю через угол/площадь сектора, что человек воспринимает менее точно, особенно при похожих значениях. Пример кода Что использовать на практике Рекомендация. Сортируйте столбцы по убыванию значения для читаемости, объединяйте мелкие категории в «Прочее», если их много, используйте горизontal bar при длинных подписях категорий. Подводные камни Риск. Использование pie-диаграммы для 8+ категорий, 3D-эффекты у столбцов и секторов, отсутствие сортировки столбцов, начало оси Y не с нуля для столбчатой диаграммы.
bar-chartdata-visualization
JuniorPython Developer > Основы Python > FastAPI и Pydantic
Короткий ответ FastAPI автоматически вернёт статус 422 Unprocessable Entity с JSON-телом, содержащим список ошибок (detail) с указанием места (loc), типа ошибки и сообщения для каждого некорректного поля. Как это работает подробнее При несовпадении данных запроса со схемой Pydantic выбрасывается RequestValidationError, которую Starlette/FastAPI перехватывают встроенным обработчиком исключений и преобразуют в стандартизированный JSON-ответ без необходимости писать код обработки вручную. Пример кода Что использовать на практике Практика. Формат ошибки единый для всех эндпоинтов приложения, что упрощает обработку на стороне клиента. При необходимости можно переопределить обработчик через @app.exception_handler(RequestValidationError), если нужен другой формат (например, под конкретный стандарт API). Подводные камни Риск. Путают 422 (ошибка валидации входных данных) с 400 (общая ошибка клиента) — в чистом FastAPI для ошибок валидации Pydantic именно 422; пишут собственную ручную валидацию там, где достаточно объя
fastapihttp
MiddleData Analyst > SQL и данные > Инструменты и инженерные практики
Короткий ответ dbt превращает набор SQL-скриптов в управляемый проект с явными зависимостями между моделями (через ref()), версионированием, автогенерацией документации и графа зависимостей, а встроенные тесты позволяют автоматически проверять качество данных (уникальность, отсутствие NULL, ссылочную целостность) при каждом запуске. Как это работает подробнее Как это работает: вместо того чтобы вручную помнить порядок запуска SQL-скриптов, в dbt каждая модель — это SELECT-запрос, ссылающийся на другие модели через {{ ref('model_name') }}; dbt строит граф зависимостей (DAG) и запускает модели в правильном порядке, материализуя их как таблицы или представления. Пример кода Что использовать на практике На практике: тесты описываются декларативно в YAML (not_null, unique, relationships, accepted_values) и запускаются командой dbt test, что позволяет ловить проблемы с данными до того, как на них построят отчёт; документация и граф зависимостей (dbt docs generate) помогают новым участникам команды понять, откуда бе
data-modelingdata-tests
JuniorDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ Liveness probe проверяет, что процесс в контейнере жив и работоспособен — при провале Kubernetes перезапускает контейнер; readiness probe проверяет, готов ли контейнер принимать трафик — при провале под временно убирается из endpoints Service, но не перезапускается. Как это работает подробнее обе проверки выполняются kubelet на узле по расписанию (HTTP-запрос, TCP-соединение или команда внутри контейнера) и имеют независимые пороги успеха/неудачи. Liveness влияет на решение "перезапустить контейнер", readiness — на решение "включать ли под в балансировку трафика Service". Пример кода Что использовать на практике Практика. readiness особенно важна при старте приложения, которому нужно время на прогрев кэша или подключение к базе — без неё трафик пойдёт на под раньше, чем он реально готов отвечать. Liveness нужна для восстановления после зависаний (deadlock), когда процесс жив, но не отвечает. Подводные камни Риски. использовать одну и ту же проверку для liveness и readiness без понимания разницы
health-checkskubernetes
MiddlePython Developer > Основы Python > Архитектура веб-API
Короткий ответ Клиент должен передавать идемпотентный ключ (например, заголовок Idempotency-Key), а сервер — сохранять связь между этим ключом и результатом первой успешной обработки, чтобы при повторном запросе с тем же ключом вернуть сохранённый результат вместо повторного создания заказа. Как это работает подробнее При первом запросе с новым Idempotency-Key сервер атомарно (например, через уникальный индекс в БД на этот ключ) резервирует ключ, выполняет операцию и сохраняет результат (например, order_id и тело ответа) вместе с ключом. При повторном запросе с тем же ключом сервер находит сохранённую запись и возвращает тот же результат без повторного выполнения бизнес-логики. Пример кода Что использовать на практике Практика. Важно учитывать конкурентный повтор «почти одновременно» (например, клиент шлёт повтор ещё до завершения первой обработки) — для этого ключ резервируют до выполнения операции, используя уникальность на уровне БД, а не только проверку-потом-запись в коде приложения, чтобы избежать гонки
idempotencypython
MiddleData Analyst > SQL и данные > Python для анализа данных
Короткий ответ merge_asof нужен, когда у двух таблиц нет точного совпадения по времени, но логически нужно сопоставить событие с ближайшим по времени (обычно предыдущим) значением из другой таблицы, например событие продажи с последней известной на тот момент ценой или курсом валюты. Как это работает подробнее merge_asof сортирует обе таблицы по ключу (обычно временному) и для каждой строки левой таблицы находит последнюю строку правой таблицы, чья временная метка не превышает временную метку левой строки (direction='backward' по умолчанию); обычный merge по равенству требует точного совпадения значений ключа и не умеет искать "ближайшее подходящее". Пример кода Что использовать на практике На практике. типичный пример — сопоставить время транзакции с действовавшим на этот момент тарифом или курсом обмена, который меняется не в момент каждой транзакции, а периодически; перед использованием обе таблицы обязательно должны быть отсортированы по ключу объединения, иначе результат будет неверным или функция выброс
joinsmerge-asof
MiddleData Analyst > SQL и данные > Инструменты и инженерные практики
Короткий ответ Airflow явно описывает зависимости между задачами в виде DAG, умеет перезапускать упавшие шаги, хранит историю запусков и интегрируется с алертами, тогда как cron просто запускает скрипты по расписанию без знания об их зависимостях и без встроенного мониторинга. Как это работает подробнее Как это работает: в Airflow пайплайн описывается как DAG (direct acyclic graph) — набор задач (task) с явными зависимостями (task_a >> task_b >> task_c); планировщик следит, что задача B запустится только после успешного завершения A, а веб-интерфейс показывает статус и логи каждого запуска. Пример кода Что использовать на практике На практике: при трёх зависимых моделях cron потребовал бы либо запускать их одной задачей с ручной обработкой ошибок на каждом шаге, либо сильно разносить время запуска «на глаз», рискуя, что модель B стартует раньше, чем реально готова A; в Airflow достаточно описать зависимость явно, настроить retry с задержкой и алерт в Slack при падении задачи через on_failure_callback. Пример
airflowdag
MiddleData Analyst > SQL и данные > Продуктовые и бизнес-метрики
Короткий ответ Нужно посчитать конверсию отдельно на каждом переходе между шагами за текущую и предыдущую неделю, найти, на каком именно переходе относительное падение наибольшее, а затем разбить этот шаг по сегментам (платформа, канал трафика, гео) и по времени (внутри недели), чтобы локализовать причину. Как это работает подробнее общая конверсия воронки — это произведение конверсий на каждом шаге (view→cart→pay = conv1 × conv2); падение общей конверсии может быть вызвано падением на любом из шагов, и без пошаговой разбивки невозможно понять, где искать причину. Пример кода Что использовать на практике Практика. после локализации проблемного шага стоит проверить технические причины (ошибки в форме оплаты, деплой за день до падения, проблемы с платёжным провайдером), затем — изменение состава трафика (например, выросла доля низкокачественного трафика с одного канала) и только потом content/UX-гипотезы; важно сопоставить момент падения с логом релизов и маркетинговых кампаний. Подводные камни Частые ошибки. д
conversiondiagnostics