10 Commits
Author SHA1 Message Date
ddadminandClaude Fable 5 1ae670410b feat(docs): добавлен подраздел «Linux и терминал» в базовые инструменты
Deploy MkDocs to GitHub Pages / build (push) Canceled after 0s
Deploy MkDocs to GitHub Pages / deploy (push) Canceled after 0s
- Зачем:
  - единственный пробел заявленной базы: все стенды консольные, а в
    роадмапе не было ни одного упоминания bash/ssh/командной строки (P1).
- Что:
  - в блок «Git и базовые инструменты» добавлен подраздел с видео-интро,
    тремя статьями (навигация и grep, права файлов, ssh) и опциональным
    интерактивным курсом Hexlet; примечание про WSL для Windows.
  - критерии готовности блока дополнены терминалом, grep и правами/ssh;
    в оглавление добавлен Linux; задача перенесена в «Сделано» в TODO.
- Проверка:
  - mkdocs build --strict — сборка без ошибок;
  - все ссылки проверены на живость и соответствие содержимого
    (curl --noproxy для RU-доменов, покрытие видео — по субтитрам).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 22:46:46 +03:00
ddadminandClaude Fable 5 6983c25d10 ci(docs): добавлена еженедельная проверка внешних ссылок (lychee)
- Зачем:
  - в роадмапе ~100 внешних ссылок, репозиторий правится редко — ссылки
    гниют молча (пункт P1 из project/TODO.md).
- Что:
  - добавлен lychee.toml: игнор-лист доменов, режущих ботов (habr, stepik,
    leetcode, realpython), YouTube и t.me; исключены project/ и site/.
  - добавлен workflow check-links.yml: cron по понедельникам, при битых
    ссылках создаёт или обновляет issue с меткой link-check, keepalive
    защищает cron от отключения после 60 дней неактивности.
  - исправлена битая ссылка на доки datetime в README: перевод /ru/
    на docs.python.org отдаёт 404, заменена на английскую версию.
- Проверка:
  - docker run --rm -v "$PWD:/input" -w /input lycheeverse/lychee
    --no-progress './**/*.md' — 177 ссылок, 0 ошибок, 56 исключено.
  - mkdocs build --strict — без ошибок.
  - адверсариальное ревью субагентом, 2 раунда — APPROVED.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 22:01:45 +03:00
ddadminandClaude Fable 5 ad60d0c738 docs(project): TODO приоритизирован и подключён к AGENTS.md
- Зачем:
  - project/TODO.md не упоминался в AGENTS.md — агенты и участники
    его не находили при планировании работ;
  - список не имел приоритетов, выполненное не отмечалось
- Что:
  - в AGENTS.md добавлен указатель на project/TODO.md как бэклог проекта;
  - задачи сгруппированы по приоритетам P1–P3: наверху CI-проверка
    ссылок и подраздел «Linux и терминал», ниже перенос учебника
    Airflow, GA, трудозатраты, шаблон прогресса, затем dbt-стенд,
    абзац про DQ и бейджи статусов (помечены сомнения);
  - раздел «Сделано»: пункт про сложность алгоритмов закрыт
    коммитом 6f61c0e
- Проверка:
  - mkdocs build --strict (без ошибок; project/ исключён из сайта)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 19:54:51 +03:00
ddadminandClaude Fable 5 afcce5dc4a docs: выровнены введения секций ClickHouse и Lakehouse
- Зачем:
  - введение Lakehouse было одним громоздким абзацем, тяжело читалось;
  - секция ClickHouse, наоборот, начиналась сразу со списка ссылок
- Что:
  - введение Lakehouse разбито на три коротких абзаца с простыми фразами,
    смысл сохранён (разделение хранения и вычислений, роль табличного
    формата, вариативность технологий);
  - в ClickHouse добавлены два вводных предложения: что это и почему
    тема важна для собеседований
- Проверка:
  - mkdocs build --strict (без ошибок)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 19:44:13 +03:00
ddadminandClaude Fable 5 efa4dd9a3e docs: расширены материалы Lakehouse, убрана заглушка в карьерном блоке
- Зачем:
  - менти спрашивают, что такое Lakehouse и чем он отличается от
    классического DWH — во введении секции не было ответа и ссылки;
  - материалы по Iceberg лежали в «Дополнительных материалах», где их
    не найти по пути через секцию Lakehouse;
  - заглушка «в подготовке» выглядела незавершённостью раздела
- Что:
  - во введение секции добавлено объяснение отличия Lakehouse от
    классического DWH (открытые форматы, объектное хранилище,
    независимое масштабирование движков);
  - добавлено введение: статья Arenadata «Как не утонуть в данных:
    выбираем между DWH, Data Lake и Lakehouse» (Habr);
  - добавлен блок «Глубже про Iceberg»: видео Владимира Озерова
    «Как на самом деле работает Apache Iceberg» и статья VK Tech
    «Введение в устройство Parquet и Iceberg» (с пометкой о сложности);
  - из «Дополнительных материалов» в этот блок перенесены статья
    ivan-shamaev про Iceberg и видео «Spark + Iceberg in 1 Hour»;
  - удалена строка «Видео по прохождению собеседований из сообщества
    ОМ — в подготовке»
- Проверка:
  - mkdocs build --strict (без ошибок);
  - все три новые ссылки отвечают 200 (проверены с обходом прокси)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 19:35:41 +03:00
ddadminandClaude Fable 5 70d6da761f feat(docs): переработан раздел «Расширенные навыки»
- Зачем:
  - порядок секций противоречил анонсу раздела (Streaming объявлен первым);
  - Kafka из Streaming-блока — прямой вход в clickstream-стенд ClickHouse;
  - Lakehouse был помечен «в разработке», хотя стенд mini-lakehouse-lab
    уже содержит полноценный курс
- Что:
  - секция Streaming (NiFi + Kafka) перенесена перед ClickHouse,
    добавлена связка «Kafka пригодится на стенде ClickHouse»;
  - ClickHouse: уточнено, что упражнения курса Яндекса можно делать
    в их облаке (платно) или бесплатно на clickhouse-learning-cluster;
    clickstream-стенд обозначен как следующий шаг со своими уроками;
  - Lakehouse: убрана заглушка «Секция в разработке», секция переписана
    вокруг курса «Lakehouse без магии» (8 модулей, ~12–15 часов,
    raw → bronze → silver на NYC Taxi, Spark + Trino, checkpoint'ы);
  - оглавление: порядок «Streaming, ClickHouse, Lakehouse, dbt»
- Проверка:
  - mkdocs build --strict (без ошибок);
  - порядок h3-заголовков в site/index.html соответствует новому

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 19:19:43 +03:00
ddadminandClaude Fable 5 6f61c0ee90 refactor(docs): раздел о сложности алгоритмов заменён ссылкой в Python
- Зачем:
  - отдельный раздел «Понятие сложности алгоритмов» избыточен для DE-роадмапа;
  - SQL-часть (JOIN, индексы, объём сканирования) уже покрыта курсом QPT
- Что:
  - раздел удалён из блока практики;
  - в «продвинутые» темы Python добавлена статья «Сложность алгоритмов.
    Разбор Big O» (habr.com/ru/articles/782608)
- Проверка:
  - mkdocs build --strict (без ошибок);
  - в оглавлении ссылок на удалённый раздел не было

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 19:13:09 +03:00
ddadminandClaude Fable 5 9d8696f748 docs(modeling): исправлены ссылки на папки и markdown для сайта
- Зачем:
  - относительные ссылки на каталоги sql/ и data/ давали 404 на GitHub Pages;
  - em-dash в заголовках нарушает правило AGENTS.md (расходятся слаги GitHub/MkDocs);
  - 2-пробельная вложенность и списки без пустой строки ломали рендер в MkDocs
- Что:
  - ссылки на папки заменены на GitHub-tree-ссылки (работают на обеих платформах);
  - в 26 заголовках « — » заменено на «: » или убрано (README, SCD, DataVault, домашка);
  - пустая строка перед списком «Главные правила» в DataVault;
  - вложенные списки DataVault переведены на 4-пробельный отступ
- Проверка:
  - mkdocs build --strict (без ошибок);
  - grep по репо — якорных ссылок на старые слаги заголовков нет;
  - grep по site/dwh-modeling/*.html — списки рендерятся <ul>/<li>, вложенность сохранена

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 19:11:49 +03:00
ddadminandClaude Fable 5 a4fa66c466 feat(docs): добавлены стенды ClickHouse, починены ссылки и списки
- Зачем:
  - в разделе ClickHouse не было ссылок на учебные стенды;
  - аудит сайта выявил битые ссылки и сломанный рендеринг списков в MkDocs
- Что:
  - добавлены стенды clickhouse-learning-cluster и clickstream-ch-kafka-superset-demo;
  - пустые строки перед списками (CTE, Jira, Яндекс.Трекер) — рендерились абзацем с буквальными маркерами;
  - убраны лишние `**` после ссылки на Yandex Tracker (ломали разметку);
  - голые URL оформлены markdown-ссылками (karpov docker, jupyter-spark-docker, курс Яндекса по CH);
  - ссылка на datetime: зеркало django.fun заменено на docs.python.org/ru;
  - исправлена опечатка «конспектов лекция» → «лекций»;
  - mkdocs.yml: в заголовок домашки в nav добавлен пропущенный слой ODS;
  - AGENTS.md: Site URL обновлён на de.dementev.space (старый адрес отдаёт 404)
- Проверка:
  - mkdocs build --strict (без ошибок);
  - grep по site/index.html — исправленные списки рендерятся как <ul>/<li>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 19:11:49 +03:00
ddadmin d19eb2de9d docs(project): добавлен TODO по подключению Google Analytics
- Зачем:
  - планируется подключение счётчика GA для аналитики трафика сайта.
- Что:
  - добавлен пункт в секцию «Сайт» файла project/TODO.md.
- Проверка:
  - cat project/TODO.md.
2026-04-03 22:14:23 +03:00
10 changed files with 234 additions and 77 deletions
+54
View File
@@ -0,0 +1,54 @@
name: Check external links
on:
schedule:
- cron: "0 6 * * 1" # понедельник 06:00 UTC
workflow_dispatch:
permissions:
contents: read
issues: write
actions: write # для keepalive-шага
jobs:
link-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run lychee
id: lychee
uses: lycheeverse/lychee-action@v2
with:
# остальные настройки — в lychee.toml в корне репозитория
args: --no-progress './**/*.md'
fail: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# если открытый issue с меткой link-check уже есть — обновляем его,
# а не создаём дубликат каждую неделю
- name: Find open link-check issue
if: steps.lychee.outputs.exit_code != 0
id: issue
run: |
echo "number=$(gh issue list --repo "$GITHUB_REPOSITORY" --label link-check --state open --json number --jq '.[0].number // empty')" >> "$GITHUB_OUTPUT"
env:
GH_TOKEN: ${{ github.token }}
- name: Create or update issue on broken links
if: steps.lychee.outputs.exit_code != 0
uses: peter-evans/create-issue-from-file@v5
with:
title: "Битые внешние ссылки: еженедельная проверка"
content-filepath: ./lychee/out.md
labels: link-check
issue-number: ${{ steps.issue.outputs.number }}
# GitHub отключает scheduled-workflows после 60 дней без активности
# в репозитории; повторное включение сбрасывает таймер
- name: Keep scheduled workflow enabled
if: always()
run: gh api -X PUT "repos/$GITHUB_REPOSITORY/actions/workflows/check-links.yml/enable"
env:
GH_TOKEN: ${{ github.token }}
+2 -2
View File
@@ -6,7 +6,7 @@
- `postgres-bookings/` is a Dockerized PostgreSQL + demo “bookings” DB; start it first, then apply DWH scripts against the `demo` database.
- `mkdocs.yml` — MkDocs Material config; `docs_dir: .` (repo root = site root). Excluded dirs: `project/`, `postgres-bookings/`, `.github/`, `.claude/`.
- `.github/workflows/deploy-site.yml` — CI/CD: push to `main` → build → deploy to GitHub Pages.
- `project/` — PRD and ADR (excluded from site).
- `project/` — PRD, ADR, and TODO.md (excluded from site). `project/TODO.md` is the prioritized project backlog: check it when planning or proposing work, and mark items done there when you complete them.
## Build, Test, and Development Commands
- Start demo Postgres:
@@ -60,7 +60,7 @@ All `.md` files MUST render correctly on both GitHub and the MkDocs Material sit
`npx playwright screenshot --viewport-size='1280,800' 'http://127.0.0.1:8000/#anchor' /path/to/screenshot.png`
Then read the screenshot with the Read tool to inspect rendering. Use `--viewport-size='1280,2000'` for tall pages.
- Kill stuck dev server: `lsof -ti :8000 | xargs kill`
- Site URL: `https://dementev-dev.github.io/de-roadmap/`
- Site URL: `https://de.dementev.space/` (старый адрес `https://dementev-dev.github.io/de-roadmap/` отдаёт 404)
## Testing Guidelines
- There is no dedicated test framework; treat SQL scripts as executable documentation.
+63 -32
View File
@@ -12,10 +12,10 @@
### Оглавление
- [Основные знания](#основные-знания) — Git, SQL, Python, методологии, Docker
- [Основные знания](#основные-знания) — Linux, Git, SQL, Python, методологии, Docker
- [Практика и инструменты](#практика-и-инструменты) — Airflow, Greenplum, курсовая работа
- [Карьера и менторство](#карьера-и-менторство) — резюме, собеседования, испытательный срок
- [Расширенные навыки](#расширенные-навыки) — ClickHouse, Streaming, Lakehouse, dbt
- [Расширенные навыки](#расширенные-навыки) — Streaming, ClickHouse, Lakehouse, dbt
- [Софт скиллы](#софт-скиллы)
- [Дополнительные материалы](#дополнительные-материалы)
@@ -33,6 +33,16 @@
### Git и базовые инструменты
#### Linux и терминал
Командная строка — рабочее место дата-инженера: docker, psql, git, подключение к серверам живут именно там. Отдельная практика не нужна — все стенды этого роадмапа консольные, команды закрепятся сами. На Windows поставьте [WSL](https://learn.microsoft.com/ru-ru/windows/wsl/install) — полноценный Linux внутри Windows.
- [Основы Linux для начинающих за 1.5 часа - Youtube](https://www.youtube.com/watch?v=Be6tB59b7D0) — что такое терминал, навигация, файлы, права, ssh: мягкий вход перед статьями
- [Linux: Файлы, навигация и поиск - Habr](https://habr.com/ru/articles/1003550/) — перемещение по каталогам, чтение файлов и логов: less, tail, grep
- [Права доступа к файлам и папкам в Linux - FirstVDS](https://firstvds.ru/technology/linux-permissions) — rwx, chmod, chown
- [SSH для начинающих - Cloud.ru](https://cloud.ru/blog/ssh-dlya-nachinayuschikh) — подключение к удалённой машине
- [Основы командной строки - Hexlet](https://ru.hexlet.io/programs/cli-basics) — опционально: бесплатный интерактивный курс с терминалом прямо в браузере; достаточно уроков про навигацию, grep и права доступа
#### База по Git
Что такое контроль версий, когда используется, ПОЧЕМУ и как мы в обучении будем использовать.
Как создать репозиторий на GitHub, сохранять в нем изменения.
@@ -51,6 +61,8 @@
**Когда блок Git и базовые инструменты считаем пройденным:**
- ориентируетесь в терминале: перемещаетесь по каталогам и находите нужное в логах (grep, tail, less);
- понимаете права файлов (rwx, chmod) и знаете, как подключиться к серверу по ssh;
- вы уверенно создаёте репозиторий, коммитите изменения и отправляете их на GitHub;
- имеете представление о работе с ветками: создание, переключение, что такое merge/PR и разруливание простых конфликтов;
- оформляете базовую документацию в Markdown (README, заголовки, списки, ссылки, кодовые блоки).
@@ -64,16 +76,17 @@ SQL и моделирование данных специально идут р
Бесплатный тренажер: [Интерактивный тренажер по SQL – Stepik](https://stepik.org/course/63054/promo)
Целевой уровень знания SQL - Live кодинг на собесе. Проверяем на первом мок-интервью
**CTE**
- Зачем нам CTE: [Getting started with CTEs | dbt Labs](https://www.getdbt.com/blog/getting-started-with-cte)
- Подробнее про синтаксис: [PostgreSQL : Документация: 17: 7.8. Запросы WITH (Общие табличные выражения) : Компания Postgres Professional](https://postgrespro.ru/docs/postgresql/17/queries-with)
**CTE**
- Зачем нам CTE: [Getting started with CTEs | dbt Labs](https://www.getdbt.com/blog/getting-started-with-cte)
- Подробнее про синтаксис: [PostgreSQL : Документация: 17: 7.8. Запросы WITH (Общие табличные выражения) : Компания Postgres Professional](https://postgrespro.ru/docs/postgresql/17/queries-with)
Для дальнейшей тренировки и поддержания уровня можно использовать [Database - LeetCode](https://leetcode.com/problem-list/database/). Хорошая подборка задачек: [SQL 50 - Study Plan - LeetCode](https://leetcode.com/studyplan/top-sql-50/)
#### Повышение знаний SQL
Смотрим курс от Postgres Pro [DEV1](https://postgrespro.ru/education/courses/DEV1)
Темы - от "Введение" до "SQL" включительно, "Управление доступом", "Резервное копирование". Для лучшего усваивания материала проделываем все примеры и домашние задания из конспектов лекция.
Темы - от "Введение" до "SQL" включительно, "Управление доступом", "Резервное копирование". Для лучшего усваивания материала проделываем все примеры и домашние задания из конспектов лекций.
С темой "PL/pgSQL" можно ознакомиться обзорно.
Для развития навыков инженера будет полезно лабораторные работы делать не в виртуальной машине, а в docker контейнере. Предложенный (не обязательный) вариант - в каталоге `postgres-bookings` репозитория.
@@ -134,7 +147,8 @@ SQL и моделирование данных специально идут р
- [Работа с файлами в формате CSV, JSON, YAML](https://pyneng.readthedocs.io/ru/latest/book/17_serialization/index.html)
- [Итераторы, итерируемые объекты и генераторы](https://pyneng.readthedocs.io/ru/latest/book/13_iterator_generator/index.html)
- [Декораторы Python: пошаговое руководство](https://habr.com/ru/companies/otus/articles/727590/)
- Работа с датой/временем: https://django.fun/docs/python/3.10/library/datetime/
- Работа с датой/временем: [официальная документация по модулю datetime](https://docs.python.org/3/library/datetime.html)
- [Сложность алгоритмов. Разбор Big O](https://habr.com/ru/articles/782608/) — короткий материал, чтобы понимать O(n) vs O(n²) на собеседованиях и в коде
- ООП
- [Tproger: «ООП простыми словами»](https://tproger.ru/experts/oop-in-simple-words)
- Введение в [ООП](https://metanit.com/python/tutorial/7.1.php)
@@ -145,7 +159,7 @@ SQL и моделирование данных специально идут р
- [SkillFactory: Виртуальные окружения в Python](https://blog.skillfactory.ru/venv-virtualnoe-okruzhenie-v-python/)
- Jupyter Lab
- [Блог Практикума: «Что такое Jupyter Notebook: как установить и открыть»](https://practicum.yandex.ru/blog/chto-takoe-jupyter-notebook/)
- Готовая реализация Jupyter Lab, включающая в себя Spark, в Docker: https://github.com/dementev-dev/jupyter-spark-docker
- Готовая реализация Jupyter Lab, включающая в себя Spark, в Docker: [jupyter-spark-docker](https://github.com/dementev-dev/jupyter-spark-docker)
- Pandas
- [GeeksforGeeks: “Why Pandas is Used in Python”](https://www.geeksforgeeks.org/pandas/why-pandas-is-used-in-python/)
- [Skillbox: «Для чего нужна библиотека Pandas»](https://skillbox.ru/media/code/rabotaem-s-pandas-osnovnye-ponyatiya-i-realnye-dannye/)
@@ -199,13 +213,15 @@ Agile — это не метод, а философия. Scrum и Kanban — э
##### 1. Jira (Мировой стандарт)
Самый популярный инструмент. Скорее всего, вы столкнетесь именно с ним.
* [Как работать с Jira на реальных проектах](https://www.youtube.com/watch?v=oPgm-fsHVfM) (15 мин) — *Отличное видео, где показывают базу: как создать задачу, как перетащить её по доске (Kanban) и что писать в комментариях. Смотреть с 04:00, где начинается практика.*
* [Создание и настройка Scrum-досок в JIRA](https://www.youtube.com/watch?v=u-u8NRyApUs) — *Если хотите увидеть, как выглядит Спринт и Бэклог изнутри.*
##### 2. Yandex Tracker (Российский стандарт)
Активно внедряется в крупных компаниях РФ. Логика та же, но интерфейс другой.
* [Начало работы в Яндекс.Трекере](https://www.youtube.com/watch?v=pdlYiijjn70) (3 мин) — *Супер-короткий официальный гайд. За 3 минуты показывают всё: очереди, доски, карточки.*
* [Настройка процесса разработки в Tracker](https://www.youtube.com/watch?v=EdKlYJR2ph0&t=397s)** (c 06:37) — *Более глубокий разбор: как выглядит очередь задач разработчика и жизненный цикл тикета.*
* [Настройка процесса разработки в Tracker](https://www.youtube.com/watch?v=EdKlYJR2ph0&t=397s) (c 06:37) — *Более глубокий разбор: как выглядит очередь задач разработчика и жизненный цикл тикета.*
> **💡 Совет:**
> Не бойтесь кнопок. Главное правило любого трекера: **«Взял задачу в работу — переведи статус в In Progress»**. Это сигнал команде, что вы заняты и вас лучше не отвлекать.
@@ -234,7 +250,7 @@ Agile — это не метод, а философия. Scrum и Kanban — э
#### Docker
- Курс https://karpov.courses/docker
- Курс [Docker от karpov.courses](https://karpov.courses/docker)
Основное предназначение для нас - учебные стенды, где мы разбираем и тренируемся с разными технологиями. На работе - иногда пригождается. На собесах спрашивают редко.
@@ -301,10 +317,6 @@ Apache Airflow — инструмент для оркестрации ETL-про
- Стенд покрывает основные темы курса: типы таблиц (heap / appendonly), политики дистрибуции, сжатие, PXF, анализ планов выполнения (`EXPLAIN`).
- Единственное ограничение: cloud-специфичные темы (тема 2 курса — развёртывание в Yandex Cloud) на локальном стенде не покрыты.
Дополнительно:
- [Учебный курс по Greenplum от datafinder](https://datafinder.ru/products/uchebnyy-kurs-po-greenplum) — отдельные главы для углубления.
**Когда блок Greenplum считаем пройденным:**
- вы понимаете, как данные распределяются по сегментам, что такое skew и как его увидеть;
@@ -330,14 +342,6 @@ Apache Airflow — инструмент для оркестрации ETL-про
- автоматическая проверка (валидационный DAG) проходит без ошибок;
- вы можете на собеседовании за 5–10 минут рассказать архитектуру проекта, его цели и показать ключевые части кода.
### Понятие сложности алгоритмов
В Data Engineering редко требуется писать сложные алгоритмы, но важно понимать, как оценивать эффективность кода:
- в SQL — через объём сканируемых данных, типы JOIN’ов, использование индексов;
- в Python — через асимптотику операций с pandas/списками (например, O(n) vs O(n²)).
Это помогает избегать «тормозящих» решений на собеседованиях и в реальных пайплайнах.
---
## Карьера и менторство
@@ -374,7 +378,6 @@ Apache Airflow — инструмент для оркестрации ETL-про
#### Поиск работы и собеседования
- [Как подтвердить опыт без трудовой / Хабр против работяг](https://www.youtube.com/watch?v=GHqABzA1zi8)
- Видео по прохождению собеседований из сообщества ОМ — *в подготовке*
- Практика: мок-собеседования с ментором — тренировка ответов, разбор слабых мест, психологическая подготовка к реальным интервью.
#### Помощь с прохождением испытательного срока
@@ -406,10 +409,6 @@ Apache Airflow — инструмент для оркестрации ETL-про
Практика ограничивается минимальным рабочим примером (запуск в Docker, простой пайплайн или SQL-модель).
Этого достаточно, чтобы уверенно говорить об инструменте на собеседовании и понимать его место в архитектуре — а всё остальное при необходимости осваивается уже на проекте.
### ClickHouse
Бесплатный курс https://yandex.cloud/ru/training/clickhouse
Платный курс [ClickHouse для аналитика – Stepik](https://stepik.org/course/100210/promo?search=6551441002)
### Streaming (NiFi + Kafka)
NiFi — визуальный конструктор потоков данных, Kafka — распределённая очередь сообщений. Вместе они закрывают типичный сценарий: принять данные, буферизовать, доставить в хранилище.
@@ -423,12 +422,47 @@ NiFi — визуальный конструктор потоков данных
- настраиваем в NiFi простой генератор данных и поток в Postgres;
- строим поток NiFi → Kafka → NiFi → Postgres.
Знакомство с Kafka здесь пригодится и дальше: стенд по ClickHouse в следующей секции принимает данные именно через Kafka.
### ClickHouse
ClickHouse — колоночная СУБД для аналитики на больших объёмах: миллиарды строк, агрегации за секунды. В российских компаниях это фактический стандарт для витрин, отчётности и продуктовой аналитики, поэтому на собеседованиях тема всплывает часто.
Материалы:
- Бесплатный курс [ClickHouse от Yandex Cloud](https://yandex.cloud/ru/training/clickhouse) — берём за основу, в нём много упражнений
- Платный курс [ClickHouse для аналитика – Stepik](https://stepik.org/course/100210/promo?search=6551441002)
Практика:
- Упражнения курса Яндекса можно выполнять в их облаке (с оплатой за ресурсы) или бесплатно у себя — на учебном кластере [clickhouse-learning-cluster](https://github.com/dementev-dev/clickhouse-learning-cluster): 4 узла ClickHouse в Docker Compose, репликация, шардинг, балансировка через HAProxy.
- Следующий шаг — стенд [clickstream-ch-kafka-superset-demo](https://github.com/dementev-dev/clickstream-ch-kafka-superset-demo), имитирующий полноценное аналитическое хранилище на ClickHouse: Kafka, Airflow, дашборды в Superset, мониторинг (Prometheus/Grafana), слои STG → ODS → DDS → DM. Внутри — собственный продвинутый курс «Кликстрим на ClickHouse» с уроками прямо на стенде.
### Lakehouse (Spark, Iceberg, Trino)
> Секция в разработке. Lakehouse — отдельное направление в DE, построенное на разделении compute и storage, открытых табличных форматах (Iceberg, Delta) и движках распределённой обработки (Spark, Trino). Этот роадмап фокусируется на классическом DWH-стеке, поэтому полноценный блок пока не готов — ниже только отправные точки для самостоятельного изучения.
Lakehouse — архитектурный подход, который соединяет гибкость Data Lake с гарантиями классического DWH.
В классическом DWH данные и вычисления живут внутри одной СУБД, в её закрытом формате. В Lakehouse они разделены. Данные лежат файлами в дешёвом хранилище (обычно объектном, вроде S3). Открытый табличный формат (Iceberg, Delta, Hudi) добавляет поверх файлов привычные по СУБД вещи: схемы, транзакции, историю изменений. А вычислительные движки (Spark, Trino, Flink и другие) подключаются к данным снаружи — хоть несколько разных к одним и тем же таблицам.
Роадмап фокусируется на классическом DWH-стеке, поэтому цель здесь — знакомство, но с настоящей практикой: стенд ниже собирает один из типовых наборов этого конструктора.
Материалы:
- Введение в тему: [«Как не утонуть в данных: выбираем между DWH, Data Lake и Lakehouse» (Habr, Arenadata)](https://habr.com/ru/companies/arenadata/articles/885722/) — что такое Lakehouse, чем он отличается от классического DWH и Data Lake и зачем появился
- [DataLearn: «Что такое Apache Spark»](https://youtu.be/Tl9YzC-dQLI) — введение в Spark с нуля, ~40 минут
- Стенд для экспериментов: [mini-lakehouse-lab](https://github.com/dementev-dev/mini-lakehouse-lab) (Spark + Iceberg + Trino + MinIO)
Практика — курс [«Lakehouse без магии»](https://github.com/dementev-dev/mini-lakehouse-lab) на стенде mini-lakehouse-lab (Spark + Iceberg + Trino + MinIO, всё локально в Docker, без облаков и регистраций):
- 8 модулей на ~12–15 часов самостоятельной работы; в каждом — объяснение, демонстрация, задание и checkpoint;
- пайплайн `raw → bronze → silver` на реальном датасете NYC Taxi;
- одна таблица из двух движков: запись через Spark, чтение через Trino — и почему это работает без копирования данных;
- schema evolution, time travel и обслуживание таблиц (compaction, expire_snapshots) — с параллелями к знакомым VACUUM/REORGANIZE из мира Postgres/Greenplum.
Глубже про Iceberg (опционально, лучше после практики на стенде):
- [«Как на самом деле работает Apache Iceberg» — Владимир Озеров, HighLoad Channel (Youtube)](https://www.youtube.com/watch?v=_3fsE2a2FO4)
- [Введение в устройство Parquet и Iceberg (Habr, VK Tech)](https://habr.com/ru/companies/vktech/articles/959398/) — подробный и местами непростой разбор форматов изнутри
- [Введение в Apache Iceberg: основы, архитектура, как работает](https://ivan-shamaev.ru/apache-iceberg-tutorial-architecture-how-to-work/#__Apache_Iceberg-2)
- [Spark + Iceberg in 1 Hour: Memory Tuning, Joins, Partition (Youtube, англ.)](https://www.youtube.com/watch?v=3R-SLYK-P_0)
### dbt
dbt (data build tool) — инструмент для трансформации данных в хранилище.
@@ -470,9 +504,6 @@ dbt (data build tool) — инструмент для трансформации
- Клон проекта [dementev_dev/sandbox_db_public-форк](https://gitflic.ru/project/dementev_dev/sandbox_db_public-fork)
- [System Design. Разбор книги "Высоконагруженные приложения". Глава 1 - Youtube](https://www.youtube.com/watch?v=owjrIB_5go8) — отличный видео-конспект первой главы Клеппмана на русском.
- [Индексы в БД - Youtube](https://www.youtube.com/watch?v=DyqtBiDrz3g)
- [Spark + Iceberg in 1 Hour - Memory Tuning, Joins, Partition - Youtube](https://www.youtube.com/watch?v=3R-SLYK-P_0)
- [Введение в устройство Parquet и Iceberg - habr](https://habr.com/ru/companies/vktech/articles/959398/)
- [Введение в Apache Iceberg. Основы, архитектура, как работает?](https://ivan-shamaev.ru/apache-iceberg-tutorial-architecture-how-to-work/#__Apache_Iceberg-2)
- [Алгоритмы: теория и практика. Методы – Stepik](https://stepik.org/course/217/info)
- [Алгоритмы: теория и практика. Структуры данных – Stepik](https://stepik.org/course/1547/promo)
- [Apache Hadoop для самых маленьких: HDFS, RACK-AWARENESS, репликация и Data Locality - Youtube](https://youtu.be/0fsY5bW2l84)
+13 -12
View File
@@ -126,17 +126,18 @@ erDiagram
Чуть менее «сказочно», чуть более технично.
### 3.1. Hub сущность и её бизнес-ключ
### 3.1. Hub: сущность и её бизнес-ключ
**Hub** содержит:
* бизнес‑ключ (customer_bk, order_id, contract_number);
* техническую информацию:
* record_source — из какой системы пришла первая запись;
* load_dttm — когда запись попала в DV;
* иногда — хэш бизнес‑ключа (hk_customer).
* record_source — из какой системы пришла первая запись;
* load_dttm — когда запись попала в DV;
* иногда — хэш бизнес‑ключа (hk_customer).
Главные правила:
* один бизнес‑ключ — один хаб (одна строка на сущность, без истории);
* хаб не знает про атрибуты (имя, email) — только идентичность.
@@ -153,7 +154,7 @@ CREATE TABLE hub_customer (
Конкретные типы данных (`BYTEA`, длины `VARCHAR`, детали `hashdiff`) и реализации хэш‑ключей можно не запоминать: на старте важнее понять саму идею — у сущностей есть стабильные ключи, а все изменения атрибутов мы записываем отдельными версиями в сателлитах.
### 3.2. Link связи между сущностями
### 3.2. Link: связи между сущностями
**Link** описывает факт связи, например:
@@ -178,7 +179,7 @@ CREATE TABLE link_order_customer (
);
```
### 3.3. Satellite атрибуты и история
### 3.3. Satellite: атрибуты и история
**Satellite** хранит:
@@ -249,7 +250,7 @@ Star Schema]
* **Raw Vault** — это про приём и хранение данных «как есть», но уже в форме Hub / Link / Satellite.
* **Business Vault** — это про приведение этих данных в более «деловой» вид: с бизнес-правилами, PIT/Bridge и подготовленными представлениями.
### 5.1. Raw Vault «всё прилетевшее, аккуратно разложенное по ящичкам»
### 5.1. Raw Vault: «всё прилетевшее, аккуратно разложенное по ящичкам»
Raw DV — первый слой поверх STG / ODS:
@@ -261,20 +262,20 @@ Raw DV — первый слой поверх STG / ODS:
* минимум бизнес-логики:
* никаких правил вроде «клиент активен, если была хотя бы одна покупка за 90 дней»;
* никаких правил вроде «клиент активен, если была хотя бы одна покупка за 90 дней»;
* все источники показываются «как есть», только приведены к общим ключам;
* структура стабильна: добавился новый источник → появился новый Satellite к тому же Hub.
### 5.2. Business Vault «там, где из Lego собирают модули»
### 5.2. Business Vault: «там, где из Lego собирают модули»
Business Vault (BV) — следующий слой над Raw DV:
* здесь применяются бизнес-правила (что считать активным клиентом, как трактовать статусы);
* здесь строятся вспомогательные структуры:
* PIT-таблицы,
* Bridge-таблицы,
* агрегаты и derived-таблицы.
* PIT-таблицы,
* Bridge-таблицы,
* агрегаты и derived-таблицы.
Именно из BV чаще всего строятся витрины в формате Звезды, к которым подключаются BI и отчётность.
@@ -71,7 +71,7 @@ customer_id,status,event_ts,_load_id,_load_ts
---
## 3. Часть 1 STG → ODS (обязательно)
## 3. Часть 1: STG → ODS (обязательно)
**Задача:** загрузить CSV в STG и переложить данные в ODS с приведением типов.
@@ -145,7 +145,7 @@ ORDER BY customer_id, event_ts;
---
## 4. Часть 2 ODS → DDS (SCD Type 2, обязательно)
## 4. Часть 2: ODS → DDS (SCD Type 2, обязательно)
**Задача:** по событиям в `ods.customer_status` построить измерение `dds.dim_customer_status`, где каждая строка — период действия статуса.
@@ -216,7 +216,7 @@ ORDER BY customer_bk, valid_from;
---
## 5. Часть 3 инкрементальная загрузка (по желанию)
## 5. Часть 3: инкрементальная загрузка (по желанию)
Если хочется потренироваться глубже:
@@ -241,7 +241,7 @@ cat dwh-modeling/data/customer_status_events_increment.csv | ./postgres-bookings
---
## 6. Часть 4 витрина в DM (по желанию)
## 6. Часть 4: витрина в DM (по желанию)
Опциональное задание для закрепления: собрать небольшую витрину с количеством клиентов по статусам на каждую дату.
+12 -12
View File
@@ -145,7 +145,7 @@ flowchart TD
Давайте проследим, как превращается строка заказа.
### **STG (Staging / Bronze)** «как пришло»
### **STG (Staging / Bronze)**: «как пришло»
- Таблицы: `stg.orders_raw`, `stg.customers_raw`;
- Структура — *точно как в источнике* (может быть `VARCHAR` даже у дат);
@@ -158,7 +158,7 @@ flowchart TD
---
### **ODS (Operational Data Store / Silver)** «почистили, но не трогали смысл»
### **ODS (Operational Data Store / Silver)**: «почистили, но не трогали смысл»
- Таблицы: `ods.orders`, `ods.customers`;
- Здесь:
@@ -174,7 +174,7 @@ flowchart TD
---
### **DDS (Data Delivery Store / Core / Conformed)** «интеграция + история»
### **DDS (Data Delivery Store / Core / Conformed)**: «интеграция + история»
Здесь рождается *единая бизнес-модель*.
Появляются понятия: **измерения**, **факты**, **суррогатные ключи**, **SCD**.
@@ -199,7 +199,7 @@ flowchart TD
---
### **DM (Data Mart / Gold/ «Витрины»)** «готово к употреблению»
### **DM (Data Mart / Gold / «Витрины»)**: «готово к употреблению»
Здесь — таблицы и представления для конкретных задач:
@@ -266,7 +266,7 @@ erDiagram
}
```
### SCD Type 2 как хранить историю
### SCD Type 2: как хранить историю
Клиент №101:
@@ -418,7 +418,7 @@ WHERE c.city = 'Москва'
---
### 3. Data Vault 2.0 «конструктор Lego» для больших DWH
### 3. Data Vault 2.0: «конструктор Lego» для больших DWH
*Идея: Дэн Линстедт (Dan Linstedt). Цель — так организовать хранилище, чтобы можно было спокойно добавлять новые источники и хранить историю, не ломая старую модель.*
@@ -468,7 +468,7 @@ Anchor Modeling - ещё более атомарный подход к моде
---
### Сравнение моделей наглядно
### Сравнение моделей наглядно
```mermaid
quadrantChart
@@ -540,7 +540,7 @@ flowchart TD
### Готовые SQL-скрипты
Все необходимые скрипты для построения хранилища находятся в папке [`sql/`](sql/):
Все необходимые скрипты для построения хранилища находятся в папке [`sql/`](https://github.com/dementev-dev/de-roadmap/tree/main/dwh-modeling/sql):
- [`01_ddl_stg-dds.sql`](sql/01_ddl_stg-dds.sql) — создание схем и таблиц (STG, ODS, DDS);
- [`02_dml_stg-dds.sql`](sql/02_dml_stg-dds.sql) — первичная загрузка данных и демонстрация SCD2 через полный пересчёт (`full backfill`) из STG;
@@ -605,7 +605,7 @@ GROUP BY d.date_actual, p.product_name,
---
### ✅ Базовые советы с чего начать, если вы учитесь или делаете первый DWH
### ✅ Базовые советы: с чего начать, если вы учитесь или делаете первый DWH
1. **Начните с витрины в формате Звезды (Star Schema).**
— Это просто: одна таблица фактов + несколько «плоских» измерений.
@@ -660,7 +660,7 @@ GROUP BY d.date_actual, p.product_name,
---
### 📌 Кратко что выбрать *сегодня*, если вы только учитесь
### 📌 Кратко: что выбрать *сегодня*, если вы только учитесь
| У вас… | Делайте… |
|--------|----------|
@@ -791,7 +791,7 @@ SELECT 'OK' WHERE EXISTS (
### Мини-датасет (для практики)
Все данные для практики находятся в папке [`data/`](data/) — тренируйтесь:
Все данные для практики находятся в папке [`data/`](https://github.com/dementev-dev/de-roadmap/tree/main/dwh-modeling/data) — тренируйтесь:
[`customers.csv`](data/customers.csv):
```csv
@@ -832,7 +832,7 @@ product_id,valid_from,valid_to,price
9002,2023-01-01,,50
```
> 📂 Все SQL-скрипты для построения хранилища находятся в папке [`sql/`](sql/).
> 📂 Все SQL-скрипты для построения хранилища находятся в папке [`sql/`](https://github.com/dementev-dev/de-roadmap/tree/main/dwh-modeling/sql).
---
+7 -7
View File
@@ -28,15 +28,15 @@ SCD — это подход к хранению изменений в измер
---
## 3. Типы SCD простыми словами
## 3. Типы SCD простыми словами
Существует несколько стандартных стратегий обработки изменений. Рассмотрим самые важные.
### **Type 0Никогда не меняется**
### **Type 0: никогда не меняется**
Атрибут фиксирован навсегда. Например, дата рождения клиента.
Такие поля не требуют специальной обработки — они просто не обновляются.
### **Type 1 — Просто перезаписать**
### **Type 1: просто перезаписать**
Вы просто делаете `UPDATE`, и старое значение исчезает.
✅ Просто.
@@ -44,7 +44,7 @@ SCD — это подход к хранению изменений в измер
> Подходит, если изменение — это исправление ошибки (например, опечатка в имени).
### **Type 2Новая строка для новой версии**
### **Type 2: новая строка для новой версии**
Каждое изменение порождает **новую строку** в таблице. Старая строка остаётся, но помечается как «устаревшая».
✅ Полная история.
@@ -53,7 +53,7 @@ SCD — это подход к хранению изменений в измер
> Это **самый распространённый** подход в аналитике.
### **Type 3 — Добавить колонку «предыдущее значение»**
### **Type 3: добавить колонку «предыдущее значение»**
В таблице появляются поля вроде `previous_category`, `category_change_date`.
✅ Простая история «до/после».
@@ -61,7 +61,7 @@ SCD — это подход к хранению изменений в измер
> Используется редко, чаще как компромисс в очень простых системах.
### **Type 4, 5, 6 — Продвинутые гибриды**
### **Type 4, 5, 6: продвинутые гибриды**
Эти типы существуют, но **встречаются редко** и почти не используются новичками:
- **Type 4**: история выносится в отдельную таблицу («мини-хранилище» для одного измерения).
@@ -99,7 +99,7 @@ WHERE customer_id = 1;
---
### Type 2: сохраняем историю подробнее
### Type 2: сохраняем историю (подробнее)
Чтобы хранить историю, мы меняем структуру таблицы. Вот ключевые поля:
+29
View File
@@ -0,0 +1,29 @@
# Конфигурация lychee — CI-проверка внешних ссылок
# Используется в .github/workflows/check-links.yml (подхватывается автоматически)
# Локальный запуск: docker run --rm -v "$PWD:/input" -w /input lycheeverse/lychee './**/*.md'
# Служебные каталоги и каталоги, исключённые из сайта
exclude_path = ["project", "site"]
# Локальные адреса стендов (127.0.0.1, localhost и т.п.)
exclude_all_private = true
exclude = [
# Режут ботов и датацентровые IP (проверять вручную из браузера)
"^https?://habr\\.com",
"^https?://stepik\\.org",
"^https?://leetcode\\.com",
"^https?://realpython\\.com",
# YouTube в CI ненадёжен: 429 на пачку запросов, удалённые видео отдают 200
"^https?://(www\\.)?youtube\\.com",
"^https?://youtu\\.be",
# Telegram отдаёт 200 даже для несуществующих каналов
"^https?://t\\.me",
]
# 429 (rate limit) не считаем битой ссылкой
accept = ["200..=204", "429"]
max_retries = 2
timeout = 30
user_agent = "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0"
+1 -1
View File
@@ -30,7 +30,7 @@ nav:
- Введение: dwh-modeling/README.md
- SCD: dwh-modeling/SCD.md
- Data Vault: dwh-modeling/DataVault.md
- "Домашка: STG → DDS → DM": dwh-modeling/Homework_Customer_Status_DDS_DM.md
- "Домашка: STG → ODS → DDS → DM": dwh-modeling/Homework_Customer_Status_DDS_DM.md
- Разработка с ИИ:
- Введение: ai-dev/README.md
- Лучшие практики: ai-dev/best-practice.md
+49 -7
View File
@@ -1,17 +1,59 @@
# TODO: общие задачи проекта
## Контент
Приоритеты: P1 — делаем в первую очередь; P2 — полезно, когда дойдут руки; P3 — идеи под вопросом.
## P1
## P2
- [ ] **Перенос учебника Airflow в de-roadmap.**
Перенести 9 глав учебника из `airflow-manual` в `airflow/` (de-roadmap).
В `airflow-manual` оставить только стенд (`airflow-docker/`).
Добавить навигацию в `mkdocs.yml`, обеспечить dual-compatible links.
- [ ] **Убрать раздел «Понятие сложности алгоритмов» из README.**
Раздел поверхностный и не самостоятелен. План:
- Упоминание асимптотики (O(n) vs O(n²), pandas/списки) перенести в раздел Python.
- По SQL: либо короткая заметка про планы запросов, либо просто сослаться на курс QPT от Postgres Pro (он уже упомянут в разделе SQL) и не дублировать.
- [ ] **Добавить счётчик Google Analytics** на сайт (MkDocs Material
поддерживает GA через `extra.analytics` в `mkdocs.yml`).
## Сайт
- [ ] **Ориентиры трудозатрат по блокам.**
Одна строка на блок («~N часов»), по образцу курса Lakehouse (~1215 часов).
Менти всегда спрашивают «сколько займёт»; ориентир защищает от провала
в практику на месяцы.
- [ ] **Иконки/бейджи статуса разделов** (пройден / в процессе / не начат) — декоративные, без бэкенда.
- [ ] **Шаблон прогресса менти.**
Файл-чеклист по критериям «когда блок считаем пройденным»; менти копирует
в свой форк и ведёт коммитами. Живая практика Git с первой недели +
прозрачный прогресс для ментора.
## P3
- [ ] **Свой dbt-стенд.**
Сейчас практика dbt — на чужом jaffle-shop; единственная секция без
собственного стенда. Вариант: dbt-модели поверх postgres-bookings или
clickstream-стенда.
- [ ] **Абзац про Data Quality в курсовой.**
Валидационный DAG курсовой — это и есть DQ на практике; добавить абзац,
как об этом говорить на собеседовании. Новая секция не нужна.
- [ ] **Иконки/бейджи статуса разделов** (пройден / в процессе / не начат) —
декоративные, без бэкенда. Сомнение: статус у каждого менти свой,
пересекается с идеей шаблона прогресса — возможно, отпадёт.
## Сделано
- [x] **Подраздел «Linux и терминал» в блоке базовых инструментов**
2026-07-12: видео-интро («Девопс на троечку», покрытие проверено по
субтитрам) + три статьи (навигация и grep — habr, права — FirstVDS,
ssh — Cloud.ru) + опциональный интерактивный курс Hexlet, примечание про
WSL для Windows, два новых критерия готовности блока, Linux добавлен
в строку оглавления. Отдельной практики нет — ею служат стенды.
- [x] **CI-проверка внешних ссылок** — 2026-07-12: `lychee.toml` + workflow
`check-links.yml` (еженедельно по понедельникам, при битых ссылках создаёт
issue). Игнор-лист: habr, stepik, leetcode, realpython (режут ботов),
YouTube и t.me (проверка ненадёжна). Попутно исправлена битая ссылка на
русские доки Python в README (перевод `/ru/` на docs.python.org умер целиком).
- [x] **Убрать раздел «Понятие сложности алгоритмов» из README**
2026-07-12, коммит `6f61c0e`: асимптотика перенесена в Python ссылкой
на разбор Big O (habr), по SQL — без дублирования, тему покрывает QPT.