Membangun Aplikasi Flutter Pertama: Cerita Kancil

Dari Nonton Clash of Champions ke Play Store: Cerita Membangun Kancil
Saya tidak pernah berniat membuat aplikasi game. Semuanya berawal dari hal yang jauh lebih sederhana: duduk di sofa, remot di tangan, menonton Clash of Champions dari Ruangguru.
Kalau kamu belum pernah menontonnya, singkatnya begini. Sekumpulan anak muda berprestasi diadu dalam berbagai tantangan otak. Cepat-cepatan, tegang, dan seru untuk diikuti. Tapi yang menempel di kepala saya setelah episode selesai bukan siapa yang menang, melainkan satu pertanyaan yang terus mengganggu:
Kenapa hal seseru ini rasanya cuma "milik" orang-orang jenius?
Kalau diperhatikan, tantangan di layar itu sebenarnya sederhana di intinya. Hitung cepat. Ingat pola. Kenali sesuatu sebelum orang lain sempat sadar. Bukan kalkulus tingkat dewa, melainkan keterampilan dasar yang, kalau dikemas dengan benar, harusnya bisa dinikmati siapa saja. Anak SD. Orang tua. Om saya yang gaptek. Bahkan saya sendiri, yang sudah lama tidak "melatih" otak dengan hal receh tapi menantang.
Dari titik itu muncul satu hipotesis yang ingin saya uji. Dan karena saya orang IT, saya mengujinya dengan cara yang paling saya kuasai: membangunnya. Aplikasi itu saya beri nama Kancil.
Hipotesisnya: mulai dari yang paling dasar
Godaan pertama saat ingin membuat game edukasi adalah langsung membuat yang "wah". Level susah, mekanik kompleks, fitur bertumpuk. Saya sengaja menahan diri.
Pertanyaan yang benar-benar ingin saya jawab justru jauh lebih rendah hati:
Apakah game-game paling dasar sudah cukup enak untuk dinikmati lintas usia?
Perhatikan bedanya. Bukan "apakah saya bisa membuat game tersulit", melainkan "apakah yang paling sederhana pun sudah terasa menyenangkan dan layak dimainkan berulang". Logikanya begini: kalau fondasinya saja belum enak, menambah kerumitan hanya menumpuk masalah di atas masalah. Saya lebih ingin tahu apakah lantainya kokoh, sebelum sibuk memikirkan berapa tinggi bangunannya.
Maka saya buat daftar keterampilan paling dasar yang berulang muncul di kepala saya waktu menonton COC, lalu masing-masing saya jadikan satu game: hitung cepat, mengenali pola angka, kosakata, ingatan jangka pendek, pengetahuan umum, dan persepsi ruang. Sengaja dasar. Sengaja ringan. Karena yang sedang saya uji bukan kehebatan game-nya, melainkan apakah ide dasarnya bisa berdiri sendiri.
Kenapa namanya Kancil
Dalam cerita rakyat kita, kancil bukan hewan yang paling besar atau paling kuat. Ia menang karena akal. Buat saya, itu terasa pas. Pesan yang ingin saya bawa bukan "jadilah yang paling pintar", melainkan "otak yang tajam bisa datang dari mana saja, dari siapa saja".
Taglinenya pun lahir dari situ: "Sharp minds. One world." Bagian "One world" itu bukan sekadar tempelan manis, dan nanti akan saya ceritakan bagaimana ia menjadi nyata lewat papan peringkat global.
Sebelum lebih jauh, izinkan saya jujur di depan: ini aplikasi Flutter pertama saya. Membangun aplikasi mobile sungguhan, sampai rilis ke Play Store, lengkap dengan papan peringkat global dan banyak bahasa, adalah tanah yang benar-benar baru buat saya. Jadi anggaplah tulisan ini sebagai catatan orang yang belajar sambil membangun, bukan khotbah dari seseorang yang sudah ahli.
Pilihan teknologi: sengaja membosankan
Kancil dikerjakan sendirian. Artinya, setiap keputusan teknis punya konsekuensi langsung ke satu-satunya sumber daya yang saya punya: waktu saya. Maka yang saya cari bukan yang paling canggih, melainkan yang paling hemat tenaga tanpa mengorbankan kualitas.
Pilihan jatuh ke Flutter dan Firebase. Flutter memberi saya satu basis kode untuk dua platform sekaligus dan kontrol penuh atas animasi yang banyak dipakai game ini. Firebase mengurus backend tanpa perlu saya menjaga server tetap hidup pukul tiga pagi.
Kesimpulan yang ingin saya bagikan cuma satu, dan justru terdengar kontra-intuitif: untuk aplikasi pertama, kebosanan adalah fitur. Pilih teknologi yang matang dan berlimpah dokumentasinya, lalu simpan energi kreatifmu untuk produknya, bukan untuk melawan tooling. Saya tetap tersandung beberapa masalah versi khas Flutter di awal, tapi hampir semuanya selesai begitu sadar bahwa "kombinasi versi yang bekerja" itu sendiri adalah aset yang harus dijaga.
Bagian favorit saya: satu engine untuk banyak game
Inilah keputusan arsitektur yang paling saya banggakan, dan intinya sederhana.
Kalau kamu perhatikan, sebagian besar game di Kancil punya ritme yang identik: tampilkan soal, terima jawaban, beri umpan balik, hitung skor, lalu lanjut ke level berikutnya. Matematika, bendera, kata, deret angka, semuanya pada dasarnya berbentuk kuis.
Kalau logika itu saya tulis berulang kali di tiap game, sebenarnya saya sedang menyiapkan diri untuk bug yang berlipat-lipat. Maka saya buat satu mesin kuis bersama. Hasilnya, untuk menambah satu game kuis baru, saya cukup mendefinisikan apa yang membuatnya unik, misalnya cara membuat soal bendera. Sisanya, mulai dari tampilan, animasi, penghitungan skor, sampai perpindahan level, semuanya sudah diurus oleh engine secara gratis. Game yang pola interaksinya memang beda, seperti Ingatan atau Cari Kata, tinggal membawa layarnya sendiri.
Prinsip ini sebenarnya punya nama di dunia programming: DRY, Don't Repeat Yourself. Setiap logika idealnya hidup di satu tempat saja, bukan disalin ke sana kemari.
Yang berulang, jadikan satu mesin. Yang unik, beri tempatnya sendiri.
Keuntungannya bukan sekadar kode yang rapi. Perbaikan di satu tempat langsung membenahi semua game kuis sekaligus, rasa bermainnya jadi konsisten, dan waktu membuat game baru saya cuma perlu memikirkan satu hal: apa yang membuatnya unik.
"One world": papan peringkat global dan banyak bahasa
Bagian "One world" dari tagline ditopang oleh dua hal.
Yang pertama, papan peringkat global. Secara teknis ia sederhana, tapi efek psikologisnya besar: seorang anak di kota kecil bisa berada dalam satu daftar yang sama dengan orang di benua lain. Keputusan paling menarik di sini justru bukan soal database, melainkan soal identitas. Papan peringkat butuh identitas, dan cara paling umum adalah menyuruh orang mendaftar dulu. Celakanya, itu salah satu titik tempat orang paling banyak kabur. Solusinya adalah autentikasi anonim: begitu pertama kali membuka aplikasi, kamu langsung punya identitas yang stabil tanpa perlu mengisi apa pun. Ini contoh nyata dari prinsip yang saya pegang, bahwa teknologi terbaik sering kali justru yang tidak terlihat.
Yang kedua, banyak bahasa. Kancil mendukung 10 bahasa antarmuka. Untuk aplikasi solo ini terdengar berlebihan, tapi kalau taglinemu berbunyi "One world", kamu memang tidak bisa berhenti di bahasa Inggris saja. Prinsipnya, kalau sesuatu akan kamu lakukan berkali-kali, buat biayanya kecil sejak awal. Yang tidak saya duga justru masalah huruf: font utama saya ternyata tidak punya glif untuk sebagian aksara non-Latin. Pelajaran kerendahan hati yang menyenangkan, ternyata "kelihatan bagus dalam bahasa Inggris" adalah standar yang sangat rendah.
Satu catatan jujur lagi: sebagian terjemahan itu dibantu AI, dan idealnya masih butuh peninjauan penutur asli sebelum benar-benar matang. Bagian dari membangun secara jujur adalah mengakui apa yang belum sempurna.
Penutup
Kancil kini sudah rilis, lengkap dengan sekumpulan game dasar, papan peringkat global, dan dukungan banyak bahasa. Tapi buat saya, statusnya masih "eksperimen yang sedang berjalan". Hipotesis awalnya, apakah orang lintas usia nyaman dengan game-game dasar lebih dulu, belum benar-benar selesai diuji. Setiap orang yang mencobanya adalah satu titik data baru.
Kalau ada satu hal yang saya bawa pulang dari perjalanan ini, ini dia: aplikasi kecil pun boleh punya ambisi besar soal rasa hormat, kualitas, dan jangkauan. Ukuran tim tidak menentukan ukuran kepedulian.
Kalau kamu penasaran, coba mainkan. Lihat apakah otakmu, di usia berapa pun, masih senang ditantang oleh hal-hal kecil. Ternyata memang masih, setidaknya buat saya, dan itu saja sudah menjadi jawaban awal yang menyenangkan.
Sharp minds. One world.
Coba Kancil di Play Store: https://play.google.com/store/apps/details?id=id.harislabs.kancil
