Steven
Steven8 min di lettura

Cosa serve davvero per una versione 2: 206 commit di stati onesti

La v2 di GeekBye non è stata un rilascio di funzionalità. Sono stati 206 commit puntati a una sola idea: l'app non deve mai mentire sul proprio stato. Ecco quanto costa — incluso l'errore di una riga nel lockfile che per poco non ci ha impedito di rilasciare tutto.

Affidabilità
Ingegneria
Rilascio
Rilasci di GeekBye
Cosa serve davvero per una versione 2: 206 commit di stati onesti

La maggior parte dei rilasci "versione 2" è un mucchio di nuove funzionalità con un numero più grande sopra. La v2 di GeekBye è stata l''opposto. Non ha portato quasi nessuna nuova capacità visibile all''utente. I suoi 206 commit puntavano a una sola idea, per niente glamour:

L''app non deve mai mostrarti uno stato che non è vero.

Sembra ovvio finché non conti in quanti modi un''app desktop mente in silenzio. Mostra una spunta su un upload ancora in volo. Dice "connesso" su un socket morto un minuto fa. Resta zitta mentre la tua trascrizione viene buttata via. Niente di tutto questo è un crash. È peggio di un crash, perché l''app sembra a posto mentre è nel torto — e te ne accorgi solo dopo, quando la registrazione che ti serviva non c''è.

La v2 è stata il rilascio in cui siamo andati a caccia di ognuna di queste piccole bugie.

La bugia che odiavamo di più: l''upload che "ha funzionato"

GeekBye può fare il backup delle tue registrazioni su Google Drive. Nella v1 la connessione a Drive era trattata come un dettaglio in secondo piano — se funzionava, ottimo; se no, il fallimento era per lo più invisibile. L''app continuava a sembrare connessa. Davi per scontato che le tue registrazioni fossero al sicuro. A volte non lo erano.

La v2 ha ricostruito tutto attorno a stati di connessione onesti. Drive è ora sempre in uno di pochi stati espliciti e veritieri — connesso, in riconnessione, disconnesso — e l''app trasmette ogni cambiamento di quello stato all''intera interfaccia nell''istante in cui avviene. Quando la connessione è caduta, un banner globale di riconnessione te lo dice, ovunque, chiaramente. L''app non finge più che un upload sia riuscito quando non lo è. Se il tuo backup non può avvenire proprio ora, lo sai proprio ora — non la settimana prossima, quando andrai a cercare il file.

Sotto, questa è una piccola architettura, non uno slogan: un''unica fonte di verità per la connessione, un evento che si dirama verso ogni parte dell''interfaccia quando cambia, e un banner che legge direttamente da quello stato. Non esiste un percorso in cui la connessione è caduta e l''interfaccia sembra attiva, perché entrambe leggono dallo stesso fatto.

La bugia della registrazione persa

La seconda grande correzione di onestà è stata il recupero delle registrazioni. La trascrizione in tempo reale ha bisogno di una connessione viva. Nella v1, se quella connessione aveva un singhiozzo a metà sessione — un lampeggio di Wi-Fi, un tunnel, una riconnessione VPN — l''audio durante il buco poteva semplicemente sparire. La trascrizione aveva un buco, e niente ti avvisava.

La v2 ha cambiato il contratto: l''audio viene conservato in locale durante un''interruzione di connessione e riconciliato dopo. Quando il collegamento cade, GeekBye tiene l''audio al sicuro sulla tua macchina; quando torna, quell''audio in buffer viene inviato e ricucito nella trascrizione al punto giusto. Trenta brutti secondi di rete non ti costano più trenta secondi di riunione. Questa è la base su cui i successivi rilasci di affidabilità hanno costruito direttamente — la meccanica di riconnessione-e-buffer in perché il tuo notetaker con IA si ferma con un cattivo Wi-Fi è la stessa idea, irrobustita.

La bugia della tempesta di popup

C''è una disonestà più sottile nel modo in cui le app segnalano i problemi: li sovra-segnalano. Un solo momento instabile di rete può far scattare lo stesso errore cinque volte, e all''improvviso hai una pila di notifiche rosse identiche che seppellisce l''unico messaggio che conta. Nemmeno quello è onesto — è rumore che si spaccia per informazione.

Così la v2 ha aggiunto la limitazione delle notifiche per categoria e l''instradamento degli errori. Gli errori vengono raggruppati per ciò che sono davvero, e ogni categoria è limitata in frequenza così che un singolo problema di fondo produca un messaggio chiaro, non una raffica. Un problema di limite di frequenza viene instradato a un messaggio di limite di frequenza; un problema di connessione a un messaggio di connessione. L''app ti dice cosa è vero, una volta — la stessa disciplina che dopo ha impedito a un 429 di spacciarsi per un logout ne il giorno in cui la nostra app ha fatto DDoS a sé stessa.

Il numero 206 è il punto

Stati onesti, banner di riconnessione, recupero delle registrazioni, instradamento delle notifiche — sono quattro idee. Il rilascio è stato di 206 commit. Dov''è finito il resto?

Nella lunga coda per niente glamour che "non mostrare mai uno stato falso" richiede davvero. Ogni punto in cui la vecchia interfaccia poteva desincronizzarsi dalla realtà ha dovuto essere trovato e ricablato per leggere dalla verità invece che da una copia stantia. Ogni percorso di riconnessione ha dovuto essere costretto ad aggiornare lo stato condiviso invece di indovinare in locale. Decine di piccole correzioni di affidabilità attraverso registrazione, trascrizione e upload — ciascuna che chiudeva una specifica falla in cui l''app poteva sembrare giusta mentre era nel torto.

Questo è ciò che costa una "versione 2" vera quando l''obiettivo è la fiducia invece delle funzionalità. Non c''è un singolo commit di punta. Ce ne sono 206 piccoli, e il rilascio sembra una sola cosa — calma — solo perché tutti e 206 tirano nella stessa direzione.

Il rilascio per poco non partiva

Ecco l''aneddoto di guerra, ed è buono, perché parla della nostra stessa app che mente a noi.

Quando prepari un rilascio, uno script di cambio versione stampa il nuovo numero in tutto il progetto. Sulla v2.0.0 ha aggiornato la versione dell''app — ma il package-lock.json, il registro esatto delle dipendenze di npm, è rimasto puntato alla versione vecchia, 1.9.0. In locale, tutto a posto; nessuno reinstalla le dipendenze solo per compilare. Ma la CI esegue npm ci, e l''intero compito di npm ci è rifiutarsi di procedere se il lockfile è in disaccordo con il manifesto. È una funzione di rigore — e ha fatto esattamente ciò che doveva, facendo fallire la build del più grande rilascio che avessimo mai preparato.

Poi ne è emerso un secondo, più subdolo, sotto. Un npm più recente aveva potato una dipendenza transitiva opzionale — il pacchetto encoding che node-fetch si porta dietro — dal lockfile in quanto non necessaria. Solo che l''installazione pulita della nostra CI ne aveva bisogno, così l''installazione si è rotta in un modo che non aveva nulla a che fare con il nostro codice e tutto a che fare con il registro sottilmente sbagliato.

Entrambe erano correzioni di una riga: risincronizzare il lockfile alla versione reale, ripristinare la voce potata. Entrambe sono anche esempi perfetti e umilianti proprio della cosa di cui parlava la v2 — uno stato che sosteneva di essere vero e non lo era. Il lockfile dovrebbe essere il registro onesto di ciò da cui l''app dipende. Quando è andato alla deriva dalla realtà, la build ha fatto esattamente ciò che ora la nostra app fa per gli utenti: si è rifiutata di fingere che tutto andasse bene. Rilasciare un rilascio di affidabilità si rivela un problema di affidabilità fino in fondo.

Tre cose che la v2 ci ha insegnato

  1. I guasti pericolosi sono quelli silenziosi. Un crash si annuncia da sé. Un falso "connesso", un upload riuscito fantasma, una trascrizione con un buco invisibile — quelli ti costano fiducia proprio perché niente sembra sbagliato. Vai a caccia delle bugie silenziose.
  2. L''onestà è un''architettura, non un messaggio. Non puoi avvitare "di' la verità" su un''interfaccia come un banner. Il banner deve leggere dalla stessa unica fonte di verità di tutto il resto, o diventa una cosa in più che può sbagliare. Un fatto, diramato — mai due copie che possono essere in disaccordo.
  3. Una versione 2 che merita il numero è per lo più invisibile. Se la tua v2 è un elenco di funzionalità, è una v1.5 con del marketing. Una v2 vera sono 206 commit che nessuno può indicare singolarmente, che si sommano in un prodotto che semplicemente smette di mentirti.

La v2.0.0 di GeekBye è la base su cui ogni rilascio da allora ha costruito. Per ciò che quella base regge, guarda perché il tuo notetaker con IA si ferma con un cattivo Wi-Fi, il giorno in cui la nostra app ha fatto DDoS a sé stessa (v2.0.1) e la trascrizione in diretta quando il firewall blocca i WebSocket (v2.0.8). Per la calma al servizio della quale tutto questo è stato, le novità di GeekBye v2.