Feature Flag Nedir? Deployment ve Release'i Ayıran Karar

Summary

Feature flag'ler, yeni bir build göndermeden uygulamanızdaki kod yollarını kullanıcı ve ortam bazında kontrol etmenizi sağlar. Deployment ile release'i iki ayrı olaya dönüştürürler: kod prod'da hareketsiz bekler, SLO bütçesi yeşil kaldıkça yüzdesel olarak açılır. Bir şeyler yanlış giderse flag kapatılır ve incident önlenir. %1 trafikten başlayan aşamalı rollout, blast radius'u dakikalar içinde kurtarılabilir boyuta indirger. Kill switch tasarımı ve flag borcu yönetimi bu mimarinin iki kritik bileşenidir.

Feature flag toggle düğmeleri ve deployment pipeline şeması, koyu mavi arka planda

Feature flag nedir? Yeni bir build göndermeden, uygulamanızdaki belirli kod yollarını kullanıcı, oturum ya da ortam bazında kontrol etmenizi sağlayan koşullu denetimlerdir. new_checkout_flow adlı bir flag, kullanıcı tabanınızın %99'unda false olarak ayarlanmışsa o kodu iki hafta önce deploy ettiniz demektir; henüz açmadınız. Bu mekanizmanın kurduğu sözleşme nettir: deployment ve release iki ayrı olay haline gelir. Sürekli deployment yapan, 50 ila 500 mühendislik ekibinin çalıştığı her organizasyon için bu sözleşme, mimari açıdan yük taşıyan bir karardır. Feature flag piyasası 2024'te 1,45 milyar dolar değerindeydi; 2033'e kadar 5,19 milyar dolara büyümesi öngörülüyor (Zylos Research, 2026). Progressive deployment tekniklerini benimseyen kurumların %78'i deployment güveninde artış bildiriyor. Araç, büyümüştür. Mimari disiplin henüz aynı hızda değil.

Deployment ile Release Aynı Olay Değildir

Çoğu ekip bu farkı kötü bir rollout'tan sonra öğrenir. Bir özellik Salı öğleden sonra prod'a çıkar, Çarşamba sabahı request trace'inde bir şeyler farklı davranmaya başlar; birisi soruşturma açtığında diff dört commit'i ve iki servis sınırını kapsamaktadır. Bu senaryoda nedensellik kurmak gerçekten zordur.

Feature flag'ler bu soruna zorunlu bir hassasiyet getirir. Bir flag'in arkasındaki kod merge edilip deploy edildiğinde prod'da hareketsiz kalır. Deploy'un başarılı olduğunu doğrularsınız, birkaç saat ya da gün boyunca baseline metrikleri izlersiniz ve hiçbir şeyin bozulmadığını kontrol edersiniz. Ardından flag'i trafiğin %1'i için açarsınız. Artık tek bir atfedilebilir değişkeniniz vardır. Flag'li yolda hata oranı yükseliyorsa bir kod diff'ini debug etmiyorsunuzdur. Bir config değerini toggle ediyorsunuzdur.

Bu ayrım öncelikle bir hız argümanı değildir. Bir blast radius argümanıdır. Oturumların %1'ini etkileyen ve yanlış giden bir release dakikalar içinde kurtarılabilir. %100'ünü etkileyen ve yanlış giden bir release büyük bir incident'tır.

TypeScript'te flag değerlendirmesi kabaca şöyle görünür:

const showNewCheckoutFlow = flagClient.variation(
  'new_checkout_flow',
  { userKey: session.userId, custom: { plan: user.plan } },
  false // flag servisi ulaşılamaz durumdaysa varsayılan
);

if (showNewCheckoutFlow) {
  return renderNewFlow(cart);
}
return renderLegacyFlow(cart);

false varsayılanı bir formalite değildir. Flag değerlendirme servisi network bölünmesi yaşarsa kullanıcılarınızın alacağı davranış budur. Kasıtsız değil, kasıtlı olarak tanımlayın.

Prod'da Gerçekten Önemli Olan Dört Flag Tipi

Tüm feature flag'ler aynı operasyonel amaca hizmet etmez. Bunları kod tabanınızda ve yönetim araçlarınızda özdeş biçimde ele almak; incident sürecinde karışıklığa ve flag borcu birikimine güvenilir bir yol açar.

Release flag'leri, geliştirme ve rollout sırasında yeni özellikleri kilitler. Geçici olmaları beklenir: bir özellik dalında çalışma başladığında oluşturulur, özellik kullanıcıların %100'üne ulaşıp ekip kararlılığı doğruladığında kaldırılır. Kaldırma tarihi ve sorumlu sahibi olmayan release flag'leri kod tabanınızda kalıcı eşyaya dönüşür.

Deney flag'leri, A/B testlerini ve çok değişkenli deneyleri yönetir. Analitik kohort tanımlayıcılarına bağlıdır; yaşam döngüleri deney sınırıyla çizilir. Deney bittiğinde flag onunla birlikte gider. Yaygın hata: kazanan varyantı flag'in arkasında tutmak, çünkü kaldırma "acil değil" görünür. İki yıl sonra deney flag'i kritik yolun bir parçasıdır ve hangi varyantın aktif olduğunu kimse hatırlamaz.

Ops flag'leri kill switch ve devre kesicilerdir. Release flag'lerinin aksine kalıcı altyapı olarak tasarlanır. SLO'su bozulduğunda yavaş bir ML inference katmanını bypass etmenizi sağlayan disable_ml_recommendations flag'i, sabah 3'te dokümantasyon okumadan kullanmak istediğiniz bir şeydir. Bu flag'ler yerel olarak değerlendirilmeli, iyi belgelenmiş bir fallback'i olmalı ve baskı altında keşfedilmek yerine normal operasyonlarda düzenli test edilmelidir.

İzin flag'leri kullanıcı katmanına, hesap planına ya da beta kohortuna göre erişimi denetler. Tasarım gereği uzun ömürlüdür. Karışıklık riski: tarihçeyi bilmeyen bir okuyucuya izin flag'leri release flag'leri gibi görünebilir. Net bir adlandırma kuralı başka hiçbir yerde bu kadar önemli değildir.

Yüzde tabanlı trafik yönlendirmesini gösteren iç içe düğüm daireleriyle aşamalı yazılım rollout görselleştirmesi

SLO Kapısı Olmayan Yüzde Rollout Sadece Yavaş Deployment'tır

Çoğu feature flag uygulamasının durduğu yer burasıdır. Platform ekibi bir rollout takvimi kurar: Pazartesi %1, Salı %5, Çarşamba %25, Cuma %100. Belgelendirir, paydaşlarla paylaşılır ve buna progressive delivery denir.

Fakat her adımda bir doğrulama koşulu olmadan "aşamalı" kelimesi ertelenmiş risktir; azaltılmış risk değil. Yüzde kadranı maruziyeti kontrol eder. Güvenliği doğrulamaz.

Aşamalı rollout'u operasyonel açıdan anlamlı kılan şey her aşama arasındaki SLO kapısıdır. %5'ten %25'e geçmeden önce bir şey şunu yanıtlamalıdır: flag'li kod yolundaki hata oranı SLO bütçesi dahilinde mi? p99 gecikme, kontrol grubuyla aynı bantta mı seyrediyor? Hata bütçesi baseline'dan daha hızlı tükeniyor mu?

Bu soruların hiçbiri araçsallaştırılmamışsa rollout takvimi bir zaman çizelgesidir, doğrulama döngüsü değil.

Prod'da geçerli bir kurulum: iki SLO değerlendirme penceresi tanımlayın. Kısa pencere (15 dakika) hızlı arızaları yakalar; hatalı bir veritabanı sorgusu, şema uyuşmazlığı, kritik yoldaki bir regresyon. Uzun pencere (24 saat ya da bir tam trafik döngüsü) kademeli bozulmayı yakalar; bellek sızıntıları, önbellek baskısı, düşük frekanslı trafik segmentlerindeki uç durumlar. Herhangi bir ilerleme öncesinde her iki pencerenin yeşil göstermesini zorunlu kılın. Herhangi bir pencere ihlal edilirse rollout'u durdurun ve nöbetçiyi sayfalayın.

Yüzde bir kadrandır. SLO penceresi kapıdır. İkisi birlikte gereklidir.

Bu yapıyı kurmak için büyük bir bütçeye gerek yok. Flag platformunun observabilite servisine bağlı otomatik doğrulama adımı ve nöbetçiyi sayfalayan basit bir alerting kuralı yeterlidir. Karmaşıklık ölçekle birlikte artar; ama bu çekirdeği beş kişilik bir platform ekibi bile bugün uygulayabilir.

Kill Switch Mühendisliği: İhtiyaç Duymadan Tasarlayın

Kill switch bir yedek değildir. Özellik kodunun ilk satırı yazılmadan önce var olması gereken birinci sınıf bir tasarım kararıdır.

Baskı altında tasarlanan kill switch, incelenmemiş varsayımları olan bir kill switch'tir. Aktif bir incident sırasında, bir PagerDuty bildirimi üzerinden açılan terminal oturumunda, Slack thread'ini izleyen beş kişiyle birlikte ilk kez test ediyorsunuzdur. Ops flag'inizin kullanıcıları oturum kimliğine göre hedeflediğini ve oturum servisinizin şu anda bozulmuş olduğunu keşfetmek için bu en kötü andır.

SLO izleme dashboard'u: hata bütçesi tükenme oranı grafikleri ve özellik rollout kontrolü için kill switch göstergesi

Prod kullanımı için tasarlanmış her kill switch için pazarlık edilemez üç özellik:

Incident yanıtını temiz yürüten ekipler prova yapanlardır. Kill switch runbook'un parçasıdır. Sıkıcı hale getirin. Kill switch'i düzenli olarak prova etmek, tıpkı bir yangın tatbikatı gibi, gerçek bir acil durumda mekaniğin değil kararın ön planda olmasını sağlar. Sabah 3'te bilişsel yükü azaltan her şey iyidir.

Flag Borcu: Roadmap'e Konmayan Teknik Borç

Feature flag'leri agresif biçimde benimseyen ekipler çoğunlukla flag borcu biriktirir: amacını tamamlamış ama hiç kaldırılmamış flag'ler. Özellik yayınlandı, deney tamamlandı, beta sona erdi. Flag kaldı.

50 flag'de bu küçük bir sıkıntıdır. Dağıtık bir sistemdeki 500 flag'de ise aktif bir operasyonel risktir. Her flag, incident soruşturması sırasında bakım, test ve kavrama gerektiren bir kod dalıdır. Sabah 2'de bir arızayı anlamaya çalışan bir geliştirici, ilgili olanı bulmak için 40 koşullu daldan geçmek istemez.

Birden fazla platform ekibinde gözlemlenen bir örüntü: p99 gecikme için en üst beş stack frame arasında flag değerlendirme middleware'i. Çoğu durumda neden, istek başına düzinelerce koşulu değerlendiren eski flag'lerdir; iki yıl önce verilen ve kimsenin silmeye cesaret edemediği kararların ağırlığını taşırlar.

Karşı önlem teknikten çok organizasyoneldir. Oluşturulan her flag üç özelliğe sahip olmalıdır: bir sahip, bir tip (release, deney, ops, izin) ve beklenen kaldırma tarihi. Release flag'leri tam rollout'tan sonra iki sprint içinde kaldırılmalıdır. Deney flag'leri deney tamamlandığında kaldırılmalıdır, "birisi fırsat bulunca" değil. Flag envanteri talep üzerine denetlenebilir olmalı ve mühendislik sağlık dashboard'larında görünür olmalıdır.

Hedefleme Granülaritesi: Enterprise Ölçeğinde Çatlayan Boyut

Çoğu feature flag platformu yüzde tabanlı rollout'ları ve temel kullanıcı özelliği hedeflemeyi destekler. Enterprise ölçeğinde ortaya çıkan boşluk hedefleme granülaritesidir: rollout kurallarını hem yeterince spesifik hem de sürdürülebilir biçimde ifade etme yeteneği.

Platform ekibi düzeyinde prod rollout'lar için kullanışlı bir hedefleme hiyerarşisi:

  1. Ortam düzeyi: prod, staging, preview. İlk kapı, tek kapı değil.

  2. Altyapı segmenti: veri merkezi, availability zone ya da Kubernetes cluster'ı. Coğrafi blast radius'u izole etmek için kullanışlıdır.

  3. Hesap ya da kiracı: B2B SaaS platformları için hesap bazında rollout, çoğunlukla kullanıcı yüzdesi bazında rollout'tan daha güvenlidir çünkü istatistiksel bir örneklem yerine tam bir hesabın trafik örüntüsünü gözlemleyebilirsiniz.

  4. Kullanıcı kohortu: beta kullanıcıları, dahili kullanıcılar, aktivite katmanına göre güçlü kullanıcılar.

  5. Oturum özelliği: deney flag'leri için kullanışlı, ops flag'leri için tehlikeli.

Bunu iyi uygulayan platformlar (ölçekte bunu yapan SRE ekiplerinin en çok atıfta bulunduğu LaunchDarkly ve Statsig), aktif rollout sırasında hedefleme mantığını değiştirmek için mühendislik zamanı gerektirmeden karmaşık kural bileşimlerine izin verir. Bu self-servis yetenek, 30 saniyelik rollout duraklaması ile platform ekibine açılan ticket arasındaki farktır.

Bunu kötü uygulayan platformlar hedefleme granülaritesi ile operasyonel basitlik arasında seçim yapmanızı zorunlu kılar. Bu ödünleşim sabah 3'te gün yüzüne çıkar.

Post-Mortem Her Seferinde Aynı Soruları Sorar

Özellikle ilgili her prod incident'ı için post-mortem aynı soru kümesini sorar. Özellik bir flag'in arkasında mıydı? Rollout aşamalı mıydı? Aşamalar arasında doğrulama koşulu var mıydı? Kill switch incident'tan önce test edilmiş miydi?

Dört yanıtın tamamı evet ise incident bir kalibrasyon sorunudur: çok gevşek ayarlanmış eşikler, uç durum içeren hedefleme kuralları, hesaba katılmamış network bölünmesi altında SDK değerlendirme davranışı. Bunlar yapılandırma değişiklikleri ve runbook güncellemeleriyle çözülebilir. AI destekli flag platformları, statik yüzde rollout'larına kıyasla rollout kaynaklı incident'larda %73 azalma gösteriyor. Bu rakam tek başına bir karar vermez; ancak SLO-gated yaklaşımın ölçülebilir etkisini görmek isteyenler için somut bir başlangıç noktasıdır.

Herhangi bir yanıt hayır ise incident bir mimari sorundur. Feature flag'ler bir hata ayıklama kolaylığı değildir. Bir deployment mimarisi kararıdır. Bu karar özellik prod'a çıkmadan önce ya vardır ya da hiç yoktur.

Bir sonraki release öncesinde yanıtlamaya değer soru: bu gece bir şeyler ters giderse post-mortem bu rollout hakkında ne söyler?

Frequently asked questions

Feature flag nedir ve ortam değişkeninden ne farkı var?
Feature flag'ler çalışma zamanında dinamik olarak değerlendirilen koşullu denetimlerdir; ortam değişkenleri ise deploy sırasında ayarlanan statik konfigürasyonlardır. Feature flag'ler, yeniden deploy gerektirmeksizin production'da belirli kullanıcılar ya da trafik yüzdeleri için anlık olarak değiştirilebilir. Bu esneklik, ortam değişkenlerinin sağlayamayacağı aşamalı rollout ve kill switch senaryolarını mümkün kılar.
SLO-gated rollout ile normal yüzdesel rollout arasındaki fark nedir?
Normal yüzdesel rollout yalnızca maruziyeti kontrol eder; her adımda güvenliği doğrulayan bir mekanizma yoktur. SLO-gated rollout ise her aşamada hata oranı ve p99 gecikme gibi metrik kapıları zorunlu kılar. %5 trafikten %25'e geçmeden önce hem 15 dakikalık kısa hem de 24 saatlik uzun pencere yeşil olmalıdır; aksi halde rollout durur ve nöbetçi sayfalanır.
Kill switch neden ağ üzerinden değerlendirme yapmamalıdır?
Kill switch, servis bağımlılıklarının zaten bozulmuş olduğu senaryolarda kullanılır. Değerlendirme uzak bir servise ağ çağrısı gerektiriyorsa, tam da ihtiyaç duyduğunuzda çalışmayabilir. 50ms altında yerel değerlendirme, flag servisinin kendisi down olsa bile kill switch'in çalışmasını garanti eder. Bu, döngüsel bağımlılığı kırar ve incident yanıt yolunu temiz tutar.
Flag borcu neden 500'den fazla flag'de gerçek bir operasyonel risk haline gelir?
Her flag, incident soruşturması sırasında trace edilmesi gereken bir kod dalıdır. 500'den fazla flag'de bu dallar, özellikle karmaşık hedefleme kuralları olan eskiler, istek başına birden fazla koşul değerlendirerek p99 gecikmeye katkıda bulunur. Platform ekiplerinde gözlemlenen örüntü: flag değerlendirme middleware'i p99 stack frame'lerinin en üst beşinde yer alır. Çözüm teknik değil organizasyoneldir: her flag için sahip, tip ve kaldırma tarihi zorunlu olmalıdır.
Hangi feature flag tipleri kalıcı altyapı olarak tasarlanmalıdır?
Ops flag'leri, yani kill switch ve devre kesiciler, kalıcı altyapı olarak tasarlanmalıdır. Release ve deney flag'lerinin aksine bunlar asla kaldırılmaz. 'disable_ml_recommendations' gibi bir ops flag, bağımlı servis SLO'sunu ihlal ettiğinde bypass için her zaman hazır olmalıdır. Bu flag'ler normal operasyonlarda düzenli test edilmeli, baskı altında keşfedilmemelidir.
LaunchDarkly ve Statsig enterprise ölçekte hangi farklı ihtiyaçlara yanıt verir?
LaunchDarkly enterprise yönetişim ve karmaşık hedefleme kuralları konusunda SRE ekiplerinin en çok atıfta bulunduğu platformdur; aktif rollout sırasında mühendislik zamanı harcamadan kural değiştirebildiği self-servis hedefleme kapasitesi öne çıkar. Statsig ise feature flag'leri deney ve ürün analitiğiyle tek platformda birleştirir. Her ikisi de B2B SaaS'ta hesap bazlı rollout ve kullanıcı kohortu hedeflemeyi destekler.
Release flag tam rollout'tan sonra ne kadar sürede kaldırılmalıdır?
Tam rollout'tan sonra en fazla iki sprint içinde kaldırılmalıdır. İki sprintten uzun süren release flag'leri kod tabanında kalıcı eşyaya dönüşür: tarihçesi olmayan geliştiriciler için hangi varyantın aktif olduğu belirsizleşir. Her flag'in kaldırma tarihinin oluşturulduğunda ticket'a eklenmesi ve flag envanterinin mühendislik sağlık dashboard'larında görünür olması bu borcu önler.