de Filip Hracek

Modul în care Google creează cadre web

Modul in care Google creeaza cadre web

este cunoașterea publicului că Google folosește un singur depozit pentru a partaja cod – toate cele 2 miliarde de linii – și că folosește paradigma de dezvoltare bazată pe trunchi.

1611241987 403 Modul in care Google creeaza cadre web
Acesta este cu ușurință unul dintre cele mai mari depozite de cod unic din lume. Sursă.

Pentru mulți dezvoltatori din afara companiei, acest lucru este surprinzător și contraintuitiv, dar funcționează foarte bine. (Articolul legat mai sus oferă exemple bune, așa că nu le voi repeta aici.)

Baza de cod Google este partajată de peste 25.000 de dezvoltatori de software Google din zeci de birouri din țări din întreaga lume. Într-o zi de lucru obișnuită, ei angajează 16.000 de modificări la baza de coduri. (sursă)

Acest articol este despre specificul construirii unui cadru web open source (AngularDart) în acest context.

1611241988 859 Modul in care Google creeaza cadre web
„Utilizatori umani” înseamnă inginerii de software care trimit cod la Google. (Spre deosebire de instrumentele de generare a surselor.) Sursă.

O singură versiune

Când folosiți dezvoltarea bazată pe trunchi într-o singură repo mare, aveți o singură versiune a tuturor. Este cam evident. Totuși, este bine să o subliniem aici, pentru că înseamnă că – la Google – nu puteți avea aplicația FooBar care utilizează AngularDart 2.2.1 și o altă aplicație BarFoo care este pe 2.3.0. Ambele aplicații trebuie să aibă aceeași versiune – cea mai recentă.

Modul in care Google creeaza cadre web
Imagine ilustrativă preluată din trunkbaseddevelopment.com.

De aceea, Google, uneori, spune că toate software-urile de la Google trăiesc la limita sângerării.

Dacă tot sufletul tău țipă „periculos!” chiar acum, este de înțeles. În funcție de trunchiul („master” în terminologia git) a unei biblioteci, codul de producție sună sigur, periculos. Dar există o întorsătură de complot în față.

74 de mii de teste pe comitere

AngularDart definește 1601 de teste (aici). Dar când comiteți o modificare a codului AngularDart în depozitul Google, acesta rulează și teste pentru toți cei de la Google care depind de cadru. În acest moment, sunt aproximativ 74 de mii de teste (în funcție de cât de mare este schimbarea ta – un test euristic omite testele pe care sistemul știe că nu le afectezi).

1611241988 173 Modul in care Google creeaza cadre web

Este bine să faci mai multe teste.

Tocmai am făcut o modificare care se manifestă doar 5% din timp, simulând ceva de genul unei condiții de cursă în algoritmul de verificare a reinserției de detectare a modificărilor (am adăugat && random.nextDouble() > .05 la aceasta dacă statement). Nu s-a manifestat în niciunul dintre testele din 1601 când le-am rulat (o dată). Dar a întrerupt o grămadă de teste ale clienților.

Valoarea reală aici este însă că acestea sunt teste aplicații reale. Nu numai că sunt numeroase, dar reflectă și modul în care cadrul este utilizat de dezvoltatori (nu doar autorii cadrului). Acest lucru este semnificativ: proprietarii cadrelor nu estimează întotdeauna corect modul în care este utilizat cadrul lor.

De asemenea, ajută ca acele aplicații să fie în producție și să treacă miliarde de dolari în fiecare lună. Există o mare diferență între aplicațiile demo pe care un autor de cadru le pune în timpul liber și aplicațiile reale de producție cu zeci sau sute de ani-persoană investite în ele. Dacă internetul va fi relevant în viitor, trebuie să sprijinim mai bine dezvoltarea acestuia.

1611241989 764 Modul in care Google creeaza cadre web

Deci, ce se întâmplă dacă cadrul sparg unele aplicații care sunt construite pe acesta?

O spargi, o repari

Când autorii AngularDart doresc să introducă o schimbare de rupere, trebuie să meargă și să o repare pentru utilizatorii lor. Întrucât totul la Google trăiește într-o singură repo, este banal să aflăm pe cine sparg și pot începe să repare imediat.

Orice schimbare la AngularDart include, de asemenea, toate remedierile acestei modificări în toate aplicațiile Google care depind de aceasta. Deci, defecțiunea și soluția intră în repo simultan și – desigur – după revizuirea corectă a codului de către toate părțile afectate.

Să dăm un exemplu concret. Când cineva din echipa AngularDart efectuează o modificare care afectează codul din aplicația AdWords, merge la codul sursă al aplicației respective și îl remediază. În acest proces, pot rula testele AdWords existente și pot adăuga teste noi. Apoi, pun toate acestea în lista lor de schimbări și cer revizuire. Întrucât lista de modificări a acestora atinge codul atât în ​​repozitul AngularDart, cât și în repozitul AdWords, sistemul necesită automat aprobarea revizuirii codului de către ambele echipe. Abia atunci poate fi trimisă modificarea.

1611241990 439 Modul in care Google creeaza cadre web

Acest lucru are efectul evident de a preveni dezvoltarea cadrului în vid. Dezvoltatorii de cadre AngularDart au acces la milioane de linii de cod care sunt construite cu platforma lor și ating în mod regulat acest cod. Nu trebuie să-și asume modul în care este utilizat cadrul lor. (Avertismentul evident este că ei văd doar codul Google și nu codul tuturor Workiva, Wrikes și StableKernels din lume care folosesc și AngularDart.)

Trebuie să actualizați codul utilizatorilor dvs., de asemenea, încetinește dezvoltarea. Nu atât de mult pe cât credeți (uitați-vă la progresul AngularDart din octombrie), dar încetinește lucrurile. Acest lucru este atât bun, cât și rău, în funcție de ceea ce doriți de la un cadru. Ne vom întoarce la asta.

Oricum. Data viitoare când cineva la Google spune că o versiune alfa a unei biblioteci este stabilă și este în producție, acum știți de ce.

Schimbări la scară largă

Ce se întâmplă dacă AngularDart trebuie să facă o schimbare majoră (să spunem, trecând de la 2.x la 3.0) și această schimbare întrerupe 74 de mii de teste? Va merge echipa și le va remedia pe toate? Vor face schimbări în mii de fișiere sursă, dintre care majoritatea nu au fost create?

Da.

Unul dintre lucrurile interesante despre a avea un sistem de tip sunet este că instrumentele dvs. pot fi mult mai utile. În Sound Dart, instrumentele pot fi siguri că o variabilă este de un anumit tip, de exemplu. Pentru refactorizare, asta înseamnă că multe modificări pot fi complet automate, fără a fi necesară confirmarea din partea dezvoltatorului.

Când o metodă din clasa Foo se schimbă din bar() la baz(), puteți crea un instrument care trece prin întregul depozit Google unic, găsește toate instanțele de acea Clasa Foo și subclasele sale și modifică toate mențiunile despre bar() la baz(). Cu sistemul de tip sonor Dart, puteți fi sigur că acest lucru nu va sparge nimic. Fără tipuri de sunet, chiar și o astfel de schimbare simplă vă poate pune în dificultate.

Modul in care Google creeaza cadre web
O singură apăsare de tastă și codul dvs. sunt formatate conform Dart ghid stilistic. De fapt, ghidul afirmă: „Regulile oficiale de manipulare a spațiului alb pentru Dart sunt orice produce dart_style. ”

Un alt lucru care ajută la schimbările la scară largă este stil_dart, Formatatorul implicit al lui Dart. Tot codul Dart de la Google este formatat folosind acest instrument. În momentul în care codul dvs. ajunge la recenzori, acesta a fost formatat automat folosind dart_style, deci nu există argumente dacă doriți să puneți noua linie aici sau acolo. Și asta se aplică și refactorilor de mari dimensiuni.

Valori de performanță

După cum am spus mai sus, AngularDart beneficiază de testele dependenților săi. Dar nu sunt doar teste. Google este foarte riguros în ceea ce privește măsurarea performanței aplicațiilor sale, astfel încât majoritatea aplicațiilor de producție (toate?) Au suite de referință.

Așadar, atunci când echipa AngularDart introduce o schimbare care face ca programul AdWords să încarcă cu 1% mai lent, știu inainte de aterizând schimbarea. Când echipa a spus în octombrie, când aplicațiile AngularDart s-au redus cu 40% mai mici și cu 10% mai rapide începând cu luna august, nu vorbeau despre unele exemple de aplicații sintetice minuscule TodoMVC. Vorbeau despre aplicații de producție din viața reală, critice pentru misiune, cu milioane de utilizatori și megaocteți de cod logică de afaceri.

1611241991 446 Modul in care Google creeaza cadre web

Notă laterală: instrument de construcție ermetic

S-ar putea să vă întrebați: de unde a știut acest tip ce teste din imensul depozit intern să ruleze după introducerea erorii fulgiante în AngularDart? Cu siguranță nu a ales cele 74 de mii de teste și, la fel de sigur, nu a alergat toate testele de la Google. Răspunsul constă în ceva numit Bazel.

La această scară, nu puteți avea o serie de scripturi shell pentru a construi lucruri. Lucrurile ar fi fulgiante și prohibitiv de lente. Ai nevoie de un instrument de construcție ermetic.

„Hermetic” în acest context este foarte asemănător cu „pur”În contextul funcțiilor. Pașii dvs. de construcție nu pot avea efecte secundare (cum ar fi fișierele temp, modificările la PATH etc.) și trebuie să fie deterministe (aceeași intrare duce întotdeauna la aceeași ieșire). În acest caz, puteți rula build-urile și testele pe orice mașină în orice moment și veți obține rezultate consistente. Nu trebuie make clean. Prin urmare, puteți trimite compilările / testele pentru a construi servere și a le paralela.

1611241991 538 Modul in care Google creeaza cadre web

Google a petrecut ani de zile dezvoltând un astfel de instrument de construcție. A fost deschis anul trecut ca Bazel.

Și datorită acestei infrastructuri, instrumentele de testare interne pot determina ce construcții / teste afectează fiecare modificare și le pot executa atunci când este cazul.

Ce înseamnă totul?

Obiectivul explicit al AngularDart este de a fi cel mai bun din clasă în ceea ce privește productivitatea, performanța și fiabilitatea pentru construirea de aplicații web mari. Această postare acoperă, sperăm, ultima parte – fiabilitatea – și de ce este important ca aplicațiile Google critice pentru misiune, precum AdWords și AdSense, să utilizeze cadrul. Nu doar echipa se laudă cu utilizatorii lor – așa cum s-a explicat mai sus, având utilizatori interni mari face ca AngularDart să fie mai puțin probabil să introducă modificări superficiale. Face ca cadrul să fie mai fiabil.

1611241992 566 Modul in care Google creeaza cadre web
Dacă toate acestea sună prea de afaceri, ați putea verifica proiectele mele AngularDart care nu sunt de afaceri Donald Trump automat (Lanțul Markov) sau Prime Finder.

Dacă sunteți în căutarea unui cadru care să facă revizii majore și să introducă caracteristici majore la fiecare câteva luni, AngularDart cu siguranță nu este pentru dvs. Chiar dacă echipa a dorit să construiască cadrul în așa fel, cred că este clar din acest articol că nu ar putea. Credem sincer, totuși, că există spațiu pentru un cadru mai puțin la modă, dar de încredere.

În opinia mea, cea mai bună previziune a suportului pe termen lung al unui stack tehnologic open-source este că este o mare parte a activității întreținătorului principal. Luați Android, pumnal, MySQL sau git ca exemple. De aceea, mă bucur că Dart are în sfârșit un cadru web preferat (AngularDart), o bibliotecă de componente preferată (Componente AngularDart) și un cadru mobil preferat (Flutură) – toate acestea sunt utilizate pentru a crea aplicații Google critice pentru afaceri.

[Matan Lurey and Kathy Walrath contributed to this article.]

[Discuss on Reddit, HN, Twitter.]