JuniorData Analyst > SQL и данные > Качество данных
Короткий ответ Data lineage — это карта зависимостей: какие источники, таблицы, поля и преобразования участвуют в создании конечного набора данных или показателя. Как это работает подробнее Lineage может строиться на уровне таблиц или столбцов. Он связывает source, raw, staging, mart и BI-объекты, а также показывает операции фильтрации, соединения и агрегации. Расследование. По цепочке можно определить, на каком шаге появились потери или дубли. Оценка влияния. Перед изменением поля видно, какие модели и дашборды зависят от него. Пример кода Что использовать на практике Поддерживайте lineage автоматически из оркестратора, SQL-моделей и BI, где это возможно. Дополняйте технические связи владельцами, SLA и бизнес-определениями. Подводные камни Устаревшая схема. Нарисованная вручную карта быстро перестаёт соответствовать реальности. Только уровень таблиц. Для сложных метрик может потребоваться lineage конкретных столбцов и выражений.
data-catalogdata-lineage
MiddlePython Developer > Основы Python > Транзакции и конкурентность
Короткий ответ Deadlock возникает, когда две (или более) транзакции удерживают блокировки и одновременно ждут блокировку, удерживаемую друг другом, образуя цикл ожидания; PostgreSQL автоматически обнаруживает цикл и прерывает одну из транзакций с ошибкой deadlock detected, которую нужно перехватить и повторить операцию. Как это работает подробнее PostgreSQL периодически проверяет граф ожидания блокировок; при обнаружении цикла выбирается «жертва» — её запрос завершается ошибкой, а остальные участники продолжают работу. Пример кода Что использовать на практике Практика. Диагностируют через лог PostgreSQL (сообщения «deadlock detected» содержат оба конфликтующих запроса) или pg_stat_activity/pg_locks; снижают риск, блокируя строки в одном и том же порядке во всех частях кода (например, по возрастанию id) и держа транзакции короткими. Подводные камни Ошибка. Не оборачивают операцию в retry-логику после перехваченной ошибки deadlock, хотя это ожидаемая ситуация; обновляют несколько строк в разном порядке в разных
concurrencydeadlocks
MiddlePython Developer > Основы Python > Потоки и синхронизация
Короткий ответ Deadlock возникает, когда два потока захватывают несколько локов в разном порядке и каждый ждёт лок, уже удержанный другим — надёжное решение — всегда захватывать локи в едином, согласованном порядке во всём коде. Как это работает подробнее Поток A захватывает lock1 и ждёт lock2; поток B уже захватил lock2 и ждёт lock1 — оба блокируются навечно, так как ни один не может продолжить без лока, который держит другой. Пример кода Что использовать на практике Практика. Определяют глобальный порядок локов (например, по id объекта) и всегда захватывают их в этом порядке во всех местах кода; альтернативно используют acquire(timeout=...) и откат/повтор при неудаче, либо избегают удержания нескольких локов одновременно архитектурно. Подводные камни Риски. Захватывают локи в разном порядке в разных функциях, работающих с одними и теми же ресурсами (например, перевод между двумя счетами); не используют timeout на acquire, из-за чего дедлок невозможно детектировать программно — только по зависанию процесса.
concurrencydeadlocks
MiddleJava Developer > Java Core > Multithreading
Короткий ответ Deadlock (взаимная блокировка) — это ситуация, когда два или более потоков навсегда блокируют друг друга: каждый поток удерживает ресурс (монитор, блокировку), который нужен другому, и одновременно ждёт ресурс, удерживаемый другим. В результате программа «зависает», хотя потоки не завершились и не упали с ошибкой. Как это работает подробнее Классический сценарий в Java: поток 1 захватывает монитор объекта A и хочет войти в блок по объекту B, а поток 2 одновременно захватывает B и хочет войти в блок по A. Для возникновения deadlock нужно четыре условия Коффмана: взаимное исключение, удержание и ожидание, отсутствие вытеснения и циклическое ожидание. Достаточно устранить хотя бы одно из них, чтобы взаимной блокировки не было. Похожее явление — livelock: потоки не заблокированы, активно меняют состояние, но из-за взаимных уступок не продвигаются вперёд. Пример кода Что использовать на практике Захватывай блокировки во всех потоках в едином фиксированном порядке (и освобождай в обратном) — это разр
concurrencydeadlock
MiddleJava Developer > Java Core > Java 8+
Короткий ответ Default-метод — это метод интерфейса, у которого есть реализация, помеченная ключевым словом default. Он нужен для обратной совместимости: до Java 8 методы интерфейсов были только абстрактными, и добавление нового метода ломало все классы-реализации. Теперь в существующий интерфейс можно добавить метод с готовой реализацией, и классы продолжат компилироваться без изменений, а при желании переопределят его. Как это работает подробнее Именно благодаря default-методам в Java 8 в старые интерфейсы стандартной библиотеки добавили новые возможности: в Collection появился метод stream(), в List — sort(). Это дало и второе преимущество — множественное «поведенческое» наследование: класс может получить готовую реализацию сразу от нескольких интерфейсов, если между ними нет конфликтов. Важное правило: если класс реализует два интерфейса с одинаковыми default-методами, возникает конфликт, и класс обязан переопределить метод явно, например вызвав SomeInterface.super.method(). Реализация из суперкласса всег
backward-compatibilitydefault-methods
MiddlePython Developer > Основы Python > ООП и модель объектов
Короткий ответ Diamond problem возникает, когда класс наследуется от двух классов, у которых есть общий предок, и возникает неоднозначность, какую версию метода общего предка должен получить итоговый класс; Python решает это не "напрямую к родителю", а через единый порядок MRO (C3-линеаризацию), благодаря чему super() в каждом классе переходит к следующему классу по этому общему порядку, и общий предок вызывается ровно один раз, а не дважды. Как это работает подробнее Если ClassD(ClassB, ClassC), а ClassB и ClassC оба наследуются от ClassA, наивная реализация (вызов родителя "в лоб" по имени класса) привела бы к тому, что метод ClassA может быть вызван дважды — один раз через цепочку B, второй раз через C. MRO выстраивает единый линейный порядок [D, B, C, A, object], и каждый super().method() в B и C переходит не прямо к A, а к следующему классу в этом общем порядке, поэтому A вызывается один раз, независимо от того, сколько путей к нему ведёт. Пример кода Что использовать на практике Практика. Это особенно в
inheritanceobject-model
MiddleJava Developer > Java Core > Spring
Короткий ответ DispatcherServlet — фронт-контроллер Spring MVC: он принимает все входящие HTTP-запросы, направляет их к нужным контроллерам, координирует обработку и возвращает ответ клиенту. Архитектурно Spring MVC делит приложение на Model, View и Controller, а DispatcherServlet служит единой точкой входа для всех запросов. Как это работает подробнее Полная цепочка типового запроса в Spring Boot-приложении: клиент → DispatcherServlet → Controller → Service → Repository → база данных, а результат возвращается через контроллер клиенту в виде представления или JSON. В Spring Boot DispatcherServlet настраивается автоматически при подключении spring-boot-starter-web: встроенный Tomcat и авто-конфигурация Spring MVC уже включены. Приём запроса: клиент отправляет HTTP-запрос, и он попадает в DispatcherServlet. Маршрутизация: по маппингам запросов (@RequestMapping, @GetMapping) DispatcherServlet определяет, какой контроллер обработает запрос. Обработка: контроллер взаимодействует с моделью и сервисным слоем и возвр
controllerdispatcherservlet
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ Django REST Framework (DRF) — это мощный и гибкий инструментарий поверх Django, который упрощает создание REST API и заметно сокращает объём кода. Он даёт сериализаторы, viewsets, аутентификацию, разрешения и browsable API. Как это работает подробнее DRF строится вокруг нескольких ключевых компонентов, которые вместе покрывают типовые задачи REST-сервисов. Сериализаторы. Serializer и ModelSerializer преобразуют сложные типы данных, такие как queryset и экземпляры моделей, в JSON или XML и обратно. Viewsets. ModelViewSet объединяет набор операций CRUD для модели, а роутеры автоматически генерируют стандартные эндпоинты. Аутентификация. Поддерживаются токены, OAuth и JWT, а также гибкая политика разрешений. Удобство разработки. Browsable API даёт интерактивный веб-интерфейс, доступны пагинация, фильтрация и версионирование. Источники данных. DRF работает как с ORM, так и с не-ORM-источниками данных. Что использовать на практике Стандартный выбор. Используй DRF для построения RESTful-сервисов на D
djangodrf
JuniorPython Developer > Основы Python > Docker и контейнеры
Короткий ответ docker-compose — инструмент для описания и запуска нескольких связанных контейнеров (приложение, PostgreSQL, Redis) одной командой из единого YAML-файла; он решает проблему локальной разработки, когда приложению нужна инфраструктура, которую неудобно поднимать вручную. Как это работает подробнее docker-compose.yml описывает набор сервисов, их образы, переменные окружения, порты и volume, а также сеть, в которой контейнеры видят друг друга по имени сервиса; docker compose up строит и запускает все сервисы с учётом зависимостей. Пример кода Что использовать на практике Рекомендация. сервис обращается к базе по имени сервиса из файла, а не по localhost, благодаря внутреннему DNS Docker; volume используют, чтобы данные БД не терялись при пересоздании контейнера. Подводные камни Риск. использовать docker-compose как production-оркестратор для масштабирования — он для локальной разработки; depends_on не гарантирует полную готовность зависимого сервиса, для этого нужны health-check и retry-логика.
containerizationcontainers
JuniorPerformance Marketer > Google Ads > Серверный трекинг
Короткий ответ Enhanced Conversions и Conversions API — это способы передавать данные о конверсиях с сервера сайта (или дополненными хешированными данными пользователя) напрямую рекламной платформе, в дополнение или вместо клиентского пикселя, чтобы снизить потери данных из-за блокировщиков и ограничений браузеров. Как это работает подробнее Вместо (или вместе с) отправки события из браузера пользователя сайт отправляет данные о конверсии со своего сервера на сервер рекламной платформы через API, обычно вместе с хешированными идентификаторами (email, телефон) для сопоставления с пользователем платформы. Хеширование email/телефона перед отправкой (обычно через алгоритм SHA-256) позволяет площадке сопоставить пользователя со своей базой залогиненных аккаунтов без передачи самих персональных данных в открытом виде, что частично решает и вопрос приватности при расширении охвата трекинга. Пример кода Что использовать на практике Практика. Для маркетолога это означает, что настройка такого трекинга обычно требует у
capiconversion-tracking