Tuesday, October 27, 2026

Memahami FPS pada Flutter: Kunci Utama Aplikasi Android & iOS yang Super Mulus

Pernahkah Anda menggunakan aplikasi yang terasa sangat mulus saat di-scroll, tetapi aplikasi lain terasa patah-patah (lagging)? Di dunia pengembangan aplikasi seluler, kenyamanan visual tersebut sangat ditentukan oleh satu variabel kunci: FPS (Frames Per Second).


Bagi developer Flutter, memahami FPS bukan sekadar persoalan angka, melainkan kunci untuk menciptakan User Experience (UX) kelas atas. Artikel ini membahas secara mendalam apa itu FPS, standar performa yang bagus, hingga faktor teknis yang membuatnya tinggi dan stabil.




Apa Itu FPS pada Flutter?

FPS (Frames Per Second) adalah jumlah bingkai atau gambar yang digambar (rendered) oleh mesin aplikasi ke layar perangkat dalam waktu satu detik.

Di Flutter, setiap tampilan UI dibuat melalui alur kerja dua proses (thread) utama:
1. UI Thread (Dart VM): Menjalankan logika aplikasi, mengeksekusi metode
build()
, menghitung layout, dan positioning.
2. Raster Thread (GPU): Mengambil instruksi dari UI Thread dan mengubahnya menjadi piksel nyata di layar.

---

Benchmark & Standar Kategori FPS

Untuk menentukan apakah performa aplikasi Flutter Anda sudah ideal atau belum, berikut adalah tolok ukurnya:

**High Refresh Rate**
• Nilai FPS: 90 – 120 FPS
• Status Performa: Ultra Smooth
• Pengalaman Pengguna (UX): Sangat mulus pada layar HP modern (90Hz/120Hz).

**Ideal / Standard**
• Nilai FPS: 60 FPS
• Status Performa: Sangat Baik (Target)
• Pengalaman Pengguna (UX): Standar emas aplikasi mobile. Bebas dari stuttering.

**Acceptable**
• Nilai FPS: 50 – 59 FPS
• Status Performa: Cukup Baik
• Pengalaman Pengguna (UX): Masih nyaman, hanya ada sesekali penurunan kecil (minor drop).

**Stuttering / Jank**
• Nilai FPS: 30 – 49 FPS
• Status Performa: Buruk
• Pengalaman Pengguna (UX): Mulai terasa patah-patah saat animasi atau scroll cepat.

**Severe Lag**
• Nilai FPS: < 30 FPS
• Status Performa: Sangat Buruk
• Pengalaman Pengguna (UX): Sangat berat, lagging, dan merusak pengalaman pengguna.

---

Rahasia 16.6 Milidetik (*Frame Budget*)

Agar aplikasi dapat berjalan di 60 FPS, Flutter hanya memiliki batas waktu 16,6 milidetik (ms) untuk menyelesaikan 1 frame (1000 ms ÷ 60 frame = 16.6 ms/frame).

Catatan: Jika Anda mengincar layar 120 Hz, batas waktu per frame makin ketat, yaitu 8.3 ms.

Jika pengolahan di UI Thread dan Raster Thread memakan waktu lebih dari 16.6 ms, frame tersebut akan terlambat ditampilkan. Fenomena keterlambatan frame ini dalam istilah Flutter disebut sebagai Jank (patah-patah).

---

Faktor Penyebab FPS Tinggi & Stabil di Flutter

Mencapai 60 FPS yang konsisten memerlukan kombinasi antara efisiensi kode Dart dan pengolahan grafis yang optimal. Berikut faktor-faktor utamanya:

1. Optimalisasi Rebuild Widget (UI Thread)
Konstruktor
const
: Menggunakan keyword
const
pada widget statis mendaftarkan widget ke compile-time memory, sehingga Flutter tidak perlu membuat ulang widget tersebut saat rebuild*.
Scoping State yang Presisi: Menggunakan state management (seperti Riverpod, Bloc, atau Provider) untuk memperbarui widget yang membutuhkan pembaruan saja, bukan rebuild seluruh pohon widget (widget tree*).
* Metode
build()
yang Ringan: Hindari menjalankan fungsi berat, iterasi besar, atau panggilan API/I/O di dalam metode
build()
.

2. Pengolahan Grafis & Efisiensi GPU (Raster Thread)
Membatasi Widget Berat GPU: Penggunaan
Opacity
transparan,
BackdropFilter
(blur), dan
ClipRRect
secara berlebihan memaksa GPU bekerja ekstra keras (offscreen rendering*). (1/2)

Wednesday, October 21, 2026

Kafka vs RabbitMQ: Perbedaan dan Kapan Pakai yang Mana

 Kafka dan RabbitMQ sama-sama message broker, tapi lahir dari dua filosofi yang berbeda. Memilih salah satunya bukan soal mana yang "lebih cepat" — keduanya sudah lebih dari cukup untuk hampir semua aplikasi. Yang menentukan adalah pola kerja dan siapa yang akan mengoperasikannya.

1. Ringkasan Satu Paragraf

Kafka adalah distributed commit log — pesan ditulis ke log yang bisa diputar ulang (replay), disimpan sesuai kebijakan retensi (default 7 hari), dan tidak dihapus setelah dibaca. Consumer menggeser pointer (offset), bukan "mengambil lalu menghapus".

RabbitMQ adalah message broker klasik berbasis AMQP — pesan dirutekan lewat exchange ke queue, lalu dihapus setelah di-acknowledge. Fokusnya pada routing fleksibel dan jaminan per-pesan.

"RabbitMQ built its reputation as the default choice for messaging and task queueing; Kafka built its reputation as the default choice for event streaming."
— Dokumentasi resmi RabbitMQ
Kabar penting 2025–2026: garis pemisah ini sudah kabur di kedua sisi. RabbitMQ punya streams (log ter-replikasi) sejak versi 3.9 (2021), dan Kafka mulai menambahkan queue semantics (KIP-932) di versi 4.0. Jadi pertanyaan "mana yang lebih baik" sekarang bukan soal kemampuan, tapi soal beban kerja dan operasional.

Sunday, October 18, 2026

Backend Project Structure

 Panduan Lengkap Organisasi Folder Node/Express untuk Backend yang Scalable

Struktur folder yang baik adalah fondasi backend yang maintainable, scalable, dan mudah dipahami tim. Artikel ini membahas standar industri untuk mengorganisasi proyek Node.js/Express, lengkap dengan penjelasan setiap komponen dan alur request.

Folder Structure

Berikut adalah struktur folder yang direkomendasikan untuk proyek backend Node/Express:

backend/ ├── node_modules/ # Installed packages and dependencies ├── src/ │ ├── config/ # Database and environment setup │ ├── controllers/ # Handle HTTP requests and responses │ ├── middlewares/ # Auth, logging, validation, etc. │ ├── models/ # Database schemas and data structures │ ├── routes/ # API endpoints mapped to controllers │ ├── services/ # Business logic and integrations │ ├── utils/ # Reusable helper functions │ └── redis/ # Caching and Redis connection (if used) ├── app.js # Configure Express app and middleware ├── server.js # Start server and listen on port ├── .env # Secret keys and environment variables (never commit) ├── .gitignore # Files Git should ignore ├── package.json # Scripts and dependencies └── README.md # Project documentation

Monday, October 12, 2026

Apakah PATCH Idempotent? — Bedakan PUT, POST, dan PATCH di REST API

Pernah ditanya interviewer: "Apakah PATCH idempotent?" — dan banyak developer bingung menjawab. Pertanyaan ini sering muncul di wawancara backend, dan jawabannya tidak selalu hitam-putih. Mari kita bahas dengan bahasa sederhana.

Apa itu Idempotent?

Sebelum masuk ke PATCH, pahami dulu artinya. Sebuah operasi disebut idempotent jika:

Menjalankan operasi 1 kaliatau 100 kalimenghasilkan hasil yang sama — tidak ada efek samping ekstra.

Contoh sederhana:

  • x = 5 → idempotent (dipanggil berkali-kali, x tetap 5)
  • x = x + 1 → bukanidempotent (setiap panggilan, nilai x berubah)

Request itu Server yang Mana yang Akan Menerima? — Load Balancing untuk Pemula

 Pernahkah kamu bertanya-tanya: ketika jutaan user mengakses aplikasi secara bersamaan, server mana yang menerima request tersebut? Bagaimana sistem memastikan bahwa tidak ada satu server yang kelebihan beban (overload)ementara server lainnya menganggur? Jawabannya ada pada konsep load balancing.

Apa itu Load Balancing?

Load balancing adalah teknik mendistribusikan traffic (request) dari pengguna ke beberapa server secara merata. Tujuannya sederhana:

  • 🚀 Meningkatkan performa aplikasi
  • 🛡️ Mencegah satu server down membuat aplikasi mati total
  • 📈 Memungkinkan aplikasi berkembang (scale) sesuai jumlah user

Sunday, October 11, 2026

HTTP 401 vs 403 — Apa Bedanya dan Kenapa Penting?

 

Dua kode ini kelihatan mirip — sama-sama artinya “akses ditolak”. Tapi sebenarnya keduanya menjawab dua pertanyaan yang berbeda. Salah pilih kode, API kamu jadi membingungkan dan berpotensi bocor informasi.

Inti Perbedaannya dalam Satu Kalimat

401 Unauthorized → Authentication — “Kamu ini siapa? Belum kenal aku.”

403 Forbidden → Authorization — “Aku sudah tahu kamu siapa, tapi kamu tidak punya izin untuk ini.”

1. 401 Unauthorized — Masalah Identitas

Server belum tahu siapa yang sedang mengakses. Kredensialnya tidak ada, tidak valid, atau sudah kedaluwarsa.

  • Tidak mengirim token / API key sama sekali
  • Token sudah expired
  • Token rusak, dipalsukan, atau signature-nya tidak cocok
  • Password / kredensial salah saat login

Ciri khas: server mengirim header WWW-Authenticate — semacam petunjuk cara login yang benar.

Solusi untuk client: login ulang atau refresh token.

System Design Interview — Panduan Lengkap


Prinsip Utama: Jangan langsung menggambar arsitektur di awal. Yang dinilai bukan bagusnya diagram komponen, tapi kemampuan menjelaskan “KENAPA” di balik setiap keputusan desain.

6-Step Workflow System Design Interview

1. Requirements (Kebutuhan)

  • Functional Requirements — Apa yang harus dilakukan sistem? (fitur utama)
  • Non-Functional Requirements — Scalability, availability, latency, consistency, durability
  • Klarifikasi dengan interviewer: scope, batasan, asumsi

2. Capacity Estimation (Estimasi Kapasitas)

  • Jumlah users (DAU/MAU)
  • QPS (Queries Per Second) — rata-rata dan peak traffic
  • Estimasi storage dan bandwidth
  • Angka ini menentukan keputusan scaling berikutnya

3. APIs & Data Model

  • Definisikan API endpoints (REST/gRPC)
  • Rancang schema database (tables, relationships, indexes)
  • Pilih SQL vs NoSQL berdasarkan kebutuhan