Her Programcının Denemesi Gereken Projeler (2019)
(austinhenley.com)- 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
- 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
- Derleyici, başkalarının daha fazlasını inşa etmesini sağlayan araçları üretmeye yönelik bir projedir
- Küçük bir BASIC türevi dil olan Tiny BASIC için, iyi bildiğiniz başka bir dile çıktı veren bir derleyiciyi sıfırdan yazabilirsiniz
- Örneğin Python ile bir Tiny BASIC derleyicisi yazıp C# kodu üretebilirsiniz
- Assembly veya C çıktısı üretmezseniz derleyicinin kendisine daha fazla odaklanabilirsiniz
- Uygulama akışı, dil işleme sürecini adım adım izler
- Girdi kodunu token'lara ayıran lexical analysis
- Girdi yapısını doğrulayıp ağaç temsili oluşturan syntactic analysis
- recursive descent parsing
- abstract syntax tree
- Kodun anlamsal olarak doğru olup olmadığını ve tip kurallarına uyup uymadığını denetleyen semantic analysis
- optimization passes
- code generation
- Basit bir derleyici birkaç gün içinde tamamlanabilir; sonrasında standart kütüphane, optimization pass'ler ve daha iyi hata mesajları eklenebilir
- PeayBASIC'e standart kütüphane olarak basit 2D grafik özellikleri eklenmiştir
- Kaynaklar
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
- Cross compiling
- Bootloading
- BIOS interrupts
- x86 modes
- Bellek yönetimi ve paging
- Scheduling: örneğin round robin
- File systems: örneğin FAT
- 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ı
grepbenzeri genel terminal yardımcı programları- FTP istemcisi ve sunucusu
1 yorum
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
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
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
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
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
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)
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
Ö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
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
Beyin buna bir kez enfekte olunca enfeksiyonu yaymanın yollarını aramaya başlıyor
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
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
Kitabın içeriği ve nasıl projeler denenebileceği hakkında daha fazla duymak isterim
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
Grafik render etmeye çalışınca geometri ve veri yapılarını ne kadar zorlayabileceğinizi gerçekten çok öğreniyorsunuz
https://austinhenley.com/blog/morechallengingprojects.html
https://raytracing.github.io/
https://raytracing-iow.shuttleapp.rs
İ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