Göreve başladığımın ikinci ayında, üç ekipten üç kıdemli mühendisi aynı toplantıya çağırıp tek bir soru sordum: "Bir siparişin teslimat ücretini kim hesaplıyor?" Üç farklı cevap aldım. PHP monolitindeki eski kod hesaplıyordu — bazı akışlarda hâlâ oradan geçiliyordu. Node.js ile yazılmış BFF katmanı, mobil uygulamaya göstermek için kendi kopyasını hesaplıyordu. Spring Boot'taki fiyatlama servisi ise "gerçek" hesabı yapıyordu ama diğer ikisinin varlığından haberdar bile değildi. Üç dil, üç ekip, üç teslimat ücreti — ve yağmurlu bir gün üçünün üçü de farklı sonuç üretebiliyordu. Poliglot mimari hakkında okuyacağınız çoğu yazı "her işe doğru araç" cümlesiyle başlar. Benim hikayem, o cümlenin faturasıyla başlıyor.
Kimse Poliglot Olmayı Seçmedi, Öyle Uyandık
Gerçeği söyleyelim: platformların çok azı bilinçli bir kararla poliglot olur. Bizimki de dahil. PHP, şirketin doğduğu dildi; ilk pazaryeri, ilk milyon sipariş, ilk kampanya kodu hep orada yazıldı ve o monolit bugün hâlâ günde ciddi hacim taşıyor. Node.js, mobil uygulama hızlanınca "API'leri toparlayacak hafif bir katman" olarak geldi ve BFF'ten öteye, kendi başına iş mantığı barındıran bir düzine servise büyüdü. Spring Boot ise ölçek sancıları başlayınca, "ciddi" backend işleri için kurulan yeni çekirdek servislerin dili oldu — bugün sipariş, ödeme, fiyatlama, stok gibi kritik yükler orada. Her adım kendi bağlamında makuldü. Toplamı ise kimsenin çizmediği bir mimariydi: 60'a yakın servis, üç runtime, üç paket ekosistemi, üç ayrı "doğru yapma" kültürü.
Poliglot mimarinin gerçek maliyeti dillerde değil, çoğaltılmış altyapıda yaşar. Bir kimlik doğrulama değişikliği mi var? Üç ayrı JWT kütüphanesi, üç ayrı güncelleme. Trace bağlamı mı taşınacak? Üç SDK, üç farklı olgunluk seviyesi. Kafka'ya güvenli bağlantı mı? PHP'de librdkafka'nın sarmalayıcısı, Node'da başka bir client, Java'da resmi client — üçünün retry ve batch davranışları farklı, üçünün de üretimde ayrı ayrı öğrendiğimiz huyları var. Bir ara saydım: "her serviste olması zorunlu" dediğimiz sekiz temel yetenek (log formatı, health check, metrik, trace, config, secret, graceful shutdown, hata sözleşmesi) çarpı üç dil, 24 ayrı implementasyon demekti ve bunların bakımı hiçbir sprint planında satır olarak görünmüyordu.
Standartlaştırılacak Şey Dil Değil, Sözleşme
İlk aylarda bana iki uçtan da baskı geldi. Bir uç: "Her şeyi Java'ya toplayalım, tek dil, tek standart." Diğer uç: "Ekipler özgür olsun, Go da gelsin, Rust da." İkisini de reddettim. Tek dile konsolidasyon, kağıt üzerinde 18 ayda bitecek, gerçekte hiç bitmeyecek ve bitene kadar iş üretmeyi durduracak bir proje olurdu; çalışan PHP monolitini "dili eski" diye yeniden yazmak, işleyen bir fabrikayı boyası solmuş diye yıkmaktır. Sınırsız özgürlük ise 24 implementasyon sorununu 40'a çıkarırdı. Bizim bulduğumuz denge şu cümlede özetleniyor: diller özgür, sözleşmeler diktatörlük.
Sözleşmeler somut: her servis, dili ne olursa olsun, aynı JSON log şemasını üretir; aynı health ve readiness endpoint'lerini sunar; trace bağlamını W3C standardıyla taşır; hata cevaplarını ortak bir zarf formatında döner; Kafka olaylarını merkezi şema deposundaki versiyonlu tanımlara göre yayınlar. Bu sözleşmeleri her dil için birer "platform kütüphanesi" haline getirdik — üç kütüphane, ama tek davranış — ve iki kişilik küçük bir platform ekibini bunların tam zamanlı sahibi yaptık. Yeni servis açan ekip artık log formatını tartışmıyor; şablondan başlıyor. Bu, poliglot mimarinin yönetilebilirliğinde tek başına en büyük sıçramayı yaptı: sözleşme ihlali kaynaklı entegrasyon arızaları, altı ayda aylık 14 vakadan 2'ye indi.
Hangi İş Hangi Dile? Duygusuz Bir Karar Tablosu
"Yeni servis hangi dilde yazılmalı?" sorusunu da duygudan arındırdık. Kararı üç soruya bağlayan bir tablo var. Servis, yüksek eşzamanlılıkla çok sayıda dış API'yi bekliyorsa ve iş mantığı inceyse Node.js — BFF'ler, bildirim yelpazesi, webhook toplayıcıları orada mutlu. Servis para taşıyorsa, karmaşık domain kuralları ve güçlü tip garantisi istiyorsa Spring Boot — ödeme, fiyatlama, mutabakat tartışmasız orada. PHP'de ise yeni servis açmıyoruz; ama monoliti de yıkmıyoruz, kenarlarından yontuyoruz: yılda üç-dört parça, ancak bir iş gerekçesi varsa (ölçek sınırı, değişim hızı, riskli bağımlılık) koparılıyor. "Dili modernleştirmek" tek başına gerekçe sayılmıyor ve bu kural, en az bir kez benim de hoşuma gitmeyen kararlar üretti — hâlâ doğru kural olduğunu düşünüyorum.
İnsan tarafı, teknik tarafın en az iki katı önemli çıktı. Üç dilin üç işe alım havuzu, üç kariyer yolu, üç maaş piyasası var. PHP ekibinin en kıdemlileri, şirketin alan bilgisinin — o "yazılmamış kurallar" hazinesinin — fiilen sahipleri; onları "eski teknolojinin bekçisi" konumuna itmek, kurumsal hafızayı çöpe atmak olurdu. Bilinçli iki hamle yaptık: birincisi, monolitten koparılan her yeni servisin ekibinde en az bir monolit kıdemlisi bulunur — dil öğrenmek, alan öğrenmekten katbekat kolay. İkincisi, terfi kriterlerinde "dil" kelimesi geçmez; sistem düşüncesi, işletme etkisi ve sözleşmelere uyum geçer. İlk yılın sonunda PHP ekibinden dört mühendis Spring Boot servislerinde çekirdek geliştirici olmuştu ve alan bilgileri sayesinde oradaki en değerli insanlar arasındaydılar.
Teslimat Ücreti Davasının Sonu
Baştaki üç hesap hikayesi nasıl bitti? Teslimat ücreti tek sahibe verildi: Spring Boot'taki fiyatlama servisi. Node.js katmanı artık hesaplamıyor, soruyor; PHP monolitindeki kopya ise bir çeyrek boyunca "gölge modda" çalıştırıldı — kendi hesabını yapmaya devam etti ama sonucu kullanmayıp fiyatlama servisininkiyle karşılaştırdı. Gölge mod, iki eski akışta kimsenin bilmediği özel durumlar yakaladı (bir tanesi, yalnızca PHP tarafında yaşayan sekiz yıllık bir "ücretsiz teslimat" bayrağıydı) ve bu farklar kapatılmadan geçiş yapılmadı. Bugün yağmurlu bir günde teslimat ücreti tektir; bu cümleyi kurabilmek üç ay sürdü ve bence mimari dokümanlardaki bütün diyagramlardan daha değerli.
Poliglot mimari hakkında vardığım yargı şu: ne övünülecek bir özellik ne utanılacak bir günah; büyümüş her sistemin doğal hali. Yönetilmediğinde vergisi bileşik faizle işler — çoğaltılmış altyapı, çelişen hesaplar, bölünmüş kültür. Yönetildiğinde ise gerçek bir esneklik sağlar: biz bugün bir BFF'i iki günde, bir ödeme özelliğini güvenle, monolitteki bir kampanya düzeltmesini saatler içinde çıkarabiliyoruz; tek dilli bir dünyada bu üçlünün en az biri yavaşlardı. Benzer bir çok dilli yapıyı devralmış, "her şeyi yeniden mi yazsak?" ile "böyle idare mi etsek?" arasında sıkışmış biriyseniz iletişim sayfamdan ulaşın; karar tablomuzu ve sözleşme listemizi olduğu gibi paylaşırım — ikisi de tek sayfa, çünkü işe yarayan standartlar kısa olur.
Toplantıdaki üç mühendis bugün aynı gildenin üyeleri ve ayda bir "sözleşme kurulu" olarak toplanıyorlar. Geçen ay gündemlerindeki en hararetli madde neydi biliyor musunuz? Log şemasına yeni bir alan eklenmesi. Üç dil, tek kavga — ilerleme dediğin bu galiba.