Что значит “задеплоить” pet-project
Деплой pet-project — это не реальный production-деплой в облако. Это возможность запустить твой стек одной командой, чтобы собеседующий мог увидеть всё в работе. На pet-project достаточно docker-compose up.
Что включает “задеплоенный” pet-project:
docker-compose.ymlсо всеми services.README.mdс инструкцией “как запустить за 60 секунд”.- Демо-данные, которые загружаются автоматически (3 месяца достаточно).
- Скриншот / GIF дашборда в README.
Docker Compose — собираем всё
# docker-compose.yml
version: "3.8"
services:
ingester:
build:
context: ./ingest
dockerfile: Dockerfile
volumes:
- ./data:/app/data
- ./ingest:/app
environment:
- PYTHONUNBUFFERED=1
command: python ingester.py 2024-01
dbt:
image: python:3.12-slim
depends_on:
ingester:
condition: service_completed_successfully
volumes:
- ./data:/app/data
- ./dbt:/app/dbt
working_dir: /app/dbt
command: >
bash -c "pip install dbt-duckdb &&
dbt deps &&
dbt seed &&
dbt run &&
dbt test"
streamlit:
build:
context: ./streamlit
dockerfile: Dockerfile
depends_on:
dbt:
condition: service_completed_successfully
ports:
- "8501:8501"
volumes:
- ./data:/app/data
command: streamlit run app.py --server.address 0.0.0.0
Зависимости через depends_on гарантируют: сначала ingester скачивает и грузит, потом dbt трансформирует, потом streamlit показывает. Если упадёт ingester — dbt не запустится.
# ingest/Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
# streamlit/Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8501
После docker-compose up:
- Через 1-3 минуты — данные загружены (зависит от download speed).
- Через 1 минуту — dbt отработал, таблицы готовы.
- Streamlit доступен на
http://localhost:8501.
README — лицо проекта
Хороший README — это то, что отделяет middle-уровневый pet-project от средненького.
# NYC Yellow Taxi Data Pipeline
End-to-end ELT pipeline for NYC Yellow Taxi trip data: ingestion -> DWH -> dbt -> dashboard.

## Architecture

## Stack
- **Python 3.12** — ingestion (requests, duckdb)
- **DuckDB** — analytical warehouse
- **dbt 1.7** — transformations (5 staging, 4 marts)
- **Streamlit** — interactive dashboard
- **Docker Compose** — local orchestration
## Quick start
\`\`\`bash
git clone https://github.com/username/nyc-taxi-pipeline
cd nyc-taxi-pipeline
docker-compose up
\`\`\`
Open http://localhost:8501
## Data model
Star schema:
- `fct_trips` — fact (one row = one trip)
- `dim_date`, `dim_location`, `dim_vendor`, `dim_payment_type` — dimensions
## Tests
12 dbt tests covering uniqueness, not-null, business rules (total_amount >= 0,
no future trips, dropoff after pickup), referential integrity.
Run: `dbt test`
## What I learned
- Incremental dbt models with `delete+insert` strategy for monthly partitions
- Idempotent ingestion: DELETE+INSERT по `year_month` обеспечивает безопасный retry
- Dimensional modeling Kimball: star schema, derived measures (trip_duration)
- DuckDB как замена локального Postgres для analytics — на 5x быстрее
## Future improvements
- [ ] Hourly schedule + SLA-алерты поверх daily Airflow DAG
- [ ] GitHub Actions CI с dbt test на PR
- [ ] Observability через OpenLineage + Marquez
- [ ] Streaming ingestion из NYC TLC API (when available)
## License
MIT
Это уже сильный README. Ключевые элементы:
- Скриншот дашборда в самом верху — это первое, что видят.
- Architecture diagram — показывает, что ты думаешь о системе.
- Stack list — рекрутер сканирует за 5 секунд.
- Quick start — одна команда.
- What I learned — самая важная секция: показывает зрелость и self-reflection.
- Future improvements — показывает, что ты понимаешь scope ограничения.
Что добавлять дальше
Капстон — это MVP. Дальше можно расширять по нескольким направлениям:
Airflow DAG basics: обязательный daily DAG капстона, в глубинуDirection 1: Orchestration (hardening)
Обязательный capstone-DAG ты уже собрал в LAB-03 (граф задач, ретраи, MinIO-sensor, backfill, recovery). Это направление — закалить его до production: SLA, alerts, hourly schedule, разнесение задач по worker-ам. Базовый декораторный вариант DAG для справки:
# airflow/dags/nyc_taxi_dag.py
from airflow.decorators import dag, task
from datetime import datetime, timedelta
@dag(
schedule="@daily",
start_date=datetime(2024, 1, 1),
catchup=False,
default_args={
"retries": 2,
"retry_delay": timedelta(minutes=5),
"retry_exponential_backoff": True
}
)
def nyc_taxi_pipeline():
@task
def ingest(year_month: str):
from ingest.ingester import ingest
ingest(year_month)
@task
def transform():
import subprocess
subprocess.run(["dbt", "run", "--project-dir", "/dbt"], check=True)
@task
def test():
import subprocess
subprocess.run(["dbt", "test", "--project-dir", "/dbt"], check=True)
ingest("2024-01") >> transform() >> test()
nyc_taxi_pipeline()
Это даёт: daily schedule, retries, dependency graph, history. Хардненная версия добавляет SLA, alert-каналы и hourly-расписание поверх обязательного capstone-DAG.
Direction 2: CI/CD
GitHub Actions для проверки PR:
# .github/workflows/test.yml
name: dbt test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: "3.12" }
- run: pip install dbt-duckdb
- run: cd dbt && dbt seed && dbt run && dbt test
При каждом PR — автоматическая проверка, что dbt всё ещё работает. Это CI для DE.
Direction 3: Observability
Добавить OpenLineage + Marquez:
# docker-compose.yml — добавление сервиса
marquez:
image: marquezproject/marquez:latest
ports:
- "5000:5000"
- "5001:5001"
environment:
- MARQUEZ_PORT=5000
dbt событиями через dbt-ol wrapper отправляет lineage в Marquez. На http://localhost:3000 — UI с графом зависимостей.
Direction 4: Real-time
Kafka как первый шаг к streaming Direction 4 из капстонаЕсли хочется streaming-опыта:
- Kafka — добавь producer, который тащит данные раз в минуту.
- Consumer — пишет в S3/DuckDB.
- Spark Structured Streaming — для трансформаций.
Это уже middle-level проект, не junior. Можно сделать как второй pet-project.
Direction 5: ML feature pipeline
Если интересен MLE:
- Feature engineering на trips (fare per mile, time of day patterns).
- Feature store (Feast).
- Простая модель (предсказание fare по pickup/dropoff zones).
Что почитать дальше (книги)
После курса — переходи к глубинным источникам:
-
“Fundamentals of Data Engineering” (Joe Reis & Matt Housley, 2022) — современный обзор DE. После него ты понимаешь, что куда лежит.
-
“Designing Data-Intensive Applications” (Martin Kleppmann, 2017) — bible distributed systems. Читать по главам, не от корки.
-
“The Data Warehouse Toolkit” (Ralph Kimball, 3rd edition) — dimensional modeling. Старая, но фундаментальная.
-
“SQL Antipatterns” (Bill Karwin) — короткая, мощная книга про SQL-ошибки.
-
“Database Internals” (Alex Petrov) — как устроены БД изнутри.
Что почитать дальше (курсы и материалы)
Деep-dive курсы на этой платформе:
airflow-course— оркестрация production-grade.spark-course— distributed computing.kafka-course— event streaming.dbt-course— глубоко dbt.sql-fundamentals+sql-internals— SQL до железа.kubernetes-course— для будущих DPE.clickhouse-course— для analytics-engineering.debezium-course— CDC.flink-course— streaming-обработка.
Не учи все. Выбери 1-2 по интересам, доведи до конца.
Чек-лист “после капстона”
- GitHub-репозиторий с README, diagrams, screenshots.
- Запускается одной командой (
docker-compose up). - dbt tests проходят.
- Airflow DAG (обязательно): multi-task dependency graph с настроенными ретраями (
retries+retry_delayвdefault_args). - DAG ждёт сырьё через sensor на object store (MinIO
S3KeySensorна bucketlake), а не грузит вслепую. - Показан backfill-прогон за диапазон дат (
airflow dags backfill -s ... -e ... nyc_taxi_pipeline). - Продемонстрировано падение задачи и recovery — например, скриншот grid view, где видно retry и зелёная recovered-задача после фикса poison-date.
- README отвечает на: что это, зачем, как запустить, что узнал.
- Pet-project упомянут в резюме с конкретными числами.
- LinkedIn-пост или dev.to-статья — bonus.
- Готов 5-минутный elevator pitch.
Рефлексия
После капстона задай себе вопросы:
- Что было самым сложным? Это и есть точка роста — туда углубляться.
- Что было самым приятным? Может быть, это твоё направление (Architecture? Coding? BI?).
- Какой следующий pet-project? Не повторяй один и тот же — расширяй breadth.
- К чему ты готов на собеседовании? Расскажи pet-project на 5 минут — запиши на видео, посмотри сам.
- Какие фундаментальные дыры? SQL? Python? dbt? Возвращайся к этому курсу или deep-dive.
Главное в капстоне — не финальный код, а процесс. Ты прошёл от пустого README до working pipeline — это и есть DE-experience. Junior-recrumiter ценит этот процесс, а не buzzword-стек. Не сдавайся, если что-то не работает — debug 2 часа, потом загугли, потом спроси в DE-сообществе.
Финальная мысль
Junior DE — это профессия, в которую можно войти за 3-12 месяцев со стороны. Главное — систематичность и руки. Не учи теорию ради теории, делай руками. Этот капстон — твой первый production-style проект. Дальше будет ещё десять.
Удачи в собеседованиях. Если что-то непонятно по курсу — открой GitHub-репозиторий курса, напиши issue, или приходи в Telegram-группу. Сообщество слабее личной мотивации, но сильно ускоряет учёбу.
Попробуй сам
- Доделай свой капстон. Опубликуй в GitHub под публичной ссылкой.
- Напиши LinkedIn-пост: “Я только что закончил DE Fundamentals Course и build pet-project: …” — со скриншотом и ссылкой. Это начнёт твой professional footprint.
- Открой 5 вакансий “Junior Data Engineer” в твоём регионе. Сравни их требования со своим стеком — где гэпы? Это план учёбы на следующие 3 месяца.