Pengenalan System Design
Memahami apa itu system design dan mengapa penting bagi engineer dan Engineering Manager
Apa itu System Design
- Proses mendefinisikan arsitektur, komponen, modul, dan data untuk memenuhi kebutuhan sistem
- Menjawab pertanyaan: "Bagaimana kita membangun sistem yang bisa handle X pengguna dengan kebutuhan Y?"
- Mencakup keputusan tentang database, caching, messaging, skalabilitas, dan availability
- Bukan tentang memilih bahasa pemrograman atau framework — melainkan bagaimana komponen bekerja bersama
Mengapa System Design Penting
- Keputusan arsitektur sulit untuk diubah setelah diimplementasi
- Sistem yang dirancang buruk sulit di-scale dan mahal di-maintain
- Engineering Manager perlu memahami system design untuk me-review proposal teknis tim
- Menjadi dasar komunikasi antara engineer senior tentang arah teknis
Elemen Dasar System Design
Client dan Server
- Client: yang mengajukan request (browser, mobile app, service lain)
- Server: yang memproses request dan mengembalikan response
- Protokol: cara client dan server berkomunikasi (HTTP, WebSocket, gRPC)
Database
- Penyimpanan data yang persisten
- Pilihan utama: relational (PostgreSQL, MySQL) vs non-relational (MongoDB, DynamoDB)
- Keputusan database adalah salah satu yang paling berdampak dalam system design
Caching
- Menyimpan hasil komputasi atau query untuk digunakan kembali
- Mengurangi beban database dan mempercepat response
- Contoh: Redis, Memcached, CDN untuk static assets
Load Balancer
- Mendistribusikan traffic ke beberapa server
- Memungkinkan horizontal scaling
- Menghilangkan single point of failure
Message Queue
- Komunikasi asynchronous antar service
- Decoupling: producer tidak perlu tahu tentang consumer
- Contoh: Kafka, RabbitMQ, SQS
Trade-off dalam System Design
System design selalu melibatkan trade-off. Tidak ada solusi yang sempurna:
| Trade-off | Pilihan A | Pilihan B |
|---|---|---|
| Consistency vs Availability | Data selalu akurat | Sistem selalu tersedia |
| Latency vs Throughput | Respon cepat per request | Banyak request per detik |
| Read vs Write | Optimasi read | Optimasi write |
| SQL vs NoSQL | Struktur teratur, relasi kuat | Fleksibel, mudah di-scale |
Pendekatan System Design
Top-down
- Mulai dari kebutuhan high-level (functional dan non-functional requirements)
- Rancang arsitektur besar sebelum detail
- Identifikasi bottleneck dan risiko
- Drill down ke komponen yang kritis
Capacity Estimation
- Berapa pengguna yang diharapkan? (Daily Active Users, Monthly Active Users)
- Berapa request per detik pada peak?
- Berapa storage yang dibutuhkan dalam 1-5 tahun?
- Dari angka ini, bisa ditentukan kebutuhan infrastruktur
Perbedaan System Design untuk Engineer vs EM
- Engineer: fokus pada implementasi detail, teknologi spesifik, dan trade-off teknis
- Engineering Manager: fokus pada memvalidasi proposal, mengidentifikasi risiko, dan memastikan tim membuat keputusan yang tepat untuk konteks bisnis
EM tidak perlu menjadi ahli system design, tapi perlu cukup paham untuk terlibat dalam diskusi dan review.
Praktik Terbaik
- Mulai dengan kebutuhan (requirements), bukan solusi
- Tanyakan dan dokumentasikan asumsi secara eksplisit
- Diskusikan trade-off secara terbuka dengan tim
- Gunakan ADR untuk mendokumentasikan keputusan arsitektur penting
- Iterasikan desain — tidak perlu sempurna dari awal