Jawaban singkat untuk pertanyaan yang paling sering diajukan pembaca tentang topik ini.
01Bagaimana cara menghadapi system design interview langkah demi langkah?
Kerjakan tujuh langkah berurutan: klarifikasi requirements dan scope, estimasi scale, definisikan API dan data model, gambar high-level design, deep dive komponen paling berisiko, bahas bottleneck, failure mode dan trade-off, lalu ringkas. Setiap langkah menghasilkan sesuatu yang dipakai langkah berikutnya, jadi melewatkan satu membuat sisanya kabur. Sebutkan asumsi dan beri angka pada tiap keputusan.
02Pertanyaan apa yang sebaiknya diajukan ke pewawancara di system design interview?
Tanyakan use case utama, rasio read terhadap write, jumlah user yang diharapkan dan pertumbuhannya, latency dan availability yang diharapkan, apakah data basi boleh, dan berapa lama data disimpan. Tanyakan juga apa yang di luar scope agar Anda tidak mendesain akun, search dan edit tanpa sengaja. Kalau pewawancara tidak menjawab, sebutkan asumsi dan lanjutkan.
03Berapa lama waktu untuk tiap bagian system design interview 45 menit?
Tidak ada pembagian resmi, tetapi titik awal yang masuk akal adalah sekitar 5 menit untuk requirements, 5 untuk estimasi, 7 untuk API dan data model, 7 untuk high-level design, 10 untuk deep dive, 7 untuk bottleneck dan trade-off, dan 4 untuk penutup. Anggap ini saran, karena pewawancara bisa mengarahkan Anda ke satu area. Kalau waktu mepet, pendekkan deep dive, jangan lewati failure mode.
04Apa kesalahan paling umum di system design interview?
Yang paling umum adalah menyebut teknologi sebelum requirements jelas, tidak memberi angka untuk scale, dan menggambar desain yang tidak pernah gagal. Lainnya adalah mendesain untuk scale yang salah, seperti sharding data yang muat di satu disk, dan bicara sepuluh menit tanpa memastikan maksud pewawancara. Tiap kesalahan punya perbaikan murah: jelaskan kebutuhan dulu, jalankan aritmetika, dan telusuri jalur request sambil bertanya apa yang terjadi saat tiap hop lambat atau mati.
05Apakah saya harus melakukan estimasi back-of-the-envelope di setiap system design interview?
Ya, dalam bentuk tertentu, karena angka menentukan komponen apa yang dibutuhkan. Hasil kasar seperti sekitar selusin write dan sekitar seratus read per detik memberi tahu bahwa satu node database cukup dan pertumbuhan storage adalah masalah sebenarnya. Bulatkan agresif, sebutkan setiap asumsi, dan berhenti setelah dapat request per detik, storage per tahun dan bandwidth.
Framework System Design Interview: Panduan Langkah demi Langkah
Cara menghadapi system design interview langkah demi langkah: requirements, estimasi scale, API dan data model, diagram, deep dive, trade-off, plus contoh pastebin.
Untuk menghadapi system design interview langkah demi langkah, klarifikasi functional dan non-functional requirements, estimasi scale dengan aritmetika sederhana, definisikan API dan data model, gambar diagram high-level, deep dive komponen paling berisiko, lalu bahas bottleneck, failure mode dan trade-off sebelum menutup. Sebutkan asumsi dan beri angka pada setiap keputusan.
Kebanyakan orang yang macet di system design interview bukan kekurangan pengetahuan. Mereka kekurangan urutan kerja. Soal seperti design a pastebin memang sengaja dibuat terbuka, dan soal terbuka tanpa prosedur berakhir sebagai daftar nama teknologi yang dibacakan di depan whiteboard.
Saya perlu jujur soal otoritasnya. Saya menulis ini dari sisi kandidat, bukan dari kursi pewawancara, jadi tidak ada anekdot interview di bawah. Isinya checklist yang disusun dari literatur standar: definisi systems design, buku Google SRE, AWS Well-Architected Framework, dan Azure Architecture Guide. Contoh di akhir hanya memakai angka yang saya hitung langsung di depan Anda.
Apa framework yang bisa diulang untuk system design interview?
Framework ini adalah urutan tetap dari tujuh langkah. Setiap langkah menghasilkan sesuatu yang dipakai langkah berikutnya, sehingga melewatkan satu langkah membuat langkah sesudahnya kabur.
Klarifikasi requirements dan scope: pisahkan apa yang dilakukan sistem (functional) dari seberapa baik ia harus melakukannya (non-functional), dan sepakati apa yang di luar scope.
Estimasi scale: ubah jumlah user dan aksi menjadi request per detik, storage dan bandwidth, memakai aritmetika yang dibulatkan.
Definisikan API dan data model: beberapa operasi dan entity yang disentuhnya, sebelum satu kotak pun digambar.
Gambar high-level design: client, service, store dan jalur request melewatinya.
Deep dive komponen paling berisiko: bagian yang sulit karena angka atau requirement, bukan bagian yang paling Anda sukai.
Periksa bottleneck, failure mode dan trade-off: apa yang rusak lebih dulu, apa yang terjadi saat itu, dan apa harga tiap pilihan.
Tutup: ringkas desain terhadap requirements dan sebutkan apa yang akan dibangun berikutnya.
Definisi systems design di Wikipedia adalah proses mendefinisikan arsitektur, modul, interface dan data sebuah sistem agar memenuhi requirements yang ditentukan. Kalimat itu adalah framework ini dalam versi mini: requirements dulu, lalu interface dan data, baru arsitektur. Pewawancara memperhatikan apakah Anda bekerja ke arah itu, bukan apakah Anda sampai pada diagram tertentu.
Bagaimana cara mengklarifikasi requirements dan scope?
Pakai beberapa menit pertama untuk bertanya, dan ucapkan asumsi Anda keras-keras kalau tidak ada yang menjawab. Tujuannya memisahkan soal menjadi functional requirements, yaitu fitur, dan non-functional requirements, yaitu kualitas yang menentukan arsitektur. Tabel berikut berisi pertanyaan yang paling berguna.
Jenis
Pertanyaan yang diajukan
Apa yang berubah dari jawabannya
Functional
Siapa penggunanya dan apa dua atau tiga aksi intinya?
Permukaan API dan entity di data model
Functional
Apa yang jelas di luar scope: akun, search, edit?
Jumlah komponen yang digambar dan waktu untuk deep dive
Non-functional
Latency dan availability seperti apa yang diharapkan user?
Caching, replication, dan apakah satu node saja cukup
Berapa user, berapa data, dan berapa lama disimpan?
Semua angka di langkah estimasi
Buku Google SRE memberi kosakata untuk sisi non-functional: ia menyebut latency, availability dan throughput di antara indikator untuk menilai sebuah service, dan menyarankan target dinyatakan dalam percentile, bukan rata-rata. Pinjam itu. Mengatakan jalur baca harus menjawab di bawah 200 ms pada percentile ke-99 adalah requirement; mengatakan harus cepat bukan.
Pertanyaan yang layak diajukan di hampir semua soal:
Apa use case utamanya, dan mana yang paling penting?
Apakah workload-nya read-heavy atau write-heavy, dengan rasio berapa?
Berapa jumlah user yang diharapkan, dan seberapa cepat bisa tumbuh?
Apakah sistem harus tetap available saat ada kegagalan, atau outage singkat bisa ditoleransi?
Adakah batasan retensi data, penghapusan, atau privasi?
Bagian mana yang boleh saya anggap di luar scope atau sebagai service yang sudah ada?
Tulis requirements yang sudah disepakati di satu sudut papan dan biarkan di sana. Saat sampai di langkah trade-off, Anda menunjuk sebuah requirement, bukan membela selera.
Bagaimana cara mengestimasi scale tanpa kalkulator?
Estimasi ada untuk memilih arsitektur, bukan menghitung tagihan. Post capacity estimation di seri ini membahas tekniknya lebih dalam; ringkasnya, bulatkan agresif, biarkan setiap asumsi terlihat, dan akhiri dengan empat angka: write per detik, read per detik, storage per tahun dan bandwidth. Kalau hasilnya selusin request per detik, Anda baru saja tahu bahwa satu node database bukan bagian yang sulit.
Pilih konstanta bulat sekali dan pakai terus. Satu hari ada 86.400 detik, yang dibulatkan jadi sekitar 100.000 saat butuh cepat. Traffic puncak adalah kelipatan dari rata-rata, dan dua sampai tiga kali adalah asumsi yang wajar selama Anda menyebutnya sebagai asumsi. Dua menit aritmetika ini mencegah sepuluh menit mendesain untuk scale yang salah.
Bagaimana membagi waktu slot 45 menit?
Ini saran, bukan aturan. Panjang dan format interview berbeda-beda, dan pewawancara yang ingin menggali satu area akan menimpa jadwal apa pun yang Anda bawa. Pembagian di bawah adalah titik awal yang menurut saya masuk akal karena deep dive dan trade-off adalah tempat perbedaan antar kandidat terlihat.
Langkah
Menit yang disarankan
Yang seharusnya sudah ada di papan
1. Klarifikasi requirements
5
Daftar functional, target non-functional, di luar scope
2. Estimasi scale
5
Request per detik, storage per tahun, bandwidth
3. API dan data model
7
Endpoint dan satu atau dua tabel atau entity
4. High-level design
7
Diagram kotak dan panah dengan jalur request
5. Deep dive
10
Satu komponen dibahas mendalam
6. Bottleneck dan trade-off
7
Failure mode dan harga tiap pilihan
7. Tutup
4
Ringkasan satu menit dan langkah berikutnya
Totalnya 45. Kalau Anda kehabisan waktu di high-level design, pendekkan deep dive, jangan lewati pembahasan failure; desain yang belum diuji lebih tidak berharga daripada desain dengan satu komponen yang digali tuntas.
Bagaimana membahas trade-off dan failure mode?
Pernyataan trade-off punya tiga bagian: pilihannya, apa yang didapat, dan apa harganya. Kaitkan dengan requirement atau angka yang sudah Anda tulis. Frasa berikut menjaga diskusi tetap terstruktur dan tidak terdengar seperti selera pribadi.
Saya memilih ini karena requirement yang kita sepakati adalah target latency baca, dan opsi ini melayani baca dari memori.
Ini memberi availability dengan harga baca yang sesekali basi, dan kita sudah sepakat baca basi beberapa detik boleh.
Kalau komponen ini gagal, user melihat gejala spesifik ini, dan kita pulih dengan melakukan hal spesifik ini.
Estimasi bilang kita belum butuh ini, jadi saya tinggalkan dulu dan tinjau lagi saat load sepuluh kali lipat.
Di titik ini saya akan mengukur dulu sebelum memutuskan, dan ini metrik yang akan saya lihat.
Untuk failure mode, telusuri jalur request di diagram dan tanyakan apa yang terjadi saat tiap hop lambat, mati atau salah. Bab Google SRE tentang cascading failures menjelaskan kenapa lambat adalah kasus yang berbahaya: server overload yang menjawab lambat mengundang retry, dan retry menambah beban ke server yang sudah kesulitan. Post CAP theorem dan cache-aside di seri ini adalah bahan latihan yang bagus untuk sisi consistency dan staleness dari percakapan yang sama.
Jangan menjadikan retry satu-satunya jawaban untuk dependency yang gagal. Retry tanpa batas adalah cara yang terdokumentasi untuk mengubah dependency yang lambat menjadi outage penuh, jadi pasangkan setiap retry dengan batas, backoff dan cara untuk membuang load.
Apa kesalahan paling umum di system design interview?
Tiga kesalahan menyumbang sebagian besar jawaban yang lemah, dan ketiganya soal urutan, bukan pengetahuan: menyebut tool terlalu cepat, melewatkan angka dan mengabaikan failure. Tabel memasangkan tiap kesalahan dengan wujudnya dan perbaikannya, ditambah dua kesalahan terkait.
Kesalahan
Wujudnya
Perbaikan
Langsung menyebut nama teknologi
Kafka atau Redis muncul di menit pertama, sebelum ada yang tahu rasio baca
Jelaskan kebutuhannya dulu, misalnya buffer atau jalur baca cepat, baru sebut tool dan alternatif yang Anda tolak
Tanpa angka
Kata seperti scale besar, jutaan user, latency rendah tanpa angka di sampingnya
Jalankan langkah estimasi dan biarkan hasilnya menolak atau membenarkan tiap komponen
Mengabaikan failure
Diagram di mana semua kotak selalu berfungsi
Telusuri jalur request dan sebut apa yang dilakukan tiap hop saat lambat atau mati
Mendesain untuk scale yang salah
Sharding dataset yang muat di satu disk
Bandingkan estimasi dengan kemampuan satu node sebelum menambah mesin
Monolog tanpa jeda
Sepuluh menit tanpa memastikan requirements sesuai maksud pewawancara
Berhenti setelah tiap langkah dan tanyakan apakah perlu lebih dalam atau lanjut
Perbaikan untuk kesalahan pertama paling murah dilatih: sebelum menyebut nama produk, selesaikan kalimat sistem ini butuh sesuatu yang melakukan X pada Y per detik. Kalau Anda tidak bisa mengisi Y, Anda melewatkan langkah dua.
Seperti apa framework ini pada soal nyata: design a pastebin?
Berikut seluruh framework diterapkan dari awal sampai akhir pada pastebin, service tempat user mengirim teks dan mendapat link pendek. Setiap angka di bawah adalah asumsi yang saya sebutkan, dan angka lainnya diturunkan dari asumsi itu. Tidak ada yang merupakan hasil pengukuran.
Requirement
Keputusan atau asumsi
Functional: create
Kirim teks, terima link pendek
Functional: read
Buka link, lihat teksnya; waktu kedaluwarsa opsional
Di luar scope
Akun, edit, search, diff yang paham syntax
Non-functional: scale
Asumsikan 1 juta paste baru per hari, 10 read per write, rata-rata 10 KB, maksimum 512 KB
Non-functional: latency
Read di bawah 200 ms pada percentile ke-99
Non-functional: availability dan retensi
Read tetap jalan saat satu node gagal; paste disimpan satu tahun
Langkah dua adalah aritmetika. Hasilnya menunjukkan traffic kecil dan storage adalah sumbu pertumbuhan yang sebenarnya, yang memberi tahu di mana deep dive dipakai.
// Assumptions (stated aloud): 1M new pastes/day, 10 reads per write,
// 10 KB average body, 200 B metadata row, 1 year retention, peak = 3x average.
const SECONDS_PER_DAY = 86_400;
const writesPerSec = 1_000_000 / SECONDS_PER_DAY; // 11.6 -> call it 12
const readsPerSec = 10_000_000 / SECONDS_PER_DAY; // 115.7 -> call it 116
const peakWrites = 3 * writesPerSec; // ~35
const peakReads = 3 * readsPerSec; // ~350
const bodyBytesPerYear = 365_000_000 * 10_000; // 3.65e12 = 3.65 TB
const metaBytesPerYear = 365_000_000 * 200; // 7.3e10 = 73 GB
const readBandwidth = readsPerSec * 10_000; // ~1.16 MB/s average
// Key space: 7 base62 characters.
const keySpace = 62 ** 7; // 3_521_614_606_208 ~ 3.5e12
const fillAfter10y = 3_650_000_000 / keySpace; // ~0.001 -> 0.1% full
// Reading: ~350 reads/s at peak is one modest database node.
// The real growth axis is storage, so that is where the deep dive goes.
Langkah tiga: sketsa API dan data model. Isi paste disimpan di object store, dan database hanya menyimpan satu baris metadata kecil yang menunjuk ke sana, karena metadata sekitar 200 byte sedangkan isinya sekitar 10 KB.
POST /v1/pastes
body: { "content": "...", "syntax": "plain", "ttl_seconds": 86400 } // ttl optional
201: { "id": "aZ3k9Qp", "url": "https://paste.example/aZ3k9Qp", "expires_at": "2026-10-11T08:00:00Z" }
413: content over 512 KB
429: create rate limit exceeded
GET /v1/pastes/aZ3k9Qp
200: { "id": "aZ3k9Qp", "content": "...", "syntax": "plain", "created_at": "..." }
404: unknown id
410: paste existed and has expired
-- Metadata only. The body lives in the object store under blob_key.
CREATE TABLE pastes (
id char(7) PRIMARY KEY, -- base62; 62^7 ~ 3.5e12 keys
blob_key text NOT NULL, -- object-store key for the body
size_bytes integer NOT NULL CHECK (size_bytes BETWEEN 1 AND 524288),
syntax text NOT NULL DEFAULT 'plain',
created_at timestamptz NOT NULL DEFAULT now(),
expires_at timestamptz -- NULL = keep for the retention period
);
-- The expiry sweeper scans this; partial so non-expiring rows cost nothing.
CREATE INDEX pastes_expires_idx ON pastes (expires_at)
WHERE expires_at IS NOT NULL;
-- Random key + unique primary key: a collision fails the insert, the app retries with a new key.
-- Write this row LAST, after the body is stored, so a failure leaves an orphan blob, never a dangling row.
Langkah empat, high-level design, singkat untuk soal ini: client berbicara ke web service stateless di belakang load balancer; service menulis metadata ke database relasional dan isi paste ke object store; read mengecek cache lebih dulu. Langkah lima memilih bagian paling berisiko, yang bukan throughput, karena satu database dengan mudah menangani sekitar seratus read per detik. Yang berisiko adalah pembuatan key dan pertumbuhan storage tanpa batas.
Untuk key, tujuh karakter base62 memberi sekitar 3,5 triliun nilai. Memilih key acak dan mengandalkan unique constraint berarti tabrakan saat insert diulang dengan key baru. Setelah sepuluh tahun paste, tabel baru terisi sekitar 0,1 persen, sehingga jumlah retry yang diharapkan tetap kecil sekali. Skema berbasis counter menghindari retry tetapi butuh counter yang terkoordinasi dan membuat key mudah ditebak, jadi sebutkan trade-off itu dan katakan mana yang Anda pilih serta alasannya.
Langkah enam dan tujuh. Bottleneck: storage bertambah sekitar 3,65 TB per tahun, jadi object store, bukan database, yang harus dipantau, dan expiry harus benar-benar menghapus isi. Failure mode: kalau cache mati, read jatuh ke database, yang sanggup menyerap load pada scale ini, jadi cache adalah optimisasi dan bukan dependency. Kalau penulisan ke object store sukses tetapi insert database gagal, Anda punya blob yatim, jadi tulis baris metadata terakhir dan sapu blob yatim secara berkala. Tutup dengan mengulang requirements dan menyebut langkah berikutnya: pencegahan abuse dan rate limiting pada endpoint create.
Bagaimana berlatih dan menutup interview?
Empat menit terakhir adalah ringkasan singkat, bukan materi baru. Ulangi requirements dalam satu kalimat, sebut komponen yang Anda gali dan trade-off utamanya, dan daftar satu atau dua hal yang akan ditambahkan jika ada waktu. Sebagai pengecekan akhir, AWS Well-Architected Framework menawarkan checklist enam pilar: operational excellence, security, reliability, performance efficiency, cost optimization dan sustainability. Menanyakan pilar mana dari enam itu yang belum tersentuh adalah cara cepat menemukan celah.
Untuk berlatih, jalankan tujuh langkah pada satu soal per sesi, pasang timer, dan tulis angka sebelum diagram. Post lain di seri ini adalah latihan dengan alur pikir lengkap: mendesain URL shortener, post algoritma rate limiting, cache-aside versus write-through caching, dan CAP theorem dengan contoh praktis. Untuk awal yang lebih ringan, post system design explained for developers membahas dasarnya, dan Azure Architecture Guide adalah katalog architecture style dan design pattern yang layak dibaca sekilas untuk kosakata.
Aturan yang saya ambil dari semua ini adalah urutan mengalahkan kecerdikan. Bertanya sebelum menggambar, menghitung sebelum memilih, dan menyebut harga tiap pilihan. Desain sederhana dengan angka di baliknya dan failure mode yang disebut biasanya terbaca lebih baik daripada desain rumit yang tidak pernah menyebut bagaimana ia rusak.