
Arutame, miks CI-tööriistad ja CI on tÀiesti erinevad asjad.
Millist valu CI pĂŒĂŒab leevendada, kust tuli idee, millised on viimased tĂ”endid selle toimimise kohta, kuidas mĂ”ista, kas teie kĂ€sutuses on tĂ”eliselt praktika, mitte lihtsalt paigaldatud Jenkins.
MĂ”te teha ettekande Continuous Integration'i kohta tuli juba aasta tagasi, kui ma kĂ€isin tööotsingutel. RÀÀkisin 10-15 ettevĂ”ttega, neist ainult ĂŒks suutis arusaadavalt vastata, mis on CI, ja selgitada, kuidas nad mĂ”istsid, et neil seda pole. ĂlejÀÀnud rÀÀkisid arusaamatust juttu Jenkinsist đ Noh, meil on Jenkins, see teeb sĂŒndmusi, CI! Ettekandes pĂŒĂŒan selgitada, mis on tegelikult Continuous Integration ja miks Jenkins ja sarnased tööriistad on selle suhtes vĂ€ga nĂ”rgad.

Ja nii, mis tavaliselt tuleb CI sÔna peale meelde? Enamikele inimestele tuleb meelde Jenkins, Gitlab CI, Travis jne.

Isegi kui googleâime, pakutakse meile need tööriistad.

Kui kĂŒsida, kas need tunduvad tuttavad, siis kohe pĂ€rast tööriistade loetlemist rÀÀgitakse, et CI tĂ€hendab, et teil on Pull Requestis kommittimisel sĂŒndmus ja testide lĂ€biviimine.

Continuous Integration ei ole tööriistadest ega testide kogumist haru sees! Continuous Integration on praktika, mis keskendub uue koodi pidevale integreerimisele, ja selleks ei ole absoluutset vajadust ĂŒles ehitada Jenkins'e, GitLab'e jne.

Enne kui lĂ€heme edasi, et aru saada, milline on tĂ”eline CI, sukeldume esmalt nende inimeste konteksti, kes selle vĂ€lja mĂ”tlesid, ja tunnetame olukorda, mida nad ĂŒritasid lahendada.

Nad ĂŒritasid lahendada meeskonnatöö valupunkte!

Vaadakem nÀiteid, millega arendajad silmitsi seisavad meeskondade koostöös. Oletame, et meil on projekt, git'i peaharud ja kaks arendajat.

Nad alustavad tööd, nagu paljud on juba harjunud. Nad vĂ”tavad ĂŒlesande Jira's, loovad feature haru ja kirjutavad koodi.

Ăks neist lĂ”petab funktsiooni kiiremini ja liidab selle peaharuga.

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

Mida keerulisem on oma funktsiooni ĂŒhendada ĂŒldise meistriga, seda rohkem aega me selle jaoks kulutame. Ja see on vaid lihtne nĂ€ide. See on nĂ€ide, kus arendajaid on vaid kaks. Kujutage nĂŒĂŒd ette, kui neid on 10, 15 vĂ”i isegi 100, kes kirjutavad ĂŒhte repo. Te lĂ€hete hulluks, lahendades kĂ”iki neid konflikte.

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

Nad on loonud igaĂŒhele oma haru.

Ăks neist liitus, kĂ”ik oli head, ĂŒlesanne anti ĂŒle.

Teine arendaja samal ajal andis oma ĂŒlesande. Oletame, et ta esitas selle ĂŒlevaatamiseks. Paljudes firmades on praktika â ĂŒlevaatus. Ăhelt poolt on see hea ja kasulik praktika, teisalt aga pidurdab see meid paljuski. Me ei sĂŒvene sellesse, aga siin on suurepĂ€rane nĂ€ide, kuhu vĂ”ib viia vale ĂŒlevaatuse ajalugu. Te esitasite pull requesti ĂŒlevaatamiseks. Arendajal ei olnud rohkem midagi teha. Mida ta siis hakkab tegema? Ta hakkab vĂ”tma muid ĂŒlesandeid.

Sel ajal tegi teine arendaja veel midagi.

Esimene tĂ€itis kolmanda ĂŒlesande.

Ja mingil pikemal ajal, kui tema ĂŒlevaade on proovitud, pĂŒĂŒab ta sulanduda. Ja mis juhtub? Ta satub tohutute konfliktide piiristikku. Miks? Sest seni, kuni tema pull request oli ĂŒlevaatamisel, on koodis juba liiga palju muutunud.
Lisaks konfliktide teemale on probleemiks ka suhtlused. Kui teie haru on ĂŒlevaatamisel, ootab midagi, ja kui te kaua töötate funktsiooni kallal, lĂ”petate jĂ€lgimise, mis veel teie teenuse koodibaasis muutub. VĂ”ib-olla olete asja, mille hetkel proovite lahendada, juba eile lahendanud ja saate mĂ”nda meetodit taaskasutada. Kuid te ei nĂ€e seda, sest te töötate alati vananenud haruga. Ja see vananenud haru toob alati kaasa selle, et peate lahendama merge-konflikti.
Tuleb vĂ€lja, et kui töötame meeskonnas, st mitte ĂŒks inimene uurib repot, vaid umbes 5-10 inimest, siis mida kauem me oma koodi pĂ”hiharusse ei lisame, seda enam kannatame selle tĂ”ttu, et lĂ”puks tuleb midagi sulanduda. Ja mida rohkem me konfliktidega silmitsi seisame ning millega vanema versiooniga töötame, seda rohkem probleeme meil on.

Koos töötamine on valus! Me segame alati ĂŒksteist.

Sellele probleemile pöörati tĂ€helepanu ĂŒle 20 aasta tagasi. Esimene viide pideva integreerimise praktikast leiti ÀÀrmuslikest programmeerimistest.
ĂĂ€rmuslik programmeerimine on pirmine agiilne raamistik. LehekĂŒlg ilmus 1996. aastal. Idee oli kasutada programmeerimise, planeerimise ja muu praktikaid, et arendamine oleks vĂ”imalikult paindlik, et saaksime kiiremini reageerida muudatustele ja kliendi nĂ”udmistele. Nad hakkasid 24 aastat tagasi mĂ€rkama, et kui sa teed midagi vĂ€ga kaua ja eraldi, siis kulutad sellele rohkem aega, sest sul tekivad konfliktid.

Praegu analĂŒĂŒsime fraasi âpidev integreerimineâ sĂ”na-sĂ”nalt. Kui tĂ”lkida otse, siis saame pidev integreerimine. Kuid kui pidev see tegelikult on, ei ole vĂ€ga selge, see on pigem katkestatud. Samuti ei ole selge, kui palju see on integratsioon.
SeetĂ”ttu toon teile praegu tsitaate ÀÀrmuslikust programmeerimisest. Ja me analĂŒĂŒsime mĂ”lemat sĂ”na eraldi.
Integreerimine â Nagu ma juba mainisin, pĂŒĂŒame, et iga insener töötaks kĂ”ige vĂ€rskemate koodiversioonidega ja lisaks oma koodi vĂ”imalikult sageli peamise haru kĂŒlge, et need oleksid vĂ€iksed harud. Sest kui need on suured, vĂ”ime kergesti nĂ€dalaks kinni jÀÀda ĂŒhinemis konfliktidesse. Eriti kui meil on pikk arendustsĂŒkkel, nagu waterfall, kus arendaja lĂ€heb kuuks ajaks midagi suurt arendama. Ja integreerimise etapis jÀÀb ta tĂ”eliselt pikaks ajaks kinni.
Integreerimine on see, kui me vĂ”tame oma haru ja integreerime selle peamise haruga, ĂŒhildame selle. On ideaalne variant, kus me transbase development, kus pĂŒĂŒame kirjutada otse peaharu, ilma igasuguste liigsete harudeta.
Ăldiselt on integreerimine oma koodi vĂ”tmine ja selle peaharu viimine.

Mida mĂ”eldakse sĂ”na âcontinuousâ all, mis tĂ€hendab pidevust? Praktikas pĂŒĂŒab arendaja integreerida oma koodi vĂ”imalikult kiiresti. See on tema eesmĂ€rk iga ĂŒlesande tĂ€itmisel â saada oma kood pĂ”hiharusse nii kiiresti kui vĂ”imalik. Ideaalilises maailmas teeksid arendajad seda iga paari tunni jĂ€rel. S.t. sa vĂ”tad vĂ€ikese ĂŒlesande, mergid selle pĂ”hiharusse. KĂ”ik on suurepĂ€rane. Sa pĂŒĂŒdled selle poole. Ja seda tuleb teha pidevalt. Niipea, kui sa midagi teed, paigutad sa selle kohe pĂ”hiharusse.
Ja arendaja, kes midagi teeb, vastutab selle eest, et see töötab ja mitte midagi ei katke. Siin tÔuseb tavaliselt esile testide teema. Soovime kÀivitada mÔned testid meie commit'ile, meie mergile, et veenduda, et see töötab. Siin vÔivad teile suureks abiks olla Jenkins.
Aga lugudega: teeme muudatused vĂ€ikestena, teeme ĂŒlesanded vĂ€ikestena, ja teeme ĂŒlesande ning ĂŒritame selle kohe ĂŒhendusse saada â siin ei aita Jenkinsid. Sest Jenkins aitab teil ainult teste kĂ€ivitada.
Te saate ka ilma nendeta hakkama. See ei takista teid milleski. Sest praktika eesmĂ€rk on ĂŒhendada nii tihti kui vĂ”imalik, et mitte raisata aega tulevikus tekkivate konfliktide peale.
Kujutame ette, et meil on 2020. aasta ja mingil pĂ”hjusel pole internetti. Ja me töötame lokaalselt. Meil pole Jenkinsit. See on normaalne. Te saate ikkagi luua lokaalse haru. Te olete sinna kirjutanud mingit koodi. Tehke ĂŒlesanne 3-4 tunni jooksul. Vahetage peaharule, tehke git pull ja ĂŒhendage oma haru sinna. Valmis. Kui teete seda tihti â Ă”nnitleme, teil on pidev integreerimine!

Millised on tĂ€napĂ€eva maailmas tĂ”endid, mis nĂ€itavad, et selleks tasub pingutada? Sest ĂŒldiselt on see keeruline. Kui proovite nii töötada, mĂ”istate, et peate mingisugusest planeerimisest kinni pidama ja rohkem aega ĂŒlesannete koostamiseks kulutama. Sest kui teete manâŠ, siis te ei saa kiiresti liita ja seetĂ”ttu jÀÀte hĂ€tta. Teie praktikast ei piisa enam.
Ja see tuleb kalliks maksma. Alustada kohe jĂ€rgmiseks pĂ€evaks pideva integreerimisega ei Ă”nnestu. Te harjute sellega vĂ€ga kaua, palju aega kulub ĂŒlesannete koostamise harjumise peale, palju aega kulub ĂŒlevaatuspraktika muutmise harjumise peale, kui see teil juba on. Sest meie eesmĂ€rk on, et see liituks tĂ€na. Kui teete ĂŒlevaatust kolme pĂ€eva jooksul, on teil probleeme ja pidev integreerimine ei toimi.
Aga kas meil on mingeid aktuaalseid tĂ”endeid just nĂŒĂŒd, mis ĂŒtlevad, et sellesse praktikasse investeerimine on mĂ”ttekas?

Esimene asi, mis mulle pÀhe tuli, on State of DevOps. See on uuring, mida kutid on juba seitse aastat lÀbi viinud. Praegu teevad nad seda sÔltumatu organisatsioonina, kuid Google'i all.
Ja nende uurimus 2018. aastal nĂ€itas korrelatsiooni ettevĂ”tete vahel, kes pĂŒĂŒavad kasutada lĂŒhiajalisi harusid, mis integreeruvad kiiresti ja sageli. Nende IT-tulemuslikkus on oluliselt parem.
Millised on need nĂ€itajad? Need on neli mÔÔdikut, mida nad kĂŒsitlustes kĂ”igist ettevĂ”tetest koguvad: deployimise sagedus, muudatuste ooteaeg, teenuse taastamise aeg ja muudatuste ebaĂ”nnestumise mÀÀr.
Esiteks, on olemas see korrelatsioon: me teame, et ettevĂ”tted, kes teevad sulandamisi tihti, saavutavad nende mÔÔdikute osas paremaid tulemusi. Samuti jagavad nad ettevĂ”tteid erinevatesse kategooriatesse: aeglased ettevĂ”tted, medium performer, high performer ja eliit. Eliit on Netflix, Amazon, kes on superkiired â nad teevad kĂ”ik kiiresti, kenasti ja kvaliteetselt.

Teine lugu, mis juhtus alles kuu aega tagasi. Technology Radar'is ilmus suurepÀrane mÀrkmete postitus Gitflow'st. Gitflow erineb teistest sellega, et tema harud elavad kaua. On vÀljaandmispuud, mis elavad kaua ning funktsioonide harud, mis samuti kaua elavad. See praktika on Technology Radar'is hakanud HOLD-i minema. Miks? Sest inimesed seisavad silmitsi integratsiooni probleemidega.
Kui sinu haru elab vÀga pikka aega, jÀÀb see kinni, hakkab mÀdanema, ja me hakkame kulutama rohkem aega selle muutmise tegemiseks.
Ja hiljuti ĂŒtles Gitflow autor, et kui pĂŒĂŒad saavutada pidevat integreerimist ja soovid, et saaksid vĂ”imalikult sageli edasi liikuda, siis Gitflow on halb idee. Ta lisas oma artiklis, et kui sul on backend, kus saad sellele pĂŒĂŒda, siis Gitflow on sulle ĂŒleliigne, kuna see aeglustab sind ja loob integreerimisega probleeme.
See ei tÀhenda, et Gitflow oleks halb ja et seda ei tohiks kasutada. See sobib muudes olukordades. NÀiteks, kui pead toetama mitut versiooni teenusest vÔi rakendusest, s.t. kui pead toetama pikka aega.
Aga kui suhtled inimestega, kes selliseid teenuseid toetavad, kuuled palju nördimust selle ĂŒle, et see versioon oli 3.2, mis oli 4 kuud tagasi ja kuhu see parandamine ei saanud, ning nĂŒĂŒd, et see sisse viia, tuleb teha hulk muudatusi. Ja nad takerdusid jĂ€lle ja nii nad nĂ€pivad nĂ€dal aega, et vĂ”tta ja liita mingi uus funktsioon.
Nagu Alexander Kovalev Ă”igesti mĂ€rkis vestluses, ei tĂ€henda korrelatsioon, et tegemist on pĂ”hjus-tagajĂ€rjega. See on tĂ”si. St. ei ole mingit otsest seost, et kui teil on pidev integreerimine, siis kĂ”ik nĂ€itajad on imeliselt head. Kuid on positiivne korrelatsioon, et kui ĂŒks on olemas, siis tĂ”enĂ€oliselt on ka teine. See ei ole kindlasti, aga tĂ”enĂ€oliselt. See on ainult korrelatsioon.

Tundub, et me teeme juba midagi, nĂ€iliselt me mergeâime, aga kuidas mĂ”ista, et meil on siiski pidev integreerimine, et me mergeâime piisavalt tihti?
Jez Humble on Handbooki, Accelerate'i, Continuous Delivery veebisaidi ja raamatu âContinuous Deliveryâ autor. Ta pakub vĂ€lja sellise testi:
- Arendaja kood jÔuab masterisse igapÀevaselt.
- Iga commit'i puhul kÀitate te unit-testid.
- Masteri build kukkus alla, see parandati umbes 10 minutiga.
Ta soovitab kasutada sellist testi, et veenduda, et praktika on teil tÔeliselt olemas.
Viimane punkt tundub mulle veidi vaidluslik. Kui saate vea 10 minutiga parandada, siis tĂ€hendab see, et teil on pidev integreerimine, mis kĂ”lab veidi kummaliselt, aga see omamoodi mĂ”te eksisteerib. Miks? Sest kui te teete sageid liiteid, tĂ€hendab see, et muudatused on vĂ€ikesed. Kui vĂ€ike muudatus pĂ”hjustab teie pĂ”hiversiooni katkestamise, suudate selle kiiresti leida, kuna muudatus on vĂ€ike. Oletame, et teil oli vĂ€ike liitmine, kus muudeti 20â30 rida. SeetĂ”ttu saate kiiresti aru, mis pĂ”hjus oli, kuna muudatused on napid ja teil on probleemide otsimiseks vĂ€ga vĂ€ike ala.
Ja isegi kui meie tootmisserver pĂ€rast vĂ€ljalaset kokku kukub, siis kui meil on pideva integreerimise praktika, on meil palju lihtsam tegutseda, kuna muudatused on vĂ€ikesed. Jah, see mĂ”jutab planeerimist. See teeb haiget. Ja tĂ”enĂ€oliselt on kĂ”ige keerulisem selles praktikas see, et harjuda ĂŒlesandeid jaotama, st kuidas teha nii, et vĂ”taks midagi teha mitu tundi ja seejĂ€rel lĂ€bida kvalitatiivne ĂŒlevaatus, kui see on olemas. Ălevaatus on tĂ€iesti eraldi mure.
Ăhik-testid on lihtsalt abivahend, mis aitab teil mĂ”ista, kas teie integreerimine on Ă”nnestunud ja midagi pole katki lĂ€inud. Minu arvates pole see ka tĂ€iesti kohustuslik punkt, kuna praktika mĂ”te ei seisne selles.
Siin on lĂŒhidalt Continuous Integration'i kohta. See on kĂ”ik, mis selle praktika kohta teada on. Olen kĂŒsimustele avatud.
LĂŒhidalt kokku vĂ”ttes ĂŒtlen veel kord:
- Continuous Integration ei tÀhenda Jenkins'i ega GitLab'i.
- See ei ole tööriist, vaid praktika, mille kohaselt liidame meie koodi vÔimalikult tihti master'isse.
- Tee seda selleks, et vÀltida tulevikus suuri probleeme, mis seotud mergimisega; ehk tekitame praegu vÀikese valulikkuse, et tulevikus vÀltida suurt. See on kogu idee.
- Koodiga toimub suhtlemine, aga ma nÀen seda vÀga harva, kuigi selleks see on ka ette nÀhtud.
KĂŒsimused
Mida teha ĂŒlesannete mitte-dekompositsiooniga?
Dekompositsioon. Mis on probleem? Kas suudate tuua nĂ€ite, et on mingi ĂŒlesanne, mida ei saa dekompositsiooniks jagada?
On selliseid ĂŒlesandeid, mida ei saa absoluutselt lahti harutada, nĂ€iteks need, mis nĂ”uavad vĂ€ga sĂŒgavat ekspertiisi ja mida on vĂ”imalik lahendada tegelikult kuu aega enne mingit arusaadavat tulemust.
Kui ma sind Ă”igesti mĂ”istan, siis on mingi suur ja keeruline ĂŒlesanne, mille tulemust saab nĂ€ha ainult kuu pĂ€rast?
Jah, kÔik on Ôige. Jah, tulemuse hindamine on vÔimalik mitte varem kui kuu pÀrast.
Hea kĂŒll. Ăldiselt pole see probleem. Miks? Sest antud juhul, kui rÀÀgime harudest, ei rÀÀgi me harust koos funktsiooniga. Funktsioonid vĂ”ivad olla suured ja keerulised. Need vĂ”ivad hĂ”lmata suurt hulka komponente. Ja vĂ”ib-olla me ei saa neid tĂ€ielikult teha ĂŒhes haru. See on normaalne. Me peame lihtsalt selle loo lahti harutama. Kui funktsioon ei ole lĂ”puni valmis, ei tĂ€henda see, et mĂ”ningaid selle koodi osi ei saa liita. Sa oled nĂ€iteks lisanud migratsiooni ja funktsiooni sees on mĂ”ned etapid. Sul on nĂ€iteks etapp â teha migratsioon, lisada uus meetod. Ja need asjad, mida saab juba iga pĂ€ev liita.
Hea kĂŒll. Mis siis on selle mĂ”te?
Miks on mÔtet igapÀevaselt vÀikeseid muudatusi kokku viia?
Jah.
Kui need on midagi katki teinud, siis nĂ€ed seda kohe. Sul on vĂ€ikene tĂŒkk, mis midagi katki tegi, ja seda on lihtsam parandada. MĂ”tteks on see, et vĂ€ikese tĂŒki ĂŒhendamine on oluliselt lihtsam kui suure ĂŒhendamine nĂ€dalate pĂ€rast. Ja kolmas mĂ”te on see, et teised insenerid saavad töötada juba aktuaalse koodiversiooniga. Nad nĂ€evad, et siia on lisandunud migratsioonid ja siia on ilmunud mingi meetod, mida nad vĂ”ivad samuti soovida kasutada. KĂ”ik nĂ€evad, mis su koodis toimub. Just nende kolme asja nimel seda praktikat tehakse.
AitĂ€h, kĂŒsimus on suletud!
(Oleg Soroka) Kas ma vĂ”in lisada? Sa ĂŒtlesid kĂ”ike Ă”igesti, tahan lihtsalt ĂŒhe lause lisada.
Nii.
Continuous Integration'i puhul liidetakse kood ĂŒhisesse haru mitte siis, kui funktsioon on tĂ€ielikult valmis, vaid siis, kui ehitus enam ei katke. Ja vĂ”ite rahulikult commiteerida masterisse niipalju kordi pĂ€evas kui soovite. Teine aspekt â kui te mingil pĂ”hjusel ei suuda kuumisi ĂŒlesannet jagada vĂ€hemalt kolme pĂ€eva ĂŒlesanneteks, rÀÀkimata kolmest tunnist, siis on teil suur probleem. Ja see fakt, et teil ei ole Continuous Integration'i â on kĂ”ige vĂ€iksem neist probleemidest. See tĂ€hendab, et teil on probleeme arhitektuuriga ja inseneripraktikad on nullis. Sest isegi kui see on uurimistöö, tuleks seda siiski vormistada hĂŒpoteeside vĂ”i tsĂŒklina.
RÀÀkisime neljast mÔÔdikust, mis eristavad edukaid ettevĂ”tteid mahajÀÀnutest. Nendest neljast mÔÔdikust tuleb veel lĂ€bi elada. Kui teie keskmine ĂŒlesanne kestab kuu aega, siis soovitaksin kĂ”igepealt sellele mÔÔdikale tĂ€helepanu pöörata. VĂ€hendage see esmalt kolme pĂ€eva peale. Ja pĂ€rast seda hakake mĂ”tlema Continuous'e peale.
Kas ma sain Ă”igesti aru, et arvad, et investeerimine inseneripraktikatesse ei ole mĂ”istlik, kui igasugune ĂŒlesanne kestab kuu aega?
Sul on pidev integreerimine. Ja seal on selline teema, et sa kas parandad vea 10 minuti jooksul vÔi tagasitÔmbad. Kujuta ette, et sa selle vÀlja andsid. Ja sul on isegi pidev juurutamine, sa andsid selle vÀlja produktsiooni ja alles siis mÀrkad, et midagi lÀks valesti. Ja sul tuleb see tagasi vÔtta, aga su andmebaasi migratsioon on juba toimunud. Sul on juba andmebaasi skeem jÀrgmises versioonis, veel rohkem, on toimunud ka mingisugune varundamine, veel sinna andmed salvestatud.
Ja mis sul on alternatiivina? Kui sa tagasitÔmbad koodi, siis see ei saa enam töötada selle uuendatud andmebaasiga.
Andmebaas liigub ainult edasi, jah.
Inimestel, kellel on halb inseneripraktika, on tÔenÀoliselt, et nad pole paksu raamatut ... ka lugenud. Mida teha varundusega? Kui sa taastud varundusest, siis sa kaotad andmed, mis selle hetkeni kogusid. NÀiteks töötasid kolme tunni jooksul uue versiooniga andmebaasis, sinna registreerusid kasutajad. Sa tagastusid vanale varundusele, kuna uue versiooniga skeem ei tööta, vastavalt sellele kaotad sa need kasutajad. Ja nad on rahulolematud, nad pahandavad.
Ettevalmistamiseks, et omandada kogu praktika, mis toetab pidevat integreerimist ja pidevat tarnimist, ei piisa lihtsalt kirjutamisest... Esiteks, neid vĂ”ib olla vĂ€ga palju, mille tĂ”ttu muutub see ebaefektiivseks. Lisaks on seal hulk teisi praktikaid, nĂ€iteks teaduslikud. On olemas praktika, mille populariseeris GitHub, kus vana ja uus kood töötab samaaegselt. See tĂ€hendab, et sa teed pooleliolevat funktsiooni, mis saab mingit vÀÀrtust tagastada: kas funktsiooni vĂ”i REST API kaudu. Sa tĂ€idad nii uut koodi kui ka vana koodi ja vĂ”rdled nende vahelist erinevust. Ja kui erinevus eksisteerib, siis logid selle sĂŒndmuse. Nii tead, et su uus funktsioon on valmis vanale peale kukkuma, kui teatud ajaperioodi jooksul ei ole nende kahe vahel lahknevust.
Selliseid praktikaid on sadu. Ma soovitaksin alustada transbase arendamisest. See ei ole 100% pideva integreerimise mudel, kuid praktikad on samasugused, ĂŒks ilma teiseta ei ela hĂ€sti.
Kas tÔid transbase arendamise nÀitena, kust saab praktikaid vaadata, vÔi soovitad inimestel alustada transbase arendamise kasutamist?
Vaadake, kuna nad ei saa seda kasutada. Selleks, et seda kasutada, tuleb palju lugeda. Ja kui inimesel on kĂŒsimus: âMida teha funktsiooniga, mis vĂ”tab kuu aegaâ, siis see tĂ€hendab, et ta ei ole lugenud transbase arendamise kohta. Ma ei soovitaks seda praegu. Ma soovitaksin keskenduda rangelt sellele, kuidas suurte ĂŒlesannete arhitektuuriliselt Ă”igesti vĂ€iksemateks tĂŒkkideks jagada. Just see on dekompositsiooni tuum.
Dekompositsioon on ĂŒks arhitekti tööriistu. Esiteks teeme analĂŒĂŒsi, seejĂ€rel dekompositsiooni, seejĂ€rel sĂŒnteesi ja seejĂ€rel integratsiooni. Nii koguneb meie jaoks kĂ”ik kokku. Ja pidev integratsioon nĂ”uab dekompositsiooni kaudu arengut. Esimesel etapil tekivad kĂŒsimused, aga me rÀÀgime juba neljandast etapist, st mida sagedamini integratsiooni teeme, seda parem. Selleks on veel varakene, oleks hea esmalt oma monoliiti pisut toimetada.
Tuleb joonistada mingisuguseid nooli ja ruute mingile skeemile. Sa ei saa öelda, et nĂŒĂŒd nĂ€itan ma uue rakenduse arhitektuurskeemi ja nĂ€itan ĂŒhte ruutu, mille sees on roheline nupp rakenduse jaoks. Igal juhul on ruute ja nooli rohkem. Igas skeemis, mida ma olen nĂ€inud, on neid rohkem kui ĂŒks. Ja isegi graafilise esitlemise tasemel toimub dekompositsioon juba. SeetĂ”ttu saab ruute teha sĂ”ltumatuks. Kui ei, siis on mul arhitekti vastu suured kĂŒsimused.
KĂŒsimus vestlusest: âKas ĂŒlevaatus on kohustuslik ja kestab kaua, mĂ”nikord pĂ€eva vĂ”i kauem?â
Teie praktikaga on probleeme. Ălevaatus ei tohiks kesta pĂ€eva vĂ”i rohkem. See on sama lugu nagu eelneva kĂŒsimusega, ainult veidi leebem. Kui ĂŒlevaatus kestab pĂ€eva, tĂ€hendab see, et tĂ”enĂ€oliselt on tegemist vĂ€ga suure muudatusega. Seega tuleks seda jagada vĂ€iksemateks osadeks. Olegi soovitatud transbase arenduses on selline mĂ”te, mida nimetatakse pidevaks ĂŒlevaatuseks. Selle idee on see, et me teeme teadlikult nii vĂ€ikese pull request'i, et soovime pidevalt vĂ€ikeste muudatustega liituda. Seega muudab pull request ĂŒhe abstraktsiooni vĂ”i 10 rida. TĂ€nu sellele kestab meie ĂŒlevaatus paar minutit.
Kui ĂŒlevaade vĂ”tab pĂ€eva vĂ”i enam, siis on midagi valesti. Esiteks vĂ”ivad teil olla probleemid arhitektuuriga. VĂ”i on see suur koodilĂ”ik, nĂ€iteks 1000 rida. VĂ”i on teie arhitektuur nii keeruline, et inimene ei saa sellest aru. See on probleem, mida tuleb samuti lahendada. VĂ”ib-olla ei olegi ĂŒlevaatust vaja. Sellele peaksite samuti mĂ”tlema. Ălevaatus on see, mis teid pidurdab. Sellel on oma eelised, kuid tuleb mĂ”ista, miks te seda teete. Kas see on teie jaoks kiire teabe edastamise viis, kas selle kaudu seadistate sisemisi standardeid vĂ”i midagi muud? Miks teil seda on vaja? Sest ĂŒlevaatus peab olema kas vĂ€ga kiire vĂ”i tuleks see hoopis Ă€ra jĂ€tta. See on nagu transbase'i arendamine â vĂ€ga ilus lugu, kuid ainult kĂŒpsetele inimestele.
Mis puutub nelja mÔÔdikusse, siis soovitaksin need siiski eemaldada, et mÔista, kuhu see viib. Vaadata numbreid, vaadata pilti, kui halb see kÔik veel on.
(Dmitri) Olen valmis selle ĂŒle sinuga arutama. Numbrid ja mÔÔdikud on kĂ”ik tore, praktika on tore. Kuid tuleb mĂ”ista, kas see on ettevĂ”ttele vajalik. On ettevĂ”tteid, kellele ei ole selline muutuste sagedus vajalik. Tuntud on ettevĂ”tted, kus ei tohi muudatusi teha iga 15 minuti jĂ€rel. Ja mitte seepĂ€rast, et nad oleksid kedagi halvad. See on elutsĂŒkkel. Ja et kasutada funktsioonide haru ja funktsioonide lĂŒlitit, on vaja sĂŒgavaid teadmisi.
See on keeruline. Kui soovite lugeda rohkem funktsioonide lĂŒlitite ajaloost, siis soovitan tungivalt. . Ja Martin Floweri korral on suurepĂ€rane artikkel funktsioonide lĂŒlititest: milliseid tĂŒĂŒpe, elutsĂŒkleid jms. Funktsioonide lĂŒlitid â see on keeruline.
Ja sa ikkagi ei vastanud kĂŒsimusele: 'Kas Jenkins on vajalik vĂ”i mitte?'
Jenkins ei ole tegelikult kunagi vajalik. Kui tĂ”siselt rÀÀkida, siis tööriistad nagu Jenkins ja Gitlab toovad mugavust. NĂ€ete, kas ehitamine toimis vĂ”i mitte. Nad aitavad teil, kuid nad ei anna teile praktilisi kogemusi. Nad vĂ”ivad anda vaid ringi â OK, mitte OK. Ja seda juhul, kui te kirjutate veel teste, sest kui teste ei ole, siis on see peaaegu mĂ”ttetu. SeetĂ”ttu on vaja, sest see on mugavam, kuid ĂŒldiselt saate ka ilma selleta hakkama, ei kaota kuigi palju.
K. e. kui teil on praktika, kas see tÀhendab, et teil ei ole seda vaja?
Just. Soovitan Jez Humble'i testi. Ma olen viimase punkti osas kahtleval seisukohal. Kuid kokkuvĂ”ttes, kui teil on kolm asja: te ĂŒhendate pidevalt, kĂ€ivitate teste masteris tehtud muudatuste puhul, kiiresti parandate masteri ehituse, siis vĂ”ib-olla ei ole teil rohkemat vajagi.
Kui me ootame osalejatelt kĂŒsimusi, siis minul on kĂŒsimus. Me rÀÀkisime tootekoodist. Kas sa oled kasutanud ka infrastruktuurikoodi? Kas see on sama kood, millel on samad pĂ”himĂ”tted ja eluiga, vĂ”i on seal teised eluiga ja pĂ”himĂ”tted? Ăldiselt, kui kĂ”ik rÀÀgivad pidevast integreerimisest ja arendamisest, unustavad nad, et infrastruktuurikood on samuti olemas. Viimasel ajal on seda ĂŒha rohkem. Kas peaksime sinna tuua kĂ”ik need reeglid?
See ei ole ainult soovitus, see oleks suurepÀrane, kuna see lihtsustaks elu. Niipea kui me töötame koodiga, mitte bash-skriptidega, vaid meil on normaalne kood.
Peatu-peat, bash-skript on samuti kood. Ăra puutu minu vana armastust.
Hea kĂŒll, ma ei hakka sinu mĂ€lestusi tallama. Mul on bash'i vastu isiklik antipaatia. See puruneb inetult ja haaravalt kogu aeg. Ja see katkeb sageli ettearvamatult, seetĂ”ttu ma ei armasta seda. Aga hĂ€sti, oletame, et sul on bash'is kood. VĂ”ib-olla tĂ”esti ma ei tea ja seal on normaalsed testimise raamistikud. Ma lihtsalt ei ole teadlik. Ja me saame samu eeliseid.
Kui me töötame infrastruktuuriga nagu koodiga, kohtame samu probleeme nagu arendajad. MĂ”ned kuud tagasi sattusin olukorda, kus kolleeg saatis mulle 1 000 rea suuruse bash'i pull request'i. Ja sa jÀÀd 4 tunniks ĂŒlevaate tegemisse kinni. Probleemid on samad. See on ikka veel kood. Ja ikka veel koostöö. Me jÀÀme kinni pull request'i ja meid pidurdavad samad bash'i mergenĂŒĂŒbid.
Ma jĂ€lgisin seda asja praegu vĂ€ga aktiivselt, keskendudes tarkvara infrastruktuuri maksimaalselt ilusale kodeerimisele. Olen praegu integreerinud infrastrukturi Pulumi. See on puhtalt kodeerimine. Seal on see veel kaunim, sest mul on kĂ”ik programmeerimiskeele vĂ”imalused. See tĂ€hendab, et ma tegin samade if-de abil kauneid toggles ja kĂ”ik on hĂ€sti. Minu muudatus on juba Masteris. KĂ”ik nĂ€evad seda. Teised insenerid on sellest teadlikud. See on juba millegi peale mĂ”jutanud. Kuid see ei ole aktiveeritud kĂ”igis infrastruktuurides. See on aktiveeritud nĂ€iteks minu testkeskkondades. Seega, vastates su kĂŒsimusele veel kord, see on vajalik. See lihtsustab meie elu inseneridena, kes töötavad koodiga, tĂ€pselt samamoodi.
Kas kellelgi on veel kĂŒsimusi?
Mul on kĂŒsimus. Soovin jĂ€tkata arutelu Olegiga. Ăldiselt arvan, et sul on Ă”igus, et kui ĂŒlesanne vĂ”tab sul kuu aega, siis on sul arhitektuuriga probleeme, sul on probleeme analĂŒĂŒsiga, dekompositsiooniga, planeerimisega jne. Kuid mul on tunne, et kui hakkad pĂŒĂŒdma elada Continuous Integration'i jĂ€rgi, siis hakkad oma planeerimisega seotud muresid lahendama, sest sa ei pÀÀse sellest muidu.
(Oleg) Jah, kĂ”ik on nii. Selle praktika töömaht on sarnane igasuguste teiste tĂ”siste praktikatega, mis muudavad kultuuri. KĂ”ige raskem on harjumuste ĂŒletamine, eriti halbade harjumuste. Ja kui selle praktika juurutamiseks on vajalik tĂ”sine muutus ĂŒmbritsevates harjumustes: arendajates, juhtkonnas, tootmisjuhtides, siis ootavad sind ĂŒllatused.
Millised ĂŒllatused vĂ”ivad tulla? Oletame, et otsustasite, et hakkate sagedamini integreerima. Ja teie integratsioonis on seotud veel mĂ”ned asjad, nĂ€iteks artefaktid. Ja teie ettevĂ”ttes on nĂ€iteks poliitika, et iga artefakt peab olema mingil moel arvesse vĂ”etud mingis artefaktide laosĂŒsteemis. Ja see vĂ”tab aega. Inimene peab mĂ€rkima, et tema, kui vĂ€ljalaskemanager, on katsetanud seda artefakti tootmisse panekuks. Kui see vĂ”tab 5-10-15 minutit, kuid samas teete vĂ€ljalaske kord nĂ€dalas, siis nĂ€dalas pool tundi kulutada â see on vĂ€ike maks.
Kui teete pidevat integreerimist 10 korda pĂ€evas, siis tuleb 10 korda korrutada 30 minutiga. Ja see ĂŒletab selle vĂ€ljalaskemanageri tööaja. Ta lihtsalt vĂ€sib sellest. On pidevad kulud mĂ”ningatele praktikatest. Ja kĂ”ik.
Ja teil on kas vaja see reegel tĂŒhistada, et te enam sellisega ei tegele, st te ei mÀÀra kĂ€sitsi millegi vastavuse astet. Te toetute tĂ€ielikult mingile automatiseeritud testide komplektile, et kontrollida valmisolekut.
Ja kui teil on vaja kellegi tĂ”endit, et juht kirjutaks alla, ja te ei lĂ€he produktsiooni, kui Vasja ei ole öelnud, et tal on lubatud jne. â siis kogu see jama takistab praktikaid. Sest kui on seotud mingisuguste tegevustega maksud, siis kĂ”ik muutub 100 korda keerulisemaks. SeetĂ”ttu vĂ”idakse ĂŒleminekut tihti mitte kĂ”igiga rÔÔmuga vastu vĂ”tta. Inimeste harjumustele on raske muutuda.
Kui inimene teeb harjumuspĂ€rast tööd, siis ta teeb seda praktiliselt mitte mĂ”eldes. Selle kognitiivne koormus on null. Ta lihtsalt teeb valmisoleku jĂ€rgi, tal on peas juba kontroll-loend, ta on seda tuhat korda teinud. Ja kui sa tuled ja ĂŒtled talle: "Ăra tĂŒhista seda praktikat ja alates esmaspĂ€evast rakendame uut", siis see muutub tema jaoks tohutuks kognitiivseks koormuseks. Ja see koormus tuleb kĂ”igi jaoks korraga.
Seega on kĂ”ige lihtsam, kuigi tĂ”si, et mitte kĂ”ik ei suuda endale seda luksust lubada, kuid mina teen alati just nii. Kui algab uus projekt, siis tavaliselt sokutatakse sellesse projekti kĂ”ik katsetamata praktikad. Kui projekt on noor, ei riskime me eriti millegagi. Prod veel ei eksisteeri, seega pole midagi kaotada. SeetĂ”ttu saab seda kasutada treeninguna. Selline lĂ€henemine töötab. Aga mitte kĂ”ik ettevĂ”tted ei saa endale lubada selliste projektide tihedat algust. Kuigi see on ka veidi kummaline, kuna praegu toimub pidev digitaalne transformatsioon, peaksid kĂ”ik eksperimente kĂ€ivitama, et konkurentide ees pĂŒsida.
Siin tabad end olukorrast, kus sul peab esmalt olema arusaam sellest, mida sa tegema pead. Maailm ei ole ideaalne, prod ka ei ole ideaalne.
Jah, need asjad on omavahel seotud.
Ărivaldkonnas ei ole ka alati selgust, et nad peavad sinna suunda liikuma.
On olukord, kus muutused ei ole ĂŒldse vĂ”imalikud. See juhtub siis, kui meeskonnale avaldatakse suuremat survet. Meeskond on juba ĂŒsna vĂ€sinud. Neil pole ĂŒldse reservi katsetamiseks. Nad töötavad hommikust Ă”htuni funktsioonide kallal. Ja juhtkonnale tundub, et funktsioone pole kunagi piisavalt. NĂ”utakse aina rohkem ja rohkem. Sellises olukorras ei ole ĂŒldse mingeid muutusi vĂ”imalik teha. Meeskonnale saab öelda ainult, et homme teeme nagu eile, lihtsalt tuleb teha funktsioon veidi rohkem. Mingeid ĂŒleminekuid uutele praktikale ei ole vĂ”imalik teha. See on klassikaline olukord, kus pole aega kirvest teritada, peab puid langetama, seetĂ”ttu langetatakse nurgataguse kirvega. Siin pole lihtsaid nĂ”uandeid.
(Dmitri) Loen vÀlja tÀpsustuse vestlustest: «Aga vajame suurt testimise katvust erinevatel tasemetel. Kui palju aega testimisele kulutatakse? Tundub, et see on liiga kallis, vÔtab palju aega.»
(Oleg) See on klassikaline eksiarvamus. Testide peab olema piisavalt, et teil endil oleks kindlus. Continuous Integration ei ole selline asi, kus kĂ”igepealt tehakse 100% teste ja alles siis hakatakse seda praktikat rakendama. Continuous Integration vĂ€hendab teie kognitiivset koormust, kuna iga muudatus, mida te nĂ€ete, on nii ilmselge, et te mĂ”istate â kas see rikub midagi vĂ”i mitte, isegi ilma testideta. Te saate seda kiiresti oma peas testida, kuna muudatused on vĂ€ikesed. Isegi kui teil on ainult kĂ€sitsi testijad, on neil samuti lihtsam. Te esitate ja ĂŒtlete: âVaata, ei ole midagi katki?â Nad kontrollivad ja ĂŒtlevad: âEi, ei ole midagi katki.â Sest tester teab, kuhu vaadata. Teil on ĂŒks commit seotud ĂŒhe koodijupiga. Ja see vĂ€ljendub konkreetses kĂ€itumises.
Siin oled sa muidugi natuke ilusamaks teinud.
(Dmitri) Siin ma ei nĂ”ustu. On olemas praktika â testimise kaudu arendamine, mis just sellest pÀÀstab.
(Oleg) Siin, ma ei ole veel sinna jĂ”udnud. Esimene illusioon on see, et tuleb kirjutada tĂ€pselt 100% teste vĂ”i et Continuous Integrationiga ei tule ĂŒldse tegeleda. See ei ole tĂ”si. Need on kaks paralleelset praktikat ja need ei sĂ”ltu otseselt ĂŒksteisest. Teie testide katmine peaks olema optimaalne. Optimaalne tĂ€hendab, et te olete ise kindel, et see kvaliteet, millega teie master pĂ€rast commit'i jÀÀb, lubab teil kindlalt vajutada nuppu 'Deploy' reede Ă”htul, isegi joobes. Kuidas te seda saavutate? Ălevaatete, katmise ja hea jĂ€lgimise kaudu.
Hea jĂ€lgimine ei erine testidest. Kui te kĂ€ivitate teste ainult ĂŒhe korra pre prod'is, siis kontrollivad nad teie kĂ”iki kasutajate stsenaariume ainult korra. Kuid kui te neid kĂ€ivitate lĂ”pmatus tsĂŒklis, siis on see teie rakendatud jĂ€lgimisĂŒsteem, mis katab pidevalt kĂ”ike â kas on kokku kukkunud vĂ”i mitte. Sel juhul on vahe ainult korduvuses. VĂ€ga hea testide komplekt, mida kĂ€ivitatakse lĂ”pmatult, on jĂ€lgimine. Ja Ă”ige jĂ€lgimine peaks olema just selline.
Ja seega, kuidas te jĂ”uate sellesse olekusse, kui te reede Ă”htul oma koodi juurutate ja koju lahkute, on teine kĂŒsimus. VĂ”ib-olla olete lihtsalt julge peast soe.
Naaseme hetkeks tagasiviivale pidevale integreerimisele. Oleme natuke teise keerulise praktikaga kÔrvale pöördunud.
Ja teine illusioon on see, et MVP-d tuleb kiiresti teha, seega pole testid ĂŒldse vajalikud. See pole pĂ€ris nii. Asi on selles, et kui te kirjutate MVP-s user story, siis on selle arendamine vĂ”imalik kas kiirelt, st kuulete, et kuskil on mingi user story ja kohe hakkate seda kodeerima, vĂ”i töötada TDD jĂ€rgi. Ja TDD praktika nĂ€itab, et see ei kesta kauem, st testid on pigem kĂ”rvalmĂ”ju. TDD praktika ei seisne mitte testimises. Kuigi see kannab nime Test Driven Development, on seal tegelikult tegemist millegi muuga kui testidega. See on pigem arhitektuuriline lĂ€henemine. See on lĂ€henemine, kuidas kirjutada tĂ€pselt seda, mida on vaja, ja mitte kirjutada seda, mis pole vajalik. See praktika keskendub sellele, kuidas jĂ€rgmist iteratsiooni teie arengu mĂ”ttes rakenduse arhitektuuri loomisel saavutada.
SeetĂ”ttu ei ole neist illusioonidest nii lihtne vabaneda. MVP ja testid ei excluded ĂŒksteist. Tegelikult, vastupidi, kui teete MVP-d TDD praktikaga, siis teete selle paremini ja kiiremini kui lihtsalt proovimata.
See on vĂ€ga ebamugav ja keeruline mĂ”te. Kui kuulete, et nĂŒĂŒd hakkan kirjutama veel teste ja samal ajal teen midagi kiiremini, kĂ”lab see tĂ€iesti ebaadekvaatselt.
(Dmitri) Siin paljud, kui rÀÀgivad MVP-st, on inimestel laisk kirjutada midagi korralikku. Need on siiski erinevad asjad. Ărge muutke MVP-d mingiks halvaks asjaks, mis ei tööta.
Jah-jah, sa oled Ôige.
Ja siis Àkki MVP prod.
Igaveseks.
TDD kĂ”lab esialgu vĂ€ga ebatavaline, kui kuuled, et kirjutad teste ja tundub, et teed rohkem tööd. See vĂ”ib tunduda kummaline, kuid tegelikult on see tĂ”husam ja elegantsem. Kui sa kirjutad testi, mĂ”tled juba peas palju selle ĂŒle, millist koodi ja kuidas sa kutsud, samuti millist kĂ€itumist me sellelt oodata saame. Sa ei ĂŒtle lihtsalt, et ma kirjutasin mingi funktsiooni ja see teeb midagi. Esmalt sa mĂ”tled, et sellel on sellised tingimused ja nii kutsutakse seda. Sa katad selle testidega ja seelĂ€bi saad aru, kuidas sinu koodi sees olevad liidesed vĂ€lja nĂ€evad. See mĂ”jutab arhitektuuri vĂ€ga palju. Su kood muutub automaatselt moodulamaks, sest sa pĂŒĂŒad esmalt mĂ”ista, kuidas sa seda testida saad, ja alles seejĂ€rel kirjutad selle.
Minu TDD teekond oli selline, et ĂŒhel hetkel palkasin Ruby mentori, kui olin veel Ruby programmeerija. Ta ĂŒtles: "Teeme nii, et sa hakkad TDD-d rakendama." MĂ”tlesin: "Issand, nĂŒĂŒd pean veel midagi lisaks kirjutama." Lepisime kokku, et ma kirjutangi jĂ€rgmise kahe nĂ€dala jooksul kogu olemasoleva koodi Pythonis TDD pĂ”hjal. Kahes nĂ€dalas sain aru, et ma ei taha enam tagasi minna. Kahe nĂ€dala jooksul pĂŒĂŒdes seda igal pool rakendada, mĂ”istsin, kui palju lihtsam on isegi lihtsalt mĂ”elda. Kuid see ei ole ilmselge, seega soovitan kĂ”igil, kellele tundub, et TDD on keeruline, aeganĂ”udev ja ĂŒleliigne, proovida seda jĂ€rgida ainult kaks nĂ€dalat. Minule piisab kahest.
(Dmitri) Saame selle mĂ”tte infrastruktuuri kĂ€itamise vaatenurgast lahti. Enne kui kĂ€ivitame midagi uut, teeme me monitooringu ja seejĂ€rel kĂ€ivitame. Sel juhul muutub meie monitooring normaalseks testimiseks. Ja arendamine toimub monitooringu kaudu. Kuid enamik inimesi ĂŒtleb, et see vĂ”tab kaua aega, mul on laisk, tegin ajutise mustandi. Kui me teeme monitooringu korralikult, saame aru CI sĂŒsteemi seisundist. CI sĂŒsteemis on palju monitooringut. Saame aru sĂŒsteemi seisundist, mĂ”istame, mis selle sees toimub. Ja arendamise ajal loome sĂŒsteemi, et see saavutaks soovitud oleku.
Need praktikad on olnud tuntud juba ammu. Arutasime seda umbes 4 aastat tagasi. Kuid nelja aastaga ei ole praktiliselt midagi muutunud.
KÀesolevates mÀrkustes soovitan ametliku arutelu lÔpetada.
Video (sisestatud meediaelemendina, kuid mikski ei tööta):
Allikas: habr.com
