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
Lansări GeekBye
O singură variabilă CSS, cinci runde de review și un toolchain Swift care a mintit

„Fă overlay-ul translucid" e genul de sarcină care sună ca un slider și o proprietate CSS opacity. GeekBye v2.0.7 a livrat exact acel rezultat vizibil pentru utilizator — un singur „mod luminos" reglabil care te lasă să vezi prin panourile asistentului până la ce e în spatele lor. Dar partea interesantă a acestei lansări nu e funcția. Sunt cele cinci runde de review de care a fost nevoie ca să iasă corect și o poveste de război despre un binar compilat care și-a schimbat dimensiunea pentru că propria noastră documentație a mințit un reviewer.

Modul corect de a face o întreagă interfață translucidă

Versiunea naivă a asta e să presari o valoare de opacitate peste fiecare componentă de panou și să declari treaba gata. Asta e o capcană de întreținere: o duzină de valori hardcodate care se abat una de alta în clipa în care cineva atinge una dintre ele.

În schimb, v2.0.7 folosește un singur utilitar CSS partajat și un token per suprafață. Există o singură clasă overlay-surface care calculează fundalul unui panou din două proprietăți personalizate: o opacitate de bază pe care fiecare suprafață o declară pentru sine (bara de control, chat-ul, bulele de transcriere, blocurile de cod și așa mai departe își aleg fiecare pe a lor) și un multiplicator de alfa global care stă pe rădăcina overlay-ului și reprezintă setarea slider-ului utilizatorului. Fiecare suprafață citește același multiplicator; fiecare își păstrează propriul caracter. Esențial, se scalează doar fundalul panoului — textul, iconițele și backdrop-blur rămân complet randate, așa că „translucid" nu înseamnă niciodată „ilizibil."

Două decizii din acel design merită scoase în evidență, pentru că sunt diferența dintre o funcție care ajută și una care generează tichete de suport:

  • Valoarea implicită este complet opacă. Setarea de opacitate se livrează la 100% — un no-op. Overlay-ul nimănui nu a devenit brusc transparent la actualizare; translucența e acolo când o vrei și invizibilă până atunci.
  • Setarea e validată defensiv. Există o singură sursă de adevăr pentru min, max, implicit și pas, plus un normalizator care păzește cazul gol/lipsă. Asta contează din cauza unei capcane JavaScript: Number(null) e 0, așa că o setare lipsă convertită naiv ar fixa overlay-ul în starea sa cea mai transparentă în loc de valoarea implicită. Normalizatorul prinde asta înainte să se poată întâmpla.

Trage slider-ul și întregul overlay se re-colorează live, în plină înregistrare, pentru că fiecare suprafață e abonată la aceeași setare. Fără restart, fără reîncărcare.

Ce a prins review-ul (și un test pe un singur monitor nu ar fi făcut-o niciodată)

Aici „o singură variabilă CSS" a încetat să fie simplu. Trei bug-uri au ieșit la iveală în review, iar două dintre ele sunt aceeași lecție purtând pălării diferite.

Un panou care nu voia să pălească. Overlay-ul cu scurtături de tastatură a rămas încăpățânat de solid în timp ce tot restul devenea translucid. Cauza: se randează în afara subarborelui DOM care poartă variabila de opacitate, așa că nu a moștenit niciodată valoarea care coboară în cascadă din rădăcina overlay-ului. Proprietățile personalizate CSS se moștenesc prin arborele DOM — iar dacă un nod nu e efectiv un descendent al locului unde setezi variabila, primește pe tăcute nimic. Fixul a fost să setăm variabila și local, pe acel panou.

O nuanță de hover care a dispărut. Butoanele Fn/Assist și-au pierdut strălucirea cyan la hover. Utilitarul de translucență seta fundalul cu !important (trebuie să câștige împotriva valorilor implicite ale suprafeței), iar asta a strivit nuanța de fundal hover: de pe același element. Coliziune de specificitate. Fixul a fost să facem nuanța de hover la fel de emfatică, ca să poată recâștiga la hover.

Ambele sunt același adevăr de fond: o cascadă de variabile CSS e o adevărată graniță de corectitudine, nu un detaliu de stilizare. Moștenirea și specificitatea decid dacă valoarea ta ajunge măcar la element, și niciuna nu apare într-un screenshot până când nu e greșită.

Aceeași opacitate, alt aspect. Cel mai subtil: bara de înregistrare și bara inactivă erau setate la identica opacitate de bază și totuși arătau vizibil diferit. De ce? Pastila de înregistrare folosea un backdrop-blur mai puternic, iar un blur puternic peste un fundal întunecat mediază spre un rezultat mai închis — așa că alfa egală a produs un aspect inegal. Avea și un chenar slab acolo unde bara inactivă avea o margine luminoasă cu inel de gradient. Fixul a potrivit nivelul de blur și inelul. Lecția a rămas: alfa egală nu e aspect egal odată ce blur-ul intră în scenă. Translucența e un sistem de efecte care interacționează, nu un singur număr.

Binarul care și-a schimbat dimensiunea pentru că documentele au mințit

Acum povestea de război, și e genul meu preferat — cea în care tooling-ul și documentele nu sunt de acord, iar un reviewer atent e prins în focul încrucișat.

GeekBye livrează câteva binare Swift pre-compilate (helper-e native pentru lucruri ca detecția de ședințe). Pentru că un binar compilat e băgat în repo, fiecare dezvoltator trebuie să-l compileze cu exact aceeași versiune de Swift — toolchain-uri diferite produc octeți diferiți din sursă identică, iar asta ar însemna un conflict git fantomă de fiecare dată când cineva recompilează. Așa că există un script care impune o versiune specifică: Swift 6.3.x, verificat la build.

În timpul review-ului acestei lansări, un reviewer a semnalat că un binar ar trebui recompilat ca să se potrivească cu „toolchain-ul mandatat de repo." Dezvoltatorul a făcut exact asta — iar dimensiunea binarului s-a schimbat de la 89,184 de octeți la 88,512. Mesajul de commit chiar spunea că „restaura ieșirea stabilă în octeți" recompilând cu Swift 6.2.1, „toolchain-ul mandatat de repo."

Doar că 6.2.1 era versiunea greșită. Scriptul de impunere la build cerea 6.3.x. Problema era că documentația în proză — README-ul și ghidul de contribuitor — încă spuneau 6.2.1 în câteva locuri. Așa că un reviewer conștiincios și un dezvoltator conștiincios, amândoi încercând să facă ce trebuie, au urmat documentele direct în a face commit exact cu artefactul pe care scriptul de impunere există ca să-l respingă. Un binar 6.2.1 într-un repo 6.3.x e exact abaterea care ar strica recompilarea curată a oricărui alt dezvoltator.

Commit-ul următor a rezolvat-o — și fixul e ideea. Nu doar a recompilat binarul înapoi la forma sa 6.3.x (dimensiune restaurată la 89,184, chiar de unde plecase). A corectat și referințele învechite la „6.2.1" din documente, ca să nu mai poată fi întinsă capcana din nou. Binarul a oscilat 672 de octeți și înapoi în două commit-uri, iar adevăratul bug nu a fost niciodată binarul. Era că două surse de adevăr — scriptul de impunere și documentele scrise — nu erau de acord, iar un om a avut încredere în cel greșit.

Trei lucruri pe care ne-a învățat această lansare

  1. O cascadă de variabile CSS e o graniță de corectitudine. Două din trei bug-uri de review s-au redus la o variabilă care nu se moștenea și un !important care a strivit o stare de hover. Dacă o valoare trebuie să ajungă la un element prin moștenire sau să câștige prin specificitate, acel traseu e logică — verifică-l ca logică, nu ca stilizare.
  2. Parametri egali pot produce rezultate inegale. Bara de înregistrare și bara inactivă împărțeau o opacitate și tot arătau diferit, pentru că un blur diferit a schimbat rezultatul. Când unifici un sistem vizual pe un singur număr, verifică dacă celelalte variabile din jurul fiecărei suprafețe nu schimbă pe tăcute ce înseamnă acel număr.
  3. Când documentele și impunerea nu sunt de acord, rezolvă dezacordul — nu doar simptomul. Bug-ul nu era un binar greșit; era un document care numea toolchain-ul greșit și un script de impunere care spunea altceva. Recompilarea binarului tratează simptomul. Să faci fiecare sursă de adevăr să fie de acord e fixul real, pentru că și următorul reviewer va avea încredere în documente.

GeekBye v2.0.7 a livrat translucența uniformă, cu toate cazurile-limită trecute prin review și documentele de toolchain puse la punct. E ultima dintre lansările de „meșteșug tăcut" înaintea sprintului de fiabilitate care a urmat. Pentru temelia de sub ea, vezi ce presupune cu adevărat o versiune 2 (v2.0.0); pentru lansarea-soră de polish, software calm: fixul de flicker și chip-ul de mod de răspuns (v2.0.3 + v2.0.5); iar pentru cum rămâne overlay-ul ascuns într-un apel, cum să rămâi invizibil în timpul partajării de ecran.

Articole Similare

Software calm: cum am ucis un toggle care pâlpâia și am învățat chat-ul să spună în ce mod e
Steven
Steven6 min citire

Software calm: cum am ucis un toggle care pâlpâia și am învățat chat-ul să spună în ce mod e

Două lansări mici GeekBye, fără funcții de titlu — doar un toggle din setări care s-a oprit din pâlpâit și un asistent de chat care în sfârșit îți spune dacă ți-a răspuns în mod ședință sau mod programare. Asta costă de fapt „software-ul calm", un detaliu pe rând.

Produs
Design
Inginerie
Anatomia livrării unui software la perfecțiune: cum a prins code review-ul ceea ce testele nu au putut
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
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