Kısaca

Tüm yazılar

Lore Hafta 3: Bir uygulamayı yeni bir model sağlayıcısına taşımak, kullanım sınırının yeri ve bir platform tarihinin koda etkisi

Haftaya tek bakışta

66 merge, açılıştan merge'e ortanca süre yaklaşık 2 saat

  • 66bu hafta merge
  • 43geçen hafta
  • 122,6dakika, ortancayaklaşık 2 saat

kontroller engellendi

Ürüne göre merge

  • Henüz duyurmadığımız ürün23
  • Lexicon15
  • AutoReal13
  • İç araçlar11
  • guno3
  • lorelabs.co1

Lab, haftalık yazı. 26 Ekim Pazartesi ile 1 Kasım Pazar arası, 2026, İstanbul saatiyle.

Bu hafta 66 pull request merge ettik. Geçen hafta bu sayı 43'tü. Tipik bir pull request, açıldıktan yaklaşık 2 saat sonra merge edildi (ortanca 122,6 dakika). Henüz duyurmadığımız yeni bir ürün 23 merge aldı. Onu sınav hazırlık uygulamamız Lexicon (15), AutoReal (13), guno (3) ve lorelabs.co (1) izledi. Kalan 11 merge iç araçlarımıza gitti.

Haftanın en faydalı dersi Lexicon'dan geldi. Lexicon birkaç gün içinde bütün yapay zeka model çağrılarını tek bir modülün arkasında yeni bir sağlayıcıya taşıdı ve sunucunun saydığı günlük bir sınır ekledi. Ayrıca bir platform tarihinin iki uygulamamızın koduna nasıl uzandığını gördük ve kırmızı bir çarpıyı saymadan önce okumayı öğrendik.

Bu hafta üç yeni fikri ve kısa bir notu anlatmak istiyoruz:

1. Bir uygulamayı yeni bir model sağlayıcısına adım adım taşımak. Her çağrıyı tek bir modül üstleniyor ve eski yol en son kalkıyor.

2. Kullanım sınırı nerede durmalı. Sınır sunucuda durmalı, model çağrılmadan önce işlemeli ve sayamadığında kapalı kalmalı.

3. Bir platform tarihi kodu şekillendirir. İki iPhone uygulamamızın build yöntemini gelecek yılın iOS kuralı yüzünden neden değiştirdiğini anlatıyoruz.

4. Kısa not: Kırmızı çarpı her zaman başarısız bir test anlamına gelmez.

Bize yeni katıldıysanız şunu bilmenizi isteriz: CI, kontrol dakikaları ve bir kontrolün bütçe yüzünden neden durabileceği Lore Hafta 2'nin konusuydu. Branch'ler, küçük değişiklikler ve onay gate'leri de Lore Hafta 1'de anlatıldı. Bunları burada tekrar etmiyoruz.

Yöntem

Haftaya nasıl baktık

Her depomuzda merge edilen ve açık duran pull request'leri listeledik ve hepsini okuduk. Ardından 466 otomatik kontrol çalışmasının tamamına baktık ve her ürünün durum dosyasını haftanın başı ve sonuyla karşılaştırdık. Durum dosyası, o anda neyin var olduğunu anlatan kısa bir belgedir. Bu sayım iç repository'lerimizi de içeriyor, bu yüzden Lab build log'undaki sayıdan büyük. Build log artık Lexicon'u bir ürün olarak sayıyor ve iç işlerimizi ayrı bir satırda gösteriyor. Bir rakam bizim sayımımızdan değil de pull request'in kendi metninden geliyorsa bunu açıkça belirtiyoruz.

Haftayı iki olay çerçeveledi. İlki bir düzeltme: Geçen hafta Pazar günü saat 18:12'de saydık ve 38 merge bildirdik. O akşam 5 merge daha yapıldı, yani 2. haftanın gerçek sayısı 43'tü. İkincisi, 27 ile 30 Ekim arasında hesabımızda hiçbir otomatik kontrol başlayamadı, çünkü kontrol makinelerinin faturalaması durmuştu. Bu bütçenin nasıl işlediğini 2. haftada anlattık. İş devam etti ve pull request'ler kontrollerin bunun yerine nerede çalıştığını yazdı. Kontroller 31 Ekim'den itibaren yeniden çalıştı.

Fikir 1

Bir uygulamayı yeni bir model sağlayıcısına taşımak

Tek kapı

İki pull request'te incelendi.

Fikir nedir. Lexicon, TOEFL, IELTS ve GMAT'in sözel bölümlerine hazırlanmanıza yardım eden bir uygulamadır. Uygulamanın arkasında bir sunucu fonksiyonu, bir yapay zeka modelinden alıştırma kelimeleri, paragraflar ve quiz'ler yazmasını ister. Bu hafta bu çağrıları bir model sağlayıcısından diğerine taşıdık.

Neden önemli. Sağlayıcı değiştirmek bir adresi başka bir adresle değiştirmekten ibaret değildir. Her sağlayıcının kendi istek biçimi, kendi limitleri, kendi reddetme şekli ve kendi fiyatı vardır. Model çağrıları birçok dosyaya dağılmışsa taşıma hepsine aynı anda dokunur ve bir hata bütün kullanıcılara aynı anda ulaşır.

Basitçe nasıl işler. Tek bir ana kapısı olan bir bina düşünün. Her teslimat o kapıdan geliyorsa kilidi bir kez değiştirirsiniz. Yazılımda bunun için iki bilinen kalıp var. Microsoft'un mimari rehberinin "anti-corruption layer" dediği adaptör katmanı, uygulamanızla dış bir sistem arasına girer ve ikisi arasında çeviri yapar. Böylece dış sistemin alışkanlıkları sizin tasarımınıza sızmaz. Martin Fowler'ın anlattığı "strangler fig" ise eski bir sistemi yavaş yavaş değiştirir: Yeni yol eskisinin yanında büyür, trafik adım adım taşınır ve eski yol en son kaldırılır. Böylece hem yatırım hem de getiri yavaş yavaş ve görünür biçimde gelir.

Bize ne oldu. İşi adımlara böldük. Önce yazılı bir plan hazırladık. Ardından sunucuda her model çağrısını üstlenen tek bir modül kurduk: Her route bu modülden geçiyor ve yeni sağlayıcıyla yalnızca o konuşuyor. Uygulamanın dışındaki küçük script'ler eski sağlayıcıyı kullanıyor ve aynı planın sonraki bir adımında bilerek taşınacak. Modül neyin cevap sayılacağına da karar veriyor. Bir ret, token limitinde kesilen bir cevap ya da boş bir cevap, boş bir kart olarak değil adı konmuş bir hata olarak dönüyor. Modülün testleri sahte bir istemciyle çalışıyor, böylece ücretli bir çağrı yapmadan istek biçimini ve her hata durumunu kontrol ediyor.

Başkaları ne diyor. Fowler yavaş yolu savunuyor, çünkü bu yolda hem yatırım hem de getiri her adımda görünür kalıyor. Microsoft'un rehberi bedeli de açıkça yazıyor: Katman her çağrıya gecikme ekliyor ve yönetip bakımını yapmanız gereken bir parça daha oluyor.

Biz nerede duruyoruz. Her çağrının tek bir sahibi olması, değişikliği iki pull request'te incelenebilecek kadar küçülttü. Bedeli şu: Script'ler iki sağlayıcı arasında bölünmüş durumda. Yeni sağlayıcının cevaplarının kalitesini aynı prompt'larla eskisiyle henüz karşılaştırmadık. Sıradaki adım bu karşılaştırma olacak.

Fikir 2

Kullanım sınırı nerede durmalı

Sınır sunucuda durur

Fikir nedir. Kullanım sınırı, bir hesabın yapabileceği model çağrısı sayısını kısıtlar. Ücretli model çağrılarının neden bir tavana ihtiyaç duyduğunu 1. haftada anlattık. Bu hafta o tavanın nerede durması gerektiğini konuşuyoruz.

Neden önemli. Telefondaki bir uygulama değiştirilebilir, kopyalanabilir ya da taklit edilebilir. Yalnızca uygulamanın kontrol ettiği bir sınır, bir ricadan öteye geçmez. OWASP'ın Authorization Cheat Sheet'i bunu açıkça söylüyor: Geliştiriciler istemci tarafındaki erişim kontrollerine asla güvenmemeli ve bu kontroller sunucuda yapılmalı. Aynı belge varsayılan olarak reddetmeyi de öneriyor: Emin değilseniz reddedin.

Basitçe nasıl işler. Bir istasyondaki turnike, yolcunun sözüne değil kendi sayacına güvenir. Turnikenin sayacı bozulursa güvenli turnike herkesi geçirmez, kapalı kalır. Mühendisler buna "fail closed" der.

Bize ne oldu. Lexicon'da artık hesap başına günlük 60 model çağrısı sınırı var ve bu sınırı, çağrıları üstlenen aynı modül sunucuda sayıyor. Sınırı aşan bir çağrı, hiçbir model çağrılmadan önce kullanıcıya açık bir mesajla reddediliyor. Örneğin veritabanı cevap vermediği için sistem çağrıyı sayamıyorsa çağrı yine reddediliyor ve farklı bir hata dönüyor. Kullanıcılar kendi sayaçlarını okuyabiliyor ama değiştiremiyor. Testler gün sınırını, sınırdaki reddi ve aynı anda gönderilen bir çağrı yığınını kapsıyor. Saf bir sayaç fazladan çağrıları tam da böyle bir yığında kaçırır. Yerel testlerde kullanılan ücretsiz sahte model bile sınırdan düşüyor, böylece sınır çalıştığı şekilde test ediliyor.

Başkaları ne diyor. OWASP'ın LLM uygulamaları için hazırladığı risk listesi maliyet tarafına "unbounded consumption" diyor ve bu konuyu 1. haftada anlattık. Cheat sheet buna yer kuralını ekliyor: Bir saldırganın içeri girmesi için atlanmış tek bir kontrol yeterli.

Biz nerede duruyoruz. Sınırın yeri rehbere uyuyor. Sayının kendisi ise henüz veriye dayanmıyor: Günde 60'ı biz seçtik ve gerçek kullanıcıların bu sınıra takılıp takılmadığını henüz ölçmedik.

Fikir 3

Bir platform tarihi kodu şekillendirir

Bir tarih, iki yol

Fikir nedir. Apple, iPhone uygulamalarının build'ini her yıl değişen bir yazılım kitiyle, yani SDK ile alır. Scene tabanlı yaşam döngüsü, bir uygulamanın ekranlarını başlatmanın ve yönetmenin daha yeni bir yoludur. Apple'ın belgelerine göre iOS 27'den itibaren en yeni SDK ile build alınan uygulamalar bu yaşam döngüsünü benimsemek zorunda, aksi halde açılmıyorlar.

Neden önemli. Kural, kodunuzu değiştirmenizi beklemiyor. Onu tetikleyen şey build aldığınız araç oluyor. Sessizce en yeni araçlara geçen bir build makinesi, çalışan bir uygulamayı açılışta kapanan bir uygulamaya çevirebilir.

Basitçe nasıl işler. Yapı yönetmeliğini belli bir tarihte değiştiren bir şehir düşünün. Ayakta duran evler sorun yaşamaz. Yeni yönetmelikle inşa edilen bir evde ise yeni yangın çıkışı olmak zorundadır, yoksa ev açılamaz. Ya çıkışı inşa edersiniz ya da onu inşa edene kadar eski onaylı planları kullanmaya devam edersiniz.

Bize ne oldu. İki iPhone uygulamamız iki farklı yolu seçti. guno, build makinesinin imajını Xcode'un bir önceki sürümüne sabitledi. Durum dosyası nedenini açıklıyor: En yeni imaj iOS 27 SDK'siyle build alacaktı ve scene yaşam döngüsü olmadan uygulama açılışta kapatılacaktı. Lexicon ise öbür yolu seçti, uygulama framework'ünü birkaç sürüm birden yükseltti ve uygulaması artık yeni kuralın istediği parça olan bir scene delegate taşıyor.

Başkaları ne diyor. Apple'ın TN3187 teknik notu geçişin nasıl yapılacağını anlatıyor ve bu tarihin erkenden duyurulduğunu gösteriyor: UIKit, iOS 18.4'ten beri bu konuda bir uyarı yazıyor.

Biz nerede duruyoruz. Sabitlemek şimdilik hızlı ve güvenli, ama üzerinde tarih yazan bir borç. guno'nun durum dosyası çıkış koşulunu da yazıyor: Yeni araçlara yalnızca scene desteğiyle geçilecek. Bu geçiş olduğunda size haber vereceğiz.

Kısa not

Kırmızı çarpı her zaman başarısız bir test anlamına gelmez

Kırmızı çarpı, iki kez okunur
  • 466kontrol çalışması
  • 191başarısız
  • 18130 saniyenin altında, 191'in içinde

Bu oran yüzde 41 gibi görünüyor. 181'i tek bir adım çalıştırmadan bitti. Faturalama engeli sırasında reddedildiler.

Bu hafta 466 kontrol çalışmasının 191'i başarısız oldu. Bu oran yüzde 41 gibi görünüyor. Ama bu 191 hatanın 181'i tek bir adım bile çalıştırmadan, 30 saniyeden kısa sürede bitti: Bunları kodumuz kırmadı, faturalama engeli sırasında reddedildiler. Kırmızı bir çarpıyı saymadan önce ne kadar sürdüğüne ve kaç adım attığına bakın. Bundan sonra retleri ve gerçek hataları ayrı rakamlar olarak raporluyoruz.

Dersler

Ne öğrendik

Derslerdeki rakamlar
  • 16,0gün, iki dosya
  • 6,4gün, iki dosya
  • 14yüzde, satır sayısı aynı
  • 85yüzde, Lexicon durum dosyası
  • 33.000eklenen satır, yaklaşık
  • 370dosya, o değişiklikte

En yavaş iki pull request ikişer dosyayı değiştirdi ve 16,0 ile 6,4 gün sürdü. Bir durum dosyası satır sayısını korurken karakterde yüzde 14 büyüdü. Lexicon'unki yüzde 85 büyüdü. Bir pull request 370 dosyada yaklaşık 33.000 satır ekledi.

Tek bir kapıyı korumak daha kolaydır. Her model çağrısını tek bir modüle taşımak, hem sağlayıcı değişikliğini hem de sınırı küçük ve incelenebilir bir değişikliğe çevirdi.

Bir sınır ancak kullanıcının uzanamadığı yerde gerçektir. Sınırı sunucu sayıyor ve sayamadığında kapalı kalıyor.

Build araçlarınız, kodu değiştirmeden uygulamanızı bozabilir. Sabitlenen bir build imajı zaman kazandırdı, framework yükseltmesi de borcu ödedi.

Gün bitince sayın. 2. hafta sayımımız çok erken saydığımız için 5 merge'ü kaçırdı.

Bu hafta küçük değişiklikler daha uzun bekledi. En yavaş iki pull request yalnızca 2'şer dosyayı değiştirdi ve 16,0 ile 6,4 gün sürdü. Geçen hafta en yavaşlar en büyükler olmuştu.

Durum dosyaları karakterde büyümeye devam ediyor. Üst üste üçüncü hafta, bir ürünün durum dosyası satır sayısını korurken karakterde yüzde 14 büyüdü. Lexicon'unki yüzde 85 büyüdü.

Bizi ne şaşırttı. Henüz duyurmadığımız yeni ürün, 370 dosyada yaklaşık 33.000 satır ekleyen tek bir pull request aldı. Bu değişikliği bir agent rol ekibi tek seferde kurdu. Bu büyüklükte bir değişikliği iyi incelemenin yolunu henüz bilmiyoruz.

Sırada

Sırada ne var

Bu liste açık pull request'lerimizden, planlarımızdan ve karar kayıtlarımızdan geliyor. Öneri olarak işaretlenen her şey bizim önerimiz ve henüz karara bağlanmadı.

  • Lexicon'da App Store'da yayınlama planı, son script'lerin yeni sağlayıcıya taşınması ve uygulama sekmelerinde bir performans çalışması bekliyor.
  • AutoReal'de abonelikler ve herkese açılacak yeni bir post motoru, onaylanana kadar kapalı kalan anahtarların arkasında taslak olarak bekliyor.
  • lorelabs.co'da ürün sayfaları hazırlanıyor ve geliştirme günlüğü, iç işleri ayrı tutarak daha çok depomuzu sayacak.
  • guno'da bir test turu ve sunucuda kullanım sınırları planlanıyor.
  • Henüz duyurmadığımız yeni ürün üzerindeki çalışma sürüyor.
  • Öneri: Bir uygulamayı yeni bir model sağlayıcısına geçirmeden önce aynı prompt'ları ikisinde de çalıştıralım ve cevapları karşılaştıralım.
  • Öneri: Her kullanım sınırını bir tahminle değil, bir aylık gerçek kullanımla belirleyelim.
  • Açık sorular: guno yeni build araçlarına ne zaman geçecek? 33.000 satırlık bir değişikliği nasıl incelemeliyiz?

Sınırlar

Doğrulayamadıklarımız

  • Yeni sağlayıcının cevaplarının eskisi kadar iyi olup olmadığını bilmiyoruz, çünkü onları karşılaştırmadık.
  • Günde 60 çağrının gerçek kullanıma uyup uymadığını ölçmedik.
  • Ayın faturalanan dakikalarını ve kontrollerin tam olarak ne zaman geri geldiğini doğrulayamadık.
  • Barındırma platformlarımızın kendi deploy kayıtlarını görmedik ve hiç pull request'e dönüşmeyen doğrudan push'ları saymadık.
  • Dış kaynaklardaki iddiaları her kaynağın kendi ifade ettiği şekilde aktarıyoruz.

1 Kasım 2026

Kaynaklar

Her bağlantıyı 1 Kasım 2026'da açtık, sayfanın yüklendiğini ve kullandığımız bilgiyi gerçekten içerdiğini kontrol ettik.

  1. Martin Fowler, Strangler Fig Application: Bir sistemi yatırımı ve getiriyi görünür tutarak yavaş yavaş değiştirmeyi anlatıyor.
  2. Microsoft Azure Architecture Center, Anti-corruption Layer pattern: Alt sistemler arasında çeviri yapan bir facade ya da adaptör katmanını anlatıyor.
  3. OWASP Cheat Sheet Series, Authorization Cheat Sheet: İstemci tarafındaki kontrollere asla güvenmemeyi ve varsayılan olarak reddetmeyi anlatıyor.
  4. OWASP GenAI Security Project, LLM10:2025 Unbounded Consumption: Model çağrılarının maliyet riskini anlatıyor (1. haftada işlendi).
  5. Apple Developer, TN3187: Migrating to the UIKit scene-based life cycle: Zorunluluğu, iOS 18.4'ten beri gelen uyarıları ve geçişin nasıl yapılacağını anlatıyor.
  6. Apple Developer, Transitioning to the UIKit scene-based life cycle: iOS 27'den itibaren en yeni SDK ile build alınan uygulamaların scene tabanlı yaşam döngüsünü benimsemezse açılmadığını yazıyor.

Geri kalan her şey 1 Kasım 2026'da aldığımız kendi kayıtlarımızdan geliyor. Depolarımız özel olduğu için onlardan hiçbir bağlantı vermiyoruz.