[{"data":1,"prerenderedAt":292},["ShallowReactive",2],{"tag-labels":3,"site-header":4,"article-struktur-kontrol-perulangan-id":72},{},{"featuredPost":5,"navigations":29},{"id":6,"title":7,"title_en":8,"slug":9,"excerpt":10,"excerpt_en":11,"has_translation":12,"published_at":13,"reading_time":14,"hidden_from_listing":15,"tags":16,"thumbnail_image":21,"og_image":22,"series":23,"authors":28},110,"Ketika Pilih Framework Cuma Biar Kelihatan Beda","When You Pick a Framework Just to Look Different","ketika-pilih-framework-cuma-biar-kelihatan-beda","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.","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.",true,"2026-10-06T15:25:21.000Z",5,false,[17,18,19,20],"karier","framework","opini","pengalaman",null,"\u002Fog\u002Fketika-pilih-framework-cuma-biar-kelihatan-beda.png",{"id":24,"title":25,"title_en":26,"slug":27},9,"Artikel","Articles","all",[],[30,46,67],{"collection":31,"item":32},"series",{"__typename":31,"title":25,"title_en":26,"slug":27,"children_series":33},[34,38,42],{"title":35,"title_en":36,"slug":37},"Kecerdasan Artifisial","Artificial Intelligence","kecerdasan-artifisial",{"title":39,"title_en":40,"slug":41},"Konsep Dasar Pemrograman","Programming Fundamentals","konsep-dasar-pemrograman",{"title":43,"title_en":44,"slug":45},"Algoritma dan Struktur Data","Algorithms and Data Structures","algoritma-struktur-data",{"collection":31,"item":47},{"__typename":31,"title":48,"title_en":48,"slug":49,"children_series":50},"Tutorial","tutorial",[51,55,59,63],{"title":52,"title_en":53,"slug":54},"Belajar Python","Learning Python","belajar-python",{"title":56,"title_en":57,"slug":58},"Belajar Golang","Learning Go","belajar-golang",{"title":60,"title_en":61,"slug":62},"Belajar Java","Learning Java","belajar-java",{"title":64,"title_en":65,"slug":66},"Belajar Pascal","Learning Pascal","belajar-pascal",{"collection":31,"item":68},{"__typename":31,"title":69,"title_en":69,"slug":70,"children_series":71},"Lab","lab",[],{"article":73,"renderedBody":180,"renderedTakeaway":181,"latestArticles":182,"toc":279},{"id":24,"title":74,"title_en":75,"slug":76,"excerpt":77,"excerpt_en":78,"has_translation":12,"published_at":79,"reading_time":80,"hidden_from_listing":15,"tags":81,"thumbnail_image":21,"og_image":85,"series":86,"authors":174,"body_locale":175,"available_locales":176,"body":178,"takeway":179,"prerequisite":21},"Struktur Kontrol Perulangan (For, While, Do-While), Kapan Harus Dipakai?","Loop Control Structures: When to Use For, While, and Do-While","struktur-kontrol-perulangan","Pernah ngerasa capek nulis baris kode yang sama berulang kali? Gimana caranya nyuruh komputer buat ngerjain itu secara otomatis?","Tired of writing the same lines of code over and over? Here is how you make the computer repeat the work for you, and which loop to pick.","2026-06-14T17:23:03.479Z",2,[82,83,84],"basic","intro","looping","\u002Fog\u002Fstruktur-kontrol-perulangan.png",{"id":87,"title":39,"title_en":40,"slug":41,"description":88,"description_en":89,"articles":90,"children_series":167,"parent_series":168},12,"Mengenal konsep dasar pemrograman. Pada seri ini kita akan membahas tentang bagaimana cara berkutat dengan variabel, mengatur alur program dengan struktur kontrol, me-reuse kode dengan fungsi, dan aturan sintaks pada bahasa pemrograman. Konsep-konsep ini pastinya akan sangat berguna ketika kita mulai mengkoding ceria.","The concepts every language shares: variables, control flow, functions, and syntax. Learn them once and the next language is mostly vocabulary.",[91,102,115,128,131,145],{"id":92,"title":39,"title_en":93,"slug":41,"excerpt":94,"excerpt_en":95,"has_translation":12,"published_at":96,"reading_time":97,"hidden_from_listing":15,"tags":98,"thumbnail_image":21,"og_image":99,"series":100,"authors":101},6,"Programming Fundamentals: Four Concepts Behind Every Program","Inti dari pemrograman adalah memberi instruksi alias menyuruh komputer untuk melakukan sesuatu yang kita inginkan.","The core of programming is giving instructions: telling the computer to do what you want it to do, in a language that has rules of its own.","2026-06-14T16:51:40.694Z",7,[83,82],"\u002Fog\u002Fkonsep-dasar-pemrograman.png",{"id":87,"title":39,"title_en":40,"slug":41},[],{"id":97,"title":103,"title_en":104,"slug":105,"excerpt":106,"excerpt_en":107,"has_translation":12,"published_at":108,"reading_time":14,"hidden_from_listing":15,"tags":109,"thumbnail_image":21,"og_image":112,"series":113,"authors":114},"Konsep Variabel dan Tipe Data pada Pemrograman","Variables and Data Types in Programming","variable-dan-tipe-data","Variabel itu ibarat “tokoh utama” di sebuah program. Nggak peduli bahasa pemrograman apapun, pasti semua punya konsep variabel.","A variable is the main character of a program, and every language has one. The type is what decides which data fits inside.","2026-06-14T16:51:40.710Z",[82,83,110,111],"variable","types","\u002Fog\u002Fvariable-dan-tipe-data.png",{"id":87,"title":39,"title_en":40,"slug":41},[],{"id":116,"title":117,"title_en":118,"slug":119,"excerpt":120,"excerpt_en":121,"has_translation":12,"published_at":122,"reading_time":80,"hidden_from_listing":15,"tags":123,"thumbnail_image":21,"og_image":125,"series":126,"authors":127},8,"Struktur Kontrol Kondisi (If-Else dan Switch-Case), Apa Bedanya?","If-Else vs Switch-Case: What's the Real Difference?","struktur-kontrol-kondisi","Sering bingung kapan harus pakai if-else dan kapan switch-case? Kenapa switch-case kadang bisa lebih ngebut? Yuk, bongkar rahasianya di sini!","Not sure when to reach for if-else and when switch-case earns its place? Here is why switch-case sometimes runs faster.","2026-06-14T17:23:03.446Z",[82,83,124],"conditions","\u002Fog\u002Fstruktur-kontrol-kondisi.png",{"id":87,"title":39,"title_en":40,"slug":41},[],{"id":24,"title":74,"title_en":75,"slug":76,"excerpt":77,"excerpt_en":78,"has_translation":12,"published_at":79,"reading_time":80,"hidden_from_listing":15,"tags":81,"thumbnail_image":21,"og_image":85,"series":129,"authors":130},{"id":87,"title":39,"title_en":40,"slug":41},[],{"id":132,"title":133,"title_en":134,"slug":135,"excerpt":136,"excerpt_en":137,"has_translation":12,"published_at":138,"reading_time":139,"hidden_from_listing":15,"tags":140,"thumbnail_image":21,"og_image":142,"series":143,"authors":144},10,"Fungsi dan Prosedur dalam Pemrograman, Apa Bedanya?","Functions vs Procedures: What's the Difference?","fungsi-dan-prosedur","Pernah bingung kapan harus pakai fungsi dan kapan pakai prosedur pas lagi ngoding? Yuk, bongkar rahasia dan bedanya di sini biar kode kamu makin rapi!","Ever wondered when to reach for a function and when a procedure does the job while coding? Here is the split that keeps your code tidy.","2026-06-14T17:23:03.636Z",3,[82,83,141],"functions","\u002Fog\u002Ffungsi-dan-prosedur.png",{"id":87,"title":39,"title_en":40,"slug":41},[],{"id":146,"title":147,"title_en":148,"slug":149,"excerpt":150,"excerpt_en":151,"has_translation":12,"published_at":152,"reading_time":14,"hidden_from_listing":15,"tags":153,"thumbnail_image":21,"og_image":158,"series":159,"authors":160},119,"Aturan Sintaks: Satu Titik Koma Bikin Program Nggak Jalan","Syntax Rules: One Missing Semicolon Stops the Program","aturan-sintaks-pemrograman","Baru nulis beberapa baris, programnya udah nolak jalan? Seringnya bukan logikanya yang salah, cuma satu karakter yang kurang atau salah tempat.","You wrote a few lines and the program already refuses to run? Most of the time the logic is fine, and one character is missing or in the wrong place.","2026-10-11T23:00:15.000Z",[154,155,156,157],"syntax","dasar","konsep","python","\u002Fog\u002Faturan-sintaks-pemrograman.png",{"id":87,"title":39,"title_en":40,"slug":41},[161],{"authors_id":162},{"id":163,"name":164,"slug":165,"role":166,"profile_picture":21},1,"Daffa Izzuddin","izzudd","Writer",[],{"id":24,"title":25,"title_en":26,"slug":27,"parent_series":21,"children_series":169},[170,171,172],{"id":116,"title":35,"title_en":36,"slug":37,"cover_image":21},{"id":87,"title":39,"title_en":40,"slug":41,"cover_image":21},{"id":173,"title":43,"title_en":44,"slug":45,"cover_image":21},15,[],"id",[177,175],"en","Pernah *nggak* nulis baris kode yang sama berulang-ulang? Rasanya pasti capek dan bikin kode kelihatan berantakan.\n\nNah, di sinilah struktur kontrol perulangan atau *looping* menyelamatkan hidup programmer. Fitur ini bikin kita bisa mengeksekusi satu blok kode berkali-kali secara otomatis. Kita tinggal tentuin aja syarat dan batasannya.\n\nAda tiga jenis *looping* dasar yang wajib dipahami. Kita bahas satu per satu, yuk!\n\n### 1. Perulangan For\n\nPerulangan `for` ini masuk kategori *counted loop*. Artinya, perulangan ini pas banget dipakai kalau kamu udah tahu pasti jumlah iterasinya sejak awal.\n\nStrukturnya juga rapi karena tiga elemen utamanya ditulis dalam satu baris. Ada inisialisasi (nilai awal), kondisi (batasan perulangan), dan *increment* atau *decrement* (perubahan nilai).\n\nDi Python, `for` biasanya dipakai buat jalanin isi sebuah deretan nilai:\n\n```python\nfor i in range(1, 6):\n    print(i)\n```\n\nKode itu nyetak angka 1 sampai 5, satu angka per baris. Bahasa yang lebih tua nulis ketiga elemennya secara eksplisit, misalnya di C:\n\n```c\nfor (int i = 1; i \u003C= 5; i++) {\n    printf(\"%d\\n\", i);\n}\n```\n\nHasilnya sama persis. Bedanya cuma di mana kamu naro inisialisasi, kondisi, dan perubahannya.\n\nTapi ingat, kalau sejak awal kondisinya udah *false*, blok kode di dalamnya *nggak* bakal tereksekusi sama sekali alias nol kali jalan.\n\n### 2. Perulangan While\n\nBeda cerita dengan `while`. Perulangan ini diklasifikasikan sebagai *uncounted loop*. \n\nKamu bisa pakai `while` kalau jumlah iterasinya belum jelas dan sangat bergantung pada kondisi tertentu yang dinamis. Karakteristik utamanya tuh pengecekan kondisi dilakukan di awal sebelum blok kodenya berjalan.\n\nBiar kelihatan bedanya, contohnya dibikin konkret aja. Misalnya ada saldo 3 yang ditarik satu-satu sampai habis:\n\n```python\nsaldo = 3\nwhile saldo > 0:\n    print(\"tarik saldo, sisa\", saldo - 1)\n    saldo = saldo - 1\n```\n\nKeluarnya tiga baris: sisa 2, sisa 1, sisa 0 — lalu berhenti sendiri karena `saldo` sudah nggak lebih besar dari 0. Perulangan ini kepakai justru waktu kamu *nggak* tahu di depan berapa kali dia bakal berputar.\n\nSama seperti `for`, kalau di awal pengecekan kondisinya udah *false*, perulangannya bakal langsung berhenti. Eksekusinya juga nol kali.\n\n### 3. Perulangan Do-While\n\nPerulangan `do-while` sebenarnya mirip banget sama `while` dan sama-sama *uncounted loop*. Bedanya ada di letak pengecekan kondisi.\n\nKalau di `do-while`, pengecekan kondisi dilakukan di akhir perulangan. Struktur ini memastikan kodenya dieksekusi minimal satu kali. \n\nNantinya, setelah jalan sekali, baru deh dicek. Kalau *true*, lanjut berulang. Kalau *false*, perulangannya berhenti.\n\nPerbedaan itu kelihatan paling jelas waktu kondisinya sudah *false* dari awal. Coba bandingin dua potongan C berikut, dijalankan dengan `saldo` bernilai 0:\n\n```c\nint saldo = 0;\n\nwhile (saldo > 0) {\n    printf(\"tarik saldo\\n\");\n    saldo--;\n}\n\ndo {\n    printf(\"tarik saldo\\n\");\n    saldo--;\n} while (saldo > 0);\n```\n\nVersi `while` nggak nyetak apa pun, versi `do-while` nyetak satu baris. Itu satu-satunya alasan `do-while` ada.\n\nSatu catatan: Python nggak punya `do-while`. Kalau butuh perilaku yang sama, biasanya ditulis `while True:` lalu keluar pakai `break` di dalamnya. Bahasa lain punya namanya sendiri — Pascal menyebutnya `repeat ... until`, dan pengecekannya juga di akhir.\n\n### Kesimpulan: Bedanya Apa Sih?\n\nBiar makin gampang ingat, ini perbedaan mendasar ketiganya:\n\n- **Jumlah iterasi**: Pakai `for` kalau udah pasti jumlahnya. Pakai `while` atau `do-while` kalau masih *nggak* menentu.\n- **Pengecekan kondisi**: `for` dan `while` ngecek kondisi di awal, sedangkan `do-while` ngeceknya di akhir.\n- **Eksekusi minimal**: `for` dan `while` bisa aja *nggak* tereksekusi sama sekali. Kalau `do-while`, dijamin pasti jalan minimal satu kali.\n\nPilih yang mana? Sesuaikan aja sama kebutuhan logikanya buat program kamu!\n","- Looping bikin kode lebih rapi karena mengeksekusi blok kode berulang secara otomatis.\n- Gunakan 'for' kalau kamu udah tahu pasti jumlah iterasinya.\n- Pilih 'while' atau 'do-while' untuk jumlah iterasi yang belum pasti.\n- Berbeda dengan 'while', 'do-while' memastikan kode dieksekusi minimal satu kali.","\u003Cp>Pernah \u003Cem>nggak\u003C\u002Fem> nulis baris kode yang sama berulang-ulang? Rasanya pasti capek dan bikin kode kelihatan berantakan.\u003C\u002Fp>\n\u003Cp>Nah, di sinilah struktur kontrol perulangan atau \u003Cem>looping\u003C\u002Fem> menyelamatkan hidup programmer. Fitur ini bikin kita bisa mengeksekusi satu blok kode berkali-kali secara otomatis. Kita tinggal tentuin aja syarat dan batasannya.\u003C\u002Fp>\n\u003Cp>Ada tiga jenis \u003Cem>looping\u003C\u002Fem> dasar yang wajib dipahami. Kita bahas satu per satu, yuk!\u003C\u002Fp>\n\u003Ch3 id=\"1-perulangan-for\">1. Perulangan For\u003C\u002Fh3>\n\u003Cp>Perulangan \u003Ccode>for\u003C\u002Fcode> ini masuk kategori \u003Cem>counted loop\u003C\u002Fem>. Artinya, perulangan ini pas banget dipakai kalau kamu udah tahu pasti jumlah iterasinya sejak awal.\u003C\u002Fp>\n\u003Cp>Strukturnya juga rapi karena tiga elemen utamanya ditulis dalam satu baris. Ada inisialisasi (nilai awal), kondisi (batasan perulangan), dan \u003Cem>increment\u003C\u002Fem> atau \u003Cem>decrement\u003C\u002Fem> (perubahan nilai).\u003C\u002Fp>\n\u003Cp>Di Python, \u003Ccode>for\u003C\u002Fcode> biasanya dipakai buat jalanin isi sebuah deretan nilai:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"for%20i%20in%20range(1%2C%206)%3A%0A%20%20%20%20print(i)\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">for\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> i \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">in\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> range\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">1\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">6\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">):\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    print\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(i)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Kode itu nyetak angka 1 sampai 5, satu angka per baris. Bahasa yang lebih tua nulis ketiga elemennya secara eksplisit, misalnya di C:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">C\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"for%20(int%20i%20%3D%201%3B%20i%20%3C%3D%205%3B%20i%2B%2B)%20%7B%0A%20%20%20%20printf(%22%25d%5Cn%22%2C%20i)%3B%0A%7D\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>for (int i = 1; i &lt;= 5; i++) {\n    printf(\"%d\\n\", i);\n}\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Hasilnya sama persis. Bedanya cuma di mana kamu naro inisialisasi, kondisi, dan perubahannya.\u003C\u002Fp>\n\u003Cp>Tapi ingat, kalau sejak awal kondisinya udah \u003Cem>false\u003C\u002Fem>, blok kode di dalamnya \u003Cem>nggak\u003C\u002Fem> bakal tereksekusi sama sekali alias nol kali jalan.\u003C\u002Fp>\n\u003Ch3 id=\"2-perulangan-while\">2. Perulangan While\u003C\u002Fh3>\n\u003Cp>Beda cerita dengan \u003Ccode>while\u003C\u002Fcode>. Perulangan ini diklasifikasikan sebagai \u003Cem>uncounted loop\u003C\u002Fem>. \u003C\u002Fp>\n\u003Cp>Kamu bisa pakai \u003Ccode>while\u003C\u002Fcode> kalau jumlah iterasinya belum jelas dan sangat bergantung pada kondisi tertentu yang dinamis. Karakteristik utamanya tuh pengecekan kondisi dilakukan di awal sebelum blok kodenya berjalan.\u003C\u002Fp>\n\u003Cp>Biar kelihatan bedanya, contohnya dibikin konkret aja. Misalnya ada saldo 3 yang ditarik satu-satu sampai habis:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"saldo%20%3D%203%0Awhile%20saldo%20%3E%200%3A%0A%20%20%20%20print(%22tarik%20saldo%2C%20sisa%22%2C%20saldo%20-%201)%0A%20%20%20%20saldo%20%3D%20saldo%20-%201\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">saldo \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 3\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">while\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> saldo \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">>\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    print\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"tarik saldo, sisa\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, saldo \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    saldo \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> saldo \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Keluarnya tiga baris: sisa 2, sisa 1, sisa 0 — lalu berhenti sendiri karena \u003Ccode>saldo\u003C\u002Fcode> sudah nggak lebih besar dari 0. Perulangan ini kepakai justru waktu kamu \u003Cem>nggak\u003C\u002Fem> tahu di depan berapa kali dia bakal berputar.\u003C\u002Fp>\n\u003Cp>Sama seperti \u003Ccode>for\u003C\u002Fcode>, kalau di awal pengecekan kondisinya udah \u003Cem>false\u003C\u002Fem>, perulangannya bakal langsung berhenti. Eksekusinya juga nol kali.\u003C\u002Fp>\n\u003Ch3 id=\"3-perulangan-do-while\">3. Perulangan Do-While\u003C\u002Fh3>\n\u003Cp>Perulangan \u003Ccode>do-while\u003C\u002Fcode> sebenarnya mirip banget sama \u003Ccode>while\u003C\u002Fcode> dan sama-sama \u003Cem>uncounted loop\u003C\u002Fem>. Bedanya ada di letak pengecekan kondisi.\u003C\u002Fp>\n\u003Cp>Kalau di \u003Ccode>do-while\u003C\u002Fcode>, pengecekan kondisi dilakukan di akhir perulangan. Struktur ini memastikan kodenya dieksekusi minimal satu kali. \u003C\u002Fp>\n\u003Cp>Nantinya, setelah jalan sekali, baru deh dicek. Kalau \u003Cem>true\u003C\u002Fem>, lanjut berulang. Kalau \u003Cem>false\u003C\u002Fem>, perulangannya berhenti.\u003C\u002Fp>\n\u003Cp>Perbedaan itu kelihatan paling jelas waktu kondisinya sudah \u003Cem>false\u003C\u002Fem> dari awal. Coba bandingin dua potongan C berikut, dijalankan dengan \u003Ccode>saldo\u003C\u002Fcode> bernilai 0:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">C\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"int%20saldo%20%3D%200%3B%0A%0Awhile%20(saldo%20%3E%200)%20%7B%0A%20%20%20%20printf(%22tarik%20saldo%5Cn%22)%3B%0A%20%20%20%20saldo--%3B%0A%7D%0A%0Ado%20%7B%0A%20%20%20%20printf(%22tarik%20saldo%5Cn%22)%3B%0A%20%20%20%20saldo--%3B%0A%7D%20while%20(saldo%20%3E%200)%3B\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>int saldo = 0;\n\nwhile (saldo &gt; 0) {\n    printf(\"tarik saldo\\n\");\n    saldo--;\n}\n\ndo {\n    printf(\"tarik saldo\\n\");\n    saldo--;\n} while (saldo &gt; 0);\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Versi \u003Ccode>while\u003C\u002Fcode> nggak nyetak apa pun, versi \u003Ccode>do-while\u003C\u002Fcode> nyetak satu baris. Itu satu-satunya alasan \u003Ccode>do-while\u003C\u002Fcode> ada.\u003C\u002Fp>\n\u003Cp>Satu catatan: Python nggak punya \u003Ccode>do-while\u003C\u002Fcode>. Kalau butuh perilaku yang sama, biasanya ditulis \u003Ccode>while True:\u003C\u002Fcode> lalu keluar pakai \u003Ccode>break\u003C\u002Fcode> di dalamnya. Bahasa lain punya namanya sendiri — Pascal menyebutnya \u003Ccode>repeat ... until\u003C\u002Fcode>, dan pengecekannya juga di akhir.\u003C\u002Fp>\n\u003Ch3 id=\"kesimpulan-bedanya-apa-sih\">Kesimpulan: Bedanya Apa Sih?\u003C\u002Fh3>\n\u003Cp>Biar makin gampang ingat, ini perbedaan mendasar ketiganya:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Jumlah iterasi\u003C\u002Fstrong>: Pakai \u003Ccode>for\u003C\u002Fcode> kalau udah pasti jumlahnya. Pakai \u003Ccode>while\u003C\u002Fcode> atau \u003Ccode>do-while\u003C\u002Fcode> kalau masih \u003Cem>nggak\u003C\u002Fem> menentu.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Pengecekan kondisi\u003C\u002Fstrong>: \u003Ccode>for\u003C\u002Fcode> dan \u003Ccode>while\u003C\u002Fcode> ngecek kondisi di awal, sedangkan \u003Ccode>do-while\u003C\u002Fcode> ngeceknya di akhir.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Eksekusi minimal\u003C\u002Fstrong>: \u003Ccode>for\u003C\u002Fcode> dan \u003Ccode>while\u003C\u002Fcode> bisa aja \u003Cem>nggak\u003C\u002Fem> tereksekusi sama sekali. Kalau \u003Ccode>do-while\u003C\u002Fcode>, dijamin pasti jalan minimal satu kali.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Pilih yang mana? Sesuaikan aja sama kebutuhan logikanya buat program kamu!\u003C\u002Fp>\n","\u003Cul>\n\u003Cli>Looping bikin kode lebih rapi karena mengeksekusi blok kode berulang secara otomatis.\u003C\u002Fli>\n\u003Cli>Gunakan &#39;for&#39; kalau kamu udah tahu pasti jumlah iterasinya.\u003C\u002Fli>\n\u003Cli>Pilih &#39;while&#39; atau &#39;do-while&#39; untuk jumlah iterasi yang belum pasti.\u003C\u002Fli>\n\u003Cli>Berbeda dengan &#39;while&#39;, &#39;do-while&#39; memastikan kode dieksekusi minimal satu kali.\u003C\u002Fli>\n\u003C\u002Ful>\n",[183,200,213,226,239,259],{"id":184,"title":185,"title_en":21,"slug":186,"excerpt":187,"excerpt_en":21,"has_translation":15,"published_at":188,"reading_time":92,"hidden_from_listing":15,"tags":189,"thumbnail_image":21,"og_image":191,"series":192,"authors":197},133,"Python Strings: the Badge That Only Worked for One Name","python-strings","The badge script printed the right name for the person who wrote it and the wrong name for everybody else. Slicing counts characters, and a name is words.","2026-10-28T13:00:00.000Z",[157,190],"string","\u002Fog\u002Fpython-strings.png",{"id":193,"title":194,"title_en":195,"slug":196},30,"Koleksi dan String","Collections and Strings","python-collections",[198],{"authors_id":199},{"id":163,"name":164,"slug":165,"role":166,"profile_picture":21},{"id":201,"title":202,"title_en":21,"slug":203,"excerpt":204,"excerpt_en":21,"has_translation":15,"published_at":205,"reading_time":92,"hidden_from_listing":15,"tags":206,"thumbnail_image":21,"og_image":208,"series":209,"authors":210},132,"Python Tuples: Why All Three Points Are the Same Point","python-tuples","Three points walk into a loop and come out identical. The list was never copied three times; the name was. A tuple makes that bug impossible.","2026-10-28T12:00:00.000Z",[157,207],"tuple","\u002Fog\u002Fpython-tuples.png",{"id":193,"title":194,"title_en":195,"slug":196},[211],{"authors_id":212},{"id":163,"name":164,"slug":165,"role":166,"profile_picture":21},{"id":214,"title":215,"title_en":21,"slug":216,"excerpt":217,"excerpt_en":21,"has_translation":15,"published_at":218,"reading_time":92,"hidden_from_listing":15,"tags":219,"thumbnail_image":21,"og_image":221,"series":222,"authors":223},131,"Python Sets: the Duplicate That Keeps Coming Back","python-sets","A de-duplication loop that works on clean data leaves four tags where there should be two. The bug is case, and the fix is a `set`.","2026-10-28T11:00:00.000Z",[157,220],"set","\u002Fog\u002Fpython-sets.png",{"id":193,"title":194,"title_en":195,"slug":196},[224],{"authors_id":225},{"id":163,"name":164,"slug":165,"role":166,"profile_picture":21},{"id":227,"title":228,"title_en":21,"slug":229,"excerpt":230,"excerpt_en":21,"has_translation":15,"published_at":231,"reading_time":92,"hidden_from_listing":15,"tags":232,"thumbnail_image":21,"og_image":234,"series":235,"authors":236},130,"Python Dictionaries: the Key That Isn't There","python-dictionary","A word counter dies the first time it meets a word twice. The fix is one line; what takes longer is knowing which of a dict's three lookups to reach for.","2026-10-28T10:00:00.000Z",[157,233],"dictionary","\u002Fog\u002Fpython-dictionary.png",{"id":193,"title":194,"title_en":195,"slug":196},[237],{"authors_id":238},{"id":163,"name":164,"slug":165,"role":166,"profile_picture":21},{"id":240,"title":241,"title_en":242,"slug":243,"excerpt":244,"excerpt_en":245,"has_translation":12,"published_at":246,"reading_time":14,"hidden_from_listing":15,"tags":247,"thumbnail_image":21,"og_image":254,"series":255,"authors":256},129,"Biar RAG nggak kena 504: pisahin jalur query dan ingestion","So Your RAG Stops Hitting 504: Split the Query Path From Ingestion","rag-pisah-jalur-query-dan-ingestion","Satu service RAG yang merangkap parsing dan menjawab kueri bakal tumbang pas ada yang upload PDF 200 halaman. Obatnya dua jalur dan satu queue.","One RAG service that both parses uploads and answers queries will fall over the moment someone uploads a 200-page PDF. The cure is two paths and one queue.","2026-10-22T01:30:00.000Z",[248,249,250,251,252,253],"rag","cloud-run","cloud-tasks","gcp","serverless","arsitektur","\u002Fog\u002Frag-pisah-jalur-query-dan-ingestion.png",{"id":116,"title":35,"title_en":36,"slug":37},[257],{"authors_id":258},{"id":163,"name":164,"slug":165,"role":166,"profile_picture":21},{"id":260,"title":261,"title_en":262,"slug":263,"excerpt":264,"excerpt_en":265,"has_translation":12,"published_at":266,"reading_time":92,"hidden_from_listing":15,"tags":267,"thumbnail_image":21,"og_image":274,"series":275,"authors":276},128,"Linear atau graf: cara mengatur banyak agent tanpa loop abadi","Linear or Graph: How to Run Many Agents Without an Eternal Loop","multi-agen-linear-atau-grafik","Satu agent dengan dua puluh tool gampang kacau. Begitu beberapa agent saling revisi, kamu butuh graf yang mendukung cycle dan angka yang membuatnya berhenti.","One agent with twenty tools gets messy fast. Once several agents revise each other, you need a graph that allows cycles and a number that makes it stop.","2026-10-21T16:05:00.000Z",[268,269,270,271,272,273],"multi-agent","langgraph","autogen","orkestrasi","checkpoint","llm","\u002Fog\u002Fmulti-agen-linear-atau-grafik.png",{"id":116,"title":35,"title_en":36,"slug":37},[277],{"authors_id":278},{"id":163,"name":164,"slug":165,"role":166,"profile_picture":21},[280,283,286,289],{"text":281,"depth":139,"id":282},"1. Perulangan For","1-perulangan-for",{"text":284,"depth":139,"id":285},"2. Perulangan While","2-perulangan-while",{"text":287,"depth":139,"id":288},"3. Perulangan Do-While","3-perulangan-do-while",{"text":290,"depth":139,"id":291},"Kesimpulan: Bedanya Apa Sih?","kesimpulan-bedanya-apa-sih",1793295835323]