- Yazılım tasarımı becerilerini geliştirmeye çalışıyor ve mevcut, iyi tasarlanmış kod tabanlarını incelemesi yönünde tavsiye almış
- Kamuya açık olarak erişilebilen kod tabanları arasında, yazılım tasarımında altın standart sayılanların hangileri olduğunu merak ediyor
1. Önerilen kod tabanları
- Büyük/temsilî projeler
- Git, Postgres, CPython
- Linux Kernel'in "lieutenants model"i
- UNIX v6, BSD'ler
- Framework'ler/kütüphaneler
- Sistemler/sunucular
- Oyunlar/özel örnekler
- Eğitim amaçlı/öğrenme kaynakları
- Diğer
- Monocypher (kriptografi kütüphanesi)
- Tcl dilinin gerçekleştirimı
2. Kod okuma vs belge/tasarım öğrenimi
- Sadece kodla sınırlılıklar
- Kod tabanı implementasyonu gösterir, ancak tasarım niyetini veya trade-off'ları gizler
- Tasarım belgelerinin önemi
- ADR (Architectural Decision Records), Rust RFC'leri, Python PEP'leri gibi karar kayıtları, tasarım öğrenimi için çok daha faydalıdır
- Tasarım belgesi yazmanın kendisi de bir eğitim olabilir
- Kitap/literatür önerileri
3. Pratik merkezli öğrenme yaklaşımı
- Deneyim ve deneme-yanılma
- Tasarım, sorunları tekrar tekrar yaşayıp bunlardan nasıl kaçınılacağını öğrenerek kazanılır
- Sadece kod okuyarak öğrenilmez; doğrudan yazıp başarısızlıkları çözme sürecinde öğrenilir
- İlgi temelli öğrenme
- Kişi ancak ilgisini çeken projeleri yaparken derinlemesine öğrenir
- Düşük başarısızlık maliyeti
- Yazılımda başarısızlık maliyeti fiziksel mühendisliğe göre daha düşüktür; bu yüzden deneme ve başarısızlık yoluyla öğrenme etkilidir
4. Yazılım mühendisliğinin doğası üzerine tartışma
- Olgunlaşmamış mühendislik görüşü
- Beş mühendisi bir araya getirince beş farklı çözüm çıkması, bunun bir mühendislik disiplini olarak olgunlaşmamış olduğunun kanıtı olarak görülüyor
- Deneye elverişli yapı görüşü
- Yazılım daha az kısıta sahip olduğu için çok çeşitli çözümler vardır; fiziksel mühendislikteki gibi tek bir doğru cevap sabit değildir
- Sanat ve mühendislik arasındaki sınır
- Tasarım, estetik unsurlar taşıyan sanatsal bir eylem olsa da, işlevsel gereksinimleri karşılama yönüyle mühendisliktir
- Yazılım, sanatsal esneklik ile mühendislik titizliği arasında durur
5. Alternatif öğrenme yöntemleri
- Kötü kod analizi
- Yalnızca iyi tasarlanmış kodları değil, kötü kod tabanlarını düzeltmeye çalışmayı da çok öğretici buluyorlar
- Kendi kod tabanından öğrenme
- Ekip içindeki kod tabanı, en çok şey öğrenilebilecek kaynak olarak gösteriliyor
- Ancak ekip kodu zayıfsa, dış örneklerle birlikte ilerlemek gerekiyor
- Alan odaklı öğrenme
- Çözmek istediğiniz probleme benzeyen kod tabanlarını okumak en etkili yöntem
Temel içgörüler
- İyi tasarlanmış kod tabanları faydalıdır, ancak öğrenme; tasarım niyetini anlamak ve deneme-yanılmayı yaşamakla birlikte ilerlemelidir
- Kod okumanın kendisinden çok tasarım belgeleri ve karar kayıtları temel öğrenme materyalidir
- Temsilî yüksek kaliteli projeler (Git, Postgres, CPython, Rust
std vb.) yüksek öğrenme değerine sahiptir
- Yalnızca iyi koddan değil, kötü koddan ve kendi kodunuzdan öğrenmek uzun vadede daha pratiktir
Öne çıkan yorumların özeti
Temsilî kod tabanı önerileri (CraigJPerry)
- Postfix mail server
- Güvenlik odaklı mimarisiyle, mikroservis kavramından önce bile benzer bir yapı gösteriyor
- Modern mikroservisler büyük organizasyonlarda dağıtımı öne çıkarırken, Postfix güvenlik ve sadelik için tasarlanmış
- Spring Framework
- Kurumsal ortamdaki Java geliştiricilerinin ihtiyaçlarını derinlemesine dikkate alan bir kültürü yansıtıyor
- Kullanıcı odaklı tasarım yaklaşımı öğrenilebilir
- Git
- Nesne veritabanı (blob, tree, commit) ve referans kavramını anladıktan sonra geri kalanı bunun kademeli genişlemesi
- Çekirdek kavramların tutarlı biçimde genişletilmesi, iyi tasarım örneği olarak sunuluyor
- Varnish
- Yüksek performanslı bir reverse proxy olmasının yanı sıra, öğrenme aracı olarak da kullanılabilecek kadar iyi düzenlenmiş bir kod tabanı
- Linux Kernel Lieutenants Model
- Bir kod tabanı değil, ama büyük ölçekli yazılım yönetim modeli olarak incelenmeye değer
- Bunlar sadece "iyi tasarlanmış kod" örnekleri değil, tasarım kararlarının güçlü iz bıraktığı örnekler olarak öne çıkıyor
Gerçek iş kod tabanında öğrenmeyi vurgulayan görüş (crystal_revenge)
- En büyük öğrenme değeri kendi ekibinizin kod tabanında bulunabilir
- Gerçek gereksinimlerle implementasyon arasındaki karmaşık bağlantı sürecinde hem iyi hem kötü tercihleri aynı anda deneyimlersiniz
- Gerçek dünyadaki kısıtların en büyüğü zaman baskısıdır; ideal tasarımla gerçeklik arasındaki dengeyi öğrenmek asıl konudur
- İyi yazılım, kullanıcı ihtiyaçlarını çözen yazılımdır; tekrar eden deneyimlerle başarı şansını artıran tasarımlar öğrenilir
Geçmiş tartışmalar ve kaynak bağlantıları (sprobertson)
- HN'de aynı konu birkaç kez ele alındı
Kod vs tasarım belgesi (alphazard)
- Kod tabanı yalnızca implementasyonun çıktısıdır; tasarımın kendisi değildir
- Tasarım öğrenimi için tasarım belgesi yazmak daha etkilidir
- Belge, başka birinin doğrudan implementasyon yapabileceği kadar açık olmalıdır
- Alternatifleri sıralayıp neden elendiklerini kaydetmek, tasarım değerlendirmesinin kanıtı olur
- İyi tasarımcı, daha geniş bir tasarım alanını değerlendirip uygun noktayı seçen kişidir
Tüm sistemi anlamayı vurgulayan görüş (RossBencina)
- Bir kod tabanının tamamını anlama süreci çok değerlidir
- Bu, yalnızca iyi tasarlanmış kodları değil, sistemin büyük resmini görme alıştırmasını da sağlar
- UML gibi diyagramlarla ilişkileri görselleştirmek yardımcı olur
- Öğrenme yaklaşımı:
- Geliştirmekte olduğunuz şeye benzeyen yazılımların kodunu okumak etkilidir
- Halihazırda iyi bildiğiniz bir alanın kodu (web framework'leri, web sunucuları, Python standart kütüphanesi, VSCode vb.) başlangıç noktası olarak önerilir
- İlk başta küçük programlar ve aşina olunan alanlardan başlamak daha iyidir
İyi tasarımın ölçütü (mamcx)
- İyi tasarım hedefler ve fikirlerdir; kod tabanı ise bunun ne ölçüde uygulandığını gösterir
- İyi tasarım, yalnızca "hızlı, güvenli" gibi sıfatlardan ibaret değil; somut değerlendirmeler ve trade-off kayıtları da içermelidir
- Örnekler: Erlang, erken dönem Pascal ve birçok RDBMS tasarımında bu özellikler görülebilir
- Rust'ın
std kütüphanesi, güvenlik ve tutarlılığı vurgular; kod ve belgeler de bunu sadakatle yansıttığı için iyi bir öğrenme materyalidir
Görünmeyen tasarım kararları (ben30)
- İyi tasarlanmış bir kod tabanına bakarken en önemli kısım görünmeyen şeylerdir
- Karmaşıklığı dışarıda bırakmak, gereksiz soyutlamalardan kaçınmak, belirli örüntüleri reddetmek gibi yokluk kararları asıl meseledir
- Bunu tamamlamak için ADR (Architectural Decision Records) kullanımı öneriliyor
- Alternatifleri, neden elendiklerini ve seçimin gerekçesini kaydederek bağlamı korur
- Gelecekteki bakımcılar ve yapay zeka araçları için de büyük fayda sağlar
- Öğrenirken, sadece koda değil ADR, RFC, PEP gibi tasarım karar belgeleriyle birlikte gelen projelere bakmak daha etkilidir
Henüz yorum yok.