REVIEW MINGGUAN — 2 s.d. 8 November 2026
Sumber: learning_state.json, 21 entri tercatat (7 hari × 3 sesi). Semua yang di bawah ini berasal dari riwayat file, bukan rekonstruksi.
1. KONSEP YANG DIPELAJARI
05:00 — Deep (Arsitektur & Fondasi)
| Tanggal | Topik | Inti yang dicatat |
|---|---|---|
| 2 Nov | d-saga |
Transaksi lintas service tanpa 2PC. Saga = urutan local transaction + compensating action. Dua gaya: choreography (service reaksi ke event, tidak ada pusat kendali) vs orchestration (satu coordinator pegang state machine). Kompensasi bukan rollback — ia aksi bisnis baru (refund, cancel), jadi harus idempoten dan bisa gagal sendiri. |
| 3 Nov | d-sharding |
Shard key menentukan segalanya. Salah pilih → hot partition (satu shard nanggung mayoritas trafik). Range shard bagus untuk scan, buruk untuk penulisan monotonic (timestamp/auto-increment = semua write ke shard terakhir). Hash shard meratakan beban tapi mematikan range query. Resharding = biaya operasional terbesar, bukan masalah storage. |
| 4 Nov | d-circuit-breaker |
Tiga state: closed → open → half-open. Bedanya dengan retry: retry mengasumsikan kegagalan sementara, breaker mengasumsikan kegagalan sistematis dan berhenti memanggil. Pendampingnya bulkhead (isolasi pool per dependency) dan timeout budget (total deadline dialokasikan ke seluruh hop, bukan timeout per-hop yang dijumlahkan). |
| 5 Nov | d-ddd-bounded |
Bounded context = batas di mana satu model domain konsisten. Kesalahan klasik: satu model User dipakai di billing, shipping, dan auth → model jadi gumpalan. Solusi: model berbeda per context + context map (shared kernel, anti-corruption layer, conformist). Pemisahan context adalah keputusan sosial/organisasi, bukan teknis. |
| 6 Nov | d-rate-limit |
Token bucket (burst diizinkan, refill konstan) vs leaky bucket (output rata) vs sliding window log (akurat, mahal) vs sliding window counter (kompromi). Versi terdistribusi butuh state bersama: Redis + Lua script untuk atomicity, atau pendekatan approximate dengan local bucket + periodic sync. Yang sering dilupakan: rate limit harus punya key yang benar (user? IP? API key?) — pilihan key = kebijakan produk. |
| 7 Nov | d-idempotency |
Idempotency key disimpan bersama hash request + response. Tiga hal wajib: (1) key disimpan sebelum efek samping dijalankan, (2) request dengan key sama dan payload beda harus ditolak (409), (3) ada TTL — key abadi = tabel membengkak. Ini pondasi retry-safe API: tanpa idempotency, at-least-once delivery = duplikasi uang. |
| 8 Nov | d-type-systems |
Static vs dynamic bukan soal "aman vs cepat" tapi soal kapan kesalahan ditemukan. Soundness = sistem tipe menjamin tidak ada operasi ilegal saat runtime; hampir semua bahasa produksi tidak sepenuhnya sound (TypeScript sengaja unsound, Java punya null, Go punya nil interface). Bug produksi yang bisa dicegah tipe: kesalahan bentuk data lintas boundary. Yang tidak bisa dicegah tipe: kesalahan logika bisnis — jadi tipe mengurangi kelas bug, tidak menghilangkannya. |
15:00 — Technical Exploration
| Tanggal | Topik | Inti |
|---|---|---|
| 2 Nov | t-cloud-cost |
Tiga pembocor biaya terbesar: egress (data keluar), idle resource (volumenya, bukan harganya), dan over-provisioning (right-sizing). Optimasi tanpa tag biaya = tebak-tebakan. |
| 3 Nov | t-profiling |
Flame graph dibaca lebar = waktu, tinggi = kedalaman call stack. Bottleneck nyata biasanya bukan fungsi yang paling sering dipanggil, tapi yang paling lama menahan CPU/IO. Profiling harus di beban realistis — profile di lokal sering menunjuk tempat yang salah. |
| 4 Nov | t-tool-calling |
Schema tool = kontrak. Nama fungsi harus menjelaskan kapan dipakai, bukan cuma apa yang dilakukan. Error recovery: kembalikan error yang bisa dibaca model (apa yang salah + apa yang valid), bukan stack trace. Tool yang terlalu banyak = model bingung memilih. |
| 5 Nov | t-rust-ownership |
Ownership = satu pemilik per nilai, dipindah atau dipinjam. Borrow checker menolak apa yang akan jadi data race / use-after-free. Jalan keluar dari frustrasi umumnya bukan clone() di mana-mana, tapi memperbaiki struktur data (pakai index/handle, bukan referensi bersarang). |
| 6 Nov | t-nextjs-caching |
App Router punya empat lapisan cache yang bisa saling menimpa: Request Memoization, Data Cache, Full Route Cache, Router Cache (client). Bug "data basi" hampir selalu berasal dari Router Cache client yang tidak di-revalidate — solusinya revalidatePath/revalidateTag, bukan mematikan cache global. |
| 7 Nov | t-terraform-state |
State = sumber kebenaran mapping resource nyata ↔ kode. Drift = infra berubah di luar Terraform → rencana berikutnya mencoba "memperbaiki" dan bisa menghapus. Aturan: state di remote backend dengan locking, satu state per blast radius, import untuk resource yang sudah ada, jangan pernah edit state manual tanpa state mv. |
| 8 Nov | t-llm-prompt-cache |
Prompt caching memotong biaya input untuk prefix yang identik dan berulang (system prompt, dokumen panjang). Syaratnya: prefix harus persis sama dan di depan — satu karakter berubah di awal = cache miss total. Urutan prompt jadi keputusan ekonomi: taruh yang stabil di depan, yang dinamis di belakang. |
19:00 — Light Learning
| Tanggal | Topik | Inti |
|---|---|---|
| 2 Nov | l-g-monty-hall |
Intuisi gagal karena tidak memperbarui informasi setelah host membuka pintu — host tahu isi dan tidak membuka pintu berhadiah, jadi tindakannya membawa informasi. Pindah pintu = menang 2/3. |
| 3 Nov | l-debug-binary |
Binary search atas ruang masalah, bukan cuma array: matikan separuh sistem, lihat mana yang masih rusak. Syarat: ruang harus terurut dan bisa dipartisi bersih. |
| 4 Nov | l-estimation |
Estimasi salah karena ketidakpastian menumpuk secara perkalian, bukan penjumlahan, dan karena manusia mengestimasi kasus terbaik. Perbaikan: estimasi berbasis rentang, pecah ke unit kecil, catat estimasi vs aktual. |
| 5 Nov | l-utf8 |
UTF-8 = encoding variabel 1–4 byte; UTF-16 = 2 atau 4. Emoji di luar BMP butuh surrogate pair di UTF-16 (itu sebabnya panjang string di JavaScript tidak sama dengan jumlah karakter yang dilihat mata). Bug klasik: length dianggap jumlah karakter, padahal di UTF-8 itu jumlah byte dan di UTF-16 itu jumlah code unit. |
| 6 Nov | l-git-bisect |
Binary search atas riwayat commit. Butuh commit good dan bad yang diketahui; git bisect run <script> mengotomatiskan seluruh pencarian — 1000 commit = ~10 langkah. |
| 7 Nov | l-retro-formats |
Retro yang menghasilkan perubahan punya tiga ciri: dibatasi 1–2 masalah prioritas, tiap item punya pemilik dan tanggal, dan hasilnya ditinjau di retro berikutnya. Tanpa itu retro jadi sesi curhat. |
| 8 Nov | l-naming |
Nama adalah cara termurah menyimpan konteks. Nama buruk memaksa pembaca membangun ulang model mental dari implementasi. Aturan praktis: nama mengungkap maksud, bukan tipe; hindari singkatan yang tidak menambah informasi; nama yang butuh komentar penjelas = nama yang salah. |
2. KETERAMPILAN YANG DILATIH
Yang bisa langsung dipakai minggu depan:
- Desain API tahan retry — kombinasi
d-idempotency+d-rate-limit+d-circuit-breaker: sekarang punya kerangka lengkap untuk API yang aman di-retry, dibatasi, dan tidak menjatuhkan dependency. - Memilih shard key — bisa mengevaluasi kandidat shard key berdasarkan pola write/read, bukan feeling.
- Membaca flame graph — tahu bahwa lebar = waktu, dan profiling harus di beban realistis.
- Audit state Terraform — tahu urutan aman: remote backend + locking →
import→state mv, dan bahwa drift bukan error, tapi sinyal. - Menyusun prompt hemat biaya — urutkan prompt berdasarkan stabilitas (stabil di depan) untuk memanfaatkan cache.
- Debugging sistematis — binary search atas ruang masalah +
git bisect run= dua alat yang saling melengkapi (satu untuk sistem hidup, satu untuk riwayat kode). - Menulis nama yang benar — aturan "nama mengungkap maksud, bukan tipe" bisa dipakai immediate di code review.
3. CELAH PENGETAHUAN
Topik yang tercatat tapi belum tuntas — butuh pendalaman:
- Rate limiting terdistribusi — sudah dibahas token bucket lokal, tapi mekanisme sinkronisasi antar-node (Redis Lua vs local+sync vs consistent hashing per key) belum diuji angkanya. Berapa error rate kompromi local bucket?
- Soundness type system — sudah tahu TypeScript unsound dan di mana, tapi belum menyentuh variance (covariance/contravariance) dan bagaimana itu menyebabkan bug di generic API.
- Context map DDD — batas context sudah jelas, tapi pola integrasi (anti-corruption layer vs shared kernel) belum punya contoh konkret biaya maintenance-nya.
- Compensating action di saga — belum dibahas apa yang terjadi kalau kompensasi itu sendiri gagal (compensation of compensation). Ini titik paling rapuh di saga.
- Bounded context vs batas tim — sudah disebut pemisahan itu keputusan organisasi, tapi belum ada kerangka (Conway's law) untuk menilainya.
d-type-systemsbaru tercatat 8 Nov — permukaan saja; belum menyentuh type inference, HM algorithm, atau efek praktisnya ke desain API.
Catatan struktural: pool deep sudah 22/22 selesai. Pemanggilan next deep berikutnya akan menghapus seluruh riwayat sesi deep dan memulai siklus baru dari nol. Kalau riwayat itu mau dipertahankan sebagai arsip, harus ditambahkan topik baru ke pool sebelum siklus berikutnya berjalan.
4. KONEKSI ANTAR BIDANG
Ini bagian yang paling berharga dari minggu ini — topik-topik yang terlihat terpisah ternyata satu prinsip:
A. "Idempotency" muncul di empat tempat berbeda
- d-idempotency (API) — request ulang tidak menggandakan efek.
- d-saga (kompensasi) — compensating action harus idempoten karena bisa di-retry.
- t-terraform-state — apply yang sama dua kali = hasil sama; itulah kenapa drift berbahaya.
- l-git-bisect — bisect bisa diulang dari commit mana pun tanpa merusak state.
Satu prinsip: operasi yang bisa diulang aman adalah fondasi sistem terdistribusi. Kalau satu komponen tidak idempoten, seluruh alur retry di atasnya rapuh.
B. "Cache invalidation" punya bentuk sama di tiga lapisan
- t-nextjs-caching — Router Cache client tidak tahu data berubah.
- t-llm-prompt-cache — satu karakter berubah di prefix = seluruh cache hilang.
- d-cache-strategy (minggu lalu, 28 Okt) — stampede saat cache expire bersamaan.
Benang merah: cache selalu soal key dan staleness, bukan soal kecepatan. Yang salah bukan cache-nya, tapi definisi key atau momen invalidasi.
C. "Binary search" bukan algoritma array
- l-debug-binary — mempersempit ruang masalah.
- l-git-bisect — mempersempit riwayat commit.
- d-amortized / struktur data (Oktober) — binary search sebagai primitif.
Pola yang sama: setiap kali ruang pencarian bisa dipartisi dan punya predikat monoton, biaya pencarian jatuh dari O(n) ke O(log n).
D. "Batasan sebagai alat desain"
- d-ddd-bounded — batas context membuat model bisa konsisten.
- d-sharding — batas shard menentukan pola akses.
- d-type-systems — batas tipe memindahkan error ke compile time.
- d-rate-limit — batas kuota melindungi sistem.
Empat topik, satu pelajaran: sistem yang baik bukan sistem tanpa batas, tapi sistem yang batasnya dipilih secara sadar. Batas yang tidak dipilih akan dipilih oleh kegagalan produksi.
E. "Estimasi & informasi"
- l-estimation — estimasi salah karena ketidakpastian menumpuk perkalian.
- l-g-monty-hall — intuisi gagal karena informasi baru tidak diperbarui.
- d-circuit-breaker — breaker adalah cara memperbarui keyakinan tentang kesehatan dependency secara berkala (half-open = eksperimen).
Ketiganya soal cara memperbarui keyakinan ketika informasi baru datang — estimasi, probabilitas, dan resilience punya logika yang sama.
5. REKOMENDASI MINGGU DEPAN
Sisa pool saat ini: 4 tech (t-ts-types, t-node-eventloop, t-pg-index, t-http2-3) dan 1 light (l-g-honey). Deep kosong. Berikut prioritas, diurutkan berdasarkan mana yang menutup celah terbesar:
t-ts-types— langsung menyambungd-type-systems. Fokus type-level programming yang benar-benar dipakai: conditional types, mapped types,infer. Ini yang mengubah "tahu ada type system" jadi "bisa memakainya".t-node-eventloop— menyambungt-python-asyncdand-concurrency-models. Inti: satu fungsi sinkron memblokir seluruh proses — ini penyebab paling umum latensi tak terjelaskan di Node.t-http2-3— melengkapit-cdn-edgedanl-utf8(soal framing & overhead). QUIC mengambil alih congestion control dari kernel ke userspace — itu perubahan arsitektur, bukan versi.t-pg-index— pasangan alamit-pg-explaindant-tx-isolation. Index yang tidak dipakai = biaya tulis tanpa manfaat baca.l-g-honey— satu-satunya light yang tersisa. Kimia dasar: kadar air rendah + pH asam + hidrogen peroksida + senyawa antibakteri. Bagus sebagai penutup siklus light.d-type-systemslanjutan (variance) — bukan topik baru di pool, tapi pendalaman yang paling mendesak: covariance/contravariance adalah sumber bug generic API yang tidak terlihat sampai produksi.- Compensation failure di saga — apa yang terjadi saat kompensasi gagal. Ini lubang terbesar yang tersisa dari minggu ini.
- Rate limiting terdistribusi, dengan angka — bandingkan local bucket + sync vs Redis Lua pada tingkat error yang bisa ditoleransi.
Kalau pool deep mau diisi topik baru sebelum siklus reset, kandidat yang paling nyambung dengan minggu ini: consistency models di level aplikasi (read-your-writes), API versioning & evolusi schema, dan Conway's law / batas tim vs batas service.
6. SATU PERTANYAAN RETROSPEKTIF
Minggu ini kamu mempelajari idempotency, saga, dan Terraform state — tiga hal yang intinya sama: operasi yang aman diulang. Tapi di sistem yang kamu bangun sendiri, proses mana yang kalau dijalankan dua kali akan merusak data?
Kalau kamu tidak bisa menjawabnya dengan cepat dan spesifik, itu berarti prinsipnya sudah kamu pahami sebagai konsep, tapi belum kamu terapkan sebagai audit.