7 puan yazan GN⁺ 2023-12-27 | 1 yorum | WhatsApp'ta paylaş
  • Bir yan proje seçmekte zorlanıyorsanız, metin editörü, 2D oyun, derleyici, mini işletim sistemi gibi tekrar tekrar yaptıkça öğrenme kapsamını genişleten projeler iyi bir başlangıç noktasıdır
  • Metin editörü, belge saklama yapısı, imleç davranışı, geri al/yinele ve satır kaydırmayı doğrudan uygulayarak veri yapıları ve soyutlama öğrenmenizi sağlar
  • Space Invaders gibi basit bir 2D oyun bile ekran çizimi, girdi işleme, oyun döngüsü, nesne durum yönetimi, düşman yapay zekası, ses, shader ve ağ iletişimine kadar oyun programlamanın temel yapısını ortaya koyar
  • Tiny BASIC derleyicisi ve mini işletim sistemi, sırasıyla lexing·parsing·anlamsal analiz·kod üretimi ile cross-compiling·bootloading·bellek yönetimi·zamanlama gibi düşük seviye kavramları doğrudan ele almanızı sağlar
  • Hesap tablosu ve konsol emülatörü, önceki projelerin zorluk seviyelerini birleştirir ve gerçek davranışı taklit eden bir sanal makine oluşturmaya kadar genişler

Tekrar tekrar yapılmaya değer projeler

  • Bir yan projeye ihtiyaç duyduğunuzda veya yeni bir programlama dili ya da framework öğrenmek istediğinizde, aynı projeyi birkaç kez yapsanız da her seferinde farklı bir şey öğrenebilirsiniz
  • Önerilen projelerin zorluk seviyesi ve öğrenme alanları birbirinden farklıdır
    • Metin editörü: veri yapıları, imleç davranışı, geri al/yinele, ekran gösterimi
    • 2D oyun: ekran çizimi, girdi işleme, oyun döngüsü, nesne ve durum yönetimi
    • Derleyici: lexing, parsing, anlamsal analiz, kod üretimi
    • Mini işletim sistemi: önyükleme, bellek yönetimi, zamanlama, dosya sistemi
    • Hesap tablosu ve konsol emülatörü: önceki projelerdeki kavramları daha büyük bir yapıda birleştirme

Metin editörü

  • Metin editörü her gün kullandığımız bir araçtır; ancak temel bir text box bileşeni olmadan doğrudan uygularsanız imleç hareketi, seçim, ekleme ve silmenin ayrıntılı davranışlarıyla uğraşırsınız
  • En büyük görev, metin belgesini bellekte nasıl saklayacağınızdır
    • Basit bir dizi, belgenin sonu dışındaki bir konuma metin eklerken kötü performans gösterir
    • Karşılaştırılabilecek yapılar arasında dizi, rope, gap buffer, piece table vardır
  • İmleç sadece yukarı ve aşağı hareket etmez
    • Kısa bir satıra geçtiğinde mümkün olan konuma gidip, daha sonra yeterince uzun bir satır çıktığında eski sütuna dönmeye çalışan bir sütun hatırlama davranışı vardır
  • Temel editörden sonra geri al/yinele ve satır kaydırma eklemeyi deneyebilirsiniz
    • Geri al/yinele için önceki durum dizileri, memento, command pattern'i gibi tasarımları karşılaştırırsınız
    • Satır kaydırma, metin satırlarının görsel temsili ile bellekteki temsilini ayırmanızı sağlar
  • Kaynaklar

2D oyun - Space Invaders

  • Basit bir oyun bile kendine özgü veri yapıları ve tasarım pattern'leri gerektirir
  • Büyük bir oyun motoru yerine SDL, SFML, PyGame gibi temel 2D grafik kütüphaneleri kullanırsanız ilginç kısımlar gizlenmez
  • Oyun, ekranı temizleyip her öğeyi hızla yeniden çizerek nesnelerin hareket ettiği etkisini oluşturur
  • Gerçek akış, oyun döngüsü içinde çizim yapma, kullanıcı girdisini alma ve oyun mantığını işleme adımlarının tekrarlanmasıdır
  • Girdi işleme, tuş veya fare düğmesinin ilk basılışı, basılı tutulması, bırakılması, çift tıklama gibi ayrıntılı davranışları dikkate almalıdır
    • Yalnızca girdiyi sürekli kontrol ederseniz oyunun geri kalanı durmuş halde kalır
  • Oyun nesneleri ve durum yönetimiyle de doğrudan ilgilenmeniz gerekir
    • Dinamik olarak artan düşmanları üretmek için factory pattern yardımcı olur
    • Düşman yapay zekasına durum makinesi uygulanabilir
  • Temel oyundan sonra başlık menüsü, oyun bitti ekranı, farklı bilgisayarlarda da aynı hızda çalışmasını sağlayan işlemler ve daha ilginç düşman yapay zekası ekleyebilirsiniz
  • Daha da genişletirseniz shader efektleri, ses ve çevrimiçi çok oyunculu desteğe kadar uygulayabilirsiniz
  • Kaynaklar

Derleyici - Tiny BASIC

Mini işletim sistemi

  • İşletim sistemlerinin algoritmaları ve veri yapıları sınıfta soyut ya da işe yaramaz görünebilir, ancak oyunlar veya insan davranışını tahmin eden modeller gibi pek çok alana uygulanabilir
  • Bunu doğrudan uygularsanız işletim sisteminin içinde neler olduğunu çok daha derinlemesine anlarsınız
  • Donanım bağımlılığı nedeniyle başlangıç eşiği ve öğrenme eğrisi vardır; ancak kitapları veya eğitimleri takip ederek kendi yazdığınız programları çalıştırabilen önyüklenebilir bir OS yapabilirsiniz
  • Öğrenme başlıkları şunlardır
  • Kaynaklar

Daha zor projeler: hesap tablosu ve konsol emülatörü

  • Bir hesap tablosu uygulaması, Excel gibi, metin editörünün görevleri ile derleyicinin görevlerini birleştirir
    • Hücre içeriğini bellekte temsil etmeniz gerekir
    • Formüllerde kullanılan programlama dili için bir yorumlayıcı uygulamanız gerekir
  • Hesap tablosu kaynakları
  • Video oyunu konsol emülatörü, derleyici, işletim sistemi ve oyun motoru uygulamanın zorluklarını tek bir projede birleştirir
  • Gerçek bir konsolu emüle etmek için CPU ve diğer donanım bileşenleri gibi davranan bir sanal makine yazmanız gerekir
    • Bu sanal makinede o konsol için geliştirilmiş oyunları çalıştırabilirsiniz
  • Başlangıç noktası olarak gerçek konsollardan daha basit bir sanal konsol olan CHIP-8 emülasyonu önerilir
  • NES, SNES, Gameboy, Gameboy Advance da emüle edilebilir ve bunlarla ilgili epey dokümantasyon ile açık kaynak emülatör vardır; ancak her konsolun ilginç kendine özgü yanları bulunur
    • Belirli oyunlar, belirli donanımların belgelenmemiş hatalarına veya özelliklerine bağımlı olabilir
  • PICO-8 kârlı bir “fantasy” konsol haline geldi
  • Emülatör kaynakları

Ek olarak önerilen projeler

  • Hacker News, Reddit, Twitter ve e-postadan ek proje fikirleri toplandı
    • Sıfırdan yapılmış bir veritabanı
    • Ray tracer
    • MS Paint klonu
    • Vektör grafik editörü
    • Görüntü kod çözücü
    • Sohbet odası web uygulaması
    • Pi basamak hesaplayıcısı
    • grep benzeri genel terminal yardımcı programları
    • FTP istemcisi ve sunucusu

1 yorum

 
GN⁺ 2023-12-27
Hacker News görüşleri
  • Bir metin düzenleyici, derleyici, işletim sistemi veya ray tracer yapmak sizi daha iyi bir programcı yapabilir; ama daha iyi bir yazılım mühendisi yapmaz
    Hatta felaket sayılabilecek “Not Invented Here” doktrinini içselleştirip yazılım mühendisliğinde daha kötü hale bile gelebilirsiniz
    Hacker’lar Big-O, veri yapıları, HoTT gibi yüksek teori konularına takılıp kalıyor; ama gerçek mühendislik için şart olan “neyi kendin yapacağına, ne için kütüphane kullanacağına karar verme”, “iyi kütüphane ve framework’leri ayırt etme”, “optimize etmeye değer noktayı seçme”, “yıllar sonra da okunabilir kod yazma”, “bir projeye yazılım ve yazılım dışı bağımlılıkları da içeren büyük ölçekli karmaşık bir sistem olarak bakma” neredeyse hiç tartışılmıyor ya da pratik edilmiyor
    Bu yüzden alternatif görev olarak web arama motoru öneriyorum. String matching algoritmaları gibi şeyler zaten başkaları tarafından yapılmış; bunları dert etmeyip, başta web’in yalnızca bir bölümünü ve aynı anda 1 kullanıcıyı desteklese bile gerçekten çalışan bir arama motoru ve crawler’ı “öylesine” yapmayı deneyebilirsiniz

    • Arama motorunun kütüphane seçimi veya optimizasyon fırsatlarını değerlendirme gibi “gerçek mühendislik becerilerini” özellikle gerektirdiğinin neden düşünüldüğünü anlamıyorum
      Metin düzenleyici, derleyici, işletim sistemi ve ray tracer da aynı etkinliklerin hepsini çalıştırabilir
      Birkaç uzun metraj filmde kullanılan ray tracer üzerinde çalışmış biri olarak, yukarıda sayılan maddelerin hepsi o projeye de uygulanıyordu
      Sonuçta fark daha çok küçük ve eğlenceli bir şey yapmakla, şirkette para karşılığı yaptığınız ruh kemiren kısıtları aynen uygulayıp keyfi ortadan kaldırmak arasında
    • Bu tavsiye makul geliyor, ama yazılımı yalnızca hazır building block’larla yaptığınızda bir sorun var
      Birincisi, hazır bloklar çoğu zaman berbat olma eğiliminde; bunun sonucu yazılım da o berbatlığı yansıtıyor ve hayat, yazılımı kullanmaktan çok o berbat şeylerin bakımını yapmak ve onları yatıştırmak haline geliyor
      İkincisi, blokların kalitesi iyi olsa bile kullanabileceğiniz yazılım türlerini sınırlandırıyor. İdeal olarak istenen davranışı hayal edip, yazılımı bunu yapacak şekilde yazmalı ve bu süreçte blokları oluşturmalısınız
      Yalnızca hazır bloklar kullanırsanız çok sayıda harika yazılımı baştan yapamazsınız; çevremizde çok fazla harika yazılım olmamasının nedeninin de bu olduğunu düşünüyorum
      “Her zaman gördüklerimizle neredeyse aynı yazılımı” yapıyorsanız ikinci sorun daha az geçerli olur; birincisi de çoğunlukla happy path kullanıldığı için idare edilebilir. Ama böyle yazılımları yakında insanlar değil yapay zeka kullanacak
    • Bu, enstrüman öğrenen bir öğrenciye orkestrada gereken başka beceriler var diye gam ya da etüt çalışmamasını söylemeye benziyor
      O beceriler de önemli, ama bir noktada temel becerileri geliştirmek gerekir; daha iyi programcı olmak da yukarıda listelenen becerilerin geneline kesinlikle yardımcı olur
    • Yazıda yazılım mühendisi değil, programcı denmiş
      Kişisel olarak yazılım mühendisliği faturaları ödemek için yaptığım şey; programlama ise eğlenceli olduğu için başladığım şey
      Bu yazıdaki projeler, zamanım olursa keyif için denemek isteyeceğim türden
  • UI/Web tarafının bakış açısından, veri akışı sistemlerini anlamak için çok faydalı olan spreadsheet’e ek olarak şunları öneririm
    Unity veya Unreal ile basit bir video oyunu yapmak, 30–60fps’in önemli olduğu oyunlarda performans kısıtlarını anlamanızı sağlar; web dahil başka yerlerde de hızlı arayüzler yapmanıza yardımcı olur
    React’e benzeyen basit bir JavaScript framework’ü yapmak, veri akışı ve event handling’i anlamaya yardımcı olur
    XMLHTTPRequest’i saran bir HTTP kütüphanesini kendiniz yazmak, bugün fetch olsa bile HTTP isteklerinin nasıl gönderilip okunduğunu temelden anlamanızı sağlar; bu da ileride CORS sorunları veya OPTIONS istekleri gibi şeyleri debug ederken işe yarar

    • Bu amaç için Godot, Unity veya Unreal’dan daha iyi bir alternatif olabilir. Yalnızca özel lisans tuzağına düşmek zorunda kalmazsınız; içeride neler olup bittiğini de görebilirsiniz
  • O zaman da tartışılmıştı
    Challenging projects every programmer should try - https://news.ycombinator.com/item?id=21790779 - Aralık 2019 (297 yorum)
    İlgili bir yazı da var
    More challenging projects every programmer should try - https://news.ycombinator.com/item?id=25489879 - Aralık 2020 (223 yorum)

    • İkinci yazının dış bağlantısı 404 veriyor
  • Mini işletim sistemi için +1
    Uygulama geliştiricileri bellek yönetimi, dosya sistemi vb. birçok işletim sistemi özelliğine dayanıyor ve sonunda “perde arkasında bunlar nasıl çalışıyor?” diye sormaya başlıyor
    Bu yüzden boş zamanımda xv6(https://github.com/mit-pdos/xv6-public) ile uğraştım
    Ders kitabında çeşitli process scheduling algoritmalarını öğrenmekle bunları doğrudan uygulamak tamamen farklı şeyler; çok şey öğrendim
    Mobil uygulama geliştiricisi olarak bu bilginin işimle ilgili olma olasılığı neredeyse 0’a yakın, ama kesinlikle eğlenceli

  • Motor kullanmadan 2D oyun geliştirme denemesi, bilgisayarların ne kadar akıl almaz hızlandığını fark ettiren en alçakgönüllü deneyimlerden biriydi
    Çok yavaş olacağından emin olduğunuz bir şeyi yapsanız bile, Game Boy’da bile saniyede bir milyon işlem yaptığı için öylece çalışıyor. Meğer bir milyon sandığımdan daha büyük bir sayıymış
    “Bir dakika, her seferinde tüm sprite’ları bulup çiziyor musun? Yalnızca değişmesi gerekenleri bilen akıllı bir fark hesaplaması yok mu, önceki frame’e bakıp işi azaltan ikinci bir buffer da mı yok?” diye düşünürken, bu teknikleri gerçekten kullanmaya başlayan çok daha karmaşık oyunlara bakınca daha da şaşırıyorsunuz

    • Eskiden hem uygulama hem de donanım tarafında bu tür sorunlara yardımcı olan ilginç hileler vardı
      Örneğin sprite atlas bu tür veri yapılarının kullanıldığı tipik bir yöntemdir. Genelde öngörülebilir biçimde render edilen birden fazla sprite’ı her seferinde yüklemeye gerek yok; tek büyük bir görüntü yükleyip onun bir bölümünü örneklemek yeterli
      Bugünün ölçütlerine göre doğru. Giriş seviyesi ticari donanımlar, hatta oyun PC’si olmasa bile yaklaşık 15 yıl önceki hemen her şey, sahneyi çizip yeniden çizmek şeklindeki kaba kuvvet render işlemiyle halledilebilir
    • TRS-80 Color Computer’da 2D oyun yaparak başladım ve bu bana bilgisayarlar hakkında iyi bir temel anlayış kazandırdı
      Saf donanım ve assembly’den ibaret olduğu için grafik, ses, giriş, bellek yönetimi vb. her şeyi elle yapmak gerekiyordu
      Acemi bir programcının tüm bunlarla uğraşıp 2D oyun yapabileceği, ama çalıştırmak için gereken aşırı yükün azaltıldığı sadeleştirilmiş bir ortam olsaydı, bence ideal bir giriş olurdu
  • Space Invaders yapmak için factory pattern gerektiğini düşünüyorsanız bir şeyler yanlış demektir
    Orijinalinde böyle bir tasarım kavramının bulunma ihtimalinin neredeyse hiç olmadığını düşünüyorum

    • 30 yıllık nesne yönelimli programlama ve design pattern’lerin sonucu bu
      Beyin buna bir kez enfekte olunca enfeksiyonu yaymanın yollarını aramaya başlıyor
    • Yazının hiçbir yerinde Space Invaders uygulaması için factory pattern gerektiği söylenmiyor ya da ima edilmiyor
      Yoksa farklı yazılar mı okuduk?
  • Robotlar, otomatik pilotlu dronlar, programlanabilir GNC parametrelerine sahip uzay araçlarının uçuş dinamiği için hassas simülasyon gibi çok daha fiziksel bir şeyler yapmak istiyorum
    Bate, Mueller ve diğerlerinin “Fundamentals of Astrodynamics” kitabı elimde var; bu tatil döneminde bir şeyler denemek istiyorum
    Geri kalanı maliyetli olacak gibi göründüğü için simülasyondan söz ediyorum. Robotların GNC tarafına gerçekten çok ilgi duyuyorum; iyi kaynak önerileri olsa harika olur

    • https://ksp-kos.github.io/KOS/ Kerbal Space Program, aerodinamiği istediğiniz düzeyde gerçekçi simüle etmiyor olabilir; ancak birçok kişi orada GNC yazılımı yazmaktan keyif alıyor gibi görünüyor
    • Kendi kendini dengeleyen iki tekerlekli robot eğlenceli ve görece güvenli bir proje olabilir
      Devrilmeden ya da masadan fırlamadan aynı noktada durabilen Segway benzeri bir şeyden söz ediyorum
      Bir mikrodenetleyici, IMU, step motor kontrolcüsü, motorlar, LEGO tekerlekleri ve belki bir tahta parçası gerekir gibi
      Bizzat denemediğim için tahminlerim epey yanlış olabilir
    • “Fundamentals of Astrodynamics” ile ne yapmayı planladığını merak ediyorum
      Kitabın içeriği ve nasıl projeler denenebileceği hakkında daha fazla duymak isterim
    • Ben de aynı fikirdeyim. Kişisel projelerimin neredeyse tamamında donanım unsuru var
      Bütün gün yazılımla uğraştıktan sonra fiziksel bir nesneye yönelik çalışmak gerçekten iyi geliyor
  • Küçük bir oyuncak ray tracer da denemeye değer harika bir görev bence
    Küreler ve birkaç ışık kaynağı, diffuse ve specular reflection işleyip bitmap grafik çıktısı vermesi yeterli
    Fazla büyütmezseniz kapsamı görece iyi sınırlandırılmış bir proje olabilir

  • İlginç bir liste; kişisel eğilim ve koşullara göre değişir ama fikir arıyorsanız iyi bir başlangıç noktası
    Her programcının mutlaka neyi denemesi gerektiğini söyleyecek değilim; sadece kişisel olarak seçtiklerimi yazayım
    Sinclair ZX Spectrum’da çok kaba bir müzik portesi editörü ve tracker yaptım; 2D oyun olarak da tek bir istilacıdan ibaret Space Invaders yaptım
    O bilgisayar bana ait bile değildi. İlk bilgisayarım olan 386’da Huffman sıkıştırıcı, DBase/Clipper’dan daha hızlı bir B-Tree indeksi, nesne yönelimli form oluşturucu ve birkaç DOS arka plan programı yaptım; bunlardan biri daha sonra büyük bir şirketin kurulum sürecinde kullanıldı
    Birkaç yıl sonra çevirmeli bağlantı için e-posta denetleyicisi, syntax highlighting için elle yazılmış parser, elektronik tablo benzeri bir şey de yaptım ve hâlâ bunu yapıyorum. Mutlaka atladığım şeyler de vardır

  • İyi bir liste. Zamanla birlikte geliştirilebilmesi için yaşayan bir liste olarak tutulması iyi olur
    İki şey eklemek isterim
    Hafif bir memcached yapmak, temel algoritmalar ile iyi sistem tasarımı pratiklerinin bir arada kullanılmasını gerektirir. “Basit” bir problem olsa da geçersiz kılma, eşzamanlılık, bellek yönetimi gibi pek çok açıdan iyi düşünmek gerekir
    Kendi Docker’ını yapmayı denemek de iyi olur. Kulağa geldiği kadar karmaşık değil ve günümüz mühendislerinin günlük işlerinde pek fazla kullanmadığı işletim sistemi programlama temellerini anlama fırsatı verir