Python'da GIL Neden Kolayca Kaldırılamıyor?

Python geliştiricilerinin performans sohbetlerinde er ya da geç karşılaştığı bir kötü karakter vardır: Global Interpreter Lock, yani GIL. İlk bakışta çözüm basit görünür: Kilidi kaldır, bütün işlemci çekirdekleri aynı anda Python kodu çalıştırsın! Ne var ki GIL, kapının önüne yanlışlıkla bırakılmış bir sandalye değildir; CPython’ın bellek yönetimine ve geniş C uzantısı ekosistemine bağlanmış yapısal bir parçadır.

pythonda-gil-neden-26

Devamı...

PWA ve Service Worker ile Çevrimdışı Önbellek Stratejileri

Bir web sitesini uçakta, metroda veya internetin naz yaptığı bir kafede açtığınızı düşünün. Normalde tarayıcı üzgün bir hata sayfası gösterirken Progressive Web App, yani PWA, daha önce kaydedilmiş kaynakları kullanarak çalışmaya devam edebilir. Bu küçük sihrin arkasında, tarayıcı ile ağ arasında görev yapan Service Worker bulunur.

Devamı...

Julia’da Multiple Dispatch: Bilimsel Hesaplamanın Matematiksel Süper Gücü

Julia’nın bilimsel hesaplamada parlamasının arkasında yalnızca hızlı döngüler veya LLVM bulunmaz. Dilin asıl süper güçlerinden biri multiple dispatch, yani çoklu dağıtımdır. Bu yaklaşımda çalıştırılacak metot sadece ilk argümanın sınıfına göre değil, fonksiyona verilen bütün argümanların tip bileşimine göre seçilir. Böylece matematiksel işlemler hem doğal biçimde ifade edilir hem de derleyiciye güçlü optimizasyon fırsatları sunar.

Devamı...

İstihdam Algoritmaları ve Liyakat: Yapay Zeka CV’mizi Okurken Neleri Kaybediyoruz?

Bir pozisyona yüzlerce kişi başvurduğunda bütün CV’leri insanların incelemesi zorlaşıyor. Şirketler bu sorunu ATS adı verilen aday takip sistemleri ve yapay zeka destekli sıralama algoritmalarıyla çözmeye çalışıyor. Ne var ki hız kazandıran bu dijital kapıcılar, liyakati ölçmek yerine CV’de doğru sihirli kelimelerin bulunup bulunmadığını kontrol edebiliyor. Sonuçta güçlü bir aday, yalnızca deneyimini algoritmanın beklediği lehçeyle anlatmadığı için daha kapıyı çalamadan elenebiliyor.

Devamı...

InfluxDB TSM Storage Engine: Milyonlarca Zaman Serisi Verisi Diske Nasıl Sığar?

influxdb-tsm-storage-95

Bir sıcaklık sensörü düşünün: Her saniye ölçüm gönderiyor. Şimdi buna binlerce sensör, sunucu metriği ve uygulama olayı ekleyin. Ortaya sürekli büyüyen bir veri nehri çıkar. InfluxDB’nin TSM, yani Time-Structured Merge Tree motoru, bu nehri klasik veritabanları gibi satır satır saklamak yerine zamanın düzeninden yararlanarak sıkıştırır ve diske verimli biçimde aktarır.

Devamı...

İmposter Sendromunun Kodlara Etkisi: Aşırı Mühendislik Bir Savunma Mekanizması mı?

Basit bir kullanıcı ayarı kaydetmek için neden üç arayüz, iki fabrika, bir strateji deseni ve gelecekte kurulabilecek uzay kolonilerine hazır bir eklenti sistemi yazdık? Yanıt her zaman teknik gereksinimler değildir. Bazen yazılımcı, yeterliliğini kanıtlamak veya eleştiriden korunmak için çözümü bilinçsizce karmaşıklaştırır. İmposter sendromu ile aşırı mühendislik arasındaki ilişki tam da bu noktada ortaya çıkar.

imposter-sendromunun-kodlara-26

Devamı...

GraphQL Subscription ile WebSocket Üzerinden Gerçek Zamanlı Veri Akışı

Bir mesaj uygulamasında yeni iletileri görmek için sayfayı sürekli yenilemek zorunda kaldığınızı düşünün. Pek modern sayılmaz, değil mi? GraphQL Subscription, sunucuda gerçekleşen olayları WebSocket bağlantısı üzerinden istemciye anında ileterek bu sorunu çözer. Böylece sohbet mesajları, bildirimler, canlı skorlar ve sipariş durumları gecikmeden arayüze yansıtılabilir.

graphql-subscription-ile-19

Devamı...

Dokümantasyon Yazma Psikolojisi: Kod Konuşurken İnsan Neden Susar?

Yeni bir özellik geliştirmek çoğu yazılımcıya heyecan verir: problem çözülür, testler yeşile döner ve ekranda somut bir sonuç belirir. Aynı geliştiriciden özelliği açıklaması istendiğinde ise görünmez bir duvar yükselir. Çünkü kod yazmak makineye kesin talimatlar vermekken dokümantasyon yazmak, başka insanların eksik bilgilerini ve muhtemel yanlış anlamalarını tahmin etmeyi gerektirir.

dokumantasyon-yazma-psikolojisi-23

Devamı...

Dart Isolate’leri: Tek İplikli Dünyada Arayüzü Dondurmadan Ağır İşler

Flutter uygulamanız akıcı biçimde kayarken bir JSON dosyasını ayrıştırmaya başladınız ve ekran aniden buza mı dönüştü? Suçlu çoğu zaman Dart değil, ağır işi arayüzün çalıştığı isolate üzerinde yapmamızdır. Dart isolate’leri; hesaplama, ayrıştırma ve veri dönüştürme gibi pahalı görevleri bağımsız çalışma alanlarına taşıyarak kullanıcı arayüzünün nefes almaya devam etmesini sağlar.

Devamı...

Clojure Transducers: Ara Koleksiyonlar Olmadan Verimli Veri İşleme

Bir milyon sayıyı dönüştürmek, bazılarını elemek ve sonucu toplamak istediğinizi düşünün. Klasik bir map–filter zinciri gayet okunaklıdır; ancak her adım ara koleksiyonlar üretebilir veya tembel diziler üzerinden ek soyutlama maliyeti getirebilir. Clojure transducers, dönüşümün nasıl saklandığını değil, nasıl uygulandığını tarif ederek bu zinciri veri kaynağından bağımsız ve şaşırtıcı derecede verimli hâle getirir.

Devamı...

Çevik Metodolojilerin İllüzyonu: Scrum Mikro-Yönetimin Yeni Adı mı?

Agile, uzun planların ve ağır onay mekanizmalarının yerine esneklik, iş birliği ve otonomi getirme vaadiyle doğdu. Ne var ki bazı şirketlerde bu fikir; günlük sorgular, saatlik performans takibi ve geliştiricileri yarıştıran puan tablolarıyla bambaşka bir şeye dönüşüyor. Böyle ortamlarda Scrum, çevikliği sağlayan bir çerçeve olmaktan çıkıp takımın üzerine giydirilmiş renkli bir mikro-yönetim kostümüne benzeyebiliyor.

Devamı...

C# LINQ’in Perde Arkası: Expression Tree ve Ertelenmiş Çalıştırma

LINQ sorguları ilk bakışta koleksiyonlar üzerinde çalışan zarif döngüler gibi görünür. Ancak aynı sözdizimi bazen bellekteki nesneleri filtrelerken bazen de kilometrelerce uzaktaki bir veritabanına SQL gönderir. Bu küçük sihrin arkasında iki önemli mekanizma bulunur: sorguyu veri yerine bir mantık modeli olarak temsil eden Expression Tree yapıları ve çalışmayı ihtiyaç duyulana kadar erteleyen deferred execution davranışı.

Devamı...

Apache Kafka'da Exactly-Once Semantics: Mesaj Tekrarını Kayıpsız Engellemek

apache-kafkada-exactly-44

Dağıtık sistemlerin klasik kâbusu şudur: Servis ödemeyi işler, Kafka’ya onay gönderirken ağ kopar ve mesajın ulaşıp ulaşmadığını öğrenemez. Tekrar gönderirse müşteri iki kez ücretlendirilebilir; göndermezse işlem kaybolabilir. Apache Kafka’nın Exactly-Once Semantics, yani EOS mimarisi, yeniden denemeleri yasaklamak yerine aynı mantıksal işlemin sonuçlarını yalnızca bir kez görünür hâle getirir.

Devamı...

Açık Kaynak Topluluklarında Liderlik Çatışmaları: Forklamanın Sosyolojisi

Açık kaynak projeleri yalnızca kod depolarından ibaret değildir; kuralları, statüleri, ritüelleri ve güç ilişkileri bulunan küçük toplumlardır. Bu nedenle bir projenin forklanması bazen teknik bir ihtiyaçtan çok anayasal kriz gibidir. Geliştiriciler kodu kopyalarken aslında yönetişim modelini, liderlik anlayışını ve topluluğun geleceğine ilişkin beklentilerini de yeniden tanımlar.

Devamı...

Zig Dilinde comptime: Derleme Zamanı Kod Çalıştırmanın En Zarif Hali

C makrolarının metin değiştirme numaralarıyla, C++ şablonlarının hata mesajı destanları arasında kaybolduysanız Zig’in comptime özelliği ferah bir nefes gibi gelebilir. Zig, metaprogramlamayı ayrı ve gizemli bir alt dil olmaktan çıkarır: Normal Zig kodunu, uygun veriler biliniyorsa derleme sırasında çalıştırır. Böylece tür üretmekten matematiksel hesaplamalara kadar pek çok iş, çalışma zamanına yük bindirmeden yapılabilir.

zig-dilinde-comptime-26

Devamı...

WebAssembly Dışına Çıkış: WASI ile Tarayıcıdan Bağımsız Wasm

WebAssembly denildiğinde çoğumuzun aklına tarayıcıda çalışan hızlı uygulamalar gelir. Oysa Wasm, taşınabilir bir ikili kod biçimidir; JavaScript’e veya tarayıcıya mahkûm değildir. Eksik parça, modülün dosya sistemi, saat, rastgele sayı üreticisi ve ağ gibi işletim sistemi kaynaklarıyla nasıl konuşacağını tanımlayan standart bir arayüzdür. İşte WASI, yani WebAssembly System Interface, bu boşluğu güvenli ve taşınabilir biçimde doldurur.

webassembly-disina-cikis-98

Devamı...

Web Components ile Çerçevesiz Geliştirme Dönemi

Modern web geliştirme denince akla hemen React, Angular veya Vue geliyor. Oysa tarayıcılarımız uzun süredir kendi bileşen sistemini taşıyor: Web Components. Custom Elements, Shadow DOM ve HTML Templates standartlarını bir araya getirerek herhangi bir çerçeveye bağlanmadan yeniden kullanılabilir arayüzler oluşturabiliriz. Üstelik ortaya çıkan bileşenler düz HTML’de, React projesinde veya yıllar sonra çıkacak başka bir teknolojide çalışabilir.

web-components-ile-85

Devamı...

V8 Motorunda Hidden Classes: JavaScript Nesneleri Nasıl Hızlı Çalışır?

JavaScript nesneleri çalışma sırasında özgürce değişebilir: Yeni özellikler eklenir, eskileri silinir ve türler aniden dönüşebilir. Bu esneklik kullanışlı olsa da işlemci açısından pek romantik değildir. V8 motoru, nesnelere Hidden Class adı verilen dahili şekil haritaları atayarak bu belirsizliği azaltır ve özellik erişimini statik dillere şaşırtıcı derecede yaklaştırır.

v8-motorunda-hidden-57

Devamı...

TypeScript’te Conditional Types ve Mapped Types ile İleri Düzey Tip Jimnastiği

TypeScript’in tip sistemi yalnızca string veya number yazıp hataları erkenden yakalamaktan ibaret değildir. Conditional Types ve Mapped Types sayesinde tipler üzerinde koşul çalıştırabilir, koleksiyonları dönüştürebilir ve API sözleşmelerini otomatik üretebiliriz. Başka bir deyişle derleyiciye küçük ama son derece titiz bir program yazdırırız; üstelik bu program çalışma zamanında değil, kod daha çalışmadan önce görev yapar.

Devamı...