Learn Analytics Engineering with Phoebe

The same warehouse, as a dbt project

A leader track on why analytics engineering became a role, what models-as-code actually changes, how a test suite works as a governance artifact, and what to buy versus build - with no code to write. And a builder track that rebuilds a marketplace warehouse you already know as a real dbt project: sources, staging, intermediate, dimensions, facts, a type-2 snapshot, four marts, 100 tests, model contracts and CI. The project in this repo runs: dbt build reports PASS=121, ERROR=0, and it reproduces the hand-built version's numbers to the cent. Every model on the site is the SQL dbt compiled, every test in the lab is the project's own, and the lineage graph is read from its manifest.

16sessions
23dbt models
100tests, all passing
121build steps, 1.22s

The leader track 🀝 · for heads of data, analytics leads & curious minds · 6 x 45 min · no code to write

Thinking mode: why this role exists between the warehouse and the dashboard, what changes when transformations live in git, how to read a test suite as a trust budget rather than developer hygiene, what to buy and what to build, how to shape the team, and why generated documentation is the only kind that stays true. Each session ends with the questions to ask your data team.

The builder track πŸ› οΈ Β· for practitioners Β· 10 sessions x 45 min (b10: 60) Β· real DuckDB in your browser

One project: Bazaar, the multi-merchant marketplace from learn-data-modeling, rebuilt as dbt. You already know the model, so every session is about the craft. Each page runs real DuckDB compiled to WebAssembly and executes the SQL dbt itself compiled - so what you query in the browser is what the project builds on a laptop.

πŸš€Builder 1 Β· easy

From hand-written SQL to a project

Run the finished project, read a real build's output, and see the same numbers appear - 111,906.48 to the cent - from version-controlled, tested SQL.

β–Ά Builders start here
βš™οΈBuilder 2 Β· easy

The project config

dbt_project.yml, profiles and targets walked line by line - materialization per layer as a decision, and vars instead of hard-coded dates.

config walkthrough
πŸ“₯Builder 3 Β· medium

Sources and staging

Declare the eight raw tables once, then one staging model each: rename, recast, no joins. The discipline that makes everything above it readable.

8 staging models
πŸ•ΈοΈBuilder 4 Β· medium

ref() and the DAG

Explore the project's real lineage - 32 nodes, 47 edges, read from its manifest - and get an impact set before you rename anything.

β˜… live lineage
πŸ”§Builder 5 Β· medium

Intermediate models

The joins staging is not allowed to do, materialized as nothing at all - plus the fan-out guard expressed as a model rather than a warning.

3 ephemeral models
🧊Builder 6 · hands-on

Dimensions, facts, snapshots

Six dimensions and three facts as dbt models, deterministic surrogate keys, and a real type-2 snapshot doing what a hand-written SCD load cannot.

12 marts + snapshot
🧨Builder 7 · hands-on

The break-a-model lab

Six real breakages, the project's own 100 compiled tests. No tests catches 0 of 6, generic catches 4, generic plus singular catches all 6.

β˜… signature lab
πŸ“ŠBuilder 8 Β· hands-on

Marts and the business questions

Three marts at three grains, the four questions answered again, and why a mart never joins two facts even when it could.

3 marts
πŸ“œBuilder 9 Β· hardest

Contracts, docs and deployment

Model contracts, generated docs, exposures for the consumers dbt cannot see, and CI that tests only what a pull request touched.

ship it safely
🏁Builder 10 · hardest · 60 min

Capstone: add a subject area

Returns and refunds through every layer - source, staging, intermediate, dimension, fact, mart, tests, contract - and a green build at the end.

whole project, alone
easy medium hands-on hardest

What you leave with - a project that runs, not slideware

dbt_project/models/ 8 staging models 3 intermediate (ephemeral) 6 dimensions 3 facts 3 marts 2 schema.yml + 1 sources.yml
dbt_project/ tests/ 5 singular tests macros/ surrogate_key + 2 generic tests snapshots/ merchants_snapshot dbt_project.yml Β· profiles.yml
python/ load_raw.py build_browser_assets.py

Take learn-data-modeling-with-phoebe first if you can: this course rebuilds that course's warehouse, and the whole argument depends on knowing what was built by hand. It sits above learn-sql and beside learn-data-warehouse; scheduling and monitoring what you build here is learn-dataops, because dbt does not schedule itself.

Built from the dbt documentation (models, sources, tests, snapshots, contracts, node selection), the community layering conventions, and Kimball for the model being rebuilt - every source named on the session that uses it, with an honest out-of-scope list. Verified against a real dbt build: 23 models, 100 tests, PASS=121, ERROR=0.

Choose your path πŸ—ΊοΈ

Two doors, one project. Leaders never write code; builders never sit through theory they have not just run.

🀝 The leader path (judge & fund) a1β†’ a2β†’ a3β†’ a4β†’ a5β†’ a6
πŸ› οΈ The builder path (rebuild Bazaar) b1β†’ b2β†’ b3β†’ b4β†’ b5β†’ b6β†’ b7β†’ b8β†’ b9β†’ b10
πŸš€ The full journey (lead AND build) a1-a6β†’ b1-b10
⚑ The two-hour tour (if you only have one evening) b1 run itβ†’ b4 the DAGβ†’ b7 break it

The knowledge map 🧠

Both tracks at a glance - hover a session to spotlight its concepts, click any node to jump in.