Table of Contents
▼- Apa Itu Feature Flag dan Kenapa Penting?
- Arsitektur Dasar Feature Flag System
- Implementasi Feature Flag System dengan PHP
- Best Practices Feature Flag Management
- Progressive Rollout Strategy
- Feature Flag untuk A/B Testing
- Dashboard Untuk Non-Technical Team
- Kesalahan Umum yang Harus Dihindari
- Tool dan Library Feature Flag yang Bisa Digunakan
- Kesimpulan
Pernahkah kamu deploy fitur baru ke production, lalu tiba-tiba ada bug critical yang bikin panik?
Atau mungkin kamu ingin release fitur secara bertahap ke user tertentu dulu sebelum diluncurkan ke semua orang?
Feature flag atau feature toggle adalah solusinya.
Sistem ini memungkinkan kamu mengontrol fitur aplikasi secara real-time tanpa harus deploy ulang atau rollback code.
Di artikel ini, kita akan membahas cara membangun feature flag system yang simpel tapi powerful untuk meningkatkan keamanan deployment dan fleksibilitas release management.
Apa Itu Feature Flag dan Kenapa Penting?
Feature flag adalah teknik development yang memisahkan code deployment dari feature release.
Dengan feature flag, kamu bisa deploy code ke production dalam kondisi "mati" atau hidden, lalu mengaktifkannya kapan saja tanpa deploy ulang.
Bayangkan seperti saklar lampu di rumah.
Instalasi kabel listriknya sudah selesai (code sudah di-deploy), tapi lampunya baru menyala ketika kamu menekan saklar (flag diaktifkan).
Manfaat Utama Feature Flag
Ada beberapa alasan kenapa tim development modern menggunakan feature flag:
- Deployment lebih aman karena fitur baru bisa dimatikan instant jika ada masalah
- Progressive rollout memungkinkan release bertahap ke persentase user tertentu
- A/B testing jadi lebih mudah dengan mengaktifkan variasi fitur untuk user berbeda
- Trunk-based development bisa diterapkan tanpa takut code belum siap masuk ke main branch
- Kill switch untuk mematikan fitur yang bermasalah tanpa rollback deployment
- Canary deployment untuk test fitur di production environment dengan traffic terbatas
Feature flag sudah digunakan oleh perusahaan tech besar seperti Facebook, Netflix, dan Google untuk mengelola ribuan fitur secara bersamaan.
Arsitektur Dasar Feature Flag System
Sebelum mulai coding, kita perlu memahami komponen-komponen dalam feature flag system.
Ada tiga layer utama yang perlu dibangun:
1. Storage Layer
Layer ini menyimpan konfigurasi feature flag.
Bisa menggunakan database, Redis, atau file konfigurasi tergantung kebutuhan performance dan skalabilitas.
Struktur data minimal yang diperlukan:
{
"feature_key": "new_checkout_flow",
"enabled": true,
"description": "Checkout flow dengan one-click payment",
"created_at": "2026-07-01T10:00:00Z",
"updated_at": "2026-07-05T15:30:00Z",
"rollout_percentage": 25,
"user_whitelist": ["user_123", "user_456"],
"environment": "production"
}2. Evaluation Layer
Layer ini menentukan apakah sebuah flag harus aktif atau tidak untuk user tertentu.
Di sini logika targeting dan rollout percentage dievaluasi.
Misalnya, jika rollout_percentage adalah 25%, maka sistem akan mengaktifkan fitur hanya untuk 25% user secara random tapi konsisten.
3. SDK/Client Layer
Layer ini adalah interface yang digunakan developer untuk mengecek status flag di dalam code.
API-nya harus sederhana dan mudah diintegrasikan ke berbagai bagian aplikasi.
Implementasi Feature Flag System dengan PHP
Mari kita bangun feature flag system sederhana menggunakan PHP dan MySQL.
Implementasi ini bisa digunakan di project Laravel, CodeIgniter, atau PHP native.
Step 1: Buat Database Schema
Pertama, kita buat tabel untuk menyimpan konfigurasi feature flag.
CREATE TABLE feature_flags (
id INT AUTO_INCREMENT PRIMARY KEY,
feature_key VARCHAR(100) UNIQUE NOT NULL,
enabled BOOLEAN DEFAULT FALSE,
description TEXT,
rollout_percentage INT DEFAULT 0,
user_whitelist JSON,
environment VARCHAR(50) DEFAULT 'production',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_feature_key (feature_key),
INDEX idx_enabled (enabled)
);Untuk logging perubahan flag, kita juga buat tabel audit:
CREATE TABLE feature_flag_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
feature_key VARCHAR(100) NOT NULL,
action VARCHAR(50) NOT NULL,
old_value JSON,
new_value JSON,
changed_by VARCHAR(100),
changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_feature_key (feature_key)
);Step 2: Buat Feature Flag Manager Class
Sekarang kita buat class utama untuk mengelola feature flag.
<?php
class FeatureFlagManager {
private $db;
private $cache = [];
private $cacheTTL = 300; // 5 minutes
public function __construct($dbConnection) {
$this->db = $dbConnection;
}
public function isEnabled($featureKey, $userId = null, $context = []) {
// Check cache first
$cacheKey = $this->getCacheKey($featureKey, $userId);
if (isset($this->cache[$cacheKey])) {
return $this->cache[$cacheKey];
}
// Fetch flag configuration
$flag = $this->getFlag($featureKey);
if (!$flag || !$flag['enabled']) {
$this->cache[$cacheKey] = false;
return false;
}
// Check user whitelist
if ($userId && $this->isUserWhitelisted($flag, $userId)) {
$this->cache[$cacheKey] = true;
return true;
}
// Check rollout percentage
if ($this->shouldEnableByRollout($flag, $userId)) {
$this->cache[$cacheKey] = true;
return true;
}
$this->cache[$cacheKey] = false;
return false;
}
private function getFlag($featureKey) {
$stmt = $this->db->prepare(
"SELECT * FROM feature_flags WHERE feature_key = ? LIMIT 1"
);
$stmt->execute([$featureKey]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
private function isUserWhitelisted($flag, $userId) {
if (empty($flag['user_whitelist'])) {
return false;
}
$whitelist = json_decode($flag['user_whitelist'], true);
return in_array($userId, $whitelist);
}
private function shouldEnableByRollout($flag, $userId) {
$percentage = $flag['rollout_percentage'];
if ($percentage >= 100) {
return true;
}
if ($percentage db->prepare(
"UPDATE feature_flags SET enabled = TRUE,
rollout_percentage = ? WHERE feature_key = ?"
);
$stmt->execute([$percentage, $featureKey]);
$this->clearCache();
$this->logChange($featureKey, 'enable', ['percentage' => $percentage]);
}
public function disable($featureKey) {
$stmt = $this->db->prepare(
"UPDATE feature_flags SET enabled = FALSE WHERE feature_key = ?"
);
$stmt->execute([$featureKey]);
$this->clearCache();
$this->logChange($featureKey, 'disable');
}
private function clearCache() {
$this->cache = [];
}
private function logChange($featureKey, $action, $data = []) {
$stmt = $this->db->prepare(
"INSERT INTO feature_flag_logs (feature_key, action, new_value, changed_by)
VALUES (?, ?, ?, ?)"
);
$stmt->execute([
$featureKey,
$action,
json_encode($data),
$_SERVER['REMOTE_USER'] ?? 'system'
]);
}
}Class ini sudah include caching sederhana untuk menghindari query database yang berlebihan.
Kesulitan dengan tugas programming atau butuh bantuan coding? KerjaKode siap membantu menyelesaikan tugas IT dan teknik informatika Anda. Dapatkan bantuan profesional di jasa tugas IT KerjaKode.
Step 3: Integrasikan ke Aplikasi
Sekarang kita bisa menggunakan feature flag di berbagai bagian aplikasi.
<?php
// Inisialisasi
$flagManager = new FeatureFlagManager($pdoConnection);
// Check flag di controller atau business logic
if ($flagManager->isEnabled('new_checkout_flow', $currentUserId)) {
// Gunakan checkout flow yang baru
return $this->newCheckoutProcess($cart);
} else {
// Gunakan checkout flow yang lama
return $this->legacyCheckoutProcess($cart);
}
// Contoh untuk A/B testing
if ($flagManager->isEnabled('dark_mode_ui', $currentUserId)) {
$theme = 'dark';
} else {
$theme = 'light';
}
// Feature flag untuk toggle fitur premium
if ($flagManager->isEnabled('premium_analytics', $currentUserId)) {
$data['analytics'] = $this->getPremiumAnalytics();
}Best Practices Feature Flag Management
Membangun sistem feature flag hanyalah langkah pertama.
Yang lebih penting adalah bagaimana mengelolanya dengan baik agar tidak jadi technical debt.
1. Gunakan Naming Convention yang Jelas
Berikan nama flag yang deskriptif dan mudah dipahami.
Hindari nama seperti flag_1 atau new_feature.
Contoh naming yang baik:
checkout_one_click_paymentanalytics_realtime_dashboardui_dark_modeapi_v2_endpoints
2. Dokumentasikan Setiap Flag
Setiap feature flag harus punya dokumentasi minimal:
- Tujuan flag dibuat
- Siapa yang bertanggung jawab
- Kapan flag akan dihapus
- Dependencies dengan flag lain
Buat simple dashboard atau spreadsheet untuk tracking ini.
3. Set Expiration Date untuk Flag
Flag yang sudah tidak terpakai harus segera dihapus.
Tambahkan kolom expires_at di database dan buat automated alert ketika flag sudah kadaluarsa.
ALTER TABLE feature_flags ADD COLUMN expires_at DATE;Buat cron job untuk notifikasi flag yang sudah expired:
SELECT feature_key, description, expires_at
FROM feature_flags
WHERE expires_at 4. Hindari Feature Flag Bersarang
Jangan membuat kondisi flag di dalam flag lain karena akan sulit di-maintain.
// JANGAN seperti ini
if ($flagManager->isEnabled('feature_a')) {
if ($flagManager->isEnabled('feature_b')) {
if ($flagManager->isEnabled('feature_c')) {
// Code disini jadi sangat kompleks
}
}
}Lebih baik buat flag kombinasi atau refactor logic-nya.
5. Monitor Performa Flag Evaluation
Checking flag tidak boleh jadi bottleneck performance.
Gunakan caching layer seperti Redis atau Memcached untuk production environment.
<?php
class CachedFeatureFlagManager extends FeatureFlagManager {
private $redis;
public function __construct($dbConnection, $redisConnection) {
parent::__construct($dbConnection);
$this->redis = $redisConnection;
}
public function isEnabled($featureKey, $userId = null, $context = []) {
$cacheKey = "flag:{$featureKey}:" . ($userId ?? 'all');
// Check Redis first
$cached = $this->redis->get($cacheKey);
if ($cached !== false) {
return (bool) $cached;
}
// Fallback to parent method
$result = parent::isEnabled($featureKey, $userId, $context);
// Cache for 5 minutes
$this->redis->setex($cacheKey, 300, (int) $result);
return $result;
}
}Progressive Rollout Strategy
Salah satu kekuatan feature flag adalah kemampuan untuk rollout bertahap.
Ini sangat berguna untuk mengurangi risk ketika release fitur besar.
Phase 1: Internal Testing (0-5%)
Aktifkan flag hanya untuk internal team dan beta tester.
$flagManager->enable('new_search_algorithm', 5);
// Hanya 5% user yang akan melihat fitur iniPhase 2: Canary Release (5-25%)
Jika tidak ada masalah, tingkatkan ke 25% user.
Monitor metrics seperti error rate, response time, dan user behavior.
Phase 3: Gradual Rollout (25-75%)
Tingkatkan secara bertahap sambil monitoring.
Jika ada issue, kamu bisa rollback percentage atau disable flag sepenuhnya.
Phase 4: Full Release (100%)
Setelah yakin fitur stable, aktifkan untuk semua user.
Tunggu beberapa hari untuk memastikan tidak ada edge case.
Phase 5: Cleanup
Setelah 100% rollout berhasil dan fitur sudah stable, hapus flag dari codebase.
Ini penting untuk menghindari code yang penuh dengan flag yang sudah tidak terpakai.
Feature Flag untuk A/B Testing
Feature flag juga bisa digunakan untuk A/B testing sederhana.
Kamu bisa membuat dua variasi fitur dan mengalokasikan user secara random.
<?php
class ABTestingFlag extends FeatureFlagManager {
public function getVariant($featureKey, $userId) {
// Gunakan hash konsisten untuk assign variant
$hash = crc32($featureKey . $userId);
$variant = $hash % 2 == 0 ? 'A' : 'B';
// Log variant assignment untuk analytics
$this->logVariantAssignment($featureKey, $userId, $variant);
return $variant;
}
private function logVariantAssignment($feature, $user, $variant) {
// Simpan ke analytics database
// Untuk tracking conversion rate per variant
}
}Dengan ini, kamu bisa test dua versi fitur secara bersamaan dan measure mana yang lebih baik berdasarkan metrics.
Dashboard Untuk Non-Technical Team
Feature flag akan lebih powerful jika team non-technical (Product Manager, Marketing) juga bisa mengontrolnya.
Buat dashboard sederhana dengan fitur:
- List semua flag dengan status enabled/disabled
- Toggle switch untuk enable/disable flag
- Slider untuk adjust rollout percentage
- History log siapa yang mengubah flag
- Search dan filter berdasarkan environment
Dashboard ini bisa dibuat dengan framework frontend favorit kamu atau bahkan plain HTML + JavaScript dengan AJAX untuk update flag secara real-time.
Kesalahan Umum yang Harus Dihindari
Berdasarkan pengalaman tim development yang sudah menggunakan feature flag, ada beberapa pitfall yang sering terjadi:
1. Lupa Menghapus Flag yang Sudah Tidak Terpakai
Ini adalah masalah paling umum.
Flag yang dibiarkan bertahun-tahun akan membuat codebase sulit dibaca dan di-maintain.
Set reminder atau automated task untuk cleanup flag secara berkala.
2. Terlalu Banyak Flag
Tidak semua fitur perlu flag.
Gunakan feature flag hanya untuk:
- Fitur besar yang risky
- Eksperimen atau A/B test
- Fitur yang butuh gradual rollout
- Feature yang mungkin perlu di-kill switch
Fitur kecil yang sudah pasti stable tidak perlu flag.
3. Tidak Ada Monitoring Flag Performance
Flag evaluation yang lambat bisa bikin aplikasi lemot.
Selalu monitor berapa lama waktu yang dibutuhkan untuk evaluate flag dan pastikan ada caching layer yang proper.
4. Flag Configuration Tidak Ter-version
Simpan history perubahan flag configuration.
Ini berguna untuk debugging ketika ada issue setelah flag diubah.
Tool dan Library Feature Flag yang Bisa Digunakan
Jika tidak ingin build dari scratch, ada beberapa tool yang bisa digunakan:
Self-Hosted Solutions
- Unleash: Open source feature flag platform dengan dashboard dan SDK untuk berbagai bahasa
- Flagsmith: Feature flag dan remote config management dengan UI yang user-friendly
- GrowthBook: Open source platform untuk feature flag dan A/B testing dengan analytics built-in
SaaS Solutions
- LaunchDarkly: Platform feature flag enterprise dengan advanced targeting dan analytics
- Split.io: Feature delivery platform dengan fokus pada A/B testing dan experimentation
- ConfigCat: Simple feature flag service dengan pricing yang affordable
Pilih solution berdasarkan budget, scale, dan requirement tim kamu.
Kesimpulan
Feature flag adalah teknik yang powerful untuk meningkatkan deployment safety dan flexibility dalam release management.
Dengan implementasi yang tepat, kamu bisa:
- Deploy code dengan lebih percaya diri
- Rollback fitur bermasalah tanpa deploy ulang
- Test fitur di production dengan controlled exposure
- Melakukan A/B testing dengan mudah
- Memberikan kontrol release kepada non-technical team
Yang paling penting, jangan lupa untuk cleanup flag yang sudah tidak terpakai.
Feature flag yang menumpuk akan jadi technical debt yang memperlambat development di masa depan.
Mulai dari implementasi sederhana seperti yang kita bahas di artikel ini, lalu improve seiring bertambahnya kebutuhan.
Happy coding dan deployment yang lebih aman!