Become a data engineer, starting from zero.
433 steps of 5-10 minutes. Python, SQL, pipelines, cloud and streaming, each step with practice and a check.
Thanks, there. You are on the list.
Step 1, live: the journey of one order
SELECT * FROM raw.orders; -- shop DB + marketplace CSV
| order | created_at | amount | cur | customer |
|---|---|---|---|---|
| 1041 | 2026-11-02 09:14 CET | 42.50 | EUR | 7 |
| 1042 | 2026-11-02T08:40:00Z | 19.99 | USD | 3 |
| 1042 | 2026-11-02T08:40:00Z | 19.99 | USD | 3 |
| 1043 | 02.11.2026 12:05 | empty | EUR | 9 |
| 1044 | 2026-11-01 23:30 PST | 120.00 | usd | 7 |
| 1045 | 2026-11-01 18:02 CET | 64.00 | EUR | 3 |
6 rows2 sources. One duplicate, one empty amount, 3 time formats, 2 currencies.
SELECT DISTINCT order_id, to_utc(created_at),
amount * fx.rate AS amount_eur
FROM raw.orders JOIN fx USING (currency)
WHERE amount IS NOT NULL;
| order | created_at (UTC) | amount_eur |
|---|---|---|
| 1041 | 2026-11-02 08:14 | 42.50 |
| 1042 | 2026-11-02 08:40 | 18.39 |
| 1044 | 2026-11-02 07:30 | 110.40 |
| 1045 | 2026-11-01 17:02 | 64.00 |
4 rows, 1 quarantinedDuplicate removed, order 1043 sent to quarantine, times in UTC, USD converted at a sample rate of 0.92.
SELECT o.*, c.country
FROM stg_orders o
JOIN dim_customer c USING (customer_id);
| order | created_at (UTC) | amount_eur | country |
|---|---|---|---|
| 1041 | 2026-11-02 08:14 | 42.50 | DE |
| 1042 | 2026-11-02 08:40 | 18.39 | FR |
| 1044 | 2026-11-02 07:30 | 110.40 | DE |
| 1045 | 2026-11-01 17:02 | 64.00 | FR |
fct_orders: 4 rowsEach order joined to its customer. One row is one order: that is the grain.
SELECT order_date, COUNT(*), SUM(amount_eur)
FROM fct_orders GROUP BY 1;
| day (UTC) | orders | revenue_eur | chart |
|---|---|---|---|
| 2026-11-01 | 1 | 64.00 | |
| 2026-11-02 | 3 | 171.29 |
235.29 EUROrder 1044 looked like November 1 in the raw file. In UTC it belongs to November 2.
The route, drawn to scale
Each segment is as wide as its number of steps. Python and SQL come first, because almost every data job asks for both.
One step is one idea and 5-10 minutes
Short steps keep you going on a busy evening. New words appear only after a step has explained them.
- One shop dataset from step 1 to the final project: orders, customers, clicks, payments, tickets.
- Every 10-15 steps, a checkpoint or capstone you can show.
- Hard tools arrive when you feel the need. Spark comes after pandas runs out of memory.
-
2-3 min
Read
A situation from real work, the idea in plain words, one diagram.
-
1-2 min
See
Code or SQL on the shop dataset, with real output.
-
3-5 min
Do
One small task in your terminal or editor.
-
instant
Check
The checker runs your query, test or pipeline and shows a green tick.
What you will have built
27 capstones and checkpoints, then a final project. A selection:
- step 386An on-call week: 5 production incidents fixed in a row
- step 158Incremental ingestion from 3 sources, safe to run twice
- step 228A dbt project with tests, docs and CI
- step 299The same shop pipeline on AWS, then on GCP and Azure
- step 347A live orders dashboard fed by change data capture
- step 370A warehouse bill cut by 40%, with the numbers
Syllabus
Every step, in order. Steps 0-30 are free.
Part 1 Start from zero 0-83
What data engineering is 0-7
- 0What a data engineer does all day free
- 1The journey of one order: from click to dashboard free
- 2Sources, pipelines, storage, consumers free
- 3Batch and streaming in one picture free
- 4OLTP and OLAP: two kinds of databases free
- 5Data engineer, analyst, analytics engineer, ML engineer free
- 6The modern data stack on one map free
- 7What you will build in this course free
Terminal and git 8-18
- 8Open the terminal and run 3 commands free
- 9Files, folders and paths free
- 10Look inside a CSV: head, tail, wc free
- 11Find rows with grep free
- 12Pipes and redirection free
- 13Environment variables free
- 14Install tools with a package manager free
- 15git: your first commit free
- 16Branches and merges free
- 17GitHub: push and open a pull request free
- 18Checkpoint: a repo with a cleaned CSV free
Python from zero 19-43
- 19Install Python and run your first script free
- 20Variables and types free
- 21Strings and f-strings free
- 22Lists free
- 23Dictionaries free
- 24Conditions free
- 25Loops free
- 26Functions free
- 27Modules and imports free
- 28Reading and writing files free
- 29CSV with the csv module free
- 30JSON in and out free
- 31Errors and try/except
- 32Virtual environments and uv
- 33Installing packages
- 34Classes in 10 minutes
- 35Dataclasses and type hints
- 36Dates, times and time zones
- 37Calling an HTTP API
- 38Pagination and rate limits
- 39Logging instead of print
- 40Your first test with pytest
- 41A command-line script with arguments
- 42Generators: handling files bigger than memory
- 43Capstone: daily API-to-CSV collector
SQL from zero 44-73
- 44What a database is
- 45Tables, rows, columns
- 46Run Postgres and connect
- 47SELECT
- 48WHERE
- 49ORDER BY and LIMIT
- 50COUNT, SUM, AVG, MIN, MAX
- 51GROUP BY
- 52HAVING
- 53NULL and why it breaks comparisons
- 54INNER JOIN
- 55LEFT JOIN
- 56Join fan-out: when totals double
- 57Subqueries
- 58CTEs with WITH
- 59CASE WHEN
- 60Dates in SQL
- 61Text in SQL
- 62Window functions: ROW_NUMBER
- 63Running totals and LAG/LEAD
- 64Deduplicate with a window
- 65INSERT, UPDATE, DELETE
- 66CREATE TABLE and data types
- 67Primary and foreign keys
- 68Indexes
- 69Transactions
- 70Reading EXPLAIN
- 71Views and materialized views
- 72SQL from Python
- 73Capstone: 10 business questions on a shop database
Advanced SQL 74-83
- 74Gaps and islands
- 75Sessionization: grouping clicks into visits
- 76Recursive CTEs
- 77ROLLUP, CUBE, GROUPING SETS
- 78Pivot and unpivot
- 79Top N per group, medians, percentiles
- 80Isolation levels and MVCC
- 81Join algorithms: nested loop, hash, merge
- 82Table partitioning in Postgres
- 83Checkpoint: 10 interview-style SQL problems
Part 2 Data foundations 84-140
Data modeling 84-105
- 84Why the shape of data matters
- 85Normalization in plain words
- 86Drawing an ER diagram
- 87Facts and dimensions
- 88Grain: one row means what
- 89Star schema
- 90Snowflake schema
- 91Surrogate and natural keys
- 92The date dimension
- 93Slowly changing dimensions: type 1 and 2
- 94SCD types 3, 4 and 6
- 95Fact table types: transaction, periodic snapshot, accumulating
- 96Factless facts
- 97Bridge tables for many-to-many
- 98Conformed dimensions and the bus matrix
- 99Late-arriving dimensions
- 100One big table: when it wins
- 101Data Vault in one step
- 102Modeling event data
- 103Semi-structured JSON in a warehouse
- 104Choosing a model for a team
- 105Capstone: model a subscription business
Storage and file formats 106-117
- 106Row storage and column storage
- 107CSV traps: commas, quotes, encodings
- 108JSON Lines
- 109Parquet
- 110Avro
- 111Compression codecs
- 112Partitioning files by date
- 113The small files problem
- 114Object storage: buckets and keys
- 115MinIO: S3 on your laptop
- 116Lake, warehouse, lakehouse
- 117Capstone: raw CSV to partitioned Parquet in MinIO
Docker and servers for data 118-127
- 118Why containers
- 119Your first Dockerfile
- 120docker compose with Postgres
- 121Volumes: data that survives restarts
- 122Container networking
- 123Config and secrets in containers
- 124cron: the simplest scheduler
- 125SSH to a server
- 126Makefile as the project's front door
- 127Capstone: a one-command local data stack
Distributed systems basics 128-135
- 128Why one machine stops being enough
- 129Replication
- 130Partitioning and sharding
- 131Consistency models
- 132CAP and PACELC
- 133Clocks and the order of events
- 134Consensus in one step
- 135At-most-once, at-least-once, exactly-once
Other databases 136-140
- 136Document stores: MongoDB
- 137Key-value and wide-column: DynamoDB and Cassandra
- 138Redis
- 139Search engines: Elasticsearch and OpenSearch
- 140Getting data out of NoSQL into a warehouse
Part 3 Pipelines 141-237
Ingestion 141-158
- 141Kinds of sources
- 142Full load and incremental load
- 143Watermarks: remembering where you stopped
- 144Idempotency: safe to run twice
- 145API ingestion with retries
- 146Many API calls at once with asyncio
- 147Webhooks
- 148Files from SFTP and email
- 149Extracting from a production database
- 150Change data capture: the idea
- 151dlt: ingestion as Python code
- 152Airbyte
- 153Managed connectors: Fivetran and friends
- 154Schema drift
- 155Late and duplicate data
- 156Backfills
- 157Web scraping, legally
- 158Capstone: incremental ingestion from 3 sources
Batch processing on one machine 159-167
- 159pandas basics
- 160pandas: group, join, reshape
- 161Where pandas runs out of memory
- 162Polars
- 163DuckDB
- 164DuckDB over Parquet in S3
- 165Benchmark: pandas vs Polars vs DuckDB
- 166Choosing the tool by data size
- 167Capstone: 50 GB on a laptop
Spark 168-183
- 168Why distributed processing
- 169Driver, executors, cluster
- 170Spark locally
- 171The DataFrame API
- 172Lazy evaluation: transformations and actions
- 173Spark SQL
- 174Partitions
- 175Shuffles
- 176Broadcast joins
- 177Data skew
- 178Why Python UDFs are slow
- 179Reading the Spark UI
- 180Caching
- 181Memory and executor tuning
- 182Writing partitioned output
- 183Capstone: a 3x faster Spark job
JVM for Spark optional 184-186
- 184Reading Spark code in Scala
- 185JVM memory and garbage collection in Spark
- 186Java and Scala in job postings: what to learn
Lakehouse tables 187-195
- 187Table formats: why files are not enough
- 188Delta Lake
- 189Apache Iceberg
- 190MERGE and upserts
- 191Schema evolution
- 192Idempotent partition overwrite
- 193Time travel and rollback
- 194Table maintenance: compaction and vacuum
- 195Capstone: a daily-updated table with no duplicates
Orchestration 196-213
- 196Why cron stops being enough
- 197DAGs
- 198Airflow: install and first DAG
- 199Operators and tasks
- 200Schedules, catchup, data intervals
- 201Retries, timeouts, SLAs
- 202Sensors and dependencies between DAGs
- 203Passing data between tasks
- 204Dagster: thinking in assets
- 205Prefect and others: how to choose
- 206Backfills in an orchestrator
- 207Alerts that people read
- 208Testing DAGs
- 209Dynamic task mapping
- 210Data-aware scheduling
- 211Executors: local, Celery, Kubernetes
- 212Running Airflow in production
- 213Capstone: the daily pipeline, orchestrated
Transformation with dbt 214-228
- 214ETL and ELT
- 215A dbt project from scratch
- 216Models and ref()
- 217Sources and freshness
- 218Materializations
- 219Incremental models
- 220Tests
- 221Docs and lineage graph
- 222Jinja and macros
- 223Snapshots for SCD type 2
- 224Seeds and packages
- 225Layers: staging, intermediate, marts
- 226dbt in CI: slim builds
- 227Semantic layer and metrics
- 228Capstone: a dbt project for the shop
Testing data code 229-233
- 229Unit tests for transformations
- 230Testing Spark code
- 231dbt unit tests
- 232Integration tests with Testcontainers
- 233Test data: fixtures and synthetic rows
Serving data 234-237
- 234BI dashboards with Superset
- 235Self-serve analytics with Metabase
- 236A data API with FastAPI
- 237Caching and limits for data APIs
Part 4 Reliable data 238-277
Data quality and contracts 238-249
- 238What bad data costs
- 239Quality dimensions you can measure
- 240Great Expectations and Soda
- 241Data contracts
- 242Schema registry
- 243Anomaly checks on volume and freshness
- 244The quarantine pattern
- 245Reconciliation with the source
- 246Freshness SLAs
- 247Entity resolution: one customer from 3 systems
- 248Golden records and master data
- 249Capstone: a pipeline that stops bad data
DataOps 250-262
- 250Git flow for data projects
- 251CI for pipelines
- 252Dev, staging, prod for data
- 253Terraform: infrastructure as code
- 254Terraform for buckets and warehouses
- 255Secrets management
- 256Pipeline observability: logs, metrics, traces
- 257Lineage with OpenLineage
- 258Runbooks
- 259On-call and incidents
- 260Writing a postmortem
- 261AI coding agents in data work
- 262Capstone: CI/CD for the whole stack
Kubernetes for data 263-268
- 263Pods, deployments, services
- 264Helm charts
- 265Spark on Kubernetes
- 266Airflow with KubernetesPodOperator
- 267Resource requests, limits, autoscaling
- 268Capstone: the data stack on a local kind cluster
Governance, privacy, security 269-277
- 269Data catalogs
- 270Finding and classifying PII
- 271Masking and pseudonymization
- 272Access control: roles and grants
- 273Row-level and column-level security
- 274GDPR: deleting a person from a data lake
- 275Retention policies
- 276Audit logs
- 277Capstone: a privacy review of your platform
Part 5 Cloud 278-323
Cloud basics 278-288
- 278Open a cloud account safely
- 279Budget alerts before anything else
- 280IAM: users, roles, policies
- 281Regions and zones
- 282VPC, subnets and routes
- 283Private endpoints: data that never touches the internet
- 284NAT gateways: the hidden cost
- 285Encryption with KMS
- 286How clouds charge for data
- 287The cloud CLI
- 288Teardown: leave nothing running
AWS 289-299
- 289S3 for data
- 290IAM roles for pipelines
- 291Glue Data Catalog
- 292Athena
- 293Glue jobs and EMR Serverless
- 294Lambda for small jobs
- 295Step Functions and MWAA
- 296Redshift Serverless
- 297Kinesis
- 298Lake Formation
- 299Capstone: the shop pipeline on AWS
Google Cloud 300-307
- 300Cloud Storage
- 301BigQuery
- 302BigQuery partitioning and clustering
- 303BigQuery cost: on-demand and slots
- 304Pub/Sub
- 305Dataflow
- 306Composer and Dataproc
- 307Capstone: the shop pipeline on GCP
Azure 308-314
- 308ADLS Gen2
- 309Data Factory
- 310Microsoft Fabric
- 311Event Hubs
- 312Entra ID and access
- 313Purview
- 314Capstone: the shop pipeline on Azure
Warehouses and lakehouses 315-323
- 315Snowflake architecture
- 316Snowflake warehouses and credits
- 317Time travel and zero-copy clones
- 318Databricks and the lakehouse
- 319Unity Catalog and open catalogs
- 320Trino: one SQL over many sources
- 321ClickHouse for fast analytics
- 322Choosing a warehouse
- 323Capstone: the same marts on Snowflake and Databricks
Part 6 Streaming and real time 324-347
Streaming 324-347
- 324When real time is worth it
- 325Events and logs
- 326Kafka: brokers, topics, partitions
- 327Producers
- 328Consumers and consumer groups
- 329Offsets and replays
- 330Consumer lag and how to watch it
- 331Rebalancing
- 332Retention and log compaction
- 333Delivery guarantees
- 334Schemas for events
- 335Schema compatibility modes
- 336Kafka Connect
- 337CDC with Debezium
- 338Windows: tumbling, sliding, session
- 339Event time and watermarks
- 340State in stream processing
- 341Spark Structured Streaming
- 342Apache Flink
- 343Exactly-once, end to end
- 344Streaming into a lakehouse
- 345Applying CDC changes to an Iceberg table
- 346Real-time OLAP
- 347Capstone: a live orders dashboard with CDC
Part 7 Data for ML and AI 348-362
ML and AI data pipelines 348-362
- 348What ML teams need from data engineers
- 349Features and feature pipelines
- 350Point-in-time correctness
- 351Feature stores with Feast
- 352Training datasets and versioning
- 353Embeddings for data engineers
- 354Vector search with pgvector
- 355Unstructured data: PDFs, images, audio
- 356A document pipeline for RAG
- 357LLMs inside pipelines: extract and classify
- 358Cost and caching of LLM calls in batch
- 359Text-to-SQL over your warehouse
- 360Data for AI agents: MCP over the warehouse
- 361Handing off to MLOps
- 362Capstone: support tickets to a RAG-ready index
Part 8 Senior practice 363-432
Performance and cost 363-370
- 363Profiling a slow query
- 364Partition pruning
- 365Clustering and sort keys
- 366Incremental everything
- 367FinOps for data
- 368Storage tiers and lifecycle rules
- 369Spot instances and autoscaling
- 370Capstone: cut a warehouse bill by 40%
Production incidents 371-386
- 371Reading an incident: alert, logs, timeline
- 372Duplicates after a backfill
- 373The daylight saving time bug
- 374Upstream renamed a column
- 375Silent nulls after a source change
- 376A skewed join kills Spark
- 377Small files slow every query
- 378SELECT * burns the monthly budget
- 379Kafka consumer lag grows overnight
- 380Late data missing from yesterday's report
- 381A DAG that ran twice
- 382A stale exchange rate cached for a week
- 383A deleted partition, restored with time travel
- 384A permissions change breaks the nightly load
- 385Dashboard numbers disagree with finance
- 386Capstone: an on-call week, 5 incidents in a row
Architecture 387-396
- 387Requirements before tools
- 388Lambda and Kappa architectures
- 389Medallion: bronze, silver, gold
- 390Data mesh and data products
- 391Build, buy, or open source
- 392Reverse ETL
- 393Multi-tenant data platforms
- 394Disaster recovery for data
- 395Migrating a legacy warehouse
- 396Architecture decision records
Data engineering in business 397-406
- 397Auditing a company's data
- 398Finding manual work to automate
- 399Defining metrics people agree on
- 400Estimating ROI and TCO
- 401Writing a proposal
- 402A 90-day data roadmap
- 403Working with stakeholders
- 404Replacing Excel processes
- 405Presenting to leadership
- 406Capstone: an audit and proposal for a real business
Senior engineering skills 407-412
- 407Writing a design doc
- 408Estimating data work
- 409Prioritizing tech debt
- 410Code review for data code
- 411Mentoring juniors
- 412Capstone: take over a legacy pipeline repo and fix it
Interviews and career 413-424
- 413A data engineer CV
- 414Portfolio from your capstones
- 415SQL interview problems
- 416Python coding interview for data roles
- 417Data modeling interview
- 418System design: e-commerce analytics
- 419System design: real-time fraud detection
- 420System design: clickstream at 1 billion events a day
- 421Behavioral interview
- 422Take-home assignments
- 423Salary negotiation
- 424Your first 90 days on the job
Final project 425-432
- 425Final project: brief and requirements
- 426Final project: architecture and ADRs
- 427Final project: ingestion and storage
- 428Final project: transformation and quality
- 429Final project: streaming path
- 430Final project: cloud deploy with Terraform
- 431Final project: observability and cost report
- 432Final project: write-up and demo for your portfolio
Tools you will use
Ideas first, tools as examples. A new tool changes the example, the step stays.
- Basics
- Terminal, git, Python, SQL, Postgres, Docker, MongoDB, Redis
- Processing
- pandas, Polars, DuckDB, Spark
- Pipelines
- dlt, Airbyte, Airflow, Dagster, dbt
- Storage
- Parquet, Avro, S3, MinIO, Delta Lake, Iceberg
- Cloud
- AWS, Google Cloud, Azure, Snowflake, Databricks, Terraform, Kubernetes
- Streaming
- Kafka, Debezium, Flink, Spark Streaming, ClickHouse
- Quality and ops
- Great Expectations, Soda, OpenLineage, data contracts
- ML and AI
- Feast, pgvector, RAG pipelines, LLMs in batch, MCP
Who it is for
Career changers
You have never written code. Part 1 starts with the terminal and ends with Python and SQL you use every day.
Analysts and developers
You know SQL or a language. Skim part 1, then go deep into pipelines, cloud and streaming.
Engineers aiming for senior
Performance, cost, architecture, governance, and how to pitch a data platform to a business.
FAQ
Do I need to know programming?
No. Steps 0-83 teach the terminal, git, Python and SQL from the first command.
What level will I reach?
Mid to senior. You build and run pipelines, choose between tools with numbers, fix production incidents, design a data platform and defend the design. Part 8 and the hard blocks of parts 1-6 cover the senior level: distributed systems, Kubernetes, cost, architecture.
Where does the experience come from?
From failures you fix yourself. Block 8.2 rebuilds 14 real classes of data incidents small: duplicates after a backfill, a daylight saving bug, a renamed upstream column, a skewed Spark join, a SELECT * that burns the budget. You get the alert and the logs, find the cause, fix it and write a postmortem. Step 412 hands you a legacy repo with no tests to bring into shape.
Which clouds?
AWS, Google Cloud and Azure, one block each, plus Snowflake and Databricks. You deploy the same shop pipeline to each, so you see what changes between clouds.
Who pays for the cloud?
You use your own accounts. The first cloud step sets a budget alert, and every cloud practice ends with a teardown. Plan for about $30 across the whole course. Before part 5, everything runs on your laptop in Docker.
What computer do I need?
macOS, Linux or Windows with WSL, 8 GB of memory and 30 GB of free disk. 16 GB helps in the Spark block.
Why so many steps?
Each step holds one idea, so steps stay short. 433 steps at 5-10 minutes come to 36-72 hours of reading and practice, plus capstones.
Is ML and AI included?
Yes. Part 7 covers feature pipelines, point-in-time correctness, vector search, document pipelines for RAG, and LLM calls inside batch jobs.
Interviews?
Block 8.6 covers SQL, Python and data modeling interviews, 3 system design problems, take-homes and salary negotiation.
Languages?
English and Russian, mirrored step by step.
What does it cost?
Steps 0-30 are free. After that, a yearly plan or lifetime access. The waitlist hears about prices first.
Get the first steps when they open
One email when steps 0-30 go live.
Thanks, there. You are on the list.