Pivot Kim Olacak? Quicksort’tan Toplumsal Hiyerarşilere Algoritmik Bir Yolculuk

Bir sınıftaki öğrencileri nota, çalışanları performansa veya kredi başvurularını risk puanına göre sıraladığımızı düşünelim. İlk bakışta bu işlemler Quicksort’un yaptığına benzer: Bir ölçüt seçilir, herkes bu ölçüte göre gruplara ayrılır ve düzen ortaya çıkar. Ancak insanları sıralarken kullanılan “pivot”, yalnızca teknik bir değişken değildir; fırsatları, görünürlüğü ve gücü belirleyen toplumsal bir tercihe dönüşebilir.

Devamı...

Neden Eski COBOL Kodları Hâlâ Bankaları Ayakta Tutuyor?

Bir banka kartıyla kahve aldığınızda, işleminizin arkasında sizden, baristadan ve muhtemelen kahve makinesinden daha yaşlı bir kod çalışıyor olabilir. 1959’da geliştirilen COBOL, modern görünmemesine rağmen hesap bakiyelerinden maaş ödemelerine kadar kritik finansal süreçleri yönetmeye devam ediyor. Bu durum yalnızca teknik bir nostalji değil; toplumun görünmez biçimde eski yazılımlara bağlandığını gösteren devasa bir mühendislik hikâyesidir.

Devamı...

Neden Bazı Programcılar Vim’i Bırakamıyor? Alışkanlık, Kimlik ve Araç Bağımlılığı

Bir programcının Vim hakkında konuşmaya başlaması bazen teknik bir sohbetten çok aile yadigârını anlatmasına benzer. “Hızlı”, “hafif” ve “her sunucuda var” gibi makul gerekçeler sıralanır; ardından tuş kombinasyonları, nokta komutu ve fare kullanmamanın erdemleri gelir. Fakat Vim bağlılığını yalnızca verimlilikle açıklamak eksik kalır. Burada alışkanlık döngüleri, emekle kurulan duygusal bağ, topluluk üyeliği ve profesyonel kimlik aynı terminal penceresinde buluşur.

Devamı...

LocalStorage ve Fetch API ile Tarayıcıda Dinamik Veri Yönetimi

Modern web uygulamaları yalnızca ekranda bilgi göstermez; kullanıcı tercihlerini hatırlar, sunuculardan güncel veriler alır ve bağlantı kesildiğinde bile belirli işlevleri sürdürebilir. JavaScript’in LocalStorage ve Fetch API araçları, bu deneyimi oluşturmanın iki temel parçasıdır. Biri verileri tarayıcıda saklarken diğeri uygulamanın dış dünyayla konuşmasını sağlar.

Devamı...

Kuantum Bilgisayarların Felsefi Kâbusu: Süperpozisyon Özgür İradeyi Kurtarabilir mi?

Klasik bilgisayarların dünyasında bitler uslu çocuklardır: Ya 0’dırlar ya da 1. Kuantum bilgisayarlardaki kübitler ise ölçülene kadar her iki olasılığı da taşıyabilir. Bu tuhaflık, “Evren önceden yazılmış bir program mı?” sorusunu yeniden gündeme getiriyor. Fakat küçük bir uyarı: Bir kübitin kararsız görünmesi, insanın özgür olduğu anlamına otomatik olarak gelmez.

Devamı...

Her On Yılın “Nihai Programlama Dili”: Bitmeyen Teknolojik İyimserlik Döngüsü

Yazılım dünyası belirli aralıklarla aynı heyecanı yeniden yaşar: Yeni bir programlama dili çıkar, eski dillerin bütün kusurlarını çözdüğü söylenir ve kısa süre içinde onun “geleceğin tek dili” olacağı ilan edilir. Fakat gelecek geldiğinde o dil ya belirli bir alana yerleşmiş, başka araçlarla birlikte kullanılmaya başlanmış ya da sessizce teknoloji tarihindeki yerini almıştır. Bu durum yalnızca pazarlama hevesi değil; yazılımın doğasından kaynaklanan döngüsel bir iyimserliktir.

Devamı...

Fonksiyonel Programlamanın Budist Yanı: Yan Etkisiz Bir Hayat Mümkün mü?

Bir fonksiyonun dış dünyaya tutunmadan yalnızca aldığı değerlerle çalışması, zihnin geçmişe ve beklentilere tutunmadan ânı gözlemlemesine şaşırtıcı biçimde benzer. Fonksiyonel programlama ile Budist düşünce aynı şey değildir; fakat saflık, değişmezlik ve bağımlılıkların farkında olma kavramları üzerinden verimli bir benzetme kurabiliriz. Belki aydınlanmaya ulaşamayız ama en azından üretimde gizemli biçimde değişen global değişkenlerden kurtulabiliriz.

Devamı...

ES Modules ile Büyük Projelerde Kod Organizasyonu

Bir JavaScript projesi büyüdükçe tek dosyada yaşayan kod, çekmecesine ne bulursa atan bir geliştiricinin odasına dönüşebilir. Değişkenler çakışır, fonksiyonların nerede kullanıldığı belirsizleşir ve küçük bir değişiklik beklenmedik yerleri bozar. ES Modules, kodu anlamlı dosyalara bölerek bu karmaşayı yönetmemizi ve dosyalar arasındaki bağı açıkça tanımlamamızı sağlar.

Devamı...

Derleyicilerin Sabrı: Bir Program Kaç Kez Reddedilerek Öğrenilir?

Programlama öğrenirken derleyicinin kırmızı hata mesajları bazen kişisel bir eleştiri gibi hissedilir: “Yine olmadı!” Oysa derleyici öfkeli bir kapı görevlisi değil, son derece katı kuralları olan bir dil öğretmenidir. Programımızı her reddedişinde neyi henüz doğru ifade edemediğimizi gösterir. Bu nedenle başarılı bir program, çoğu zaman ilk denemede kabul edilen değil; geri bildirimlerle adım adım düzeltilen programdır.

Devamı...

Bellek Sızıntılarının Psikanalizi: Kodun Bilinçdışında Biriken Nesneler

Bir program bazen hiçbir şeyi unutamaz. Kullanıcı pencereyi kapatır, işlem tamamlanır, nesnenin hikâyedeki rolü biter; fakat kod, geçmişiyle bağını kesmez. Belleğin karanlık bir köşesinde duran bu nesneler, dijital bilinçdışının bastırılmış anıları gibidir. Uygulama çalışmayı sürdürürken onların kapladığı alan büyür ve sonunda sistem, konuşamadığı meseleleri RAM tüketerek ifade etmeye başlar.

Devamı...

Terminaldeki Yalnızlık: Uzaktan Çalışma Yazılımcının Zihinsel Haritasını Nasıl Değiştiriyor?

Uzaktan çalışmak ilk bakışta yazılımcının doğal yaşam alanı gibi görünür: Sessiz bir oda, güçlü bir bilgisayar ve toplantılar arasında uzanan kesintisiz kodlama saatleri… Ancak ofis sohbetleri, omuz üzerinden yapılan kısa yardımlar ve birlikte içilen kahveler kaybolduğunda yalnızca çalışma ortamı değil, zihnin problem çözme biçimi de değişir. Terminal aynı terminaldir; fakat ona bakan kişi artık farklı bir bilişsel haritada ilerler.

Devamı...

Operatörlerden Döngülere: Programlarda Karar ve Akış Kontrolü

Bir programı yalnızca sırayla çalışan komutlar bütünü olmaktan çıkaran şey, karar verebilmesi ve belirli işlemleri tekrarlayabilmesidir. Operatörler verileri işlerken akış kontrol yapıları programın hangi yoldan ilerleyeceğini belirler. Kısacası operatörler mutfaktaki araçlar, koşullar ve döngüler ise şefin tarif planıdır.

Devamı...

Nesneler ve JSON: Gerçek Dünyayı Anahtar-Değerlerle Modellemek

Bir kullanıcıyı, otomobili veya kahve makinesini yazılım dünyasına taşımak istediğimizde yalnızca birkaç bağımsız değişken kullanmak kısa sürede karmaşaya yol açar. Nesneler, bir varlığa ait bilgileri anlamlı bir bütün hâlinde toplar. JSON ise bu anahtar-değer düzenini sistemler arasında aktarılabilen standart bir metne dönüştürür.

Devamı...

Modern JavaScript’te var, let ve const: Kapsamın Görünmeyen Sınırları

JavaScript’te değişken tanımlamak kolay görünür: Bir anahtar kelime seçer, isim verir ve değeri atarsınız. Ancak var, let ve const arasındaki seçim yalnızca sözdizimsel bir tercih değildir. Bu kelimeler; değişkenin nerede erişilebilir olduğunu, ne zaman oluşturulduğunu ve yeniden atanıp atanamayacağını belirler. Yanlış seçim, özellikle iç içe bloklarda oldukça şaşırtıcı hatalar doğurabilir.

Devamı...

Kendi Kendini Yazan Kod: Otomatik Programlama Rüyasının Antik Kökleri

Bugün bir LLM’ye “bana bir REST API yaz” dediğimizde birkaç saniye içinde kodla karşılaşmak büyüleyici görünüyor. Ancak makinenin talimat üretmesi, insanın niyetini biçimsel işlemlere dönüştürmesi ve hatta kendi davranışını kurması fikri yeni değil. Otomatik programlama rüyası; mekanik ördeklerden derleyicilere, mantık makinelerinden modern kod asistanlarına uzanan binlerce yıllık bir merakın son perdesi.

Devamı...

Kapanışlar ve Sözcüksel Kapsam: Fonksiyonların Hafızası

Bir fonksiyon çalışmasını tamamladığında yerel değişkenlerinin ortadan kaybolmasını bekleriz. Ancak kapanışlar, iç içe geçmiş fonksiyonlara şaşırtıcı bir yetenek kazandırır: İç fonksiyon, onu oluşturan dış fonksiyon çoktan sona ermiş olsa bile dış kapsamdaki değişkenlere erişebilir. Bu davranış sihir değil; sözcüksel kapsam, fonksiyon değerleri ve çalışma zamanı ortamlarının birlikte çalışmasının sonucudur.

Devamı...

JavaScript’te this Anahtar Kelimesi: Bağlamı Çağrı Anında Çözmek

JavaScript’te this, ilk bakışta “fonksiyonun sahibi” gibi görünür; ancak gerçekte değeri fonksiyonun nerede tanımlandığından çok nasıl çağrıldığına bağlıdır. Aynı fonksiyon bir çağrıda kullanıcı nesnesini, başka bir çağrıda global nesneyi, hatta undefined değerini gösterebilir. Bu yüzden this, değişmez bir adres etiketi değil, çalışma zamanında çözülen dinamik bir bağlam referansıdır.

Devamı...

JavaScript’te Hoisting ve Çalışma Bağlamı: Motor Perde Arkasında Ne Yapıyor?

JavaScript kodu satır satır çalışan basit bir tarif gibi görünür; ancak motor, ilk satırı yürütmeden önce mutfağı çoktan düzenlemiştir. Değişken ve fonksiyon bildirimleri için bellek ayırır, kapsamları oluşturur ve erişim kurallarını belirler. Hoisting adı verilen davranış, bildirimlerin gerçekten kaynak kodun başına taşınması değil, çalışma bağlamının hazırlanma aşamasında belleğe kaydedilmesidir. Bu ayrım bilinmediğinde kod, küçük bir sihir gösterisinden hızla hata avına dönüşebilir.

Devamı...

JavaScript Veri Tipleri, Bellek ve Otomatik Tip Dönüşümleri

JavaScript’te "5" + 2 işleminin "52", "5" - 2 işleminin ise 3 üretmesi ilk bakışta motorun zar attığını düşündürebilir. Oysa bu davranışların arkasında belirli dönüşüm kuralları bulunur. İlkel ve referans tiplerinin bellekte nasıl temsil edildiğini, değerlerin nasıl kopyalandığını ve otomatik tip dönüşümünün hangi adımlarla gerçekleştiğini anlamak; şaşırtıcı hataları önlemenin en etkili yollarından biridir.

Devamı...

JavaScript Temelleri: Dinamik Tip Sisteminin Perde Arkası

JavaScript’e C veya C++ dünyasından gelenlerin ilk şaşkınlığı genellikle şudur: Bir değişken nasıl olur da önce sayı, birkaç satır sonra metin olabilir? Bunun nedeni JavaScript’in dinamik tipli bir dil olmasıdır. Tür bilgisi değişken adına değil, çalışma zamanındaki değere bağlıdır. Bu esneklik hızlı geliştirme sağlarken bazı sürprizleri de beraberinde getirir.

Devamı...