[{"data":1,"prerenderedAt":295},["ShallowReactive",2],{"tag-labels":3,"site-header":4,"article-fungsi-dan-prosedur-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":74,"title":75,"title_en":76,"slug":77,"excerpt":78,"excerpt_en":79,"has_translation":12,"published_at":80,"reading_time":81,"hidden_from_listing":15,"tags":82,"thumbnail_image":21,"og_image":86,"series":87,"authors":174,"body_locale":175,"available_locales":176,"body":178,"takeway":179,"prerequisite":21},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,[83,84,85],"basic","intro","functions","\u002Fog\u002Ffungsi-dan-prosedur.png",{"id":88,"title":39,"title_en":40,"slug":41,"description":89,"description_en":90,"articles":91,"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.",[92,103,116,130,142,145],{"id":93,"title":39,"title_en":94,"slug":41,"excerpt":95,"excerpt_en":96,"has_translation":12,"published_at":97,"reading_time":98,"hidden_from_listing":15,"tags":99,"thumbnail_image":21,"og_image":100,"series":101,"authors":102},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,[84,83],"\u002Fog\u002Fkonsep-dasar-pemrograman.png",{"id":88,"title":39,"title_en":40,"slug":41},[],{"id":98,"title":104,"title_en":105,"slug":106,"excerpt":107,"excerpt_en":108,"has_translation":12,"published_at":109,"reading_time":14,"hidden_from_listing":15,"tags":110,"thumbnail_image":21,"og_image":113,"series":114,"authors":115},"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",[83,84,111,112],"variable","types","\u002Fog\u002Fvariable-dan-tipe-data.png",{"id":88,"title":39,"title_en":40,"slug":41},[],{"id":117,"title":118,"title_en":119,"slug":120,"excerpt":121,"excerpt_en":122,"has_translation":12,"published_at":123,"reading_time":124,"hidden_from_listing":15,"tags":125,"thumbnail_image":21,"og_image":127,"series":128,"authors":129},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",2,[83,84,126],"conditions","\u002Fog\u002Fstruktur-kontrol-kondisi.png",{"id":88,"title":39,"title_en":40,"slug":41},[],{"id":24,"title":131,"title_en":132,"slug":133,"excerpt":134,"excerpt_en":135,"has_translation":12,"published_at":136,"reading_time":124,"hidden_from_listing":15,"tags":137,"thumbnail_image":21,"og_image":139,"series":140,"authors":141},"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",[83,84,138],"looping","\u002Fog\u002Fstruktur-kontrol-perulangan.png",{"id":88,"title":39,"title_en":40,"slug":41},[],{"id":74,"title":75,"title_en":76,"slug":77,"excerpt":78,"excerpt_en":79,"has_translation":12,"published_at":80,"reading_time":81,"hidden_from_listing":15,"tags":82,"thumbnail_image":21,"og_image":86,"series":143,"authors":144},{"id":88,"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":88,"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":117,"title":35,"title_en":36,"slug":37,"cover_image":21},{"id":88,"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* kalian bikin kode program yang isinya panjang banget sampai ratusan atau ribuan baris? Pasti pusing sendiri pas harus nyari *bug* atau mau nambahin fitur baru.\n\nNah, biar kode kita lebih rapi dan gampang dikelola, kita butuh yang namanya modularisasi. Caranya adalah dengan memecah program besar menjadi potongan-potongan kecil yang disebut sub-program. Di dunia *programming*, sub-program ini biasa kita kenal dengan istilah Fungsi (*function*) dan Prosedur (*procedure*).\n\nKedua konsep ini sering banget dipakai buat ngelompokkin baris kode yang punya tugas spesifik. Yuk, kita bahas apa bedanya dan kenapa kalian wajib banget pakai dua hal ini! 🚀\n\n## Kenapa Harus Pakai Fungsi dan Prosedur?\n\nAda banyak banget keuntungan yang bisa kalian dapet. Pertama, jelas bikin *debugging* jauh lebih gampang. Kalau ada *error* di fitur tertentu, kalian cuma perlu ngecek blok kode fungsi atau prosedur yang berkaitan, *nggak* perlu ngubek-ubek seluruh program.\n\nKedua, ada *reusability*. Maksudnya, kode yang udah kalian tulis bisa dipanggil berulang kali di berbagai bagian program. Ini bikin kalian terhindar dari nulis kode yang sama persis berkali-kali (konsep *Don't Repeat Yourself* atau DRY).\n\nKetiga, kode kalian bakal kelihatan jauh lebih profesional dan punya *readability* yang tinggi. Orang lain atau bahkan kalian di masa depan bakal lebih gampang paham alur programnya.\n\n## Mengenal Prosedur\n\nProsedur itu intinya adalah sekumpulan instruksi buat ngelakuin aksi tertentu. Karakteristik paling utamanya adalah dia **tidak mengembalikan nilai** (*no return value*) ke program utama.\n\nJadi prosedur tuh cuma dikasih tugas, dikerjain sampai selesai, terus udah. *Nggak* ada hasil perhitungan yang disetor balik ke pemanggilnya. Biasanya di bahasa pemrograman modern kayak C atau C++, prosedur ini sering ditulis pakai *keyword* `void`.\n\nContohnya kayak gini di C:\n\n```c\nvoid cetak_struk(int total) {\n    printf(\"Total: %d\\n\", total);\n}\n```\n\nPerhatiin nggak ada `return` di dalamnya. Prosedur itu dikasih data, ngerjain sesuatu, terus selesai — hasil kerjanya nggak dikirim balik ke yang manggil.\n\n## Mengenal Fungsi\n\nKalau fungsi, sifatnya agak beda sedikit. Fungsi adalah blok kode yang bertugas memproses data dan di akhir prosesnya dia **mengembalikan sebuah nilai** (*return value*).\n\nNilai hasil perhitungan dari fungsi ini nantinya bakal dilempar balik ke program utamanya. Hasil kembalian ini biasanya ditampung dulu ke dalam sebuah variabel buat dipakai ke proses selanjutnya.\n\nDalam satu program, keduanya bisa dipakai bareng:\n\n```python\ndef total(belanja):\n    return sum(belanja)\n\ndef cetak_struk(total_bayar):\n    print(\"Total:\", total_bayar)\n\ncetak_struk(total([12000, 8000, 15000]))\n```\n\n`total()` ngembalikan angka, dan angka itu langsung diselipin jadi argumen `cetak_struk()` di baris terakhir. Programnya nyetak `Total: 35000`.\n\n## Beda Fungsi vs Prosedur\n\nSebenernya beda paling mendasar cuma ada di *return value* aja. Prosedur cuma ngejalanin aksi tanpa pamrih, alias *nggak* ngasih kembalian apa-apa. Sementara fungsi, habis ngolah data, dia bakal ngasih *output* berupa nilai pasti.\n\nSecara pemakaian juga beda. Prosedur biasanya dipanggil langsung sebagai satu instruksi utuh yang mandiri. Kalau fungsi, pemanggilannya sering diselipin ke dalam sebuah ekspresi atau operasi *assignment* (pengisian nilai ke variabel).\n\n## Kapan Pakai Fungsi, Kapan Pakai Prosedur?\n\nBuat mutusin mana yang harus dipakai, balik lagi ke kebutuhan kalian. Pakai prosedur kalau kalian cuma butuh ngejalanin aksi aja. Misalnya buat nyetak teks ke layar, nyimpen data ke *database*, atau ngubah nilai variabel *global*.\n\nTapi, kalau kalian butuh ngelakuin kalkulasi matematika, pengolahan teks, atau konversi data yang hasil akhirnya bakal dipakai lagi sama program utama, nah itu saatnya kalian pakai fungsi. Gampang dipahami, kan? ✨\n","- Fungsi selalu mengembalikan nilai (return value) ke pemanggilnya.\n- Prosedur hanya menjalankan tugas spesifik tanpa mengembalikan nilai.\n- Membantu membuat kode jadi lebih modular, gampang di-debug, dan tidak berulang (DRY).","\u003Cp>Pernah \u003Cem>nggak\u003C\u002Fem> kalian bikin kode program yang isinya panjang banget sampai ratusan atau ribuan baris? Pasti pusing sendiri pas harus nyari \u003Cem>bug\u003C\u002Fem> atau mau nambahin fitur baru.\u003C\u002Fp>\n\u003Cp>Nah, biar kode kita lebih rapi dan gampang dikelola, kita butuh yang namanya modularisasi. Caranya adalah dengan memecah program besar menjadi potongan-potongan kecil yang disebut sub-program. Di dunia \u003Cem>programming\u003C\u002Fem>, sub-program ini biasa kita kenal dengan istilah Fungsi (\u003Cem>function\u003C\u002Fem>) dan Prosedur (\u003Cem>procedure\u003C\u002Fem>).\u003C\u002Fp>\n\u003Cp>Kedua konsep ini sering banget dipakai buat ngelompokkin baris kode yang punya tugas spesifik. Yuk, kita bahas apa bedanya dan kenapa kalian wajib banget pakai dua hal ini! 🚀\u003C\u002Fp>\n\u003Ch2 id=\"kenapa-harus-pakai-fungsi-dan-prosedur\">Kenapa Harus Pakai Fungsi dan Prosedur?\u003C\u002Fh2>\n\u003Cp>Ada banyak banget keuntungan yang bisa kalian dapet. Pertama, jelas bikin \u003Cem>debugging\u003C\u002Fem> jauh lebih gampang. Kalau ada \u003Cem>error\u003C\u002Fem> di fitur tertentu, kalian cuma perlu ngecek blok kode fungsi atau prosedur yang berkaitan, \u003Cem>nggak\u003C\u002Fem> perlu ngubek-ubek seluruh program.\u003C\u002Fp>\n\u003Cp>Kedua, ada \u003Cem>reusability\u003C\u002Fem>. Maksudnya, kode yang udah kalian tulis bisa dipanggil berulang kali di berbagai bagian program. Ini bikin kalian terhindar dari nulis kode yang sama persis berkali-kali (konsep \u003Cem>Don&#39;t Repeat Yourself\u003C\u002Fem> atau DRY).\u003C\u002Fp>\n\u003Cp>Ketiga, kode kalian bakal kelihatan jauh lebih profesional dan punya \u003Cem>readability\u003C\u002Fem> yang tinggi. Orang lain atau bahkan kalian di masa depan bakal lebih gampang paham alur programnya.\u003C\u002Fp>\n\u003Ch2 id=\"mengenal-prosedur\">Mengenal Prosedur\u003C\u002Fh2>\n\u003Cp>Prosedur itu intinya adalah sekumpulan instruksi buat ngelakuin aksi tertentu. Karakteristik paling utamanya adalah dia \u003Cstrong>tidak mengembalikan nilai\u003C\u002Fstrong> (\u003Cem>no return value\u003C\u002Fem>) ke program utama.\u003C\u002Fp>\n\u003Cp>Jadi prosedur tuh cuma dikasih tugas, dikerjain sampai selesai, terus udah. \u003Cem>Nggak\u003C\u002Fem> ada hasil perhitungan yang disetor balik ke pemanggilnya. Biasanya di bahasa pemrograman modern kayak C atau C++, prosedur ini sering ditulis pakai \u003Cem>keyword\u003C\u002Fem> \u003Ccode>void\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Contohnya kayak gini 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=\"void%20cetak_struk(int%20total)%20%7B%0A%20%20%20%20printf(%22Total%3A%20%25d%5Cn%22%2C%20total)%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>void cetak_struk(int total) {\n    printf(\"Total: %d\\n\", total);\n}\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Perhatiin nggak ada \u003Ccode>return\u003C\u002Fcode> di dalamnya. Prosedur itu dikasih data, ngerjain sesuatu, terus selesai — hasil kerjanya nggak dikirim balik ke yang manggil.\u003C\u002Fp>\n\u003Ch2 id=\"mengenal-fungsi\">Mengenal Fungsi\u003C\u002Fh2>\n\u003Cp>Kalau fungsi, sifatnya agak beda sedikit. Fungsi adalah blok kode yang bertugas memproses data dan di akhir prosesnya dia \u003Cstrong>mengembalikan sebuah nilai\u003C\u002Fstrong> (\u003Cem>return value\u003C\u002Fem>).\u003C\u002Fp>\n\u003Cp>Nilai hasil perhitungan dari fungsi ini nantinya bakal dilempar balik ke program utamanya. Hasil kembalian ini biasanya ditampung dulu ke dalam sebuah variabel buat dipakai ke proses selanjutnya.\u003C\u002Fp>\n\u003Cp>Dalam satu program, keduanya bisa dipakai bareng:\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=\"def%20total(belanja)%3A%0A%20%20%20%20return%20sum(belanja)%0A%0Adef%20cetak_struk(total_bayar)%3A%0A%20%20%20%20print(%22Total%3A%22%2C%20total_bayar)%0A%0Acetak_struk(total(%5B12000%2C%208000%2C%2015000%5D))\" 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\">def\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> total\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(belanja):\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> sum\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(belanja)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> cetak_struk\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(total_bayar):\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\">\"Total:\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, total_bayar)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">cetak_struk(total([\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">12000\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">8000\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">15000\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">]))\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>\u003Ccode>total()\u003C\u002Fcode> ngembalikan angka, dan angka itu langsung diselipin jadi argumen \u003Ccode>cetak_struk()\u003C\u002Fcode> di baris terakhir. Programnya nyetak \u003Ccode>Total: 35000\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"beda-fungsi-vs-prosedur\">Beda Fungsi vs Prosedur\u003C\u002Fh2>\n\u003Cp>Sebenernya beda paling mendasar cuma ada di \u003Cem>return value\u003C\u002Fem> aja. Prosedur cuma ngejalanin aksi tanpa pamrih, alias \u003Cem>nggak\u003C\u002Fem> ngasih kembalian apa-apa. Sementara fungsi, habis ngolah data, dia bakal ngasih \u003Cem>output\u003C\u002Fem> berupa nilai pasti.\u003C\u002Fp>\n\u003Cp>Secara pemakaian juga beda. Prosedur biasanya dipanggil langsung sebagai satu instruksi utuh yang mandiri. Kalau fungsi, pemanggilannya sering diselipin ke dalam sebuah ekspresi atau operasi \u003Cem>assignment\u003C\u002Fem> (pengisian nilai ke variabel).\u003C\u002Fp>\n\u003Ch2 id=\"kapan-pakai-fungsi-kapan-pakai-prosedur\">Kapan Pakai Fungsi, Kapan Pakai Prosedur?\u003C\u002Fh2>\n\u003Cp>Buat mutusin mana yang harus dipakai, balik lagi ke kebutuhan kalian. Pakai prosedur kalau kalian cuma butuh ngejalanin aksi aja. Misalnya buat nyetak teks ke layar, nyimpen data ke \u003Cem>database\u003C\u002Fem>, atau ngubah nilai variabel \u003Cem>global\u003C\u002Fem>.\u003C\u002Fp>\n\u003Cp>Tapi, kalau kalian butuh ngelakuin kalkulasi matematika, pengolahan teks, atau konversi data yang hasil akhirnya bakal dipakai lagi sama program utama, nah itu saatnya kalian pakai fungsi. Gampang dipahami, kan? ✨\u003C\u002Fp>\n","\u003Cul>\n\u003Cli>Fungsi selalu mengembalikan nilai (return value) ke pemanggilnya.\u003C\u002Fli>\n\u003Cli>Prosedur hanya menjalankan tugas spesifik tanpa mengembalikan nilai.\u003C\u002Fli>\n\u003Cli>Membantu membuat kode jadi lebih modular, gampang di-debug, dan tidak berulang (DRY).\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":93,"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":93,"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":93,"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":93,"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":117,"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":93,"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":117,"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,292],{"text":281,"depth":124,"id":282},"Kenapa Harus Pakai Fungsi dan Prosedur?","kenapa-harus-pakai-fungsi-dan-prosedur",{"text":284,"depth":124,"id":285},"Mengenal Prosedur","mengenal-prosedur",{"text":287,"depth":124,"id":288},"Mengenal Fungsi","mengenal-fungsi",{"text":290,"depth":124,"id":291},"Beda Fungsi vs Prosedur","beda-fungsi-vs-prosedur",{"text":293,"depth":124,"id":294},"Kapan Pakai Fungsi, Kapan Pakai Prosedur?","kapan-pakai-fungsi-kapan-pakai-prosedur",1793295834084]