Sebuah angka di dashboard — misalnya total pendapatan hari ini — tidak muncul begitu saja. Angka tersebut adalah ujung dari perjalanan panjang: data diciptakan di aplikasi, dikumpulkan, disimpan, dibersihkan, digabungkan, lalu disajikan; dan pada akhirnya data lama diarsipkan atau dihapus. Rangkaian perjalanan itu disebut siklus hidup data (data lifecycle). Memahami tahapannya adalah cara tercepat memahami pekerjaan data engineering, karena setiap tahap adalah wilayah yang harus dirancang, dibangun, dan dijaga. Pada chapter ini kita akan menelusuri seluruh tahapan tersebut, mengujinya lewat simulasi mini, dan membahas tahapan yang paling sering terlewat.

Tahapan dalam Siklus Hidup Data #

Diagram berikut memetakan tahapan siklus hidup data beserta alurnya:

Mari kita bedah setiap tahap pada diagram di atas:

  • Generation: data diciptakan — transaksi dicatat di database aplikasi, klik direkam di log, sensor mengirim pembacaan. Data engineer tidak mengendalikan tahap ini, tetapi wajib memahami bentuk datanya.
  • Ingestion: data ditarik atau diterima dari sumber — lewat job terjadwal, event streaming, atau berkas yang diunggah. Tahap ini menentukan seberapa segar data yang tersedia di hilir.
  • Storage: data mentah disimpan apa adanya di layer raw — biasanya object storage atau data lake — sebagai bukti yang bisa diulang kapan pun.
  • Transformation: data dibersihkan, divalidasi, dideduplikasi, dan digabungkan menjadi tabel yang siap dipakai.
  • Serving: data siap pakai disajikan dalam bentuk tabel warehouse, view, atau API agar konsumen tinggal mengakses.
  • Consumption: konsumen memakai data — dashboard, laporan, model machine learning, hingga aplikasi lain.
  • Archival dan deletion: data tua dipindah ke penyimpanan murah, lalu dihapus setelah melewati masa retensi yang ditetapkan kebijakan.

Simulasi Mini dalam Satu Program #

Konsep di atas akan lebih mudah dipahami kalau kita lihat berjalan. Program berikut mensimulasikan siklus hidup data dalam skala kecil: setiap tahap direpresentasikan satu fungsi, dan output satu tahap menjadi input tahap berikutnya.

python
# Tahap 1 — generation: event yang dihasilkan aplikasi
event_mentah = [
    "Budi,login,08:00:12",
    "Siti,login,08:00:45",
    "Budi,view_produk,08:01:03",
    "Dewi,view_produk,08:02:20",
    "Budi,checkout,08:03:41",
    "Siti,checkout,08:04:02",
    "Dewi,checkout,08:05:19",
]

def ingest(baris_mentah):
    """Tahap ingestion: kumpulkan data mentah apa adanya."""
    return [b.split(",") for b in baris_mentah]

def validate(event):
    """Tahap validasi: baris wajib punya 3 kolom dan aksi dikenal."""
    aksi_valid = {"login", "view_produk", "checkout"}
    return [e for e in event if len(e) == 3 and e[1] in aksi_valid]

def transform(event):
    """Tahap transformasi: hitung jumlah aksi per pengguna."""
    hasil = {}
    for pengguna, aksi, _ in event:
        hasil.setdefault(pengguna, {"login": 0, "view_produk": 0, "checkout": 0})
        hasil[pengguna][aksi] += 1
    return hasil

def serve(ringkasan):
    """Tahap serving: sajikan laporan untuk konsumen data."""
    for pengguna, aksi in sorted(ringkasan.items()):
        total = sum(aksi.values())
        print(f"{pengguna}: {total} aksi ({aksi['checkout']} checkout)")

# Pipeline: output satu tahap menjadi input tahap berikutnya
ringkasan = transform(validate(ingest(event_mentah)))
serve(ringkasan)

Output yang Dihasilkan:

text
Budi: 3 aksi (1 checkout)
Dewi: 2 aksi (1 checkout)
Siti: 2 aksi (1 checkout)

Mari kita telaah baris-baris kode di atas:

  1. Baris 2-10 (event_mentah = [...]): tahap generation — aplikasi menghasilkan event mentah berformat teks dengan pemisah koma.
  2. Baris 12-14 (def ingest): tahap ingestion memecah setiap baris menjadi kolom tanpa mengubah isinya — prinsip yang sama dengan menyimpan data mentah di layer raw.
  3. Baris 16-19 (def validate): tahap validasi menyaring baris cacat — kolom kurang dari tiga atau aksi tidak dikenal — sebelum masuk transformasi.
  4. Baris 21-27 (def transform): tahap transformasi mengubah bentuk data dari daftar event menjadi ringkasan per pengguna — analogi tabel agregat di warehouse.
  5. Baris 35-37 (ringkasan = transform(validate(ingest(...)))): ketiga fungsi dirangkai menjadi satu pipeline; urutan pemanggilan dibaca dari dalam ke luar.

Tahapan yang Sering Terlewat #

Dua tahap terakhir pada diagram — archival dan deletion — hampir tidak pernah dibahas di tutorial, padahal keduanya menentukan kepatuhan dan biaya. Kebijakan retensi data transaksi, misalnya, mungkin mewajibkan data mentah disimpan lima tahun untuk keperluan audit; setelah itu data harus bisa dihapus secara terverifikasi. Merancang hal ini sejak awal jauh lebih murah daripada menata ulang tata letak storage yang sudah penuh.

Tahap lain yang sering luput adalah lineage: dokumentasi asal-usul setiap tabel — dari sumber mana, melewati transformasi apa, dijadwalkan oleh siapa. Lineage membuat penyelidikan insiden berjalan menelusuri ke hulu, bukan menebak-nebak. Praktik ini didukung tools kualitas seperti Great Expectations untuk gerbang validasi dan dbt yang menghasilkan dokumentasi lineage otomatis untuk transformasi SQL.

Perlu dicatat bahwa siklus ini berulang, bukan garis lurus sekali jalan. Konsumsi data memunculkan pertanyaan baru, pertanyaan memunculkan sumber data baru, dan siklus dimulai lagi. Bagaimana seluruh tahapan tersebut disusun menjadi satu kesatuan sistem adalah pokok bahasan chapter berikutnya: Arsitektur Sistem Data.