Monthly Archives: June 2020

Mencoba Bahasa Dart dan SDK Flutter

Posting ini akan membahas pengalaman singkat saya memakai bahasa pemrograman Dart dan Software Development Kit (SDK) Flutter di sebuah proyek kecil. Flutter merupakan SDK pembuatan user interface (UI) yang membuat Dart jadi dikenal untuk UI Development. Ini seperti seperti Rails yang membuat Ruby jadi terkenal untuk web development (Ruby on Rails).

Dart programming language

Saya akan bahas sedikit mengenai sejarah bahasa Dart ini supaya jelas bahwa: bahasa ini bukan bahasa baru, dibuat perusahaan besar (Google), memiliki standard resmi (ECMA), dan sudah memiliki sejarah cukup panjang.

Sejarah Dart

Bahasa pemrograman Dart diumumkan Google sejak 2011 dan dirilis publik tahun 2013. Tadinya bahasa ini dikembangkan untuk web browser untuk menyaingi Java Script. Awalnya ada kabar bahwa Virtual Machine untuk Dart akan dimasukkan Chrome, tapi rencananya berubah: Dart ditranslasikan (transcompile) saja ke JavaScript, jadi tidak ada VM khusus Dart dalam browser.

Bahasa Dart ini sempat distandardkan dalam ECMA standard 408 tahun 2014, tapi tahun 2018 bahasanya diubah dengan rilis 2.0 sehingga tidak sepenuhnya kompatibel lagi dengan versi sebelumnya. Spesifikasi terbaru saat ini bisa dilihat di sini. Tapi JavaScript juga terus berubah, plus masih ada saingan bahasa lain yang ditranslasikan ke JavaScript (misalnya TypeScript, CoffeeScript, dsb) jadi Dart kurang menonjol.

Selain Dart, Google juga memiliki bahasa lain yang lebih populer: Go. Selama beberapa tahun nasib dan tujuan Dart ini menurut saya kurang jelas, sampai ketika tahun 2015 Flutter diumumkan.

Bahasa Dart

Bahasa Dart ini menurut saya cukup normal, tidak memiliki konsep yang sangat aneh. Menurut saya ini bagus karena beralih dari berbagai bahasa ke Dart tidak sulit.: “the Dart language aims to be unsurprising“. Contoh sederhana hello world seperti ini:

main()
{
       print("hello world");
}

Berbagai konstruksi standar bahasa Dart mirip dengan bahaca lain yang C-like. Misalnya:

  • komentar seperti C/C++: /*block comment*/ dan //line comment
  • sintaks if adalah: if (x) { /*aksi*/ } else { /*aksi lain*/)
  • sintaks for loop: for (int i=0; i < 10; i++) {/* aksi */}
  • sintaks while loop: while(kondisi) { /*aksi*/} atau do { /*aksi*/} while (kondisi)

Sintaks OOP-nya juga tidak terlalu jauh dari bahasa C++/Java/C#. Berbagai konsep dari bahasa modern, misalnya mixin, nullable type, null safety, named parameter, async, dsb juga ada di Dart. Ringkasannya: beralih dari bahasa lain ke Dart ini cukup mudah.

Flutter

Flutter adalah SDK yang untuk membuat aplikasi GUI di Android, iOS, Windows, Linux, Web dan Google Fuschia dari satu kode Dart. Flutter juga memungkinkan kita melakukan “live editing“, jadi begitu kode diubah dan disimpan, user interface juga langsung terupdate. Flutter ini diklaim mampu menampilkan user interface 120fps dengan mudah.

Setelah beberapa tahun sejak diumumkan, akhir tahun 2018, Flutter versi 1.0 dirilis. Tapi ternyata sampai saat ini menurut saya Flutter masih belum matang. Masih banyak breaking changes yang muncul. Ini artinya kode yang Anda tulis sekarang mungkin tidak jalan di versi berikutnya.

Kebetulan ada proyek yang saya kerjakan yang membolehkan saya menggunakan Flutter. Ini sekedar proyek Proof Of Concept, jadi nanti bisa ditulis ulang ke bahasa lain. Salah satu alasan kenapa sebuah perusahaan memilih atau menolak bahasa atau teknologi tertentu adalah: takut tidak ada yang bisa meneruskan.

Aplikasi yang saya buat sederhana, memanfaatkan kamera dan Firebase Machine Learning (Firebase ML). Firebase ML adalah bagian dari platform Firebase untuk memudahkan pemakaian machine learning di aplikasi mobile. Contohnya: kita bisa mendeteksi sebuah wajah, dan mendeteksi apakah sedang tersenyum.

Hal-hal yang sudah bagus

Bahasa Dart cukup menyenangkan dan mudah dipakai. Seperti tujuan designnya, bahasa ini dirancang agar tidak mengejutkan dan menurut saya cukup berhasil. Saya tidak punya keluhan khusus di bahasa Dart-nya sendiri.

Flutter sudah didukung oleh Visual Studio Code dengan baik. Instruksi untuk mulai menggunakan Flutter sangat jelas dan saya bisa membuat Hello World dengan cepat. Untuk target Android, Android Studio juga sudah mendukung Flutter dengan baik. Ada tool command line “flutter doctor” yang bisa membantu mendeteksi beberapa masalah dasar.

Library Dart masih sedikit

Beberapa bahasa dianggap terbaik untuk teknologi tertentu karena ketersediaan librarynya. Contoh: Python dianggap terbaik untuk Machine Learning karena sudah ada banyak library Machine Learning tersedia. Jumlah library Dart/Flutter masih sedikit dibandingkan bahasa lain. Library Dart adalah library yang terpakai untuk Dart dan Flutter, sedangkan library Flutter untuk Flutter saja.

Jika dilihat sekilas, memang sepertinya banyak library Dart/Flutter sudah ada, tapi baru terasa ketika membangun aplikasi tertentu. Kadang librarynya sudah ada, tapi fungsi tertentu tidak tersedia.

Kadang sebuah library hanya berjalan untuk versi OS tertentu saja. Plugin resmi juga sifatnya sebagian masih beta, misalnya WebView dan In App Purchase. Kadang library memiliki bug yang lama belum diperbaiki, misalnya di iOS camera memiliki memory leak sejak 2018.

Perlu dicatat bahwa untuk berbagai aplikasi sederhana, library yang tersedia sudah cukup. Aplikasi yang sekedar memakai form yang tidak terlalu kompleks, mengirim data ke web mudah dibuat dan bisa dibuat lebih cepat dibandingkan memakai teknologi lain.

Flutter Masih berkembang

Sistem plugin flutter untuk Android belum lama ini diupdate (Desember 2019), jadi beberapa plugin versi lama tidak berjalan atau memiliki warning. Untuk yang masih berjalanpun, tidak cepat updatenya ke versi terbaru. Saya juga sempat mendapati masalah dengan contoh dari github yang ternyata masih memakai versi plugin lama dan dicampur dengan plugin lain yang memakai library baru.

Semoga saja tidak ada update penting lagi dari Flutter/Dart, karena jika sering ada update maka semakin banyak plugin yang tidak berjalan. Secara umum ini adalah masalah teknologi baru: masih banyak perubahan yang membuat kode lama menjadi tidak berjalan.

Dart kurang cepat

Dibandingkan C, Dart masih puluhan kali atau ratusan kali lebih lambat lebih lambat. Contohnya jika kita ingin memproses gambar dalam Dart, hasilnya akan butuh beberapa detik. Jadi untuk pemrosesan tingkat rendah, sebaiknya memakai plugin atau kode dalam bahasa C.

Dalam kasus aplikasi kecil saya: stream data dari kamera formatnya adalah YUV, sedangkan image library untuk mengencode JPG/PNG perlu input dalam format RGB. Sudah ada yang memberikan kode ini dalam Dart, tapi memproses jutaan piksel ternyata lambat. Supaya cepat, kita harus memanggil kode dalam C.

Komentar: https://github.com/flutter/flutter/issues/26348#issuecomment-617266911

Ini kasus yang nyata dan penting. Contohnya adalah Issue ini di github yang masih aktif dari awal tahun hingga saat ini: https://github.com/flutter/flutter/issues/26348. Untuk pemrosesan di sisi server yang tidak butuh interaktif, 4 detik mungkin cepat, tapi jika tiap kali mengambil foto kamera berhenti selama 4 detik, maka ini akan membuat pengguna kesal.

Foreign Function Interface (FFI) di Dart masih Beta

Jika sebuah bahasa tidak memiliki library atau fitur untuk melakukan sesuatu, maka biasanya kita perlu memakai library dari bahasa lain. Ada banyak cara untuk melakukan ini, misalnya dengan plugin, tapi cara lain adalah dengan FFI (foreign function interface). Intinya kita ingin menulis dalam bahasa tertentu (biasanya C) lalu dipanggil langsung dengan Dart. FFI ini juga kadang dipakai jika Dart terlalu lambat melakukan hal tertentu.

Masalahnya fitur FFI di Dart masih beta, dan tidak bisa dipakai di Dart rilis stabil terbaru. Dalam kasus github yang saya sebutkan sebelumnya: proses yang lambat (butuh beberapa detik dalam dart) bisa selesai dalam hitungan miliseconds di C. Selain itu masih ada kemungkinan berubah:

As of Dart 2.7, dart:ffi is in beta, and breaking API changes might still happen. If you’re developing a Flutter app, you can get access to dart:ffi by using the Flutter dev channel, as described in the Flutter dart:ffi page.

https://dart.dev/guides/libraries/c-interop

Digabungkan dengan beberapa hal di atas, ini jadi masalah yang cukup serius:

  • Ingin memakai plugin tertentu: ternyata belum ada atau belum diupdate
  • Ingin diimplementasikan dalam Dart, tapi ternyata tidak cukup cepat
  • Ingin memakai kode C: tapi FFI tidak bisa jika tidak memakai versi beta

Library kurang cepat diupdate

Saya berharap library Firebase dari Google untuk Flutter cepat diupdate karena Firebase ini adalah produk Google dan Flutter juga produk Google, tapi ternyata tidak demikian. Flutter ini masih dinomorduakan oleh Google dibandingkan yang lain.

Di awal Juni 2020 Ada update Firebase untuk memisahkan bagian AI offline dari yang online di Firebase, tapi sampai saat ini (akhir Juni) belum juga library flutter di update setelah hampir sebulan.

Penutup

Saya berharap Google lebih memperhatikan Flutter lagi. Untuk sistem operasi Google Fuschia, Google akan perlu bahasa yang cocok untuk development aplikasi GUI. Bahasa Go kurang cocok karena sifatnya yang harus dikompilasi (walau kompilasi cukup cepat), sedangkan Google selalu memliki masalah dengan lisensi Java dengan Oracle (dan Kotlin masih sangat erat dengan Java).

Untuk pengembangan cross platform, masih banyak teknologi cross platform lain yang lebih matang (seperti misalnya React Native atau bahkan Cordova). Tapi Flutter ini menurut saya sangat menarik dan developmentnya cukup fun. Jika perkembangannya lancar, mungkin ini bisa jadi bahasa pilihan untuk pembuatan aplikasi GUI.