Beda architecture (struktur makro) vs design pattern (solusi mikro), coupling & cohesion sebagai penentu umur kode, technical debt, klasifikasi architectural patterns vs GoF vs prinsip — plus bedah codebase nyata mencari titik refactor

Sebelum menyentuh satu pattern pun, kalian butuh peta besar: apa bedanya arsitektur, design pattern, dan prinsip? Banyak developer menghabiskan bertahun-tahun menggunakan ketiga istilah ini bergantian — padahal mereka beroperasi di level abstraksi yang berbeda dan menjawab masalah yang berbeda.
Episode ini membangun kosakata dan cara pandang yang akan dipakai konsisten selama 27 episode ke depan.
Arsitektur adalah struktur makro sistem: bagaimana komponen-komponen besar dibagi, siapa boleh bicara dengan siapa, dan di mana batas-batasnya. Contoh: "sistem kita layered, modul orders tidak boleh query tabel billing langsung."
Design pattern adalah solusi mikro untuk masalah yang berulang: bagaimana mengorganisir class/fungsi dalam skala lokal. Contoh: "pembuatan koneksi DB pakai Factory Method; akses data pakai Repository."
Analogi bangunan: arsitektur = denah & struktur gedung; design pattern = cara merakit jendela/pintu standar; prinsip = building code.
Dua metrik kualitas yang muncul terus-menerus:
Kode awet = low coupling + high cohesion. Hampir semua pattern dan arsitektur di series ini pada dasarnya adalah alat mencapai dua hal itu.
Istilah Ward Cunningham untuk biaya akumulasi shortcut: kode cepat-jadi hari ini = bunga yang dibayar setiap kali fitur baru disentuh. Tanda debt menumpuk:
1. Estimasi fitur "kecil" selalu meledak (sentuh satu, rusak lima)
2. Takut refactor karena tidak ada test yang bisa dipercaya
3. File/class dengan ratusan baris dan banyak if-branch domain
4. Logika bisnis tersebar di controller, view, dan job tanpa rumah tetapKenapa arsitektur menentukan umur kode? Karena debt tumbuh di sambungan antar komponen. Arsitektur yang baik membuat perubahan lokal tetap lokal.
| Lapis | Contoh | Fungsi |
|---|---|---|
| Architectural patterns | Layered/N-tier, MVC, hexagonal, clean, CQRS, EDA, modular monolith | Kerangka makro (episode 9–25) |
| Design patterns (GoF) | Factory, Builder, Adapter, Facade, Strategy, Observer, Command... | Solusi mikro (episode 5–7) |
| Prinsip | SOLID, DRY, KISS, YAGNI | Kompas nilai saat memilih keduanya |
Perhatikan hubungan sebab-akibat: prinsip (SOLID) melahirkan motif; pattern (GoF) adalah resep konkret; arsitektur mengatur bagaimana resep-resep itu hidup bersama dalam sistem besar. Episode 3–4 membahas SOLID, 5–7 katalog GoF, lalu 8–14 fondasi layering sebelum naik ke arsitektur advanced.
Target outline: bedah satu codebase nyata — identifikasi coupling buruk & titik refactor.
Ambil project CRUD lab dari episode 0 (atau codebase kerja kalian), lalu jalankan audit berikut:
// orders.service.ts - 340 baris, gejala coupling buruk:
@Injectable()
export class OrdersService {
constructor(
private http: HttpService,
private mailer: MailerService,
private prisma: PrismaService, // query SQL mentah di service
) {}
async create(dto: CreateOrderDto) {
// validasi bisnis + hitung total + panggil payment API
// + tulis DB + kirim email + update statistik - SEMUA DI SINI
}
}
// Temuan: 6 tanggung jawab (SRP langgar), detail infrastruktur
// (http/mailer/sql) bocor ke logika bisnis (DIP langgar).Latihannya sederhana namun membentuk mata arsitek: temukan minimal tiga lokasi dengan coupling buruk, tulis kenapa ia buruk, dan tebak pattern/layer mana yang akan memperbaikinya. Jawaban resminya akan kalian dapatkan sepanjang series.
Rangkuman episode ini:
Episode 2 menggali fondasi OOP yang menjadi bahasa semua pattern: empat pilar OOP di tiga bahasa, dan kenapa pattern modern memilih komposisi daripada inheritance. Sampai jumpa!