[]

react-native uygulama, kötü mimari

bir mobile app geliştiriyoruz.
her şeyi neredeyse sınırsız isteyen bi patronumuz var.

çok detay vermeyim ama temelde uygulama; google maps, goodreads, imdb karışımı bir şey. kitap, film ve yerleri listenize ekliyor, arkadaşlar ediniyor ve kütüphanenize fotoğraf ekleyip paylaşabiliyorsunuz. uygulamanın birincil amacı bir "hayat kütüphanesi ve günlük" oluşturmak.

uygulama normal ve insani kullanımlarda gayet güzel ama bizim patronun hesabında hep sorunlu. çünkü adamın 10binden fazla koleksiyonu, 10binden fazla fotoğrafı, yüzlerce fotoğraf albümü, 5bin arkadaşı var. aşırı aktif kullanıyor ve sık sık bellek yetersiz sorunları ya da kasmalar yaşıyor. hergün onlarca yeni fotoğraf, arkadaş ve koleksiyon ekliyor ve biz sürekli geliştirmeler yapıyoruz.

uygulama native ios değil, react-native.
sqlite ve recoil kullanıyoruz bellek yönetimi için. resme yazı ekleyim, arkadaş etiketleyim, bunu beğeneyim şuna reaksiyon atayım gibi bir sürü fasilite var klasik sosyal medyalardaki. eksik bir şeyimiz yok.

her eylemde ilgili recoil de sqlite de güncelleniyor çünkü app'te bir bütünlük olsun. örneğin yüklediğim resme akıştan, kendi albümümden, X kişisine gönderdiğim chat mesajından, koleksiyondaki yorumlar bölümünden muhtelif bir çok yerden erişebildiğimiz için dataların recoil üzerinden gelmesi ve otomatik güncellenmesi gerekiyor.

"on bin ya da on resim olması neden önemli ki, uygulama açılırken tüm resimleri mi yüklüyorsunuz sanki" diyebilirsiniz. hayır, paginate olarak geliyor datalar ama koleksiyonların tümü yükleniyor ilk açılışta çünkü uygulamanın (temel özelliklerinin) offline çalışması da gerekiyor.

ilk açılışta api'den gelen tüm data bu sorunlu hesapta toplam 20+ mb. paralel çalışan bir çok işlemdeki toplam json data boyutu bu.

merak ediyorum, bu bahsettiğim koşullar altında uygulamanın kasması normal değil mi?

hem ayranım dökülmesin, hem tatsız olaylar yaşanmasın durumu tam olarak.
developer olarak ben ne kadar haklıyım serzenişimde?

 
Normal degil. 10 bin tane fotograf birsey degil. 6-7 mb lik JSON da birsey degil gunumuz telefonlarinin bellek ve islemcilerine gore.
Recoil kullaniminizla ilgili sorun olabilir. Cok fazla atom kullaniyorsunuzdur belki. Verdiginiz kisitli bilgiyle cikarim yapmak cok zor.

Ben olsam Xcode kulaniyorsaniz Instruments kullanip memory nasil kullaniliyor onu olcerdim. Ya da Android Studio kullaniyorsaniz oradaki tool neyse onunla memory i kontrol ederdim. Problem memory i tuketmek gibi gorunuyor. Ya da belki UI da birseyleri yanlis yapiyorsunuz.

Not: React Native Developer degilim iOS Developerim.

Bir de problemi ChatGPT ye sorabilirsin bazen cok yardimci oluyor. Ilgili kodlari gonder ve oneri sor.
  • nuevo  (29.10.24 14:52:27) 
teşekkürler.

çok fazla atom kullandığımız doğru.
recoil ile sorunlarımız olduğunu düşünüyorum. kasmalar ilk etapta değil, bi müddet kullandıktan sonra oluyor. memory kullanımı uygulama kullanıldıkça sürekli artıyor. leak'ler oluşuyor.

edit: tekrar hesapladım 20mb+ 'tan fazla data akışı oluyor açılışta. sql'e ve recoil'e yazılıyor. cihaza göre 8-10 saniyede login işlemi tamamlanıp uygulama hazır oluyor.
  • biseysorcaktim  (29.10.24 14:58:29 ~ 15:06:46) 
Uygulamanin kasmasi kullanici gozunden bakilinca normal degil; cunku insanlar benzer bir uygulama kasmiyorsa diger uygulamalarin da kasmamasi gerek diye bakiyorlar. Arkada donen islerin, harcanan emegin, vs. kullanici nezdinde hicbir degeri yok. Yasadiginiz problemlerin ne kadari React ile ilgili, bunu da dusunebilirsiniz. Backend tarafinda oldugum icin baska tavsiye veremiyorum.


  • chickentown  (29.10.24 15:06:08) 
sorunun cevabı; veri yapıları ve algoritmalar, 100 tane kitap, yer için düzgün çalışan uygulama eğer 1000 olunca sıçıyorsa onu yazan elemanın ne veri yapıları ne de algoritmalar ile ilgili bir bilgisi yoktur. bknz: kopyala / yapistır yazılımcısı.

json da veri aktarımı için ideal bir biçim değil.


[
{
"name": "ali"
}
]

sadece ali değerini göndermek için (string, küçük harf ali = 3 byte) 13 extra byte daha gönderiyorsun tamamen gereksiz, kendi verinin ne olduğunu biliyorsun zaten, daha verimli bir encoding biçimi seçebilirsin o 6*7 mb dediğin şey 1MB altına iner.

bir yerlerde memory leak vardır diye tahmin ediyorum, dikkatli kullanılmadığında java script ciddi bellek tüketen bişi, hali hazırda zaten js engine bir bellek ve işlemci yiyor, birde sen üzerine leak edince daha da şişiyor, diğer uygulamaları da etkileyebilir zamanla şişen bellek.

tavsiyem en kısa zamanda veri yapıları ve algoritmalar konusunda hem kendini hemde takım arkadaşlarınla beraber kendinizi eğitmeniz, needcode bu konuda oldukça yardımcı oluyor.

basit veri tabanlarının (boltdb, sqlite vs. ) klonlarını yazarak o işler nasıl yapılıyor o veri yapıları nasıl, nerede, ne için kullanılıyor anlayabilirsiniz.

ben kendi yazdığım kimi uygulamalarda düz hashmap/map kullanmak yerine kendi hashmap'imi yazıyorum, e dilde yok mu bu? elbette var, ancak dilin size sunduğu kolaylıklar geniş bir alana hitap etmek için var, sonrasında siz kendi yapılarınızı oluşturursanız veriminiz artıyor bu maliyet düşüşü ve karlılık demek.
  • selam  (29.10.24 15:07:40 ~ 15:14:14) 
kullanıcı olarak kasma normal değil, bu konuda hemfikiriz.

ben kendi yazılım yaklaşımımızı hatalı buluyorum. native bi uygulama değil sonuçta, limitleri daha fazla. mimarimiz de hatalı.

kullanıcıların çoğunun hesap büyüklüğü çok daha az ve bu büyüklüğe ulaşmaları neredeyse mümkün değil.
  • biseysorcaktim  (29.10.24 15:09:22) 
Offline çalışmasın gerektiği kadar alsın derim. Ya da ilk başta ölmeyecek kadar veri alsın, arayüz açılsın, sonra arkaplanda offline çalışması için gerekli veriler yavaş yavaş gelsin.


  • Tisatiaşer  (29.10.24 20:34:07) 
Kullanıcıların çoğunun karşılaşmayacağı bir problem diyorsunuz; yüzde kaçının? %1 diyelim, uygulamayı en çok kullanan, uygulamaya en çok değer veren %1 kullanıcı-ki para kazanılacaksa da bu kişilerden kazanılacak- uygulamanızda çok kötü bir deneyim yaşıyor. bu kabul edilebilir bir şey mi sizce?

good enough yapıp geçelim demek istediğinizi anlıyorum ama burası orası değil. bu yaklaşımı yapmanız gereken yerler oluyor ve olacak elbette ama burada şartları suçluyorsunuz sanki, halbuki çözüm var. kaçmayın, başarı hikayesi yaratın.
  • montreal  (30.10.24 05:12:14 ~ 05:14:56) 
1
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler angelus, Artibir, aychovsky, baba jo, basond, compumaster, deckard, duyulmasi gerektigi kadar, fader, fraise, groove salad, kahvegibi, kaymaktutmayansicaksut, kibritsuyu, monstro, pandispanya, robin, ron dennis
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır. Skimlinks ile linkler üzerinden yönlendirme payı alınmaktadır.