Pola Arsitektur yang Ditinjau lewat Python
(cosmicpython.com)- Aplikasi Python yang kompleks makin sulit diuji dan diubah hanya dengan pendekatan implementasi sederhana seiring bertambahnya skala, dan buku ini membahas pola arsitektur sebagai solusinya melalui contoh kode
- Dengan menggunakan penjualan furnitur online MADE.com dan rantai pasok global sebagai contoh, buku ini menempatkan pemodelan domain sebagai pusat untuk menerjemahkan masalah operasional dunia nyata ke dalam model perangkat lunak
- Poros utamanya adalah TDD, DDD, dan arsitektur berbasis peristiwa, dengan tujuan pengujian unit yang cepat, sedikit pengujian E2E, model yang terpisah dari infrastruktur, dan integrasi berbasis pesan
- Menggunakan Flask, SQLAlchemy, pytest, Docker, Redis, tetapi fokusnya adalah membangun struktur di mana pilihan teknologi tertentu terdorong menjadi detail implementasi
- Dapat dibaca oleh mereka yang pernah menangani aplikasi Python yang kompleks, dan tidak perlu lebih dulu memahami DDD atau pola arsitektur aplikasi klasik
Berangkat dari masalah struktur yang mudah diuji
- Setelah buku Harry sebelumnya Test-Driven Development with Python, masih tersisa pertanyaan tentang bagaimana aplikasi harus disusun agar mudah diuji
- Intinya adalah membuat struktur yang memungkinkan logika bisnis cukup ditangani dengan pengujian unit, sambil meminimalkan jumlah pengujian integrasi dan E2E
- Konsep seperti "Hexagonal Architecture", "Ports and Adapters", dan "Functional Core, Imperative Shell" sempat disebut, tetapi saat itu belum benar-benar dipahami atau dipraktikkan dengan baik
- Bob menjadi arsitek karena tidak ada orang di tim yang menangani arsitektur perangkat lunak, dan ia mempelajari pendekatan baru dalam menulis kode dan cara berpikir dari Ian Cooper
Kasus MADE.com: memodelkan rantai pasok ke dalam perangkat lunak
- Kedua penulis bekerja di perusahaan e-commerce Eropa MADE.com, dan menerapkan teknik dalam buku ini untuk membangun sistem terdistribusi yang memodelkan masalah bisnis nyata
- Domain contoh didasarkan pada sistem pertama yang dibuat Bob di MADE, dengan tujuan merangkum hal-hal yang perlu diajarkan ketika programmer baru bergabung ke tim
- MADE.com mengoperasikan rantai pasok global yang terdiri dari mitra pengiriman barang dan produsen
- Untuk menekan biaya, mereka ingin mengoptimalkan pengiriman agar stok tidak menumpuk lama di gudang
- Idealnya, pada hari pelanggan membeli sofa, produk itu tiba di pelabuhan dan langsung dikirim ke rumah pelanggan tanpa penyimpanan
- Karena barang bisa memerlukan 3 bulan untuk tiba dengan kapal kontainer, penyesuaian waktu menjadi sulit
- Dalam operasi nyata, terus muncul variabel seperti kerusakan, banjir, keterlambatan akibat badai, kesalahan penanganan oleh mitra logistik, dokumen yang hilang, dan perubahan pesanan oleh pelanggan
- Untuk menangani masalah seperti ini, mereka berusaha merepresentasikan operasi dunia nyata ke dalam perangkat lunak dan mengotomatiskan sebanyak mungkin pekerjaan
Batasan yang muncul saat proyek Python membesar
- Python telah tumbuh dan matang dengan cepat, tetapi kini mulai sungguh-sungguh menangani jenis masalah yang sudah lama dihadapi ekosistem C# dan Java
- Startup berubah menjadi bisnis nyata, dan aplikasi web serta otomasi skrip berkembang menjadi perangkat lunak enterprise
- Dalam filosofi Python ada ungkapan “There should be one—and preferably only one—obvious way to do it”, tetapi ketika skala proyek membesar, cara yang paling obvious tidak selalu cocok untuk mengelola kompleksitas dan perubahan kebutuhan
- Teknik dan pola yang dibahas dalam buku ini bukan hal baru, tetapi dalam dunia Python kebanyakan masih tergolong relatif baru
- Buku ini bukan pengganti Domain-Driven Design karya Eric Evans atau Patterns of Enterprise Application Architecture karya Martin Fowler, dan justru sering merujuk pada karya klasik tersebut serta merekomendasikannya untuk dibaca
- Contoh kode dalam literatur sebelumnya sering ditulis dalam Java atau C++/#, sehingga bisa terasa berat bagi pengembang Python untuk membacanya
Tiga alat untuk mengelola kompleksitas
- Test-Driven Development (TDD) membantu membuat kode yang benar, serta memungkinkan refactoring atau penambahan fitur tanpa takut pada regresi
- Membahas cara menjalankan pengujian secepat mungkin
- Cara memperoleh cakupan dan umpan balik sebanyak mungkin dari pengujian unit yang cepat dan tanpa dependensi
- Cara meminimalkan pengujian E2E yang lambat dan tidak stabil
- Domain-Driven Design (DDD) membantu tetap fokus pada pembuatan model yang baik untuk domain bisnis
- Membahas cara agar model tidak terikat pada perhatian infrastruktur
- Membahas cara agar model tidak menjadi sulit diubah
- Mikroservis yang loosely coupled dan terintegrasi lewat pesan, yang kadang disebut reactive microservices, dibahas sebagai solusi untuk mengelola kompleksitas antar aplikasi atau domain bisnis yang berbeda
- Tidak selalu jelas bagaimana menyesuaikannya dengan alat yang sudah ada di ekosistem Python seperti Flask, Django, dan Celery
- Bahkan jika tidak menggunakan atau tidak tertarik pada mikroservis, sebagian besar pola dalam buku ini dan banyak isi tentang arsitektur berbasis peristiwa tetap dapat diterapkan pada arsitektur monolitik
Pembaca dan pengetahuan prasyarat
- Buku ini ditujukan untuk pembaca yang setidaknya pernah menangani aplikasi Python yang cukup kompleks dari dekat
- Buku ini cocok untuk pembaca yang telah merasakan sakitnya mengelola kompleksitas
- Tidak diperlukan pengetahuan awal tentang DDD atau pola arsitektur aplikasi klasik
- Penjelasan dibangun per bab dengan berpusat pada aplikasi contoh
- Karena para penulis menggunakan TDD dalam pekerjaan mereka, mereka sering memperlihatkan kode pengujian terlebih dahulu lalu implementasinya
- Buku ini menggunakan Flask, SQLAlchemy, pytest, Docker, dan Redis, tetapi mengenalnya lebih dulu hanya membantu, bukan keharusan
- Salah satu tujuan utamanya adalah membangun arsitektur di mana pilihan teknologi tertentu menjadi detail implementasi kecil
Susunan buku
- Buku ini dibagi menjadi dua bagian
-
Bagian 1: arsitektur yang mendukung pemodelan domain
- Pemodelan domain dan DDD dibahas pada Bab 1, 2, dan 7
- Dasarnya adalah bahwa masalah bisnis yang kompleks harus dicerminkan sebagai model domain di dalam kode
- Dijelaskan cara memulai dari model yang tidak memiliki dependensi eksternal dan memungkinkan pengujian unit yang cepat
- Setelah itu dibahas kembali pemilihan aggregate yang tepat dan masalah integritas data
- Pola Repository, Service Layer, dan Unit of Work dibahas pada Bab 2, 4, dan 5
- Pola-pola ini saling melengkapi untuk memisahkan model dari dependensi yang tidak perlu
- Dibuat lapisan abstraksi di sekitar penyimpanan persisten, serta lapisan layanan yang menangkap titik masuk sistem dan use case utama
- Menunjukkan struktur yang memudahkan pembuatan titik masuk tipis seperti API Flask atau CLI
- Pembahasan tentang abstraksi dan pengujian berlanjut pada Bab 3 dan 5
- Setelah memperkenalkan pola Repository, dibahas cara memilih abstraksi dan peran abstraksi dalam cara pengikatan
- Setelah pola Service Layer, dibahas piramida pengujian dan cara menulis pengujian unit pada tingkat abstraksi setinggi mungkin
-
Bagian 2: arsitektur berbasis peristiwa
- Arsitektur berbasis peristiwa dibahas dari Bab 8 hingga 11
- Memperkenalkan pola Domain Events, Message Bus, dan Handler
- Domain Events adalah sarana untuk merepresentasikan gagasan bahwa suatu interaksi dalam sistem memicu tindakan lain
- Message Bus memungkinkan tindakan memicu peristiwa dan memanggil handler yang sesuai
- Dibahas cara menggunakan peristiwa sebagai pola integrasi antarlayanan dalam arsitektur mikroservis
- Commands dan events dibedakan, dan aplikasi pada dasarnya menjadi sistem pemrosesan pesan
- Bab 12 membahas contoh CQRS dengan pendekatan yang menggunakan peristiwa dan yang tidak
- Bab 13 merapikan dependensi eksplisit dan implisit serta mengimplementasikan framework dependency injection yang sederhana
- Dalam epilog, penulis menjelaskan cara menerapkan prinsip-prinsip ini pada perangkat lunak yang sudah ada, bukan hanya pada contoh sederhana yang baru dimulai, dan menyediakan bacaan lanjutan
Kode contoh dan cara mengikuti
- Buku ini disusun di sekitar satu proyek contoh, dan proyek itu diperluas secara bertahap seiring kemajuan bab
- Penulis menganggap penting agar pembaca benar-benar menyentuh kodenya dan memperoleh intuisi tentang cara pola-pola tersebut bekerja
- Semua kode tersedia di GitHub dan setiap bab memiliki branch terpisah
- Daftar branch dapat dilihat di halaman branches GitHub
- Tiga cara mengikuti disarankan
- Membuat repositori sendiri dan membangun aplikasi dengan mengikuti contoh di buku, sambil merujuk ke repositori penulis saat diperlukan
- Mencoba menerapkan tiap pola ke proyek kecil milik sendiri per bab
- Berlatih cepat menggunakan "Exercise for the Reader" di tiap bab dan kode GitHub yang sebagian dibiarkan kosong
- Khusus bagi pembaca yang ingin menerapkan pola-pola ini pada proyek sendiri, menangani contoh sederhana lebih dulu menjadi latihan yang aman
- Setidaknya saat membaca tiap bab, pembaca disarankan mengambil kode dari repositori dengan
git checkoutdan memeriksanya dalam konteks aplikasi yang benar-benar berjalan
Lisensi dan format
- Kode dan versi online dilisensikan dengan Creative Commons CC BY-NC-ND
- Untuk tujuan nonkomersial
- Wajib atribusi
- Boleh disalin dan dibagikan
- Edisi cetak mengikuti lisensi terpisah, dan jika ada kekhawatiran terkait penggunaan ulang, pembaca diarahkan untuk menghubungi O’Reilly
- Konvensi penulisan buku membedakan penggunaan italic, fixed-width, fixed-width bold, dan fixed-width italic
- Italic menunjukkan istilah baru, URL, alamat email, nama file, dan ekstensi
- Fixed-width menunjukkan daftar program dan elemen kode
- Fixed-width bold menunjukkan perintah atau teks yang harus diketik pengguna apa adanya
- Fixed-width italic menunjukkan teks yang diganti dengan nilai yang diberikan pengguna atau ditentukan oleh konteks
1 komentar
Sudah tersedia dalam edisi bahasa Korea Architecture Patterns with Python