Kasada internet yok: offline-first bir barkod sözlüğü nasıl çalışır
Market kasasında PLU kodu aramak yeni personel için bir kâbustur. Barkodum'da aramanın ilk tuşta sonuç vermesi bir optimizasyon değil, mimarinin kendisiydi — SQLite, gömülü veri setleri ve tek elle kullanım üzerine saha notları.
Market kasasında iki şey her zaman doğrudur: sıra vardır ve ağ yoktur. Depo tarafında Wi-Fi çekmez, kasiyerin bir eli doludur, ve müşteri bekler. Barkodum'un tüm tasarımı bu üç kısıttan çıktı.
Problemi masabaşında değil, kasada gördüm
Fikir bir ürün toplantısında doğmadı. Market sektöründe aktif olarak çalışırken, kasa sürecinin en çok nerede tıkandığını her gün bizzat gördüm: tartılarak satılan ürünler. Manav reyonundaki bir meyve ya da fırından çıkan bir ekmek türü barkodsuz geliyor ve kasada PLU kodunun bilinmesini gerektiriyor.
Deneyimli personel bu kodları zamanla ezberliyor. Ama ekibe yeni katılan bir arkadaş için tablo şu: kâğıt bir listeyi karıştırmak, yanındakine sormak ya da deneme yanılma. Üçü de sıranın uzadığı anda yapılacak en kötü şey. Kaybedilen sadece zaman değil, yeni personelin üstündeki baskı da artıyor.
Aradığım çözüm el terminali ya da kasadaki bilgisayar ekranı değildi — personelin zaten cebinde olan telefon, üç saniyede cevap veren sade bir ekran.
Ağı denklemin dışına almak
İlk sürümde ürün kataloğunu bir API'den çekmeyi düşünmüştüm. Sahada bir gün geçirmek
bu fikri bitirdi: 200 ms'lik bir istek bile, elleri dolu bir insanın algısında
"donmuş uygulama" demek. Katalog artık uygulamanın içinde geliyor ve SQLite
tablolarına ilk açılışta yazılıyor.
- Migros ve Şok için gerçek veri setleri
- A101 ve BİM için yapıyı test etmeye yarayan yapay veri setleri
- Kullanıcı tercihleri
Shared Preferencesiçinde, veri katmanından tamamen ayrı
Depo katında, bodrumda ya da şebekenin zayıf olduğu kasa bölgesinde uygulama hiç fark etmiyor: sorgu zaten cihazın kendi hafızasında dönüyor.
Aramanın ilk tuşta dönmesi
Arama, barkodun herhangi bir parçasıyla ve ürün adıyla eşleşmek zorundaydı. Çözüm zarif değil ama hızlı: normalize edilmiş bir arama sütunu, sorgu öncesinde hesaplanan Türkçe küçük harf dönüşümü ve tek bir indeks.
final rows = await db.query(
'products',
where: 'code LIKE ? OR search_name LIKE ?',
whereArgs: ['$q%', '%$q%'],
limit: 50,
);
limit 50 burada performans hilesi değil, arayüz kararı: kasiyer zaten ilk üç
satırdan fazlasına bakmıyor.
Her market kendi listesini kurabilsin
Tek bir zincire göre sabitlenmiş bir uygulama, ikinci mağazada işe yaramaz. Bu yüzden veri tabanını kapalı bir katalog değil, kullanıcının üstüne yazabileceği bir taban olarak kurdum:
- Kullanıcı kendi mağaza profilini ("yeni market") oluşturabiliyor
- Kategori ağacını kendi reyon düzenine göre yeniden düzenleyebiliyor
- Gün içinde en çok satan ürünler Favoriler'e alınıp tek dokunuşla açılıyor
Aynı yapı marketin dışında da çalışıyor: manav, aktar, kuruyemişçi ya da barkodla hızlı ürün takibi yapmak isteyen her ölçekteki perakende işletmesi kendi listesini kurup kullanabiliyor.
Tek elle kullanım
Material 3 bileşenlerini olduğu gibi kullandım ama yerleşimi değiştirdim. Sayısal tuş takımı ekranın altında, başparmağın doğal yayında duruyor; sonuç listesi yukarı doğru büyüyor. Klavye hiç açılmıyor, çünkü sistem klavyesi ekranın yarısını yiyor ve harf tuşlarına burada gerek yok.
Uzun vardiyayı düşünerek açık ve koyu tema arasında anlık geçiş de var — kasa başında sekiz saat geçiren birinin ekranı, sabahki ekranla aynı parlaklıkta olmak zorunda değil.
Açık kaynak ve dağıtım
Barkodum'un tüm kod tabanı GitHub'da açık. Hem Android (.apk) hem iOS (.ipa)
çıktıları projenin Releases bölümünden doğrudan indirilip kurulabiliyor —
geliştirme sürecini şeffaf tutmak, benzer bir ihtiyacı olan başka birinin
sıfırdan başlamasını da gereksiz kılıyor.
Sonuç
İnternet bağlantısı olmayan bir cihazda, ortalama üç tuşta doğru ürün. Perakendede "küçük" görünen ama her gün yüzlerce kez tekrarlanan bir işlem, tekrar sayısı kadar büyüyor — ve asıl kazanç, yeni başlayan bir arkadaşın ilk haftasında kimseye sormak zorunda kalmaması.