Bir mikroservis çöktüğünde sorun çoğu zaman yalnızca o servisle sınırlı kalmaz. Ona istek gönderen uygulamalar yanıt bekler, bağlantı havuzları dolar, iş parçacıkları tükenir ve masum servisler de domino taşları gibi devrilmeye başlar. Circuit Breaker Pattern, elektrik sigortasına benzeyen bir koruma mekanizması kurarak bu zincirleme felaketi durdurur.
Devamı...
Bir tam sayının ikili gösteriminde kaç tane 1 bulunduğunu saymak ilk bakışta sıradan bir döngü problemi gibi görünür. Ancak düşük seviyeli programlamanın büyüsü, bazen bütün bitleri tek tek dolaşmak yerine yalnızca ilgilendiğimiz bitlere dokunabilmemizdir. Brian Kernighan algoritması, her turda sağdaki bir adet set bitini temizleyerek gereksiz döngüleri ortadan kaldıran zarif bir bit maskeleme hilesidir.
Devamı...

Bir alfabenin karakterlerini kullanarak belirli uzunlukta metinler üretmek kolaydır: alfabe boyutu $K$, metin uzunluğu $N$ ise toplam $K^N$ seçenek vardır. Ancak metnin içinde “abc”, “kedi” veya “virus” gibi yasaklı kelimelerin hiç geçmemesini istediğimizde işler karışır. Her dizgiyi tek tek üretip kontrol etmek astronomik derecede pahalıdır. Neyse ki Aho-Corasick otomatı ile dinamik programlamayı birleştirerek tüm geçerli dizgileri üretmeden sayabiliriz.
Devamı...

Bir şirket hiyerarşisindeki yöneticileri, dosya sistemindeki klasörleri veya bir oyundaki yetenek ağacını düşünün. Bu yapılarda “X düğümünün altındaki bütün değerlerin toplamı nedir?” gibi sorgular sıkça karşımıza çıkar. Ağacı her sorguda yeniden dolaşmak pahalıdır; Euler Turu Tekniği (ETT), alt ağaçları tek boyutlu ve kesintisiz dizi aralıklarına dönüştürerek segment ağacının süper güçlerinden yararlanmamızı sağlar.
Devamı...
Bir ağaçta iki düğüm arasındaki mesafeyi hesaplamak kolaydır; fakat binlerce güncelleme ve sorgu geldiğinde işler hızla dallanıp budaklanır. Centroid Decomposition, ağacı dengeli biçimde parçalara ayırarak mesafe problemlerini yaklaşık $O(\log n)$ katman üzerinden çözmemizi sağlar. Kısacası ağacın fiziksel yapısını değiştirmeden, onun üzerinde ikinci ve dengeli bir “centroid ağacı” kurarız.

Devamı...
Bir mikrodenetleyicinin sensörle, bilgisayarla veya başka bir kartla konuşmasını sağlamanın en kolay yollarından biri UART’tır. Karmaşık ağ katmanları, IP adresleri ya da bağlantı pazarlıkları yoktur; iki taraf doğru hızda dinler ve bitler sırayla yola çıkar. Kısacası UART, elektronik dünyasının “aynı dili ve tempoyu biliyorsak konuşabiliriz” anlaşmasıdır.
Devamı...
Bir sunucunun CPU kullanımı, elektrik sayacının ölçümü, borsa fiyatı veya akıllı saatin kaydettiği nabız aynı temel özelliği taşır: Her değer belirli bir zaman anına aittir. Klasik veritabanları bu kayıtları elbette saklayabilir; ancak veri saniyede binlerce kez akmaya başladığında zaman, sıradan bir sütun olmaktan çıkar ve veri modelinin başrol oyuncusuna dönüşür.
Devamı...
Bir mikrodenetleyicinin sensör, ekran, ADC, DAC veya flash bellek gibi çevresel donanımlarla hızlı konuşması gerektiğinde SPI çoğu zaman sahneye çıkar. Açılımı Serial Peripheral Interface olan bu protokol, veriyi bit bit aktarmasına rağmen yüksek saat frekansı ve basit çalışma mantığı sayesinde oldukça hızlıdır. Kısacası SPI, donanım dünyasının “lafı dolandırmadan doğrudan konuşan” iletişim yöntemlerinden biridir.
Devamı...
SOLID, yazılım ekiplerinin toplantılarda ciddi yüz ifadeleriyle andığı; kod incelemelerinde ise bazen kılıç gibi kullandığı beş tasarım prensibidir. Doğru uygulandığında değişime dayanıklı kod üretir, yanlış yorumlandığında üç satırlık işlem için on iki arayüz ve yirmi sınıf doğurabilir. Dolayısıyla asıl soru “SOLID kullanmalı mıyız?” değil, “Hangi maliyet karşılığında ve hangi problem için kullanmalıyız?” olmalıdır.

Devamı...
Bir sıcaklık sensörünü buzlu suya daldırdığınızda 0 °C yerine 2,4 °C göstermesi onun işe yaramaz olduğu anlamına gelmez. Sensör yalnızca biraz “dürüstlük eğitimine” ihtiyaç duyuyor olabilir! Kalibrasyon, cihazın ürettiği ham değerlerle güvenilir referans değerler arasındaki ilişkiyi modelleyerek ölçüm hatasını azaltma işlemidir.

Devamı...

Bir mikrodenetleyicide sensör okumak, motor sürmek ve haberleşme paketlerini işlemek aynı anda gerekli olabilir. Ancak tek çekirdekli işlemci gerçekte aynı anda yalnızca bir işi yürütür. RTOS scheduler’ı, yani zamanlayıcı, tam bu noktada sahneye çıkar ve hazır görevlerden hangisinin işlemciyi kullanacağına karar verir. Kısacası scheduler, görevler arasındaki trafik polisidir; fakat yanlış kararında yalnızca korna sesi değil, kaçırılmış deadline’lar duyulur.
Devamı...
Bir robot kolunun eklemlerini döndürdüğümüzde uç efektörün hangi yönde ve ne kadar hızlı hareket edeceğini nasıl buluruz? Tersinden sorarsak, robotun elini belirli bir hızla ilerletmek için motorları hangi hızlarda çevirmeliyiz? Robotikte bu iki dünya arasındaki tercüman Jacobian matrisidir. İlk bakışta ürkütücü görünen bu matris, aslında eklem hızlarını Kartezyen uzaydaki harekete bağlayan yerel bir yol haritasıdır.
Devamı...
Bir uygulama büyüdükçe veritabanındaki iş yükü de büyür. Ürün listeleme, profil görüntüleme ve raporlama gibi okuma işlemleri çoğalırken sipariş oluşturma gibi yazma işlemleri genellikle daha düşük oranda kalır. Tek veritabanını daha güçlü bir sunucuya taşımak bir süre işe yarasa da sonsuza kadar RAM ekleyemeyiz. Read replica mimarisi, okuma trafiğini birden fazla veritabanı kopyasına dağıtarak bu darboğazı aşmayı hedefler.

Devamı...
Bir mikrodenetleyicinin yalnızca HIGH ve LOW üretebildiğini düşünürsek, bir LED’i nasıl yarı parlak yakabilir veya motoru yarı hızda döndürebiliriz? Cevap, elektroniğin hızlı aç-kapa illüzyonu olan PWM tekniğidir. PWM sayesinde dijital bir çıkış, analog çıkışa benzer bir davranış sergiler.
Devamı...

Bir robotun motorunu milisaniyeler içinde kontrol etmek isteyen küçücük bir mikrodenetleyici ile harita çıkaran güçlü bir bilgisayar aynı dili konuşabilir mi? Micro-ROS tam olarak bu soruya “Evet!” cevabını verir. ROS 2 ekosisteminin iletişim modelini kaynakları sınırlı mikrodenetleyicilere taşıyarak sensörlerden motor sürücülerine kadar robotun en küçük parçalarını dağıtık sistemin birer üyesi hâline getirir.
Devamı...
Elinizde milyonlarca dosya veya kayıt içeren iki veri kümesi olduğunu düşünün. Bunların aynı olup olmadığını anlamak için her kaydı tek tek karşılaştırmak mümkündür; fakat pek zarif değildir. Merkle Tree, verileri kriptografik özetlerden oluşan bir ağaca dönüştürerek bu işi çok daha verimli yapar. Kök özetler aynıysa veri kümeleri büyük olasılıkla aynıdır; farklıysa ağacın dallarını izleyerek uyuşmazlığın yerini bulabilirsiniz.
Devamı...
Bir mikrodenetleyicinin sürekli düğmeye basılıp basılmadığını kontrol ettiğini düşünün. Biraz, kapının önünde bekleyip zil çalacak mı diye saniyede binlerce kez bakmaya benzer! Interrupt-driven, yani kesme güdümlü programlama, mikrodenetleyicinin başka işlerle uğraşırken önemli bir olay gerçekleştiğinde haberdar edilmesini sağlar. Böylece işlemci zamanı daha verimli kullanılır ve olaylara çok daha hızlı tepki verilir.
Devamı...
Bir mikrodenetleyicinin sıcaklık sensörüne “Orası kaç derece?” diye sorduğunu hayal edin. Sensör elbette konuşamaz; ancak I²C protokolü sayesinde ölçüm verilerini elektriksel sinyallerle iletebilir. Üstelik bunun için yalnızca iki haberleşme hattı gerekir. Arduino, ESP32, Raspberry Pi Pico ve benzeri kartların sensörlerle kurduğu bu küçük ama düzenli sohbetin arkasında adresler, saat darbeleri ve onay bitleri bulunur.
Devamı...

Bir uygulamanın iş kuralları; veritabanı, web framework’ü veya mesaj kuyruğu değiştiğinde neden yeniden yazılmak zorunda kalsın? Hexagonal Architecture, diğer adıyla Ports and Adapters, tam olarak bu soruya itiraz eder. Amaç teknolojiyi yok etmek değil, onu iş mantığının patronu olmaktan çıkarıp değiştirilebilir bir yardımcıya dönüştürmektir.
Devamı...
Bir sosyal medya gönderisi, ödeme işlemi veya kargo kaydı oluşturduğunuzu düşünün. Sistem, bu kayda benzersiz bir kimlik vermeli; üstelik aynı anda çalışan milyonlarca makine birbirinden habersiz ID üretiyor olabilir. Tek bir veritabanı sayacına güvenmek kolaydır, ancak ölçek büyüyünce o masum sayaç sistemin kapısındaki uzun kuyruğa dönüşür. Distributed ID üretiminin amacı, koordinasyonu azaltırken çakışmayan, hızlı ve mümkünse sıralanabilir kimlikler oluşturmaktır.
Devamı...