Airbnb Engineering: Sunsetting React Native

https://medium.com/airbnb-engineering/sunsetting-react-native-1868ba28e30a

Meskipun enggak terlalu kaget, tapi heran aja tentang ini. Seperti yang kita tau, Airbnb banyak berkontribusi di React ecosystem, dan ya di React Native juga. Open Source library yang Airbnb buat (salah satunya) untuk ekosistem React Native yang paling keren menurut gue adalah Lottie, sebuah library yang berguna untuk memparsing animasi Adobe After Effects, meng-export nya menjadi JSON (menggunakan Bodymovin), dan merendernya SECARA NATIVE di mobile.

Perlu di ingat, kita bukan Airbnb. Dan kita tidak memiliki masalah yang sama seperti Airbnb. Mengikuti apa yang dilakukan oleh Airbnb bukan berarti bisa menyelesaikan masalah yang sama seperti apa yang dilakukan oleh Airbnb. Tapi dari tulisan tersebut kita bisa mengambil pelajaran, dan bisa menjadi panduan untuk developer seperti kita.

Hybrid Apps Are Hard

The path of a world that is 100% native or 100% React Native is relatively straightforward. However, once you have a mix within your codebase, many new issues arise. How do you split up your teams? How do teams collaborate? How do you share state across your app? How do you ensure that things get tested? How do engineers effectively debug across three platforms? How do you decide what platform to use for a new feature? How do you hire and allocate resources across your organization? These are all problems with non-trivial solutions that will inevitably arise if you go down this path.

https://medium.com/airbnb-engineering/building-a-cross-platform-mobile-team-3e1837b40a88

Ya, benar sekali. Semakin besar codebase yang kita punya, semakin besar tim yang ada, semakin besar peluang masalah yang muncul. Setiap devices memiliki API dan limitasi nya sendiri, dan sudah jelas memiliki arsitektur yang berbeda-beda.

Semua tergantung dengan tujuan kita masing-masing, tujuan lo membuat aplikasi cross-platform dengan cepat dan hanya memiliki tim yang kecil? Use React Native. If not, think about using the native. Menurut gue Airbnb ini always bet in JS, ketika JavaScript tidak menyelesaikan masalah yang mereka miliki sekarang, yaa mereka pun mengambil langkah seperti sekarang ini. 2016 merupakan waktu yang lama sampai hari ini, kebayang bagaimana effort mereka selama 2 tahun dalam mengembangkan aplikasi mereka menggunakan React Native?

Banyak alasan dari Airbnb mengapa mereka memilih menggunakan native, khususnya bisa dibaca di Section Failing to Reach Our Goals.

Dan jika dilihat dari section What didn’t work well di series tentang Teknologi, seperti masalah klasik yang sudah bukan menjadi rahasia umum lagi: Initial render time, App Size, dan Initialization time. Mengapa ini terjadi? Lihat arsitektur React Native

Gambar diambil dari: https://speakerdeck.com/reactamsterdam/tadeu-zagallo-facebook-london-react-native-architecture-overview?slide=8. Untuk ingin tau lebih tepat nya (dan lebih jelas nya), silahkan lihat Deck tersebut. Spoiler nya: Load the JavaScript Bundle > Load the Native Modules > Start the JavaScript VM. Inilah mengapa memiliki initialization app yang lama (sebelum RN merender untuk pertama kalinya, sebelumnya harus menginisialisasi runtime nya dulu), initial render time dan ehm, di main thread (yang di spoiler tersebut), dan App size yang lumayan besar (because there is no HTML, CSS, and WebView. Beruntung iOS ada JavaScript core framework)

Kesimpulan?

Setiap orang memiliki goals nya masing-masing, dan masalah disini tergantung dengan goals yang lo punya. Masalah lo ada di leaning (less hire, less burn money)? Hire React Native developer. Goals lo ada di “Prototype Faster”? Hire React Native developer.

Tapi kalau masalah lo misalnya nih ya ada di Size app bundle (banyak user yang protes dengan ukuran yang besar, btw like what I did to Twitter iOS App, and now I’m using 3rd party app. 183.7MB vs 19.1 MB. PWA pun belum menjadi solusi khususnya untuk ranah iOS).

Atau ada di masalah Separation of concern, maksudnya antar sistem operasi. Isomorphic rendering di web tidak memiliki masalah besar, mengingat “masih sama-sama” dijalankan diatas JavaScript, tapi bagaimana dengan native-hybrid apps? Yang ingin dieksekusi secara “native”, menggunakan “almost one codebase”, dan dijalankan di “dua sistem operasi” yang berbeda. Yang memiliki API berbeda, arsitektur berbeda, framework berbeda?

Finally, gue bukan (dan enggak kerja di Airbnb), dan gue bukan maintainer React Native, React, ataupun developer di Facebook. Gue enggak punya masalah seperti mereka, dan gue cukup menulis kode JavaScript di web. Ryan Dahl pembuat NodeJS membuat deno, it’s experimental but it’s a secure TypeScript runtime on v8, and looks very promising, terlebih sudah banyak backend yang ditenagai oleh NodeJS.

Dalam pandangan gue (sebagai developer), be native, be expert. Gue paling benci dengan Jack of all trades yang master of none, karena gue ingin menjadi spesialis dibanding generalis. Ahli dalam satu hal.

Masih banyak company yang hiring “platform-focused” developer: iOS Developer dan Android Developer. Yang hiring React Native developer pun banyak, dan bet with me pasti requirement nya ada “tau tentang Swift/Objective-C untuk iOS dan tau tentang Java/Kotlin untuk Android”.

Untuk company, define your problem. Membuat produk “mobile-focused”? Budget terbatas? Ingin prototype-faster fokus ke market terlebih dahulu baru ke teknologi? Hire React Native Developer. Biasanya Senior Frontend Engineer yang antusias dengan mobile app technology. Hire RN Developer enggak semahal hire iOS Developer (dan atau) hire Android Developer secara bersamaan, dan untuk membuat versi web nya pun enggak terlalu susah, mengingat ada library bernama react-native-web dan react-native-dom.

Solve your own problem, and take your own risk.