EYDefterEmre Yakut
← tüm yazılar
Simülasyon · Sistem · Hata avı

Elindekilerle ne pişer — ve kendi kendini yayımlayan bir site

Mutfaksim, dolabında ne varsa ondan ne çıkacağını söyleyen bir tarif sistemi. Sonra içeriği sosyal medyaya elle taşımak saçma geldi ve site kendi kendini yayımlamaya başladı — üç hatayla birlikte.

tarif sitede yayımlandı kart üret görsel + metin Graph API iki ayrı yol Instagram gönderi site kendi kendini yayımlayabilir — ama bunu yaparken yalan söylememeliyarış durumu: yayın, Instagram’ın kendi görsel çekişini geçiyordu → görsel boş gidiyorduve bir hata, konuyu sonsuza kadar kilitliyordu. kuru çalıştırma aynı hikâyeyi iki kez saydı.

Mutfaksim basit bir soruyla başladı: dolapta bunlar var, ne çıkar?

Bu, tarif aramaktan farklı bir soru. Tarif ararken sen ne yapacağını biliyorsun ve malzemeyi tamamlıyorsun. Burada tersi: malzeme sabit, sonuç değişken.

İçinde ne var

  • Elindekiyle eşleştirme — malzemeleri giriyorsun, ne çıkabileceğini ve neyin eksik olduğunu görüyorsun.
  • Ölçeklendirme — dört kişilik tarifi yedi kişiye çıkarmak, ondalık bir çarpım değil: bazı malzemeler doğrusal ölçekleniyor (un, süt), bazıları ölçeklenmiyor (tuz, kabartma tozu, pişirme süresi).
  • Teknik kütüphanesi — “mühürlemek”, “dinlendirmek”, “terbiye etmek” gibi adımlar için ayrı ayrı açıklama ve kısa görüntü.
  • Kişisel not — bir tarife beş üzerinden puan vermek yerine “fırında 10 dk fazla tut” yazabilmek. İnsanlar tarifi puanlamıyor, düzeltiyor.
içerik tarafında bulduğum hata

Beş tarif yemeği tuzluyordu ama malzeme listesinde tuz yoktu. Yazarken herkesin “zaten var” saydığı bir şey.

Kullanıcı için en can sıkıcı hata türü bu: listeyi alıp markete gidiyorsun, evde bir şeyin eksik olduğunu anlıyorsun. Otomatik bir denetim ekledim — adımlarda geçen her malzeme listede olmak zorunda.

Sonra: site kendini yayımlasın

İçerik düzenli üretiliyor ve sosyal medyaya elle taşınıyordu: ekran görüntüsü al, metni kopyala, uygulamayı aç, yapıştır. Her defasında beş dakika ve her defasında biraz daha isteksiz.

Klasik bir otomasyon adayı. Üç hatayla birlikte geldi.

İlk sürpriz: iki ayrı yol, iki ayrı izin adı

Platformun iki farklı entegrasyon yolu var ve hangisine sahip olduğun hesabının türüne bağlı. Daha can sıkıcısı: ikisinde izinlerin adları farklı. Belgeler bunu net söylemiyor; ancak hata mesajından anlıyorsun.

Çözüm ikisini birden desteklemek oldu: sistem hangi yolun mevcut olduğunu keşfediyor ve ona göre ilerliyor.

Hata 1: yarış durumu

Yayınlama akışı iki adım: önce görselin bulunduğu adresi bildiriyorsun, sonra “yayınla” diyorsun. İkinci adımda platform, birinci adımda verdiğin adresten görseli kendisi çekiyor. Ve kodum bu çekişi beklemiyordu.

1. kart görselini üret ve sunucuya yaz
2. adresi bildir
3. hemen "yayınla" de
   ↑ platform henüz görseli çekmedi → gönderi görselsiz

Bazen çalışıyordu — görsel önbellekteyse ya da ağ hızlıysa. Bazen çalışmıyordu. Aralıklı hataların tipik imzası.

Düzeltme: ikinci adım artık kaynağın işlenme durumunu soruyor ve hazır olana kadar bekliyor. “Bekle ve dene” yerine durumu sor. Kör bir gecikme koymak çözüm değil, sadece hatayı seyrekleştirir.

Hata 2: sonsuza kadar kilitlenen konu

Aynı içeriğin iki kez yayımlanmaması için bir kilit vardı: yayına başlamadan önce konu “işleniyor” diye işaretleniyor, bitince bırakılıyor.

Sorun: hata durumunda bırakılmıyordu. Bir yayın başarısız olduğunda konu sonsuza kadar “işleniyor” kalıyor ve bir daha hiç yayımlanmıyordu. Sessizce.

kilit tasarımının kuralı

Bir kilidin her koşulda bırakılacağı garanti edilmeli — başarıda, hatada ve süreç çökmesinde. Sonuncusu en zoru, çünkü kodun hiç çalışmaz. Çözüm kilide bir son kullanma zamanı koymak.

Artık kilit hem hata yolunda bırakılıyor hem zaman aşımına sahip. İkisi birden gerekli.

Hata 3: kuru çalıştırma yalan söylüyordu

Gerçekten yayımlamadan önce ne olacağını gösteren bir kuru çalıştırma modu vardı. Ve aynı içeriği iki kez listeliyordu.

Sebep: kuru çalıştırma kendi ayrı kod yolunu kullanıyordu. Aday listesini farklı bir sorguyla topluyor ve tekilleştirmeyi atlıyordu. Yani gösterdiği şey, gerçek akışta olacak şey değildi — bu, olmamasından kötü, çünkü ona güveniyordum.

// yanlış
if (kuru) { adaylari_ayri_hesapla(); yazdir(); return; }
gercek_akis();

// doğru
const plan = gercek_akis_planla();      // aynı kod, her zaman
if (kuru) { yazdir(plan); return; }     // sadece son adım atlanıyor
uygula(plan);

Ve bir kural: yayımlarken yalan söyleme

Otomatik yayınlamada en kolay hata, sistemin yapmadığı şeyi yaptım sanması.

“Gönderi paylaşıldı” bildirimi, platform gerçekten kabul etmeden gönderilmemeli. Akışın son adımı, platformun döndürdüğü gönderi kimliğini kaydetmek. Kimlik yoksa yayın olmamış sayılıyor — istek başarılı görünse bile.

Bu, sesli asistanın “ışığı kapattım” demeden önce doğrulaması ile aynı kural.

Aynı dönemde çıkan diğer küçük şeyler

  • Sunucuda Türkçe karakterler bozuk çıkıyordu — yerelde sorunsuz. Kodlama ayarı iki ortamda farklıydı.
  • Profil görseli 32 piksele indiğinde tanınmaz oluyordu. Küçük boyutta okunan şey detay değil, siluet.
  • Bir bölüm başlığı, altındaki metin değiştikten sonra doğru olmaktan çıkmıştı ve aylarca öyle kaldı.
  • Sekiz düz bağlantı üç gruba ayrıldı; menüde hiç görünmeyen bölümler ortaya çıktı.

Sonuncusu en öğretici. Metni güncellerken başlığı unutmak çok kolay, ve kimse şikâyet etmiyor — sadece sayfa biraz daha az anlamlı oluyor.

Ne öğrendim

Otomasyon işi ortadan kaldırmıyor; işin türünü değiştiriyor. Beş dakikalık elle taşıma gitti; yerine bir yarış durumu, bir kilit tasarımı ve bir kuru çalıştırma doğruluğu geldi.

Değer mi? Evet — ama sebebi zaman değil. Elle yapılan iş bazen atlanıyordu; otomatik olan atlanmıyor. Otomasyonun asıl kazancı hız değil, tutarlılık.

SimülasyonSistemHata avı