DATA ENGINEER

Nadhif Fathoni Hafiz

I’m a data engineer based in Jakarta, currently at Krom Bank. I work on data pipelines, CDC streaming, and the day-to-day reliability of our data platform.

Currently
Data Engineer · Krom BankOctober 2025 — present
Previously
DANA · TelkomselData engineering internships
Based in
Jakarta, Indonesia

01 Projects

CLOUD LAKEHOUSE & ICEBERG01
GTFS + Lambda 60s micro-batch
S3 Tables (Iceberg) Managed compaction
dbt-athena Adherence marts
Airflow 3 (Fargate) Asset scheduling
Apache Iceberg (S3 Tables)Airflow 3 on Fargate100% Terraform

PERSONAL PROJECT • CLOUD LAKEHOUSE & ICEBERG

Transit Lakehouse

Scheduled micro-batch lakehouse capturing real-time transit telemetry into Apache Iceberg on Amazon S3 Tables. Orchestrated with Airflow 3 on AWS Fargate, transformed with dbt-athena, and provisioned with Terraform.

Apache IcebergAmazon S3 TablesAirflow 3AWS Fargatedbt-athenaTerraform
Deep dive & architecture

Open table format with Apache Iceberg: Stores transit telemetry in Amazon S3 Tables backed by the AWS Glue catalog. Demonstrates schema evolution across changing GTFS stop specifications, managed snapshot compaction, and metadata-driven partition pruning without maintenance decay.

Disciplined 60s micro-batching: Uses EventBridge and AWS Lambda to ingest raw protobuf GTFS-Realtime feeds every minute into immutable S3 partitions. A lightweight PyIceberg writer batches records directly into Iceberg tables, avoiding the operational bloat and cost of always-on streaming consumers.

Airflow 3 asset orchestration: Deploys Apache Airflow 3 on AWS Fargate using LocalExecutor, leveraging native asset-aware scheduling and blocking data freshness checks to trigger dbt-athena modeling runs only when new partitions land.

Targeting real feed pathologies: Profiles transit feed quirks before modeling: handling mid-trip vehicle signal dropouts, out-of-order telemetry coordinates, and real-time trips unlisted in static schedules.

Infrastructure as Code & cost invariants: Entire environment is provisioned via Terraform with a verified destroy path and zero hardcoded credentials (OIDC CI). Strict Athena workgroup byte-scan caps, S3 lifecycle expiration, and budget alarms act as asserted invariants to maintain a steady-state run cost under ~$13/month.

View on GitHub (opens in a new tab)
STREAMING CDC & LAKEHOUSE02
Postgres 17 WAL source
Debezium 3.6 Row changes
Kafka KRaft Event stream
DuckDB + dbt SCD2 marts
639,764 change events88 tests passing18s in CI

PERSONAL PROJECT • STREAMING & SCD TYPE 2

CDC Lakehouse

Change data capture from an OLTP database into a dimensional warehouse with SCD Type 2 history. Replays verified e-commerce mutations with strict LSN monotonic ordering and verified state reconciliation.

Postgres 17Debezium 3.6Kafka 4.3 (KRaft)dbtDuckDBDocker Compose
Deep dive & architecture

Real change history: Replays 295,272 status transitions and 259 customer address changes reconstructed from the Olist dataset rather than fabricated mutations, keeping history faithful to actual events.

SCD2 time & ordering: Solved temporal window collapse during replay by pairing Postgres LSN for strict monotonic ordering with updated_at for business validity. Validity windows are clamped non-decreasing with running maximums and flagged on 1,443 rows rather than silenced.

Restraint in modeling: Deliberately kept seller and product dimensions as SCD Type 1 after data profiling proved zero attribute drift. Built SCD Type 2 on customer_unique_id (the real individual) rather than per-order aliases, resolving 317 fact rows to historical addresses.

Resilient CDC testing: 88 data tests run on dbt build to enforce exactly one current version per key, seamless validity windows without gaps/overlaps, and non-fanning as-of joins. Upstream assertions verify Kafka offsets match Postgres rows and pin gross revenue to the cent.

Columnar performance: Arrow columnar batching and registered views reduced DuckDB event load time from 25 minutes down to 18 seconds in CI.

View on GitHub (opens in a new tab)
BATCH LAKEHOUSE03
NYC S3 / Parquet Monthly files
Dagster Quality gate
dbt Core Star schema
DuckDB Tested marts
4,008,943 trips39 data tests1:1 defect-flagged

PERSONAL PROJECT • NYC BIKE-SHARE ANALYTICS

Citi Bike Lakehouse

Monthly-partitioned batch analytics over NYC bike-share data. Dagster orchestrates ingestion with blocking quality gates into DuckDB, while dbt builds a verified star schema and dimensional marts.

Dagsterdbt CoreDuckDBPythonParquetData Tests
Deep dive & architecture

Flag defects, don't delete them: Corrupt and outlying rows (null coordinates, trips > 24h, off-month boundary records) carry explicit boolean flags rather than being silently filtered out, ensuring the fact table reconciles 1:1 with source records.

Blocking quality gate: Dagster asset checks validate partition non-emptiness and partition boundary conformance before dbt runs, halting the pipeline if an anomaly is detected.

Source-aligned scheduling: Scheduled at 06:00 on the 5th of each month to reflect Citi Bike's actual publishing cadence and prevent 404 ingest failures.

Tested invariants: 39 data tests guarantee fact counts equal landed source rows, daily aggregates sum cleanly to facts without join fan-out, and defect flags match their underlying conditions.

Engine portability: Decoupled Parquet landing zone and zero engine-specific DDL allow seamless re-targeting to Snowflake or BigQuery without downloading ~370 MB/month again.

View on GitHub (opens in a new tab)
AZURE & DELTA LAKEHOUSE04
Ergast API + ADF Scheduled ingest
ADLS Gen2 Bronze raw layer
Azure Databricks PySpark Delta
Delta Lake Championship marts
70+ seasons F1 dataBronze / Silver / GoldADF parameterized

PERSONAL PROJECT • AZURE & DELTA LAKEHOUSE

Formula 1 Data Pipeline

End-to-end lakehouse processing 70+ seasons of historical Formula 1 racing telemetry. Orchestrated with Azure Data Factory into ADLS Gen2, transformed with PySpark on Azure Databricks into Delta Lake marts.

Azure DatabricksPySparkAzure Data FactoryDelta LakeADLS Gen2Power BI
Deep dive & architecture

Medallion lakehouse architecture: Ingests raw multi-format JSON and CSV files from the Ergast API into Bronze ADLS Gen2 storage. Transforms and cleanses relational entities into Silver Delta tables with strict schema validation, before publishing aggregated driver and constructor standings to Gold marts.

Incremental loads & ACID merges: Implemented incremental ingestion patterns using Delta Lake MERGE operations on high-volume race tables (lap times, pit stops, and qualifying sessions), preventing full-table rewrites while supporting ACID transactions and historical time travel.

PySpark window analytics: Engineered complex windowing functions and aggregations in Azure Databricks to calculate cumulative race points, podium finishes, and fastest-lap statistics across 70+ seasons of Formula 1 racing history.

ADF pipeline orchestration: Parameterized Azure Data Factory pipelines to dynamically pass race season and round parameters to Databricks notebook activities, automating Sunday post-race execution with failure alerting and automated retry triggers.

Cloud security & storage governance: Mounted Azure Data Lake Storage Gen2 securely into Databricks clusters using Azure Key Vault secrets and Service Principal OAuth authentication, keeping credentials completely decoupled from notebook code.

View on GitHub (opens in a new tab)

02 Experience

Download CV

Krom Bank

Data Engineer

CURRENT

OCT 2025 — PRESENT / JAKARTA, INDONESIA

  • Modernized ETL and CDC ingestion through reusable, config-driven architectures.
  • Built a severity framework for 500+ Airflow DAGs with Sev1–Sev4 SLAs and alert routing, reducing critical incident triage time by ~45%.
  • Evaluated ClickHouse for fraud analytics and created GCP, Airflow, and dbt dashboards for platform performance, cost, and usage.

DANA

Data Engineer Intern

JUL 2024 — OCT 2025 / JAKARTA, INDONESIA

  • Developed and maintained 50+ production pipelines using Apache Airflow and Alibaba MaxCompute.
  • Built compute and cost monitoring that improved incident response by 60% and reduced unexpected compute costs by 15%.
  • Supported dimensional remodeling of data marts serving ~80% of business needs.

Telkomsel

Data Engineer Intern

FEB 2024 — JUN 2024 / JAKARTA, INDONESIA

  • Built an end-to-end MySQL-to-warehouse pipeline with Apache Airflow for the Radio Transport Power Engineering division.
  • Improved planning and tracking efficiency by 80% through automated delivery to Power BI dashboards, Telegram bots, and reporting tools.

03 About me

I started in data engineering through internships at Telkomsel and DANA, then joined Krom Bank in 2025.

A lot of my work is improving systems that already exist: untangling ETL scripts, tuning ingestion, and making it easier to spot problems when something breaks.

Bachelor of Computer ScienceBINUS University · 2021–2025GPA 3.66 / 4.00

Technical skills

Languages & foundations

PythonSQLBashGit

Data & orchestration

Apache AirflowdbtConfluentBigQueryClickHouseMaxComputePostgreSQL

Cloud & infrastructure

Google CloudAlibaba CloudDockerKubernetes

Project toolkit

Azure Data FactoryDatabricksApache SparkADLS

Contact

You can reach me by email or on LinkedIn.