Ju paraqesim pjesĂ«n e tretĂ« tĂ« pĂ«rkthimit tĂ« materialit pĂ«r rrugĂ«n qĂ« pĂ«rshkoi Dropbox gjatĂ« ĐČĐœĐ”ĐŽimit tĂ« sistemit tĂ« kontrollit tĂ« tipeve pĂ«r kodin Python.
â PjesĂ«t e mĂ«parshme: dhe
Arritja e 4 milionë rreshtave të kodit të tipizuar
NjĂ« tjetĂ«r detyrĂ« e rĂ«ndĂ«sishme (kjo ishte problemi i dytĂ« mĂ« i pĂ«rmendur nga ata qĂ« morĂ«n pjesĂ« nĂ« anketat e brendshme) ishte rritja e volumit tĂ« kodit nĂ« Dropbox tĂ« mbuluar nga kontrolli i tipeve. Provam disa qasje pĂ«r ta zgjidhur kĂ«tĂ« detyrĂ« â nga rritja natyrore e bazĂ«s sĂ« kodit tĂ« tipizuar deri te pĂ«rqendrimi i pĂ«rpjekjeve tĂ« ekipit mypy nĂ« nxjerrjen e automatizuar statike dhe dinamike tĂ« tipeve. NĂ« fund, u krijua pĂ«rshtypja se kĂ«tu nuk ka njĂ« strategji tĂ« thjeshtĂ« fituese, por arritĂ«m tĂ« siguronim rritje tĂ« shpejtĂ« tĂ« vĂ«llimit tĂ« kodit tĂ« anotuar duke kombinuar shumĂ« qasje.
Si rezultat, në repository-n tonë më të madh Python (me kodin backend), numri i rreshtave të kodit të anotuar arriti pothuajse në 4 milionë. Puna për tipizimin statik të kodit u krye për rreth tre vjet. Mypy tani mbështet lloje të ndryshme raportesh për mbulimin e kodit me tipe, të cilat e bëjnë më të lehtë ndjekjen e ecurisë së tipizimit. Në veçanti, ne mund të gjenerojmë raporte për kodin me paqartësi tipesh, si për shembull përdorimi i drejtpërdrejtë i tipit Any në anotime që nuk mund të verifikohen, ose raste si importimi i bibliotekave të palëve të treta që nuk kanë anotime tipesh. Në kuadër të projektit për rritjen e saktësisë së kontrollit të tipeve në Dropbox, ne kemi kontribuar në përmirësimin e përkufizimeve të tipeve (të ashtuquajturat skedarë stub) për disa biblioteka të njohura open source në repository-n e centralizuar Python .
Ne kemi zbatuar (dhe standardizuar më pas në PEP) mundësi të reja të sistemit të tipeve, të cilat lejojnë përdorimin e tipeve më të sakta për disa modele specifike të Python. Një shembull i dukshëm i kësaj është TypeDict, i cili ofron tipe për fjalorë të ngjashëm me JSON me një grup fiks çelësash vargjesh, ku secili ka vlerë të tipit të vet. Ne do të vazhdojmë ta zgjerojmë sistemin e tipeve. Ka shumë gjasa që hapi ynë i ardhshëm të jetë përmirësimi i mbështetjes për mundësitë e Python për punën me numrat.

Numri i rreshtave të kodit të anotuar: server

Numri i rreshtave të kodit të anotuar: klienti

Numri total i rreshtave të kodit të anotuar
Ja një përmbledhje e veçorive kryesore të masave që ndërmorëm për të rritur vëllimin e kodit të anotuar në Dropbox:
Rigoroziteti i anotimit. Ne i rritëm gradualisht kërkesat për rigorozitetin e anotimit të kodit të ri. Filluam me sugjerime nga linter-i, të cilat rekomandonin shtimin e anotimeve në skedarët ku tashmë kishte disa anotime. Tani kërkojmë praninë e anotimeve të tipeve në skedarët e rinj Python dhe në shumicën e skedarëve ekzistues.
Raportet e tipizimit. Ădo javĂ« u dĂ«rgojmĂ« ekipeve raporte mbi nivelin e tipizimit tĂ« kodit tĂ« tyre dhe u japim kĂ«shilla se çfarĂ« duhet anotuar sĂ« pari.
Popullarizimi i mypy. Ne flasim për mypy në evente të ndryshme dhe bashkëpunojmë me ekipet, duke i ndihmuar të fillojnë të përdorin anotimet e tipeve.
Anketat. Ne zhvillojmĂ« anketa periodike me pĂ«rdoruesit pĂ«r tĂ« identifikuar problemet kryesore. Jemi tĂ« gatshĂ«m tĂ« shkojmĂ« mjaft larg pĂ«r tâi zgjidhur kĂ«to probleme (madje deri te krijimi i njĂ« gjuhe tĂ« re pĂ«r tĂ« pĂ«rshpejtuar mypy!).
Performanca. Ne e kemi përmirësuar ndjeshëm performancën e mypy falë përdorimit të daemon-it dhe mypyc. Kjo u bë për të zbutur vështirësitë që lindin gjatë procesit të anotimit dhe për të bërë të mundur punën me vëllime të mëdha kodi.
Integrimi me editorët. Krijuam mjete për të mbështetur ekzekutimin e mypy në editorët që përdoren gjerësisht në Dropbox. Këtu përfshihen PyCharm, Vim dhe VS Code. Kjo e thjeshtoi ndjeshëm procesin e anotimit të kodit dhe të verifikimit të funksionimit të tij. Veprime të tilla janë zakonisht tipike gjatë anotimit të kodit ekzistues.
Analiza statike. Krijuam një mjet për nxjerrjen e signaturave të funksioneve duke përdorur mekanizma të analizës statike. Ky mjet mund të funksionojë vetëm në situata relativisht të thjeshta, por na ndihmoi të rrisim mbulimin e kodit me tipe pa shumë përpjekje.
MbĂ«shtetja pĂ«r bibliotekat e palĂ«ve tĂ« treta. NĂ« shumĂ« prej projekteve tona pĂ«rdoret paketa e mjeteve SQLAlchemy. Ajo shfrytĂ«zon veçori dinamike tĂ« Python qĂ« tipet PEP 484 nuk mund tâi modelojnĂ« drejtpĂ«rdrejt. NĂ« pĂ«rputhje me PEP 561, ne krijuam stub-file pĂ«rkatĂ«s dhe shkruam njĂ« plugin pĂ«r mypy (), qĂ« pĂ«rmirĂ«son mbĂ«shtetjen pĂ«r SQLAlchemy.
Vështirësitë me të cilat u përballëm
Rruga drejt 4 milionĂ« rreshtave kodi tĂ« tipizuar nuk ka qenĂ« gjithmonĂ« e lehtĂ« pĂ«r ne. GjatĂ« kĂ«saj rruge hasĂ«m jo pak pengesa dhe bĂ«mĂ« disa gabime. Ja disa nga problemet me tĂ« cilat u pĂ«rballĂ«m. ShpresojmĂ« qĂ« pĂ«rshkrimi i tyre tâi ndihmojĂ« tĂ« tjerĂ«t tâi shmangin probleme tĂ« ngjashme.
SkedarĂ« tĂ« anashkaluar. NĂ« fillim kontrollonim vetĂ«m njĂ« numĂ«r tĂ« vogĂ«l skedarĂ«sh. Gjithçka qĂ« nuk bĂ«nte pjesĂ« nĂ« kĂ«tĂ« grup skedarĂ«sh nuk kontrollohej. SkedarĂ«t shtoheshin nĂ« listĂ«n e kontrollit kur nĂ« to shfaqeshin anotimet e para. NĂ«se diçka importohej nga njĂ« modul qĂ« ndodhej jashtĂ« fushĂ«s sĂ« kontrollit, atĂ«herĂ« bĂ«hej fjalĂ« pĂ«r punĂ« me vlera tĂ« tipit Any, tĂ« cilat nuk kontrolloheshin fare. Kjo solli njĂ« humbje tĂ« konsiderueshme tĂ« saktĂ«sisĂ« sĂ« tipizimit, veçanĂ«risht nĂ« fazat e hershme tĂ« migrimit. Ky qasje vazhdoi tĂ« funksiononte çuditĂ«risht mirĂ«, megjithĂ«se ishte tipike qĂ« shtimi i skedarĂ«ve nĂ« fushĂ«n e kontrollit tĂ« zbulonte probleme nĂ« pjesĂ« tĂ« tjera tĂ« bazĂ«s sĂ« kodit. NĂ« rastin mĂ« tĂ« keq, kur bashkoheshin dy zona tĂ« izoluara tĂ« kodit ku tipet, nĂ« mĂ«nyrĂ« tĂ« pavarur, ishin kontrolluar tashmĂ«, rezultonte se tipet e kĂ«tyre zonave nuk ishin tĂ« pĂ«rputhshme me njĂ«ra-tjetrĂ«n. Kjo sillte nevojĂ«n pĂ«r tĂ« bĂ«rĂ« shumĂ« ndryshime nĂ« anotime. Tani, duke parĂ« pas, e kuptojmĂ« se duhej tâi kishim pĂ«rfshirĂ« sa mĂ« herĂ«t modulet bazĂ« tĂ« bibliotekĂ«s nĂ« fushĂ«n e kontrollit tĂ« tipeve tĂ« mypy. Kjo do ta kishte bĂ«rĂ« punĂ«n tonĂ« shumĂ« mĂ« tĂ« parashikueshme.
Anotimi i kodit të vjetër. Kur e nisëm punën, kishim rreth 4 milionë rreshta kod Python ekzistues. Ishte e qartë se anotimi i gjithë këtij kodi nuk ishte aspak i lehtë. Krijuam një mjet të quajtur PyAnnotate, i cili mund të mbledhë informacion për tipet gjatë ekzekutimit të testeve dhe të shtojë në kod anotime tipesh bazuar në të dhënat e mbledhura. Megjithatë, nuk vumë re përdorim veçanërisht të gjerë të këtij mjeti. Mbledhja e informacionit për tipet ishte e ngadaltë dhe anotimet e gjeneruara automatikisht shpesh kërkonin shumë korrigjime manuale. Mendonim ta ekzekutonim automatikisht këtë mjet në çdo kontroll të kodit, ose të mblidhnim informacion për tipet mbi bazën e analizës së një sasie të vogël kërkesash reale të rrjetit, por vendosëm të mos e bënim, sepse secila prej këtyre qasjeve ishte tepër e rrezikshme.
NĂ« fund, mund tĂ« thuhet se pjesa mĂ« e madhe e kodit u anotua manualisht nga pronarĂ«t e tij. PĂ«r ta orientuar kĂ«tĂ« proces nĂ« drejtimin e duhur, ne pĂ«rgatisim raporte pĂ«r modulet dhe funksionet mĂ« tĂ« rĂ«ndĂ«sishme qĂ« duhen anotuar. PĂ«r shembull, Ă«shtĂ« e rĂ«ndĂ«sishme tĂ« pajiset me anotime tipesh njĂ« modul biblioteke qĂ« pĂ«rdoret nĂ« qindra vende. NdĂ«rsa njĂ« shĂ«rbim i vjetĂ«r, qĂ« po zĂ«vendĂ«sohet me njĂ« tĂ« ri, nuk Ă«shtĂ« mĂ« aq i rĂ«ndĂ«sishĂ«m pĂ«r tâu anotuar. PĂ«rveç kĂ«saj, po eksperimentojmĂ« me pĂ«rdorimin e analizĂ«s statike pĂ«r tĂ« gjeneruar anotime tipesh pĂ«r kodin e vjetĂ«r.
Importet ciklike. MĂ« sipĂ«r fola pĂ«r importet ciklike (pĂ«r ânyjat e varĂ«siveâ), ekzistenca e tĂ« cilave e vĂ«shtirĂ«soi pĂ«rshpejtimin e mypy. PĂ«rveç kĂ«saj, na u desh tĂ« punonim seriozisht qĂ« ta pajisnim mypy me mbĂ«shtetje pĂ«r tĂ« gjitha llojet e idiomave qĂ« lindin pikĂ«risht nga kĂ«to importe ciklike. SĂ« fundmi pĂ«rfunduam njĂ« projekt tĂ« madh ridizajnimi tĂ« sistemit, i cili zgjidhi shumicĂ«n e problemeve tĂ« mypy qĂ« lidhen me importet ciklike. NĂ« fakt, kĂ«to probleme i kanĂ« rrĂ«njĂ«t qĂ« nĂ« ditĂ«t shumĂ« tĂ« hershme tĂ« projektit, madje qĂ« nga Alore, gjuha mĂ«simore pĂ«r tĂ« cilĂ«n projekti mypy ishte orientuar fillimisht. Sintaksa e Alore lejon zgjidhjen e lehtĂ« tĂ« problemeve me komandat ciklike tĂ« importit. mypy modern ka trashĂ«guar disa kufizime nga implementimi i tij i hershĂ«m dhe i thjeshtĂ« (i cili i pĂ«rshtatej shumĂ« mirĂ« Alore). Python e ndĂ«rlikon punĂ«n me importet ciklike kryesisht pĂ«r shkak tĂ« paqartĂ«sisĂ« sĂ« shprehjeve. PĂ«r shembull, gjatĂ« njĂ« veprimi caktimi vlere mund tĂ« pĂ«rkufizohet nĂ« tĂ« vĂ«rtetĂ« njĂ« pseudonim tipi. Mypy nuk Ă«shtĂ« gjithmonĂ« nĂ« gjendje tâi zbulojĂ« gjĂ«ra tĂ« tilla derisa tĂ« jetĂ« pĂ«rpunuar pjesa mĂ« e madhe e ciklit tĂ« importit. NĂ« Alore nuk kishte paqartĂ«si tĂ« tilla. Vendimet e pasuksesshme tĂ« marra nĂ« fazat e hershme tĂ« zhvillimit tĂ« sistemit mund tâi sjellin programuesit surpriza tĂ« pakĂ«ndshme edhe shumĂ« vite mĂ« vonĂ«.
Përfundime: rruga drejt 5 milionë rreshtave kodi dhe horizonteve të reja
Projekti mypy ka bĂ«rĂ« njĂ« rrugĂ« tĂ« gjatĂ« â nga prototipet e hershme deri te njĂ« sistem me tĂ« cilin kontrollohen tipet nĂ« kod prodhimi me vĂ«llim prej 4 milionĂ« rreshtash. GjatĂ« zhvillimit tĂ« mypy u standardizuan edhe type hints nĂ« Python. Sot, rreth tipizimit tĂ« kodit Python Ă«shtĂ« zhvilluar njĂ« ekosistem i fuqishĂ«m. Ajo pĂ«rfshin mbĂ«shtetje pĂ«r biblioteka, mjete ndihmĂ«se pĂ«r IDE dhe editorĂ«, si edhe disa sisteme kontrolli tipesh, secili me avantazhet dhe mangĂ«sitĂ« e veta.
Edhe pse kontrolli i tipeve tashmë perceptohet në Dropbox si diçka krejt e natyrshme, jam i bindur se ne ende jetojmë në agimin e tipizimit të kodit Python. Mendoj se teknologjitë e kontrollit të tipeve do të vazhdojnë të zhvillohen dhe të përmirësohen.
Nëse ende nuk keni përdorur kontrollin e tipeve në projektin tuaj Python në shkallë të gjerë, dijeni se tani është një moment shumë i përshtatshëm për të nisur kalimin drejt tipizimit statik. Kam biseduar me ata që e kanë bërë këtë kalim. Asnjëri prej tyre nuk është penduar. Kontrolli i tipeve e shndërron Python-in në një gjuhë që është shumë më e përshtatshme se «Python-i i zakonshëm» për zhvillimin e projekteve të mëdha.
Të nderuar lexues! A përdorni kontrollin e tipeve në projektet tuaja Python?
Burimi: habr.com
