Node.js’in yaratıcısı Ryan Dahl, yıllar sonra bazı tasarım kararlarından pişman olduğunu açıkladı ve bu deneyimden doğan fikirlerle Deno’yu geliştirdi. Deno; varsayılan güvenlik kısıtlamaları, yerleşik TypeScript desteği ve URL tabanlı modül sistemiyle JavaScript çalışma ortamlarına daha modern bir yaklaşım getiriyor. Peki bunlar gerçek projelerde ne kadar fark yaratıyor?
Devamı...
Bir e-ticaret sisteminde iki sunucunun aynı son ürünü eş zamanlı sattığını düşünün. Her ikisi de stok değerini 1 olarak okur, siparişi onaylar ve stoğu 0 yapar. Sonuç: Bir ürün, iki mutlu müşteri ve kısa süre sonra pek de mutlu olmayan bir destek ekibi! Dağıtık kilitler, farklı makinelerde çalışan süreçlerin ortak bir kaynağı kontrollü biçimde değiştirmesini sağlar.
Devamı...

CSS güçlüdür; ancak standartlara eklenmemiş bir görsel efekt veya yerleşim davranışı istediğimizde çoğunlukla JavaScript ile DOM elemanları üretmeye başlarız. CSS Houdini ise sihirbaz şapkasından tavşan değil, tarayıcının işleme sürecine kontrollü kancalar çıkarır. Böylece geliştiriciler özel CSS özellikleri tanımlayabilir, görseller çizebilir ve deneysel olarak yeni yerleşim algoritmaları geliştirebilir.
Devamı...
Dağıtık sistem tasarlarken CAP teoremi genellikle sahnenin yıldızıdır: Ağ bölünmesi yaşandığında tutarlılık mı, erişilebilirlik mi? Fakat sistemler hayatlarının büyük bölümünü ağ felaketi yaşamadan geçirir. İşte PACELC, projektörü bu sakin anlara çevirir ve rahatsız edici soruyu sorar: “Ağ düzgün çalışırken düşük gecikme mi, güçlü tutarlılık mı istiyorsun?” Çünkü dağıtık sistemlerde ücretsiz öğle yemeği yoktur; yalnızca faturanın farklı zamanlarda gelmesi vardır.
Devamı...
C++ şablonları güçlüdür; ancak yanlış bir tür kullandığınızda derleyici bazen küçük bir hatayı yüzlerce satırlık bir destana dönüştürür. C++20 ile gelen Concepts, şablon parametrelerinden ne beklendiğini açıkça tanımlayarak bu sorunu büyük ölçüde çözer. Böylece hem derleyici daha anlaşılır hata verir hem de fonksiyonun kabul ettiği türler kaynak koddan okunabilir.
Devamı...
Terraform ile birkaç kaynak oluşturmak kolaydır; asıl macera aynı altyapıyı bir ekip yönetmeye başladığında ortaya çıkar. Terraform State dosyası, tanımladığımız kod ile bulutta gerçekten bulunan kaynaklar arasındaki köprüdür. Ancak yanlış saklanan veya eş zamanlı güncellenen bir State, altyapıyı otomatikleştiren dostumuzun kısa sürede kaos makinesine dönüşmesine neden olabilir.
Devamı...
Bir sistemin hiç bozulmamasını istemek kulağa harika gelir; ancak yüzde yüz güvenilirlik hedefi, ekipleri yenilik yapmak yerine sonsuza kadar risk azaltmaya sürükleyebilir. Google’ın Site Reliability Engineering yaklaşımıyla yaygınlaştırdığı hata bütçesi, kullanıcıların kabul edebileceği arıza payını ölçülebilir bir geliştirme özgürlüğüne dönüştürür. Böylece ekip, “Hiç hata olmasın!” gibi gerçekçi olmayan bir hedef yerine, “Ne kadar hata kabul edilebilir ve bu payı nasıl yöneteceğiz?” sorusunu sorar.
Devamı...

Bulut faturanız roket gibi yükselirken spot sunucular bir indirim kuponu gibi yetişebilir. Bulut sağlayıcıları, boşta duran işlem kapasitesini standart fiyatın oldukça altında kiralar. Ancak küçük bir şartları vardır: Sağlayıcı kapasiteye ihtiyaç duyduğunda sunucunuzu kısa bir bildirimle kapatabilir. Dolayısıyla spot dünyasında temel soru “Sunucu kapanır mı?” değil, “Kapandığında uygulama ne yapar?” olmalıdır.
Devamı...
Bir uygulamaya yeni özellik eklemek bazen küçük bir değişiklik gibi başlar, ardından onlarca if bloğuna dokunulan riskli bir operasyona dönüşür. SOLID ilkelerinin O harfiyle temsil edilen Açık/Kapalı Prensibi, yazılım bileşenlerinin genişletilmeye açık, değiştirilmeye kapalı olmasını önererek bu soruna çözüm getirir. Amaç mevcut kodu sonsuza kadar dondurmak değil, yeni davranışları mümkün olduğunca yeni kod yazarak sisteme katabilmektir.
Devamı...
Mikroservis mimarisinde servis sayısı arttıkça ağ trafiği küçük bir şehir merkezine dönüşür: İstekler farklı rotalara sapar, bazı servisler yavaşlar ve güvenlik kontrolleri her köşede yeniden yazılır. Service Mesh, uygulama kodunu değiştirmeden bu karmaşayı yöneten bir trafik katmanıdır. Istio ise Envoy proxy’lerini kullanarak güvenlik, gözlemlenebilirlik ve akıllı yönlendirme özelliklerini Kubernetes ortamına taşır.

Devamı...
Serverless mimari, sunucu yönetimini sağlayıcıya bırakarak kodu hızlıca üretime çıkarmamızı sağlar. Ancak “yalnızca kullandığın kadar öde” sloganının gölgesinde kalan bir performans maliyeti vardır: soğuk başlangıç. Uzun süre çağrılmayan bir işlev yeniden çalıştırıldığında ortamın hazırlanması gerekir ve kullanıcı, bazen saniyelere ulaşabilen bu gecikmenin faturasını bekleyerek öder.

Devamı...
Bir şirketin yüzlerce uygulaması, kütüphanesi ve servisi olduğunu düşünün. Bunları ayrı depolara bölmek düzenli görünür; ancak ortak bir kütüphane değiştiğinde işler hızla “hangi servis hangi sürümü kullanıyor?” bulmacasına dönüşebilir. Monorepo yaklaşımı, bütün kodları tek bir kaynak ağacında toplayarak bu problemi farklı bir yerden çözer. Google’ın yaklaşımı bunun en ünlü örneğidir; fakat küçük bir düzeltme yapalım: Google, dev kod tabanı için Git yerine ağırlıklı olarak kendi geliştirdiği Piper altyapısını kullanır.
Devamı...
Bir uygulama küçükken Kullanıcı giriş yaptı gibi bir log satırı yeterli görünebilir. Fakat yüzlerce servisin saniyede binlerce olay ürettiği bir sistemde bu cümle, samanlıktaki iğneye dönüşür. Hangi kullanıcı, hangi servis, ne zaman ve kaç milisaniyede giriş yaptı? Yapılandırılmış loglama, bu bilgileri metnin içine saklamak yerine JSON alanları olarak yazar ve logları makinelerin kolayca sorgulayabileceği verilere dönüştürür.

Devamı...

Kubernetes yalnızca Pod, Service veya Deployment yönetmek zorunda değildir. API sunucusuna yeni bir nesne türü tanıtarak veritabanını, mesaj kuyruğunu hatta şirketinize özgü iş yükünü standart bir Kubernetes kaynağı gibi yönetebilirsiniz. Bunun anahtarı Custom Resource Definition (CRD), otomasyon tarafındaki yardımcısı ise Operator desenidir.
Devamı...
Konteynerler geçici doğalarıyla ünlüdür: kapanır, yeniden oluşturulur ve hiçbir şey olmamış gibi hayatlarına devam ederler. Ancak PostgreSQL, MongoDB veya Kafka gibi sistemler için “hiçbir şey olmamış gibi” davranmak, verilerin gerçekten kaybolduğu anlamına gelebilir. Kubernetes StatefulSet, bu çelişkiyi kararlı ağ kimlikleri, sıralı yönetim ve kalıcı disklerle çözerek durumlu uygulamaları konteyner dünyasına uydurur.
Devamı...
Bir sistemi geliştirmek kolaydır; onu yıllardır kullanan istemcileri kızdırmadan geliştirmek ise mühendislik sanatıdır. Mobil uygulamalar güncellenmeyebilir, başka ekipler eski SDK’ları kullanabilir ve kuyrukta dünün formatıyla üretilmiş mesajlar bekleyebilir. Geriye dönük uyumluluk, değişimi durdurmak değil, eski ve yeni dünyaların bir süre güvenle birlikte yaşamasını sağlamaktır.
Devamı...
Bir sunucu yıllarca çalıştıkça üzerine yamalar, geçici ayarlar ve “şimdilik böyle kalsın” çözümleri birikir. Sonunda kimsenin dokunmaya cesaret edemediği dijital bir antikaya dönüşür. Immutable Infrastructure, yani değişmez altyapı yaklaşımı, bu sorunu radikal bir kuralla çözer: Çalışan sunucuyu güncelleme; yeni sürümü içeren temiz bir imaj üret, yeni sunucuları başlat ve eskilerini çöpe at.
Devamı...

Bir Kubernetes kümesinde çalışan uygulamayı güncellemek için gece yarısı sunucuya bağlanıp gizemli komutlar çalıştırdığınızı düşünün. Sabah olduğunda kimse neyin, neden değiştiğini bilmiyor! GitOps bu maceraya son verir: Sistemin istenen durumu Git deposunda tanımlanır, Argo CD ise kümeyi sürekli izleyerek gerçek durumu bu tanıma yaklaştırır. Böylece Git yalnızca kaynak kodun değil, altyapının da güvenilir kayıt defteri olur.
Devamı...

Mavi/yeşil dağıtım, iki ayrı üretim ortamı arasında trafik değiştirerek sürüm riskini azaltır. Ancak yalnızca bir özelliği açmak için bütün trafiği yeni ortama taşımak bazen balyozla ceviz kırmaya benzer. Feature toggle yaklaşımında yeni kod önceden canlıya çıkar; davranış ise dağıtım yapmadan, bir yönetim paneli veya yapılandırma servisi üzerinden etkinleştirilir.
Devamı...
Decorator ve Proxy kalıpları ilk bakışta birbirinin ikizi gibidir: İkisi de başka bir nesneyi içinde tutar, onunla aynı arayüzü uygular ve çağrıları sarılmış nesneye iletir. Ancak tasarım kalıplarında yalnızca sınıf diyagramına bakmak yanıltıcı olabilir. İnce çizgiyi belirleyen şey yapı değil, niyettir: Decorator davranışı zenginleştirirken Proxy erişimi yönetir.
Devamı...