
Mida versioon 2 tegelikult nõuab: 206 kommitit ausaid olekuid
GeekBye v2 ei olnud funktsioonide väljalase. See oli 206 kommitit, mis sihtisid ühte ainsat mõtet: rakendus ei tohiks kunagi oma oleku kohta valetada. Siin on see, mis nii maksab — kaasa arvatud üherealine lukustusfaili viga, mis peaaegu takistas meil sellest üldse midagi välja saatmast.
Enamik "versiooni 2" väljalaskeid on hunnik uusi funktsioone suurema numbriga peal. GeekBye v2 oli vastupidine. See saatis kohale peaaegu mitte ühtki uut kasutajale nähtavat võimalust. Selle 206 kommitit sihtisid ühte ainsat, glamuuritut mõtet:
Rakendus ei tohiks kunagi näidata sulle olekut, mis pole tõsi.
See kõlab ilmselgena, kuni sa loed kokku, mitmel viisil töölauarakendus vaikselt valetab. See näitab linnukest üleslaadimisel, mis alles lendab. See ütleb "ühendatud" sokli kohta, mis suri minut tagasi. See jääb vait, samal ajal kui su transkriptsiooni maha pudistatakse. Ükski neist pole krahh. Need on krahhidest hullemad, sest rakendus näeb korras välja, olles samal ajal vale — ja sa saad sellest teada alles hiljem, kui salvestist, mida sul vaja oli, seal ei ole.
v2 oli väljalase, kus me läksime jahtima igaüht neist väikestest valedest.
Vale, mida me kõige rohkem vihkasime: üleslaadimine, mis "õnnestus"
GeekBye saab su salvestisi Google Drive'i varundada. v1-s käsitleti ühendust Drive'iga taustadetailina — kui see töötas, tore; kui ei töötanud, oli tõrge enamasti nähtamatu. Rakendus jätkas ühendatuna näimist. Sa eeldasid, et su salvestised on turvalised. Vahel need ei olnud.
v2 ehitas selle üles ausate ühenduse olekute ümber. Drive on nüüd alati ühes vähestest sõnaselgetest, tõestest olekutest — ühendatud, taasühendumas, ühenduseta — ja rakendus edastab iga selle oleku muutuse kogu liidesele hetkel, mil see toimub. Kui ühendus on maas, ütleb globaalne taasühendumise ribakuva sulle seda, kõikjal, selgelt. Rakendus ei teeskle enam, et üleslaadimine õnnestus, kui see ei õnnestunud. Kui su varundus ei saa praegu toimuda, tead sa seda praegu — mitte järgmisel nädalal, kui sa faili otsima lähed.
Seespool on see väike arhitektuur, mitte loosung: üks tõeallikas ühenduse jaoks, sündmus, mis harustub igasse liidese ossa selle muutumisel, ja ribakuva, mis loeb otse sellest olekust. Pole ühtki teed, kus ühendus on maas ja liides näeb üleval välja, sest nad loevad samast faktist.
Kaotatud salvestise vale
Teine suur aususe parandus oli salvestise taastamine. Reaalajas transkriptsioon vajab elavat ühendust. v1-s, kui see ühendus keset seanssi luksus — Wi-Fi katkestus, tunnel, VPN-i taasühendumine — võis vahepealne heli lihtsalt kaduda. Transkriptsioonis oleks auk ja miski ei ütleks sulle sellest.
v2 muutis lepingut: heli säilitatakse ühenduskatkestuse ajal kohalikult ja lepitatakse hiljem. Kui link katkeb, hoiab GeekBye heli su masinas turvaliselt; kui see tagasi tuleb, saadetakse see puhverdatud heli ära ja õmmeldakse transkriptsiooni õigesse kohta. Halb kolmkümmend sekundit võrku ei maksa sulle enam kolmkümmend sekundit koosolekut. See on alusmüür, millele hilisemad töökindluse väljalasked otse ehitasid — taasühendumise-ja-puhverdamise masinavärk artiklis miks su AI-märkmik peatub halva Wi-Fi korral on sama mõte, karastatud.
Hüpikakende tormi vale
Selles, kuidas rakendused muredest teatavad, on peenem ebaausus: nad ületeatavad. Üks tõrkuv võrguhetk võib sama vea viis korda käivitada, ja äkki on sul virn identseid punaseid teateid, mis matavad ühe sõnumi, mis loeb. See pole ka aus — see on müra, mis teeskleb infot.
Nii lisas v2 kategooriapõhise teadete piiramise ja vigade suunamise. Vead grupeeritakse selle järgi, mis nad tegelikult on, ja iga kategooria on kiiruse poolest piiratud, nii et üks alusprobleem toodab ühe selge sõnumi, mitte tuvalingu. Kiirusepiirangu mure suunatakse kiirusepiirangu sõnumi juurde; ühendusemure suunatakse ühendusesõnumi juurde. Rakendus ütleb sulle seda, mis on tõsi, üks kord — sama distsipliin, mis hiljem hoidis ära, et 429 ei esineks väljalogimisena artiklis päev, mil meie rakendus tegi endale DDoS-i.
Number 206 on kogu mõte
Ausad olekud, taasühendumise ribakuva, salvestise taastamine, teadete suunamine — see on neli mõtet. Väljalase oli 206 kommitit. Kuhu läks ülejäänu?
Sellesse glamuuritusse pikka sappa, mida "ära kunagi näita valet olekut" tegelikult nõuab. Iga koht, kus vana liides võis reaalsusega sünkroonist välja minna, tuli üles leida ja ümber juhtmestada, nii et see loeks tõe, mitte iganenud koopia järgi. Iga taasühendumise tee tuli panna jagatud olekut uuendama, mitte lokaalselt arvama. Kümneid väikeseid töökindluse parandusi salvestamise, transkriptsiooni ja üleslaadimiste lõikes — iga üks sulgemas konkreetset auku, kus rakendus võis õige välja näha, olles samal ajal vale.
Selline on tõelise "versiooni 2" hind, kui eesmärk on usaldus, mitte funktsioonid. Pole ühte pealkirja-kommitit. Neid on 206 väikest, ja väljalase tundub ainult ühe asjana — rahulikuna — sest kõik 206 tõmbavad samas suunas.
Väljalase peaaegu ei jõudnud kohale
Siin on sõjalugu, ja see on hea, sest see räägib sellest, kuidas meie enda rakendus valetas meile.
Kui sa väljalasked lõikad, lööb versiooni-tõstmise skript uue numbri üle terve projekti. v2.0.0-s uuendas see rakenduse versiooni — kuid package-lock.json, npm-i täpne sõltuvusregister, jäeti osutama vanale versioonile, 1.9.0. Lokaalselt oli kõik korras; keegi ei installi sõltuvusi ümber lihtsalt selleks, et ehitada. Aga CI käivitab npm ci, ja npm ci kogu töö on keelduda edasi minemast, kui lukustusfail on manifestiga eriarvamusel. See on rangusefunktsioon — ja see tegi täpselt seda, mida peaks, kukutades läbi ehituse suurimale väljalaskele, mille me kunagi olime lõiganud.
Siis pinna alla ilmus teine, salakavalam. Uuem npm oli kärpinud ära ebavajaliku valikulise transitiivse sõltuvuse — encoding paketi, mille node-fetch sisse tõmbab — lukustusfailist välja. Ainult et meie CI puhas installimine vajas seda, nii et install katkes viisil, millel polnud midagi pistmist meie koodiga ja kõik pistmist registriga, mis oli peenelt vale.
Mõlemad olid ühereaparandused: sünkrooni lukustusfail tegeliku versiooniga uuesti, taasta kärbitud kirje. Mõlemad on ka täiuslikud, alandavad näited täpselt sellest asjast, millest v2 rääkis — olek, mis väitis end tõene olevat ja ei olnud. Lukustusfail peaks olema aus register sellest, millest rakendus sõltub. Kui see reaalsusest triivis, tegi ehitus täpselt seda, mida meie rakendus nüüd kasutajate jaoks teeb: see keeldus teesklemast, et kõik on korras. Töökindluse väljalaske saatmine osutub lõpuni läbi töökindluse probleemiks.
Kolm asja, mida v2 meile õpetas
- Ohtlikud rikked on vaiksed. Krahh teatab endast. Vale "ühendatud", fantoom-õnnestunud üleslaadimine, transkriptsioon nähtamatu auguga — need maksavad sulle usalduse just seepärast, et miski ei näe vale välja. Jahi vaikseid valesid.
- Ausus on arhitektuur, mitte sõnum. Sa ei saa "räägi tõtt" liidesele ribakuvana peale poltida. Ribakuva peab lugema samast ainsast tõeallikast, millest kõik muu, või sellest saab veel üks asi, mis võib vale olla. Üks fakt, harustatud — mitte kunagi kaks koopiat, mis võivad eriarvamusel olla.
- Numbrit väärt versioon 2 on enamjaolt nähtamatu. Kui su v2 on funktsioonide loend, on see turundusega v1.5. Tõeline v2 on 206 kommitit, millele keegi ei saa eraldi osutada, liites kokku tooteks, mis lihtsalt lõpetab sulle valetamise.
GeekBye v2.0.0 on alusmüür, millele iga sellest saati tulnud väljalase on ehitanud. Selle kohta, mida see alusmüür kannab, vaata miks su AI-märkmik peatub halva Wi-Fi korral, päev, mil meie rakendus tegi endale DDoS-i (v2.0.1) ja reaalajas transkriptsioon, kui tulemüür blokeerib WebSockets (v2.0.8). Selle rahu kohta, mille teenistuses see kõik oli, vaata mis on uut GeekBye v2-s.