[{"data":1,"prerenderedAt":130},["ShallowReactive",2],{"tag-labels":3,"series-lab":4,"site-header":65},{},{"id":5,"title":6,"title_id":6,"slug":7,"description":8,"description_id":9,"ogImage":10,"articles":11,"children_series":64,"parent_series":10},29,"Lab","lab","Practice labs: work the problem first, then read the answer. Every lab ships with a repo you can clone, production-sized data, and a target you have to hit yourself. The write-up lives in this series too, and it only opens from the problem article.","Lab praktik: kerjakan masalahnya dulu, baru lihat jawabannya. Tiap lab punya repo yang bisa di-clone, data seukuran produksi, dan target yang harus kamu capai sendiri. Artikel jawabannya ada di seri ini juga, dan cuma bisa kamu buka dari artikel masalahnya.",null,[12,23,34,43,54],{"id":13,"title":14,"title_id":15,"slug":16,"excerpt":17,"excerpt_id":18,"tags":19},104,"N+1 Was Never the Bottleneck: 41 Queries Down to 2, Still One Second","Query-nya Tinggal 2, Tapi Response-nya Masih 1 Detik","query-tinggal-2-tapi-response-masih-1-detik","A feed endpoint that shows 20 posts takes a full second and hits the database with 41 queries. Apply the standard N+1 advice, get it down to 2 queries, and the latency does not move. This is that problem as it happened, plus the lab.","Endpoint feed yang cuma menampilkan 20 tulisan butuh satu detik, dan server database dihujani 41 query. Kamu kerjakan nasihat N+1 yang standar, query-nya turun jadi 2, dan latency-nya nggak bergerak. Ini versi \"apa adanya\" dari masalah itu, plus lab-nya.",[20,21,22],"database","performance","backend",{"id":24,"title":25,"title_id":26,"slug":27,"excerpt":28,"excerpt_id":29,"tags":30},114,"One Payment, Four Ledger Rows: An Idempotency Lab","Saldo Naik Empat Kali untuk Satu Pembayaran","saldo-naik-empat-kali-untuk-satu-pembayaran","The code is not wrong and the gateway is not wrong, yet one payment shows up four times in the ledger. Guess why, then make `make check` green in the lab.","Kodenya nggak salah, dan gateway-nya juga nggak salah. Tapi satu pembayaran muncul empat kali di ledger. Coba tebak kenapa — lalu bikin `make check` hijau di lab-nya.",[31,32,33,20,7],"idempotency","webhook","postgres",{"id":35,"title":36,"title_id":37,"slug":38,"excerpt":39,"excerpt_id":40,"tags":41},116,"The Webhook Arrived Late. The Reconciliation Job Had Already Run.","Webhook-nya Telat, Job Rekonsiliasinya Keburu Jalan","webhook-telat-job-rekonsiliasi-keburu-jalan","The webhook path is already idempotent. Then a morning reconciliation job appears, and one payment gets recorded twice from two paths that are both right. Guess where the key is wrong.","Jalur webhook sudah idempotent. Lalu ada job rekonsiliasi pagi, dan satu pembayaran tercatat dua kali dari dua jalur yang dua-duanya benar. Coba tebak kuncinya salah di mana.",[31,42,32,33,7],"reconciliation",{"id":44,"title":45,"title_id":46,"slug":47,"excerpt":48,"excerpt_id":49,"tags":50},120,"Every Receipt in This Café Lists the Same Order","Tiap Nota di Kafe Ini Isinya Pesanan yang Sama","tiap-nota-isinya-pesanan-yang-sama","Every table's receipt holds the same items, and the total is Rp0 — even though each table ordered exactly one thing. Guess why, then make `make check` green. A Python scope and mutation lab.","Nota tiap meja isinya sama semua, dan totalnya Rp0 — padahal tiap meja cuma pesan satu barang. Coba tebak kenapa.",[51,52,53,7],"python","scope","mutasi",{"id":55,"title":56,"title_id":57,"slug":58,"excerpt":59,"excerpt_id":60,"tags":61},122,"A Script That Cannot Say Where It Went Wrong","Script yang Nggak Bisa Bilang di Mana Salahnya","script-yang-tidak-bilang-di-mana-salahnya","A script that stops at the first bad line reports only part of the problem. This is what shows up on screen right now.","Script yang berhenti di baris jelek pertama cuma melaporkan sebagian masalah yang ada. Ini yang muncul di layar sekarang.",[51,62,63,7],"error-handling","validasi",[],{"featuredPost":66,"navigations":89},{"id":67,"title":68,"title_id":69,"slug":70,"excerpt":71,"excerpt_id":72,"has_translation":73,"published_at":74,"reading_time":75,"hidden_from_listing":76,"tags":77,"thumbnail_image":10,"og_image":82,"series":83,"authors":88},110,"When You Pick a Framework Just to Look Different","Ketika Pilih Framework Cuma Biar Kelihatan Beda","ketika-pilih-framework-cuma-biar-kelihatan-beda","The last time you chose a new framework or library, was it because your problem needed that tool, or because it sounded cool and few people around you were using it? That question is uncomfortable. Technology decisions are often made for reasons that never appear in any technical document.","Terakhir kali kamu milih framework atau library baru, itu karena masalahmu butuh alat itu, atau karena alatnya kedengaran keren dan belum banyak yang pakai? Pertanyaan ini nggak enak dijawab. Soalnya keputusan teknologi sering diambil dengan alasan yang nggak pernah ditulis di dokumen teknis mana pun.",true,"2026-10-06T15:25:21.000Z",5,false,[78,79,80,81],"karier","framework","opini","pengalaman","\u002Fog\u002Fketika-pilih-framework-cuma-biar-kelihatan-beda.png",{"id":84,"title":85,"title_id":86,"slug":87},9,"Articles","Artikel","all",[],[90,106,127],{"collection":91,"item":92},"series",{"__typename":91,"title":85,"title_id":86,"slug":87,"children_series":93},[94,98,102],{"title":95,"title_id":96,"slug":97},"Artificial Intelligence","Kecerdasan Artifisial","kecerdasan-artifisial",{"title":99,"title_id":100,"slug":101},"Programming Fundamentals","Konsep Dasar Pemrograman","konsep-dasar-pemrograman",{"title":103,"title_id":104,"slug":105},"Algorithms and Data Structures","Algoritma dan Struktur Data","algoritma-struktur-data",{"collection":91,"item":107},{"__typename":91,"title":108,"title_id":108,"slug":109,"children_series":110},"Tutorial","tutorial",[111,115,119,123],{"title":112,"title_id":113,"slug":114},"Learning Python","Belajar Python","belajar-python",{"title":116,"title_id":117,"slug":118},"Learning Go","Belajar Golang","belajar-golang",{"title":120,"title_id":121,"slug":122},"Learning Java","Belajar Java","belajar-java",{"title":124,"title_id":125,"slug":126},"Learning Pascal","Belajar Pascal","belajar-pascal",{"collection":91,"item":128},{"__typename":91,"title":6,"title_id":6,"slug":7,"children_series":129},[],1793336440250]