Meraklı bir bilgisayar programcısının notları.

Merhaba! Ben Burak Selim Şenyurt - yazılım geliştirici, blogger ve öğrenme tutkunu.

Bu blogda yazılım mühendisliği, sistem tasarımı, programlama dilleri ve yeni teknolojiler üzerine yazılar paylaşıyorum. Özellikle .NET, Rust, Zig, yapay zeka araçları ve mimari konularına ilgi duyuyorum. Kendimi sürekli geliştirmeye ve yeni şeyler öğrenmeye adıyorum.

Arama · Arşiv


Maceralar

Toplam 1030 yazı Tüm arşiv Arama RSS
  • Testler için Bir Mail Sunucusu Yazmak

    Uzun zaman önce Friday Night Programmer laboratuvarında bir e-posta sunucusuna ihtiyacım oldu. Amacım, belli bir sürecin entegrasyon testleri sırasında bir e-posta sunucusuna gidip gelme aksiyonunu taklit etmekti. İhtiyacım olan entegrasyon testi, ortamda gerçek bir e-posta sunucusu olmadan da çalışabilmeliydi. Nitekim asıl odak noktam e-postaların gidip gitmemesi değildi. Sürecin bir parçası olarak ilgili e-postalar gitmiş ve sunucudan olumlu cevap almışım (ya da almamışım) gibi hareket etmek istiyordum. Pekala, bu konuda yazılmış çeşitli sahte (fake) sunucular olabilirdi ama bana hafif sıklet bir aparat gerekiyordu. Aklıma Rust ve bu tip sunucu bazlı işlemlerde öne çıkan tokio küfesi (crate) geldi. Sonuçta bir sunucu, belli bir port üzerinden gelen mesajları yakalayıp şakacıktan karşı tarafa gönderdim gibi yapsa yeterliydi. Bu yazıdaki amacım, örnek kodlar üzerinden geçerek kendime ve sizlere hatırlatıcı noktalar çıkarmak olacak. Öyleyse gelin vakit kaybetmeden başlayalım.

  • Kendi Bevy'ni Yazmaya Çalışmak: C# ile Basit Bir ECS Denemesi

    Bir süre Rust programlama dili ile oyun geliştirmeye çalışmıştım. Topluluğun gücü olsa gerek Are We Game Yet sitesinde birçok framework, oyun motoru, render platformu vs var. En çok kullanılan platformlardan birisi sanıyorum ki Bevy. Onu özel kılan yönlerden birisi Composition over Inheritance prensibini merkeze alan Entity Component System implementasyonu da sunması. Bir önceki cümlede iki önemli kavramdan bahsettim; kalıtım yerine kompozisyonun tercih edilmesi ve entity nesneleri ile donatılmış bileşenlerin ele alındığı sistemler yaklaşımı. Bu yazıdaki amacım Rust tarafında ECS kullanımını göstermekten ziyade söz konusu yaklaşımı C# gibi nesne yönelimli bir dilde tasarlamak istersek nasıl bir yol izleyebileceğimizi keşfetmek (Bevy ile ilgili bir denememi merak ediyorsanız On My Way isimli oyunuma bakabilirsiniz)

  • Rust ile Basit Bir Key-Value Store Uygulaması

    Bir programlama dilini öğrenmeye çalışırken bazı kavramları anlamanın en iyi yolu elbette senaryo bazlı pratik yapmaktan geçiyor. Yazıyı yazdığım tarih itibariyle şöyle bir bakıyorum da repolarımın kıyısında köşesinde bu amaçla yazılmış ama unutulmuş denemeler var. Bugün onlardan birisini yazıya döküp tekrar etmeye çalışacağım. Elimdeki konu oldukça sağlam. Çok sık karşımıza çıkan ama üzerine fazla kafa yormadan ilerlediğimizde bize dert çıkarabilecek üç önemli parçası var; eşzamanlılık (concurrency), müşterek kilitleme (mutex) ve çok kullanıcı tarafından ortaklaşa paylaşılmak istenen veri (shared data). Bunları teorik olarak bilmek başka, aynı verinin birden fazla bağlantı tarafından aynı anda değiştirilmeye çalışıldığı bir senaryoda ele alıp test etmek bambaşka. O yüzden basit ama gerçekçi bir problem seçtim; TCP protokolü üzerinden konuşan, verileri bellekte tutan, minik bir key-value store yazmak.

  • Tauri ile Masaüstü Uygulama Geliştirme

    Mesleğe ilk başladığım yıllarda Web teknolojileri daha yeni yeni yaygınlaşmaya başlamıştı. Java ilk sürümünü yayınlamışken ben daha çok Delphi ile Windows platformunda masaüstü uygulamalar geliştirmekle meşguldüm. Web tabanlı geliştirmenin avantajları bir yana masaüstü uygulamalarda konuk olunan işletim sisteminin gücünden yararlanma, state tutma şansına sahip olabiliyorduk. Elbette zaman içerisinde neredeyse tüm iş modelleri web tabanlı çözümlere geçti. Web 1.0, 2.0, 3.0 derken Internet’in neredeyse tüm altyapısına sızan sayısız Javascript Framework arasında geçiş yapar olduk. Özellikle cross-platform tabanlı sistemleri düşününce karşımıza farklı hibrit çözümler de çıktı. Chromium gibi tarayıcıların işletim sisteminde çalışabilen çekirdek arayüzleri ile backend tarafı klasik servis haberleşmeleri üzerinden konuşmaya başladı. Herhalde Electron bu çözümler arasında en bilinenleri arasındadır. Tabii farklı dillerin sunduğu farklı çözümler de var. Örneğin Rust cephesindeki yaklaşımların başında Tauri geliyor. Bir süredir kenara park ettiğim bu konuyu nihayet deneme fırsatı buldum ve öğrendiklerimi bir yazıda toplamak istedim. Amacımız sysinfo küfesini (crate) kullanarak ilkel bir dashboard hazırlamak ve burada en azından CPU, RAM ve Disk kullanımını göstermek.

  • Spring Boot ile Basit Bir DDD Projesi

    Kendimi bildim bileli C# programlama dili ile geliştirme yapıyorum. Hobi amaçlı ilgilendiğim Rust, Zig ve OCaml dillerini saymazsak profesyonel iş hayatım .NET ekosistemi üzerinde geçti. Çok uzun yıllar önce ise Java programlama dilini öğrenmeye çalışmış ve bu vesile ile Java ile 24 Kahve Molası isimli bir seri yazmıştım. 2004 yılında yazdığım makaleleri derleyip bir doküman haline de getirmiştim ki buradan erişebilirsiniz. Tabii aradan yıllar yıllar geçti. Yazılım geliştirme dünyası sürekli değişti ama bazı temel kavramlar ve ilkeler hala aynı. Nesne yönelimli dil prensipleri, SOLID ilkeleri, tasarım kalıpları, yazılım mimarileri halen daha programlama dilleri ve platformlara referans oluyor. İş dünyası çözümleri ve kurumsal projeler bu felsefeler üzerine inşa ediliyor. Sözü fazla uzatmadan bu yazıda nelerden bahsedeceğimize gelelim.

  • Micro:Bit Üzerinde Rust ile Program Geliştirme

    Çok uzun süre önce Raspberry Pi üzerinde deneysel çalışmalar gerçekleştirmiştim. O yıllar Endüstri 4.0 furyasının en önemli yapıtaşlarından olan IoT denince akla ilk gelen isimlerden birisiydi (Bir diğeri de Arduino). O vakitlerde yaptığım çalışmalar python dilini tanımama da vesile olmuştu. Üstelik python bu tip cihazlarda sensör verileri ile çalışmak için gerekli her çeşit pakete sahipti. Raspberry Pi fiyat performans açısından düşünüldüğünde inanılmaz bir aygıt (mini bilgisayar desek yeridir). Üstünde Linux işletimi sistemi koşturabilmek bir yana, Raspi’lerden kurulu bir sunucu çiftliği inşa etmek bile mümkün. Ancak küçük ölçekli ve sınırlı kapasiteli sistemler bunlarla sınırlı değil. Çok daha küçük boyutlarda, basit işlere adapte olabilen, üzerinde işletim sistemi barındırmayıp flash memory’lerine yüklenen programları çalıştıran mikro denetleyiciler de var.

  • Rust Dilinde Phantom Type Kullanımı: PhantomData

    Bazı durumlarda bir tipe ekstra bilgiler dahil ederken bu bilgilerin çalışma zamanında (runtime) gerçekten de saklanmasını istemeyiz. Kulağa garip gelen bir cümle olduğunun farkındayım. Bir örnek üzerinden ilerlersek daha anlaşılır olacaktır ama öncesinde temel bilgileri ele alalım. Rust programlama dilinde PhantomData<T> şeklinde generic bir yapı bulunuyor. PhantomData yapısı ile tanımlanan bir veri çalışma zamanında saklanmaz ama derleyici bu türün kullanıldığını bilir ve buna bağlı olarak ownership, borrowing, lifetimes gibi kuralları işletebilir. Zaten bu türe phantom yani “hayalet” denmesinin bir sebebi de budur; çalışma zamanında var olmayan ama derleyici tarafından bilinen bir tür olarak ifade edilebilir.

  • Method Overloading Üzerine Düşünceler

    Profesyonel olarak mesleki hayatımın neredeyse tamamında C# programlama dilini kullanarak geliştirme yaptım. Çoğunlukla bir arayüzün (Web veya Windows) bir iş sürecini tetiklediği ve bunun arkasında dönen yazılım yaşam döngüsünün bir parçası oldum. C#, Java, Go, Python vb. birçok dil bu tip geliştirmeleri hızlandıracak türlü yeteneğe ve kütüphane desteğine sahip. Bununla birlikte uzun zamandır farklı programlama dillerini de öğrenmeye çalışıyorum ve çok uzun zamandır kafamı kurcalayan şeyler var. Bir programlama dilini tam olarak öğrenmek ne demektir?

  • Yapay Zeka Uygulamalarında Sandbox Kullanımı

    Büyük bir e-ticaret şirketinin bulut tabanlı altyapı çözümleri (Cloud Infrastructure) ekibinin yapay zeka gücünden de yararlanarak görev kritik bir uygulama geliştirdiğini varsayalım. Ekip, sunucularda oluşan hataları otomatik olarak analiz edip çözen bir Otonom DevOps Ajanı üzerinde çalışıyor. Geliştirilen ajanın en önemli yetenekleri arasında; hata loglarını (log files) okumak, sorunun kaynağını belirlemek, çözüme yönelik Python veya Bash betikleri (script) üretip bu betikleri sistem üzerinde çalıştırıp problemi çözmek var. Peki ya sistem ne kadar güvenli.

  • Birlikte OCaml Öğrenelim

    İlk programlama dilinden bu zamanlara değişen çok şey var. Üniversite yıllarım kişisel bilgisayarların ve internetin yaygınlaştığı World Wide Web devrimine denk geliyor. O vakitler bölümde gösterilen bilgisayar programlama derslerini düşünüyorum da; GW-Basic, Cobol, C ve C++ … Çoğunda belli seviyeye kadar geldiğimizi anımsıyorum. Aynı yıllarda iş dünyasının hızlandırıcı etkisine de şahit olmuştuk. Sadece klavye ve 8 renkten oluşan siyah terminal ekranları çok uzun zamandır mouse imleçleri ile renklenmişti. Dahası artık iş süreçlerinin internet ortamından yürütülebildiği bir dönemdi. Bu dalgayla birlikte ben ve birçok arkadaşım Delphi, Java, Visual Basic gibi dillere yöneldi. Ben ağırlıklı olarak Delphi tarafına yakındım ama zamanla bu yakınlık yerini C# programlama diline bıraktı.

  • Hangi Localization Tekniği

    Tartışmanın konusu, çooooook uzun zamandır dünyamızda var olan çoklu dil desteği (Multi-Language Support). Kimi zaman veritabanı üzerinden, kimi zaman fiziki dosyalardan (resx gibi) yönetmeye çalıştığımız bir mevzu. Sürekli değişip genişleyebilenler bir yana, nadiren değişip genellikle statik kalanlardan oluşan veri kümeleri de cabası. Aslında temel amaç, bir program arayüzünün veya kullanıcı ile etkileşimde olan taraflarının farklı dillerde destek vermesini sağlamak. Teori basit; değişmez sabit bir kavram (key diyelim) karşılığında, kullanılan dile göre farklı değerler tutulmasını sağlamak.

  • Smart Enums

    Yazılım geliştirme galaksisinin en zorlu yolculuklarından birisi sanıyorum ki Domain Driven Design (DDD) rotasında ilerlemek. Büyük çaplı kurumsal projelerde hangi mimari ile çalışacağımıza karar vermek bir yana dursun domain sınırlarını belirlemek, model nesneleri kurgulamak, ortak jargonu çıkarmak ve bu jargonu kod içerisinde nasıl temsil edeceğimize karar vermek gibi pek çok zorluğu beraberinde getiren bir yolculuk. Gerçekten farklı yetkinlikler gerektiğine inandığım bu yaklaşımda gün geçmiyor ki yeni bir konuyu tartışalım. İşte henüz gerçekleştirdiğimiz bir tartışma:

  • Pi(π) Sayısını Hesaplama Yolunda

    Matematiksel yöntemlerden bazılarını ele alarak belli bir basamağa kadar pi (π) sayısını hesaplamaya çalışacağım. Doğru bir basamak değerine ulaşmak ve burada yüksek sürate çıkmak hedeflerim arasında. Önce en amele yöntemlerden başlayarak daha sonra daha karmaşık yöntemlere geçmek niyetindeyim ama yol beni farklı bir rotaya sürükledi diye de özet geçeyim :D Diğer modellere geçemeden kendimi diller arasında performans hesaplamaları, optimizasyonlar ve senkronizasyon sorunlarıyla uğraşırken buldum. O yüzden bu yazıda sadece Monte Carlo yöntemini ele alacağım.

  • Hexagonal Architecture 101

    Kurumsal uygulamaları göz önüne aldığımızda zaman içerisinde birçok yazılım mimarisinin ortaya çıktığını görüyoruz. Programlama dillerinin gelişimi, framework’lerin ortaya çıkması ve değişen müşteri ihtiyaçları sonucunda bu kavram çok daha büyük önem kazandı. Belki de her şey üç katmanlı (3-tier) yaklaşımla başlamıştı. Geldiğimiz zaman diliminde ise monolit sistemlerin modüler hale getirildiğiği Modulith’lerden mikro servislere, soğan halkaları benzetmesi ile popülerleşen Onion mimariden servis odaklı (Service-Oriented) yaklaşıma kadar birçok stil var. Bazı kaynaklarda yazılım mimarileri katmanlı (Layered) ve dağıtık sistemler (Distributed) olmak üzere iki ana kategoriye ayrılmakta. Üzerinde uzun uzun konuşulacak olan bu kavramları elbette deneyimleyerek görmek en güzeli. Bende bir süredir bakmak istediğim Hexagonal mimari yaklaşımını öğrenmeye karar verdim ve işte karşınızdayım. Gelin.net platformunda bu mimariyi çok temel seviyede de olsa uygulamalı olarak anlamaya çalışalım.

  • Microsoft DotNet Platformunda Bir MCP Server Yazmak

    MCP (Model Context Protocol), yapay zeka araçları için tool desteği sağlamak amacıyla kullanılan bir protokol olarak düşünülebilir. Anthropic tarafından geliştirilmiş bir standarttır ki detaylarına buradan ulaşabilirsiniz. Bu protokolün geliştirilmesinde amaç yapay zeka araçlarına belli bir standart dahilinde harici araç desteği sunabilmektir. Genel senaryoda bir dil modeline gitmeden önce bu protokol üzerinden hizmet veren MCP sunucularına ulaşılır ve sağlanan araçlar kullanılarak belli bir domain sınırı içerisinde kalacak şekilde işlemler yapılabilir. Araçlar (Tools) arka planda çoğunlukla REST API gibi hizmetleri kullanır ancak farklı kaynaklarda çağırılabilir. Bir başka deyişle MCP sunucusunun sağladığı araç seti arka planda sarmaladığı herhangi bir başka araca da gidebilir. MCP, yapay zeka araçları için standart bir protokol sunduğundan tüm MCP Server’lar bir yapay zeka aracı tarafından keşfedilebilir, araçları kullanılabilir.

  • Copilot SDK ile İlk Deneyimler

    İçimiz dışımız, sağımız solumuz yapay zekadan geçilmiyor. Öyle bir dönemdeyiz ne ona burun kıvırabiliriz ne de her şeyimizle teslim. Halen daha işin özünde problemi anlamanın, parçalara bölebilmenin, doğru metodolojileri ve araçları kullanarak ideal çözüm yollarını geliştirebilmenin önemli olduğunu düşünüyorum. Bunun içinde kendimizi donatmaya devam etmemiz gerektiğini biliyorum. Ayrıca yapay zeka araçlarını tanımanın ve yazılımcılara ne gibi avantajlar ya da tam tersi dezavantajlar getireceğini de araştırmalıyız diyorum. Ne yazık ki yapay zeka denildiğinde onu sadece chat-gpt’den ibaret bir şey olduğunu düşünenler var. Bunun böyle olmadığını deneyimlediğim araçlar bana gösteriyor. Tanımak lazım. İşte bugünkü yazımızın konularından birisi de bu; Microsoft’un Copilot SDK paketini kullanarak neler yapabilirizin basit bir Hello World demosu.

  • Bunu Bir Dene 01 - Çoklu Thread Ortamlarında Ortak Veriyi Değiştirmek (C#, Rust ve Zig)

    Önceki yazımızda, bir fonksiyona aktarılan parametre üzerinde değişklik yapmak istediğimizde bunun C#, Rust ve Zig programlama dilleri tarafındaki ele alınış biçimlerini farklı örneklerle incelemeye çalışmıştım. Nihayetinde ulaştığım noktada bir nesnenin kendisini tanımlayan değerlerin değiştirilmesinde programlama dili ve hatta kullanılacak yazılım mimarisi bazında farklı yaklaşımlar olduğunu görmüştük. Merak ettiğim bir başka konuysa, multi-thread (çoklu iş parçacığı) ortamlarında ortak veriyi değiştirmek. Aynı veri üzerinde birden fazla thread’in okuma/yazma işlemi yapması çok sık karşılaşılan bir durum. Şu anda elimde managed ortamı olan, yerleşik framework kütüphanelerinde üst düzey soyutlamalar sunan C#, bellek güvenliği konusundaki titiz stratejileri ve zorlamaları ile öne çıkan Rust ve C’nin modern bir versiyonu olarak gördüğüm düşük seviyeli sistem programlama dili Zig var.

  • Bunu Bir Dene 00 - Metot Argümanlarında Değişiklik (C#, Rust ve Zig)

    C# programlama dilinde sınıf nesne örnekleri (Class Object Instance) metotlara varsayılan olarak referans türü (reference type) olarak iletilir. Bu, metot içinde yapılan değişikliklerin çağıran tarafı etkileyebileceği anlamına gelir. Bu çalışmada söz konusu senaryonun Rust ve Zig gibi programlama dillerinde nasıl ele alındığını incelemeye çalışıyorum. Sırf meraktan…Başlamadan şu notu düşmek isterim; Çalışmamdaki amaç üç dili birbiriyle kıyaslamak değil, her bir dilin bu tip senaryolardaki yaklaşımını incelemek. Normal koşullarda bir stok takip programını Rust veya Zig ile geliştirmeyi tercih etmem.

  • Rust ile Kodlama İdmanları - İleri Seviye

    Rust programlama dili ile ilgili maceralarımıza devam ediyoruz. Gerçi geçtiğimiz günlerde sizin de bildiğiniz üzere unwrap metodunun hatalı bir kullanımı sebebiyle internet sitelerinin %20sini koruyan Cloudfare çöktü ve birçok hizmet uzun süre kullanılamaz hale geldi. Konuyla ilgili detaylı bilgilereşu adresteki yazıdan ulaşabilirsiniz. Ferris şaşkın, ferris üzgün!

  • Rust ile Kodlama İdmanları - Orta Seviye

    Şunu fark ettim ki, hangi programlama dili olursa olsun bilgilerimizi taze tutmanın yollarından birisi öğrenilenleri düzenli olarak not haline getirmek ve yazarak kayıt altına almak. Elbette tek yol bu değil. Mutlaka her gün bir parça da olsa kod yazmak, belki bir proje üzerinden ilerlemek (hiçbir yerde kullanılmayacak olsa bile), onunla ilgili bir makale okumak veya bir video izlemek lazım. Ünlü düşünür Johann Wolfgang von Goethe ne demiş “İnsan her gün bir parça müzik dinlemeli, iyi bir şiir okumalı, güzel bir tablo görmeli ve mümkünse birkaç mantıklı cümle söylemelidir.” Yapay zekanın bilgisayar ve internet’ten sonra yeni bir devrim olma çabasıyla koştuğu şu dönemde iyi bir programcı olmak için daha çok okuyalım, daha çok pratik yapalım, daha çok araştıralım, daha çok dinleyelim derim. Elbette yapay zeka araçlarına sırtımızı da dönmeyelim. Nimetlerinden, verimliliğimizi artıracak ölçüde yararlanalım.