Her an çevrimiçi olmak, ilk bakışta yalnızlığın panzehiri gibi görünür: Mesajlar gelir, bildirimler yanar, yüzlerce kişinin hayatına birkaç saniyede dokunuruz. Buna rağmen bilgi toplumunun en ilginç çelişkilerinden biriyle karşı karşıyayız: Dijital temas arttıkça bazı kullanıcıların psikolojik izolasyon hissi de büyüyor. Sorun bağlantı sayısında değil; bağlantının niteliğinde, karşılıklılığında ve gerçek hayattaki sosyal bağların yerini ne kadar doldurabildiğinde yatıyor.
Devamı...
Sabah işe yetişmeye çalışırken en kısa rotayı seçmeniz, markette bütçenize göre ürünleri elemeniz veya kayıp anahtarınızı odaları sırayla kontrol ederek aramanız tesadüf değildir: beyniniz küçük algoritmalar çalıştırır. Algoritmik düşünme, yalnızca bilgisayar bilimcilerinin süper gücü değil; belirsiz bir hedefi adımlara, koşullara ve tekrar eden kalıplara dönüştürme becerisidir. Yazılım öğrenmenin ilginç tarafı da şudur: Kod yazarken yeni bir mantık edinmekten çok, zaten kullandığınız zihinsel stratejileri görünür ve denetlenebilir hâle getirirsiniz.
Devamı...
Bir algoritmanın ayrımcılık yapması için kötü niyetli bir geliştiriciye ihtiyacı yoktur. Çoğu zaman algoritma yalnızca geçmişte insanların verdiği kararları, toplumsal eşitsizlikleri ve görünmez kalıpları çok hızlı biçimde öğrenir. İşe alım sisteminden kredi puanına, yüz tanımadan içerik önerilerine kadar otomatik karar mekanizmaları; verinin içindeki sosyal izleri geleceğe taşıyabilir. Sorun, makinenin “önyargılı düşünmesi” değil, istatistiksel olarak başarılı görünürken tarihsel adaletsizlikleri yeniden üretmesidir.

Devamı...

Bir 2D akıl oyununda kutunun duvardan geçmemesi, taşların aynı kareyi paylaşmaması veya oyuncunun engelde durması ilk bakışta basit görünür. Ancak bu davranışın arkasında geometri, vektör matematiği ve doğru zamanlama vardır. Çarpışma tespiti iki soruya cevap verir: Nesneler temas ediyor mu? Ediyorsa, oyun onları nasıl ayırmalı? İlk soru algılama (detection), ikinci soru ise çözümleme (resolution) aşamasıdır.
Devamı...
Açık kaynak projeleri, ilk bakışta internetin en tuhaf sosyal deneylerinden biri gibi görünür: Farklı kıtalarda yaşayan, çoğu zaman birbirinin gerçek adını bile bilmeyen insanlar; bir hata kaydını kapatmak, dokümantasyonu çevirmek ya da küçük bir fonksiyonu iyileştirmek için birlikte çalışır. Üstelik bu emeğin karşılığında doğrudan maaş, ofis kahvesi veya performans primi yoktur. Bu düzenin yakıtı para değil; ortak amaç, itibar, öğrenme arzusu ve iyi tasarlanmış işbirliği mekanizmalarıdır.
Devamı...

Bir satranç motoru ya da bir zeka oyunu ajanı, hamle ağacında ilerlerken şaşırtıcı derecede sık biçimde aynı tahtaya yeniden ulaşır. Farklı hamle sıraları aynı konumu üretebilir; ayrıca arama algoritmaları önceki derinliklerde gördüğü dalları tekrar ziyaret edebilir. Her seferinde konumu sıfırdan değerlendirmek, motorun işlemcisini adeta aynı bulmacayı tekrar tekrar çözen sabırsız bir öğrenciye dönüştürür. Zobrist Hashing, oyun durumlarını çok hızlı biçimde parmak iziyle temsil ederek bu tekrarları yakalamayı sağlar.
Devamı...
Bir DNA dizisindeki yinelenen gen parçalarını, kaynak koddaki kopyalanmış blokları ya da büyük bir metindeki en sık tekrar eden ifadeleri aradığınızı düşünün. Tüm alt dizileri üretip karşılaştırmak ilk anda cazip görünür; fakat uzunluğu $n$ olan bir dizide aday sayısı yaklaşık $O(n^2)$ seviyesine çıkar. Suffix ağacı (son ek ağacı), bu karmaşayı düzenli bir yapıya dönüştürür ve en uzun tekrarlayan alt diziyi etkileyici biçimde verimli bulmamızı sağlar.

Devamı...
Bir Sudoku üreticisi, ekrana rastgele sayılar serpiştirmekten çok daha fazlasıdır: Ortaya çıkan tahtanın geçerli, tek çözümlü, estetik açıdan dengeli ve hedeflenen zorlukta olması gerekir. Bu hedeflerin merkezinde derinlik öncelikli arama (DFS) ile çalışan geri izleme, yani backtracking, bulunur. Algoritma yanlış bir seçime girdiğinde panik yapmaz; son kararı geri alır, başka olasılığı dener ve sabırla çözüm uzayını tarar.
Devamı...

SQLite, çoğu geliştiricinin telefonunda, masaüstü uygulamasında veya küçük bir projede kullandığı “tek dosyalık veritabanı” olarak bilinir. Ancak onu yalnızca basit bir SELECT ve INSERT aracı saymak büyük haksızlık olur. Sunucu gerektirmemesi, yapılandırma maliyetinin düşük olması ve ACID garantileri sunması; SQLite’ı prototiplerden üretim sistemlerine uzanan etkileyici bir seçenek hâline getirir.
Devamı...
Satranç motorları çoğu zaman milyonlarca hamleyi değerlendirerek güçlü tahminler yapar; ancak taşlar iyice azaldığında tahmine gerek kalmaz. Oyun sonu tabloları ya da tablebase’ler, yedi taşa kadar her yasal konumun sonucunu önceden hesaplayan devasa veritabanlarıdır. Bir konum için cevap nettir: beyaz kazanır, siyah kazanır ya da oyun beraberedir. Dahası, doğru hamle de bellidir. Bu nedenle tablebase kullanan bir motor, kapsanan oyun sonunda “çok iyi” değil, matematiksel olarak kusursuz oynar.

Devamı...

Bir metin editöründe milyonlarca karakterlik bir günlük dosyasını açtığınızı düşünün. Ortasına tek bir cümle eklemek bile, klasik string yaklaşımında metnin geri kalanını kaydırmayı gerektirebilir. Rope (halat) veri yapısı tam bu noktada devreye girer: Metni tek ve dev bir karakter dizisi yerine, küçük parçalardan oluşan dengeli bir ağaç olarak saklar. Böylece ekleme, silme ve birleştirme işlemleri tüm metni taşımak yerine yalnızca ilgili dalları değiştirir.
Devamı...
Geleneksel birim testleri, belirli girdiler için beklenen çıktıları doğrular: topla(2, 3) == 5 gibi. Bu yaklaşım vazgeçilmezdir; ancak geliştiricinin hiç düşünmediği binlerce uç durum kapının dışında kalabilir. Property-Based Testing (özellik tabanlı test), tek tek örnekler yazmak yerine fonksiyonun her zaman sağlaması gereken genel kuralları tanımlar. Test aracı da çok sayıda girdi üreterek bu kuralları zorlamaya başlar. Kısacası siz dedektifin kural kitabını yazarsınız, araç ise şüpheli vakaları bulur.
Devamı...
Hash tabloları, anahtarları hızlıca bulmanın süper kahramanıdır; fakat klasik yaklaşımlarda iki anahtarın aynı kovaya düşmesi, yani çakışma, kaçınılmazdır. Perfect hashing ise özellikle anahtar kümesinin önceden bilindiği durumlarda bu dramayı tamamen ortadan kaldırır. Amaç, her anahtarı benzersiz bir hücreye yerleştiren ve sorguları sabit zamanda gerçekleştiren bir hash fonksiyonu tasarlamaktır.
Devamı...

Bir masa oyununun sonunu hamle hamle tahmin etmek bazen sezgiye, bazen de bolca şansa bırakılır. Ancak iki oyuncunun da kusursuz oynadığı, şans faktörü içermeyen ve her hamlenin oyunu bitişe yaklaştırdığı tarafsız kombinatoryal oyunlarda sonuç matematikle belirlenebilir. Sprague-Grundy teoremi, farklı görünen oyunları bile birer Nim yığınına dönüştürerek “kazanan kim?” sorusuna kesin bir yanıt verir.
Devamı...

Bir uygulamanın kullanıcı parolasını hiç görmeden Google Drive dosyalarına erişebilmesi nasıl mümkün olur? OAuth 2.0, tam da bu problemi çözen bir yetkilendirme çerçevesidir. Kullanıcı, bir uygulamaya belirli ve sınırlı izinler verir; uygulama ise bu izinleri temsil eden token’larla API çağrıları yapar. Böylece parola paylaşımı yerine kontrollü, süreli ve gerektiğinde geri alınabilir erişim sağlanır.
Devamı...
Nonogramlar, satır ve sütun kenarlarındaki sayı ipuçlarından hareketle hangi hücrelerin boyanacağını bulduğumuz görsel mantık bulmacalarıdır. İnsan için keyifli bir dedektiflik oyunu olan bu yapı, bilgisayar için de kısıt programlamanın (Constraint Programming, CP) oldukça temiz bir uygulamasıdır: Her hücre bir karar değişkeni, her ipucu ise çözüm uzayını daraltan bir kuraldır.
Devamı...
Bir satranç motoru yalnızca taş saymaz; şah güvenliğini, piyon yapısını, merkez kontrolünü ve taşların gelecekteki hareket alanını da sayısallaştırmaya çalışır. Minimax algoritması hamle ağacında en iyi kararı ararken, ağacın derinliğinin yetmediği yaprak düğümlerde bir değerlendirme fonksiyonuna ihtiyaç duyar. Bu fonksiyon, “Bu konum kimin için daha iyi?” sorusunu matematiksel bir skora dönüştürür.

Devamı...
Modern uygulamalarda servislerin birbirini doğrudan ve anında çağırması ilk bakışta pratik görünür. Ancak trafik arttığında, bir servis bakımdayken veya anlık hata yaşadığında bu sıkı bağlantı zincirleme sorunlara dönüşür. Message Queue (mesaj kuyruğu) sistemleri, servisler arasına dayanıklı bir posta merkezi koyarak veriyi zamandan bağımsız ve güvenli biçimde taşır.

Devamı...

Bir programı kaynak koddan çalışabilir makine komutlarına dönüştürmek, yalnızca if ifadelerini çevirmekten çok daha büyük bir iştir. Farklı işlemciler, optimizasyonlar, hata mesajları ve hata ayıklama bilgileri derken derleyici geliştirmek hızla devasa bir projeye dönüşür. LLVM, tam bu karmaşıklığı yönetmek için doğmuş; bugün Clang, Rust, Swift ve Julia gibi pek çok teknolojinin kullandığı modüler bir derleyici altyapısıdır.
Devamı...
Bazı dinamik programlama problemleri ilk bakışta masum görünür: Her durum için önceki tüm durumları denersiniz, en iyisini seçersiniz. Ancak bu yaklaşım çoğu zaman $O(n^2)$ maliyet üretir. Convex Hull Trick (CHT), geçiş maliyetinin doğrusal fonksiyonlara ayrıştığı özel durumlarda bu taramayı akıllı bir geometrik sorguya dönüştürür. Doğru koşullarda karmaşıklığı $O(n \log n)$, hatta $O(n)$ seviyesine indirebilir.
Devamı...