Steven
Steven7 min citire

Anatomia livrării unui software la perfecțiune: cum a prins code review-ul ceea ce testele nu au putut

De-a lungul seriei GeekBye v2, același lucru se tot întâmplă: o remediere trece toate testele pe mașina dezvoltatorului, iar apoi code review-ul dovedește că ar fi eșuat pentru aproape toată lumea. Acesta este fluxul de lucru din spatele a nouă lansări — poarta de review, prinderea problemelor înainte de fix și disciplina testării-înainte-de-livrare care transformă „merge la mine” în „merge”.

Inginerie
Proces
Code Review
Lansări GeekBye
Anatomia livrării unui software la perfecțiune: cum a prins code review-ul ceea ce testele nu au putut

De-a lungul câtorva săptămâni, GeekBye a livrat nouă lansări — de la v2.0.0 la v2.0.11 — iar această serie a spus povestea fiecăreia. Citite împreună, iese la iveală un tipar mai interesant decât orice bug individual: iar și iar, o remediere a trecut toate testele pe mașina dezvoltatorului, iar code review-ul a dovedit că ar fi eșuat pentru aproape toți ceilalți.

Acel decalaj — între „merge la mine” și „merge” — este locul în care trăiește de fapt fiabilitatea. Acesta este fluxul de lucru care îl închide și indexul fiecărei lansări pe care a produs-o.

Tiparul: teste verzi, răspuns greșit

Iată trei dintre cele mai clare cazuri din serie, pentru că fac abstractul concret.

  • În remedierea capturii pe monitoare multiple (v2.0.10), prima implementare ancora captura de ecran pe fereastra overlay a aplicației. A trecut testarea — pe o mașină de dezvoltare cu un singur monitor. Review-ul a raționat despre unde se află de fapt acel overlay (pe ecranul principal, mereu, cu excepția cazului în care îl tragi fizic în altă parte) și a dovedit că „remedierea” s-ar fi rezolvat înapoi pe monitorul greșit pentru aproape orice utilizator real. Ancora corectă — cursorul — a ieșit din acel argument, nu dintr-o rulare de test.
  • În lansarea cu fallback pe WebSocket (v2.0.8), review-ul a descoperit că exact 403-ul pe care îl returnează un proxy blocant era clasificat ca o eroare fatală de autentificare — așa că fallback-ul pentru care exista funcționalitatea nu s-ar fi putut declanșa niciodată. Funcționalitatea ar fi fost livrată, ar fi trecut testele pe cazul fericit și nu ar fi făcut nimic pentru audiența ei reală.
  • În remedierea timeout-ului de inactivitate (v2.0.9), prima versiune marca ceasul „încă în viață” în interiorul unei căi de cod pe care un subset de transcrieri o sar în mod legitim — cea a celuilalt vorbitor. Review-ul a prins că o modificare viitoare ar fi putut reintroduce în tăcere exact bugul care era reparat, iar marcarea a fost mutată undeva necondiționat, cu un test care să o țină acolo.

Niciunul dintre acestea nu a fost prins prin rularea codului. Toate au fost prinse de un reviewer care raționa despre de ce funcționează codul — și găsea un caz în care nu funcționează.

Cele trei părți ale porții

Fluxul de lucru din spatele seriei nu este elaborat. Sunt trei obiceiuri aplicate fără excepție.

1. Review-ul raționează despre corectitudine, nu doar rulează codul. Un test care trece dovedește că acel cod funcționează pentru cazul la care te-ai gândit. Review-ul este un al doilea model, adversarial, al sistemului care întreabă la ce caz nu te-ai gândit? — al doilea monitor, proxy-ul corporativ, transcrierea care sare peste ramură, clientul care e cu o versiune în urmă. Pasul de review din această serie a fost frecvent un agent reviewer independent instruit să respingă remedierea, nu să o binecuvânteze. Această încadrare este întregul scop: un reviewer care încearcă să-ți spargă raționamentul găsește gaura peste care un reviewer care încearcă să-l aprobe trece în viteză.

2. Fiecare remediere de comportament este livrată cu un test care fixează exact eșecul. Nu un test că funcționalitatea merge — un test că acest bug specific este mort. 403-ul de la proxy-ul blocat trebuie să treacă spre fallback; un 403 real de autentificare nu trebuie. Ceasul de activitate trebuie să marcheze pe o transcriere care sare peste atribuire. Aceste teste există ca bugul să nu se poată întoarce în liniște peste șase luni, când cineva refactorizează în apropiere — eșecul este bătut în cuie de podea.

3. Build-ul este notarizat și verificat înainte de a fi livrat. Câteva dintre aceste remedieri au trecut de la diagnostic la o lansare semnată, notarizată și auto-actualizabilă într-o singură zi. Acea viteză este sigură doar pentru că poarta este disciplinată: diagnosticul dovedește cauza rădăcină (lansarea pentru permisiunea de microfon și-a livrat diagnosticul mai întâi), testul fixează remedierea, review-ul respinge raționamentul și abia apoi iese un build real notarizat. Rigoarea este ceea ce face viteza sigură, nu ceea ce se schimbă în detrimentul ei.

De ce contează mai mult pentru o aplicație AI

Există un motiv pentru care această disciplină este de nenegociat pentru un instrument precum GeekBye în special. Câteva dintre cele mai urâte buguri din serie erau greșit-în-tăcere, nu zgomotos-cu-crash: o captură de ecran care alimenta AI-ul cu monitorul greșit (v2.0.10), o transcriere biasată spre termeni de gunoi, așa că „speak” a ieșit ca un nume (v2.0.11), un asistent care răspundea în modul greșit fără nicio modalitate de a vedea asta (v2.0.3 + v2.0.5). Când aplicația ta alimentează un model cu context, o intrare greșită produce o ieșire încrezător greșită și nicio eroare nicăieri. Nu poți testa pentru a scăpa de eșecuri care nu aruncă erori. Trebuie să raționezi pentru a scăpa de ele — ceea ce este exact scopul porții de review.

Seria, în ordine

Fiecare dintre acestea este un studiu de caz de sine stătător despre o singură lansare. Citite de la cap la coadă, sunt anatomia ducerii unui produs de la „merge” la „de încredere”.

  1. Ce presupune de fapt o versiune 2: 206 commituri de stări oneste — v2.0.0. Fundația: nu arăta niciodată o stare care nu este adevărată.
  2. Ziua în care aplicația noastră s-a DDoS-uit pe sine — v2.0.1 + v2.0.4. Un backlog de încărcări la pornire care lua cu asalt propriul nostru backend și scara de liveness pe care a impus-o.
  3. Software calm: remedierea pâlpâirii și chip-ul pentru modul de răspuns — v2.0.3 + v2.0.5. Lansări fără funcționalități noi care au cumpărat încredere un detaliu pe rând.
  4. Aplicația ta de Mac uită accesul la microfon la fiecare pornire — v2.0.6. App Translocation pe macOS și livrarea diagnosticului înaintea remedierii.
  5. O variabilă CSS, cinci runde de review și un toolchain Swift care a mințit — v2.0.7. Translucență uniformă și un binar care și-a schimbat dimensiunea pentru că documentația nu era de acord cu scriptul de verificare.
  6. Transcriere live când firewall-ul blochează WebSocket-urile — v2.0.8. Un fallback pur pe HTTPS și 403-ul care l-ar fi ascuns de el însuși.
  7. De ce notatorul tău AI se oprește din înregistrare în mijlocul ședinței — v2.0.9. Un cronometru de inactivitate care te putea auzi doar pe tine și un crash care îți putea bloca desktopul.
  8. De ce înregistrarea ecranului capturează monitorul greșit — v2.0.10. Bugul cu ecranul greșit și remedierea care trecea pe un monitor și ar fi eșuat pe două.
  9. De ce transcrierea AI aude greșit termenii tehnici — v2.0.11. Biasarea vorbirii spre vocabularul tău — și regresia care a înrăutățit lucrurile înainte să le îmbunătățească.

Concluzia

Perfecțiunea nu este o stare la care ajungi; este o poartă pe care o menții. Nouă lansări și aceleași trei întrebări la fiecare: la ce caz nu te-ai gândit, este exact eșecul fixat de un test și a ieșit chiar un build real semnat? Nimic din toate acestea nu e spectaculos. Toate sunt motivul pentru care GeekBye v2 se simte calm. Dacă construiești software — AI sau altfel — partea transferabilă nu este vreo remediere individuală. Este obiceiul de a trata o suită de teste verzi ca începutul argumentului, nu ca finalul lui.

Fiecare lansare de mai sus este live prin auto-actualizare. Pentru produsul la care se adună aceste remedieri, vezi ce e nou în GeekBye v2.

Articole Similare

Aplicația ta de Mac primește acces la microfon — apoi îl uită la fiecare pornire
Steven
Steven6 min citire

Aplicația ta de Mac primește acces la microfon — apoi îl uită la fiecare pornire

GeekBye a cerut permisiune pentru microfon, ai acordat-o și a funcționat. La următoarea pornire: dispărută. Iar aplicația nu a apărut deloc în Setări de sistem → Microfon. Vinovatul era o funcție de securitate macOS care rula pe tăcute aplicația dintr-o cale care dispare — iată diagnosticul și fix-ul dintr-un singur prompt.

macOS
Permisiuni
Inginerie
O singură variabilă CSS, cinci runde de review și un toolchain Swift care a mintit
Steven
Steven7 min citire

O singură variabilă CSS, cinci runde de review și un toolchain Swift care a mintit

GeekBye v2.0.7 a făcut întregul overlay translucid reglabil — ceea ce sună ca o modificare CSS de o linie și absolut nu a fost. Adevărata poveste e ce a prins review-ul: două suprafețe care refuzau să pălească, o bară de înregistrare care arăta greșit la aceeași opacitate și un binar compilat care a oscilat 672 de octeți pentru că propriile noastre documente i-au spus unui reviewer versiunea greșită de Swift.

Inginerie
Design
Build
Verificarea de siguranță care a făcut aplicația noastră imposibil de închis
Steven
Steven6 min citire

Verificarea de siguranță care a făcut aplicația noastră imposibil de închis

Auto-update a fost cea mai grea funcție pe care am livrat-o vreodată — șase lansări în patru zile ca s-o oprim din a strica aplicația. Cel mai urât bug a fost unul pe care l-am introdus chiar noi încercând să fim precauți: o verificare de „siguranță" de 500 de milisecunde care transforma un update eșuat într-un proces pe care pur și simplu nu-l puteai închide.

Inginerie
Electron
Fiabilitate