Learning Platform
Глоссарий Troubleshooting
Урок 22.04 · 22 мин
Средний
CapstoneFinal checkPortfolioInterview

Этот урок — это gateway между «я сделал проект» и «я могу показать его hiring manager-у». Финальная сборка, проверка по чек-листу, оформление README, советы для собеседования.

Шаг 11: Финальный build всего

В чистом окружении (новая сессия терминала):

# 1. Активировать venv
source .venv/bin/activate

# 2. Перейти в директорию проекта
cd ~/projects/my_jaffle_shop

# 3. Установить зависимости (если не делал)
dbt deps

# 4. Полный билд
dbt build

Должно быть зелёным. Если что-то падает — фикси прежде, чем двигаться дальше. Capstone — это не только написать SQL, но и убедиться, что сборка стабильна и воспроизводима.

Ожидаемый итог:

Done. PASS=23+ WARN=0 ERROR=0 SKIP=0 TOTAL=23+

Где 23+:

  • 6 seeds
  • 4 staging models
  • 2 intermediate models (ephemeral — не материализуются в БД, но компилируются)
  • 3 marts
  • 1 snapshot
  • 15-20 tests

Шаг 12: Documentation generate

dbt docs generate
dbt docs serve --port 8080

Открой http://localhost:8080, пройдись по проекту:

  • Lineage graph целиком — должны видеть raw seeds -> staging -> intermediate -> marts -> exposure.
  • Каждая модель имеет description.
  • Каждая нетривиальная колонка имеет description.
  • Exposure monthly_revenue_dashboard подключён к customers и revenue_daily.
  • Snapshot отображается в lineage.

Сделай screenshot lineage graph — пригодится для README и собеседования.

Чек-лист самопроверки (30+ пунктов)

Пройди по списку. Каждый пункт — отметь сам, ОК или нет.

Структура проекта

  • dbt_project.yml валиден, project name и profile name совпадают.
  • packages.yml есть и содержит хотя бы dbt_utils (опционально, но желательно).
  • package-lock.yml есть после dbt deps.
  • .gitignore содержит: target/, dbt_packages/, logs/, profiles.yml, *.duckdb.
  • profiles.yml НЕ в git-репо (только в ~/.dbt/).
  • README.md есть и содержит инструкции запуска.

Seeds

  • 6 CSV в seeds/: raw_customers, raw_orders, raw_order_items, raw_payments, products_catalog, country_codes.
  • seeds/_seeds.yml имеет descriptions для каждого seed.
  • Тесты not_null + unique на PK seeds.
  • dbt seed отрабатывает зелёным.

Staging

  • 4 staging-моделей: stg_jaffle__customers, stg_jaffle__orders, stg_jaffle__order_items, stg_jaffle__payments.
  • Naming: префикс stg_<source>__<entity> (двойной underscore).
  • Все references через {{ ref(...) }} или {{ source(...) }} — никаких hardcoded имён.
  • Renamed и typed (id -> customer_id, kept timestamps as timestamp).
  • Минимальная бизнес-логика — только rename и cast.
  • _models.yml имеет descriptions и тесты.
  • Тесты: not_null + unique на PK, relationships, accepted_values для enum.

Intermediate

  • 2 intermediate-моделей: int_order_items_pivoted, int_payments_joined.
  • Naming: префикс int_<purpose>.
  • Материализация ephemeral (через +materialized: ephemeral в dbt_project.yml).
  • Содержат именно «переходную» логику: pivot и join’ы, не финальные mart-расчёты.

Marts

  • 3 mart-моделей: customers, orders, revenue_daily.
  • Naming: имя сущности, без префикса.
  • Материализация table.
  • customers — wide dimension с агрегатами.
  • orders — fact table.
  • revenue_daily — pre-aggregated daily.
  • _models.yml имеет подробные descriptions (multi-line с контекстом).
  • Description на каждой нетривиальной колонке.
  • Тесты: not_null + unique на PK, relationships, accepted_values.

Singular Tests

  • tests/orders_total_equals_items_sum.sql — order_total = sum(line_totals).
  • tests/revenue_daily_matches_orders.sql — daily revenue matches orders sum.
  • Оба запускаются и проходят зелёным.

Snapshot

  • snapshots/customers_snapshot.sql создан.
  • Стратегия timestamp через updated_at.
  • target_schema='snapshots'.
  • dbt snapshot создаёт таблицу с dbt_valid_from/to/scd_id columns.
  • Тесты на snapshot (not_null, unique).

Documentation

  • models/docs.md есть и содержит doc blocks для customer_id, order_id, cents_columns_note.
  • В YAML descriptions ссылаются на doc blocks через {{ doc('...') }}.
  • dbt docs generate отрабатывает без ошибок.
  • dbt docs serve открывает интерактивный каталог.
  • Lineage graph отображает полный путь от seeds до exposure.

Exposures

  • models/marts/_exposures.yml создан.
  • Минимум одна exposure (monthly_revenue_dashboard).
  • Поля: type, maturity, url, description, depends_on, owner.
  • Exposure отображается в lineage graph как узел.

Git

  • Проект инициализирован как git-репо.
  • Commit history содержит logical commits с Conventional Commits format.
  • Никаких commit-ов profiles.yml или target/.
  • Push на GitHub/GitLab в публичный (или приватный) репо.

Финальный билд

  • dbt deps && dbt build отрабатывает зелёным с PASS только.
  • dbt docs generate отрабатывает без warnings.
  • Никаких устаревших или закомментированных моделей.
  • Все YAML валидны (нет битых отступов).

Качество SQL

  • Все модели читаемы — CTE с комментариями для длинных моделей.
  • Magic numbers вынесены в vars в dbt_project.yml.
  • Snake_case везде.
  • Никаких SELECT * в marts (только в staging и intermediate допустимо).
  • Алиасы JOIN таблиц короткие и осмысленные.

README

  • Описание проекта (что и зачем).
  • Инструкции запуска (pip install, dbt seed, dbt build).
  • Архитектурная диаграмма (можно ASCII или скриншот lineage).
  • Раздел про используемые технологии (dbt-core 1.10, DuckDB, dbt_utils).
  • Link на dbt docs (можно сгенерировать GitHub Pages из target/index.html).

Шаг 13: README.md

Пример хорошего README для capstone:

# Jaffle Shop dbt Project

End-to-end dbt project for synthetic Jaffle Shop e-commerce data.
Built as part of dbt I course (junior level). Production-minimum example with:

- 4 staging models
- 2 intermediate models (ephemeral)
- 3 mart models (customers, orders, revenue_daily)
- 1 snapshot (customers SCD2)
- 1 exposure (monthly_revenue_dashboard)
- 15+ tests (generic + 2 singular for business invariants)

## Architecture

\`\`\`
seeds/         (6 raw CSV: customers, orders, order_items, payments, products, countries)
   |
   v
staging/       (4 models: stg_jaffle__*, view materialization, minimal cleanup)
   |
   v
intermediate/  (2 models: int_order_items_pivoted, int_payments_joined, ephemeral)
   |
   v
marts/         (3 tables: customers, orders, revenue_daily)
   |
   v
exposures/     (Looker dashboard: monthly_revenue_dashboard)
\`\`\`

## Tech stack

- dbt-core 1.10.x
- dbt-duckdb 1.10.x
- DuckDB (local file-based warehouse)
- Python 3.11

## Setup

\`\`\`bash
# Create venv and install
python -m venv .venv
source .venv/bin/activate
pip install dbt-duckdb==1.10.1

# Configure profile (edit ~/.dbt/profiles.yml)
mkdir -p ~/.dbt
cp profiles.example.yml ~/.dbt/profiles.yml

# Install packages
dbt deps

# Full build
dbt build

# Generate docs
dbt docs generate
dbt docs serve
\`\`\`

## Tests

15+ data tests включая:
- Standard generic: not_null, unique, accepted_values, relationships
- Custom singular: 
  - orders.order_total_cents must equal sum of order_items.line_total_cents
  - revenue_daily.gross_revenue must equal aggregation of orders for that date

## Lineage

\`\`\`bash
dbt docs serve --port 8080
# Open http://localhost:8080
\`\`\`

[Screenshot of lineage graph]

## Tier system

Customers classified into tiers by lifetime spend:

| Tier   | Threshold       |
|--------|-----------------|
| Bronze | <= $100         |
| Silver | $100 - $500     |
| Gold   | > $500          |

Configurable via `vars` in `dbt_project.yml`.

## License

MIT

Шаг 14: Publish (опционально)

Хочешь, чтобы проект был доступен онлайн? Несколько опций:

GitHub Pages для docs

dbt docs generate
# target/ теперь содержит index.html + статические assets

# Создай отдельную ветку gh-pages
git checkout --orphan gh-pages
git rm -rf .
cp -r target/* .
git add .
git commit -m "Deploy docs"
git push origin gh-pages

В GitHub settings -> Pages -> Source: gh-pages. Через минуту твой dbt-каталог доступен по https://<user>.github.io/my_jaffle_shop/.

GIF lineage в README

Записать короткий GIF (через Kap на Mac или ScreenToGif на Windows): открытие lineage graph, клик на модель, наведение на колонки. Сохрани в docs/lineage.gif и встрой в README.


Шаг 15: Использование в собеседовании

Когда устраиваешься на dbt-junior позицию:

В CV / LinkedIn

  • В разделе «Проекты» / «Side projects»:

    Jaffle Shop dbt project — end-to-end production-минимум dbt-проекта на DuckDB. 13 моделей с тестами, snapshot, exposures, полная документация. [link to GitHub] [link to docs]

В письме / cover letter

  • «Я учился по курсу dbt I и в качестве итогового проекта собрал production-минимум dbt-проекта — на GitHub лежит [link]. Запустить локально: pip install dbt-duckdb && dbt build

На собеседовании

  • Покажи lineage graph через screen-share или ссылку на GitHub Pages docs.
  • Расскажи историю: «Это синтетический e-commerce datameter. Raw CSV в seeds, очистка в staging, бизнес-логика в marts. Customers — это wide dim, orders — fact, revenue_daily — preaggregated daily для дашборда».
  • Покажи snapshot: «customers_snapshot отслеживает SCD2 изменения customer-полей. Стратегия timestamp на signup_date».
  • Покажи тесты: «PK тесты на всех моделях, relationships между fact и dim, accepted_values для enum-полей. Плюс 2 singular теста для бизнес-инвариантов».

На вопрос «расскажи про твой проект»

30-секундный pitch:

«Я собрал dbt-проект для синтетических e-commerce данных. На DuckDB локально. Архитектура staging-intermediate-marts: 4 staging, 2 intermediate (ephemeral), 3 mart. Marts — это customers (wide dim с тиром bronze/silver/gold по lifetime spend), orders (fact с агрегатами payments), revenue_daily (предаггрегированный аналитический mart). Snapshot на customers с timestamp strategy. 15+ тестов: generic на PK, relationships между моделями, accepted values, и 2 singular теста на бизнес-инварианты типа sum_of_items_equals_order_total. Документация полная — descriptions, doc blocks, exposure на Looker dashboard. На GitHub есть и проект, и сгенерированный docs site.»

Этого достаточно, чтобы показать понимание core концепций dbt junior.


Что дальше

После capstone у тебя:

  • [OK] Понимание dbt-core 1.10 на уровне junior
  • [OK] Реальный portfolio piece для собеседований
  • [OK] Опыт с DuckDB, который transferable на Snowflake/BigQuery

Дальнейшие шаги:

  1. Поискать junior dbt позицию — теперь ты квалифицированный candidate.
  2. Пройти dbt II (middle) — production deployment, incremental optimization, contracts, mesh, advanced tests.
  3. Поучить SQL deeper — нашим SQL Fundamentals и SQL Internals курсами.
  4. Поиграть с warehouse: Snowflake trial / BigQuery free tier — перенеси Jaffle Shop туда, поймёшь warehouse-specific нюансы.

Чек-лист этого урока

  • Финальный dbt build зелёный с PASS только.
  • dbt docs generate && dbt docs serve отрабатывает, lineage graph виден.
  • Все 30+ пунктов чек-листа отмечены.
  • README.md написан с описанием, setup instructions, архитектурой.
  • Проект в git-репо, можно расшарить ссылку.
  • (Опционально) docs захостены через GitHub Pages.
  • 30-секундный pitch проекта подготовлен для собеседования.
Capstone dbt II: CI/CD и Semantic Layer Роли в data-инженерии: куда дальше

Поздравляю — ты прошёл junior-курс dbt. Следующий уровень — реальная работа или dbt II (middle production).

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 6. Что должно произойти при финальном dbt build на capstone-проекте?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 4