Leiðin til að slá inn 4 milljón línur af Python kóða. 3. hluti

Við kynnum þér þriðja hluta þýðingarinnar á efninu um leiðina sem Dropbox fór þegar innleiðing var gerð tegundaeftirlitskerfis fyrir Python kóða.

Leiðin til að slá inn 4 milljón línur af Python kóða. 3. hluti

→ Fyrri hlutar: fyrst и Second

Að ná 4 milljón línum af vélrituðum kóða

Önnur stór áskorun (og næstalgengasta áhyggjuefnið meðal þeirra sem voru í könnuninni) var að auka magn kóða sem falla undir tegundathugun í Dropbox. Við höfum reynt nokkrar aðferðir til að leysa þetta vandamál, allt frá því að stækka náttúrulega stærð innritaðs kóðagrunns til að einbeita mypy teyminu að kyrrstæðum og kraftmiklum sjálfvirkri gerð ályktunar. Að lokum virtist sem engin einföld vinningsstefna væri til, en okkur tókst að ná hröðum vexti í magni merkta kóða með því að sameina margar aðferðir.

Fyrir vikið hefur stærsta Python geymslan okkar (með bakendakóða) næstum 4 milljón línur af merktum kóða. Vinnu við kyrrstætt innslátt á kóða lauk á um það bil þremur árum. Mypy styður nú ýmsar gerðir af kóða umfangsskýrslum sem gera það auðveldara að fylgjast með framvindu innsláttar. Sérstaklega getum við búið til skýrslur um kóða með tvíræðni í gerðum, eins og til dæmis skýr notkun á tegund Any í athugasemdum sem ekki er hægt að staðfesta, eða með hlutum eins og að flytja inn þriðja aðila bókasöfn sem eru ekki með tegundaskýringum. Sem hluti af verkefni til að bæta nákvæmni tegundathugunar í Dropbox, lögðum við okkar af mörkum til að bæta tegundaskilgreiningar (svokallaðar stubbskrár) fyrir sum vinsæl opinn uppspretta bókasöfn í miðlægri Python geymslu. leturgerð.

Við innleiddum (og stöðluðum í síðari PEP) nýja eiginleika tegundakerfisins sem leyfa nákvæmari gerðir fyrir sum tiltekin Python mynstur. Áberandi dæmi um þetta er TypeDict, sem veitir tegundir fyrir JSON-líkar orðabækur sem hafa fast sett af strengjalyklum, hver með sínu eigin gildi. Við munum halda áfram að stækka tegundakerfið. Næsta skref okkar verður líklega að bæta stuðning við tölulega getu Python.

Leiðin til að slá inn 4 milljón línur af Python kóða. 3. hluti
Fjöldi lína af merktum kóða: þjónn

Leiðin til að slá inn 4 milljón línur af Python kóða. 3. hluti
Fjöldi lína af merktum kóða: viðskiptavinur

Leiðin til að slá inn 4 milljón línur af Python kóða. 3. hluti
Heildarfjöldi lína af merktum kóða

Hér er yfirlit yfir helstu eiginleika þess sem við gerðum til að auka magn merkta kóða í Dropbox:

Strangt í athugasemdum. Við bættum smám saman kröfurnar um nákvæmni við að skrifa nýjan kóða. Við byrjuðum með linter ábendingar sem stungið upp á að bæta athugasemdum við skrár sem þegar voru með nokkrar athugasemdir. Við krefjumst nú tegundaskýringa í nýjum Python skrám og í flestum núverandi skrám.

Vélritun skýrslna. Við sendum teymum vikulega skýrslur um hversu mikið er slegið inn kóðann og gefum ráð um hvað ætti að skrifa athugasemdir fyrst.

Vinsældir mypy. Við tölum um mypy á viðburðum og tölum við teymi til að hjálpa þeim að byrja með textaskýringar.

Kannanir. Við gerum reglulega notendakannanir til að greina helstu vandamál. Við erum tilbúin að ganga nokkuð langt í að leysa þessi vandamál (jafnvel að búa til nýtt tungumál til að flýta fyrir mypy!).

Frammistaða. Við höfum bætt afköst mypy til muna með því að nota púkann og mypyc. Þetta var gert til að jafna út þau óþægindi sem koma upp í athugasemdaferlinu og til að geta unnið með mikið magn af kóða.

Samþætting við ritstjóra. Við höfum smíðað verkfæri til að styðja við að keyra mypy í ritlum sem eru vinsælir á Dropbox. Þetta felur í sér PyCharm, Vim og VS kóða. Þetta einfaldaði til muna ferlið við að gera athugasemdir við kóðann og athuga virkni hans. Þessar gerðir aðgerða eru algengar þegar þú skrifar athugasemd við núverandi kóða.

Statísk greining. Við bjuggum til tól til að álykta aðgerðarundirskriftir með því að nota truflanir greiningartæki. Þetta tól getur aðeins virkað við tiltölulega einfaldar aðstæður, en það hjálpaði okkur að auka umfang kóðategunda okkar án mikillar fyrirhafnar.

Stuðningur við bókasöfn þriðja aðila. Mörg verkefna okkar nota SQLAlchemy verkfærakistuna. Það nýtir sér kraftmikla getu Python sem PEP 484 gerðir geta ekki mótað beint. Við, í samræmi við PEP 561, bjuggum til samsvarandi stubbskrá og skrifuðum viðbót fyrir mypy (opinn uppspretta), sem bætir SQLAlchemy stuðning.

Erfiðleikar sem við lentum í

Leiðin að 4 milljón línum af vélrituðum kóða hefur ekki alltaf verið auðveld fyrir okkur. Á þessari leið lentum við í mörgum holum og gerðum nokkur mistök. Þetta eru nokkur vandamál sem við höfum lent í. Við vonum að það að segja frá þeim hjálpi öðrum að forðast svipuð vandamál.

Skrár vantar. Við byrjuðum vinnuna með því að athuga aðeins lítið magn af skrám. Ekkert sem ekki var innifalið í þessum skrám var ekki athugað. Skrám var bætt við skannalistann þegar fyrstu athugasemdirnar birtust í þeim. Ef eitthvað var flutt inn úr einingu sem er utan gildissviðs sannprófunar, þá vorum við að tala um að vinna með gildi eins og Any, sem voru alls ekki prófuð. Þetta leiddi til verulegs taps á innsláttarnákvæmni, sérstaklega á fyrstu stigum fólksflutninga. Þessi nálgun hefur virkað furðu vel hingað til, þó dæmigert ástand sé að það að bæta skrám við umfang endurskoðunarinnar leiðir í ljós vandamál í öðrum hlutum kóðagrunnsins. Í versta falli, þegar tvö einangruð svæði af kóða voru sameinuð, þar sem, óháð hvort öðru, tegundir voru þegar athugaðar, kom í ljós að tegundir þessara svæða voru ósamrýmanlegar hver annarri. Þetta leiddi til þess að gera þurfti margar breytingar á skýringum. Þegar við lítum til baka núna gerum við okkur grein fyrir því að við hefðum átt að bæta kjarnasafnseiningum við tegundaskoðunarsvæði mypy fyrr. Þetta myndi gera starf okkar mun fyrirsjáanlegra.

Skýringar á gömlum kóða. Þegar við byrjuðum vorum við með um 4 milljónir línur af núverandi Python kóða. Það var ljóst að það var ekki auðvelt verk að gera athugasemdir við allan þennan kóða. Við höfum búið til tól sem heitir PyAnnotate sem getur safnað tegundarupplýsingum þegar prófanir keyra og getur bætt tegundaskýringum við kóðann þinn byggt á upplýsingum sem safnað er. Hins vegar höfum við ekki tekið eftir sérlega útbreiddri notkun þessa tóls. Söfnun tegundaupplýsinga gekk hægt og sjálfkrafa útbúnar athugasemdir þurftu oft margar handvirkar breytingar. Við hugsuðum um að keyra þetta tól sjálfkrafa í hvert sinn sem við skoðuðum kóðann, eða um að safna tegundaupplýsingum sem byggjast á greiningu á litlu magni raunverulegra netbeiðna, en ákváðum að gera það ekki vegna þess að hvor aðferðin var of áhættusöm.

Þar af leiðandi má benda á að megnið af kóðanum var skrifað handvirkt af eigendum hans. Til að leiðbeina þessu ferli í rétta átt, gerum við skýrslur um sérstaklega mikilvægar einingar og aðgerðir sem þarf að skrifa athugasemdir við. Til dæmis er mikilvægt að koma með tegundaskýringar fyrir bókasafnseiningu sem er notuð á hundruðum staða. En gömul þjónusta sem verið er að skipta út fyrir nýja er ekki lengur svo mikilvægt að gera athugasemdir við. Við erum líka að gera tilraunir með að nota kyrrstöðugreiningu til að búa til tegundaskýringar fyrir eldri kóða.

Sveiflukenndur innflutningur. Hér að ofan talaði ég um sveiflukenndan innflutning („ósjálfstæðisflækjurnar“), tilvist hans gerði það að verkum að erfitt var að flýta fyrir mypy. Við þurftum líka að leggja hart að okkur til að láta mypy styðja alls kyns orðatiltæki sem stafa af þessum hringlaga innflutningi. Nýlega kláruðum við stórt endurhönnunarverkefni sem lagaði flest vandamál mypy varðandi hringlaga innflutning. Þessi vandamál komu í raun frá fyrstu dögum verkefnisins, aftur frá Alore, fræðslutungumálinu sem mypy verkefnið var upphaflega einblínt á. Alore setningafræði gerir það auðvelt að leysa vandamál með hringlaga innflutningsskipunum. Nútíma mypy hefur erft nokkrar takmarkanir frá fyrri, einfaldri útfærslu sinni (sem hentaði Alore vel). Python gerir vinnu með hringlaga innflutning erfitt, aðallega vegna þess að tjáningar eru óljósar. Til dæmis getur úthlutunaraðgerð í raun skilgreint tegundarsamnefni. Mypy getur ekki alltaf greint hluti eins og þessa fyrr en búið er að vinna að mestu innflutningslykkjuna. Það voru engin slík tvískinnungur í Alore. Lélegar ákvarðanir sem teknar eru á fyrstu stigum kerfisþróunar geta komið forritaranum óþægilega á óvart mörgum árum síðar.

Niðurstöður: leiðin að 5 milljón línum af kóða og nýjum sjóndeildarhring

Mypy verkefnið hefur náð langt - frá fyrstu frumgerðum til kerfis sem stjórnar 4 milljón línum af gerðum framleiðslukóða. Þegar mypy þróaðist voru gerðarvísbendingar Python staðlaðar. Þessa dagana hefur öflugt vistkerfi þróast í kringum að slá inn Python kóða. Það hefur stað fyrir bókasafnsstuðning, það inniheldur aukaverkfæri fyrir IDE og ritstjóra, það hefur nokkur tegundastýringarkerfi, sem hvert um sig hefur sína kosti og galla.

Jafnvel þó að tegundaeftirlit sé nú þegar sjálfgefið hjá Dropbox, tel ég að við séum enn á fyrstu dögum að slá inn Python kóða. Ég held að tegundaskoðunartækni muni halda áfram að þróast og batna.

Ef þú hefur ekki þegar notað tegundaskoðun í stóra Python verkefninu þínu, þá veistu að nú er mjög góður tími til að byrja að fara yfir í kyrrstöðu vélritun. Ég hef rætt við þá sem hafa gert svipaða umskipti. Enginn þeirra sá eftir því. Tegundaskoðun gerir Python að tungumáli sem hentar miklu betur til að þróa stór verkefni en „venjulegur Python.

Kæru lesendur! Notar þú tegundaskoðun í Python verkefnum þínum?

Leiðin til að slá inn 4 milljón línur af Python kóða. 3. hluti
Leiðin til að slá inn 4 milljón línur af Python kóða. 3. hluti

Heimild: www.habr.com

Bæta við athugasemd