Steven
Steven6 min. skaitymo

Ko iš tikrųjų kainuoja antra versija: 206 sąžiningų būsenų commitų

GeekBye v2 nebuvo funkcijų leidimas. Tai buvo 206 commitai, nutaikyti į vieną mintį: programa niekada neturi meluoti apie savo pačios būseną. Štai kiek tai kainuoja — įskaitant vienos eilutės klaidą lockfile, kuri vos nesutrukdė mums išleisti nieko iš viso to.

Patikimumas
Inžinerija
Leidimas
GeekBye leidimai
Ko iš tikrųjų kainuoja antra versija: 206 sąžiningų būsenų commitų

Dauguma „antros versijos" leidimų yra krūva naujų funkcijų su didesniu skaičiumi ant viršelio. GeekBye v2 buvo priešingybė. Jis beveik neatnešė jokio naujo vartotojui matomo gebėjimo. Jo 206 commitai buvo nutaikyti į vieną, neefektingą mintį:

Programa niekada neturėtų jums rodyti būsenos, kuri nėra tikra.

Tai skamba akivaizdžiai, kol nepradedi skaičiuoti, kiek būdų darbalaukio programa tyliai meluoja. Ji rodo varnelę prie įkėlimo, kuris vis dar skrenda. Sako „prisijungta" virš lizdo, kuris mirė prieš minutę. Tyli, kol jūsų transkripcija pametama pakeliui. Nė vienas iš šių dalykų nėra strigimas. Jie blogesni už strigimus, nes programa atrodo gerai, būdama neteisi — o jūs sužinote tik vėliau, kai įrašo, kurio jums reikėjo, ten nėra.

v2 buvo leidimas, kuriame išsiruošėme medžioti kiekvieno iš šių mažų melų.

Melas, kurio nekentėme labiausiai: įkėlimas, kuris „pavyko"

GeekBye gali daryti jūsų įrašų atsargines kopijas į Google Drive. v1 versijoje ryšys su Drive buvo laikomas fonine smulkmena — jei veikė, puiku; jei ne, gedimas buvo daugiausia nematomas. Programa toliau atrodė prisijungusi. Jūs manėte, kad jūsų įrašai saugūs. Kartais jie nebuvo.

v2 tai perstatė aplink sąžiningas ryšio būsenas. Drive dabar visada yra vienoje iš kelių aiškių, teisingų būsenų — prisijungta, jungiamasi iš naujo, atjungta — ir programa transliuoja kiekvieną tos būsenos pokytį visai sąsajai tą pačią akimirką, kai jis įvyksta. Kai ryšys nutrūkęs, globalus pakartotinio prisijungimo skydelis jums tai pasako, visur, tiesiai. Programa nebeapsimeta, kad įkėlimas pavyko, kai jis nepavyko. Jei jūsų atsarginė kopija dabar negali įvykti, jūs žinote tai dabar — o ne po savaitės, kai eisite ieškoti failo.

Po gaubtu tai yra maža architektūra, o ne šūkis: vienas tiesos šaltinis ryšiui, įvykis, kuris išsišakoja į kiekvieną sąsajos dalį, kai jis pasikeičia, ir skydelis, kuris skaito tiesiai iš tos būsenos. Nėra kelio, kuriame ryšys nutrūkęs, o sąsaja atrodo veikianti, nes jie skaito iš to paties fakto.

Prarasto įrašo melas

Antra didelė sąžiningumo pataisa buvo įrašų atkūrimas. Realaus laiko transkripcijai reikia gyvo ryšio. v1 versijoje, jei tas ryšys žagsėjo sesijos viduryje — Wi-Fi mirktelėjimas, tunelis, VPN persijungimas — garsas per pertrūkį galėjo tiesiog dingti. Transkripcijoje būdavo skylė, ir niekas jums to nepasakydavo.

v2 pakeitė sutartį: garsas išsaugomas vietoje ryšio pertrūkio metu ir vėliau suderinamas. Kai ryšys nutrūksta, GeekBye laiko garsą saugų jūsų kompiuteryje; kai jis grįžta, tas buferizuotas garsas išsiunčiamas ir įsiuvamas į transkripciją tinkamoje vietoje. Prastos trisdešimt tinklo sekundžių jums nebekainuoja trisdešimties susitikimo sekundžių. Tai yra pamatas, ant kurio vėlesni patikimumo leidimai statė tiesiogiai — pakartotinio prisijungimo ir buferizavimo mechanika straipsnyje kodėl jūsų AI užrašininkas sustoja esant prastam Wi-Fi yra ta pati idėja, tik užgrūdinta.

Iškylančių langų audros melas

Yra subtilesnis nesąžiningumas tame, kaip programos praneša apie bėdą: jos praneša per daug. Vienas nestabilus tinklo momentas gali iššauti tą pačią klaidą penkis kartus, ir staiga turite krūvą identiškų raudonų pranešimų, palaidojančių vienintelę svarbią žinutę. Tai irgi nesąžininga — tai triukšmas, apsimetantis informacija.

Todėl v2 pridėjo pranešimų ribojimą pagal kategorijos raktą ir klaidų nukreipimą. Klaidos grupuojamos pagal tai, kas jos iš tikrųjų yra, ir kiekviena kategorija ribojama pagal dažnį, todėl viena pamatinė problema pagamina vieną aiškią žinutę, o ne kanonadą. Dažnio ribos problema nukreipiama į dažnio ribos žinutę; ryšio problema nukreipiama į ryšio žinutę. Programa jums pasako kas tiesa, vieną kartą — ta pati drausmė, kuri vėliau apsaugojo 429 nuo apsimetinėjimo atsijungimu straipsnyje diena, kai mūsų programa pati save DDoS'ino.

Skaičius 206 ir yra esmė

Sąžiningos būsenos, pakartotinio prisijungimo skydelis, įrašų atkūrimas, pranešimų nukreipimas — tai keturios idėjos. Leidimas buvo 206 commitų. Kur nukeliavo likusieji?

Į neefektingą ilgą uodegą, kurios „niekada nerodyk klaidingos būsenos" iš tikrųjų reikalauja. Kiekvieną vietą, kur sena sąsaja galėjo prasilenkti su tikrove, reikėjo rasti ir perjungti taip, kad ji skaitytų iš tiesos, o ne iš pasenusios kopijos. Kiekvieną pakartotinio prisijungimo kelią reikėjo priversti atnaujinti bendrą būseną, o ne spėlioti vietoje. Dešimtys mažų patikimumo pataisų įrašyme, transkripcijoje ir įkėlimuose — kiekviena uždaro konkrečią spragą, kur programa galėjo atrodyti teisinga, būdama neteisi.

Štai kiek kainuoja tikra „antra versija", kai tikslas yra pasitikėjimas, o ne funkcijos. Nėra vieno antraštinio commito. Yra 206 mažų, ir leidimas tik jaučiasi kaip vienas dalykas — ramybė — todėl, kad visi 206 traukia ta pačia kryptimi.

Leidimas vos neišėjo

Štai karo istorija, ir gera, nes ji apie tai, kaip mūsų pačių programa melavo mums.

Kai ruošiate leidimą, versijos kėlimo skriptas įspaudžia naują numerį per visą projektą. Ties v2.0.0 jis atnaujino programos versiją — bet package-lock.json, tikslią npm priklausomybių knygą, paliko rodančią į seną versiją, 1.9.0. Vietoje viskas buvo gerai; niekas neperinstaliuoja priklausomybių vien tam, kad sukompiliuotų. Bet CI paleidžia npm ci, o visas npm ci darbas yra atsisakyti tęsti, jei lockfile nesutampa su manifestu. Tai griežtumo funkcija — ir ji padarė būtent tai, ką turėjo, sužlugdydama kompiliaciją per didžiausią leidimą, kokį kada nors ruošėme.

Tada po ja išplaukė antra, klastingesnė. Naujesnis npm iškirto pasirenkamą tranzityvinę priklausomybę — paketą encoding, kurį įtraukia node-fetch — iš lockfile kaip nereikalingą. Tik štai mūsų CI švariam įdiegimui jo reikėjo, todėl įdiegimas sugedo taip, kad neturėjo nieko bendra su mūsų kodu ir viską bendra su tuo, kad knyga buvo subtiliai neteisinga.

Abi buvo vienos eilutės pataisos: iš naujo sinchronizuoti lockfile su tikra versija, atkurti iškirstą įrašą. Abi taip pat yra tobuli, nuolankinantys pavyzdžiai būtent to, apie ką buvo v2 — būsenos, kuri teigė esanti tikra, o nebuvo. Lockfile turi būti sąžiningas įrašas to, nuo ko priklauso programa. Kai jis nutolo nuo tikrovės, kompiliacija padarė būtent tai, ką dabar mūsų programa daro vartotojams: atsisakė apsimesti, kad viskas gerai. Patikimumo leidimo išleidimas pasirodo esąs patikimumo problema iki pat dugno.

Trys dalykai, kurių mus išmokė v2

  1. Pavojingi gedimai yra tylūs. Strigimas pats apie save praneša. Klaidingas „prisijungta", vaiduokliškas sėkmingas įkėlimas, transkripcija su nematoma skyle — jie kainuoja jums pasitikėjimą būtent todėl, kad niekas neatrodo blogai. Medžiokite tylų melą.
  2. Sąžiningumas yra architektūra, o ne žinutė. Negalite prisukti „sakyk tiesą" prie sąsajos kaip skydelio. Skydelis turi skaityti iš to paties vienintelio tiesos šaltinio kaip ir viskas kita, kitaip jis tampa dar vienu dalyku, kuris gali klysti. Vienas faktas, išsišakojantis į išorę — niekada dvi kopijos, kurios gali nesutapti.
  3. Antra versija, verta savo skaičiaus, daugiausia nematoma. Jei jūsų v2 yra funkcijų sąrašas, tai v1.5 su marketingu. Tikra v2 yra 206 commitai, į kuriuos niekas negali parodyti atskirai, susidedantys į produktą, kuris tiesiog nustoja jums meluoti.

GeekBye v2.0.0 yra pamatas, ant kurio statė kiekvienas leidimas nuo tada. Apie tai, ką neša tas pamatas, skaitykite kodėl jūsų AI užrašininkas sustoja esant prastam Wi-Fi, diena, kai mūsų programa pati save DDoS'ino (v2.0.1) ir tiesioginė transkripcija, kai ugniasienė blokuoja WebSocket (v2.0.8). Apie ramybę, kuriai visa tai tarnavo, kas naujo GeekBye v2.