Этот урок — это 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
Дальнейшие шаги:
- Поискать junior dbt позицию — теперь ты квалифицированный candidate.
- Пройти dbt II (middle) — production deployment, incremental optimization, contracts, mesh, advanced tests.
- Поучить SQL deeper — нашим SQL Fundamentals и SQL Internals курсами.
- Поиграть с 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 проекта подготовлен для собеседования.
Поздравляю — ты прошёл junior-курс dbt. Следующий уровень — реальная работа или dbt II (middle production).