
Mitä versio 2 oikeasti vaatii: 206 committia rehellisiä tiloja
GeekBye v2 ei ollut ominaisuusjulkaisu. Se oli 206 committia yhtä ainoaa ajatusta kohti: sovellus ei saa koskaan valehdella omasta tilastaan. Tässä on, mitä se maksaa — mukaan lukien se yhden rivin lukkotiedostovirhe, joka oli vähällä estää meitä toimittamasta mitään tästä.
Useimmat "versio 2" -julkaisut ovat kasa uusia ominaisuuksia isommalla numerolla varustettuna. GeekBye v2 oli päinvastainen. Se toimitti lähes nolla uutta käyttäjälle näkyvää kykyä. Sen 206 committia tähtäsivät yhteen, epäglamouriseen ajatukseen:
Sovellus ei saa koskaan näyttää sinulle tilaa, joka ei ole totta.
Se kuulostaa itsestäänselvältä, kunnes lasket, kuinka monella tavalla työpöytäsovellus hiljaa valehtelee. Se näyttää vihreän merkin latauksesta, joka on yhä matkalla. Se sanoo "yhdistetty" soketista, joka kuoli minuutti sitten. Se pysyy hiljaa, kun transkriptisi tiputetaan lattialle. Mikään näistä ei ole kaatuminen. Ne ovat kaatumista pahempia, koska sovellus näyttää olevan kunnossa ollessaan väärässä — ja saat tietää vasta myöhemmin, kun tarvitsemaasi tallennetta ei ole.
v2 oli se julkaisu, jossa lähdimme metsästämään jokaista noista pienistä valheista.
Valhe, jota vihasimme eniten: lataus, joka "onnistui"
GeekBye voi varmuuskopioida tallenteesi Google Driveen. v1:ssä yhteyttä Driveen kohdeltiin taustadetaljina — jos se toimi, hyvä; jos ei, virhe oli enimmäkseen näkymätön. Sovellus jatkoi näyttäen yhdistetyltä. Oletit tallenteidesi olevan turvassa. Joskus ne eivät olleet.
v2 rakensi tämän uudelleen rehellisten yhteystilojen ympärille. Drive on nyt aina yhdessä muutamasta eksplisiittisestä, totuudenmukaisesta tilasta — yhdistetty, yhdistetään uudelleen, katkennut — ja sovellus lähettää jokaisen tilanmuutoksen koko käyttöliittymälle sillä hetkellä, kun se tapahtuu. Kun yhteys on poikki, globaali uudelleenyhteyspalkki kertoo sinulle sen, kaikkialla, selvästi. Sovellus ei enää teeskentele latauksen onnistuneen, kun se ei onnistunut. Jos varmuuskopiointisi ei voi tapahtua juuri nyt, tiedät sen juuri nyt — et ensi viikolla, kun lähdet etsimään tiedostoa.
Alla tämä on pieni arkkitehtuuri, ei iskulause: yksi totuuden lähde yhteydelle, tapahtuma, joka leviää käyttöliittymän jokaiseen osaan sen muuttuessa, ja palkki, joka lukee suoraan tuosta tilasta. Ei ole polkua, jossa yhteys olisi poikki ja käyttöliittymä näyttäisi olevan pystyssä, koska ne lukevat samasta faktasta.
Kadonneen tallenteen valhe
Toinen suuri rehellisyyskorjaus oli tallenteen palautus. Reaaliaikainen transkriptio tarvitsee elävän yhteyden. v1:ssä, jos tuo yhteys nikotteli kesken istunnon — Wi-Fi-katko, tunneli, VPN:n uudelleenyhteys — katkon aikainen ääni saattoi yksinkertaisesti kadota. Transkriptiin jäi reikä, eikä mikään kertonut siitä.
v2 muutti sopimusta: ääni säilytetään paikallisesti yhteyskatkon aikana ja sovitetaan jälkikäteen. Kun yhteys putoaa, GeekBye pitää äänen turvassa koneellasi; kun se palaa, tuo puskuroitu ääni lähetetään ja ommellaan transkriptiin oikeaan kohtaan. Huono kolmekymmentä sekuntia verkkoa ei enää maksa sinulle kolmeakymmentä sekuntia kokousta. Tämä on se pohjatyö, jolle myöhemmät luotettavuusjulkaisut rakensivat suoraan — miksi AI-muistiinpanotyökalusi pysähtyy huonossa Wi-Fissä -artikkelin uudelleenyhteys- ja puskurointikoneisto on sama ajatus, kovetettuna.
Ponnahdusikkunamyrskyn valhe
Sovellusten tavassa raportoida ongelmista on hienovaraisempi epärehellisyys: ne yliraportoivat sen. Yksi epävakaa verkkohetki voi laukaista saman virheen viisi kertaa, ja yhtäkkiä sinulla on pino identtisiä punaisia ilmoituksia hautaamassa sen yhden viestin, jolla on väliä. Sekään ei ole rehellistä — se on kohinaa teeskennellen olevansa informaatiota.
Joten v2 lisäsi kategoriapohjaisen ilmoitusten rajoituksen ja virheohjauksen. Virheet ryhmitellään sen mukaan, mitä ne todella ovat, ja jokaista kategoriaa rajoitetaan nopeudeltaan, joten yksittäinen taustaongelma tuottaa yhden selkeän viestin, ei ryöppyä. Nopeusrajoitusongelma ohjautuu nopeusrajoitusviestiin; yhteysongelma ohjautuu yhteysviestiin. Sovellus kertoo sinulle mikä on totta, kerran — sama kuri, joka myöhemmin esti 429:ää tekeytymästä uloskirjautumiseksi päivänä, jona sovelluksemme teki DDoS-hyökkäyksen itseään vastaan.
Luku 206 on koko pointti
Rehelliset tilat, uudelleenyhteyspalkki, tallenteen palautus, ilmoitusten ohjaus — siinä on neljä ajatusta. Julkaisu oli 206 committia. Minne loput menivät?
Siihen epäglamouriseen pitkään häntään, jonka "älä koskaan näytä väärää tilaa" oikeasti vaatii. Jokainen paikka, jossa vanha käyttöliittymä saattoi mennä ristiin todellisuuden kanssa, oli löydettävä ja johdotettava lukemaan totuudesta vanhentuneen kopion sijaan. Jokainen uudelleenyhteyspolku oli saatava päivittämään jaettu tila sen sijaan, että se arvaisi paikallisesti. Kymmeniä pieniä luotettavuuskorjauksia tallennuksen, transkription ja latausten yli — jokainen sulkien tietyn aukon, jossa sovellus saattoi näyttää oikealta ollessaan väärässä.
Tämän todellinen "versio 2" maksaa, kun tavoitteena on luottamus ominaisuuksien sijaan. Ei ole yhtä ainoaa otsikkocommittia. Niitä on 206 pientä, ja julkaisu vain tuntuu yhdeltä asialta — tyyneltä — koska kaikki 206 vetävät samaan suuntaan.
Julkaisu oli vähällä jäädä toimittamatta
Tässä on sotatarina, ja se on hyvä, koska se kertoo siitä, kuinka oma sovelluksemme valehteli meille.
Kun teet julkaisun, versionnostoskripti leimaa uuden numeron koko projektiin. v2.0.0:ssa se päivitti sovelluksen version — mutta package-lock.json, npm:n tarkka riippuvuuskirjanpito, jäi osoittamaan vanhaan versioon, 1.9.0. Paikallisesti kaikki oli kunnossa; kukaan ei asenna riippuvuuksia uudelleen pelkkää buildia varten. Mutta CI ajaa npm ci, ja npm ci:n koko tehtävä on kieltäytyä etenemästä, jos lukkotiedosto on eri mieltä manifestin kanssa. Se on tiukkuusominaisuus — ja se teki juuri sen, minkä pitikin, kaatamalla buildin suurimmasta julkaisusta, jonka olimme koskaan tehneet.
Sitten sen alta nousi toinen, ovelampi. Uudempi npm oli karsinut valinnaisen transitiivisen riippuvuuden — encoding-paketin, jonka node-fetch vetää mukaan — pois lukkotiedostosta tarpeettomana. Paitsi että CI:mme puhdas asennus kyllä tarvitsi sitä, joten asennus hajosi tavalla, jolla ei ollut mitään tekemistä koodimme kanssa ja kaikki tekemistä sen kanssa, että kirjanpito oli hienovaraisesti väärin.
Molemmat olivat yhden rivin korjauksia: synkkaa lukkotiedosto todelliseen versioon, palauta karsittu merkintä. Molemmat ovat myös täydellisiä, nöyryyttäviä esimerkkejä juuri siitä, mistä v2:ssa oli kyse — tilasta, joka väitti olevansa totta muttei ollut. Lukkotiedoston on tarkoitus olla rehellinen kirjanpito siitä, mistä sovellus riippuu. Kun se ajautui erilleen todellisuudesta, build teki täsmälleen sen, mitä sovelluksemme nyt tekee käyttäjille: se kieltäytyi teeskentelemästä, että kaikki oli kunnossa. Luotettavuusjulkaisun toimittaminen osoittautuu luotettavuusongelmaksi ihan pohjaan asti.
Kolme asiaa, jotka v2 meille opetti
- Vaaralliset viat ovat hiljaiset viat. Kaatuminen ilmoittaa itsestään. Väärä "yhdistetty", haamulataus, joka "onnistui", transkripti näkymättömällä reiällä — ne maksavat sinulle luottamusta juuri siksi, ettei mikään näytä olevan vialla. Metsästä hiljaiset valheet.
- Rehellisyys on arkkitehtuuri, ei viesti. Et voi pultata "kerro totuus" käyttöliittymään palkkina. Palkin on luettava samasta yhdestä totuuden lähteestä kuin kaikki muukin, tai siitä tulee vielä yksi asia, joka voi olla väärässä. Yksi fakta, levitettynä — ei koskaan kahta kopiota, jotka voivat olla eri mieltä.
- Numeronsa ansaitseva versio 2 on enimmäkseen näkymätön. Jos v2:si on ominaisuuslista, se on v1.5 markkinoinnilla. Todellinen v2 on 206 committia, joista kukaan ei voi osoittaa yksittäistä, laskien yhteen tuotteeksi, joka yksinkertaisesti lakkaa valehtelemasta sinulle.
GeekBye v2.0.0 on se perusta, jolle jokainen sen jälkeinen julkaisu on rakentanut. Siitä, mitä tuo perusta kantaa, katso miksi AI-muistiinpanotyökalusi pysähtyy huonossa Wi-Fissä, päivä, jona sovelluksemme teki DDoS-hyökkäyksen itseään vastaan (v2.0.1) ja reaaliaikainen transkriptio, kun palomuuri estää WebSocketit (v2.0.8). Siitä tyyneydestä, jota kaikki tämä palveli, mitä uutta GeekBye v2:ssa.