- 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
- Deep Build: membangun kode yang akan dikonversi agar IDE dapat menyelesaikan semua simbol. Termasuk dependency pihak ketiga dan generated code
- Preprocessing: berbasis alat kustom Meta Editus. Mencakup sekitar 50 tahap seperti penanganan keamanan null dan dependensi, serta workaround untuk J2K
- Headless J2K: memodifikasi J2K agar bisa dijalankan di lingkungan server
- Postprocessing: sekitar 150 tahap seperti perubahan khusus Android, keamanan null, dan penerapan gaya Kotlin
- Linters: peningkatan kualitas konversi secara berkelanjutan melalui perbaikan otomatis
- 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.