16 poin oleh xguru 2024-12-23 | Belum ada komentar. | Bagikan ke WhatsApp
  • Meta sedang mengalihkan codebase Android dari Java ke Kotlin melalui proyek yang telah berjalan selama beberapa tahun
  • Saat ini Meta mengelola salah satu codebase Android terbesar di dunia, dan telah berhasil mengonversi lebih dari setengahnya ke Kotlin
    • Meta mengadopsi strategi pengembangan Kotlin-first sejak 2020
  • Alasan mengonversi seluruh kode:
    • Untuk memaksimalkan manfaat Kotlin dalam "peningkatan produktivitas" dan "keamanan null", Meta memutuskan untuk mengonversi bahkan puluhan juta baris kode Java yang sudah ada
    • Memperkuat keamanan null dan menyelesaikan masalah codebase campuran
      • Kompilasi campuran (kompilasi Java dan Kotlin secara bersamaan) membuat kecepatan build menjadi paling lambat
      • Kode Java yang tersisa memicu masalah keamanan null: kode Java yang tidak null-safe menjadi penyebab potensial NullPointerException (NPE) dalam dependency graph
      • Kotlin menjamin keamanan null melalui verifikasi saat runtime

Proses otomatisasi

  • Pada awalnya, mereka berulang kali menjalankan alat konversi J2K di IDE Intellij
    • Pada codebase skala besar milik Meta, ini membutuhkan lebih dari 100.000 klik, dan tiap eksekusi memakan waktu beberapa menit
    • Akibatnya, cara ini tidak efisien karena kurang skalabel
  • Mereka mengembangkan alat otomatisasi: Kotlinator
  • Proses konversi 6 tahap
    1. Deep Build: membangun kode yang akan dikonversi agar IDE dapat menyelesaikan semua simbol. Termasuk dependency pihak ketiga dan generated code
    2. Preprocessing: berbasis alat kustom Meta Editus. Mencakup sekitar 50 tahap seperti penanganan keamanan null dan dependensi, serta workaround untuk J2K
    3. Headless J2K: memodifikasi J2K agar bisa dijalankan di lingkungan server
    4. Postprocessing: sekitar 150 tahap seperti perubahan khusus Android, keamanan null, dan penerapan gaya Kotlin
    5. Linters: peningkatan kualitas konversi secara berkelanjutan melalui perbaikan otomatis
    6. Build Error-based Fixes: menganalisis error build lalu menerapkan perbaikan tambahan

Menjadikan J2K berjalan secara headless

  • Memodifikasi J2K agar dapat dijalankan dari jarak jauh:
    • J2K sangat terikat dengan IDE Intellij sehingga sulit dijalankan secara mandiri
    • Awalnya mereka mempertimbangkan menjalankannya lewat lingkungan pengujian Intellij, tetapi setelah berdiskusi dengan pakar J2K dari JetBrains (Ilya Kirillov), mereka beralih ke pendekatan inspeksi headless
    • Mereka membuat plugin Intellij dengan memperluas kelas ApplicationStarter, lalu mengimplementasikannya dengan memanggil kelas JavaToKotlinConverter milik J2K
  • Keunggulan pendekatan headless
    • Menyelesaikan masalah IDE lokal: developer dapat bekerja tanpa harus menekan tombol di IDE secara langsung
    • Mengonversi banyak file sekaligus: pemrosesan file dalam skala besar menjadi memungkinkan
    • Mengurangi waktu yang dikonsumsi: waktu konversi itu sendiri memang meningkat menjadi sekitar 30 menit, tetapi waktu yang dihabiskan developer berkurang drastis
    • Mendukung build dan perbaikan error: tahap kerja yang memakan waktu namun berguna (perbaikan setelah build) bisa dijalankan otomatis dari jarak jauh
  • Otomatisasi dan code review
    • Dengan memanfaatkan sistem internal Meta, mereka membuat pekerjaan batch harian:
    • Membuat diffs secara batch berdasarkan kriteria kustom (versi pull request milik Meta)
    • Secara otomatis menetapkan reviewer dan menjalankan pengujian serta verifikasi, lalu pada akhirnya menerapkan diff yang telah disetujui
  • Menyediakan web UI: developer dapat memicu konversi file atau modul tertentu dari jarak jauh
  • Menentukan urutan konversi
    • Mereka tidak memaksakan urutan tertentu:
      • Memprioritaskan file yang sedang aktif dikembangkan
      • Kotlinator secara otomatis menangani dependency graph untuk menyelesaikan masalah kompatibilitas pada file eksternal
      • Contoh: secara otomatis memperbarui foo.getName() menjadi foo.name

Lainnya

  • Menambahkan tahap preprocessing kustom (Java->Java) dan postprocessing (Kotlin->Kotlin)
  • Meningkatkan kualitas konversi dengan memanfaatkan alat internal Meta, Editus, dan library PSI dari JetBrains
  • Nullsafe dan NullAway

Kondisi saat ini dan masa depan konversi Kotlin

  • Lebih dari setengah kode Android Java di Meta telah selesai dikonversi ke Kotlin (atau sebagian kode telah dihapus)
  • Namun, setengah yang mudah sudah selesai:
    • Pekerjaan yang tersisa bersifat kompleks dan skalanya besar
    • Untuk konversi yang dapat diotomatisasi sepenuhnya, mereka perlu menambahkan tahap kustom atau berkontribusi pada perbaikan J2K
    • Untuk konversi semi-otomatis, targetnya adalah deployment yang mulus dan aman lewat peningkatan Kotlinator
  • Mereka menilai perusahaan lain juga kemungkinan menghadapi masalah serupa dalam konversi kode Android
  • Meta membagikan solusi yang diperoleh melalui peningkatan alat konversi dan proses optimasi
  • Usulan kolaborasi:
    • Berdiskusi dengan developer lain di kanal #j2k di Kotlinlang Slack
    • Dengan berbagi kasus dan solusi masing-masing, pengalaman konversi yang lebih baik dapat dibangun bersama

Belum ada komentar.

Belum ada komentar.