Terraform ile Altyapıyı Kodla Yönetmek: Sunucular, Ağlar ve Tekrarlanabilir Ortamlar

Bir sunucuyu panelden tek tek oluşturmak, ağ kurallarını elle yazmak ve hangi ayarın nerede değiştiğini hatırlamaya çalışmak; küçük projelerde bile hızla yorucu hâle gelir. Infrastructure as Code (IaC) yaklaşımı, altyapıyı Terraform dosyalarında tanımlayarak bu süreci yazılım geliştirmeye benzetir: değişiklikler sürüm kontrolüne girer, gözden geçirilir ve aynı ortam tekrar tekrar üretilebilir.

Devamı...

Rastgele Sayı Üretimi: Bilgisayarlar Zar Atmayı Nasıl Taklit Eder?

Bilgisayarlar son derece düzenli makinelerdir: aynı girdiye, aynı koşullarda daima aynı çıktıyı verirler. Bu yüzden ekranda “rastgele” görünen bir oyun zarı, şifreleme anahtarı ya da simülasyon sonucu aslında çoğu zaman dikkatle tasarlanmış bir algoritmanın ürünüdür. Bu algoritmalar, tahmin edilmesi zor ve istatistiksel olarak dengeli diziler üretmeye çalışır; fakat geçmişteki durumları bilen biri için sonuçlar teorik olarak yeniden üretilebilir.

Devamı...

RabbitMQ ile Mesaj Kuyruğu Mimarisi: Üretici-Tüketici Modeli

Mikroservisler birbirini doğrudan ve senkron çağırdığında, küçük bir gecikme bile zincirleme arızaya dönüşebilir. RabbitMQ bu bağı gevşetir: sipariş servisi işi bir kuyruğa bırakır, bildirim servisi uygun olduğunda alır. Böylece servisler farklı hızlarda çalışabilir, yoğunluk dalgaları daha yönetilebilir hâle gelir.

Devamı...

Quick Sort ve Pivot Seçimi: En Kötü Durumun Anahtarı

quick-sort-ve-81

Quick Sort, pratikte son derece hızlı çalışan ancak kaderi büyük ölçüde pivot seçimine bağlı olan klasik bir sıralama algoritmasıdır. Temel fikir basittir: Diziden bir pivot seçilir, küçük elemanlar sol tarafa, büyük elemanlar sağ tarafa bölünür ve aynı işlem alt dizilerde tekrarlanır. Fakat kötü seçilmiş bir pivot, zarif görünen bu yaklaşımı beklenmedik biçimde yavaşlatabilir.

Devamı...

OAuth 2.0 ile Güvenli Yetkilendirme Akışları: Anahtarı Vermeden Kapıyı Açmak

Bir uygulamanın kullanıcı adına Google Drive dosyalarına erişmesi, GitHub depolarını listelemesi veya Spotify çalma listesi oluşturması sık rastlanan bir ihtiyaçtır. Ancak uygulamanın kullanıcının parolasını istemesi hem tehlikeli hem de gereksizdir. OAuth 2.0, parolayı paylaşmadan, sınırlı ve süreli erişim izinleri vermeyi sağlayan yetkilendirme çerçevesidir. Kısacası uygulamaya evinizin anahtarını değil, yalnızca belirli odalara girebilen ve süresi dolan bir ziyaretçi kartı verirsiniz.

Devamı...

Nginx Reverse Proxy: Trafiği Doğru Servise Yönlendirme Rehberi

nginx-reverse-proxy-89

Modern bir web uygulaması çoğu zaman tek bir sunucudan ibaret değildir: arayüz, API, kimlik doğrulama ve dosya servisleri farklı süreçlerde hatta farklı makinelerde çalışabilir. Nginx reverse proxy, istemcinin tek bir alan adına yaptığı isteği uygun arka uç (backend) servisine ileterek bu karmaşıklığı görünmez kılar. Tarayıcı example.com/api/users adresini görür; Nginx ise isteği örneğin localhost:3000 üzerindeki API uygulamasına taşır.

Devamı...

Merge Sort ve Böl-Fethet: Büyük Dizileri Parçalayarak Sıralamanın Matematiği

merge-sort-ve-44

Merge Sort, karmaşık görünen bir sıralama işini şaşırtıcı derecede düzenli bir plana dönüştürür: Büyük diziyi sürekli ikiye böl, tek elemanlı parçalara ulaştığında bu parçaları sıralı biçimde geri birleştir. Bu yaklaşım, böl-fethet (divide and conquer) stratejisinin en tanınan örneklerinden biridir. Özellikle milyonlarca kayıt, log satırı veya zaman damgalı olay işlenirken öngörülebilir çalışma süresi sayesinde güven verir.

Devamı...

Kubernetes Temelleri ve Pod Mantığı: Konteyner Orkestrasyonuna İlk Adım

kubernetes-temelleri-ve-14

Modern uygulamalar tek bir sunucuda çalışan dev programlar olmaktan çıktı; küçük, bağımsız ve konteynerleşmiş servislerden oluşuyor. Ancak yüzlerce konteyneri doğru makineye yerleştirmek, çökenleri yeniden başlatmak ve trafik arttığında kapasiteyi büyütmek elle yapılabilecek bir iş değildir. Kubernetes, tam bu noktada konteyner kümelerini yöneten, dağıtımı otomatikleştiren ve uygulamanın arzu edilen durumunu koruyan orkestrasyon platformudur.

Devamı...

Heap Veri Yapısı ve Öncelik Kuyruğu: En Önemli Eleman Hep Tepede

heap-veri-yapisi-72

Bir iş kuyruğunda herkes sırayla beklemek zorunda değildir: acil bir hata kaydı, normal bir rapordan önce işlenmelidir. İşte öncelik kuyruğu bu ihtiyacı çözer; heap (ikili yığın) ise en yüksek ya da en düşük öncelikli elemana son derece hızlı ulaşmanın pratik yoludur. Heap, “tam sıralı dizi” kadar katı davranmaz; yalnızca her ebeveynin çocuklarıyla olan ilişkisini düzenler. Bu küçük kural, büyük performans kazancı sağlar.

Devamı...

Hash Tablolarında Çakışma Çözümleme: Zincirleme mi, Açık Adresleme mi?

Hash tabloları, bir anahtarı hızlıca bir değere bağlamak için kullanılan en pratik veri yapılarındandır. İdeal senaryoda ekleme, arama ve silme işlemleri sabit zamanda çalışır; fakat iki farklı anahtarın aynı indekse düşmesi, yani çakışma, bu idealin küçük ama önemli düşmanıdır. Zincirleme ve açık adresleme, bu sorunu çözmek için iki temel yaklaşımdır.

hash-tablolarinda-cakisma-80

Devamı...

GraphQL ile Esnek API Sorguları: İstemcinin İhtiyacı Kadar Veri

graphql-ile-esnek-73

Modern uygulamalarda bir ekranın ihtiyaç duyduğu veri çoğu zaman tek bir kaynaktan gelmez: kullanıcı bilgisi, siparişler, ürün görselleri ve izinler farklı kaynaklara dağılmış olabilir. REST yaklaşımında bu durum genellikle birden fazla endpoint çağrısı veya gereğinden büyük JSON yanıtları anlamına gelir. GraphQL ise istemcinin, sunucuya hangi alanları istediğini açıkça söylediği sorgu tabanlı bir API mimarisidir. Böylece mobil uygulama, web arayüzü ve yönetim paneli aynı veri grafiğini kendi ihtiyaçlarına göre gezebilir.

Devamı...

Git Rebase ve Merge Farkları: Geçmişinizi Şekillendiren Stratejiler

Git’te iki dalı bir araya getirmek yalnızca dosya değişikliklerini toplamak değildir; aynı zamanda projenin hikâyesini nasıl anlatacağınıza karar vermektir. merge, geçmişte yaşanan işbirliğini görünür tutan güvenli bir birleşim yaparken, rebase commit’leri başka bir başlangıç noktasına taşıyarak daha doğrusal bir tarihçe üretir. Doğru seçim; ekip düzenine, dalın paylaşılıp paylaşılmadığına ve hata ayıklama alışkanlıklarınıza bağlıdır.

Devamı...

Git Flow ve Trunk-Based Development: Paralel Geliştirmeyi Düzenleme Rehberi

Bir ekipte aynı anda özellik geliştirmek, hata düzeltmek ve sürüm hazırlamak yalnızca git branch komutunu bilmekle çözülmez. Asıl mesele, değişikliklerin hangi dalda ne kadar yaşayacağını, ne zaman gözden geçirileceğini ve üretime hangi kuralla taşınacağını ortaklaştırmaktır. Git Flow ile Trunk-Based Development (TBD), bu ortak çalışma sözleşmesini kurmak için yaygın iki yaklaşımdır.

Devamı...

Elasticsearch ile Ölçeklenebilir Arama: Ters İndeksin Gücü

elasticsearch-ile-olceklenebilir-22

Milyonlarca ürün, makale ya da log kaydı arasında kullanıcıların yazdığı birkaç kelimeyi milisaniyeler içinde bulmak, ilk bakışta samanlıkta iğne aramaya benzer. Elasticsearch bu işi belgeleri tek tek okumak yerine ters indeks (inverted index) kurarak çözer. Bu yapı, klasik veritabanı sorgularındaki satır taramasını arama motoruna uygun, hızlı bir erişim modeline dönüştürür.

Devamı...

Docker Multi-Stage Build ile Küçük, Güvenli ve Hızlı İmajlar

Docker imajları, uygulamanın taşınabilir paketleridir; ancak pakete derleyici, kaynak kod, test araçları ve geçici dosyalar da girerse taşıması pahalı bir bavula dönüşür. Multi-stage build, derleme ortamını çalışma ortamından ayırarak bu bavulu sadeleştirir. Temel fikir basittir: Uygulamayı ilk aşamada üretin, yalnızca ortaya çıkan çalıştırılabilir çıktıyı ikinci aşamaya taşıyın. Böylece üretim imajı, geliştiricinin bütün atölyesini değil, müşterinin gerçekten kullanacağı ürünü içerir.

Devamı...

Dinamik Programlama ile Matris Zinciri Çarpımı Optimizasyonu

dinamik-programlama-ile-17

Birden fazla matrisi çarpmak, sonuç matrisi aynı kaldığı için ilk bakışta basit görünür. Ancak parantezlerin yeri, bilgisayarın yapacağı skaler çarpım sayısını dramatik biçimde değiştirebilir. Matris Zinciri Çarpımı problemi, matrisleri gerçekten çarpmaktan çok en ucuz çarpım sırasını bulmayı hedefler. Dinamik programlamanın “küçük en iyi çözümlerden büyük en iyi çözümü kur” fikrini öğrenmek için de klasik ve son derece öğretici bir örnektir.

Devamı...

Composer ile Sürüm Kısıtlamaları: SemVer ile Bağımlılık Çakışmalarını Önlemek

PHP projesinde composer update komutunun bir paketi güncellerken başka bir kütüphaneyi bozması, çoğu geliştiricinin en az bir kez yaşadığı küçük bir bağımlılık dramıdır. Composer bu dramı sihirle değil; sürüm kısıtlamaları, paket metadatası ve Semantik Versiyonlama (SemVer) kurallarıyla yönetir. Doğru yazılmış bir composer.json, hem güvenli güncellemeye alan açar hem de ekipteki herkesin aynı bağımlılık ağını kurmasına yardımcı olur.

Devamı...

CI/CD Pipeline Tasarımı: Commit'ten Canlıya Otomatik Yolculuk

Bir geliştiricinin git push komutundan sonra kahvesini yudumlarken testlerin çalışması, güvenlik kontrollerinin yapılması ve uygulamanın güvenle dağıtılması kulağa sihir gibi gelir. Aslında bunun adı CI/CD pipeline tasarımıdır. İyi kurulmuş bir pipeline, tekrarlanan insan işlerini otomatikleştirir; hataları erken yakalar ve sürüm alma stresini öngörülebilir bir sürece dönüştürür.

Devamı...

Bit Manipülasyonu ve Olimpiyat Soruları: XOR, AND, OR ile Yaratıcı Çözümler

Olimpiyat tipi algoritma sorularında bit operatörleri, yalnızca sayıları ikili tabanda kurcalamak için değil, büyük durum uzaylarını küçük maskelere sıkıştırmak için kullanılır. XOR, AND ve OR; kümeleri, pariteleri, alt kümeleri ve izin verilen seçimleri tek bir makine kelimesinde temsil edebilir. Doğru yerde kullanıldıklarında hem çözümü zarifleştirir hem de karmaşıklığı dramatik biçimde düşürür.

bit-manipulasyonu-ve-57

Devamı...

AVL ve Kırmızı-Siyah Ağaçlar: Dengenin Kodla Dansı

İkili arama ağaçları (BST), küçük anahtarları solunda, büyük anahtarları sağında tutarak aramayı hızlandırır. Ancak anahtarlar sıralı gelirse ağaç, bir ağacın heybetinden çok bağlı listeye benzeyen eğik bir yapıya dönüşür. Bu durumda arama, ekleme ve silme maliyeti $O(n)$ olur. AVL ve Kırmızı-Siyah ağaçları, her güncellemeden sonra küçük yapısal müdahaleler yaparak yüksekliği $O(\log n)$ sınırında tutan iki ünlü çözümdür.

Devamı...