Eşlik Et'i İnşa Etmek: Expo ve Socket.io ile Bir Etkinlik Arkadaşlığı Uygulaması
Bir süredir, içerikle daha az, insanları aynı odaya sokmakla daha çok ilgili bir şey inşa etmek istiyordum. Türkçede kabaca birine eşlik etmek anlamına gelen Eşlik Et, bir etkinlik arkadaşlığı uygulaması. Fikri tarif etmesi basit ve iyi yapması şaşırtıcı derecede zor: katılmak istediğiniz bir etkinlik buluyorsunuz ve uygulama, birlikte katılacak birini bulmanıza yardım ediyor. Konserler, maçlar, sergiler, yalnız izlemek istemediğiniz bir film. Zor kısım hiçbir zaman ekranlar olmadı. İki yabancının gerçekten gelecek kadar rahat hissetmesini sağlayan güven, zamanlama ve gerçek zamanlı tesisattı.
Uygulama, yıllar önce inşa ettiğim eski bir Laravel sitesinin yerini aldı. O sürüm işliyordu ama sosyal bir ürün gibi davranmaya çalışan bir web uygulamasıydı ve uyumsuzluk belli oluyordu. İnsanlar bildirimler, konum ve yalnızca gerçek bir mobil uygulamadan alabileceğiniz türden bir anındalık istiyordu. Bu yüzden onu düzgünce yeniden inşa ettim.
Sistemin Şekli
Eşlik Et, com.esliket.esliket paket kimliğiyle hem iOS hem Android'e gönderilen bir Expo React Native uygulaması. Arkasında MongoDB destekli bir Express ve TypeScript API'si var; tüm gerçek zamanlı mesajlaşmayı Socket.io ele alıyor. Moderasyon ve operasyonlar için ayrı bir React ve Vite yönetici paneli ve tüm havadan (over-the-air) güncellemeleri teslim eden, kendi sunucumda barındırılan bir Expo Updates sunucusu var. Dört hareketli parça, her birinin net bir işi var.
Mobil uygulamayı ve API'yi bilinçli olarak ayrı kaygılar olarak tuttum. Uygulama sunumu, navigasyonu ve cihaz entegrasyonlarını sahipleniyor. API gerçeği sahipleniyor: kimin kiminle eşleştiği, hangi mesajların var olduğu, bir etkinliğin gerçekte ne olduğu. Bu bölünme bariz geliyor ama iki istemciniz olduğu an karşılığını veriyor çünkü yönetici paneli ve mobil uygulama aynı API ile konuşuyor ve aynı veriyi görüyor. Senkronizasyonda tutulacak ikinci bir gerçek kaynağı yok.
Gerçek Zamanlı Eşleştirme ve Mesajlaşma
İlginç mühendislik Socket.io'da yaşıyor. İki kişi aynı etkinliğe katılma ilgisini ifade ettiğinde, eşleştirme mantığı sunucu tarafında çalışıyor ve eğer onları bağlarsa, her iki istemci bunu anında öğreniyor. Oradan, mesajlaşma bir istek-yanıt döngüsü yerine canlı bir kanal. Yazıyor göstergeleri, teslim ve mevcudiyet (presence) hepsi soket üzerinden akarken, MongoDB kalıcı kaydı saklıyor; böylece bir bağlantı düşerse hiçbir şey kaybolmuyor.
Öğrendiğim şu: gerçek zaman çoğunlukla mutsuz yollarla (unhappy paths) ilgili. Bir tünel veya asansör sonrası yeniden bağlanma. Soket kısa süre çökmüşken gönderilen bir mesaj. Bir konuşmanın ortasında uygulamayı arka plana alan bir kullanıcı. Onaylamalara (acknowledgement) ve yeniden bağlanma durumuna, iki kişinin sohbet ettiği mutlu yoldan daha çok zaman harcadım. Soketi güvenilir olarak ele alırsanız, gerçek bir mobil ağdaki herhangi birine bozuk hissettiren bir ürün gönderirsiniz. Bu yüzden onu varsayılan olarak güvenilmez olarak ele aldım ve otorite olarak veritabanına karşı mutabık kıldım (reconcile).
Onu Native Hissettiren Cihaz Entegrasyonları
Bir sosyal uygulama, küçük native dokunuşlarla yaşar ya da ölür. Eşlik Et'in Google ve Apple ile oturum açma özelliği var çünkü birinden, size güvenmek için herhangi bir nedenleri olmadan önce başka bir şifre icat etmesini istemek, onları kaybetmenin sessiz bir yoludur. Etkinliklere gerçek bir yer iliştirilsin ve insanlar ne kadar uzağa gitmeye razı olduklarını ölçebilsin diye haritalar ve konum var. Premium katman için uygulama içi satın almalar ve gerçekten bir şey olduğunda — bir eşleşme veya yeni bir mesaj gibi — insanları geri getirmek için push bildirimleri var.
Expo bunun çoğunu taşıdı. Yönetilen iş akışı, her gün Xcode ve Android Studio'nun içinde yaşamadan native modüllere uzanmamı sağladı; bu da beni derleme yapılandırması yerine ürüne odaklı tuttu. Sürtünmesiz değil ve native bölgeye indiğiniz anlar var ama tek başına bir derleme için kaldıraç gerçek.
Kişiye Saygı Gösteren Bildirimler
Push bildirimleri suistimal edilmesi en kolay özellik. Cazibe, özellikle elde tutma (retention) baskısıyla, insanları sürekli dürtmek. Bunun tam tersini yapmaya çok çalıştım. Bir bildirim, bilmek istediğinizi söylediğiniz bir şeyin olduğu anlamına gelmeli: birisi sizinle katılmak istiyor, birisi yanıtladı, kaydettiğiniz bir etkinlik yakında. Başka bir şey değil. İmal edilmiş aciliyet yok, sizi geri sürüklemek için sahte aktivite yok.
Neden kısmen etik kısmen pratik. Kurt geldi diye bağıran bir sosyal uygulama, insanları kendini görmezden gelmeye alıştırır ve sesi kapatılmış bir uygulama ölü bir uygulamadır. Buradaki kısıtlama bir incelik değil. Dürüst de olan bir elde tutma stratejisi.
Güven ve Moderasyon Asıl Üründür
En çok hafife aldığım özellik moderasyondu. Yabancıların birbirine mesaj atmasına ve şahsen buluşmasına izin verdiğiniz an, güvenlik sorumluluğunu üstlenmiş olursunuz. Yönetici panelinin var olmasının ve onu sonradan akla gelen bir şey yerine erken inşa etmemin nedeni bu. Raporlama, engelleme, işaretlenmiş konuşmaları inceleme ve kötü aktörleri kaldırma, üzerine yamanan eklentiler değil, birinci sınıf akışlardır.
Bir arkadaşlık uygulamasını bunu ciddiye almadan dürüstçe inşa edebileceğinizi düşünmüyorum. Teknoloji, soketler, oturum açma ve haritalar, kolay yüzde 60. Kalan yüzde 40, insan katmanı: insanların daveti en baştan kabul edecek kadar güvende hissetmesini sağlamak. Eşlik Et bana, bir sosyal ürünün aslında bir uygulamanın kıyafetlerini giymiş bir güven ürünü olduğunu öğretti ve her teknik karar ya o güveni kazanıyor ya da onu sessizce aşındırıyor.