🎯 Definicja

Deklaratywność (ang. declarativeness) to styl definiowania logiki programowej lub pipeline’ów, w którym użytkownik opisuje co chce osiągnąć, a nie jak to osiągnąć. Zamiast określania sekwencji kroków (kontroli przepływu), twórca deklaruje końcowy stan lub oczekiwany rezultat. To podejście znajduje szerokie zastosowanie w inżynierii danych, szczególnie w kontekście orkiestracji, płynności pipeline’ów, modelowania danych czy transformacji.

🔑 Kluczowe punkty

  • Opisuje cel, nie procedurę – zamiast „kroku po kroku”, opisujesz „co ma być uzyskane”.
  • Ułatwia automatyzację i optymalizację przez system – orchestrator lub silnik może dowolnie zaplanować wykonania.
  • Fundament funkcjonalnej inżynierii danych i czystych pipeline’ów.
  • Silny związek z testowalnością, kontrolą wersji i obserwowalnością danych.
  • Zbliżony do filozofii „Infrastructure as Code” czy „software-defined data”.

📚 Szczegółowe wyjaśnienie

Deklaratywność vs Imperatywność

CechaPodejście deklaratywnePodejście imperatywne
Co zamiast jak✔️ Opis „co ma być”❌ Instrukcja „jak to zrobić”
Automatyzacja i optymalizacja✔️ Engine sam wpina kroki❌ Ty musisz zdefiniować przepływ ręcznie
Debuggowanie i testowanie✔️ Jasne warunki końcowe❌ Skupienie na implementacji kroków
PrzykładDefinicja modelu w dbt (SELECT ...)DAG w Airflow ze zdefiniowaną sekwencją tasków
KodDSL, YAML, SQL, APIPython, Procedural Script

Deklaratywność w inżynierii danych

Przykłady deklaratywnego podejścia

  • dbt: definicje modeli w SQL – select definiuje produkowany zestaw danych, a orchestracja, zależności i cache obsługuje silnik.
  • Dagster SDA / Software-Defined Assets: deklaracja „ten asset powinien istnieć” – silnik decyduje, kiedy i jak go obliczyć.
  • Terraform: deklaracja stanu infrastruktury jako kod – zamiast imperatywnego skryptu deployującego instancje.
  • SQL: klasyczny przykład – zapytania opisują wynik, a nie algorytm wykonania.

Główne korzyści:

  • Powtarzalność – pipeline zawsze odtwarza te same wyniki bazując na definicji rezultatów.
  • 🔍 Obserwowalność i analiza błędów – łatwo ustalić, czego brakuje w oczekiwanych artefaktach (np. brak tabeli LTV_2024).
  • 📐 Skalowalność operacyjna – orchestratorzy rozumieją zależności i mogą optymalizować wykonanie.
  • 🛠️ Testowalność i audytowalność – deklaracje są izolowane i możliwe do wersjonowania w Git.

Node logic: “ten produkt danych powinien istnieć”

Tak opisuje się np. w Dagster, dbt, Cube lub Looker View:
Każda jednostka (asset, metryka, model) ma ściśle zdefiniowaną sygnaturę i zależności. Dzięki temu cała orkiestracja działa „wprzód” względem celu (target), a nie od zera jak w tradycyjnych DAG-ach.

💡 Przykład zastosowania

Zespół danych definiuje model customer_lifetime_value jako asset w Dagsterze przy użyciu dekoratora @asset. Funkcja deklaruje jedynie inputy i transformację (np. model ML, SQL). Orchestrator decyduje, kiedy i w jakiej kolejności uruchomić obliczenia (na podstawie potrzeb downstream i materiałizacji danych). Inżynierowie nie muszą już ręcznie zarządzać zadaniami — ważne jest tylko to, co powinno powstać i z jakich danych.

📌 Źródła

👽 Brudnopis

  • Deklaratywne = co, a nie jak
  • DSL, modele danych, asset-y, metryki – wszystkie opisane poprzez deklaracje
  • Imperatywne = zadania, kolejność, ręczne retry, kod proceduralny
  • Deklaratywność ≈ clean DAGs without orchestration logic
  • Otwarcie na Future-of-Work: samooptymalizujące się pipeline’y, mniej DevOps overhead
  • Zobacz też: Software-Defined Assets, Warstwa Miary, dbt, Cube, Dagster, Declarative Manifesto