11 Oktober 2026•baca 4 menit

Tiap Nota di Kafe Ini Isinya Pesanan yang Sama

Nota tiap meja isinya sama semua, dan totalnya Rp0 — padahal tiap meja cuma pesan satu barang. Coba tebak kenapa.

Repo lab

Lab-nya ada di folder 0004.mutation-and-scope

Kode yang sengaja dibuat salah, dataset-nya, dan target make check-nya ada di repo publik. Semuanya jalan di dalam Docker.

Malam yang ramai di sebuah kafe kecil. Barista buka tiga meja, dan tiap meja pesan satu barang saja: meja 1 pesan kopi, meja 3 pesan teh, meja 5 pesan roti. Sesederhana itu.

Sampai barista mencetak notanya. Nota tiap meja isinya sama semua — kopi, teh, roti, ketiganya. Padahal tiap meja cuma pesan satu barang. Dan tiap nota bilang totalnya Rp0. Rekap kas harian di ujung hari juga Rp0, padahal seharian jualan.

Nggak ada satu pun pesan error di layar. Nggak ada program yang berhenti mendadak. Aplikasinya jalan sampai selesai, dan kalau kamu buka satu-satu fungsinya lalu baca dari atas, tiap fungsi kelihatan masuk akal. Ada komentar yang menjelaskan niat penulis aslinya, dan niatnya bagus: satu fungsi bilang pesanannya mulai kosong, fungsi lain bilang totalnya dihitung dari item yang sudah masuk. Niat yang bagus, hasil yang salah — itu kombinasi yang paling bikin kesal.

Poin Penting

  • Tiga meja pesan satu barang, tapi tiap nota isinya sama dan totalnya Rp0.
  • Nggak ada error, dan tiap fungsi kelihatan benar kalau dibaca sendiri-sendiri.
  • Enam pemeriksaan make check merah, terbagi ke tiga kelompok yang gagal dengan cara berbeda.
  • Memperbaiki satu tempat saja nggak cukup: sebabnya lebih dari satu.
  • Pertanyaannya bukan "di mana bugnya", tapi benda mana yang sebenarnya diubah.

Angka yang benar-benar keluar sekarang

yang terjadi
tiga meja (1, 3, 5), masing-masing pesan satu barang tiap nota isinya 3 item yang sama: kopi x2, teh x1, roti x1
total nota tiap meja Rp0 (harusnya meja 1 Rp30.000, meja 3 Rp8.000, meja 5 Rp12.000)
kas harian setelah tiga meja jualan Rp0 (harusnya Rp50.000)
make check, 6 pemeriksaan 6 dari 6 merah

Baris pertama itu yang paling menipu. Pesanannya jelas beda-beda: meja 1 kopi, meja 3 teh, meja 5 roti. Tapi begitu masuk ke nota, ketiganya jadi satu daftar yang sama. Nggak ada satu meja pun yang notanya berisi pesanannya sendiri.

make check membelah enam pemeriksaan itu jadi tiga kelompok, dan tiap kelompok gagal dengan caranya sendiri. Dua yang pertama soal isi nota: meja yang seharusnya masih kosong ternyata ikut keisi (meja 3 dan 5), dan dua meja yang pesan menu beda (meja 7 dan 9) berakhir dengan isi yang kembar. Dua berikutnya soal total: satu nota harusnya Rp38.000 tapi tertulis Rp0, satu lagi harusnya Rp45.000, hasilnya sama saja. Dua yang terakhir soal kas: satu meja jualan seharusnya menaikkan kas Rp32.000, yang terjadi kasnya naik Rp0. Enam gejala, tiga kelompok, dan masing-masing kelompok menunjuk ke tempat yang beda.

Misi kamu

Bikin make check hijau. Enam pemeriksaan (A1, A2, B1, B2, C1, C2) dibagi ke tiga kelompok, dan tiap kelompok menguji satu syarat:

  1. Tiap nota cuma punya isi pesanan meja itu. Meja yang belum pesan apa-apa notanya tetap kosong, dan dua meja yang pesan menu beda nggak boleh saling ketuker.
  2. Total nota dihitung dari itemnya. Jumlah item dan qty-nya ikut dikalikan, bukan sekadar dibiarkan Rp0.
  3. Kas harian bertambah sebesar yang benar-benar terjual. Jual Rp32.000, kas naik Rp32.000.

Boleh mengubah apa saja di satu file itu, asal tiga fungsinya tetap bisa dipanggil dengan cara yang sama seperti sekarang. Dan sebelum kamu buka editornya, ada satu hal yang bikin lab ini beda dari tiga lab sebelumnya.

Kenapa lab ini nggak butuh Docker

Tiga lab sebelumnya di repo ini berjalan di atas FastAPI, Postgres, dan Docker. Lab ini bukan. Semua kodenya Python 3 standar, satu file, tanpa pip install dan tanpa database. Alasannya sederhana: kalau kamu harus menyiapkan Docker dulu sebelum bisa mulai belajar, kamu berhenti di langkah nol. Di sini satu-satunya yang kamu butuhkan adalah python3, yang sudah ada di hampir semua mesin. Jadi persiapanmu cuma satu: membuka terminal.

Di mana mulainya

Dua perintah, dan satu file untuk kamu baca:

BASH
make demo    # ceritanya, bukan angkanya
make check   # lihat sendiri pemeriksaan mana yang merah

Terus buka kasir.py dan baca dari atas. Tiap fungsi punya komentar yang menjelaskan niat penulisnya. Tugasmu bukan mencari baris yang kelihatan jelek — tugasmu mencari kenapa niat yang bagus tetap menghasilkan nota yang salah.

Kenapa ini ada

Kebanyakan orang belajar "fungsi" dari contoh yang cuma dipanggil sekali. Bikin sekali, panggil sekali, cetak, selesai — dan programnya kelihatan jalan. Di kenyataan, fungsi justru dipanggil berkali-kali: meja yang satu, lalu meja yang lain, lalu besok lagi. Ada dua hal yang cuma muncul waktu sebuah fungsi dipakai lebih dari sekali, dan dua-duanya jarang diajarkan bareng contoh pertamamu. Itu sebabnya lab ini ada.

Batas lab ini

  • Ini bukan pelajaran tentang class. Semua state di sini cuma dict dan nilai biasa. Di dunia nyata, masalah bentuk ini sering diselesaikan dengan class — tapi class bukan obat ajaib. Dia cuma cara lain untuk pertanyaan yang sama: benda mana yang sedang kamu pegang, dan mana yang kamu ubah.
  • Semua yang rusak di sini rusak tanpa satu pun pesan error. Kalau selama ini kamu menunggu layar merah buat tahu ada yang salah, lab ini melatih kebalikannya: mencurigai kode yang jalan mulus.

Pertanyaannya

Sebelum kamu menyentuh kasir.py, jawab ini dulu: kenapa meja yang belum pesan apa-apa ikut dapat isi pesanan meja lain? Dia bukan meja yang sama, notanya bukan nota yang sama, tapi isinya kembar.

Pertanyaan kedua: kalau tiap fungsi kelihatan benar saat dibaca sendiri-sendiri, di mana persisnya satu meja "menitipkan" datanya ke meja lain? Dan yang terakhir, yang paling menentukan: kalau kamu cuma memperbaiki satu tempat, apakah cukup? Ada lebih dari satu sebab di balik tiga gejala ini, dan masing-masing punya obat yang beda. Jawaban panjangnya ada di artikel jawabannya.

Biar makin jago ngoding.

Yuk gabung bareng temen-temen developer lainnya buat dapet update teknologi, tips, dan tutorial santai tiap minggu.

Biar Nggak Kudet

Update teknologi, tips ngoding, dan insight santai langsung ke email kamu tiap minggu.

Santai, anti spam. Bisa berhenti langganan kapan aja.

Baca Selanjutnya

Lihat semua

© 2026 Inva.dev.