80 puan yazan GN⁺ 2025-08-26 | Henüz yorum yok. | WhatsApp'ta paylaş
  • 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)

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.

Henüz yorum yok.