SmartWords Oyunlar Bölümü
100 binden fazla indirilen bir uygulamaya canlı 1'e 1 düellolar, günlük meydan okumalar, reels tarzı bir akış ve dört liderlik tablosu ekledim.
- Rol
- Full Stack Developer
- Şirket
- SmartWords, Bussum (uzaktan)
- Dönem
- 04/2026 – 08/2026
- Kullanılanlar
- PostgreSQL · Firestore · HTML Canvas
Eşleştirme
Bir oyuncu tam olarak bir kez eşleşmeli.
Düelloyu iki veri deposuna böldüm. Eşleştirme kuyruğu PostgreSQL'de duruyor ve oyuncular bir transaction içinde, advisory lock altında eşleşiyor. Böylece her oyuncu tam bir kez eşleşiyor ve kilitlenme riski olmuyor.
Maçın anlık durumu Firestore'da. Güvenlik kuralları istemcinin yazmasına izin vermiyor, bu yüzden her değişiklik backend'den geçiyor.
Puanlama
Skoru sunucu belirliyor.
Puanlamayı sunucuya taşıdım. Artık istemci herkese açık liderlik tablosuna kendi sonucunu yazamıyor.
Bunu yaparken bir açık buldum ve kapattım. Oyundaki 3.600 sorunun %99,9'unda hatalı biçimlenmiş bir istek doğru cevap sayılıyordu.
Eşzamanlılık
Zamanlamaya bağlı üç hata.
Canlı akışlarda şu eşzamanlılık ve zamanlama hatalarını giderdim:
- 01
Transaction dışında yapılan read-modify-write işlemlerinde güncellemelerin kaybolmasına yol açan race condition'lar.
- 02
Bağlantısı kopan oyuncunun geri dönmesini sessizce bozan bir kuyruk temizliği.
- 03
Yeniden bağlanan oyuncuları yanlış puanlayan istemci ile sunucu arasındaki saat farkı.
Takma ad filtresi
Gerçek isimler engellenmesin.
8 dilde çalışan bir takma ad filtresi yazdım. Birbirine benzeyen karakterleri (homoglif) tek biçime indiriyor, leetspeak'i normalleştiriyor ve izin listesini harflerin isim içindeki konumuna göre uyguluyor. Yanlışlıkla reddedilen gerçek isimler 29 örnekte 23'ten 0'a indi. Test kümesindeki atlatma denemelerinin hepsi yine de engelleniyor.
Maliyet
Az maliyetle çalışması gerekiyordu.
- 01
CEFR seviyesine göre ayarlanmış yapay bir rakip var. LLM kullanmıyor ve ek maliyeti yok. Böylece kullanıcı sayısı azken bile her zaman bir düello oynanabiliyor.
- 02
Bekleyen bir rakip olduğunda oyunculara bildirim gidiyor.
- 03
Eşleştirme küresi yaklaşık 23 MB'lık bir 3D kütüphane yerine HTML canvas ile çiziliyor.