
Bir arkadaşının beğendiği filmi sana önermek kolaydır; arkadaşının arkadaşlarının izlediği, senin tür tercihlerinle örtüşen ve benzer kullanıcıların yüksek puan verdiği filmi bulmak ise ilişkiler derinleştikçe zorlaşır. Neo4j, verileri satırlar yerine düğümler ve doğrudan bağlantılar biçiminde saklayarak bu tür soruları doğal şekilde modellememizi sağlar. Cypher sorgu dili de karmaşık ilişki ağlarında gezinmeyi, okunabilir desenler tarif etmeye dönüştürür.
Devamı...
Kotlin’de suspend anahtar sözcüğünü gördüğümüzde kodun sihirli biçimde arka plana taşındığını düşünebiliriz. Oysa coroutine’lerin asıl numarası yeni bir thread oluşturmak değil, çalışmayı uygun noktalarda durdurup daha sonra kaldığı yerden sürdürebilmektir. Kotlin derleyicisi bunu gerçekleştirmek için askıya alınabilen fonksiyonları birer durum makinesine, yani state machine’e dönüştürür.
Devamı...

Bir program aynı anda durum tutmak, hata üretmek ve dış dünyayla konuşmak isteyebilir. Haskell ise bu etkileri görünmez mutasyonlarla birbirine karıştırmak yerine açıkça modellemeyi tercih eder. Monad transformatörleri, farklı etkileri LEGO parçaları gibi üst üste koyarak tek bir hesaplama bağlamında kullanmamızı sağlar.
Devamı...

Go’nun Garbage Collector’ı geliştiriciyi manuel bellek yönetiminden kurtarır; ancak milyonlarca nesneyle çalışan servislerde bu konforun küçük bir faturası vardır: GC, canlı işaretçileri bulmak için heap üzerindeki nesneleri tarar. Struct’larımızı işaretçi içermeyecek biçimde tasarladığımızda Go çalışma zamanı bu nesneleri noscan olarak sınıflandırabilir. Böylece nesnelerin kapladığı bellek hâlâ yönetilirken içlerinin pointer aramak amacıyla taranmasına gerek kalmaz.
Devamı...
Geleneksel nesne yönelimli programlamada bir nesne diğerinin metodunu çağırır ve çoğu zaman aynı belleği paylaşır. Actor modelinde ise bağımsız aktörler birbirlerine mesaj gönderir. Böylece kilitler, yarış koşulları ve hata yayılımı daha yönetilebilir hâle gelir. Elixir ile Akka bu fikri farklı araçlarla uygular; biri Erlang VM’nin doğal yeteneklerine, diğeri JVM ve Scala ekosistemine yaslanır.

Devamı...
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ı...