← Wszystkie notatki

Nie zrobiłem wielu list. Zrobiłem kilka rodzin na jednym telefonie

Sławek Łukjanow · · Nie jednym promptem · odcinek 10 · Read in English

Od początku Zakupomat ma jedną zasadę, której pilnuję jak oka w głowie - jedna rodzina, jedna lista. Żadnych "Lista Biedronka", "Lista na grilla", "Lista mamy". Wspólna lista całego domu, zawsze aktualna. Na stronie, w sekcji "czego nie ma", stoi czarno na białym: wiele list.

A jednak co jakiś czas wraca pytanie: a co, jeśli robię zakupy dla firmy i dla domu? A co, jeśli robię zakupy rodzicom? Albo jestem w dwóch rodzinach naraz - w jednej dopisuję, w drugiej kupuję?

Podpowiedź przyszła z nieoczekiwanej strony. Anthropic po wielu miesiącach w końcu dodał w aplikacji Claude'a logowanie na kilka kont naraz. Wreszcie mam na telefonie razem prywatnego Claude'a i firmowe - bo niektórzy klienci wymagają pracy w swoich, kontrolowanych przez nich środowiskach. Przełączam się między nimi bez wylogowywania i pomyślałem: przecież tego samego brakuje w Zakupomacie!

Więc jednego sobotniego wieczoru, w trakcie zbierania wersji 1.10, napisałem do Claude'a: "W ogóle w tej wersji marzy mi się jeszcze zrobienie kompletnie nowej rzeczy - przełączanie rodziny 🙂".

Wiele list czy wiele rodzin?

"Wiele list" od miesięcy siedzi w brainie projektu w sekcji "Nierozstrzygnięte". Są dwa konkurencyjne modele i żaden mnie nie przekonał. Dlatego nie chciałem go ruszać przy okazji.

Ale jak się dobrze przyjrzeć, firma i dom to nie są dwie listy jednej rodziny. To dwie różne grupy ludzi. W firmie dopisuje ktoś z biura, w domu - Marta. Mają różne produkty, różną kolejność sklepu, różne klucze. To są po prostu dwie rodziny. Brakowało tylko tego, żeby jeden telefon mógł być w obu.

I tak zapisaliśmy decyzję: osobne listy dla osobnych grup ludzi to osobne rodziny na jednym telefonie. "Wiele list w jednej rodzinie" zostaje otwarte, nietknięte. Zasada "jedna rodzina, jedna lista" - też.

Nie zabieraj ludziom "Wyloguj"

Claude przygotował projekt. Menu "Rodziny", lista z zaznaczoną otwartą, "Dołącz do innej", "Załóż nową", "Odłącz od tego telefonu". Wszystko sensowne. Tylko jeden punkt mi zazgrzytał - "Wyloguj" znika z menu, bo przecież odłączanie jest teraz w "Rodzinach".

Nie. Większość rodzin nigdy nie będzie miała drugiej. Dla nich to byłby jeden krok więcej i zmiana, o którą nikt nie prosił. A ja mam zasadę - nowa funkcja nie zmienia nic tym, którzy z niej nie korzystają.

Więc: "Wyloguj" zostaje, dopóki rodzina jest jedna. Znika dopiero przy drugiej. Tak samo dotknięcie nazwy rodziny w górnym pasku - przełącza tylko wtedy, gdy jest między czym przełączać. Kto ma jedną rodzinę, nie widzi żadnej różnicy.

Do tego dwa pomysły Claude'a, które przyjąłem od razu. Link zaproszenia do innej rodziny już nie zastępuje obecnej - pyta "Dodać tę rodzinę?" i dodaje. A "Usuń konto" nazywa się teraz "Usuń rodzinę". Bo kont w Zakupomacie nigdy nie było 😉

Odłączyć i nie zgubić

Najbardziej bałem się jednego scenariusza. Ktoś odłącza rodzinę od telefonu, a był jej jedynym członkiem i nigdzie nie zapisał klucza. Rodzina z całą bazą produktów zostaje gdzieś na serwerze, nie do odzyskania.

Dlatego odłączanie zawsze pokazuje klucz. A jeśli serwer wie, że przez ostatnie 30 dni nikt inny z tej rodziny nie korzystał, dialog ostrzega i proponuje "Usuń rodzinę".

Skąd serwer to wie? Z nowych statystyk użycia z tej samej wersji - losowy identyfikator instalacji, bez żadnej treści listy. I tu ważny szczegół - ta heurystyka myli się zawsze w bezpieczną stronę. Starsze wersje aplikacji, przeglądarka i asystenci AI nie wysyłają identyfikatora, więc liczą się jako "ktoś inny". Lepiej raz nie ostrzec, niż ostrzec, że "nikt poza Tobą", kiedy żona codziennie dopisuje mleko z laptopa. A gdy serwer nie wie (statystyki wyłączone) - dialog niczego nie twierdzi.

Najtrudniejsze: żeby nic nie przeciekło

UI to był mały kawałek. Prawdziwa robota była pod spodem i sprowadzała się do jednego pytania - czyje jest to, co telefon trzyma w pamięci?

Już raz się na tym przejechałem. W lipcu nowa rodzina po zalogowaniu widziała przez chwilę listę POPRZEDNIEJ. Wtedy zapisaliśmy lekcję - każdy stan, który żyje dłużej niż sesja, musi mieć jawną odpowiedź na pytanie "co się z tobą dzieje przy zmianie rodziny". Domyślna odpowiedź "nic" to wyciek danych.

Przy przełączaniu rodzin ta lekcja wróciła z całą gromadką kolegów:

  1. Każda rodzina ma na telefonie swoje szuflady. Kolejka zmian zrobionych bez sieci, ostatnia zapisana lista (żeby bez zasięgu nie było pustego ekranu), karta pierwszych kroków - wszystko trzymane pod kluczem z dopiskiem, do której rodziny należy. Ale ustawienia, motyw, język czy rekord w grze należą do telefonu, czyli do człowieka. Rozdzielenie "co jest rodziny, a co osoby" zajęło więcej myślenia niż cały ekran.
  2. Telefony z poprzedniej wersji. One mają te same dane, tylko bez dopisku. Przy pierwszym starcie 1.10 przenosimy je raz pod rodzinę, która jest na telefonie. Gdyby tego zabrakło, pierwsza dodana rodzina dostałaby w spadku kolejkę zmian poprzedniej 😮
  3. 401 musi trafić w tę rodzinę, której dotyczy. Serwer odpowiada "nie znam tego klucza" (np. ktoś usunął rodzinę na innym telefonie), a my w tym czasie już przełączyliśmy się na inną. Zdjęlibyśmy z telefonu złą rodzinę. Teraz błąd niesie ze sobą klucz, którego dotyczył.
  4. Spóźnione odpowiedzi. Odświeżenie listy wystartowało dla rodziny A, odpowiedź wróciła, kiedy na ekranie jest już B. Bez zabezpieczenia lista domu pokazałaby się w firmie. Teraz każde odświeżenie pamięta, dla kogo startowało, i jeśli rodzina się zmieniła - wynik ląduje w koszu.
  5. Połączenie na żywo. Aplikacja nasłuchuje zmian z serwera, żeby wszyscy widzieli to samo w tej samej sekundzie. Po przełączeniu musi przepiąć się na nową rodzinę. Przy implementacji wyszło, że zmiana nazwy starej rodziny nadpisywała nazwę nowej 😂
  6. Zmiany zrobione bez sieci. Odhaczyłeś trzy produkty w piwnicy sklepu i przełączasz na firmę. Przed przełączeniem kolejka dostaje kilka sekund na wysłanie. Co nie zdąży, czeka spokojnie przy swojej rodzinie, a nie leci do tej, która jest otwarta.

Było jeszcze kilka drobniejszych, jak flaga "zaproszenie wysłane", która podczas zakładania nowej rodziny ustawiała się... na starej.

"Boję się, że coś zepsuliśmy"

W trakcie pracy napisałem do Claude'a: "Jeszcze będę chciał przed tym wydaniem zrobić duże testy regresyjne, bo boję się, że coś przegapiliśmy i zepsuliśmy".

Miałem rację. Claude przeszedł aplikację na emulatorze Androida (w wersji zbudowanej jak do sklepu) i na symulatorze iOS, z lokalnym serwerem. I znalazł awarię przy starcie, jeśli w kolejce bez sieci coś czekało. Dokładnie w sytuacji, dla której ta kolejka powstała - "kupiłem bez zasięgu, zamknąłem aplikację". Wszystkie testy były zielone, bo w testach kod startuje odrobinę inaczej niż na telefonie. Do tego znikające bez sieci kategorie, dwa przyciski "wstecz" w jednym miejscu i dialog, który jednym zdaniem przeczył drugiemu.

Żadna z tych rzeczy nie dotyczyła samego przełączania. Wszystkie by poszły do sklepu.

Przeglądarkowa wersja Zakupomatu na razie zostaje przy jednej rodzinie. Ale link do innej rodziny już nie przełącza tam po cichu - najpierw pyta i pokazuje klucz obecnej.


Co to znaczy dla Twojego zespołu: funkcja "przełącz konto" wygląda na jeden ekran, a jest pytaniem o własność każdego kawałka danych w aplikacji. Zanim zaczniecie, zróbcie listę wszystkiego, co aplikacja trzyma dłużej niż jedną sesję, i przy każdej pozycji zapiszcie, czyje to jest. A potem przetestujcie to na prawdziwym telefonie, nie tylko w testach. W ANSLAN tak właśnie pracujemy - decyzje z powodem, a regresja przed każdym wydaniem.

Zakupomat to darmowa aplikacja do wspólnych zakupów rodziny, bez reklam: zakupomat.app. Kilka rodzin na jednym telefonie jest od wersji 1.10.0 - Menu → "Rodziny" 🙂