
Bir robotun bardağı ezmeden tutması kolay görünür; ta ki bardak parmaklarının arasından kaymaya başlayana kadar! İnsanlar bu küçük hareketi derideki mekanoreseptörlerle fark edip kavrama kuvvetini istemsizce artırır. Dokunsal sensörler de robotlara benzer bir refleks kazandırarak basınç, titreşim, kesme kuvveti ve temas geometrisi gibi ayrıntıları ölçer.
Devamı...
Python’da bir fonksiyonun parametresine str, dönüş değerine int yazınca kodumuzun artık yanlış türlere karşı korunduğunu düşünebiliriz. Ne yazık ki bu, kapıya “Girilmez” tabelası asıp fiziksel olarak kilitlediğimizi sanmaya benzer. Type hint’ler geliştiriciye ve analiz araçlarına yol gösterir; Python yorumlayıcısı ise çoğu durumda onları yalnızca izler ve çalışmaya devam eder.
Devamı...
Bir problemi çözerken her zaman sıfırdan algoritma tasarlamak zorunda değiliz. Bazen elimizdeki soruyu, çözümünü bildiğimiz başka bir problemin kılığına sokmak yeterlidir. Bilgisayar biliminde bu yönteme indirgeme (reduction) denir. İndirgeme, algoritma tasarımından NP-tamlık ispatlarına kadar pek çok alanda kullanılan güçlü bir düşünme aracıdır.
Devamı...
Bir metindeki aynı karakter dizilerini tekrar tekrar saklamak yerine onlara kısa kodlar verseydik ne olurdu? Lempel–Ziv–Welch, yani LZW algoritması, tam olarak bu fikirle çalışan kayıpsız bir veri sıkıştırma yöntemidir. Metin, görüntü veya benzeri veriler içindeki tekrar eden kalıpları çalışma sırasında oluşturduğu bir sözlükte toplar. Böylece uzun diziler küçük sayılarla temsil edilir; veri hiçbir bilgi kaybedilmeden daha kompakt hâle gelir.
Devamı...
ln komutuyla oluşturulan sembolik ve sabit bağlar ilk bakışta aynı işi yapıyor gibi görünür: Bir dosyaya başka bir ad üzerinden erişmek. Fakat dosya silindiğinde, taşındığında veya farklı bir disk bölümü kullanıldığında iki bağ türü bambaşka davranır. Bu ayrımı anlamanın anahtarı, dosya adı yerine inode kavramına odaklanmaktır.
Devamı...
Bir drone sakin havada uslu bir robot gibi davranabilir; ancak rüzgâr başladığında işler hızla değişir. Ani yön değişimleri, pervane itkisindeki dengesizlikler ve gövde üzerindeki aerodinamik kuvvetler, İHA’yı hedeflenen konumdan uzaklaştırır. Uçuş kontrolcüsünün görevi bu bozucu etkileri algılamak, uygun motor komutlarını hesaplamak ve araç daha ne olduğunu anlamadan dengeyi yeniden kurmaktır.
Devamı...
Bir şehirden diğerine giderken navigasyon uygulaması en kısa rotayı saniyeler içinde bulabilir. Peki uygulamadan hiçbir kavşağı iki kez ziyaret etmeden mümkün olan en uzun rotayı bulmasını istersek ne olur? Masum görünen bu değişiklik, problemi algoritmalar dünyasının en çetin sınıflarından birine taşır: En Uzun Yol Problemi genel graflarda NP-zordur.
Devamı...

Bir metnin içinde en az iki kez geçen en uzun parça hangisidir? İlk bakışta bütün alt dizgileri üretip karşılaştırmak makul görünebilir. Ancak metin büyüdüğünde bu yöntem, samanlıkta iğne ararken önce bütün samanları tek tek numaralandırmaya dönüşür. Son ek dizisi ve LCP dizisi ise tekrarları düzenli, hızlı ve şaşırtıcı derecede zarif biçimde ortaya çıkarır.
Devamı...
C, işletim sistemlerinden gömülü cihazlara kadar sayısız teknolojinin görünmeyen motorudur. Sözdizimi ilk bakışta sade görünse de bellek, işlemci ve program arasındaki ilişkiyi doğrudan hissettirmesi onu öğretici ve güçlü kılar. C öğrenmek yalnızca yeni bir dil öğrenmek değil, bilgisayarın perde arkasına küçük ama oldukça aydınlatıcı bir pencere açmaktır.
Devamı...

C++ programında dosya açmak, bellek ayırmak veya kilit edinmek kolaydır; asıl macera, işler ters gittiğinde bunları güvenle bırakabilmektir. Bir istisna normal kontrol akışını aniden kesebilir. RAII (Resource Acquisition Is Initialization), kaynakların ömrünü nesnelerin ömrüne bağlayarak bu sorunu dil seviyesindeki otomatik ömür yönetimine teslim eder.
Devamı...
C++’ta bir fonksiyon çağrısının hangi bildirime bağlanacağı her zaman kodda gördüğümüz isimle sınırlı değildir. foo(x) gibi masum bir çağrı; normal isim aramasını, ad alanlarını, aşırı yük çözümlemesini ve Koenig araması olarak da bilinen ADL mekanizmasını harekete geçirir. Bu görünmez süreç doğru kullanıldığında genişletilebilir API’ler oluşturur, yanlış anlaşıldığında ise derleyicinin neden “alakasız” bir fonksiyonu seçtiğini düşündüren hatalara yol açar.

Devamı...
C dilinde çok sayıda aynı tür veriyi ayrı ayrı değişkenlerle yönetmek, her yolcu için ayrı otobüs çağırmaya benzer. Diziler ise tüm yolcuları tek araca bindirir: Veriler ardışık bellek hücrelerinde saklanır, ortak bir adla yönetilir ve indeksler sayesinde hızlıca erişilebilir hâle gelir.

Devamı...
C programında oluşturduğumuz her değişken, bellekte ayrılmış bir alanı temsil eder. Veri tipi ise derleyiciye bu alanın yaklaşık büyüklüğünü, içindeki bitlerin nasıl yorumlanacağını ve hangi işlemlerin uygulanabileceğini söyler. Kısacası değişken bir kutuysa veri tipi kutunun etiketi, sabit ise kapağı kilitlenmiş kutudur.

Devamı...
C# dünyasında interface ve struct, benzer görünen problemlere tamamen farklı yönlerden yaklaşır. Arayüzler bir türün ne yapması gerektiğini söylerken yapılar küçük verileri düşük maliyetle temsil etmeyi amaçlar. Biri davranış sözleşmesi, diğeri değer semantiği sunar. Doğru yerde kullanıldıklarında kodu hem esnek hem de hızlı hâle getirirler; yanlış tercihler ise kutulama, gereksiz kopyalama ve karmaşık tasarım gibi sürprizler doğurabilir.

Devamı...
Bir veritabanında milyonlarca kayıt bulunmasına rağmen sorguların birkaç milisaniyede sonuçlanması sihir değildir. Bu başarının arkasında, verileri disk üzerinde akıllıca düzenleyen indeksler ve özellikle B-ağaçları vardır. Dengeli, geniş ve kısa bir yapıya sahip olan B-ağaçları, pahalı disk erişimlerinin sayısını azaltarak aradığımız kayda mümkün olduğunca az adımda ulaşmamızı sağlar.
Devamı...
Bir sözlük uygulamasında binlerce kelimeyi saklamak, otomatik tamamlama yapmak veya belirli bir önekle başlayan kayıtları bulmak istediğinizi düşünün. Trie bu işler için oldukça hızlıdır; ancak her düğümde alfabenin tamamı kadar bağlantı tutması belleği adeta açık büfeye çevirebilir. Üçlü Arama Ağacı, yani Ternary Search Tree (TST), Trie’ın karakter tabanlı yaklaşımını ikili arama ağacının ekonomik bağlantı modeliyle birleştirir.
Devamı...
Bir kahve makinesini kullanmak için içindeki pompanın basıncını veya ısıtıcının devresini bilmemiz gerekmez; düğmeye basar, kahvemizi alırız. Soyut Veri Tipleri de benzer biçimde çalışır: Kullanıcıya ne yapılabileceğini gösterirken bunun nasıl yapıldığını gizler. Böylece veri yapıları daha güvenli, değiştirilebilir ve anlaşılır hâle gelir.
Devamı...
Bir sıralama algoritması yalnızca elemanları küçükten büyüğe dizmekle kalmaz; bazen eşit kabul edilen elemanların geçmişine de saygı göstermelidir. İşte kararlılık (stability), aynı sıralama anahtarına sahip elemanların başlangıçtaki göreli sırasının korunmasını ifade eder. İlk bakışta küçük bir ayrıntı gibi görünse de çok alanlı kayıtlar, raporlar ve kullanıcı arayüzleri söz konusu olduğunda sonuçları belirgin biçimde etkiler.
Devamı...
Devasa bir matristeki elemanların büyük bölümü sıfırsa, bu sıfırları bellekte saklamak biraz boş koltuklarla dolu bir otobüsü şehir turuna çıkarmaya benzer. Seyrek matris gösterimleri yalnızca anlamlı değerleri ve konumlarını saklayarak hem bellek tüketimini hem de matris-vektör çarpımının işlem maliyetini azaltır.
Devamı...
Bir düzenli ifade yazıp eşleşme arattığımızda küçük bir sihir gerçekleşir: Metinsel desen, durumlar ve geçişlerden oluşan matematiksel bir makineye dönüştürülür. Özellikle klasik regex motorlarında bu makine çoğunlukla bir belirsiz sonlu durum otomatıdır, yani NFA’dır. Gelin (a|b)*abb ifadesinin bir metni nasıl adım adım tükettiğini ve motorun arka planda hangi durumları takip ettiğini keşfedelim.

Devamı...