Artikli tĂ”lge on ette valmistatud OTUS kursuse ĂŒliĂ”pilaste jaoks. haridusprojektis OTUS.
Te peate valima monorepo, sest selle soodustatav kÀitumine teie meeskondades - see on lÀbipaistvus ja kollektiivne vastutus, eriti meeskondade kasvades. Igal juhul peate investeerima tööriistadesse, kuid alati on parem, kui vaikimisi kÀitumine on see, mida soovite oma meeskondades nÀha.
Miks me sellest rÀÀgime?
Matt Klein kirjutas artikli â (tĂ”lkija mĂ€rkus: tĂ”lge Habrist ). Mulle meeldib Matt, arvan, et ta on vĂ€ga tark, ja te peaksite lugema tema seisukohta. Alguses avaldas ta Twitteris kĂŒsitluse:
TÔlge:
Selles uusaasta pĂ€eval vaieldan, kui naeruvÀÀrsed monorepos on. 2019. aasta algas mĂ€rkamatult. Selle vaimus pakun teile kĂŒsitluse. Kes on suured fĂ€nnid? Pooldajad:
â Monorepo
â Rust
â Vale kĂŒsitlus / mĂ”lemad
Minu vastus oli: "Ma mĂ”tlen tĂ”eliselt nende kahe inimese peale." Enne kui rÀÀgime, kui suurepĂ€rane on Rust, uurime, miks ma arvan, et ta eksib monorepositooriumide osas. Pisut endast. Olen Chef Software'i tehniline direktor. Meil on umbes 100 inseneri, koodibaas, mis ulatub 11â12 aasta taha, ja 4 peamist toodet. Osa sellest koodist on poli-repositooriumis (minu algne seisukoht), osa monorepositooriumis (minu praegune seisukoht).
Enne alustamist: iga argument, mida ma siin olen vĂ€lja toonud, kehtib mĂ”lema tĂŒĂŒpi repositooriumide kohta. Minu arvates ei ole tehnilisi pĂ”hjuseid, miks peaksite valima ĂŒhe vĂ”i teise repositooriumi. Te saate tööle panna mĂ”lemat lĂ€henemist. Olen valmis sellest rÀÀkima, kuid tehislikud tehnilised pĂ”hjused, miks ĂŒhte peetakse teise ĂŒle, ei huvita mind.
Olen Matti vaate nurga esimeses osas nÔus:
Sest suurtes skaalades lahendab monorepo kĂ”ik samad probleemid, mis poli-repos, kuid see kutsub teid ĂŒles oma koodi tugevamalt siduma ja nĂ”uab teie versioonihaldussĂŒsteemi skaleeritavuse suurendamiseks tohutuid pingutusi.
Peate lahendama samu probleeme sĂ”ltumata sellest, kas valite monorepo vĂ”i poli-repo. Kuidas te vabastate? Milline on teie lĂ€henemine vĂ€rskendustele? TagasiĂŒhilduvus? Ăksteise projektide sĂ”ltuvused? Millised arhitektuurilised stiilid on vastuvĂ”etavad? Kuidas te haldate oma ehitamise ja testimise infrastruktuuri? Loend on lĂ”pmatu. Ja te lahendate need kĂ”ik kasvanud oluliselt. Tasuta juustu ei ole.
Minu arvates on Matti argument sarnane paljude inseneride (ja juhtide) vaadetele, keda ma austan. See on vaade insenerilt, kes töötab komponendi kallal, vÔi meeskonnalt, kes töötab komponendi kallal. Kuulete selliseid asju nagu:
- Koodibaas on kohmakas â mul ei ole vaja kogu seda jama.
- Seda on keerulisem testida, kuna pean kontrollima kogu seda prĂŒgi, mida mul ei ole vaja.
- VÀliste sÔltuvustega on keerulisem töötada.
- Mul on vaja oma versioonihaldussĂŒsteeme.
Muidugi, kĂ”ik need punktid on pĂ”hjendatud. See juhtub mĂ”lemal juhul â minu poli-reposiitoriumis on oma prĂŒgi, lisaks sellele, mis on vajalik koostamiseks⊠VĂ”ib-olla vajab mul ka muud prĂŒgi. Seega loon lihtsalt tööriistad, mis teevad projekti checkouti. VĂ”i loon vale monoreposti koos alammodulitega. Me vĂ”iksime sellest ringi kĂ€ia terve pĂ€eva. Kuid ma arvan, et Matti argument jĂ€tab mainimata peamise pĂ”hjuse, mille astusin ĂŒsna tugevalt monoreposti kasuks:
See stimuleerib suhtlemist ja nÀitab probleeme.
Kui me jagame repositooriaid, loobime de facto koordineerimise ja lĂ€bipaistvuse probleemi. See peegeldab seda, kuidas me mĂ”tleme meeskondadele (eriti sellele, kuidas neid mĂ”istavad ĂŒksikud liikmed): vastutame kindla komponendi eest. Töötame suhtelises isolatsioonis. Piirid fikseeritakse minu meeskonna ja töötatava komponendi (-de) ĂŒmber.
Arhitektuuri keerukuse suurenedes ei suuda ĂŒkski meeskond enam ĂŒksi sĂŒsteemi hallata. VĂ€ga vĂ€hesed insenerid suudavad kogu sĂŒsteemi peas hoida. Oletame, et haldate ĂŒhist komponenti A, mida kasutavad meeskonnad B, C ja D. Meeskond A viib lĂ€bi refaktoreerimise, tĂ€iustab API-d ja muudab sisemist teostust. SeetĂ”ttu on muudatused tagasipöördumatud. Millist nĂ”u annate?
- Leidke kÔik kohad, kus kasutatakse vana API-d.
- Kas on kohti, kus uut API-d ei saa kasutada?
- Kas suudate parandada ja testida teisi komponente, et veenduda, et need ei riku midagi?
- Kas need meeskonnad saavad teie muudatusi kohe kontrollida?
Pange tĂ€hele, et need kĂŒsimused ei sĂ”ltu repositoriumi tĂŒĂŒbist. Peate leidma meeskonnad B, C ja D. Peate nendega rÀÀkima, selgitama vĂ€lja aja, mĂ”istma nende prioriteete. Loodame, et teete seda.
Tegelikkuses ei taha keegi sellega tegeleda. See on palju vĂ€hem pĂ”nev kui lihtsalt kuradi API parandamine. See on kĂ”ik inimlik ja keeruline. Ăhes ĂŒhises repodis saate lihtsalt muudatusi teha, anda ĂŒlevaatamiseks neile, kes selle komponendiga töötavad (tĂ”enĂ€oliselt mitte B, C vĂ”i D) ja edasi liikuda. Meeskonnad B, C ja D vĂ”ivad praegu lihtsalt oma praeguses versioonis pĂŒsida. Nad uuendavad end, kui nad teid Ă€ra tunnevad!
Monorepositsioonis on vastutus vaikimisi edastatud. Meeskond A muudab oma komponenti ja kui nad ettevaatlikud ei ole, rikuvad nad kohe B, C ja D. See toob kaasa olukorra, kus B, C ja D seisavad A ukse taga, imestades, miks meeskond A koostööd katki tegi. See Ôpetab A-d, et nad ei saa minu eespool olevat nimekirja vahele jÀtta. Nad peavad rÀÀkima sellest, mida nad kavatsevad teha. Kas B, C ja D saavad edasi liikuda? Mis siis, kui B ja C saavad, aga D on tihedalt seotud vanema algoritmi kÔrvalmÔjuga?
SeejÀrel peame rÀÀkima, kuidas me sellest olukorrast vÀlja saame:
- Toetada mitut sise-API-d, kusjuures vanem algoritm tÀhistatakse vananenuks, kuni D suudab selle kasutamise lÔpetada.
- Toetada mitut versioonide vĂ€ljalaset, ĂŒks vana liidese, ĂŒks uus.
- Muudatuse A vĂ€ljalaskmise edasilĂŒkkamine kuni B, C ja D suudavad seda ĂŒheaegselt aktsepteerida.
Oletame, et valisime 1 vĂ”i mitu API-d. Sellisel juhul on meil kaks koodilĂ”iku. Vana ja uus. Teatud olukordades on see ĂŒsna mugav. Me tagastame vana koodi tagasi, mĂ€rgime selle aegunuks (deprecated) ja kooskĂ”lastame selle eemaldamise ajakava meeskonnaga D. PĂ”himĂ”tteliselt on see identne nii poli- kui monorepositooriumiga.
Mitmekordse versiooni viimistlemiseks vajame haru. Praegu on meil kaks komponenti â A1 ja A2. Meeskonnad B ja C kasutavad A2, samas kui D kasutab A1. Me peame tagama, et iga komponent oleks vĂ€ljaandmiseks valmis, sest enne kui D saab edasi liikuda, vĂ”ivad vajada turvaparandusi ja muid tĂ”rgete parandusi. Polireposiitriumis saame seda varjata pika elueaga harus, mis tundub hea. Monoreposiitriumis sunnime uut moodulit looma. Meeskond D peab ikkagi tegema muudatusi 'vana' komponendi osas. IgaĂŒks vĂ”ib nĂ€ha, milline on siin tasu â meil on nĂŒĂŒd topelt kood ja kĂ”ik A1 ja A2-l kehtivad vigade parandused peavad kehtima mĂ”lema puhul. Harude kasutamise lĂ€henemisega polireposiitriumis on see peidetud cherry-pick'i taha. Peame tasu madalamaks, kuna seal pole dubleerimist. Praktikas on tasu sama: peate looma, vĂ€ljastama ja toetama kahte, peaaegu identset koodibaasi, kuni saate ĂŒhe neist eemaldada. Erinevus on see, et monoreposiitriumis on see valu otse ja silme ees. See on veel hullem, ja see on hea.
LĂ”puks jĂ”udsime kolmanda punkti juurde. VĂ€ljalaskmise viivitus. On vĂ”imalik, et A poolt tehtud muudatused parandavad A meeskonna elu. Oluline, kuid mitte kiire. Kas saame lihtsalt viivitada? Polireposiis teeme selle artefakti lĂ”plikuks. Muidugi rÀÀgime sellest D meeskonnale. Lihtsalt jÀÀge vana versiooni juurde, kuni jĂ”uate jĂ€rele! See seab mĂ€ngu hirmu. A meeskond jĂ€tkab oma komponendi kallal töötamist, ignoreerides, et D meeskond kasutab aina vanemat versiooni (see on D meeskonna probleem, nad on lollid). Samal ajal rÀÀgib D meeskond halvasti A meeskonna tĂ€helepanematust koodistabiilsuse osas, kui nad sellest ĂŒldse rÀÀgivad. Kuud lĂ€hevad mööda. LĂ”puks otsustab D meeskond kaaluda uuendust, kuid A-s on muutunud ainult rohkem. A meeskond vaevu mĂ€letab, millal ja kuidas nad D-d lĂ”hkusid. Uuendamine on valusam ja vĂ”tab rohkem aega. Mis viib selle prioriteetide jĂ€rjekorras madalamale. Kuni pĂ€evani, mil meil ei teki A-s turvaprobleem, mis sunnib meid haru looma. A meeskond peab tagasi minema aega, leidma hetke, mil D oli stabiilne, parandama seal probleemi ja tegema selle vĂ€ljalaskmiseks valmis. See on de facto valik, mida inimesed teevad, ja kindlasti on see halvim. Tundub, et see sobib nii meeskonnale A kui ka D-le, seni kuni me saame teineteist ignorida.
Monorepositsioonis on kolmas tĂ”eliselt mittevariant. Sa pead olukorraga toime tulema kahel viisil. Sa pead nĂ€gema kahe vĂ€ljaandmisharu hoidmise kulusid. Kuidas end kaitsta tagurpidi ĂŒhilduvuse katkemise vĂ€rskenduste eest. Kuid peamine: sind ei pÀÀsta keerulistest vestlustest.
Minu kogemuse pĂ”hjal, kui meeskonnad kasvavad, ei ole enam vĂ”imalik kogu sĂŒsteemi peas hoida, ja see on kĂ”ige olulisem. Sa pead parandama sĂŒsteemis erinevuste nĂ€htavust. Sa pead aktiivselt töötama selle nimel, et panna meeskonnad oma komponentidest eemale vaatama ning nĂ€gema teiste meeskondade ja tarbijate tööd.
Jah, te saate luua tööriistu, mis pĂŒĂŒavad lahendada polirepositooriumide probleemi. Kuid minu kogemus pideva kohaletoimetamise (continuous delivery) ja automatiseerimise valdkonnas suurtes ettevĂ”tetes ĂŒtleb mulle jĂ€rgmist: vaikimisi kĂ€itumine ilma lisatööriistade kasutamiseta on see, mida te ootate nĂ€ha. Polirepositooriumi vaikimisi kĂ€itumine on isoleeritus, see on kogu mĂ”te. Monorepositooriumi vaikimisi kĂ€itumine on ĂŒhine vastutus ja lĂ€bipaistvus, see on kogu mĂ”te. MĂ”lemas olukorras kavatsen luua tööriista, mis aitab teravaid nurki tasandada. Juhi seisukohalt valin ma igal korral monorepositooriumi, sest tööriistad peaksid tugevdama kultuuri, mida ma soovin, ja kultuur tuleneb pisikestest otsustest ja igapĂ€evasest meeskonnatööst.
Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. , palun.
Kes on suuremad fanatiivideks? Pooldajad:
Monorepo
Rust
Vale kĂŒsitlus / mĂ”lemad
HÀÀletas 33 kasutajat. Erakutas 13 kasutajat.
Allikas: habr.com
