Python’da a + b yazdığımızda masum görünen bir toplama işlemi gerçekleşir. Ancak perdenin arkasında Python, nesnelerin özel metotlarını çağırarak küçük bir tiyatro sahneler. Bu dunder metotları kodu doğal ve okunabilir hâle getirebilir; yanlış kullanıldıklarında ise + işaretinin toplama mı, birleştirme mi, yoksa bambaşka bir sihir mi yaptığı belirsizleşir.
Devamı...
Python’da bir döngünün içinde metin += parça yazmak son derece doğal görünür. Kod okunaklıdır, çalışır ve küçük verilerde hiçbir sorun hissettirmez. Ancak metin büyüdükçe bu masum işlem, aynı karakterleri tekrar tekrar taşıyan gizli bir performans faturasına dönüşebilir. Gelin bu faturanın nereden geldiğini, ne zaman önemli olduğunu ve str.join() yaklaşımının neden genellikle daha güvenli olduğunu inceleyelim.
Devamı...
Java projesi büyüdükçe sınıfları aynı klasöre doldurmak, çorap çekmecesinde USB kablosu aramaya benzer. Paketler kodu anlamlı bölümlere ayırırken arayüzler sınıfların hangi davranışları sunacağını tanımlar. Böylece hem düzenli hem de farklı implementasyonlara açık bir mimari kurulur.
Devamı...
Java 8 ile hayatımıza giren lambda ifadeleri, davranışı veri gibi taşımanın kısa ve güçlü bir yoludur. Başka bir deyişle, yalnızca değerleri değil, çalıştırılacak işlemleri de metotlara gönderebiliriz. Bu yaklaşım; tekrar eden kodu azaltır, koleksiyon işlemlerini okunabilir hâle getirir ve Java’ya fonksiyonel programlama dünyasından kullanışlı araçlar kazandırır.
Devamı...
Java’da kalıtım, ortak davranışları tek bir üst sınıfta toplayarak daha düzenli ve tekrar kullanılabilir kod yazmamızı sağlar. Bir aile ağacı gibi çalışan bu yapı sayesinde alt sınıflar üst sınıfın özelliklerini devralabilir, gerektiğinde davranışları değiştirebilir ve kendi yeteneklerini ekleyebilir. Ancak güç beraberinde sorumluluk getirir: Yanlış tasarlanan bir hiyerarşi, kodu kısa sürede dijital bir makarna tabağına dönüştürebilir.

Devamı...
Bir uygulamada verileri saklamak kolaydır; onları doğru sırada tutmak, tekrarları engellemek ve hızlıca bulmak ise asıl meseledir. Java Collections Framework, bu ihtiyaçlar için List, Set ve Map gibi hazır veri yapıları sunar. Böylece tekerleği yeniden icat etmek yerine doğru koleksiyonu seçip iş mantığına odaklanabiliriz.

Devamı...
Bir robot kolu hedefe giderken yalnızca “Nereye ulaşmalıyım?” sorusunu sormaz; eklemlerinin ne kadar dönebileceğini de hesaba katmak zorundadır. Yörünge geometrik olarak kusursuz görünse bile eklem sınırları alternatif hareketleri kapatarak robotu tekil veya tekilliğe çok yakın bir konfigürasyona zorlayabilir. Sonuçta hızların büyüdüğü, kontrolün zorlaştığı ve robotun dramatik biçimde “Ben buradan dönemiyorum!” dediği bir durum ortaya çıkar.

Devamı...
Bir üzümü kabuğunu yırtmadan soymaya çalıştığınızı düşünün; şimdi bunu milimetrik damarların arasında, robot kollarıyla ve ekrana bakarak yaptığınızı hayal edin. Robotik cerrahi yüksek çözünürlüklü görüntü ve hassas hareket kontrolü sağlasa da cerrahın doğal bir yeteneğini sınırlayabilir: dokunmayı. Haptik geri bildirim, robotun karşılaştığı kuvvetleri cerrahın ellerine aktararak bu eksik halkayı tamamlamayı amaçlar.
Devamı...

C# çoğunlukla güvenli ve yönetilen bir dünyada çalışır: Belleği çöp toplayıcı düzenler, dizilerin sınırları denetlenir ve geliştirici adres hesaplarıyla uğraşmaz. Ancak görüntü işleme, oyun motorları, yerel kütüphane entegrasyonu veya çok düşük gecikmeli sistemler söz konusu olduğunda bu konforun küçük bir performans maliyeti olabilir. unsafe kod, C# geliştiricisine C++ benzeri işaretçilerle belleğe doğrudan erişim imkânı verir. Güçlüdür; fakat emniyet kemerini çıkarmaya benzediği için dikkatli kullanılmalıdır.
Devamı...

Kalıtım, bir sınıfın başka bir sınıftaki veri ve davranışları devralmasını sağlayan nesne yönelimli programlama tekniğidir. C# tarafında bu mekanizma yalnızca kod tekrarını azaltmaz; doğru kullanıldığında değiştirilebilir, genişletilebilir ve test edilebilir sistemlerin temelini oluşturur. Ancak virtual, override ve new anahtar sözcükleri karıştırılırsa masum görünen bir sınıf hiyerarşisi küçük bir sürpriz fabrikasına dönüşebilir.
Devamı...

Bir projede yalnızca birkaç değişken ve sınıf varken isim bulmak kolaydır. Ancak kod tabanı büyüdükçe farklı geliştiricilerin aynı Logger, Config veya User adını kullanması kaçınılmaz hâle gelir. C++ isim alanları, yani namespace yapıları, bu isimleri mantıksal gruplara ayırarak derleyiciye hangi varlığı kastettiğimizi söyler. Kısacası namespace, kod dünyasının mahalle adresidir: Aynı isimli iki kişi olabilir, yeter ki farklı adreslerde yaşasın!
Devamı...
C++ geliştirirken T& ile T* arasındaki fark yalnızca sözdiziminden ibaret değildir. Bu iki parametre biçimi; null olasılığı, sahiplik, yeniden bağlanma ve fonksiyonun çağıranın nesnesini değiştirip değiştirmediği hakkında farklı mesajlar verir. Yanlış seçim yapıldığında kod derlenebilir, hatta yıllarca çalışabilir; ancak API’nin niyeti sisli bir İstanbul sabahına döner.
Devamı...
C# dünyasında diziler ve metinler, veriyi saklamanın ve işlemenin temel araçlarıdır. Bir sınıftaki notları, oyun haritasındaki hücreleri veya bir metindeki kelimeleri yönetirken bu yapılarla karşılaşırız. Diziler düzenli veri kutuları gibiyken string, karakterlerden oluşan özel ve değiştirilemez bir koleksiyondur. Gelin bu araçların teorisini ve pratik kullanımını birlikte inceleyelim.
Devamı...
C++’ta kaynak yöneten bir sınıfa atama operatörü yazmak, ilk bakışta birkaç alanı kopyalamaktan ibaret görünür. Fakat bellek ayırma işlemi yarıda başarısız olursa nesne hangi durumda kalacaktır? Copy-and-swap, yeni durumu önce güvenli bir geçici nesnede hazırlayıp yalnızca başarı kesinleştiğinde devreye alarak bu sorunu zarifçe çözer.

Devamı...
Terminalde tek bir boşluğun ne kadar pahalı olabileceğini görmek istiyorsanız, rm -rf bunun en ürkütücü örneklerinden biridir. Yanlış yazılmış veya hatalı genişletilmiş bir yol; belgeleri, uygulamaları, yapılandırmaları ve yedekleri saniyeler içinde silebilir. Üstelik komut çoğunlukla “Emin misiniz?” diye sormaz. Klavyedeki minicik bir hata, dijital bir meteor etkisi oluşturabilir.
Devamı...
Terminalde çalışan bir komutun başına sudo eklediğinizde aniden API anahtarını, özel PATH ayarını veya uygulama yapılandırmasını görememesi oldukça şaşırtıcıdır. Fakat bu davranış bir hata değil, sudo tarafından bilinçli şekilde uygulanan bir güvenlik önlemidir. Gelin değişkenlerin nereye kaybolduğunu ve onları güvenli biçimde nasıl geri getirebileceğimizi inceleyelim.
Devamı...

Shell betiklerinde $var ile "$var" arasındaki iki küçük tırnak, çalışan bir komutla gizemli hatalar üreten bir komut arasındaki fark olabilir. Özellikle dosya adları boşluk içerdiğinde tırnaksız değişken kullanımı, değerin birden fazla argümana bölünmesine neden olur. Shell bu davranışı kötü niyetinden değil, tarihsel kurallarından dolayı sergiler!
Devamı...
Robotik bir sistem tasarlarken motor seçimi, robotun ne kadar düzgün ve doğru hareket edeceğini doğrudan belirler. Servo motorlar ile step motorlar aynı hedefe, yani kontrollü konumlandırmaya hizmet etse de bu hedefe oldukça farklı yollarla ulaşır. Biri konumunu sürekli ölçerek ilerlerken diğeri verilen adımları sayar. Peki hangisi gerçekten daha hassastır?
Devamı...

Bir robot filosunun bütün kararlarını tek bir merkezi bilgisayara emanet etmek, orkestrayı yalnızca şefin duyabildiği bir kulaklıkla yönetmeye benzer: Şef görevini yaptığı sürece sonuç harikadır; fakat kulaklık bozulursa herkes farklı telden çalmaya başlar. Dağıtık kontrol mimarisi, algılama, karar verme ve eylem üretme sorumluluklarını birden fazla robot veya kontrol düğümü arasında paylaşarak bu kırılganlığı azaltır. Böylece tek bir bileşenin arızalanması, sistemin tamamını zorunlu olarak durdurmaz.
Devamı...

Bir robot fabrikadan kusursuz kalibre edilmiş biçimde çıksa bile bu durum sonsuza kadar sürmez. Kamera, LiDAR, IMU, enkoder ve GPS gibi sensörlerin ölçümleri; sıcaklık, titreşim, mekanik aşınma ve elektronik yaşlanma nedeniyle zamanla birbirinden uzaklaşır. Robot hâlâ veri topluyor gibi görünür, ancak artık dünyayı hafifçe “yamuk” algılıyordur. İşte bu yavaş bozulmaya kalibrasyon kayması, yani drift denir.
Devamı...