Data engineering is the discipline of designing and operating the systems that collect, move, store, and transform data so it is reliable, timely, and ready for analytics and machine learning. If data science is about extracting value from data, data engineering is about making that data trustworthy and available in the first place.
The data pipeline lifecycle
Most pipelines, regardless of scale, move through the same stages:
- Ingest — pull data from sources (databases, event streams, APIs, logs, files) via scheduled batch pulls or continuous change-data-capture.
- Store — land raw data cheaply and durably, then organize it into curated, queryable layers.
- Process / transform — clean, join, aggregate, and model the data into analytics- or ML-ready tables.
- Serve — expose the results to dashboards, APIs, feature stores, or downstream jobs.
- Orchestrate and observe — schedule the steps, track lineage, and alert on freshness, volume, and quality regressions.
Batch vs. streaming
- Batch processes bounded chunks on a schedule (hourly, daily). It is simple, cheap, and easy to reason about — the right default for most work.
- Streaming processes unbounded events as they arrive (seconds or less), trading complexity for low latency. Reach for it when the business genuinely needs near-real-time results.
A common production pattern is a hybrid: stream for fresh views, batch to correct and backfill.
ETL vs. ELT
Traditional ETL transforms data before loading it into the warehouse. Modern cloud warehouses are powerful enough that many teams now prefer ELT — load raw data first, then transform it in-warehouse with SQL (e.g. dbt). ELT keeps the raw source of truth, makes transformations versionable, and lets you reprocess history when the logic changes.
Storage: lake, warehouse, lakehouse
- Data lake — cheap object storage (S3/GCS) for raw, semi-structured data.
- Data warehouse — a columnar, SQL-first store optimized for analytics (BigQuery, Snowflake, Redshift).
- Lakehouse — open table formats (Delta, Iceberg, Hudi) that add warehouse-like transactions and schema to data sitting in the lake.
Partition large tables by a time or key column so queries scan only what they need — it is the single biggest cost and performance lever.
Orchestration
Pipelines are graphs of dependent tasks (DAGs). An orchestrator (Airflow, Dagster, Prefect) schedules them, retries failures, and exposes lineage:
# A minimal daily pipeline (Airflow-style dependency graph)
ingest >> stage >> transform >> publishData quality and observability
A pipeline that runs is not the same as a pipeline that is correct. Bake in:
- Schema and data contracts validated at ingestion.
- Freshness, volume, and null/duplicate tests on published tables.
- Idempotent, partition-scoped writes so a rerun reproduces the same result.
- Lineage and alerting so a broken upstream surfaces before a stakeholder finds it.
Scaling and cost
Push work to where the data lives, prefer columnar formats (Parquet), partition and cluster large tables, and use serverless or managed compute so you pay for what you actually run. Most “big data” problems turn out to be partitioning and file-size problems in disguise.