Python ile Mimari Kalıplara Bakış
(cosmicpython.com)- 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
-
- bölümde CQRS örneği, olayları kullanan ve kullanmayan biçimleriyle ele alınır
-
- 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
- Branch listesi GitHub’daki branches sayfasından görülebilir
- İ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 checkoutile 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
Türkçe baskısı da mevcut: Python ile Mimari Desenlere Bakış