
Programmatūras piegādes līdz pilnībai anatomija: kā koda pārskatīšana atklāja to, ko testi nespēja
Visā GeekBye v2 sērijā atkārtojas viena un tā pati lieta: labojums iztur katru testu izstrādātāja datorā, un tad koda pārskatīšana pierāda, ka gandrīz visiem citiem tas būtu izgāzies. Šī ir darbplūsma, kas ir deviņu laidienu pamatā — pārskatīšanas vārti, vispirms-labojuma atklājumi un testē-pirms-piegādes disciplīna, kas pārvērš "man tas strādā" par "tas strādā".
Pāris nedēļu laikā GeekBye piegādāja deviņus laidienus — no v2.0.0 līdz v2.0.11 — un šī sērija izstāstīja katra stāstu. Izlasiet tos kopā, un parādās modelis, kas ir interesantāks par jebkuru atsevišķu kļūdu: atkal un atkal labojums izturēja katru testu izstrādātāja datorā, un koda pārskatīšana pierādīja, ka gandrīz visiem citiem tas būtu izgāzies.
Tieši šī plaisa — starp "man tas strādā" un "tas strādā" — ir vieta, kur patiešām mīt uzticamība. Šī ir darbplūsma, kas to aizver, un rādītājs uz katru tās radīto laidienu.
Modelis: zaļi testi, nepareiza atbilde
Šeit ir trīs skaidrākie gadījumi no sērijas, jo tie padara abstrakto konkrētu.
- Vairāku monitoru tveršanas labojumā (v2.0.10) pirmā implementācija piesaistīja ekrāna tveršanu lietotnes pārklājuma logam. Tas izturēja testēšanu — viena monitora izstrādātāja datorā. Pārskatīšana pārdomāja, kur šis pārklājums patiesībā atrodas (vienmēr galvenajā displejā, ja vien to fiziski nepārvelk), un pierādīja, ka "labojums" gandrīz katram reālam lietotājam būtu atrisinājies atpakaļ uz nepareizo monitoru. Pareizais enkurs — kursors — nāca no šī argumenta, nevis no testa palaišanas.
- WebSocket rezerves laidienā (v2.0.8) pārskatīšana atklāja, ka tieši tas
403, ko atgriež bloķējošs starpniekserveris, tika klasificēts kā fatāla autentifikācijas kļūda — tāpēc rezerves mehānisms, kura dēļ funkcija vispār pastāvēja, nekad nevarēja iedarboties. Funkcija būtu piegādāta, izturējusi savus laimīgā ceļa testus un neko nedarījusi savai īstajai auditorijai. - Dīkstāves noildzes labojumā (v2.0.9) pirmā versija zīmogoja "vēl dzīvs" pulksteni koda ceļā, kuru daļa transkriptu likumīgi izlaiž — otra runātāja transkripti. Pārskatīšana pamanīja, ka nākotnes izmaiņas varētu klusi atkārtoti ieviest tieši to kļūdu, kas tika labota, un zīmogs tika pārvietots uz kaut ko beznosacījuma, ar testu, lai to tur noturētu.
Nevienu no tiem neatklāja, palaižot kodu. Visus tos atklāja pārskatītājs, spriežot par to, kāpēc kods strādā — un atrodot gadījumu, kad tas nestrādā.
Vārtu trīs daļas
Darbplūsma aiz sērijas nav sarežģīta. Tie ir trīs ieradumi, ko piemēro bez izņēmuma.
1. Pārskatīšana spriež par pareizību, ne tikai palaiž kodu. Izturēts tests pierāda, ka kods strādā gadījumam, par kuru padomāji. Pārskatīšana ir otrs, adversārs sistēmas modelis, kas jautā: par kuru gadījumu tu nepadomāji? — otrais monitors, korporatīvais starpniekserveris, transkripts, kas izlaiž zaru, klients, kas ir vienu versiju atpalicis. Pārskatīšanas solis šajā sērijā bieži bija neatkarīgs aģenta pārskatītājs, kuram tika likts atspēkot labojumu, nevis to svētīt. Tieši šajā ietvarā ir visa jēga: pārskatītājs, kas cenšas salauzt tavu argumentāciju, atrod caurumu, kuram pārskatītājs, kas cenšas to apstiprināt, paslīd garām.
2. Katrs uzvedības labojums tiek piegādāts ar testu, kas piespiež precīzo kļūmi. Ne tests, ka funkcija strādā — tests, ka šī konkrētā kļūda ir mirusi. Bloķēta starpniekservera 403 jāizkrīt cauri uz rezerves mehānismu; īstam autentifikācijas 403 — nedrīkst. Aktivitātes pulkstenim jāzīmogo transkripts, kas izlaiž attiecināšanu. Šie testi pastāv, lai kļūda nevarētu klusi atgriezties pēc pusgada, kad kāds pārstrukturē tuvumā — kļūme ir pienaglota pie grīdas.
3. Būvējums tiek notarizēts un pārbaudīts pirms piegādes. Vairāki no šiem labojumiem no diagnozes līdz parakstītam, notarizētam, automātiski atjaunināmam laidienam nonāca vienas dienas laikā. Šis ātrums ir drošs tikai tāpēc, ka vārti ir disciplinēti: diagnostika pierāda pamatcēloni (mikrofona atļaujas laidiens piegādāja savu diagnostiku vispirms), tests piespiež labojumu, pārskatīšana atspēko argumentāciju, un tikai tad iznāk īsts notarizēts būvējums. Stingrība ir tas, kas padara ātrumu drošu, nevis tas, kas ar to tirgojas.
Kāpēc tas AI lietotnei nozīmē vairāk
Ir iemesls, kāpēc šī disciplīna tieši tādam rīkam kā GeekBye nav apspriežama. Vairākas no šķebīgākajām kļūdām sērijā bija klusi nepareizas, nevis skaļi avarējošas: ekrānuzņēmums, kas AI padeva nepareizo monitoru (v2.0.10), transkripcija, kas bija novirzīta uz nevērtīgiem terminiem, tā ka "runāt" iznāca kā vārds (v2.0.11), asistents, kas atbildēja nepareizajā režīmā bez iespējas to ieraudzīt (v2.0.3 + v2.0.5). Kad tava lietotne padod kontekstu modelim, nepareiza ievade rada pārliecinoši nepareizu izvadi un nekur nekādas kļūdas. No kļūmēm, kas nemet izņēmumu, iztestēties nevar. No tām jāizspriežas — un tieši tam pārskatīšanas vārti kalpo.
Sērija, secībā
Katrs no tiem ir patstāvīgs gadījuma pētījums par vienu laidienu. Izlasīti no sākuma līdz beigām, tie ir anatomija tam, kā aizvest produktu no "strādā" uz "uzticams".
- Ko patiesībā prasa otrā versija: 206 commit godīgu stāvokļu — v2.0.0. Pamats: nekad nerādi stāvokli, kas nav patiess.
- Diena, kad mūsu lietotne DDoS-oja pati sevi — v2.0.1 + v2.0.4. Palaišanas augšupielādes uzkrājums, kas iebruka mūsu pašu aizmugursistēmā, un dzīvotspējas kāpnes, ko tas uzspieda.
- Mierīga programmatūra: mirgošanas labojums un atbildes režīma žetons — v2.0.3 + v2.0.5. Bez-funkciju laidieni, kas nopirka uzticību pa vienai detaļai.
- Tava Mac lietotne aizmirst mikrofona piekļuvi katrā palaišanā — v2.0.6. macOS App Translocation un diagnostikas piegāde pirms labojuma.
- Viens CSS mainīgais, piecas pārskatīšanas kārtas un Swift rīkkopa, kas meloja — v2.0.7. Vienmērīgs caurspīdīgums un binārā datne, kas mainīja izmēru, jo dokumentācija nesakrita ar izpildes skriptu.
- Tiešā transkripcija, kad ugunsmūris bloķē WebSocket — v2.0.8. Tīri HTTPS rezerves mehānisms un
403, kas to būtu paslēpis no tā paša. - Kāpēc tavs AI pierakstītājs pārstāj ierakstīt sapulces vidū — v2.0.9. Dīkstāves taimeris, kas dzirdēja tikai tevi, un avārija, kas varēja bloķēt tavu darbvirsmu.
- Kāpēc ekrāna ieraksts tver nepareizo monitoru — v2.0.10. Nepareizā displeja kļūda un labojums, kas izturēja ar vienu monitoru un būtu izgāzies ar diviem.
- Kāpēc AI transkripcija pārprot tehniskus terminus — v2.0.11. Runas novirzīšana uz tavu vārdnīcu — un regresija, kas to padarīja sliktāku, pirms padarīja labāku.
Secinājums
Pilnība nav stāvoklis, ko sasniedz; tie ir vārti, ko uzturi. Deviņi laidieni un vieni un tie paši trīs jautājumi pie katra: par kuru gadījumu tu nepadomāji, vai precīzo kļūmi piespiež tests, un vai tiešām iznāca īsts parakstīts būvējums? Nekas no tā nav grezns. Tieši tas viss ir iemesls, kāpēc GeekBye v2 jūtas mierīgs. Ja tu būvē programmatūru — AI vai citādu — pārnesamā daļa nav neviens atsevišķs labojums. Tas ir ieradums izturēties pret zaļu testu kopu kā pret argumenta sākumu, nevis tā beigām.
Katrs iepriekš minētais laidiens ir pieejams caur automātisko atjaunināšanu. Par produktu, kurā šie labojumi summējas, skati kas jauns GeekBye v2.