
Hva en versjon 2 faktisk krever: 206 commits med ærlige tilstander
GeekBye v2 var ikke en funksjonslansering. Det var 206 commits rettet mot én enkelt idé: appen skal aldri lyve om sin egen tilstand. Her er hva det koster — inkludert den ettlinjes lockfile-tabben som nesten hindret oss i å lansere noe av det.
De fleste "versjon 2"-lanseringer er en haug med nye funksjoner med et større tall på seg. GeekBye v2 var det motsatte. Den lanserte nesten ingen ny brukervendt funksjonalitet. Dens 206 commits var rettet mot én enkelt, uglamorøs idé:
Appen skal aldri vise deg en tilstand som ikke er sann.
Det høres opplagt ut helt til du teller hvor mange måter en desktop-app stille lyver på. Den viser et hakemerke på en opplasting som fortsatt er underveis. Den sier "tilkoblet" over en socket som døde for et minutt siden. Den er taus mens transkripsjonen din blir sluppet på gulvet. Ingen av disse er krasj. De er verre enn krasj, for appen ser fin ut mens den tar feil — og du oppdager det først senere, når opptaket du trengte ikke er der.
v2 var lanseringen der vi gikk på jakt etter hver eneste en av disse små løgnene.
Løgnen vi hatet mest: opplastingen som "gikk bra"
GeekBye kan sikkerhetskopiere opptakene dine til Google Drive. I v1 ble tilkoblingen til Drive behandlet som en bakgrunnsdetalj — hvis den virket, flott; hvis den ikke gjorde det, var feilen stort sett usynlig. Appen fortsatte å se tilkoblet ut. Du antok at opptakene dine var trygge. Noen ganger var de ikke det.
v2 bygde dette på nytt rundt ærlige tilkoblingstilstander. Drive er nå alltid i én av noen få eksplisitte, sannferdige tilstander — tilkoblet, kobler til igjen, frakoblet — og appen kringkaster hver endring av den tilstanden til hele grensesnittet i det øyeblikket den skjer. Når forbindelsen er nede, forteller et globalt gjenoppkoblingsbanner deg det, overalt, tydelig. Appen later ikke lenger som en opplasting lyktes når den ikke gjorde det. Hvis sikkerhetskopien din ikke kan skje akkurat nå, vet du det akkurat nå — ikke neste uke når du går for å lete etter filen.
Under panseret er dette en liten arkitektur, ikke et slagord: én sannhetskilde for forbindelsen, en hendelse som sprer seg ut til hver del av grensesnittet når den endres, og et banner som leser direkte fra den tilstanden. Det finnes ingen vei der forbindelsen er nede og grensesnittet ser oppe ut, for de leser fra samme faktum.
Løgnen om det tapte opptaket
Den andre store ærlighetsfiksen var opptaksgjenoppretting. Sanntidstranskripsjon trenger en levende forbindelse. I v1, hvis den forbindelsen hakket midt i en økt — et Wi-Fi-blaff, en tunnel, en VPN-gjenoppkobling — kunne lyden under bruddet rett og slett være borte. Transkripsjonen ville ha et hull i seg, og ingenting fortalte deg det.
v2 endret kontrakten: lyd bevares lokalt under et tilkoblingsbrudd og avstemmes etterpå. Når forbindelsen faller, holder GeekBye lyden trygg på maskinen din; når den kommer tilbake, sendes den bufrede lyden og sys inn i transkripsjonen på rett sted. Et dårlig halvminutt med nettverk koster deg ikke lenger et halvminutt av møtet. Dette er grunnarbeidet de senere pålitelighetslanseringene bygde direkte videre på — gjenoppkoblings- og buffermaskineriet i hvorfor AI-notatverktøyet ditt stopper på dårlig Wi-Fi er den samme ideen, herdet.
Løgnen om popup-stormen
Det finnes en mer subtil uærlighet i hvordan apper rapporterer trøbbel: de overrapporterer det. Ett ustabilt nettverksøyeblikk kan avfyre samme feil fem ganger, og plutselig har du en stabel identiske røde toaster som begraver den ene meldingen som betyr noe. Det er heller ikke ærlig — det er støy som later som den er informasjon.
Så v2 la til kategorinøklet toast-struping og feildirigering. Feil grupperes etter hva de faktisk er, og hver kategori strupes slik at ett underliggende problem produserer én tydelig melding, ikke et bombardement. Et hastighetsgrenseproblem dirigeres til en hastighetsgrensemelding; et tilkoblingsproblem dirigeres til en tilkoblingsmelding. Appen forteller deg hva som er sant, én gang — den samme disiplinen som senere hindret en 429 i å utgi seg for å være en utlogging i dagen appen vår DDoS-et seg selv.
Tallet 206 er hele poenget
Ærlige tilstander, gjenoppkoblingsbanner, opptaksgjenoppretting, toast-dirigering — det er fire ideer. Lanseringen var 206 commits. Hvor ble resten av?
Inn i den uglamorøse lange halen som "aldri vis en falsk tilstand" faktisk krever. Hvert sted der det gamle grensesnittet kunne komme ut av synk med virkeligheten måtte finnes og kobles om til å lese fra sannheten i stedet for en utdatert kopi. Hver gjenoppkoblingsvei måtte lages slik at den oppdaterte den delte tilstanden i stedet for å gjette lokalt. Dusinvis av små pålitelighetsfikser på tvers av opptak, transkripsjon og opplastinger — hver enkelt lukket et bestemt gap der appen kunne se riktig ut mens den tok feil.
Dette er hva en ekte "versjon 2" koster når målet er tillit i stedet for funksjoner. Det finnes ingen enkelt overskriftscommit. Det finnes 206 små, og lanseringen føles bare som én ting — rolig — fordi alle 206 drar i samme retning.
Lanseringen ble nesten ikke sluppet
Her er krigshistorien, og det er en god en, for den handler om at vår egen app lyver for oss.
Når du kutter en lansering, stempler et versjonshopp-skript det nye tallet på tvers av prosjektet. På v2.0.0 oppdaterte det appens versjon — men package-lock.json, npms nøyaktige avhengighetsprotokoll, ble stående og pekte på den gamle versjonen, 1.9.0. Lokalt var alt fint; ingen reinstallerer avhengigheter bare for å bygge. Men CI kjører npm ci, og hele jobben til npm ci er å nekte å fortsette hvis lockfilen er uenig med manifestet. Det er en strenghetsfunksjon — og den gjorde nøyaktig det den skulle, ved å la byggingen feile for den største lanseringen vi noensinne hadde kuttet.
Så dukket en andre, mer lurete opp under den. En nyere npm hadde beskåret bort en valgfri transitiv avhengighet — encoding-pakken som node-fetch drar inn — ut av lockfilen som unødvendig. Bortsett fra at CI-ets rene installasjon trengte den, så installasjonen brøt sammen på en måte som ikke hadde noe med koden vår å gjøre og alt med at protokollen var subtilt feil.
Begge var ettlinjes fikser: synk lockfilen på nytt til den ekte versjonen, gjenopprett den beskårne oppføringen. Begge er også perfekte, ydmykende eksempler på nøyaktig det v2 handlet om — en tilstand som hevdet å være sann og ikke var det. Lockfilen skal være den ærlige protokollen over hva appen avhenger av. Da den drev bort fra virkeligheten, gjorde byggingen nøyaktig det appen vår nå gjør for brukere: den nektet å late som alt var fint. Å lansere en pålitelighetslansering viser seg å være et pålitelighetsproblem hele veien ned.
Tre ting v2 lærte oss
- De farlige feilene er de stille. Et krasj kunngjør seg selv. En falsk "tilkoblet", en fantomvellykket opplasting, en transkripsjon med et usynlig hull — de koster deg tillit nettopp fordi ingenting ser galt ut. Jakt på de stille løgnene.
- Ærlighet er en arkitektur, ikke en melding. Du kan ikke bolte "fortell sannheten" på et grensesnitt som et banner. Banneret må lese fra den samme enkeltstående sannhetskilden som alt annet, ellers blir det enda en ting som kan ta feil. Ett faktum, spredd ut — aldri to kopier som kan være uenige.
- En versjon 2 som er tallet verdig er stort sett usynlig. Hvis v2-en din er en funksjonsliste, er den en v1.5 med markedsføring. En ekte v2 er 206 commits ingen kan peke på enkeltvis, som legger seg sammen til et produkt som rett og slett slutter å lyve for deg.
GeekBye v2.0.0 er fundamentet hver lansering siden har bygget på. For hva det fundamentet bærer, se hvorfor AI-notatverktøyet ditt stopper på dårlig Wi-Fi, dagen appen vår DDoS-et seg selv (v2.0.1), og livetranskripsjon når brannmuren blokkerer WebSockets (v2.0.8). For roen det hele var i tjeneste av, hva som er nytt i GeekBye v2.