Bir uygulama gerçekte nasıl çalışır
Uygulama, cihazın kendisine kurulan, arayüzü ve mantığı o cihazda çalışan ve her yeni veri için bir sunucuyla konuşan bir programdır. Kullanıcının yavaş uygulama dediği şeyin çoğu, telefondaki kodda değil, sunucuyla yapılan o konuşmanın içinde olur.
- Ders 1 / 8
- Başlangıç
- Ücretsiz, kayıt yok
Bir uygulamanın beş katmanı ve her kararın üzerinde alındığı sınır
- Kullanıcı arayüzüKullanıcının gördüğü tek katman ve bozulduğunda birinin size söylediği tek katman.
- Uygulama mantığıHer dokunuşun ne yapacağına ve gereken verinin cihazda mı olduğuna yoksa istenmesi mi gerektiğine karar verir.
- API sözleşmesiAsıl sınır. Üstü tek bir cihaza aittir, altı bütün kullanıcılar arasında ortaktır.
- Arka uçKullanıcının cihazında bulunmaması gereken mantığın yeri: fiyat, stok, yetki, ödeme.
- VeritabanıŞeyleri saklar. Kullanıcı onunla asla doğrudan konuşmaz ve konuşabilmemelidir.
Bu katmanlama bir öğrenme sırasıdır, standart değil; adlar ekipten ekibe değişir. Üstteki iki katman telefonda, alttaki üçü sunucudadır.
Son kontrol: Bu dersteki bilgiler ve araç adları bu tarihte kaynaklarıyla yeniden doğrulanır.
Bir düğmeye dokunduğunuzda ne olur?
Tek bir dokunuş art arda dört iş başlatır. Önce arayüz kodu ekranın neresine dokunulduğunu ve bu dokunuşun hangi düğmeye ait olduğunu çözer. Sonra uygulama mantığı bu düğmenin hangi veriye ihtiyacı olduğuna ve verinin o an cihazda bulunup bulunmadığına karar verir. Yoksa bir HTTPS isteği sunucuya gider. En sonunda geri gelen şey ekrana dönüşür.
Bu dördünün üçü saniyenin binde birkaçında biter. Üçüncüsü bitmez. Sunucuya gidiş dönüş neredeyse her zaman en uzun bölümdür ve bir kez kendiniz ölçtüğünüzde bir daha unutmazsınız. Bu komut, tam da bu sitenin API sine tek bir istek gönderir ve aşamalarını ayrı ayrı yazdırır:
curl -s -o /dev/null -w 'dns=%{time_namelookup} tls=%{time_appconnect} first_byte=%{time_starttransfer} bytes=%{size_download}\n' "https://rgb.ir/wp-json/wp/v2/posts?per_page=1&_fields=id,title,link,date"Art arda üç kez çalıştırdık. Alan adının çözülmesi saniyenin 1,4 ile 4,2 binde biri arasında sürdü, güvenli TLS el sıkışması 31 ile 49 binde bir arasında tamamlandı ve yanıtın ilk baytı 167 ile 194 binde bir arasında geldi. Geri gelen her şey 353 bayttı. Birkaç saat sonra aynı komutu yeniden aldık ve bu kez ilk bayt 180 ile 251 binde bir arasında geldi, yanıtın boyutu ise tam olarak 353 bayt kaldı. Akılda tutulmaya değer sayı 353, süreler değil.
Oranlara bakın. Güvenli bağlantıyı kurmak zamanın yaklaşık dörtte birini aldı, geri kalanı sunucunun yanıtı hazırlamak için harcadığı süredir. Bunların hepsi boyunca uygulama beklemekten başka hiçbir şey yapmadı. Kullanıcının programın yavaş olduğunu söylediği ve geliştiricinin arayüz iyileştirmesi aramaya gittiği yer tam burasıdır.

Tek bir dokunuşun yolu ve zamanın gittiği yer
-
1
Ekrana dokunulur
Arayüz dokunuşun nereye düştüğünü ve hangi düğmeye ait olduğunu çözer.
-
2
Mantık karar verir
Gereken veri cihazda mı? Öyleyse iş tam burada biter.
-
3
HTTPS isteği
Zaman gerçekten burada harcanır. Güvenli el sıkışma da bu adımın parçasıdır.
-
4
Sunucu yanıtı kurar
API yanıtları önbelleğe alınmaz, yani her dokunuş sunucuda tam bir çalıştırmadır.
-
5
Ekran yeniden çizilir
Yanıt ne kadar hafifse bu adım o kadar kısadır, ucuz bir telefonda bile.
Tam da bu sitede üçüncü adım ilk baytını saniyenin 167 ile 194 binde biri arasında döndürdü. Diğer üçü birlikte buna ulaşmaz, gerçi zayıf bir telefonda son adım da görünür hale gelir.
Bir uygulama hangi katmanlardan kurulur?
Beş katman ve ikisinin arasına düşen sınır, katmanların kendisinden daha önemli. Kullanıcı arayüzü görülen ve dokunulan şeydir: düğmeler, listeler, formlar. Uygulama mantığı her dokunuşun ne yapacağına ve neyin gösterileceğine karar verir. İkisi de telefonun kendisinde çalışır.
Üçüncü katman API dir: uygulamanın sunucudan hangi adreste ve hangi biçimde veri istediğini, sunucunun da hangi biçimde yanıt verdiğini söyleyen sözleşme. O sözleşmenin öbür yanında arka uç bir sunucuda oturur ve kullanıcının cihazında bulunmaması gereken mantığı çalıştırır: fiyat, stok, yetki, ödeme. Altında da şeyleri saklayan bir veritabanı vardır.
Asıl sınır ikinci ile üçüncü katman arasındadır. Onun üstündeki her şey yalnızca bu tek cihaza aittir; altındaki her şey bütün kullanıcılar arasında ortaktır. Bir uygulama projesinde çıkan bütün zor sorular sonunda tek bir soruya iner: bu iş sınırın üstünde mi yoksa altında mı yapılmalı. Yanıtı yanlış verirseniz müşteri fiyatı kendi telefonunda değiştirir.
Yukarıdaki katmanlama bir öğrenme sırasıdır, standart değil ve adlar ekipten ekibe değişir. Değişmeyen şey o sınırdır.
Native, web ve hibrit üç ayrı şeydir
Bir müşteri uygulama istediğini söylediğinde neredeyse her zaman telefon ekranındaki bir simgeyi kastediyordur. Bu simgeyi size tamamen farklı üç teknoloji verir ve aralarındaki fark ancak ağ kesildiğinde ya da yeni bir sürüm göndermeniz gerektiğinde ortaya çıkar.
Native, o işletim sistemi için derlenen ve bir paket olarak kurulan program demektir. Android in kendi belgeleri bunu tam olarak söylüyor: Android uygulamaları Kotlin, Java ve C++ ile yazılır ve SDK araçları kodu ve kaynakları bir APK ya da App Bundle içinde derler; APK, cihazın uygulamayı kurmak için kullandığı dosyadır, App Bundle ise bir cihaza hiç kurulamaz çünkü kurulum biçimi değil yayın biçimidir. Bu tek cümle ilerleyen zamanda, yayın aşamasında işinize yarar.
Web, tarayıcıda açılan şeydir. Hiçbir şey kurulmaz, güncelleme yayınlandığı anda herkese ulaşır ve telefon donanımına erişim sınırlıdır. PWA ise bunun, MDN in tanımıyla, web platformu teknolojileriyle kurulan ama platforma özgü bir uygulama gibi deneyim veren sürümüdür: bir web sitesi gibi tek kod tabanından birçok platformda çalışır, kurulu bir uygulama gibi de cihaza kurulabilir, çevrimdışı ve arka planda çalışabilir ve cihazla bütünleşebilir.
Hibrit, native bir kabuğun içine paketlenmiş bir web uygulaması demektir. Dışarıdan native görünür, içeriden webdir. Formlar ve içerik için iyi çalışır; ağır animasyon ya da kamera ve sensörlerle sürekli çalışma olan her yerde tavanını gösterir.
Duruşumuz basit: bu üçü arasında seçim yapmak bir teknoloji kararı değil, kullanıcınızın programı kullanırken içinde bulunduğu duruma dair bir karardır. Kapsama alanı olmayan bir depoda çalışan biriyle ofiste wi-fi başında oturan biri iki farklı yanıt alır.
Native ile webin gerçekten ayrıldığı dört yer
-
Kurulur mu açılır mı
Native, kurulan ve simge oluşturan bir pakettir. Web yalnızca bir adreste açılır ve bu, girişteki en düşük sürtünmedir.
-
Bağlantı yokken ne olur
Native, verinin bir kopyasını tutup bir şey gösterebilir. Düz web hata sayfası gösterir, tam da bu durum için kurulmuş bir PWA değilse.
-
Yeni sürüm nereden gelir
Web herkese aynı anda ulaşır. Native bir mağazadan geçmek zorundadır ve her zaman eski sürümde kalan kullanıcılar olur.
-
Donanıma erişim
Native kameraya, sensörlere ve arka plan çalışmasına tam erişir. Webin bunun bir bölümü vardır ve sınırını siz değil tarayıcı belirler.
Hibrit bu dört hücrede bilerek yer almaz, çünkü her birinde bir taraf seçer: native gibi kurulur, içi webdir.
Telefonda ne kalır, sunucuda ne yaşar?
İki kural işi bitirir. İki kişinin aynı biçimde görmesi gereken her şey sunucuda kalır: fiyat, stok, sipariş, mesaj. Kullanıcının bağlantı olmadan da görebilmesi gereken her şeyin cihazda bir kopyası olmalıdır: ayarlar, taslaklar, en son baktığı liste ve her seferinde parola yazmasını önleyen oturum işareti.
Token denen o oturum işareti hassas noktadır. Cihazda durduğu sürece kullanıcı oturumda kalır, kolaylık da budur. Telefon kaybolursa token de onunla kaybolur, dolayısıyla sunucu tarafından iptal edilebilir olması gerekir. Bunu yalnızca arka uç yapabilir ve telefondaki hiçbir kod miktarı onun yerini tutmaz.
Çevrimdışı çalışma konusunda sevilmeyen bir söz de var. Çevrimdışı kip isteyen projelerin çoğu aslında kullanıcının asansörde kapsama yokken hata ekranı görmemesini istiyor. İhtiyaçları olan şey bir okuma önbelleğidir ve ucuzdur. Gerçek çevrimdışı, kullanıcının bağlantısız da bir şeyi değiştirebilmesi demektir; o zaman da iki kişi aynı şeyi aynı anda değiştirdiğinde kimin kazanacağına karar vermeniz gerekir. Bu karar pahalıdır ve ihtiyacı olmayan bir proje onu satın almamalıdır.
Uygulamanız neden tam olarak API si kadar hızlıdır
Sıradan bir liste ekranı on satır gösterir. Bu sitenin kendi API sinden on makale istedik: bir kez varsayılan biçimde, bir kez de yalnızca dört alana ihtiyacımız olduğunu söyleyerek:
curl -s -o /dev/null -w '%{size_download}\n' "https://rgb.ir/wp-json/wp/v2/posts?per_page=10"
curl -s -o /dev/null -w '%{size_download}\n' "https://rgb.ir/wp-json/wp/v2/posts?per_page=10&_fields=id,title,link,date"İlk yanıt 403.152 bayt, ikincisi 3.780 bayttı. Tek bir makale için aynı ikili 37.341 bayta karşı 353 bayt oluyor. Art arda beş örnek aldık ve boyutlar birebir aynı kaldı; süreler kalmadı ve o beş çalıştırmadan biri bu canlı sunucuda 5,3 saniye sürdü. Bu fark başlı başına bir ders: boyut öngörülebilir, süre değil.
Uygulama tarafında hiçbir şey değişmedi. Liste ekranı yüz kat hafifledi, çünkü istek neye ihtiyacı olduğunu söyledi. O 403 kilobaytın geri kalanı makalelerin tam olarak işlenmiş metniydi ve bir liste ekranı onu asla göstermez.
Aynı ölçüm bir şey daha taşıyordu. API yanıtları x-flying-press-cache: MISS ve cf-cache-status: DYNAMIC başlıklarıyla geldi; yani bu sitenin HTML sayfalarının aksine bu yanıtların hiçbiri önbelleğe alınmıyor ve her dokunuş tam bir PHP çalıştırması. Bir web ziyaretçisine rahatça yanıt veren sunucu, bir uygulamanın altında başka türden bir iş yapıyor.
Yani işin doğru sırası şu: çerçeve seçmeden önce API nizin ne döndürdüğüne bakın. Bu yolun bir sonraki dersi tam da o seçimi, native mi cross platform mu sorusunu ele alıyor ve uygulama geliştirme yolu sayfasındaki ders listesinden erişilebilir. Aynı sözleşmenin web tarafından nasıl göründüğünü görmek isterseniz, API nedir dersi onu temelden açıyor.
Aynı ekran, istek ne istediğini söylemeden önce ve sonra
- Tek makale 37.341 bayt353 bayt
-
On makalelik liste
403.152 bayt3.780 bayt
Farkı yaratan yer liste ekranıdır, çünkü on kat veri ister.
Bu sayılar boyut, süre değil. Boyut beş örnekte birebir aynı kaldı, süre ise bir kez 5,3 saniyeye çıktı; mobil veride kendini gösteren şey boyuttur.
Yapay zekayla hızlı yol
Bir modelin burada yapabileceği en hızlı şey kod yazmak değil. Tek bir satır var olmadan uygulamanın veri sözleşmesini çıkarmaktır: her ekran neyi gösteriyor, o şey hangi adresten geliyor ve tam olarak hangi alanlar gerekiyor. Son bölümde liste ekranını yüz kat hafifleten hamlenin aynısı.
- Uygulamanın ekranlarını, bir insana anlatır gibi adlarıyla yazın: giriş, sipariş listesi, sipariş ayrıntısı, profil. Teknoloji yok, çerçeve yok.
- Her ekran için yalnızca kullanıcının o ekranda gerçekten gördüğünü yazın. Liste ekranı başlık ve tarih gösteriyorsa o ikisini yazın, fazlasını değil.
- Bu listeyi aşağıdaki reçeteyle güçlü bir modele verin ve API sözleşmesini kurmasını isteyin. En hızlı ve en ucuz olanı değil, muhakeme sınıfından bir model seçin; çünkü buradaki iş karar vermek, çeviri yapmak değil.
- Son adım kimsenin yapmadığıdır: modelden hiçbir ekranın kullanmadığı her alanı silmesini ve hangi alanları tahmin ettiğini söylemesini isteyin. Bu tek satır, listeyi iyi görünen bir şeyden hafif bir şeye dönüştürür.
Kopyalamaya hazır şablon
Rol: bir mobil uygulama için API mimarı.
Uygulamanın ekranları ve her birinin gösterdiği:
{ekran 1}: {kullanıcının orada gördüğü alanlar}
{ekran 2}: {kullanıcının orada gördüğü alanlar}
{ekran 3}: {kullanıcının orada gördüğü alanlar}
Şu sırayla yapılacaklar:
1. Her ekran için bir istek yaz: yöntem, adres, parametreler ve örnek JSON yanıtı.
2. Örnek yanıtta yalnızca o ekranın gösterdiği alanları bırak. Fazla her alanı sil.
3. Sildiğin alanların ve gerekirse her birini geri getirmesi gereken ekranın tablosunu ver.
4. Ayrıca hangi adları veya yapıları tahmin ettiğini ve bunları nerede doğrulamam gerektiğini yaz.
5. Veri iki ekran arasında ortaksa, hangi ekranın onu ne kadar süre önbelleğe alması gerektiğini söyle.
Hız veya boyut hakkında hiçbir sayı yazma. Onu kendim ölçeceğim.
Çıktıya güvenmeden önce: Bu reçetenin çıktısı bir öneridir, belge değil. Model alan adlarını hatta adresleri uydurur; bu yüzden her satırı arka ucun gerçekte döndürdüğüyle karşılaştırılmalıdır ve gerçek adrese atılan tek bir curl bu işi bitirir. Projenin henüz arka ucu yoksa bu sözleşme onu kurmanın girdisidir, yerine geçen bir şey değil.
Bu işte yapay zeka
Bu konuda modeller iki şeyi gerçekten iyi, bir şeyi kötü yapar. İyi: uzun bir platform belgesini okumak ve bir ekran tarifinden veri sözleşmesi çıkarmak. Kötü: bir sayıya ya da mağaza politikasına değen her cümle. Duruşumuz, modeli sözleşme tasarımı tarafına koymak ve iddia üretme tarafından uzak tutmaktır.
Gerçekten işe yarayan araçlar
- Claude Yukarıdaki reçetenin istediği şeye tam uygun: ekran tariflerini veri sözleşmesine çevirmek ve daha önemlisi hiçbir ekranın ihtiyaç duymadığını silmek. İran, Anthropic in iki desteklenen ülke listesinin ikisinde de yok; bunu ağ testinden değil kendi sayfalarından okuduk.
- Gemini Uzun platform belgelerini okumakta iyidir ve bu dersin kendisi de birkaç cümlesini resmi Android belgelerinden alıyor. Google ın kendi sayfası Gemini web uygulamasının iki yüz otuzdan fazla ülke ve bölgede çalıştığını söylüyor ve İran o listede yok.
- NotebookLM Soru bir SDK belgesinin tam olarak ne dediğiyse, bu araç sıradan bir sohbetten daha doğrudur; çünkü yalnızca sizin verdiğiniz kaynaktan yanıt verir. Google ın kendi yardımı, Gemini uygulamasıyla aynı bölgelerde çalıştığını söylüyor ve İran o listede yok.
- GitHub Copilot Editörün içinde çalışır ve İranlı bir okur için erişim hikâyesi en beklenmedik olanıdır: GitHub ın kendi ticaret denetimleri sayfası, bir ABD Hazinesi lisansının İran da ikamet eden geliştiriciler için bulut hizmetlerini ücretsiz ve ücretli olarak kapsadığını söylüyor. Bunu aktarıyoruz ve ödeme konusunda bir iddiada bulunmuyoruz.
Nerede geri teper
Buradaki ilk risk uygulamalara özgüdür ve doğrudan modelle bağlantılıdır. Uygulama kullanıcının telefonuna gider, yani paketin içindeki her şey o telefonu tutanın elindedir. Modeller çoğu zaman API anahtarı tam ortasında duran örnek kod yazar, çünkü bir örnek ancak öyle çalışır; sonra o örnek kopyalanıp bir mağazaya gönderilir. OWASP Mobile Top 10 un 2024 sürümü birinci sıraya Uygunsuz Kimlik Bilgisi Kullanımı nı, yedinci sıraya Yetersiz İkili Koruma yı koyuyor. Bu dersten çıkan kural basit: gizli kalması gereken bir anahtarın sınırın üstünde yeri yoktur, arka uca aittir.
İkinci risk daha sıradan. Mobil SDK ler ya da mağaza kuralları hakkında yazan bir model, aynı kendinden emin tonla bir yöntem adı ya da yayın koşulu uydurur. Bu türden her cümle üreticinin kendi belgeleriyle karşılaştırılmalıdır. Bu araçlara İran dan nasıl ödeneceği satın alma rehberindedir.
Kaynaklar: OWASP Mobile Top 10 (2024) Anthropic: supported countries GitHub and Trade Controls Google: where the Gemini web app is available
Bu tavsiyenin sınırı
Bu ders yaygın biçimi anlatıyor: ekranları olan ve HTTP üzerinden bir API ile konuşan bir uygulama. Oyunlar burada değil; değeri cihazın kendisinde üretilen uygulamalar da değil, kamera görüntüsü işleme ya da telefonda çalışan bir model gibi; onlarda bu dersin üzerinde durduğu sınır bambaşka bir yerdedir. Kendimizle ilgili bir not da gerekli: birinci elden deneyimimizin derinliği o sınırın sunucu tarafıdır, yani barındırma ve API; bu sayfadaki her sayı da yayınlanmış bir mobil uygulamanın değil, bir sunucunun sayısıdır.
Kendi işimizden
Bu sunucuda rgb-rest-raw.php adında küçük ve zorunlu bir eklenti tutuyoruz ve tek bir nedenle var. Really Simple SSL güvenlik eklentisi bir çıktı arabelleği açıyor ve yanıt gövdesinin tamamında her https://rgb.ir i https://rgb.ir e çeviriyor. HTML için bu doğrudur. Bir JSON yanıtında ise sessiz bir bozulmadır: yönlendirme denetleme aracımız bir http adresinin https ye yönlendiğini göstermek için vardır ve o yeniden yazma, zincirin ilk halkasının https ten https e okunmasına yol açıyordu; yani aracın bulmak için kurulduğu şey görünmez oluyordu. Veritabanında saklanan değer doğruydu, yalnızca çıktı gövdesi düzenleniyordu. Hiçbir tarayıcı bunu fark etmezdi. Adresi bayt bayt okuyan bir program eder. İkinci madde başka türden: kendi açık API miz bir captcha nın arkasında duruyor ve /wp-json/rgb/v1/domain adresine yapılan düz bir istek bugün 422 kodunu ve güvenlik doğrulamasının tamamlanmasını beklemeyi isteyen bir mesajı döndürdü. Bir web sitesi formunda bu doğrudur ve bir uygulamanın bir web sitesi API sini olduğu gibi tüketememesinin ve kendi kimlik doğrulama yoluna ihtiyaç duymasının nedeni tam olarak budur.
Gerçek devam soruları
Bir uygulama yapmak için kesinlikle sunucuya ihtiyacım var mı?
Hayır, her şey cihazın kendisinde kalıyorsa: hesap makinesi, çevrimdışı not, ölçüm aracı. İki cihazın aynı şeyi birebir görmesi gerektiği ya da kullanıcının bir hesaba giriş yapması gerektiği anda sunucu isteğe bağlı olmaktan çıkıp zorunlu olur. Dördüncü bölümdeki kural o sınırı çizer.
Uygulama ile mobil site arasındaki fark nedir?
Dört şey: uygulama kurulur ve simge oluşturur, bağlantı olmadan da bir şey gösterebilir, kameraya, sensörlere ve arka plan çalışmasına tam erişir ve yeni sürümü bir mağazadan geçmek zorundadır. Sitede bunların hiçbiri yoktur; buna karşılık girişte hiç sürtünmesi yoktur ve güncellemesi herkese aynı anda ulaşır.
Uygulamam neden wi-fi da hızlı, mobil veride yavaş?
Çünkü bu neredeyse her zaman bir kod değil boyut sorunudur. Wi-fi büyük bir yükü gizler, mobil veri gizlemez. Son bölümdeki ölçüm tam da bunu gösteriyor: bu siteden on satırlık bir liste ekranı varsayılan biçiminde 403.152 bayttı ve istek ihtiyaç duyduğu dört alanı adlandırınca 3.780 bayta indi, uygulama tarafında hiçbir şey değişmeden.