Deploy ≠ Release
Feature flag (atau feature toggle) memisahkan kapan kode di-deploy dari kapan user mendapat fitur. Kode bisa sudah ada di production, tapi disembunyikan di balik flag. Saat siap, flip flag → fitur live, tanpa deploy ulang.
Contoh Dasar
// Tanpa feature flag
function Checkout() {
return <NewCheckoutFlow />; // langsung semua user dapat
}
// Dengan feature flag
function Checkout({ user }) {
if (flags.isEnabled("new_checkout", user)) {
return <NewCheckoutFlow />;
}
return <OldCheckoutFlow />;
}
Use Case 1: Kill Switch
Fitur baru di production tiba-tiba bikin error spike. Daripada rollback deploy (5-15 menit), flip flag → fitur mati dalam detik. Error hilang, tim debug dengan tenang.
// Backend
if (!flags.isEnabled("new_payment_provider")) {
return legacyPayment.charge(amount);
}
return newPaymentProvider.charge(amount);
// Flip flag di dashboard → instant rollback tanpa deploy
Use Case 2: Percentage Rollout
Deploy fitur baru, aktifkan untuk 5% user dulu. Monitor error rate, latency, conversion. Jika sehat → naikkan ke 20%, 50%, 100%. Jika bermasalah → turunkan ke 0%.
# Dashboard flag provider
feature: new_search_algorithm
rollout:
- environment: production
percentage: 5 # 5% traffic random
sticky: true # user yang sudah masuk grup, tetap di grup
Hash user ID → percentage → stable. User yang pertama dapat fitur, selalu dapat (bukan flip tiap request).
Use Case 3: Targeted Rollout
Aktifkan fitur hanya untuk segment tertentu — tim internal, beta tester, user tertentu, region tertentu.
# Rules di dashboard
target:
- segment: internal_employees
enabled: true
- segment: beta_testers
enabled: true
- attribute: user.plan
equals: "enterprise"
enabled: true
- default: false
Cocok untuk canary internal: tim product/engineering pakai dulu selama seminggu sebelum launch publik.
Use Case 4: A/B Testing
Feature flag adalah pondasi A/B test — bagi user ke variant A dan B, ukur metric bisnis (conversion rate, revenue per user). Bedakan dari rollout:
- Rollout — tujuan: deploy aman. A identik dengan old, B identik dengan new
- A/B test — tujuan: belajar. A dan B adalah dua ide, pilih yang menang berdasarkan data
Provider Populer
- LaunchDarkly — market leader, fitur lengkap, enterprise-focused
- PostHog — open source option, product analytics + feature flag
- Unleash — open source, self-host, lightweight
- Flagsmith — open source + managed SaaS, friendly pricing
- Split.io — fokus di experimentation
- Statsig — fokus di product experimentation
- ConfigCat — simpel, developer-friendly
Provider menyediakan: SDK untuk app, dashboard untuk config, evaluasi real-time, audit log, targeting rules.
Pairing dengan Trunk-Based Development
Feature flag memungkinkan trunk-based development: semua orang commit ke main, tidak ada long-lived feature branch. Fitur setengah jadi di-merge dengan flag OFF — tidak visible untuk user tapi kode integrated. Saat siap → flip flag ON.
- Tidak ada merge hell dari branch umur 2 minggu
- Semua fitur terus terintegrasi — bug dari integrasi muncul lebih awal
- Deploy lebih sering karena tidak ada "big bang release"
Flag Debt & Cleanup
Masalah umum: flag dibuat untuk rollout, setelah 100% on selama 2 bulan, flag masih ada di kode. Jumlah flag bertambah terus → kode berantakan, conditional bercabang, test suite lambat.
# Kode jadi begini setelah 50 flag lama:
if (flags.isEnabled("feature_a")) {
if (flags.isEnabled("feature_b")) {
if (flags.isEnabled("feature_c")) {
// kombinasi yang sulit di-test
}
}
}
Best practice:
- Tag flag dengan lifetime: permanent (kill switch, config) vs temporary (rollout, experiment)
- Auto-expire: flag rollout otomatis flagged untuk cleanup setelah 30 hari at 100%
- Issue tracking: buat ticket cleanup saat flag dibuat
- Dashboard hygiene: review flag tiap sprint, hapus yang sudah tidak dipakai
Trade-offs yang Harus Dipahami
- Kompleksitas kode — branching di kode + config di dashboard = dua sumber truth
- Test coverage — perlu test kedua cabang (flag on + off). Test matrix bisa eksplosif dengan banyak flag
- Latency SDK — evaluasi flag harus cepat (<5ms). Provider bagus cache di memory + update lewat stream
- Cost — SaaS flag provider berbayar per MAU, bisa mahal di skala besar