7 puan yazan GN⁺ 2023-12-27 | 1 yorum | WhatsApp'ta paylaş

Metin düzenleyici

  • Metin düzenleyiciyi her gün kullanıyoruz, peki aslında nasıl çalıştığını biliyor musunuz? Önce temel işlevleri uygulayarak başlayın.
  • Metin belgelerinin bellekte nasıl saklanacağı en büyük zorluklardan biridir. Dizi kullanımı performans sorunlarına yol açabilir; bunu çözmek için çeşitli veri yapılarının öğrenilmesi gerekir.
  • Metin imlecinin nasıl çalıştığını öğrenin; temel düzenleyiciyi kurduktan sonra undo/redo ve otomatik satır kaydırma özelliklerini uygulamayı deneyin.

2D oyun - Space Invaders

  • Basit bir oyun bile özel veri yapıları ve tasarım desenleri gerektirir. Oyun tasarımı ve görsele odaklanmaktan çok, oyunun genel uygulanışına odaklanın.
  • Ekran çizimi, oyun döngüsü, kullanıcı girdisi işleme, dinamik nesne oluşturma ve yönetimi, oyun mantığının uygulanması gibi konuları öğrenirsiniz.
  • Temel oyunu tamamladıktan sonra başlık ekranı menüsü, oyun sonu ekranı ekleme, farklı bilgisayarlarda aynı hızı koruma ve yapay zeka uygulama gibi yönlerde genişletebilirsiniz.

Derleyici - Tiny BASIC

  • Bir derleyici uygulamak, programlama hakkında derin bir anlayış gerektiren bir projedir. Tiny BASIC gibi basit bir dille derleyici yazmaya başlayın.
  • Kodun nasıl token'lara ayrıldığını (lexical analysis), parsing işlemini (yapının doğrulanması ve ağaç oluşturma), anlamsal analizi ve kod üretimi gibi süreçleri öğrenirsiniz.
  • Temel derleyiciyi tamamladıktan sonra standart kütüphane ekleme, optimizasyon aşaması ekleme ve hata mesajlarını iyileştirme gibi yönlerde genişletebilirsiniz.

Mini işletim sistemi

  • İşletim sisteminin temel kavramları birçok alana uygulanabilir. Bir işletim sistemi uygulayarak donanım anlayışınızı geliştirebilirsiniz.
  • Donanıma bağımlı bir öğrenme eğrisi vardır, ancak kitapları veya eğitimleri takip ederek önyüklenebilir bir OS yapabilirsiniz.

Elektronik tablo

  • Elektronik tablo uygulaması, metin düzenleyici ile derleyicinin zorluklarını birleştirir. Hücre içeriklerinin bellekte nasıl temsil edileceğini ve formüller için bir programlama dili yorumlayıcısının nasıl uygulanacağını öğrenirsiniz.

Video oyun konsolu emülatörü

  • Emülatör yazmak, derleyici, işletim sistemi ve derleyici yazımındaki zorlukları tek bir projede birleştirir. Gerçek oyunları emülatörde oynamak oldukça tatmin edici bir deneyimdir.
  • Gerçek bir video oyun konsolunu emüle etmek, ilgili CPU ve diğer donanım bileşenleri gibi çalışan bir sanal makine yazmak anlamına gelir.

GN⁺ görüşü

  • Programlama temellerini güçlendirmek açısından, bir metin düzenleyici ya da basit bir oyun uygulamak, gerçekten kullandığımız yazılımların iç işleyişini anlamada büyük yardımcı olur.
  • Derleyici veya işletim sistemi gibi karmaşık projeler, programlama dilleri ve bilgisayar mimarisi hakkında derin bir anlayış gerektirir; bu da ileri düzey yazılım mühendisliği becerilerini geliştirmek için gereklidir.
  • Bu projeler, programcıların yeni bir dil ya da framework öğrenmesi veya mevcut bilgilerini derinleştirmesi açısından ilgi çekici ve zorlayıcı deneyimler sunar.

1 yorum

 
GN⁺ 2023-12-27
Hacker News görüşleri
  • Metin düzenleyici, derleyici, işletim sistemi veya raytracer gibi projeler üzerinde çalışmak programlama becerisini geliştirebilir, ancak yazılım mühendisliği becerisini geliştirmez. Hatta bu tür projeler, yazılım mühendisliği açısından ters etki yaratabilecek felaket bir ilke olan "burada icat edilmedi" (Not Invented Here) anlayışını içerebilir.

    • Bir şeyi kütüphaneden mi alacağın, yoksa kendin mi yazacağın konusunda karar verebilme becerisi
    • Proje gereksinimlerine uygun yüksek kaliteli kütüphane ve framework’leri belirleyebilme becerisi
    • Optimizasyonun nerede değerli olduğuna, nerede olmadığına karar verebilme becerisi
    • Yıllar sonra bile okunabilir kalacak kod yazabilme becerisi
    • Bir projeyi büyük ve karmaşık bir sistem olarak düşünerek yazılım ve yazılım dışı bağımlılıkları hesaba katabilme becerisi
    • Alternatif bir meydan okuma olarak bir web arama motoru yapmayı öneriyor. String matching algoritmaları vb. zaten başkaları tarafından çözüldüğü için, amaç gerçekten çalışan bir arama motoru (ve crawler) oluşturmak.
  • UI/web tabanlı projeler için şunları öneriyor:

    • Unity veya Unreal kullanarak basit bir video oyunu yapmak (oyunlarda 30-60fps önemli olduğu için, başka alanlarda da performansı iyi arayüzler yapmaya yardımcı olur)
    • React’e benzer basit bir JavaScript framework’ü (veri akışı ve event işleme mantığını anlamaya yardımcı olur)
    • XMLHTTPRequest etrafında bir HTTP kütüphane wrapper’ı (fetch var ama HTTP isteklerinin en baştan nasıl gönderilip okunduğunu anlamak, CORS sorunlarını, OPTIONS isteklerini vb. debug ederken faydalıdır)
  • Mini bir işletim sistemi hakkında olumlu bir görüş. Uygulama geliştiricisi olarak işletim sisteminin sunduğu işlevlere (bellek yönetimi, dosya sistemi vb.) güveniyorsun ve bunların perde arkasında nasıl çalıştığını merak etmen doğal. xv6 kullanarak boş zamanlarda çeşitli süreç zamanlama algoritmalarını öğrenip uygulamak çok faydalı ve eğlenceli bir deneyim olabilir.

  • Robotlar, otomatik pilotlu dronelar veya programlanabilir GNC parametrelerine sahip bir uzay aracının uçuş dinamiğinin doğru simülasyonu gibi fiziksel şeylerle uğraşma isteği. Elinde "Fundamentals of Astrodynamics" kitabı var ve bunu bu tatil döneminde değerlendirmek istiyor. GNC (güdüm, seyrüsefer ve kontrol) hakkında iyi kaynaklar arıyor.

  • Kişisel zevke ve koşullara göre değişir, ama fikir arıyorsan bu liste iyi bir başlangıç noktası olabilir. Sinclair ZX Spectrum ile bir nota editörü ve tracker, 2D oyunlar (Space Invaders) vb. yapmış. İlk bilgisayarıyla (386) ise Huffman compressor, B-Tree index, OOP form generator, dial-up için e-posta denetleyicisi, elle yazılmış parser’lar vb. geliştirmiş.

  • Metin düzenleyiciler üzerine bir tartışma: metin belgesini bellekte nasıl saklayacağın en büyük zorluk. İlk akla gelen şey array kullanmak, ancak belgenin sonu dışında bir yere metin eklerken performans çok kötü oluyor. Buna rağmen JavaScript string’leri kullanmış ve editörü 2 yıldan uzun süre kullanmasına rağmen performans sorunu yaşamamış. Elbette başka birçok sorun olmuş; örneğin uzun yatay çizgileri render etmek problem yaratmış, çünkü optimizasyon yaklaşımı tek satır render etmenin ucuz olacağını varsayıyormuş.

  • Basit, oyuncak bir raytracer denemek de iyi bir fikir olabilir. Bitmap grafikte küreler ile diffuse ve reflective yansımalar yapan bir raytracer oluşturmak, projeyi gereğinden fazla karmaşıklaştırmadığın sürece nispeten sınırlı kapsamlı bir proje olabilir.

  • Space Invaders yazmak için "factory pattern" gerektiğini düşünüyorsan, ortada bir sorun var demektir. Orijinal oyunda böyle tasarım kavramlarının kullanıldığından emin değil.

  • Veri yapısı olarak array kullanan bir metin düzenleyici hakkındaki görüş. Yazarken yüksek hız gerekir ve aynı anda sadece tek bir satır değişir. Yeni bir satır eklerken Enter’a bastıktan sonra array’i yeniden düzenlemek için gereken ek gecikme, milyonlarca satır olsa bile fark edilmez. Metin düzenleyicinin daha zor kısmı, kullanıcının yalnızca gördüğü şeyin render edildiğinden emin olmaktır.