Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

RÀÀgime, miks CI-tööriistad ja CI on tÀiesti erinevad asjad.

Millist valu CI peaks lahendama, kust idee alguse sai, millised on viimased tÔendid, et see toimib, ja kuidas mÔista, et teil on olemas praktika, mitte lihtsalt paigaldatud Jenkins.

MĂ”te pidada ettekannet Continuous Integrationist tekkis juba aastat tagasi, kui kĂ€isin tööintervjuudel. Suhtlesin 10-15 ettevĂ”ttega, neist vaid ĂŒks suutis arusaadavalt vastata, mis on CI ja kuidas nad mĂ”istsid, et neil seda ei ole. ÜlejÀÀnud rÀÀkisid arusaamatut juttu Jenkinsist 🙂. Noh, meil on Jenkins, see teeb kogumisi, CI! Ettekanne pĂŒĂŒab selgitada, mis on tegelikult Continuous Integration ja miks Jenkins ja sarnased tööriistad on selle suhtes vĂ€ga nĂ”rgalt seotud.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Nii et, mis tavaliselt tuleb meelde sÔna CI kuuldes? Enamiku inimeste jaoks tulevad pÀhe Jenkins, Gitlab CI, Travis jne.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Isegi kui me otsime seda internetist, siis pakub see meile neid tööriistu.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Kui kĂŒsida tuttavatelt, siis kohe pĂ€rast tööriistade loetlemist rÀÀgitakse, et CI on siis, kui teie Pull Request'is toimub kogumine ja testide lĂ€biviimine.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Continuous Integration ei ole seotud tööriistadega, ei ole seotud kogumiste ja testide tegemisega haru sees! Continuous Integration on praktika, mis hÔlmab uue koodi vÀga sagedast integreerimist, ning selle rakendamiseks ei ole sugugi vajalik Jenkinsite, GitLabi jms ehitamine.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Enne kui vaatame, milline nĂ€eb vĂ€lja tĂ€iemahuline CI, sĂŒveneme kĂ”igepealt inimestesse, kes selle vĂ€lja mĂ”tlesid, ja tunnetame seda valu, millega nad pĂŒĂŒdsid toime tulla.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Nad lahendasid meeskonnatöö valu!

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Vaadakem nÀiteid, milliste raskustega arendajad meeskonnatöös silmitsi seisavad. Oletame, et meil on projekt, git'te master-haru ja kaks arendajat.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Ja nad lĂ€ksid tööle, nagu on kaua harjutud. VĂ”tsid ĂŒlesande JIRA's, lĂ”id feature haru, kirjutavad koodi.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Üks lĂ”petas funktsiooni kiiremini ja liitis selle masterisse.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Teisel kulus rohkem aega, ta liitus hiljem ja sai konflikti. NĂŒĂŒd, selle asemel, et kirjutada vajalikke Ă€rifunktsioone, kulutab arendaja oma aega ja energiat konfliktide lahendamisele.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Mida keerulisem on oma funktsiooni ĂŒhendada ĂŒldise pĂ”higa, seda rohkem aega me selleks kulutame. Ja see on veel piisavalt lihtne nĂ€ide, mida ma nĂ€itasin. See on nĂ€ide, kus arendajaid on vaid 2. Kujutage ette, kui 10 vĂ”i 15 vĂ”i 100 inimest ettevĂ”ttes kirjutavad ĂŒhte hoidlat. Te hakkate Ă€ra pöörama, kui kĂ”iki neid konflikte lahendada.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

On veidi teine olukord. Meil on master ja mitu arendajat, kes teevad midagi.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Nad on loonud igaĂŒhele oma haru.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Üks ĂŒhendas, kĂ”ik on hĂ€sti, ĂŒlesanne on valmis.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Teine arendaja samal ajal andis oma ĂŒlesande valmis. Oletame, et ta esitas selle ĂŒlevaatamiseks. Paljudes ettevĂ”tetes on praktika – ĂŒlevaatus. Ühest kĂŒljest on see praktika – hea ja kasulik, teisest kĂŒljest tĂ”kestab see meid tihti. Ärgem laskugem sellesse sĂŒgavale, aga siin on suurepĂ€rane nĂ€ide, kuidas vale ĂŒlevaatuse praktika vĂ”ib pĂ”hjustada probleeme. Te esitasite pull request'i ĂŒlevaatamiseks. Arendajal pole enam midagi teha. Mida ta hakkab tegema? Ta hakkab vĂ”tma teisi ĂŒlesandeid.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Selle aja jooksul tegi teine arendaja veel midagi.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Esimene tĂ€itis kolmanda ĂŒlesande.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Ja pĂ€rast mĂ”nda aega, kui tema ĂŒlevaatus on lĂ€bi viidud, ĂŒritab ta uuesti liituda. Ja mis juhtub? Ta satub tohututesse konfliktidesse. Miks? Sest seni, kuni tema pull request oli ĂŒlevaatamiseks, muutus koodis palju.

Peale konfliktide on veel teema suhtluses. Seni, kuni teie haru on ĂŒlevaatamiseks, seni, kuni see ootab, ja seni, kuni te viibite funktsiooni arendamisega, lĂ”petate te jĂ€lgimise, mis veel teie teenuse koodibaasis muutub. VĂ”ib-olla on see, mida te praegu ĂŒritate lahendada, juba eile lahendatud ja mingit meetodit saab taaskasutada. Aga te ei nĂ€e seda, sest töötate alati vananenud haruga. Ja see vananenud haru toob alati kaasa selle, et peate lahendama ĂŒhildamisprobleemi.

Kuna me töötame meeskonnana, st mitte ĂŒks inimene ei toimi hoidlas, vaid inimesi on 5-10, siis mida kauem me oma koodi masterisse ei lisa, seda rohkem me kannatame selle tĂ”ttu, et lĂ”puks on vaja midagi ĂŒhendama hakata. Ja mida rohkem meil on konflikte ja mida vanema versiooniga me töötame, seda rohkem on meil probleeme.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Koos midagi teha – see on valus! Me segame alati ĂŒksteist.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Selle probleemile pöörati tĂ€helepanu ĂŒle 20 aasta tagasi. Esimese mainimise praktika Continuous Integration kohta leidsin ÀÀrmuslikust programmeerimisest.

ÄÀrmuslik programmeerimine on esimene agile raamistiku element. LehekĂŒlg ilmus 1996. aastal. Idee oli kasutada teatud programmeerimis- ja planeerimistavasid ning muid aspekte, et arendus oleks vĂ”imalikult paindlik, et saaksime kiiremini reageerida muutustele ja klientide nĂ”udmistele. 24 aastat tagasi alustasid nad sellega, et kui sa teed midagi vĂ€ga kaua ja eraldi, kulutad selle asemel rohkem aega, sest tekivad konfliktid.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

NĂŒĂŒd uurime fraasi „Continuous Integration” eraldi sĂ”nadena. Kui tĂ”lkida otse, saame pidev integreerimine. Kuid kui pidev see tegelikult on, ei ole vĂ€ga selge; see on ĂŒsna katkestatud. Samuti ei ole selge, kui palju see on integreerimine.

Ja seetĂ”ttu toongi teieni nĂŒĂŒd tsitaate ÀÀrmuslikust programmeerimisest. Kaks sĂ”na analĂŒĂŒsime eraldi.

Integreerimine — Nagu juba mainisin, pĂŒĂŒame, et iga insener töötaks kĂ”ige jĂ”udsamate koodiversioonidega, et ta pĂŒĂŒaks oma koodi sageli lisada peavoolu, et need oleksid vĂ€iksed harud. Sest kui need on suured, vĂ”ime lihtsalt nĂ€dalaks merge-konfliktidega kinni jÀÀda. Eriti kui meil on pikk arendustsĂŒkkel, nagu waterfall, kus arendaja lĂ€heb kuuks ajaks tegema mĂ”nda suurt omadust. Ja integreerimise etapis jÀÀb ta tĂ”eliselt pikaks ajaks kinni.

Integreerimine tĂ€hendab, et vĂ”tame oma haru ja integreerime selle peavooluga, me teeme selle merge. On ka ÀÀrmuslik variant, kus me transbase developer, kus me pĂŒĂŒame kirjutada otse peavoolu, ilma igasuguste lisaharudeta.

Üldiselt on integreerimine vĂ”tta oma kood ja tuua see peavoolu.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Mida mĂ”istetakse sĂ”na „continuous” all, mis on pidevuse mĂ”iste? Praktika tĂ€hendab, et arendaja pĂŒĂŒab oma koodi integreerida vĂ”imalikult kiiresti. See on tema eesmĂ€rk igas ĂŒlesandes – muuta nii, et tema kood ilmuks masterisse vĂ”imalikult kiiresti. Ideaalne maailm oleks see, kus arendajad teevad seda iga paari tunni tagant. T. e. vĂ”tad vĂ€ikese ĂŒlesande, mergid selle masterisse. KĂ”ik on suurepĂ€rane. Sa pĂŒĂŒad seda saavutada. Ja seda tuleb teha pidevalt. Niipea kui oled midagi teinud, surud kohe selle masterisse.

Ja arendaja, kes midagi teeb, on vastutav selle eest, et see toimiks ja midagi ei katki lĂ€heks. Siin ilmub tavaliselt vĂ€lja lugu katsetest. Me tahame kĂ€ivitada mĂ”ningaid teste meie commit’i, meie merge’i kohta, et veenduda, et see töötab. Siin vĂ”ivad aidata teid Jenkins.

Aga lugudega: las muudatused on vĂ€ikesed, las ĂŒlesanded on vĂ€ikesed, las teeme ĂŒlesande ja proovime kohe selle masterisse mergida – siin ei aita teid Jenkins. Sest Jenkins aitab teid ainult testide kĂ€ivitamisel.

Sa saad hakkama ka ilma nendeta. See ei sega sind absoluutselt. Sest praktika eesmÀrk on mergeerida vÔimalikult tihti, et tulevikus ei peaks kulutama tohutult aega konfliktide lahendamisele.

Kujutage ette, et meil on 2020. aasta ja mingil pĂ”hjusel pole internetti. Me töötame kohapeal. Meil ei ole Jenkinsit. See on normaalne. Sa saad ikka vĂ”tta ja luua kohalik haru. Sa oled sinna kirjutanud mingi koodi. Tegid ĂŒlesande 3-4 tunni jooksul. LĂŒlitusid masterisse, tegid git pulli, mergisid oma haru sinna. Valmis. Kui teed seda sageli – Ă”nnitleme, sul on Continuous Integration!

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Millised on tĂ€napĂ€eval tĂ”endid selle kohta, et sellele tasub jĂ”udu rakendada? Sest ĂŒldiselt on see keeruline. Kui sa proovid nii töötada, mĂ”istad, et sul on nĂŒĂŒd vaja mingit planeerimist, pead rohkem aega kulutama ĂŒlesannete dekompositsioonile. Sest kui sa teed man
, ei saa sa kiiresti mergeerida ja seetĂ”ttu satud raskusesse. Praktikat sul enam pole.

Ja see tuleb kallis. Töö Continuous Integration'iga alates jĂ€rgmise pĂ€evast ei Ă”nnestu. Te peate kĂ”ik vĂ€ga kaua harjuma, te harjute vĂ€ga kaua ĂŒlesandeid dekomponeerima, harjute vĂ€ga kaua oma ĂŒlevaatamise praktikat, kui see teil on, muutma. Sest meie eesmĂ€rk on, et see sulanduks tĂ€na. Ja kui te teete ĂŒlevaadet kolme pĂ€eva jooksul, siis on teil probleem ja Continuous Integration ei Ă”nnestu teil.

Aga kas meil on mĂ”ni praegu oled tĂ”end, mis ĂŒtleb meile, et sellesse praktikas investeerimine on mĂ”ttekas?

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Esimene asi, mis mulle pĂ€he tuli – on State of DevOps. See on uuring, mida poisid teevad juba 7 aastat. NĂŒĂŒd nad teevad seda sĂ”ltumatuna organisatsioonina, aga Google'i all.

Ja nende uuring 2018. aastal nĂ€itas seost ettevĂ”tete vahel, kes ĂŒritavad kasutada lĂŒhiajalisi haru, mis integreeruvad kiiresti ja tihti, nende IT jĂ”udlusnĂ€itajad on oluliselt paremad.

Mis need nĂ€itajad on? Need on 4 mÔÔdikut, mida nad saavad kĂ”ikidelt ettevĂ”tetelt oma kĂŒsitluste kaudu: deployment frequency, lead time for changes, time to restore service, change failure rate.

Esiteks, on see seos olemas, me teame, et ettevÔtetel, kes sulanduvad tihti, on need mÔÔdikud palju paremad. Ja neil on ettevÔtete jagamine mitmesse kategooriasse: aeglased ettevÔtted, kes toodavad midagi aeglaselt, keskmine tegija, hea tegija ja eliit. Eliit on Netflix, Amazon, kes on uskumatult kiire, teevad kÔik kiiresti, kenasti ja kvaliteetselt.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Teine lugu, mis juhtus kuu aega tagasi. Technology Radar'is ilmus suurepÀrane mÀrkus Gitflow'ist. Gitflow erineb kÔikidest teistest seetÔttu, et selle harud elavad kaua. On avaldamis harud, mis elavad kaua, ja funktsiooniharu, mis ka elavad kaua. See praktika on Technology Radar'is liikunud HOLD-i. Miks? Sest inimesed puutuvad kokku integratsioonivaluga.

Kui sul haru elab vÀga kaua, siis see hÀilib, lÀheb vanaks ja me hakkame kulutama rohkem aega, et sellesse mingit muudatust teha.

Ja hiljuti ĂŒtles Gitflow autor, et kui pĂŒĂŒdlete pideva integreerimise poole ja soovite vĂ”imalikult sageli edasi liikuda, on Gitflow halb mĂ”te. Ta tĂ€iendavalt mĂ€rkis artiklis, et kui teil on tagaplaan, kus saate sellele suunata, siis on Gitflow teile liialt koormav, kuna see aeglustab teid ja tekitab integreerimise probleeme.

See ei tÀhenda, et Gitflow oleks halb ega sobiks kasutamiseks. See on mÔeldud teiste olukordade jaoks. NÀiteks siis, kui peate toetama mitmeid teenuse vÔi rakenduse versioone, st olukordades, kus peate seda pikema aja jooksul toetama.

Kuid kui suhtlete inimestega, kes selliseid teenuseid toetavad, kuulete palju kaebusi selle kohta, et versioon 3.2 oli neli kuud tagasi ja seal ei olnud selle parandust, ja nĂŒĂŒd, et see parandada, on vajalik teha hulk muudatusi. Ja nad on taas ummikus, veetes nĂ€dala selle kallal, et vĂ”tta ja liita mingi uus funktsioon.

Kuidas mĂ€rkis Alexander Kovalev Ă”igesti vestluses, ei tĂ€henda korrelatsioon pĂ”hjust ja tagajĂ€rge. See on tĂ”si. Siis ei ole mingit otsest seost, et kui teil on pidev integreerimine, siis on kĂ”ik mÔÔdikud suurepĂ€rased. Kuid on positiivne korrelatsioon, et kui ĂŒks, siis on tĂ”enĂ€oliselt ka teine. See ei ole fakt, aga tĂ”enĂ€oliselt. See on lihtsalt korrelatsioon.

Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov

Tundub, et me juba teeme midagi, nÀiliselt liitume, kuid kuidas mÔista, et meil on ikkagi pidev integreerimine, et me liitume piisavalt sageli?

Jez Humble on raamatu 'Accelerate', Continuous Delivery veebisaidi ja raamatu 'Pidev tarnimine' autor. Ta pakub sellist testi:

  • Inseneri kood jĂ”uab meistrisse igapĂ€evaselt.
  • Iga commit'i korral kĂ€ivitate unit-testid.
  • Meistri ehitus purunes, see parandati umbes 10 minuti jooksul.

Ta soovitab kasutada sellist testi, et veenduda, et praktika on teil tÔeliselt olemas.

Viimase punkti osas olen ma veidi kahtlev. Ehk kui teil Ônnestub probleem 10 minuti jooksul lahendada, siis tÀhendab see, et teil on pidev integratsioon, see kÔlab minu arust veidi kahtlaselt, kuid sellel on oma mÔte. Miks? Sest kui te teete tihti liitumisi, siis tÀhendab see, et teie muudatused on vÀikesed. Kui teie vÀike muudatus pÔhjustas pÔhiharu purunemise, saate kiiresti probleemi tuvastada, sest muudatus on tilluke. Teil oli vÀike liitumine, mis muutis 20-30 rida. Seega saate kiiresti aru, mis oli pÔhjuseks, sest muudatused on pisikesed ja teil on probleemide otsimiseks vÀga vÀike valdkond.

Ja isegi kui meil pĂ€rast vĂ€ljalaskmist tootmine kokku kukub, teeb pideva integreerimise praktika meie töö palju lihtsamaks, sest muudatused on vĂ€ikesed. Jah, see mĂ”jutab planeerimist. See on valus. Ja ilmselt on selle praktika kĂ”ige raskem osa harjuda ĂŒlesandeid jagama, s.t. kuidas vĂ”tta midagi ja teha see mĂ”ne tunni jooksul, samal ajal kui lĂ€bite ĂŒlevaatuse, kui see teil on. Ülevaatus on eraldi valu.

Üksuse testid on lihtsalt abivahend, mis aitab teil mĂ”ista, kas teie integreerimine Ă”nnestus ja kas midagi lĂ€ks katki. Minu arvates ei ole see ka kokkuvĂ”ttes kohustuslik punkt, sest praktika sisu ei seisne selles.

See on lĂŒhidalt pidevast integreerimisest. See on kĂ”ik, mis selle praktika kohta on. Olen valmis kĂŒsimustele vastama.

KokkuvĂ”tteks veel kord ĂŒtlen:

  • Pidev integreerimine ei ole Jenkins, see ei ole Gitlab.
  • See ei ole tööriist, see on praktika, mille kohaselt me liidame oma koodi peaharusse vĂ”imalikult tihti.
  • Teeme seda selleks, et vĂ€ltida tohutut valu, mis tekib tulevaste liitumistega, s.t. tunneme nĂŒĂŒd vĂ€ikest valu, et mitte tunda suurt valu tulevikus. See on kogu mĂ”te.
  • Koodi kaudu kulgeb suhtlus, kuid ma nĂ€en seda vĂ€ga harva, kuigi selleks see ka mĂ”eldud on.

KĂŒsimused

Mida teha lahti dekompositsiooniga ĂŒlesannetega?

Dekomposeerida. Mis probleem? Kas saate tuua nĂ€ite, et on ĂŒlesanne, mida ei saa dekomponeerida?

On olemas ĂŒlesandeid, mida ei saa ĂŒldse dekomponeerida, nĂ€iteks need, mis nĂ”uavad vĂ€ga sĂŒgavat ekspertiisi ja mis vĂ”ivad tegelikult kesta kuu aega, enne kui mingit arvestatavat tulemust saavutatakse.

Kui ma sind Ă”igesti mĂ”istan, siis on olemas mingi suur ja keeruline ĂŒlesanne, mille tulemust on vĂ”imalik nĂ€ha alles kuu pĂ€rast?

Jah, kÔik on Ôige. Jah, tulemust saab hinnata mitte varem kui kuu pÀrast.

Hea. Üldiselt pole see probleem. Miks? Sest antud juhul, kui me rÀÀgime harudest, siis me ei rÀÀgi harust, millel on funktsioon. Funktsioonid vĂ”ivad olla suured ja keerulised. Need vĂ”ivad mĂ”jutada suurt hulka komponente. Ja vĂ”ib-olla ei suuda me neid tĂ€ielikult ĂŒhte haru panna. See on normaalne. Me peame lihtsalt seda lugu jagama. Kui funktsioon ei ole lĂ”puni valmis, siis see ei tĂ€henda, et mĂ”ned selle koodi tĂŒkid ei saa ĂŒhineda. Sa lisasid, ĂŒtleme, migratsiooni ja funktsiooni sees on mĂ”ned etapid. Sul on, ĂŒtleme, etapp – teha migratsioon, lisada uus meetod. Ja neid asju saad juba igapĂ€evaselt ĂŒhendada.

Hea. Mis siis on selle mÔte?

Mis mĂ”te on igapĂ€evaselt vĂ€ikeste asjade ĂŒhinemises?

Jah.

Kui need on sulle midagi katki teinud, nĂ€ed sa seda kohe. Sul on vĂ€ike tĂŒkk, mis midagi katki tegi, ja sul on lihtsam see parandada. MĂ”te on see, et praegu on vĂ€ikese tĂŒki ĂŒhendamine palju lihtsam kui midagi suurt ĂŒhendamine paar nĂ€dalat hiljem. Ja kolmas mĂ”te on see, et teised insenerid töötavad juba aktuaalse koodiversiooniga. Nad nĂ€evad, et siin on mĂ”ned migratsioonid lisandunud, ja siin on ilmunud mĂ”ni meetod, mida nad vĂ”ib-olla ka soovivad kasutada. KĂ”ik nĂ€evad, mis sinu koodis toimub. Just nende kolme asja nimel praktika toimumiski.

AitĂ€h, kĂŒsimus on selge!

(Oleg Soroka) Kas ma vĂ”in lisada? Sa ĂŒtlesid kĂ”ik Ă”igesti, tahan ainult ĂŒhte lauset lisada.

Nii.

Continuous Integration'i puhul liidetakse kood ĂŒhisesse harusse mitte siis, kui funktsioon on tĂ€ielikult valmis, vaid siis, kui ehitus on katkenud. Ja vĂ”ite julgelt pĂŒhenduda masterisse nii palju kordi kui soovite pĂ€evas. Teine aspekt – kui te ei saa mingil pĂ”hjusel kuupikkust ĂŒlesannet jagada vĂ€hemalt kolmeks pĂ€evaks, ma rÀÀgin kolmest tunnist, siis on teil suur probleem. Ja see, et teil pole Continuous Integrationi – on selle probleemide seas vĂ€ikseim. See tĂ€hendab, et teil on probleemid arhitektuuriga ja inseneripraktika on null. Sest isegi kui tegemist on uurimistööga, tuleb see igal juhul vormistada hĂŒpoteeside vĂ”i tsĂŒklina.

Me rÀÀkisime neljast mÔÔtmetest, mis eristavad edukaid ettevĂ”tteid tagapoolsetest. Enne nende nelja mÔÔtme saavutamist tuleb veel kĂ”vasti vaeva nĂ€ha. Kui keskmise ĂŒlesande tĂ€itmine vĂ”tab aega kuu, siis soovitaksin kĂ”igepealt sellele mÔÔtmele keskenduda. Asetaksin selle esimese kolme pĂ€eva piiridesse. Ja alles seejĂ€rel alustada pideva arendamise mĂ”tetega.

Kas ma sain Ă”igesti aru, et arvad, et investeerida inseneripraktikatesse pole mĂ”tet, kui sul iga ĂŒlesanne vĂ”tab kuu aega?

Sul on pidev integreerimine. Seal on selline asi, et sa kas parandad vea 10 minutiga vĂ”i rullid tagasi. Kujutle, et sa oled selle vĂ€lja lasknud. Samuti on sul isegi pidev juurutamine, sa oled selle tootmisse saatnud ja alles siis mĂ€rkad, et midagi lĂ€ks valesti. Ja nĂŒĂŒd pead selle tagasi rullima, kuid sul on juba toimunud andmebaasi migratsioon. Sinu andmebaasi skeem on juba jĂ€rgmise versiooni peal, lisaks on toimunud ka mingi varundamine ning sinna on juba andmeid salvestatud.

Mis alternatiiv sul on? Kui sul on kood tagasi rullitud, siis see ei saa enam uuendatud andmebaasiga töötada.

Andmebaas liigub ainult edasi, jah.

Inimestel, kellel on halvad inseneripraktikad, on tĂ”enĂ€oliselt ka paks raamat selle kohta 
 pole lugenud. Mida teha varundusega? Kui sa taastud varundusest, siis kaotad andmed, mis selle aja jooksul on kogunenud. NĂ€iteks töötasid kolme tunni jooksul uue andmebaasi versiooniga, kus kasutajad registreerusid. Sa taastad vana varunduse, sest uue versiooniga skeem ei tööta, seega need kasutajad, kelle sa kaotasid, on rahulolematud ja kurdavad.

Kogu selle praktikate spektri omandamiseks, mis toetavad Continuous Integration'i ja Continuous Delivery't, ei piisa vaid programmist kirjutamisest ... Esiteks, neid vĂ”ib olla vĂ€ga palju, mis muutub ebapraktiiseks. Lisaks on seal palju teisi praktikaid, nagu Scientific. On selline praktika, mida GitHub kunagi populariseeris. See on siis, kui sinu vana kood ja uus kood töötavad samaaegselt. See on siis, kui sa teed puuduolevat funktsiooni, mis vĂ”ib tagastada mingisuguse vÀÀrtuse: kas funktsioonina vĂ”i Rest API'na. Sa tĂ€idad nii uut kui ka vana koodi ja vĂ”rdled nende vahelisi erinevusi. Ja kui erinevus on olemas, siis sa logid selle sĂŒndmuse. Nii tead, et sinu uus funktsioon on valmis vanale ĂŒlesse ehitamiseks, kui sul ei ole teatud aja jooksul nende kahe vahel erinevusi.

Selliseid praktikaid on sadu. Ma soovitaksin alustada transbase arendusega. See ei ole 100 % Continuous Integrationil, kuid praktikad on samad, ĂŒks ilma teiselt elab halvasti.

Kas sa tÔid transbase arenduse nÀitena, kust saab praktikaid vaadata, vÔi soovitad sa inimestel hakata kasutama transbase arendust?

Vaadata, kuna nad ei saa seda kasutada. Selleks, et neid kasutada, tuleb palju teavet lugeda. Kui inimesel on kĂŒsimus: "Mida teha funktsiooniga, mis vĂ”tab kuu aega?", siis see tĂ€hendab, et ta ei ole transbase arenduse kohta lugenud. Ja ma ei soovitaks veel kasutada. Ma soovitaksin keskenduda ainult sellele, kuidas Ă”igesti arhitektuurselt suured ĂŒlesanded vĂ€iksemateks murda. Selles seisnebki dekonstruktsioon.

Dekonstruktsioon on ĂŒks arhitekti tööriistadest. Esiteks teeme analĂŒĂŒsi, siis dekonstruktsiooni, seejĂ€rel sĂŒnteesi ja lĂ”puks integratsiooni. Nii koondame kĂ”ik kokku. Ja arendusele tuleb enne jĂ”uda lĂ€bi dekonstruktsiooni. Esimese etapi jooksul tekivad kĂŒsimused, aga me rÀÀgime juba neljandast etapist, st mida sagedamini integreerida, seda parem. Veel on liiga vara integreerida, vĂ”iks esmalt oma monoliti pisut lĂ”hustada.

On some diagram, you need to draw a number of arrows and squares. You can't just say, 'Now I'll show the architectural diagram of the new application and show one square with a green button for the application.' In any case, there will be more squares and arrows. On any diagram I've seen, there were more than one. And decomposition is already done at the level of graphical representation. Therefore, the squares can be independent. If not, then I have big questions for the architect.

There is a question from the chat: 'If the review is mandatory and takes a long time, over a day?'

You have issues with practice. The review shouldn't take more than a day. This is the same story as the previous question, just a bit softer. If the review takes a day, it probably concerns some very large change. It needs to be smaller. In the transbase development that Oleg recommended, there's a concept called continuous review. The idea is that we make pull requests intentionally small because we aim to merge continuously and in small increments. Therefore, a pull request changes one abstraction or 10 lines. This way, our reviews take a couple of minutes.

If a review takes a day or more, then something is wrong. Firstly, you may have some issues with architecture. Either it's a large chunk of code, say, 1,000 lines, or your architecture is so complex that a person cannot understand it. This is a side issue, but it also needs to be addressed. Perhaps, there is no need for a review at all. This is also something to consider. Reviews are the thing that slows you down. They have their benefits overall, but you need to understand why you are doing this. Is it a way for you to quickly pass on information? Is it for you to set certain standards internally, or what? Why do you need this? Because a review needs to be either very quick or completely canceled. This is like transbase development—it’s a very beautiful concept, but only for mature teams.

Regarding the 4 metrics, I would recommend measuring them to understand what they lead to. Look at the numbers, see the picture, how bad it all is.

(Dmitri) Olen valmis arutama seda sinuga. Numbrid ja mÔÔdikud on kĂ”ik suurepĂ€rased, praktika on samuti suurepĂ€rane. Kuid tuleb aru saada, kas see on Ă€ri jaoks vajalik. On ettevĂ”tteid, kellele ei ole vajalik selline muutuste kiirus. Ma tean ettevĂ”tteid, kus muudatusi ei saa teha iga 15 minuti tagant. Ja mitte sellepĂ€rast, et nad oleksid halvad. See on elutsĂŒkkel. Ja et teostada funktsiooni branches, funktsiooni toggle, on vajalikud sĂŒgavad teadmised.

See on keeruline. Kui soovite lugeda lĂ€hemalt funktsioonist toggle, siis soovitan vĂ€ga. https://trunkbaseddevelopment.com/. Ja Martin Fowleril on suurepĂ€rane artikkel funktsioonidest toggle: milliseid tĂŒĂŒpe, elutsĂŒkleid jne on olemas. Funktsioon toggle on keeruline.

Ja sa ikkagi ei vastanud kĂŒsimusele: "Kas Jenkins on vajalik vĂ”i mitte?"

Jenkins ei ole tegelikult ĂŒhelgi juhul vajalik. Kui tĂ”siselt rÀÀkida, siis tööriistad: Jenkins, Gitlab toovad teile mugavust. Te nĂ€ete, kas kogumine Ă”nnestus vĂ”i mitte. Need vĂ”ivad teid aidata, kuid nad ei tule teiega praktikat. Nad vĂ”ivad anda teile lihtsalt ringi – Ok, ei Ok. Ja seda juhul, kui te kirjutate veel teste, sest kui teste ei ole, siis on see peaaegu mĂ”ttetu. SeetĂ”ttu on see vajalik, kuna see on mugavam, kuid ĂŒldiselt on vĂ”imalik ka ilma selleta elada, kaotate mitte palju.

St. kui teil on praktika, siis ei ole see teile vajalik?

TĂ€pselt. Soovitan Jez Humble'i testi. Seal mul on viimase punkti suhtes kahetised tunded. Kuid ĂŒldiselt, kui teil on kolm asja, te liidate pidevalt, kĂ€itate teste commitide peal masteris, kiiresti parandate buildi masteris, siis vĂ”ib-olla ei ole teil rohkem midagi vaja.

Kuna me ootame osalejatelt kĂŒsimusi, on mul kĂŒsimus. Me rÀÀkisime praegu toote koodist. Kas oled kasutanud seda infrastruktuuri koodi jaoks. Kas see on sama kood, sellel on samad printsiibid ja sama elutsĂŒkkel, vĂ”i on seal teised elutsĂŒklid ja printsiibid? Tavaliselt, kui kĂ”ik rÀÀgivad pidevast integreerimisest ja arendamisest, unustatakse, et on ka infrastruktuuri kood. Ja viimasel ajal on seda ĂŒha rohkem ja rohkem. Kas peaksime seal rakendama neid reegleid?

Isegi mitte, et peaks, vaid see oleks suurepÀrane, kuna see lihtsustab elu. Kuni me töötame koodiga, mitte bash-skriptidega, ja meil on korralik kood.

Peatus-peatuse, bash-skript – see on samuti kood. Ära puutu minu vana armastust.

Hea, ma ei hakka sinu mÀlestusi tallama. Mul on bashi vastu isiklik vastumeelsus. See laguneb rumalalt ja hirmuÀratavalt kogu aeg. Ja see laguneb sageli ettearvamatult, seega ei meeldi see mulle. Aga oletame, et sul on bashis kood. VÔib-olla ma tÔesti ei tea ja seal on normaalsed testimisraamistike. Ma lihtsalt ei ole kursis. Ja me saame samu plusse.

Niipea kui me töötame infrastruktuuriga nagu koodiga, saame kĂ”ik samad probleemid nagu arendajad. MĂ”ni kuu tagasi sattusin olukorda, kus kolleeg saatis mulle 1 000 rida bashi pull requesti. Ja sa jÀÀd 4 tunniks seda ĂŒle vaatama. Probleemid on samad. See on ikka veel kood. Ja ikka veel koostöö. Me jÀÀme kinni pull requesti ja jÀÀme kinni bashi sama merge-konfliktide lahendamisse.

Ma vaatan praegu vĂ€ga aktiivselt kogu seda asja maksimaalselt ilusa infrastruktuuri programmeerimise suunas. Olen praegu infrastruktuuri tĂ”mmanud Pulumi. See on puhtalt programmeerimine. Seal on see veelgi ilusam, sest mul on kĂ”ik programmeerimiskeele vĂ”imalused, st ma tegin sama IF-idega ilusaid toggle-sid ja kĂ”ik on hĂ€sti. Nimelt, mu muudatus on juba masteris. Seda nĂ€evad juba kĂ”ik. Teised insenerid on sellest kursis. See on juba millegile mĂ”jutanud. Kuid samas ei aktiveeritud see kĂ”igile infrastruktuuridele. See aktiveeriti nĂ€iteks minu testkeskkondade jaoks. SeetĂ”ttu, vastates sinu kĂŒsimusele veel kord, see on vajalik. See muudab meie elu inseneridena, kes töötavad koodiga, kindlasti lihtsamaks.

Kas kellelgi on veel kĂŒsimusi?

Mul on kĂŒsimus. Soovin jĂ€tkata arutelu Olegiga. Üldiselt arvan, et sa oled Ă”ige, et kui ĂŒlesanne vĂ”tab sul kuu aega, siis sul on arhitektuuri probleem, sul on analĂŒĂŒsi, dekompositsiooni, planeerimise jne probleem. Aga mul on selline tunne, et kui sa hakkad proovima elada Continuous Integration jĂ€rgi, siis hakkad sa planeerimisega seotud probleeme parandama, sest sa ei pÀÀse sellest enam kuskile.

(Oleg) Jah, kĂ”ik on nii. Selle praktika töömaht on vĂ”rreldav mis tahes muu tĂ”sise praktikaga, mis muudab kultuuri. KĂ”ige raskem takistuste ĂŒletamine on harjumused, eriti halvad harjumused. Ja kui selle praktika rakendamiseks on vaja tĂ”sist harjumuste muutmist ĂŒmbritsevate inimeste seas: arendajad, juhtkond, tootmisjuht, siis ootavad teid ĂŒllatused.

Millised vĂ”ivad olla ĂŒllatused? Oletame, et otsustasite, et hakkate sagedamini integreerima. Ja teie integreerimisele on seotud veel mingid asjad, nĂ€iteks artefaktid. Teie ettevĂ”ttes on nĂ€iteks poliitika, et iga artefakt peab olema mingil moel arvesse vĂ”etud mingis artefaktide ladustamise sĂŒsteemis. Ja see vĂ”tab aega. Inimene peab mĂ€rkima, et ta, kui vĂ€ljaandete haldur, on selle artefakti testinud valmisoleku osas tootmisse viimiseks. Kui see vĂ”tab 5-10-15 minutit, aga samal ajal teete vĂ€ljaandeid kord nĂ€dalas, siis nĂ€dalas pooltunnine ajakulu ei ole suur maksu.

Kui teete pidevat integreerimist 10 korda pĂ€evas, siis tuleb 10 korda korrutada 30 minutiga. Ja see ĂŒletab selle vĂ€ljaandete halduri tööaega. Ta lihtsalt vĂ€sib selle tegemisest. Mingid praktikaid on pidevad kulud. Ja kĂ”ik.

Ja teil on vaja kas tĂŒhistada see reegel, et te ei tegele selliste asjadega, st et te ei mÀÀrata kĂ€sitsi vastavust millegi suhtes. Te toetute tĂ€ielikult mingitele automatiseeritud valmisoleku testide komplektidele.

Ja kui teil on kellegilt tĂ”end, et juht allkirjastab, ja te ei liiguta tootmisse, kui Vassja ei ĂŒtle, et ta lubab jne – kĂ”ik see jama takistab praktikaid. Sest kui mingid tegevused on maksuna seotud, siis kĂ”ik kĂŒmneid kordi suureneb. Seega ei ole toimetuse muudatus kĂ”igile alati rÔÔm. Sest inimeste harjumusi on raske muuta.

Kui inimene teeb harjumuspĂ€rast tööd, teeb ta seda praktiliselt mitte mĂ”eldes. Selle kognitiivne koormus on null. Ta teeb lihtsalt valmiste pealt, tal on peas juba kontrollnimekiri, ta on seda tuhat korda teinud. Ja kui sa tuled ja ĂŒtled talle: „Ärme tee seda praktikat ja alates esmaspĂ€evast rakendame uut,” siis muutub see tema jaoks suureks kognitiivseks koormuseks. Ja see koormus hakkab kĂ”igile koheselt pihta.

Seega on kÔige lihtsam, kuigi see luksus ei ole kÔigile kergesti kÀttesaadav, kuid mina teen alati just nii. Kui kÀivitatakse uus projekt, siis torkavad kÔik proovimata praktikad kohe sellesse projekti. Seni, kuni projekt on uus, ei riski me eriti millegagi. Prod pole veel saadaval, pole mida kokku varisema panna. SeetÔttu saab seda kasutada treeninguna. Selline lÀhenemine töötab. Kuid mitte kÔik ettevÔtted ei saa selliseid projekte sageli alustada. Kuigi see on ka veidi kummaline, kuna praegu toimub pidev digitaalne transformatsioon, peavad kÔik katsetusi kÀivitama, et konkurentidega sammu pidada.

Siin satud sa vastu sellele, et sul peaks alguses olema arusaam sellest, mida sul on vaja teha. Maailm ei ole ideaalne, prod ka ei ole ideaalne.

Jah, need asjad on omavahel seotud.

Äril pole ka alati arusaama, et nad peavad minema just sinna, kuhu peab.

On olukord, kus ei ole mingid muudatused ĂŒldse vĂ”imalikud. See on olukord, kus meeskonnale avaldatakse suuremat survet. Meeskond on juba ĂŒsna lĂ€bipĂ”lenud. Neil ei ole enam mingit reservaega katsetuste jaoks. Nad töötavad hommikust Ă”htuni funktsioonide kallal. Ja juhtkonnale on funktsioonidest alati vĂ€he. NĂ”utakse ĂŒha rohkem ja rohkem. Sellises olukorras ei ole ĂŒldse mingid muudatused vĂ”imalikud. Meeskonnale saab vaid öelda, et homme teeme tĂ€pselt nii nagu eile, lihtsalt tuleb teha funktsioone natuke rohkem. Mingid ĂŒleminekud mingitesse praktikatesse selles mĂ”ttes ei ole vĂ”imalikud. See on klassikaline olukord, kus pole aega kirvest teritada, peab puid langetama, seega langetatakse tuima kirvega. Siin lihtsaid nĂ”uandeid ei ole.

(Dmitri) Loen vĂ€lja tĂ€psustuse vestlusest: „Aga vajavad suurt testimise katet erinevatel tasanditel. Kui palju aega pĂŒhendatakse testimisele? See on kuidagi kallis, vĂ”tab palju aega.”

(Oleg) See, this is a classic misconception. There should be enough tests to ensure your own confidence. Continuous Integration is not something where you first run 100% of the tests and only then start applying this practice. Continuous Integration reduces your cognitive load because each change you see is so obvious that you understand whether it will break something or not, even without tests. You can quickly test it in your mind because the changes are small. Even if you only have manual testers, it’s easier for them too. You roll out a change and say: 'Look, did anything break?' They check and reply: 'No, nothing is broken.' Because the tester knows where to look. You have one commit related to one piece of code. And this exploits specific behavior.

Here you certainly embellished.

(Dmitry) I disagree here. There is a practice — test-driven development, which will help with this.

(Oleg) Well, I haven't reached that yet. The first illusion is that you need to write exactly 100% of tests or you shouldn't engage in Continuous Integration at all. This is false. These are two parallel practices. And they do not directly depend on each other. Your test coverage should be optimal. Optimal means that you confidently believe that the quality of the master branch after your commit allows you to confidently click the 'Deploy' button on a Friday evening, even if you've had a few drinks. How do you achieve this? Through reviews, through coverage, through good monitoring.

Good monitoring is indistinguishable from tests. If you run tests once on pre-prod, they check all your user scenarios only once. But if you run them in an endless loop, it becomes your deployed monitoring system that tests everything infinitely—whether it has crashed or not. In this case, the difference lies only in whether it's done once or repeatedly. A very good set of tests..., run infinitely, is monitoring. And proper monitoring should be like that.

And so how exactly you will achieve that state when you deploy on a Friday evening and go home is another question. Perhaps you are just a bold maverick.

Naasime tagasi veidi Continuous Integration'i juurde. Oleme pÔgenenud veidi teise keerulisse praktikasse.

Ja teine illusioon on see, et MVP-d tuleb kiiresti teha, seega katsetele pole seal ĂŒldse kohta. Asi ei ole nii. Nimelt, kui kirjutate MVP-s user story, siis selle arendamine vĂ”ib toimuda kas lihtsalt kuulmise pĂ”hjal — kuulete, et on mingi user story ja jooksete seda kohe kodeerima — vĂ”i TDD pĂ”hjal. Ja TDD puhul, nagu praktika nĂ€itab, ei kesta see kauem; testid on pigem kĂ”rvaltoime. TDD praktika ei seisne testimises. Hoolimata sellest, et see on nimega Test Driven Development, ei ole seal tegemist tĂ”eliselt testidega. See on pigem arhitektuuri lĂ€henemine. See on lĂ€henemine, kuidas kirjutada just seda, mida on vaja, ja mitte kirjutada seda, mida ei ole vaja. See praktika keskendab teie edasise mĂ”tlemise iteratsioonile rakenduse arhitektuuri loomise osas.

SeepÀrast ei ole neid illusioone nii lihtne purustada. MVP ja testid ei vastandu teineteisele. Pigem vastupidi: kui teete MVP-d TDD praktika kohaselt, teete seda paremini ja kiiremini kui siis, kui teete seda lihtsalt ilma praktikata.

See on vĂ€ga ebaselge ja keeruline mĂ”te. Kui kuulete, et nĂŒĂŒd hakkan ma kirjutama veel teste ja samal ajal teen midagi kiiremini, siis see kĂ”lab tĂ€iesti ebaadekvaatselt.

(Dmitri) Siin, kui paljud nimetavad MVP-d, on inimesed laisad, et kirjutada midagi normaalset. Ja need on ikkagi erinevad asjad. MVP-d ei tohiks muuta millekski halbaks ja mitte toimivaks.

Jah-jah, sa oled Ôigus.

Ja siis ĂŒhel hetkel on MVP tootmises.

Igaveseks.

Ja TDD kĂ”lab vĂ€ga harjumatult, kui kuuled, et kirjutad teste ja justkui teed rohkem tööd. See kĂ”lab vĂ€ga kummaliselt, kuid tĂ”esti, see teeb asja kiiremini ja atraktiivsemalt. Kui kirjutate testi, mĂ”tletem sellega juba palju, milline kood on ja kuidas see kutset saab, ning millist kĂ€itumist me sellelt ootame. Te ei ĂŒtle lihtsalt, et ma olen kirjutanud mingi funktsiooni ja see teeb midagi. Te mĂ”tlete kĂ”igepealt sellele, et tal on sellised tingimused, ja see kutsub teatud viisil esile. Te katate selle testidega ja sellega mĂ”istate, millised on teie koodi sisemised liidesed. See mĂ”jutab arhitektuuri vĂ€ga palju. Teie kood muutub automaatselt modulaarsemaks, sest te ĂŒritate esmalt aru saada, kuidas te seda katsetate, ja alles seejĂ€rel kirjutate selle.

Mul on TDD lĂ€henemisega nii, et mingil hetkel palkasin Ruby mentori, kui olin veel Ruby programmeerija. Ta ĂŒtles: „Teeme nii, et teed TDD jĂ€rgi.” Ja ma mĂ”tlesin: „Kurrat, nĂŒĂŒd tuleb jĂ€llegi midagi juurde kirjutada.” Lepisime kokku, et jĂ€rgmise kahe nĂ€dala jooksul kirjutan kogu töötava koodi Pythonis TDD jĂ€rgi. Kahe nĂ€dala pĂ€rast sain aru, et ma ei taha enam tagasi minna. PĂŒĂŒdes neid kahte nĂ€dalat igal pool rakendada, mĂ”istsin, kui palju lihtsam on isegi lihtsalt mĂ”elda. Aga see ei ole ilmselge, seega soovitan kĂ”igil, et kui teil on tunne, et TDD – see on keeruline, pikk ja liig, proovige seda jĂ€rgida vĂ€hemalt kaks nĂ€dalat. Mul piisab kahest, et seda mĂ”ista.

(Dmitri) Saame seda mĂ”tet arendada infrastruktuuri ekspluateerimise vaatenurgast. Enne kui me midagi uut deployime, teeme jĂ€lgimise ning seejĂ€rel kĂ€ivitame. Sel juhul muutub meie jĂ€lgimine tavaliseks testimiseks. Ja on olemas arendamine lĂ€bi jĂ€lgimise. Kuid enamik ĂŒtleb, et see on pikk, mul on laisk, ma tegin ajutise mustandi. Kui me saydime korraliku jĂ€lgimise, saame aru CI sĂŒsteemi olekust. Ja CI sĂŒsteemis on palju jĂ€lgimist. Me mĂ”istame sĂŒsteemi seisundit, me teame, mis tal sees on. Ja arenduse kĂ€igus loome sĂŒsteemi, et see jĂ”uaks soovitud olekusse.

Need praktikad on olnud tuntud juba ammu. Me arutasime seda umbes 4 aastat tagasi. Kuid viimase 4 aastaga pole praktiliselt midagi muutunud.

Kuid selle mÀrkmega pakun ametliku arutelu lÔpetamiseks.

video (sisestatud meediaelemendina, kuid mingil pÔhjusel ei tööta):

https://youtu.be/zZ3qXVN3Oic

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster