5 puan yazan GN⁺ 2025-03-29 | 1 yorum | WhatsApp'ta paylaş
  • Karmaşık Python uygulamalarında ölçek büyüdükçe yalnızca basit uygulama yaklaşımlarıyla test ve değişiklik yükünü taşımak zorlaşır; bu kitap çözüm olarak mimari kalıpları kod örnekleriyle ele alır
  • MADE.com’un çevrim içi mobilya satışı ve küresel tedarik zincirini örnek alarak, gerçek operasyonel sorunları yazılım modeline aktarmayı hedefleyen domain modellemeyi merkeze koyar
  • Ana eksen TDD, DDD ve olay tabanlı mimaridir; hızlı birim testleri ve az sayıda E2E test, altyapıdan ayrılmış model ve mesaj tabanlı entegrasyon hedeflenir
  • Flask, SQLAlchemy, pytest, Docker ve Redis kullanır; ancak odağı, belirli teknoloji seçimlerinin uygulama ayrıntıları haline itildiği bir yapı kurmaktır
  • Karmaşık Python uygulamalarıyla çalışmış deneyiminiz varsa okunabilir; DDD’yi ya da klasik uygulama mimarisi kalıplarını önceden bilmeniz gerekmez

Test etmesi kolay bir yapıdan doğan problem bilinci

  • Harry’nin önceki kitabı Test-Driven Development with Python sonrasında, uygulamaların test edilmesi kolay olacak şekilde nasıl yapılandırılması gerektiği sorusu geride kaldı
  • Temel nokta, iş mantığını birim testleriyle yeterince kapsarken entegrasyon testleri ve E2E testlerin sayısını en aza indiren bir yapı kurmaktır
  • “Hexagonal Architecture”, “Ports and Adapters”, “Functional Core, Imperative Shell” gibi kavramlardan söz etmiş olsa da, o dönemde bunları pratikte yeterince anlamış ya da uygulayabilmiş durumda değildi
  • Bob, ekipte yazılım mimarisini üstlenecek kimse olmadığı için mimar oldu ve Ian Cooper’dan kod yazmaya ve düşünme biçimine dair yeni bir yaklaşım öğrendi

MADE.com örneği: tedarik zincirini yazılımla modellemek

  • İki yazar, Avrupa merkezli e-ticaret şirketi MADE.com’da çalışırken kitaptaki teknikleri gerçek iş problemlerini modelleyen dağıtık sistemler kurmak için uyguladı
  • Örnek domain, Bob’un MADE’de ilk geliştirdiği sisteme dayanır ve yeni bir programcı ekibe katıldığında öğretilmesi gerekenleri derleme amacını taşır
  • MADE.com, nakliye ortakları ve üreticilerden oluşan küresel bir tedarik zinciri işletir
    • Maliyeti düşürmek için stokların depoda uzun süre beklememesi adına teslimatı optimize etmeye çalışır
    • İdeal durumda, müşteri bir kanepe satın aldığı gün ürünün limana varmasını ve depolama olmadan müşterinin evine teslim edilmesini ister
    • Ürünlerin konteyner gemisiyle varması 3 ay sürebildiği için zamanlamayı ayarlamak zordur
  • Gerçek operasyonda hasar, su baskını, fırtına kaynaklı gecikmeler, lojistik ortaklarının işlem hataları, eksik evraklar ve müşterinin sipariş değişiklikleri gibi değişkenler sürekli ortaya çıkar
  • Bu sorunları ele almak için gerçek dünyadaki operasyonları yazılımla ifade etmeye ve mümkün olduğunca çok işi otomatikleştirmeye çalışır

Python projeleri büyüdüğünde ortaya çıkan sınırlar

  • Python hızla büyüyüp olgunlaşmış olsa da, C# ve Java dünyasının uzun süredir uğraştığı türden problemleri artık ciddi biçimde üstlenmeye başlamış durumdadır
  • Startup’lar gerçek işlere dönüşür; web uygulamaları ve betik otomasyonları kurumsal yazılıma doğru büyür
  • Python felsefesinde “There should be one—and preferably only one—obvious way to do it” sözü vardır; ancak proje ölçeği büyüdüğünde en obvious yol, karmaşıklığı ve gereksinim değişikliklerini yönetmek için her zaman uygun olmayabilir
  • Kitapta ele alınan teknikler ve kalıplar yeni değildir; ancak bunların çoğu Python dünyası için görece yeni kabul edilir
  • Eric Evans’ın Domain-Driven Design ve Martin Fowler’ın Patterns of Enterprise Application Architecture kitaplarının yerini alma amacı taşımaz; bu klasiklere sıkça referans verir ve okunmalarını önerir
  • Mevcut literatürdeki kod örnekleri çoğu zaman Java veya C++/# ile yazıldığından, Python geliştiricileri için okunması yorucu olabilir

Karmaşıklığı yönetmek için üç araç

  • Test güdümlü geliştirme (TDD) doğru kodu üretmeyi sağlar; regresyondan korkmadan refactoring yapmanıza veya özellik eklemenize imkân verir
    • Testleri mümkün olduğunca hızlı çalıştırma yöntemleri
    • Hızlı ve bağımlılıksız birim testlerinden en yüksek kapsamı ve geri bildirimi alma yöntemleri
    • Yavaş ve kırılgan E2E testleri en aza indirme yolları ele alınır
  • Domain-driven design (DDD) iş domain’inin iyi bir modelini oluşturmaya odaklanmayı sağlar
    • Modelin altyapı kaygılarına bağlı kalmamasını sağlama yolları
    • Değiştirilmesi zor bir modele dönüşmesini engelleme yolları ele alınır
  • Mesajlarla entegre olan gevşek bağlı mikroservisler, bazen reactive microservices olarak adlandırılan yaklaşım, birden çok uygulama veya iş domain’i arasındaki karmaşıklığı yönetmek için bir çözüm olarak ele alınır
    • Flask, Django ve Celery gibi Python ekosistemindeki mevcut araçlarla bunun nasıl uyumlandırılacağı her zaman açık değildir
  • Mikroservis kullanmasanız veya ilgi duymasanız bile, kitaptaki kalıpların çoğu ve olay tabanlı mimari içeriğinin önemli bir bölümü monolitik mimarilere de uygulanabilir

Okur kitlesi ve ön bilgiler

  • Bu kitap, bir ölçüde karmaşık Python uygulamalarıyla yakından çalışmış okurları varsayar
  • Karmaşıklık yönetiminden kaynaklanan acıyı yaşamış okurlara yöneliktir
  • DDD veya klasik uygulama mimarisi kalıpları hakkında ön bilgi gerekmez
  • Anlatım, örnek uygulama etrafında bölümler ilerledikçe üst üste inşa edilen bir yapıdadır
  • Yazarlar işlerinde TDD kullandıkları için, sık sık önce test kodunu ardından uygulamayı gösteren bir akış kullanır
  • Flask, SQLAlchemy, pytest, Docker ve Redis kullanılır; bunlara zaten aşinaysanız yardımcı olur ama zorunlu değildir
  • Ana hedeflerden biri, belirli teknoloji seçimlerinin önemsiz uygulama ayrıntıları haline geldiği bir mimari kurmaktır

Kitabın yapısı

  • Kitap iki bölüme ayrılır
  • 1. Kısım: Domain modellemeyi destekleyen mimari

    • Domain modelleme ve DDD 1., 2. ve 7. bölümlerde ele alınır
    • Karmaşık iş problemlerinin kod içindeki domain modele yansıtılması gerektiği varsayımına dayanır
    • Dış bağımlılığı olmayan ve hızlı birim testlerine uygun bir modelle nasıl başlanacağını açıklar
    • Daha sonra uygun aggregate seçimi ve veri bütünlüğü sorunlarına yeniden döner
    • Repository, Service Layer ve Unit of Work kalıpları 2., 4. ve 5. bölümlerde ele alınır
    • Bu kalıplar, modeli gereksiz bağımlılıklardan ayırmak için birbirini tamamlar
    • Kalıcı depolama çevresinde bir soyutlama katmanı oluşturur; sistem giriş noktalarını ve temel kullanım senaryolarını yakalayan bir servis katmanı koyar
    • Flask API veya CLI gibi ince giriş noktaları oluşturmayı kolaylaştıran bir yapı gösterir
    • Soyutlama ve testlere ilişkin tartışma 3. ve 5. bölümlerde devam eder
    • Repository kalıbını tanıttıktan sonra soyutlamayı seçme yöntemlerini ve bağlanma biçiminde soyutlamanın rolünü ele alır
    • Service Layer kalıbından sonra test piramidi ve mümkün olan en yüksek soyutlama düzeyinde birim testi yazma yöntemleri ele alınır
  • 2. Kısım: Olay tabanlı mimari

    • Olay tabanlı mimari 8. bölümden 11. bölüme kadar ele alınır
    • Domain Events, Message Bus ve Handler kalıpları tanıtılır
    • Domain Events, sistemdeki bir etkileşimin başka bir davranışı tetiklediği fikrini ifade etmenin bir yoludur
    • Message Bus, davranışların olayları tetiklemesini ve uygun handler’ın çağrılmasını sağlar
    • Olayların mikroservis mimarisinde servisler arası entegrasyon kalıbı olarak nasıl kullanılacağı ele alınır
    • commands ve events ayrımı yapılır; uygulama özünde bir mesaj işleme sistemi haline gelir
      1. bölümde CQRS örneği, olayları kullanan ve kullanmayan biçimleriyle ele alınır
      1. bölümde açık ve örtük bağımlılıklar düzenlenir ve basit bir dependency injection framework’ü uygulanır
    • Epilog, yeni başlayan basit bir örnek yerine bu ilkelerin mevcut yazılıma nasıl uygulanacağını ve ek okuma kaynaklarını sunar

Örnek kod ve uygulayarak izleme

  • Kitap tek bir örnek proje etrafında yapılandırılmıştır; bölümler ilerledikçe proje kademeli olarak genişletilir
  • Okurun gerçekten kodla oynamasını ve kalıpların nasıl çalıştığına dair sezgi kazanmasını önemli görür
  • Tüm kod GitHub’dadır ve her bölüm için ayrı bir branch vardır
  • İzlemek için üç yöntem önerilir
    • Kendi deponuzu oluşturup kitaptaki örnekleri izleyerek uygulamayı geliştirmek ve gerektiğinde yazarların deposuna başvurmak
    • Her kalıbı bölüm bölüm kendi küçük projenize uygulamak
    • Her bölümdeki “Exercise for the Reader” ve bazı bölümleri boş bırakılmış GitHub kodunu kullanarak hızlıca pratik yapmak
  • Özellikle kalıpları kendi projesine uygulamak isteyen okurlar için önce basit bir örnekle çalışmak güvenli bir alıştırma olur
  • En azından her bölümü okurken depodan git checkout ile kodu alıp, kodu gerçekten çalışan bir uygulama bağlamında incelemeniz önerilir

Lisans ve biçim

  • Kod ve çevrim içi sürüm Creative Commons CC BY-NC-ND lisanslıdır
    • Ticari olmayan amaç
    • Atıf
    • Kopyalama ve paylaşma serbestisi
  • Basılı sürüm ayrı bir lisansa tabidir; yeniden kullanım konusunda endişe varsa O’Reilly ile iletişime geçilmesi söylenir
  • Kitabın yazım kuralları italik, sabit genişlikli, sabit genişlikli kalın ve sabit genişlikli italik biçimleri ayırt ederek kullanır
    • İtalik yeni terimleri, URL’leri, e-posta adreslerini, dosya adlarını ve uzantıları gösterir
    • Sabit genişlikli yazı program listelerini ve kod öğelerini gösterir
    • Sabit genişlikli kalın yazı, kullanıcının aynen girmesi gereken komutları veya metinleri gösterir
    • Sabit genişlikli italik yazı, kullanıcının sağlayacağı veya bağlama göre belirlenecek değerlerle değiştirilecek metni gösterir

1 yorum

 
xguru 2025-03-29

Türkçe baskısı da mevcut: Python ile Mimari Desenlere Bakış