[{"data":1,"prerenderedAt":175},["ShallowReactive",2],{"site-header":3,"site-footer-license":42,"article-script-yang-tidak-bilang-di-mana-salahnya-with-latest":46},{"navigations":4},[5,20,37],{"collection":6,"item":7},"series",{"__typename":6,"title":8,"slug":9,"children_series":10},"Artikel","all",[11,14,17],{"title":12,"slug":13},"Algoritma dan Struktur Data","algoritma-struktur-data",{"title":15,"slug":16},"Kecerdasan Artifisial","kecerdasan-artifisial",{"title":18,"slug":19},"Konsep Dasar Pemrograman","konsep-dasar-pemrograman",{"collection":6,"item":21},{"__typename":6,"title":22,"slug":23,"children_series":24},"Tutorial","tutorial",[25,28,31,34],{"title":26,"slug":27},"Belajar Java","belajar-java",{"title":29,"slug":30},"Belajar Pascal","belajar-pascal",{"title":32,"slug":33},"Belajar Golang","belajar-golang",{"title":35,"slug":36},"Belajar Python","belajar-python",{"collection":6,"item":38},{"__typename":6,"title":39,"slug":40,"children_series":41},"Lab","lab",[],{"name":43,"url":44,"show":45},"CC BY-SA","https://creativecommons.org/licenses/by-sa/4.0/",false,{"article":47,"renderedBody":105,"renderedTakeaway":106,"latestArticles":107,"toc":158},{"prerequisite":48,"id":49,"title":50,"slug":51,"excerpt":52,"published_at":53,"thumbnail_image":48,"tags":54,"reading_time":58,"takeway":59,"body":60,"authors":61,"series":67},null,"122","Script yang Nggak Bisa Bilang di Mana Salahnya","script-yang-tidak-bilang-di-mana-salahnya","Script yang berhenti di baris jelek pertama cuma melaporkan sebagian masalah yang ada. Ini yang muncul di layar sekarang.","2026-10-11T23:00:15.000Z",[55,56,57,40],"python","error-handling","validasi",4,"- **Satu pesan error yang berguna menjawab tiga hal:** di mana, apa yang salah, dan harusnya bagaimana.\n- **Script yang berhenti di masalah pertama cuma menjawab sepertiganya.** Empat masalah di satu file, nol yang dilaporkan.\n- **File yang salah kadang malah diam.** `kosong.csv` melaporkan `3 baris diimpor` dengan kode keluar `0`, padahal ada baris tanpa nama.\n- **Targetnya `make check`:** tujuh pemeriksaan, kondisi awal cuma 1 yang hijau.","Ada satu momen dalam hidup sebuah script kecil yang selalu berulang: hari pertama dia menerima file yang bukan kamu bikin sendiri. Selama yang menyusun `.csv`-nya kamu, semuanya mulus. Begitu file datang dari tim lain, telepon mulai berdering.\n\nScript-nya sederhana, kok. Dia membaca file `.csv` berisi daftar pendaftar dengan tiga kolom — `nama`, `email`, `umur` — lalu menyimpan baris yang valid. Satu file masuk, satu laporan keluar, selesai. Kecuali saat ada satu baris yang isinya jelek.\n\nDi situ yang muncul bukan penjelasan, melainkan laporan setinggi setengah layar. Judulnya `Traceback (most recent call last):`, disusul daftar path file, nomor baris di `impor.py`, nama fungsi, dan di baris paling bawah satu kalimat seperti `ValueError: invalid literal for int() with base 10: 'dua puluh'`. Semuanya benar. Nggak ada satu pun yang berguna buat orang yang mengirim file itu.\n\n## Yang orang keluhkan\n\nDi lab ini, `make demo` memerankan lima file contoh yang semuanya masuk ke script yang sama. Yang keluar dari tiap file belum seragam, dan justru itu masalah pertamanya. Tiga keluhan yang paling sering terdengar:\n\n- **Sebagian file bikin script mati mendadak.** Yang dilaporkan cuma baris yang kebetulan tersandung lebih dulu. Baris bermasalah setelahnya nggak pernah disebut, seolah nggak ada.\n- **File lain malah diam total.** Nggak ada keluhan apa pun, padahal di dalamnya jelas ada baris yang rusak. Script-nya malah mengucapkan terima kasih.\n- **Yang minta tolong mengeluh dengan kalimat yang sama:** \"aku nggak tahu baris berapa yang salah, kolom apa, dan harus ngapain.\" *Stack trace*-nya menyebut nama variabel Python — `baris`, `umur` — bukan baris di dalam file mereka.\n\nKalau kamu pernah menulis validator atau importer kecil, tiga keluhan itu terasa akrab. Yang bikin capek bukan menulis validasinya, tapi menjelaskan hasilnya ke orang lain. Dan itu, ternyata, bagian dari pekerjaannya juga.\n\n## Angka yang sudah diukur\n\nNggak ada tebakan di sini. Semua baris di bawah keluar dari `make demo` dan `make check`, dijalankan pada kondisi awal lab, apa adanya:\n\n| perintah | yang muncul sekarang |\n|---|---|\n| `make impor FILE=data/contoh/beberapa.csv` | `ValueError: invalid literal for int() ... 'dua puluh'` — **0 dari 4** masalah dilaporkan |\n| `make impor FILE=data/contoh/kosong.csv` | nggak ada keluhan, dan bilang `3 baris diimpor`, kode keluar `0` |\n| `make impor FILE=data/contoh/kolom.csv` | `IndexError: list index out of range` — **0 dari 2** masalah dilaporkan |\n| `make impor FILE=data/contoh/tidak-ada.csv` | `FileNotFoundError`, kode keluar `1` |\n| `make check` | **1 dari 7** pemeriksaan hijau (cuma A) |\n\nBaris pertama itu yang paling menyakitkan. Di `beberapa.csv` ada **empat** masalah yang menunggu dilaporkan, tapi program berhenti di yang pertama dan melupakan sisanya. Baris ketiga sama polanya: `kolom.csv` punya **dua** baris dengan jumlah kolom yang meleset, dan dua-duanya nggak pernah kelihatan.\n\nBaris kedua punya bentuk kegagalan yang berbeda, dan menurutku yang paling licin. `kosong.csv` berisi baris tanpa nama, tapi script-nya santai saja melaporkan `3 baris diimpor` dengan kode keluar `0`. Nggak ada yang merah, nggak ada yang kuning; dan kalau kamu nggak memeriksa file sumbernya baris demi baris, kamu nggak akan pernah tahu.\n\nBandingkan dengan baris terakhir. Di situ `make check` cuma menyalakan satu lampu hijau dari tujuh. Tujuh pemeriksaan itu tersimpan di `scripts/check.py`, dan alat itulah yang jadi juri lab ini.\n\n## Batas lab ini\n\nAda dua hal yang sengaja nggak dibahas di sini, dan keduanya penting biar kamu nggak salah ambil pelajaran.\n\nPertama, semua error yang diurus lab ini adalah **data yang salah**, bukan **program yang salah**. Kamu sedang memvalidasi masukan yang datang dari luar. Kalau yang salah adalah logika di kodemu sendiri (*bug*), itu cerita yang lain lagi. Kedua, ini program satu kali jalan, bukan layanan yang terus hidup. Di sini \"di mana\" artinya nomor baris di file; di sebuah layanan web, \"di mana\" bisa berarti field di body request. Konsepnya sama, tempatnya beda. Ini juga yang bikin kode keluar (*exit code*) penting: script seperti ini sering dipanggil dari `cron`, `make`, atau pipa shell, bukan ditemani orang yang menatap layarnya.\n\nAda juga satu batas yang praktis. Format laporan `baris N: kolom — pesan` cukup untuk file seukuran ini. Begitu filenya ratusan megabyte, melaporkan semua masalah sekaligus itu sendiri punya ongkos. Untuk sekarang, ukurannya masih sopan.\n\n## Misi kamu\n\nLab ini sengaja dibuat level pemula. Buat menjalankannya kamu nggak perlu Docker, nggak perlu database — cukup `python3` yang sudah terpasang. Yang dilatih di sini bukan kecepatan atau concurrency, tapi satu hal yang kepakai di semua bahasa: **membuat program yang salahnya bisa dibaca manusia.**\n\nTargetmu satu: bikin `make check` hijau, tujuh dari tujuh. Kamu bebas mengubah isi `app/` sesukamu. Yang jangan diubah: `scripts/check.py` (itu penilainya), `data/` (fixture-nya), dan `Makefile`.\n\nKalau nyangkut, ada `HINTS.md` dengan tiga tingkat petunjuk. Pakai urut, jangan langsung lompat ke yang ketiga. Dan jangan buka branch `solusi` sebelum kamu benar-benar mentok.\n\n## Satu pertanyaan sebelum kamu mulai\n\nSebelum menyentuh satu baris kode, ada satu hal yang perlu kamu putuskan dulu. Laporan itu sebenarnya untuk siapa, sih — mesin yang membaca kode, atau orang yang sedang panik karena pendaftarannya nggak masuk?\n\nPertanyaan itulah yang menentukan semua keputusan teknis setelahnya. Program yang cuma melaporkan masalah pertama yang dia temui sebenarnya baru menjawab sebagian kecil dari yang ditanyakan penggunanya. Sisa pertanyaannya, dan kenapa jawabannya sesederhana mengubah satu kebiasaan, ada di [artikel jawabannya](/p/jawaban-kumpulkan-semua-masalah-dulu-baru-lapor).\n\nKalau script-mu berhenti di baris jelek pertama, apa yang nggak akan pernah kamu lihat?\n",[62],{"authors_id":63},{"name":64,"slug":65,"role":66,"profile_picture":48},"Daffa Izzuddin","izzudd","Writer",{"id":68,"title":39,"slug":40,"articles":69,"parent_series":48},"29",[70,79,88,95,103],{"id":71,"title":72,"slug":73,"excerpt":74,"thumbnail_image":48,"tags":75},"104","Query-nya Tinggal 2, Tapi Response-nya Masih 1 Detik","query-tinggal-2-tapi-response-masih-1-detik","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.",[76,77,78],"database","performance","backend",{"id":80,"title":81,"slug":82,"excerpt":83,"thumbnail_image":48,"tags":84},"114","Saldo Naik Empat Kali untuk Satu Pembayaran","saldo-naik-empat-kali-untuk-satu-pembayaran","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.",[85,86,87,76,40],"idempotency","webhook","postgres",{"id":89,"title":90,"slug":91,"excerpt":92,"thumbnail_image":48,"tags":93},"116","Webhook-nya Telat, Job Rekonsiliasinya Keburu Jalan","webhook-telat-job-rekonsiliasi-keburu-jalan","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.",[85,94,86,87,40],"reconciliation",{"id":96,"title":97,"slug":98,"excerpt":99,"thumbnail_image":48,"tags":100},"120","Tiap Nota di Kafe Ini Isinya Pesanan yang Sama","tiap-nota-isinya-pesanan-yang-sama","Nota tiap meja isinya sama semua, dan totalnya Rp0 — padahal tiap meja cuma pesan satu barang. Coba tebak kenapa.",[55,101,102,40],"scope","mutasi",{"id":49,"title":50,"slug":51,"excerpt":52,"thumbnail_image":48,"tags":104},[55,56,57,40],"\u003Cp>Ada satu momen dalam hidup sebuah script kecil yang selalu berulang: hari pertama dia menerima file yang bukan kamu bikin sendiri. Selama yang menyusun \u003Ccode>.csv\u003C/code>-nya kamu, semuanya mulus. Begitu file datang dari tim lain, telepon mulai berdering.\u003C/p>\n\u003Cp>Script-nya sederhana, kok. Dia membaca file \u003Ccode>.csv\u003C/code> berisi daftar pendaftar dengan tiga kolom — \u003Ccode>nama\u003C/code>, \u003Ccode>email\u003C/code>, \u003Ccode>umur\u003C/code> — lalu menyimpan baris yang valid. Satu file masuk, satu laporan keluar, selesai. Kecuali saat ada satu baris yang isinya jelek.\u003C/p>\n\u003Cp>Di situ yang muncul bukan penjelasan, melainkan laporan setinggi setengah layar. Judulnya \u003Ccode>Traceback (most recent call last):\u003C/code>, disusul daftar path file, nomor baris di \u003Ccode>impor.py\u003C/code>, nama fungsi, dan di baris paling bawah satu kalimat seperti \u003Ccode>ValueError: invalid literal for int() with base 10: &#39;dua puluh&#39;\u003C/code>. Semuanya benar. Nggak ada satu pun yang berguna buat orang yang mengirim file itu.\u003C/p>\n\u003Ch2 id=\"yang-orang-keluhkan\">Yang orang keluhkan\u003C/h2>\n\u003Cp>Di lab ini, \u003Ccode>make demo\u003C/code> memerankan lima file contoh yang semuanya masuk ke script yang sama. Yang keluar dari tiap file belum seragam, dan justru itu masalah pertamanya. Tiga keluhan yang paling sering terdengar:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Sebagian file bikin script mati mendadak.\u003C/strong> Yang dilaporkan cuma baris yang kebetulan tersandung lebih dulu. Baris bermasalah setelahnya nggak pernah disebut, seolah nggak ada.\u003C/li>\n\u003Cli>\u003Cstrong>File lain malah diam total.\u003C/strong> Nggak ada keluhan apa pun, padahal di dalamnya jelas ada baris yang rusak. Script-nya malah mengucapkan terima kasih.\u003C/li>\n\u003Cli>\u003Cstrong>Yang minta tolong mengeluh dengan kalimat yang sama:\u003C/strong> &quot;aku nggak tahu baris berapa yang salah, kolom apa, dan harus ngapain.&quot; \u003Cem>Stack trace\u003C/em>-nya menyebut nama variabel Python — \u003Ccode>baris\u003C/code>, \u003Ccode>umur\u003C/code> — bukan baris di dalam file mereka.\u003C/li>\n\u003C/ul>\n\u003Cp>Kalau kamu pernah menulis validator atau importer kecil, tiga keluhan itu terasa akrab. Yang bikin capek bukan menulis validasinya, tapi menjelaskan hasilnya ke orang lain. Dan itu, ternyata, bagian dari pekerjaannya juga.\u003C/p>\n\u003Ch2 id=\"angka-yang-sudah-diukur\">Angka yang sudah diukur\u003C/h2>\n\u003Cp>Nggak ada tebakan di sini. Semua baris di bawah keluar dari \u003Ccode>make demo\u003C/code> dan \u003Ccode>make check\u003C/code>, dijalankan pada kondisi awal lab, apa adanya:\u003C/p>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>perintah\u003C/th>\n\u003Cth>yang muncul sekarang\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>make impor FILE=data/contoh/beberapa.csv\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>ValueError: invalid literal for int() ... &#39;dua puluh&#39;\u003C/code> — \u003Cstrong>0 dari 4\u003C/strong> masalah dilaporkan\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>make impor FILE=data/contoh/kosong.csv\u003C/code>\u003C/td>\n\u003Ctd>nggak ada keluhan, dan bilang \u003Ccode>3 baris diimpor\u003C/code>, kode keluar \u003Ccode>0\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>make impor FILE=data/contoh/kolom.csv\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>IndexError: list index out of range\u003C/code> — \u003Cstrong>0 dari 2\u003C/strong> masalah dilaporkan\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>make impor FILE=data/contoh/tidak-ada.csv\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>FileNotFoundError\u003C/code>, kode keluar \u003Ccode>1\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>make check\u003C/code>\u003C/td>\n\u003Ctd>\u003Cstrong>1 dari 7\u003C/strong> pemeriksaan hijau (cuma A)\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Cp>Baris pertama itu yang paling menyakitkan. Di \u003Ccode>beberapa.csv\u003C/code> ada \u003Cstrong>empat\u003C/strong> masalah yang menunggu dilaporkan, tapi program berhenti di yang pertama dan melupakan sisanya. Baris ketiga sama polanya: \u003Ccode>kolom.csv\u003C/code> punya \u003Cstrong>dua\u003C/strong> baris dengan jumlah kolom yang meleset, dan dua-duanya nggak pernah kelihatan.\u003C/p>\n\u003Cp>Baris kedua punya bentuk kegagalan yang berbeda, dan menurutku yang paling licin. \u003Ccode>kosong.csv\u003C/code> berisi baris tanpa nama, tapi script-nya santai saja melaporkan \u003Ccode>3 baris diimpor\u003C/code> dengan kode keluar \u003Ccode>0\u003C/code>. Nggak ada yang merah, nggak ada yang kuning; dan kalau kamu nggak memeriksa file sumbernya baris demi baris, kamu nggak akan pernah tahu.\u003C/p>\n\u003Cp>Bandingkan dengan baris terakhir. Di situ \u003Ccode>make check\u003C/code> cuma menyalakan satu lampu hijau dari tujuh. Tujuh pemeriksaan itu tersimpan di \u003Ccode>scripts/check.py\u003C/code>, dan alat itulah yang jadi juri lab ini.\u003C/p>\n\u003Ch2 id=\"batas-lab-ini\">Batas lab ini\u003C/h2>\n\u003Cp>Ada dua hal yang sengaja nggak dibahas di sini, dan keduanya penting biar kamu nggak salah ambil pelajaran.\u003C/p>\n\u003Cp>Pertama, semua error yang diurus lab ini adalah \u003Cstrong>data yang salah\u003C/strong>, bukan \u003Cstrong>program yang salah\u003C/strong>. Kamu sedang memvalidasi masukan yang datang dari luar. Kalau yang salah adalah logika di kodemu sendiri (\u003Cem>bug\u003C/em>), itu cerita yang lain lagi. Kedua, ini program satu kali jalan, bukan layanan yang terus hidup. Di sini &quot;di mana&quot; artinya nomor baris di file; di sebuah layanan web, &quot;di mana&quot; bisa berarti field di body request. Konsepnya sama, tempatnya beda. Ini juga yang bikin kode keluar (\u003Cem>exit code\u003C/em>) penting: script seperti ini sering dipanggil dari \u003Ccode>cron\u003C/code>, \u003Ccode>make\u003C/code>, atau pipa shell, bukan ditemani orang yang menatap layarnya.\u003C/p>\n\u003Cp>Ada juga satu batas yang praktis. Format laporan \u003Ccode>baris N: kolom — pesan\u003C/code> cukup untuk file seukuran ini. Begitu filenya ratusan megabyte, melaporkan semua masalah sekaligus itu sendiri punya ongkos. Untuk sekarang, ukurannya masih sopan.\u003C/p>\n\u003Ch2 id=\"misi-kamu\">Misi kamu\u003C/h2>\n\u003Cp>Lab ini sengaja dibuat level pemula. Buat menjalankannya kamu nggak perlu Docker, nggak perlu database — cukup \u003Ccode>python3\u003C/code> yang sudah terpasang. Yang dilatih di sini bukan kecepatan atau concurrency, tapi satu hal yang kepakai di semua bahasa: \u003Cstrong>membuat program yang salahnya bisa dibaca manusia.\u003C/strong>\u003C/p>\n\u003Cp>Targetmu satu: bikin \u003Ccode>make check\u003C/code> hijau, tujuh dari tujuh. Kamu bebas mengubah isi \u003Ccode>app/\u003C/code> sesukamu. Yang jangan diubah: \u003Ccode>scripts/check.py\u003C/code> (itu penilainya), \u003Ccode>data/\u003C/code> (fixture-nya), dan \u003Ccode>Makefile\u003C/code>.\u003C/p>\n\u003Cp>Kalau nyangkut, ada \u003Ccode>HINTS.md\u003C/code> dengan tiga tingkat petunjuk. Pakai urut, jangan langsung lompat ke yang ketiga. Dan jangan buka branch \u003Ccode>solusi\u003C/code> sebelum kamu benar-benar mentok.\u003C/p>\n\u003Ch2 id=\"satu-pertanyaan-sebelum-kamu-mulai\">Satu pertanyaan sebelum kamu mulai\u003C/h2>\n\u003Cp>Sebelum menyentuh satu baris kode, ada satu hal yang perlu kamu putuskan dulu. Laporan itu sebenarnya untuk siapa, sih — mesin yang membaca kode, atau orang yang sedang panik karena pendaftarannya nggak masuk?\u003C/p>\n\u003Cp>Pertanyaan itulah yang menentukan semua keputusan teknis setelahnya. Program yang cuma melaporkan masalah pertama yang dia temui sebenarnya baru menjawab sebagian kecil dari yang ditanyakan penggunanya. Sisa pertanyaannya, dan kenapa jawabannya sesederhana mengubah satu kebiasaan, ada di \u003Ca href=\"/p/jawaban-kumpulkan-semua-masalah-dulu-baru-lapor\">artikel jawabannya\u003C/a>.\u003C/p>\n\u003Cp>Kalau script-mu berhenti di baris jelek pertama, apa yang nggak akan pernah kamu lihat?\u003C/p>\n","\u003Cul>\n\u003Cli>\u003Cstrong>Satu pesan error yang berguna menjawab tiga hal:\u003C/strong> di mana, apa yang salah, dan harusnya bagaimana.\u003C/li>\n\u003Cli>\u003Cstrong>Script yang berhenti di masalah pertama cuma menjawab sepertiganya.\u003C/strong> Empat masalah di satu file, nol yang dilaporkan.\u003C/li>\n\u003Cli>\u003Cstrong>File yang salah kadang malah diam.\u003C/strong> \u003Ccode>kosong.csv\u003C/code> melaporkan \u003Ccode>3 baris diimpor\u003C/code> dengan kode keluar \u003Ccode>0\u003C/code>, padahal ada baris tanpa nama.\u003C/li>\n\u003Cli>\u003Cstrong>Targetnya \u003Ccode>make check\u003C/code>:\u003C/strong> tujuh pemeriksaan, kondisi awal cuma 1 yang hijau.\u003C/li>\n\u003C/ul>\n",[108,119,129,138,147,156],{"id":109,"title":110,"slug":111,"excerpt":112,"thumbnail_image":48,"tags":113},"111","Rust Masuk Kernel Linux: Revolusi Nyata atau Cuma Euforia RIIR?","rust-di-kernel-linux-revolusi-atau-cuma-hype","Selama lebih dari 30 tahun kernel Linux cuma mau bahasa C, lalu tiba-tiba Rust resmi masuk di Linux 6.1. Itu revolusi beneran atau cuma kebawa euforia meme Rewrite It In Rust? Yuk lihat datanya, bukan cuma opininya.",[114,115,116,117,118],"rust","linux","kernel","system-programming","memory-safety",{"id":120,"title":121,"slug":122,"excerpt":123,"thumbnail_image":48,"tags":124},"118","Belajar Idempotency dari Stok yang Keburu Kebeli","pub-sub-sendiri-lalu-belajar-idempotency","Tugas pertama saya di kerjaan pertama: sistem yang kewalahan menerima webhook. Saya putuskan membangun pub/sub sendiri dari nol, dan pelajaran yang akhirnya datang bukan dari situ — tapi dari stok gudang yang keburu kebeli orang.",[85,125,126,127,128],"event-driven","celery","rabbitmq","post-mortem",{"id":130,"title":131,"slug":132,"excerpt":133,"thumbnail_image":48,"tags":134},"112","Aplikasimu lambat, dan kamu udah kepikiran ganti bahasa. Tunggu dulu","aplikasimu-lambat-dan-kamu-udah-kepikiran-ganti-bahasa-tunggu-dulu","Ada endpoint yang grafiknya spike tiap beberapa menit, dan kepikiran buat pindah dari Go ke Rust? Discord dan Cloudflare beneran melakukannya — tapi cuma setelah kehabisan cara lain dan punya datanya. Yuk, bedah gejala mana yang beneran butuh rewrite, dan mana yang cuma butuh profiling. 🤔",[78,77,135,114,136,137],"golang","system-design","profiling",{"id":139,"title":140,"slug":141,"excerpt":142,"thumbnail_image":48,"tags":143},"113","Garbage Collector dituduh bikin aplikasi lemot. Seberapa adil tuduhan itu?","garbage-collector-dituduh-bikin-aplikasi-lemot","GC sering jadi tersangka utama tiap aplikasi melambat, dan banyak yang percaya dia jalan pakai timer tiap beberapa detik. Dua-duanya nggak sepenuhnya benar. Yuk bedah cara kerja GC dari dalam, plus satu pengecualian yang bikin Discord kesakitan tiap 2 menit. 🤔",[78,77,135,144,145,146],"jvm","garbage-collector","memory",{"id":148,"title":149,"slug":150,"excerpt":151,"thumbnail_image":48,"tags":152},"119","Aturan Sintaks: Satu Titik Koma Bikin Program Nggak Jalan","aturan-sintaks-pemrograman","Baru nulis beberapa baris, programnya udah nolak jalan? Seringnya bukan logikanya yang salah, cuma satu karakter yang kurang atau salah tempat.",[153,154,155,55],"syntax","dasar","konsep",{"id":96,"title":97,"slug":98,"excerpt":99,"thumbnail_image":48,"tags":157},[55,101,102,40],[159,163,166,169,172],{"text":160,"depth":161,"id":162},"Yang orang keluhkan",2,"yang-orang-keluhkan",{"text":164,"depth":161,"id":165},"Angka yang sudah diukur","angka-yang-sudah-diukur",{"text":167,"depth":161,"id":168},"Batas lab ini","batas-lab-ini",{"text":170,"depth":161,"id":171},"Misi kamu","misi-kamu",{"text":173,"depth":161,"id":174},"Satu pertanyaan sebelum kamu mulai","satu-pertanyaan-sebelum-kamu-mulai",1791759826814]