Steven
Steven5 min. skaitymo

Programinės įrangos tobulinimo anatomija: kaip kodo peržiūra pagavo tai, ko testai negalėjo

Per visą GeekBye v2 seriją kartojasi tas pats: pataisa praeina kiekvieną testą kūrėjo kompiuteryje, o paskui kodo peržiūra įrodo, kad ji būtų sugedusi beveik visiems. Tai devynių leidimų darbo eiga — peržiūros vartai, pagavimai pataisos etape ir „patikrink prieš išsiuntimą" disciplina, kuri „man veikia" paverčia „veikia".

Inžinerija
Procesas
Kodo peržiūra
GeekBye leidimai
Programinės įrangos tobulinimo anatomija: kaip kodo peržiūra pagavo tai, ko testai negalėjo

Per porą savaičių GeekBye išleido devynis leidimus — nuo v2.0.0 iki v2.0.11 — ir ši serija papasakojo kiekvieno iš jų istoriją. Perskaitykite juos kartu, ir išryškėja modelis, įdomesnis už bet kurią atskirą klaidą: vėl ir vėl pataisa praeidavo kiekvieną testą kūrėjo kompiuteryje, o kodo peržiūra įrodydavo, kad ji būtų sugedusi beveik visiems kitiems.

Šis tarpas — tarp „man veikia" ir „veikia" — yra ta vieta, kur iš tikrųjų gyvena patikimumas. Tai darbo eiga, kuri jį uždaro, ir kiekvieno jos sukurto leidimo rodyklė.

Modelis: žali testai, neteisingas atsakymas

Štai trys aiškiausi serijos atvejai, nes jie abstraktų paverčia konkrečiu.

  • Kelių monitorių fiksavimo pataisoje (v2.0.10) pirmoji realizacija pririšo ekrano fiksavimą prie programos perdangos lango. Ji praėjo testavimą — kūrėjo kompiuteryje su vienu monitoriumi. Peržiūra apsvarstė, kur ta perdanga iš tikrųjų gyvena (visada pagrindiniame ekrane, nebent fiziškai ją nutemptumėte) ir įrodė, kad „pataisa" atsidurtų atgal ne tame monitoriuje beveik kiekvienam realiam vartotojui. Teisingas inkaras — žymeklis — kilo iš šio samprotavimo, o ne iš testo paleidimo.
  • Atsarginio WebSocket kanalo leidime (v2.0.8) peržiūra pastebėjo, kad būtent tas 403, kurį grąžina blokuojantis tarpinis serveris, buvo klasifikuojamas kaip lemtinga autentifikavimo klaida — taigi atsarginis kanalas, dėl kurio paleidimo funkcija apskritai egzistavo, niekada negalėjo suveikti. Funkcija būtų išsiųsta, praėjusi laimingo kelio testus, ir nepadariusi nieko savo tikrajai auditorijai.
  • Neveiklumo laiko limito pataisoje (v2.0.9) pirmoji versija žymėjo „vis dar gyvas" laikrodį kodo kelyje, kurį dalis transkripcijų teisėtai praleidžia — kito kalbėtojo. Peržiūra pagavo, kad būsimas pakeitimas galėtų tyliai vėl įvesti būtent tą taisomą klaidą, ir žyma buvo perkelta į besąlyginę vietą, su testu, kuris ją ten išlaikys.

Nė vienos iš jų nepagavo kodo paleidimas. Visas jas pagavo recenzentas, samprotaujantis apie tai, kodėl kodas veikia — ir randantis atvejį, kur jis neveikia.

Trys vartų dalys

Už serijos slypinti darbo eiga nėra sudėtinga. Tai trys įpročiai, taikomi be išimties.

1. Peržiūra samprotauja apie teisingumą, o ne tik paleidžia kodą. Praeinantis testas įrodo, kad kodas veikia tam atvejui, apie kurį pagalvojote. Peržiūra — tai antras, priešiškas sistemos modelis, klausiantis apie kokį atvejį nepagalvojote? — antras monitorius, įmonės tarpinis serveris, transkripcija, praleidžianti šaką, klientas viena versija atsilikęs. Peržiūros žingsnis šioje serijoje dažnai buvo nepriklausomas recenzentas-agentas, paragintas paneigti pataisą, o ne ją palaiminti. Visa esmė šiame kadre: recenzentas, bandantis palaužti jūsų samprotavimą, randa skylę, pro kurią recenzentas, bandantis ją patvirtinti, tik prasprūsta žvilgsniu.

2. Kiekviena elgsenos pataisa išsiunčiama su testu, prikalančiu tikslų gedimą. Ne testu, kad funkcija veikia — testu, kad ši konkreti klaida negyva. Užblokuoto tarpinio serverio 403 turi pereiti į atsarginį kanalą; tikras autentifikavimo 403 — ne. Veiklos laikrodis turi pažymėti transkripciją, kuri praleidžia priskyrimą. Šie testai egzistuoja, kad klaida negalėtų tyliai grįžti po pusmečio, kai kas nors refaktorins šalia — gedimas prikaltas prie grindų.

3. Build'as notarizuojamas ir patikrinamas prieš išsiuntimą. Kelios iš šių pataisų nuo diagnozės iki pasirašyto, notarizuoto, automatiškai atsinaujinančio leidimo perėjo per vieną dieną. Šis greitis saugus tik todėl, kad vartai drausmingi: diagnostika įrodo šakninę priežastį (mikrofono leidimo leidimas savo diagnostiką išsiuntė pirmą), testas prikala pataisą, peržiūra paneigia samprotavimą, ir tik tada išeina tikras notarizuotas build'as. Griežtumas yra tai, kas greitį daro saugų, o ne tai, kuo dėl jo aukojama.

Kodėl AI programai tai svarbiau

Yra priežastis, kodėl ši disciplina neaptariama būtent tokiam įrankiui kaip GeekBye. Kelios bjauriausios serijos klaidos buvo tyliai neteisingos, o ne garsiai lūžtančios: ekrano nuotrauka, kuri AI pateikė ne tą monitorių (v2.0.10), transkripcija, pakrypusi šiukšlinių terminų link, taigi „speak" išėjo kaip vardas (v2.0.11), asistentas, atsakantis netinkamu režimu be jokio būdo tai pamatyti (v2.0.3 + v2.0.5). Kai jūsų programa pateikia modeliui kontekstą, neteisinga įvestis pateikia užtikrintai neteisingą išvestį ir niekur jokios klaidos. Iš gedimų, kurie nemeta išimties, išsitestuoti neįmanoma. Iš jų reikia išsisamprotauti — o būtent tam ir yra peržiūros vartai.

Serija, iš eilės

Kiekvienas iš jų — savarankiškas vieno leidimo atvejo tyrimas. Perskaityti nuo pradžios iki pabaigos, jie yra produkto kelio nuo „veikia" iki „patikimas" anatomija.

  1. Ko iš tikrųjų reikalauja 2 versija: 206 sąžiningų būsenų commit'ų — v2.0.0. Pamatas: niekada nerodyk būsenos, kuri netiesa.
  2. Diena, kai mūsų programa pati save užDDoSino — v2.0.1 + v2.0.4. Paleidimo įkėlimų sangrūda, trypianti mūsų pačių backend'ą, ir gyvybingumo laiptai, kuriuos ji privertė.
  3. Rami programinė įranga: mirgėjimo pataisa ir atsakymo režimo ženkliukas — v2.0.3 + v2.0.5. Leidimai be funkcijų, pirkę pasitikėjimą po vieną detalę.
  4. Jūsų Mac programa kiekvieno paleidimo metu pamiršta mikrofono prieigą — v2.0.6. macOS App Translocation ir diagnostikos išsiuntimas prieš pataisą.
  5. Vienas CSS kintamasis, penki peržiūros raundai ir Swift įrankių grandinė, kuri melavo — v2.0.7. Vienodas peršviečiamumas ir dvejetainis failas, pakeitęs dydį, nes dokumentacija nesutapo su vykdymo skriptu.
  6. Tiesioginė transkripcija, kai užkarda blokuoja WebSocket — v2.0.8. Gryno HTTPS atsarginis kanalas ir 403, kuris būtų paslėpęs jį nuo jo paties.
  7. Kodėl jūsų AI užrašų kūrėjas nustoja įrašinėti vidury susitikimo — v2.0.9. Neveiklumo laikmatis, girdėjęs tik jus, ir lūžis, galėjęs užrakinti jūsų darbalaukį.
  8. Kodėl ekrano įrašymas fiksuoja ne tą monitorių — v2.0.10. Ne to ekrano klaida ir pataisa, kuri praėjo viename monitoriuje ir būtų sugedusi dviejuose.
  9. Kodėl AI transkripcija neteisingai išgirsta techninius terminus — v2.0.11. Kalbos kreipimas jūsų žodyno link — ir regresija, kuri pablogino, kol pagerino.

Išvada

Tobulumas — ne būsena, kurią pasieki; tai vartai, kuriuos išlaikai. Devyni leidimai ir tie patys trys klausimai prie kiekvieno: apie kokį atvejį nepagalvojai, ar tikslus gedimas prikaltas testu ir ar tikras pasirašytas build'as tikrai išėjo? Nieko iš to nėra prašmatnaus. Visa tai — priežastis, kodėl GeekBye v2 jaučiasi ramiai. Jei kuri programinę įrangą — AI ar kitokią — perkeliama dalis nėra nė viena atskira pataisa. Tai įprotis žalią testų rinkinį laikyti argumento pradžia, o ne jo pabaiga.

Kiekvienas aukščiau esantis leidimas pasiekiamas per automatinį atnaujinimą. Apie produktą, į kurį šios pataisos susideda, žiūrėkite kas naujo GeekBye v2.

Susiję straipsniai

Vienas CSS kintamasis, penki peržiūros ratai ir Swift įrankių grandinė, kuri melavo
Steven
Steven6 min. skaitymo

Vienas CSS kintamasis, penki peržiūros ratai ir Swift įrankių grandinė, kuri melavo

GeekBye v2.0.7 padarė visą perdangą reguliuojamai permatomą — kas skamba kaip vienos eilutės CSS pakeitimas, tačiau tikrai juo nebuvo. Tikroji istorija yra tai, ką pagavo kodo peržiūra: du paviršiai, kurie atsisakė blukti, įrašų juosta, kuri prie to paties permatomumo atrodė ne taip, ir sukompiliuotas dvejetainis failas, kuris svyravo 672 baitais, nes mūsų pačių dokumentai peržiūrėtojui nurodė neteisingą Swift versiją.

Inžinerija
Dizainas
Kūrimas
Saugumo patikra, dėl kurios mūsų programos nebuvo įmanoma uždaryti
Steven
Steven5 min. skaitymo

Saugumo patikra, dėl kurios mūsų programos nebuvo įmanoma uždaryti

Automatinis atnaujinimas buvo sunkiausia funkcija, kokią kada nors išleidome — šeši leidimai per keturias dienas, kad jis nustotų gadinti programą. Blogiausią klaidą įvėlėme patys, stengdamiesi būti atsargūs: 500 milisekundžių „saugumo" patikra, kuri nepavykusį atnaujinimą paversdavo procesu, kurio tiesiogine prasme nebuvo įmanoma uždaryti.

Inžinerija
Electron
Patikimumas
Rami programinė įranga: kaip pašalinome mirgantį jungiklį ir išmokėme pokalbį pasakyti, kokiu režimu jis veikia
Steven
Steven5 min. skaitymo

Rami programinė įranga: kaip pašalinome mirgantį jungiklį ir išmokėme pokalbį pasakyti, kokiu režimu jis veikia

Du nedideli GeekBye leidimai, be jokių pagrindinių funkcijų — tik nustatymų jungiklis, kuris nustojo mirgėti, ir pokalbio asistentas, kuris pagaliau pasako, ar atsakė susitikimo režimu, ar kodavimo režimu. Štai kiek iš tikrųjų kainuoja „rami programinė įranga“ — po vieną smulkmeną.

Produktas
Dizainas
Inžinerija