
Klidný software: Jak jsme zabili blikající přepínač a naučili chat říkat, v jakém je režimu
Dvě malá vydání GeekBye, žádné velké funkce — jen přepínač v nastavení, který přestal blikat, a chatovací asistent, který ti konečně řekne, jestli odpověděl v režimu schůzky, nebo v režimu kódování. Přesně tolik ve skutečnosti stojí „klidný software", jeden detail po druhém.
Ne každé vydání je válečný příběh. Některá jsou jen seznamem malých, téměř neviditelných věcí, které byly potichu špatně — takové ty věci, které nic nezhroutí, ale kvůli kterým aplikace působí trochu nedůvěryhodně, trochu roztřeseně, trochu ne-tvoje. GeekBye v2.0.3 a v2.0.5 byla dvě z nich. Žádné nové funkce. Jen klid.
„Klidný software" zní jako nálada. Ve skutečnosti je to hromada konkrétních rozhodnutí. Tady jsou tři z nich.
Přepínač, který se nedokázal rozhodnout
Byl tam jeden přepínač v nastavení — ten, který řídí obnovu zvuku — a při kliknutí blikal. Zapneš ho a na zlomek vteřiny ukáže zapnuto, pak skočí zpátky na vypnuto a nakonec se ustálí. Drobné vizuální zaškobrtnutí, ale oko ho zachytí a čte ho jako aplikace si není jistá, co dělá.
Příčinou je klasický souboj v UI zvaný optimistická aktualizace. Když klikneš na přepínač, aplikace má dvě možnosti: počkat, až se nastavení skutečně uloží, a teprve pak aktualizovat spínač (správné, ale působí to zpožděně), nebo spínač přehodit okamžitě a uložit na pozadí (působí to okamžitě). GeekBye dělalo to druhé — přehodit ihned —, ale zároveň znovu načítalo uloženou hodnotu, když se vrátila. Takže sled byl tento: klikneš, spínač se optimisticky přehodí na zapnuto, o chvíli později dorazí skutečná uložená hodnota a na jeden snímek se ty dvě neshodnou a spínač viditelně poskočí.
Oprava spočívá v tom, aby se optimistická a potvrzená hodnota čistě shodly — spínač se přikloní ke stavu, který sis zvolil, a přestane se sám sebe podezřívat, když se uložení potvrdí. Vedle toho v2.0.3 provedla neokázalou úpravu textů: popis obnovy zvuku byl zkrácen tak, aby ladil se sousedními řádky, a formulace v nastavení byly polidštěny. Nic z toho není funkce. Všechno dohromady je ten rozdíl mezi panelem nastavení, který působí naprogramovaně, a takovým, který působí pečlivě dopilovaně.
Prohlídka, která nechtěla odejít
Prohlídky pro nové uživatele jsou užitečné právě jednou. Problém je právě v té jednorázovosti: jakmile ji jednou vidíš, úvodní překryv, který nejde zavřít, se stane nepořádkem, jenž signalizuje tahle aplikace si pořád myslí, že jsi tu nový. v2.0.3 opravila oba konce toho — prohlídku produktu teď lze skrýt, a pokud ji opravdu chceš zpátky, je tu tlačítko Přehrát prohlídku znovu. Ukaž ji, když pomáhá, ustup z cesty, když ne, a nech uživatele, ať si ji vyvolá za svých podmínek. Respektovat, že uživatel už není nový, je svou vlastní malou formou klidu.
Asistent, který nechtěl říct, jak přemýšlí
Tohle byla ta věc, na které skutečně záleželo, a spojuje se s hlubším problémem, který jsme pronásledovali.
Asistent GeekBye odpovídá jinak podle kontextu. Na schůzce by „co si o tom myslíš?" mělo dostat konverzační odpověď zohledňující schůzku. Během kódování by stejná slova měla dostat odpověď technickou. Takže backend prožene otázku správným rámcem — říkejme mu režim schůzky nebo režim kódování — a to zarámování skutečně mění odpověď, kterou dostaneš.
Potíž: aplikace ti nikdy neřekla, který režim odpověděl. Takže když ti asistent dal odpověď s příchutí kódu na konverzační otázku — nebo odpověděl na programátorskou otázku, jako bys jen tlachal — vypadalo to, jako by se AI prostě spletla. Nespletla se; byla v tom druhém režimu a ty jsi neměl jak to poznat. Skrytý stav způsoboval, že správné chování vypadalo rozbitě. (Samotná logika režimů je větší kus práce — orchestrátor, který rozhoduje, jak odpovídat na neprogramátorské otázky během programovací relace — ale nic z toho ti není k ničemu, pokud nevidíš rozhodnutí, které učinil.)
v2.0.5 přidala do chatu odznak režimu pouze pro čtení: malý štítek ukazující, zda asistent odpověděl v režimu schůzky, nebo v režimu kódování. Právě to „pouze pro čtení" je celá pointa — není to ovládací prvek, který nastavuješ, je to okno do rozhodnutí, které systém už učinil. Přestaneš hádat, proč ti odpověď připadá mimo; vidíš rámec, ze kterého vzešla.
Detail, který dělá ten odznak poctivým
Tady je inženýrské rozhodnutí, které stojí za předání dál, protože je to přesně to, co odlišuje na-koleně-přišroubovaný indikátor od důvěryhodného.
Informace o režimu přichází z backendu jako součást streamované odpovědi — malý rámec mode v proudu událostí odesílaných serverem. Jenže starší klient, který předchází této funkci, by nevěděl, co rámec mode je; v lepším případě ho ignoruje, v horším vykreslí něco zpřeházeného. Klient proto ohlásí svou schopnost: pošle hlavičku požadavku, která říká umím zobrazit odznak režimu, a backend vysílá rámec mode jen klientům, kteří ji poslali. Staré klienty nikdy nedostanou signál, se kterým si neporadí; nové klienty dostanou přesně ten rámec, o který požádaly.
Je to jednohlavičkové podání ruky a je to rozdíl mezi „přidali jsme funkci" a „přidali jsme funkci, aniž bychom rozbili kohokoli, kdo ještě neaktualizoval." Stejná revize dotáhla i zbytek chování: odznak se sám vymaže při resetu a při změně kontextu konverzace (zastaralý štítek režimu je svou vlastní malou lží) a zobrazuje se jen v zobrazení chatu, kam patří.
Co nás naučila dvě vydání „bez funkcí"
- Roztřesenost je signál důvěry. Blikající přepínač, poskakující spínač, štítek, který se drží o snímek déle, než má — žádné z toho není chyba ve smyslu pádu, ale každé šeptá tahle aplikace to nemá tak úplně pod kontrolou. Klid je nepřítomnost těch šepotů a zasloužíš si ho jednou souběžnou chybou po druhé.
- Skrytý režim způsobuje, že správné chování vypadá jako chyba. Asistent dělal správnou věc a byl za to obviňován, čistě proto, že uživatel neviděl ten rámec. Když tvůj systém učiní neviditelné rozhodnutí, které mění výstup, ukaž to rozhodnutí — odznak pouze pro čtení je často celé řešení.
- Nové funkce by měly být neviditelné pro klienty, kteří je neumějí použít. Podání ruky přes hlavičku schopnosti znamená, že signál o režimu dosáhne jen klientů, kteří ho umějí vykreslit. Zpětná kompatibilita není kontrola verze přišroubovaná dodatečně; je to klient, který říká, čemu rozumí, a server, který tu odpověď respektuje.
Tohle jsou vydání, o kterých nikdo nepíše titulky changelogu, a jsou velkou částí toho, proč GeekBye v2 působí tak, jak působí. O vydání, na kterém byl tento klid postaven, viz co skutečně obnáší verze 2 (v2.0.0). O práci na spolehlivosti vedle toho den, kdy si naše aplikace udělala DDoS sama na sebe (v2.0.1) a proč tvůj AI zapisovač poznámek přestane nahrávat uprostřed schůzky (v2.0.9).