Şarj Asistanı'nı geliştirirken erken bir karar vermemiz gerekti: iOS ve Android'i ayrı ayrı mı yazacağız, yoksa cross-platform bir yol mu tutacağız? İki kişilik bir ekiptik ve iki ayrı codebase'i döndürecek lüksümüz yoktu, o yüzden cevap kendiliğinden ortaya çıktı. React Native'i seçtik, çünkü zaten JavaScript ve React biliyorduk; sıfırdan yeni bir dil öğrenmek aylarımızı götürürdü. Tek derdimiz mümkün olan en kısa sürede yayına çıkmaktı ve çıktık: altı hafta içinde her iki store'da birden.
Elbette her şey yolunda gitmedi. Şarj Asistanı bir harita uygulaması olduğu için harita performansı en kritik konumuzdu ve haritaya yüzlerce pin eklediğimizde performans tamamen çöktü. iOS'ta akıcı çalışan harita Android'de gözle görülür şekilde takılıyordu. Çözümü, pin'leri cluster'lamakta ve görünür alanın dışında kalanları ekrandan atmakta bulduk. Haftalarımızı aldı ama sonunda iki platformda da akıcı hale geldi. Push notification ve background location gibi özellikler için ister istemez native koda inmek zorunda kaldık; "write once, run everywhere" vaadinin biraz çatladığı yer tam da burası. Biz aramızda buna "write once, debug twice" diyorduk. Yine de native tarafla uğraştığımız kısım toplam kodun %15'ini geçmedi.
Kazancımız ise oldukça net oldu. Tek codebase sayesinde kabaca %40 zaman kazandık, kodun %85'ini iki platform arasında paylaştık ve bugüne kadar kullanıcılardan tek bir performans şikayeti almadık. Bir bug'ı bir kez düzeltince iki platformda birden kapanıyor, bir özelliği bir kez yazınca ikisine birden çıkıyor. Native kadar hızlı olmadığını rahatlıkla kabul ediyorum, ama kullanıcının fark edeceği kadar da yavaş değil.
Bu deneyimden sonra React Native mi Flutter mı tartışmasına girmenin pek anlamı olmadığını düşünüyorum. Ekibiniz neyi iyi biliyorsa onu seçin; framework günün sonunda bir araç, varmak istediğiniz yerin kendisi değil. Asıl mesele yayına çıkabilmek. Optimizasyonu çıktıktan sonra da yapabilirsiniz, ama hiç çıkamazsanız ortada optimize edilecek bir şey de kalmaz.