17 poin oleh xguru 2022-11-04 | 4 komentar | Bagikan ke WhatsApp
  • Repo Android Meta adalah repositori raksasa yang mencakup Facebook, Instagram, Messenger, Quest, dan lainnya
  • Saat ini sudah mencakup lebih dari sekitar 10 juta baris kode Kotlin

Alasan beralih ke Kotlin

  • Selain popularitasnya, ada beberapa keunggulan utama
    • Nullability: NPE adalah masalah umum di Meta sehingga sudah ada berbagai upaya penanganan, tetapi penanganan nullability bawaan Kotlin jauh lebih kuat dan lebih mudah dikerjakan
    • Pemrograman fungsional: fungsi inline dan ekspresi lambda di Kotlin memungkinkan penerapan gaya FP tanpa penurunan kecepatan eksekusi
    • Kode yang lebih singkat
    • DSL / Type-safe Builder
  • Tentu ada juga beberapa kekurangan yang tidak bisa diabaikan
    • Mengadopsi bahasa lain berarti harus mempertahankan codebase campuran cukup lama
    • Kotlin memang populer, tetapi tingkat popularitasnya masih ada jarak dibanding Java. Karena itu, jumlah tool lebih sedikit, dan banyak tool Kotlin harus mempertimbangkan interoperabilitas Kotlin & Java sehingga implementasinya menjadi rumit
  • Kekhawatiran terbesar adalah waktu build. Sejak awal sudah diketahui bahwa waktu build Kotlin bisa lebih lambat daripada Java. Waktu build yang lambat tidak baik untuk pengalaman developer

Cara mereka mendekati migrasi

  • Migrasi ke Kotlin ternyata sekaligus sangat mudah dan sangat kompleks
  • Adanya J2K(Java To Kotlin Converter) memang membantu, tetapi tetap rumit
    • J2K tidak selalu akurat, dan interoperabilitas antara Java dan Kotlin menciptakan beberapa kasus ekstrem
  • Ada dua opsi untuk migrasi
    • Hanya menulis kode baru dengan Kotlin dan membiarkan sebagian besar kode tetap di Java
      • Kelebihannya adalah pekerjaan lebih sedikit, tetapi karena dua bahasa bercampur, Kotlin akan memakai platform type, yang dapat menyebabkan dereferensi null pointer dan memicu crash.
        Selain itu, ada juga isu seperti Java tidak bisa memberi tag type parameter sebagai Nullable (setidaknya sampai baru-baru ini), dan aturan overloading Kotlin mempertimbangkan boleh-tidaknya null sementara aturan overloading Java tidak
    • Mencoba mengonversi semua kode in-house ke Kotlin

Cara migrasi dilakukan

  • Setelah mempertimbangkan kedua opsi, mereka memutuskan untuk menargetkan konversi semua kode ke Kotlin
    • Awalnya agak lambat, tetapi setelah beberapa blocker diselesaikan, konversi dalam skala besar menjadi memungkinkan
    • Saat ini aplikasi Android Facebook, Messenger, dan Instagram masing-masing sudah mencakup 1 juta baris kode Kotlin, dan rasio konversinya terus meningkat
    • Saat ini seluruh codebase Android memiliki 10 juta baris kode Kotlin

Unblocking

  • Saat mulai konversi, muncul beberapa isu
    • Perlu memperbarui Redex karena pola bytecode
    • Beberapa library internal melakukan bytecode transforming demi performa, dan ini tidak bekerja di Kotlin
    • Jika sebelumnya sudah banyak melakukan optimisasi internal, kemungkinan akan muncul isu serupa
  • Tool yang sudah ada juga mengalami masalah
    • Karena code review/wiki dan lainnya belum mendukung penyorotan sintaks Kotlin, mereka memperbarui Pygments
    • Mereka juga mengembangkan formatter Kotlin, Ktfmt, secara terpisah

Mempercepat migrasi

  • Setelah tool siap, mereka bisa mulai menyiapkan konversi kode ke Kotlin
  • Namun, setiap migrasi masih memerlukan banyak boilerplate yang harus dikerjakan secara manual
  • J2K adalah tool umum sehingga tidak memahami konteks kode. Karena itu, banyak pekerjaan manual tetap diperlukan
    • Contohnya aturan testing JUnit
  • Karena itu, J2K ditempatkan di tengah pipeline 3 tahap
    • Pertama, mengambil satu package Java dan menyiapkannya agar siap dikonversi ke Kotlin. Ini mencakup perbaikan bug dan konversi yang dibutuhkan tool internal
    • Kedua, menjalankan J2K secara otomatis lewat skrip
    • Ketiga, melakukan post-processing pada file Kotlin baru. Ini yang paling penting. Refactoring otomatis/linter dan lainnya dijalankan dalam mode headless
  • Otomatisasi tidak bisa menyelesaikan semua masalah, tetapi hal-hal umum diprioritaskan terlebih dahulu

Hal yang dipelajari dari migrasi Kotlin

  • Panjang kode berkurang
  • Kecepatan eksekusi tetap terjaga
  • Ukuran build bukan masalah
  • Masalah waktu build yang lebih lama terselesaikan: menggunakan KSP(Kotlin Symbol Processing API)

4 komentar

 
sungeuns 2022-11-04

Terima kasih sudah membagikan tulisan yang bagus. Secara pribadi, saat pertama kali memakai Kotlin, ada banyak hal yang terasa lebih nyaman dibanding Java sehingga saya menyukainya dan sempat berpikir bahwa ke depannya Kotlin akan menjadi arus utama, tetapi setelah dipakai lebih lama ternyata ada cukup banyak bagian yang masih terasa lebih baik di Java.

  • Bahasa itu sendiri menurut saya Kotlin jelas lebih nyaman
  • Dibandingkan ecosystem Java dan banyaknya materi troubleshooting, Kotlin masih agak kurang di beberapa bagian.
  • Tergantung versi JDK atau versi Kotlin, ada cukup banyak bug atau isu yang muncul padahal kalau hanya memakai Java mungkin tidak akan mengalaminya.
    Menurut saya Android tidak masalah jika beralih ke Kotlin, tetapi di lingkungan lain (seperti Spring, dll.) jika stabilitas itu penting, untuk saat ini Java masih tampak sebagai pilihan yang lebih baik.
 
roxie 2022-11-05

Bisakah Anda memberi tahu satu contoh kasus terkait stabilitas? Pengalaman saya masih sedikit jadi saya belum pernah menemui kasus seperti itu, dan saya sangat penasaran.

 
ganadist 2022-11-06

Mungkin karena JetBrains merilis update sangat sering, tetapi jumlah perbaikan bug kompiler ternyata cukup banyak.
https://github.com/JetBrains/kotlin/releases/tag/v1.7.20

Kadang kompiler itu sendiri juga bisa crash (meski ini masih lumayan aman karena terjadi sebelum rilis), dan bug juga cukup sering ikut masuk ke hasil build.

Selain itu, untuk Android, R8 bytecode optimiser juga pilih-pilih versi Kotlin.
Soalnya ada fitur optimisasi khusus untuk kode Kotlin, tetapi tidak ada dokumentasi tabel kompatibilitas resmi untuk ini (Android Gradle Plugin : Kotlin Version)..
Jadi, saat mengganti versi Kotlin di proyek Android, kita memang harus hati-hati;;;

Laporan bug terkait: https://issuetracker.google.com/issues/207397158

 
roxie 2022-11-06

Terima kasih. Ternyata ada dunia yang luas dan mendalam..