
Co Skutečně Obnáší Verze 2: 206 Commitů Poctivých Stavů
GeekBye v2 nebylo vydání s novými funkcemi. Bylo to 206 commitů namířených k jediné myšlence: aplikace by nikdy neměla lhát o svém vlastním stavu. Tady je, co to stojí — včetně jednořádkové chyby v lockfile, která nás málem zastavila předtím, než jsme z toho všeho vůbec něco vydali.
Většina vydání „verze 2" je hromada nových funkcí s větším číslem na sobě. GeekBye v2 bylo pravým opakem. Nedodalo téměř žádnou novou schopnost viditelnou pro uživatele. Jeho 206 commitů mířilo k jediné, vůbec ne okázalé myšlence:
Aplikace by ti nikdy neměla ukázat stav, který není pravdivý.
Zní to samozřejmě, dokud nespočítáš, kolika způsoby desktopová aplikace potichu lže. Ukáže zaškrtnutí u nahrávání, které je pořád ve vzduchu. Řekne „připojeno" přes socket, který před minutou umřel. Mlčí, zatímco se tvůj přepis vysype na zem. Nic z toho není pád. Je to horší než pád, protože aplikace vypadá v pořádku, zatímco se mýlí — a zjistíš to až později, když tam nahrávka, kterou jsi potřeboval, není.
v2 bylo vydání, kde jsme se vydali na lov za každou jednu z těchto malých lží.
Lež, kterou jsme nenáviděli nejvíc: nahrání, které „proběhlo"
GeekBye umí zálohovat tvé nahrávky na Google Drive. Ve v1 se připojení k Drive bralo jako detail na pozadí — pokud fungovalo, super; pokud ne, selhání bylo většinou neviditelné. Aplikace dál vypadala připojeně. Předpokládal jsi, že tvé nahrávky jsou v bezpečí. Někdy nebyly.
v2 to přebudovalo kolem poctivých stavů připojení. Drive je nyní vždy v jednom z několika explicitních, pravdivých stavů — připojeno, opětovně se připojuje, odpojeno — a aplikace vysílá každou změnu tohoto stavu do celého rozhraní ve chvíli, kdy nastane. Když je připojení dole, globální lišta pro opětovné připojení ti to řekne, všude, jasně. Aplikace už nepředstírá, že nahrání proběhlo úspěšně, když neproběhlo. Pokud se tvoje záloha právě teď nemůže uskutečnit, dozvíš se to právě teď — ne příští týden, až půjdeš hledat soubor.
Pod tím je to malá architektura, ne slogan: jeden zdroj pravdy pro připojení, událost, která se při změně rozvětví do každé části UI, a lišta, která čte přímo z toho stavu. Neexistuje cesta, kde je připojení dole a UI vypadá nahoře, protože obojí čte ze stejného faktu.
Lež o ztracené nahrávce
Druhou velkou opravou poctivosti byla obnova nahrávek. Přepis v reálném čase potřebuje živé připojení. Ve v1, pokud to připojení zaškobrtlo uprostřed relace — záškub Wi-Fi, tunel, opětovné připojení VPN — zvuk během výpadku mohl jednoduše zmizet. V přepisu byla díra a nic ti to neřeklo.
v2 změnilo dohodu: zvuk je uchováván lokálně během výpadku připojení a poté sladěn. Když spojení spadne, GeekBye drží zvuk v bezpečí na tvém počítači; když se vrátí, ten bufferovaný zvuk se odešle a všije do přepisu na správné místo. Špatných třicet sekund sítě tě už nestojí třicet sekund schůzky. To je základ, na kterém pozdější vydání spolehlivosti stavěla přímo — mechanika opětovného-připojení-a-bufferování v článku proč se tvůj AI zapisovač poznámek zastaví při špatné Wi-Fi je stejná myšlenka, jen zocelená.
Lež o bouři vyskakovacích oken
Existuje jemnější nepoctivost v tom, jak aplikace hlásí problémy: přehlašují je. Jeden nestabilní síťový okamžik může vystřelit stejnou chybu pětkrát, a najednou máš hromadu identických červených toastů pohřbívajících tu jednu zprávu, na které záleží. Ani to není poctivé — je to šum předstírající, že je informace.
Takže v2 přidalo omezování toastů podle kategorie a směrování chyb. Chyby se seskupují podle toho, čím ve skutečnosti jsou, a každá kategorie je omezena mírou, takže jediný podkladový problém vyprodukuje jednu jasnou zprávu, ne palbu. Problém s omezením míry se směruje ke zprávě o omezení míry; problém s připojením se směruje ke zprávě o připojení. Aplikace ti řekne, co je pravda, jednou — stejná disciplína, která později zabránila tomu, aby se 429 vydávalo za odhlášení v článku den, kdy si naše aplikace udělala DDoS sama na sebe.
Číslo 206 je právě ta pointa
Poctivé stavy, lišta pro opětovné připojení, obnova nahrávek, směrování toastů — to jsou čtyři myšlenky. Vydání mělo 206 commitů. Kam šel zbytek?
Do neokázalého dlouhého ocasu, který „nikdy nezobrazuj falešný stav" ve skutečnosti vyžaduje. Každé místo, kde se staré UI mohlo dostat ze synchronizace s realitou, se muselo najít a přepojit, aby četlo z pravdy místo ze zastaralé kopie. Každá cesta opětovného připojení se musela přimět, aby aktualizovala sdílený stav místo hádání lokálně. Desítky malých oprav spolehlivosti napříč nahráváním, přepisem a nahráváními — každá zavírala konkrétní mezeru, kde aplikace mohla vypadat správně, zatímco se mýlila.
Tolik stojí skutečná „verze 2", když je cílem důvěra místo funkcí. Neexistuje jediný titulní commit. Je jich 206 malých a vydání působí jako jedna věc — klid — jen proto, že všech 206 táhne stejným směrem.
Vydání se málem neuskutečnilo
Tady je válečný příběh, a je dobrý, protože je o tom, jak naše vlastní aplikace lhala nám.
Když sestříháváš vydání, skript pro zvýšení verze orazítkuje nové číslo napříč celým projektem. U v2.0.0 aktualizoval verzi aplikace — ale package-lock.json, přesnou účetní knihu závislostí npm, nechal ukazovat na starou verzi, 1.9.0. Lokálně bylo vše v pořádku; nikdo nepřeinstalovává závislosti jen proto, aby buildoval. Ale CI spouští npm ci, a celá práce npm ci je odmítnout pokračovat, pokud lockfile nesouhlasí s manifestem. Je to funkce přísnosti — a udělala přesně to, co měla, tím, že nechala selhat build největšího vydání, jaké jsme kdy sestříhali.
Pak se pod tím vynořila druhá, zákeřnější. Novější npm prořezal volitelnou tranzitivní závislost — balíček encoding, který si node-fetch tahá s sebou — z lockfile jako zbytečnou. Jenže čistá instalace našeho CI ji skutečně potřebovala, takže se instalace rozbila způsobem, který neměl nic společného s naším kódem a všechno společné s tím, že účetní kniha byla jemně chybná.
Obě byly jednořádkové opravy: znovu sesynchronizovat lockfile na skutečnou verzi, obnovit prořezaný záznam. Obě jsou zároveň dokonalými, pokořujícími příklady přesně toho, o čem v2 bylo — stav, který tvrdil, že je pravdivý, a nebyl. Lockfile má být poctivým záznamem toho, na čem aplikace závisí. Když se odchýlil od reality, build udělal přesně to, co teď naše aplikace dělá pro uživatele: odmítl předstírat, že je všechno v pořádku. Ukazuje se, že dodat vydání spolehlivosti je problém spolehlivosti až do úplného dna.
Tři věci, které nás v2 naučilo
- Nebezpečná selhání jsou ta tichá. Pád se ohlásí sám. Falešné „připojeno", fantomní úspěšné nahrání, přepis s neviditelnou dírou — ty tě stojí důvěru právě proto, že nic nevypadá špatně. Lov na tiché lži.
- Poctivost je architektura, ne zpráva. Nemůžeš přišroubovat „říkej pravdu" na UI jako lištu. Lišta musí číst ze stejného jediného zdroje pravdy jako všechno ostatní, jinak se stane další věcí, která může být chybná. Jeden fakt, rozvětvený — nikdy dvě kopie, které si mohou odporovat.
- Verze 2 hodná toho čísla je většinou neviditelná. Pokud je tvá v2 seznam funkcí, je to v1.5 s marketingem. Skutečná v2 je 206 commitů, na které nikdo nemůže ukázat jednotlivě, sčítajících se v produkt, který ti prostě přestane lhát.
GeekBye v2.0.0 je základ, na kterém stavělo každé vydání od té doby. Co ten základ nese, viz proč se tvůj AI zapisovač poznámek zastaví při špatné Wi-Fi, den, kdy si naše aplikace udělala DDoS sama na sebe (v2.0.1) a živý přepis, když firewall blokuje WebSockety (v2.0.8). Pro klid, ve jehož službě to všechno bylo, co je nového v GeekBye v2.