
LÄt oss diskutera varför CI-verktyg och CI Àr helt olika saker.
Vilken smÀrta Àr CI avsedd att lösa, varifrÄn kom idén, vilka senaste bevis finns det för att det fungerar, hur man förstÄr att man har en praktik och inte bara en installerad Jenkins.
Tanken att hĂ„lla en förelĂ€sning om Continuous Integration kom för ett Ă„r sedan nĂ€r jag var pĂ„ intervjuer och sökte jobb. Jag pratade med 10-15 företag, och av dem var det bara ett som kunde förklara vad CI var och hur de insĂ„g att de inte hade det. De andra pratade nonsens om Jenkins đ 'Tja, vi har Jenkins, den gör byggen, CI!' I min förelĂ€sning kommer jag att försöka förklara vad Continuous Integration egentligen Ă€r och varför Jenkins och liknande verktyg har mycket lite att göra med det.

SÄ, vad kommer vanligtvis att tÀnka pÄ nÀr man hör ordet CI? För de flesta kommer ord som Jenkins, Gitlab CI, Travis osv. att dyka upp.

Ăven om vi googlar kommer dessa verktyg att dyka upp bland resultaten.

Om du frÄgar bekanta kommer de direkt efter upprÀkningen av verktyg att berÀtta att CI Àr nÀr du har en byggprocess och tester som körs pÄ varje pull request.

Continuous Integration handlar inte om verktyg, inte om byggen med tester i en gren! Continuous Integration Àr en praktik av mycket frekvent integration av ny kod, och för dess tillÀmpning Àr det inte alls nödvÀndigt att bygga Jenkins, GitLab och sÄ vidare.

Innan vi gÄr igenom hur en komplett CI ser ut, lÄt oss först dyka ner i kontexten av de mÀnniskor som kom pÄ detta, och kÀnna den smÀrta de försökte lösa.

Och den smÀrtan de försökte lösa var den gemensamma arbetsprocessen i teamet!

LÄt oss titta pÄ exempel pÄ vilka svÄrigheter utvecklare stöter pÄ vid lagarbete. HÀr har vi ett projekt, master-grenen i git och tvÄ utvecklare.

Och de började arbeta som alla lÀnge har vant sig vid. De tog en uppgift i JIRA, skapade en feature branch och började skriva kod.

En avslutade funktionen snabbare och slog samman sin kod med master.

Den andra tog lÀngre tid, han slog samman senare och fick en konflikt. Nu, istÀllet för att skriva de funktionskrav som verksamheten behöver, spenderar utvecklaren tid och energi pÄ att lösa konflikter.

Ju mer komplicerat det Àr att integrera din funktion med huvudgrenen, desto mer tid spenderar vi pÄ det. Och detta Àr fortfarande ett ganska enkelt exempel jag har visat. Det hÀr Àr ett exempel dÀr det bara Àr tvÄ utvecklare. TÀnk er om 10, 15 eller 100 personer i företaget skriver i ett och samma repository. Ni skulle bli galna av att lösa alla dessa konflikter.

Det finns en nÄgot annorlunda situation. Vi har en huvudgren och flera utvecklare som gör nÄgot.

De har skapat en gren vardera.

En har fört samman sin gren, allt gick bra, uppgiften Àr klar.

Under tiden har den andra utvecklaren slutfört sin uppgift. LĂ„t oss sĂ€ga att han har skickat den för granskning. I mĂ„nga företag finns det en praxis â granskning. Ă ena sidan Ă€r denna praxis bra och anvĂ€ndbar, Ă„ andra sidan bromsar den oss pĂ„ mĂ„nga sĂ€tt. LĂ„t oss inte gĂ„ in pĂ„ det nu, men hĂ€r Ă€r ett utmĂ€rkt exempel pĂ„ vad en snedvriden granskning kan leda till. Du har skickat en pull request för granskning. Utvecklaren har inget mer att göra. Vad börjar han göra? Han börjar ta andra uppgifter.

Under denna tid har den andra utvecklaren Àven arbetat med nÄgot annat.

Den första slutförde den tredje uppgiften.

Och efter en lÀngre tid har han fÄtt sin granskning godkÀnd och försöker föra samman sina Àndringar. Och vad hÀnder? Han fÄngar en mÀngd konflikter. Varför? För medan hans pull request hÀngde pÄ granskning har det skett mÄnga förÀndringar i koden.
Förutom historia med konflikter finns det ocksÄ kommunikationsproblem. SÄ lÀnge din gren hÀnger pÄ granskning, sÄ lÀnge den vÀntar, sÄ lÀnge du arbetar lÀnge med en funktion, slutar du att hÄlla koll pÄ vad som förÀndras i kodbasen av din tjÀnst. Kanske det du försöker lösa nu redan löstes igÄr och att du kan ÄteranvÀnda en metod. Men du ser inte det, eftersom du alltid arbetar med en förÄldrad gren. Denna förÄldrade gren leder alltid till att du mÄste lösa merge-konflikter.
Det visar sig att om vi arbetar som ett team, alltsÄ inte bara en person som arbetar i repositoryn, utan 5-10 personer, desto lÀngre vi vÀntar med att lÀgga till vÄr kod i huvudgrenen, desto mer lider vi av att vi till slut mÄste föra ihop nÄgot. Och ju fler konflikter vi har, och ju Àldre version vi arbetar med, desto fler problem fÄr vi.

Att samarbeta Àr smÀrtsamt! Vi stör alltid varandra.

Det hÀr problemet uppmÀrksammades för mer Àn 20 Är sedan. Den första omnÀmnandet av praktiken Continuous Integration hittade jag inom extrem programmering.
Extrem programmering Àr den första agile-ramverket. Sidan skapades 1996. Tanken var att anvÀnda vissa programmerings-, planerings- och andra metoder för att utvecklingen skulle vara sÄ flexibel som möjligt sÄ vi snabbare skulle kunna reagera pÄ förÀndringar och krav frÄn vÄra kunder. För 24 Är sedan mötte de problemet att om man arbetar lÀnge i sidled, sÄ slösar man mer tid pÄ det, eftersom man fÄr konflikter.

Nu kommer vi att bryta ner frasen "Continuous Integration" ord för ord. Om vi översÀtter bokstavligt fÄr vi "kontinuerlig integration". Men hur kontinuerlig den Àr, Àr inte riktigt tydligt, den Àr faktiskt ganska intermittent. Hur mycket den Àr integration Àr inte heller helt uppenbart.
DÀrför ger jag er nu citat frÄn extrem programmering. Och vi kommer att bryta ner bÄda orden separat.
Integration - Som jag redan nÀmnt strÀvar vi efter att varje ingenjör arbetar med den mest aktuella versionen av koden, sÄ att de strÀvar efter att ofta lÀgga till sin kod i den gemensamma grenen, sÄ att det handlar om smÄ grenar. För om de Àr stora kan vi lÀtt fastna med merge-konflikter i en vecka. SÀrskilt om vi har en lÄng utvecklingscykel som vattenfall, dÀr en utvecklare har spenderat en mÄnad pÄ att bygga en stor funktion. Och vid integrationssteget kan han fastna vÀldigt lÀnge.
Integration â det Ă€r nĂ€r vi tar vĂ„r gren och integrerar den med master, vi merge:ar den. Det finns en ultimativ variant dĂ€r vi transbase developer, dĂ€r vi strĂ€var efter att vi skriver direkt till master utan nĂ„gra onödiga grenar.
I allmÀnhet Àr integration att ta sin kod och fÄ den till master.

Vad menas med ordet «continuous» och vad Ă€r kontinuitet? Praktiken innebĂ€r att utvecklaren strĂ€var efter att integrera sin kod sĂ„ snabbt som möjligt. Det Ă€r hans mĂ„l nĂ€r han utför en uppgift â att fĂ„ sin kod in i huvudgrenen sĂ„ snart som möjligt. I en perfekt vĂ€rld skulle utvecklare göra detta var nĂ„gra timmar. Det vill sĂ€ga, du tar en liten uppgift, mergar den i huvudgrenen. Allt Ă€r fantastiskt. Du strĂ€var efter detta. Och det mĂ„ste göras kontinuerligt. SĂ„ snart du har gjort nĂ„got, lĂ€gger du genast in det i huvudgrenen.
Och utvecklaren som gör nÄgot Àr ansvarig för vad han har gjort för att det ska fungera och inte bryta nÄgot. HÀr dyker vanligtvis historien om tester upp. Vi vill köra nÄgra tester pÄ vÄrt kommits, pÄ vÄr merge, för att sÀkerstÀlla att det fungerar. Och hÀr kan Jenkins hjÀlpa dig.
Men nĂ€r det handlar om: varför inte göra Ă€ndringarna smĂ„, och varför inte göra uppgifterna smĂ„, och varför inte göra uppgiften och försöka mergea den i huvudgrenen direkt â hĂ€r hjĂ€lper inga Jenkins. För Jenkins hjĂ€lper er enbart att köra tester.
Du kan klara dig utan dem. Det stör dig inte alls. För mÄlet med praktiken Àr att mergea sÄ ofta som möjligt för att inte spendera en stor mÀngd tid pÄ konflikter i framtiden.
LĂ„t oss förestĂ€lla oss att vi har Ă„r 2020 utan internet av nĂ„gon anledning. Och vi arbetar lokalt. Vi har ingen Jenkins. Det Ă€r okej. Du kan fortfarande skapa en lokal gren. Du har skrivit nĂ„gon kod i den. Görde uppgiften pĂ„ 3-4 timmar. VĂ€xla till huvudgrenen, kör git pull, merge din gren dĂ€r. Klar. Om du gör detta ofta â grattis, du har Continuous Integration!

Vilka bevis finns det i den moderna vÀrlden för att det Àr vÀrt att lÀgga kraft pÄ detta? För det Àr i grunden svÄrt. Om du försöker arbeta pÄ detta sÀtt, kommer du att mÀrka att du mÄste planera mer, du mÄste Àgna mer tid Ät nedbrytning av uppgifter. För om du gör man..., sÄ kommer du inte att kunna mergea snabbt och dÀrmed hamna i knipa. Du kommer inte att ha nÄgot praktiskt.
Och det kommer att bli dyrt. Att börja arbeta med Continuous Integration frÄn och med imorgon kommer inte att fungera. Ni kommer alla att behöva mycket tid för att vÀnja er vid detta, ni kommer att behöva lÄng tid för att vÀnja er vid att dela upp uppgifter, ni kommer att behöva lÄng tid för att justera er granskning, om ni har en sÄdan. För vÄr mÄlsÀttning Àr att det ska slÄs samman idag. Om ni gör er granskning under tre dagar, dÄ har ni problem och Continuous Integration fungerar inte.
Men vilka aktuella bevis har vi just nu som sÀger oss att det Àr meningsfullt att investera i denna praktik?

Det första som kom till mitt sinne var State of DevOps. Det Àr en studie som grabbarna har genomfört i 7 Är. Just nu gör de det som en oberoende organisation, men under Google.
Deras studie frÄn 2018 visade en korrelation mellan företag som strÀvar efter att anvÀnda kortvariga grenar, som integreras snabbt och ofta, och deras IT-prestanda Àr mycket bÀttre.
Vilka Àr dessa mÀtvÀrden? Det handlar om 4 mÀtvÀrden som de samlar in frÄn alla företag i sina enkÀter: deployment frequency, lead time for changes, time to restore service, change failure rate.
För det första finns det denna korrelation; vi vet att företag som slĂ„r samman ofta har betydligt bĂ€ttre dessa mĂ€tvĂ€rden. De delar Ă€ven in företag i flera kategorier: lĂ„ngsamma företag som producerar nĂ„got lĂ„ngsamt, medium performer, high performer och eliten. Eliten â det Ă€r Netflix, Amazon, som Ă€r super snabba, gör allt snabbt, snyggt och av hög kvalitet.

En annan story som intrÀffade för bara en mÄnad sedan. I Technology Radar publicerades en fantastisk notis om Gitflow. Gitflow skiljer sig frÄn alla andra genom att dess grenar lever lÀnge. Det finns release-grenar som lever lÀnge, och feature branches som ocksÄ lever lÀnge. Denna praktik i Technology Radar har flyttats till HOLD. Varför? Eftersom folk stöter pÄ problem med integrationen.
Om din gren lever mycket lÀnge, börjar den fastna, den gÄr ut pÄ datum, och vi börjar slösa mer tid pÄ att göra förÀndringar i den.
Nyligen sa författaren till Gitflow att om du strÀvar efter kontinuerlig integration, om du vill rulla ut förÀndringar sÄ ofta som möjligt, dÄ Àr Gitflow en dÄlig idé. I en artikel nÀmnde han att om ni har en backend dÀr ni kan strÀva efter detta, sÄ Àr Gitflow överflödigt för er, eftersom Gitflow kommer att sakta ner er och skapa problem med integrationen.
Det betyder inte att Gitflow Àr dÄligt och att man inte ska anvÀnda det. Det Àr för andra situationer. Till exempel nÀr ni behöver underhÄlla flera versioner av en tjÀnst eller applikation, det vill sÀga dÀr ni mÄste stödja den under en lÀngre tid.
Men om ni pratar med personer som underhÄller sÄdana tjÀnster, sÄ kommer ni höra mycket klagomÄl om att versionen 3.2, som var för fyra mÄnader sedan, inte fick med sig en fix och nu, för att fÄ in den, mÄste man göra en massa förÀndringar. SÄ de sitter fast igen och kÀmpar i en vecka för att fÄ in en ny funktion.
Som Alexander Kovalev korrekt pÄpekade i chatten, korrelation Àr inte detsamma som orsakssamband. SÄ Àr det. Det finns ingen direkt relation som innebÀr att om ni har kontinuerlig integration, sÄ kommer alla mÀtvÀrden att vara fantastiska, nej. Men det finns en positiv korrelation, det vill sÀga om det ena finns, dÄ Àr det troligt att det andra ocksÄ finns. Det Àr inte ett faktum, men troligt. Det Àr bara en korrelation.

Det verkar som att vi redan gör nÄgot, vi mergear redan, men hur kan vi förstÄ att vi faktiskt har kontinuerlig integration, att vi mergear tillrÀckligt ofta?
Jez Humble Àr författare till Handbook, Accelerate, webbplatsen för Continuous Delivery och boken "Continuous Delivery". Han föreslÄr ett sÄdant test:
- Ingenjörens kod gÄr in i master varje dag.
- Vid varje commit kör ni enhetstester.
- Bygget i master föll, men det ÄtgÀrdades pÄ cirka 10 minuter.
Han föreslÄr att anvÀnda ett sÄdant test för att sÀkerstÀlla att ni verkligen har de rÀtta praxis.
Det sista finner jag en aning kontroversiellt. Det vill sĂ€ga, om du kan lösa det pĂ„ 10 minuter, betyder det att du har Continuous Integration, vilket lĂ„ter lite konstigt i mina öron, men det finns logik i det. Varför? Eftersom om du ofta slĂ„r samman, betyder det att dina förĂ€ndringar Ă€r smĂ„. Om ett litet förĂ€ndring orsakar att din huvudversion bryts, kan du snabbt finna exemplet eftersom förĂ€ndringen Ă€r liten. Du hade en liten sammanslagning dĂ€r 20â30 rader Ă€ndrades. Och du kan snabbt förstĂ„ vad som var orsaken, eftersom förĂ€ndringarna Ă€r sĂ„ smĂ„, vilket ger en mycket liten sökomrĂ„de för problemet.
Och Àven om vi efter release fÄr ett problem i produktion, sÄ om vi har en praxis för Continuous Integration, Àr det mycket enklare för oss att agera, eftersom förÀndringarna Àr smÄ. Ja, det kommer att pÄverka planeringen. Det kommer att vara smÀrtsamt. Och kanske det svÄraste med denna praxis Àr att vÀnja sig vid att bryta ner uppgifter, alltsÄ hur man kan ta nÄgot och göra det pÄ nÄgra timmar och ocksÄ klara av en granskning, om du har en. Granskning Àr en separat smÀrta.
Enhetstester Ă€r bara en hjĂ€lpare som hjĂ€lper dig att förstĂ„ â har din integration verkligen lyckats? Har ingenting gĂ„tt sönder? Enligt min mening Ă€r det ocksĂ„ inte ett helt obligatoriskt moment, eftersom syftet med praktiken inte ligger dĂ€r.
Det hÀr Àr en kort sammanfattning av Continuous Integration. Det Àr allt som finns i denna praxis. Jag Àr redo för frÄgor.
Kort sammanfattar jag bara en gÄng till:
- Continuous Integration Àr inte Jenkins, det Àr inte Gitlab.
- Det Àr inte ett verktyg, det Àr en praxis om att vi sÄ ofta som möjligt slÄr samman vÄr kod i huvudversionen.
- Vi gör detta för att undvika den enorma smÀrta som uppstÄr med sammanslagningar i framtiden, det vill sÀga att vi upplever lite smÀrta nu för att inte behöva uppleva mycket mer i framtiden. Det Àr hela syftet.
- à t sidan gÄr kommunikationen genom koden, men jag ser det vÀldigt sÀllan, men det var ocksÄ tÀnkt pÄ det.
FrÄgor
Vad ska man göra med odekoflicerade uppgifter?
Dekoflicera. Vad Àr problemet? Kan du ge ett exempel pÄ en uppgift som inte kan dekofliceras?
Det finns sÄdana uppgifter som inte kan dekofliceras överhuvudtaget, till exempel de som krÀver mycket djup expertis och som verkligen kan ta en mÄnad för att nÄ nÄgot rimligt resultat.
Om jag förstÄtt dig rÀtt, sÄ finns det en stor och komplex uppgift vars resultat först kommer att synas om en mÄnad?
Ja, det stÀmmer. Ja, resultatet kan inte utvÀrderas tidigare Àn om en mÄnad.
Okej. I stort sett Àr det inget problem. Varför? För i det hÀr fallet, nÀr vi pratar om grenar, pratar vi inte om en gren med en funktion. Funktioner kan vara stora och komplexa. De kan involvera mÄnga komponenter. Och det Àr möjligt att vi inte kan göra dem helt i en gren. Det Àr okej. Vi behöver bara dela upp den hÀr historien. Om funktionen inte Àr helt fÀrdig betyder det inte att delar av dess kod inte kan slÄs samman. Du har till exempel lagt till en migration och inom funktionen finns det nÄgra steg. Du har till exempel ett steg - att göra migrationen, lÀgga till en ny metod. Och dessa saker kan du redan slÄ samman dagligen.
Okej. Vad Àr dÄ meningen med det hÀr?
Vad Àr meningen med att slÄ samman smÄ saker dagligen?
Ja.
Om de har brutit nÄgot ser du det genast. Du har en liten bit som brutit nÄgot, det Àr lÀttare att fixa. Meningen Àr att slÄ samman en liten bit nu Àr mycket enklare Àn att slÄ samman nÄgot stort om nÄgra veckor. Och den tredje meningen Àr att andra ingenjörer kommer att arbeta med den aktuella versionen av koden. De kommer att se att det har lagts till migrationer hÀr och att det har dykt upp en metod hÀr som de ocksÄ kanske vill anvÀnda. Alla kommer att se vad som hÀnder i din kod. Just för dessa tre saker utförs praktiken.
Tack, frÄgan Àr besvarad!
(Oleg Soroka) Kan jag fÄ lÀgga till nÄgot? Du sa helt rÀtt, jag vill bara lÀgga till en fras.
Okej.
Vid kontinuerlig integration slÄs koden samman i den gemensamma grenen inte nÀr funktionen Àr helt fÀrdig, utan nÀr bygget har slutat att krascha. Och ni kan fritt committa till master hur mÄnga gÄnger ni vill per dag. Den andra aspekten Àr att om ni av nÄgon anledning inte kan dela upp en mÄnadsuppgift i uppgifter pÄ Ätminstone tre dagar, jag nÀmner inte tre timmar, sÄ har ni ett enormt problem. Och att ni inte har kontinuerlig integration Àr det minsta av dessa problem. Det betyder att ni har problem med arkitekturen och att de tekniska metoderna ligger pÄ noll. För Àven om det handlar om forskning mÄste det i alla fall formuleras i form av hypoteser eller cykler.
Vi har pratat om 4 mÀtvÀrden som skiljer framgÄngsrika företag frÄn de mindre framgÄngsrika. Det krÀvs att dessa 4 mÀtvÀrden faktiskt uppnÄs. Om ditt genomsnittliga uppdrag tar en mÄnad skulle jag först fokusera pÄ detta mÀtvÀrde. Jag skulle först fÄ ner det till 3 dagar. Efter detta skulle jag börja tÀnka pÄ Continuous.
FörstÄr jag dig rÀtt att du tycker att det i allmÀnhet inte Àr meningsfullt att investera i ingenjörsmetoder om du har en uppgift som tar en mÄnad?
Du har Continuous Integration. DÀr finns det en situation dÀr du inom 10 minuter antingen fixar en lösning eller rullar tillbaka. TÀnk dig att du har slÀppt det. Och du har till och med continuous deployment, du har slÀppt det pÄ prod och först efterÄt mÀrker du att nÄgot gick fel. Du mÄste rulla tillbaka, men din databas har redan migrerat. Din databas-schema har redan versionen för nÀsta, dessutom har det redan gjorts nÄgon backup och dÀr har Àven data skrivits in.
Och vad har du som alternativ? Om du rullar tillbaka koden kan den redan inte fungera med den uppdaterade databasen.
Databasen rör sig bara framÄt, ja.
För personer med dÄliga ingenjörspraktiker har de troligen inte lÀst den tjocka boken om ... heller. Vad gör man med backup? Om du ÄterstÀller frÄn en backup betyder det att du förlorar data som har samlats in under den tiden. Till exempel, arbetade du tre timmar med den nya versionen av databasen, dÀr anvÀndare registrerade sig. Du gÄr tillbaka till den gamla backupen eftersom schemat inte fungerar med den nya versionen, och dÀrmed har du förlorat dessa anvÀndare. Och de Àr missnöjda, de klagar.
För att behĂ€rska hela spektrumet av metoder som stöder Continuous Integration och Continuous Delivery rĂ€cker det inte att bara lĂ€ra sig att skriva âŠ. För det första kan de bli vĂ€ldigt mĂ„nga, och det blir opraktiskt. Dessutom finns det en massa andra metoder, som Scientific. Det finns en metod som GitHub populariserade en gĂ„ng i tiden. Det Ă€r nĂ€r du har bĂ„de gammal och ny kod som körs samtidigt. Det Ă€r nĂ€r du gör en ofullstĂ€ndig funktion, men den kan returnera nĂ„got: antingen som en funktion eller som ett Rest API. Du kör bĂ„de ny och gammal kod och jĂ€mför skillnaden mellan dem. Och om det finns en skillnad sĂ„ loggar du det hĂ€ndelsen. PĂ„ sĂ„ sĂ€tt vet du att din nya funktion Ă€r redo att rullas ut över den gamla, om det under en viss tid inte har funnits nĂ„gon avvikelse mellan dessa tvĂ„.
Det finns hundratals sÄdana metoder. Jag skulle föreslÄ att börja med transbase development. Den Àr inte 100 % pÄ Continuous Integration, men metoderna Àr desamma, det ena kan inte utan det andra.
Du nÀmnde transbase development som exempel pÄ var man kan se metoder, eller föreslÄr du att folk ska börja anvÀnda transbase development?
Titta, eftersom de inte kan anvÀnda det. För att kunna anvÀnda dem mÄste man lÀsa mycket. Och nÀr en person frÄgar: "Vad ska jag göra med en funktion som tar en mÄnad?" betyder det att han inte har lÀst om transbase development. Jag skulle inte rekommendera det Ànnu. Jag skulle rÄda att fokusera enbart pÄ hur man korrekt arkitektoniskt delar stora uppgifter i mindre. Det Àr sjÀlva syftet med dekomposition.
Dekomposition Àr ett av verktygen för arkitekten. Först gör vi en analys, sedan dekomposition, sedan syntes, och slutligen integration. PÄ sÄ sÀtt faller allt pÄ plats. Och för att nÄ Continuous Integration mÄste man först vÀxa genom dekomposition. FrÄgor uppstÄr i det första steget, men vi pratar redan om det fjÀrde steget, det vill sÀga ju oftare man gör integration, desto bÀttre. Det Àr fortfarande för tidigt att göra det, det skulle vara bra att först dela upp sin monolit.
Det behövs nÄgra pilar och kvadrater ritade pÄ nÄgon slags schema. Du kan inte sÀga att nu ska jag visa arkitektschemat för den nya applikationen och bara visa en kvadrat, inne i vilken det finns en grön knapp för applikationen. I vilket fall som helst kommer det att finnas fler kvadrater och pilar. PÄ vilket schema jag Àn har sett, har de alltid varit fler Àn en. Och dekomposition görs redan pÄ grafisk representationsnivÄ. DÀrför kan kvadraterna göras oberoende. Om inte, sÄ har jag stora frÄgor till arkitekten.
Det finns en frÄga frÄn chatten: "Om en granskning Àr obligatorisk och pÄgÄr lÀnge, nÄgon dag eller mer?".
Ni har problem med praktiken. En granskning ska inte ta en dag eller mer. Det Àr samma historia som den föregÄende frÄgan, bara lite mjukare. Om en granskning tar en dag, betyder det förmodligen att det handlar om en vÀldigt stor förÀndring. DÄ borde man göra den mindre. I transbase development, som Oleg rekommenderade, finns det en grej som kallas continuous review. Idén Àr att vi medvetet gör sÄ smÄ pull requests som möjligt, eftersom vi strÀvar efter att mergen konstant och i smÄ mÀngder. DÀrför förÀndrar en pull request en abstraktion eller 10 rader. Tack vare detta tar granskningen bara nÄgra minuter.
Om en granskning tar en dag eller mer, dĂ„ Ă€r nĂ„got fel. För det första kan det finnas problem med arkitekturen. Antingen Ă€r det en stor kodbit, pĂ„ exempelvis 1 000 rader. Eller sĂ„ har ni en sĂ„ komplex arkitektur att en person inte kan förstĂ„ den. Det Ă€r ett problem, men det mĂ„ste ocksĂ„ lösas. Kanske behövs det överhuvudtaget ingen granskning. Det Ă€r nĂ„got man ocksĂ„ behöver fundera pĂ„. Granskning Ă€r det som bromsar er. Den ger sina fördelar i allmĂ€nhet, men ni behöver förstĂ„ varför ni gör detta. Ăr det ett sĂ€tt för er att snabbt överföra information, Ă€r det ett sĂ€tt att etablera vissa standarder internt eller vad? Varför behöver ni detta? För granskning mĂ„ste antingen vara vĂ€ldigt snabb, eller sĂ„ ska den helt avbrytas. Det Ă€r som transbase development â en mycket vacker historia, men bara för mogna personer.
AngÄende de fyra metrikorna skulle jag rekommendera att ni faktiskt tar bort dem för att förstÄ vad det leder till. Titta pÄ siffrorna, titta pÄ bilden, hur dÄligt allt ser ut.
(Dmitrij) Jag Ă€r redo att delta i diskussionen om detta med dig. Siffror och mĂ€tningar Ă€r allt bra, praktiken Ă€r bra. Men vi mĂ„ste förstĂ„ â Ă€r detta nödvĂ€ndigt för affĂ€ren? Det finns företag som inte behöver en sĂ„dan snabba förĂ€ndringar. Jag kĂ€nner till företag dĂ€r man inte kan göra Ă€ndringar var 15:e minut. Och inte för att de Ă€r dĂ„liga. Det Ă€r en sĂ„dan livscykel. Och för att göra funktioner som branches, toggle-funktioner, krĂ€vs djupa kunskaper.
Det Àr svÄrt. Om du vill lÀsa mer om historien kring toggle-funktioner, rekommenderar jag verkligen detta. . Och det finns en fantastisk artikel av Martin Fowler om toggle-funktioner: om vilka typer som finns, livscykler, osv. Toggle-funktionen Àr komplex.
Och du svarade ÀndÄ inte pÄ frÄgan: "Behövs Jenkins eller inte?"
Jenkins behövs egentligen inte i nĂ„got fall. Om jag ska vara Ă€rlig, sĂ„ ger verktyg som Jenkins, Gitlab dig bekvĂ€mlighet. Du kommer att se om bygget lyckades eller inte. De kan hjĂ€lpa dig, men de ger dig inte praktiken. De kan bara ge dig en indikator â Okej, inte okej. Och sĂ„vida du skriver tester, för annars Ă€r det nĂ€stan meningslöst. SĂ„ det behövs, för att â det Ă€r bekvĂ€mare, men i stort sett kan man klara sig utan det, man förlorar inte mycket.
Det vill sÀga, om du har praxis, sÄ behövs det inte?
Helt korrekt. Jag rekommenderar testet av Jez Humble. Jag har en blandad kÀnsla angÄende den sista punkten. Men generellt, om du har tre saker; du slÄr samman konstant, du kör tester pÄ commits i master, och fixar bygget snabbt i master, dÄ kanske du inte behöver nÄgot mer.
Medan vi vĂ€ntar pĂ„ frĂ„gor frĂ„n deltagarna, har jag en frĂ„ga. Vi har nu pratat om produktkod. Har du anvĂ€nt det för infrastrukturkod? Ăr det samma slags kod, med samma principer och livscykel, eller finns det andra livscykler och principer? Vanligtvis nĂ€r alla pratar om Continuous Integration och Development, glömmer man att det ocksĂ„ finns infrastrukturkod. Och pĂ„ senaste tiden har det ökat mer och mer. Bör vi föra in alla dessa regler dĂ€r?
Det handlar inte bara om att det bör göras, det skulle vara fantastiskt, eftersom det verkligen skulle förenkla livet. SÄ fort vi arbetar med kod, inte med bash-skript, utan vi har normal kod.
Stopp-stop, bash-skript Àr ocksÄ kod. Rör inte min gamla kÀrlek.
Bra, jag ska inte trampa pÄ dina minnen. Jag har en personlig aversion mot bash. Det kraschar pÄ ett fult och skrÀmmande sÀtt hela tiden. Och det kraschar ofta oförutsÀgbart, sÄ jag gillar det inte. Men okej, lÄt oss sÀga att du har kod i bash. Kanske har jag verkligen ingen aning, och det finns bra testframeworks dÀr. Jag Àr bara inte insatt. Och vi fÄr samma fördelar.
NÀr vi vÀl hanterar infrastruktur som kod fÄr vi alla samma problem som utvecklare. För nÄgra mÄnader sedan stötte jag pÄ en situation dÀr en kollega skickade en pull request pÄ 1 000 rader bash. Och du fastnar pÄ granskningen i 4 timmar. Problemen Àr desamma. Det Àr fortfarande kod. Och fortfarande samarbete. Vi fastnar med pull requests och vi fastnar med att reda ut samma sammanslagningskonflikter i bash, till exempel.
Just nu tittar jag vÀldigt aktivt pÄ allt detta med att programmera infrastrukturen pÄ det mest eleganta sÀttet. Jag har just integrerat Pulumi i infrastrukturen. Det Àr ren programmering. DÀr Àr det Ànnu mer tilltalande, eftersom jag har alla sprÄkets möjligheter, dvs. jag gjorde snygga toggles med samma if-satser mitt pÄ plan. SÄ mitt förÀndring finns redan i master. Alla kan se det. Andra ingenjörer Àr medvetna om det. Det har redan pÄverkat nÄgot. Men det har inte aktiverats för alla infrastrukturer. Det har aktiverats för mina testmiljöer, till exempel. SÄ för att svara pÄ din frÄga igen, det behövs. Det förenklar verkligen livet för oss ingenjörer som arbetar med kod.
Ăr det nĂ„gra fler frĂ„gor?
Jag har en frÄga. Jag vill fortsÀtta diskussionen med Oleg. Generellt sett tycker jag att du har rÀtt; om en uppgift tar en mÄnad att göra, sÄ har du problem med arkitekturen, du har problem med analys, dekonstruktion, planering, osv. Men jag har en kÀnsla av att om du börjar försöka leva efter Continuous Integration, sÄ kommer du att börja ÄtgÀrda smÀrtorna med planeringen, för du kan inte undkomma det.
(Oleg) Ja, sÄ Àr det. Denna praktik Àr jÀmförbar i arbetsinsats med andra allvarliga metoder som förÀndrar kulturen. Det svÄraste att övervinna Àr vanor, sÀrskilt dÄliga vanor. Och om det krÀvs en betydande förÀndring av vanorna hos de runt omkring: utvecklare, ledning, produktionschef, dÄ kan ni förvÀnta er överraskningar.
Vilka överraskningar kan det vara? LĂ„t oss sĂ€ga att du bestĂ€mmer att du ska göra integration oftare. Och under integrationen Ă€r det anslutna saker, till exempel artefakter. I ditt företag finns det en policy att varje artefakt mĂ„ste registreras pĂ„ nĂ„got sĂ€tt i ett system för lagring av artefakter. Och det tar en viss tid. En person mĂ„ste checka av att han, som release manager, har testat denna artefakt för att den Ă€r redo för produktion. Om det tar 5-10-15 minuter, men du gör utrullningar en gĂ„ng i veckan, dĂ„ innebĂ€r det att du en gĂ„ng i veckan spenderar en halvtimme â en liten skatt.
Om du gör Continuous Integration 10 gÄnger om dagen, sÄ behöver du multiplicera 10 gÄnger med 30 minuter. Och det överskrider arbetsvolymen för denna release manager. Han blir helt enkelt trött pÄ det. Det finns stÀndiga kostnader för vissa metoder. Och sÄ Àr det.
Och du mÄste antingen avskaffa denna regel sÄ att du inte sysslar med sÄdant nonsens, dvs. att du inte manuellt bedömer överensstÀmmelse mellan nÄgot och nÄgot. Du litar helt och hÄllet pÄ en automatiserad uppsÀttning tester för beredskap.
Och om du behöver en bekrĂ€ftelse frĂ„n nĂ„gon, sĂ„ att chefen godkĂ€nner, och du inte rör vid produktionen utan att Vasja sĂ€ger att det Ă€r okej, o.s.v. â allt detta stĂ„r i vĂ€gen för metoder. För om det finns relaterade aktiviteter som en sorts skatt, sĂ„ ökar allt hundrafaldigt. DĂ€rför kommer förĂ€ndringen ofta inte att vĂ€lkomnas av alla. Eftersom det Ă€r svĂ„rt att Ă€ndra mĂ€nniskors vanor.
NÀr en person utför sitt vanliga arbete gör han det nÀstan utan att tÀnka. Den kognitiva belastningen Àr nÀra noll. Han strÀvar framÄt med det som redan Àr fÀrdigt, han har en checklista i huvudet, han har gjort det tusen gÄnger. Och sÄ fort du kommer och sÀger till honom: "LÄt oss avskaffa denna praktik och införa en ny frÄn mÄndag" blir det en betydande kognitiv belastning för honom. Den intrÀffar dessutom för alla pÄ en gÄng.
DĂ€rför Ă€r det enklaste, Ă€ven om denna lyx inte alla har rĂ„d med, nĂ„got jag alltid gör. Det Ă€r följande: NĂ€r ett nytt projekt startar, trycks ofta alla oprövade metoder in i det projektet. SĂ„ lĂ€nge projektet Ă€r ungt riskerar vi inte mycket. Det finns ingen produktion Ă€n, det gĂ„r inte att förstöra nĂ„got. DĂ€rför kan det anvĂ€ndas som trĂ€ning. Denna metod fungerar. Men inte alla företag har möjlighet att ofta starta sĂ„dana projekt. Ăven om det Ă€r lite konstigt, eftersom det pĂ„gĂ„r en digital transformation överallt, alla borde experimentera för att hĂ€nga med konkurrenterna.
HÀr stöter du pÄ det faktum att du mÄste ha en förstÄelse för vad du behöver göra frÄn början. VÀrlden Àr inte perfekt, och produktionen Àr inte perfekt heller.
Ja, dessa saker Àr kopplade till varandra.
Företag har inte alltid en förstÄelse för att de mÄste gÄ just dit.
Det finns situationer dÀr inga förÀndringar Àr möjliga överhuvudtaget. Det Àr en situation dÀr större press lÀggs pÄ teamet. Teamet Àr redan ganska utbrÀnt. Det har ingen tid kvar för nÄgra experiment. De jobbar hela dagen med funktioner. Och ledningen Àr alltid otillfredsstÀlld med funktionerna. Det krÀvs mer och mer. I en sÄdan situation Àr inga förÀndringar möjliga. Teamet kan endast fÄ veta att imorgon ska vi göra som vi gjorde igÄr, bara att vi behöver leverera lite fler funktioner. Inga övergÄngar till nÄgra metoder Àr dÀrför möjliga. Det Àr en klassisk situation dÀr det inte finns tid att slipa en yxa, man mÄste hugga ner trÀd, sÄ man hugger med en trubbig yxa. HÀr finns det inga enkla rÄd.
(Dmitrij) Jag lÀser upp en klargörande kommentar frÄn chatten: "Men det behövs ett stort testtÀcke pÄ olika nivÄer. Hur mycket tid Àgnas Ät tester? Det verkar ganska dyrt, det tar mycket tid."
(Oleg) Det hĂ€r Ă€r en klassisk missuppfattning. Det borde finnas tillrĂ€ckligt med tester sĂ„ att ni sjĂ€lva har förtroende. Continuous Integration Ă€r inte en sĂ„dan sak dĂ€r 100 % av testerna körs först och sedan börjar ni anvĂ€nda denna praxis. Continuous Integration minskar den kognitiva belastningen genom att varje förĂ€ndring ni ser med blotta ögat Ă€r sĂ„ uppenbar att ni förstĂ„r â om den bryter nĂ„got eller inte, Ă€ven utan tester. Ni kan snabbt testa detta i huvudet, eftersom förĂ€ndringarna Ă€r smĂ„. Ăven om ni endast har manuella testare Ă€r det enklare för dem ocksĂ„. Ni slĂ€pper en uppdatering och sĂ€ger: "Kolla, har nĂ„got gĂ„tt sönder?". De kontrollerar och sĂ€ger: "Nej, inget har gĂ„tt sönder". Eftersom testaren vet var de ska titta. Ni har en commit kopplad till ett specifikt kodstycke. Och det exponerar ett konkret beteende.
HÀr har du, förstÄs, överdrivit.
(Dmitry) HĂ€r hĂ„ller jag inte med. Det finns en praxis â testdriven utveckling som faktiskt kommer att rĂ€dda oss frĂ„n detta.
(Oleg) Ja, jag har inte kommit sÄ lÄngt Àn. Den första illusionen Àr att man mÄste skriva 100 % tester eller inte alls syssla med Continuous Integration. Det Àr en lögn. Det hÀr Àr tvÄ parallella praktiker. Och de Àr inte direkt beroende av varandra. Ert testtÀcke bör vara optimalt. Optimalt betyder att ni sjÀlva Àr sÀkra pÄ att den kvalitet av huvudkoden som kvarstÄr efter er commit tillÄter er att trycka pÄ knappen "Deploy" pÄ fredag kvÀll, Àven om ni Àr berusade. Hur uppnÄr ni detta? Genom granskningar, genom tÀckning, genom bra övervakning.
Bra övervakning Ă€r inte skillnad frĂ„n tester. Om ni kör tester en gĂ„ng pĂ„ pre-prod, sĂ„ kontrollerar de era anvĂ€ndarscenarier en gĂ„ng och sĂ„ enkelt Ă€r det. Men om ni kör dem i en oĂ€ndlig slinga, dĂ„ Ă€r det ert utbyggda övervakningssystem som testar allt oĂ€ndligt â om det har kraschat eller inte. I detta fall Ă€r skillnaden bara i engĂ„ngs- eller flergĂ„ngskörning. En mycket bra uppsĂ€ttning tester..., som körs oĂ€ndligt, Ă€r övervakning. Och korrekt övervakning bör vara sĂ„.
Och dÀrför, hur ni exakt ska nÄ detta tillstÄnd dÀr ni kan deploya pÄ fredag kvÀll och gÄ hem Àr en annan frÄga. Kanske Àr ni helt enkelt en modig idiot.
LÄt oss gÄ tillbaka lite till Continuous Integration. Vi har avvikit nÄgot till en annan komplex praktik.
Och den andra illusionen Àr att MVP sÀgs vara nÄgot man mÄste göra snabbt, sÄ tester behövs överhuvudtaget inte. Det Àr inte riktigt sÄ. Faktum Àr att nÀr du skriver en user story i MVP, sÄ kan du utveckla den antingen helt pÄ mÄfÄ, dvs. du hör att det finns en viss user story och springer direkt för att koda den, eller arbeta enligt TDD. Och enligt TDD, som erfarenheten visar, tar det inte lÀngre tid, dvs. tester Àr en bieffekt. TDD-praktiken handlar inte om att testa. Trots namnet Test Driven Development handlar det överhuvudtaget inte om tester. Det Àr mer en arkitekturmetod. Det handlar om att skriva det som verkligen behövs och inte skriva det som inte behövs. Denna praktik fokuserar pÄ nÀsta iteration av dina tankar nÀr det gÀller att skapa applikationens arkitektur.
SÄ det Àr inte sÄ enkelt att bli av med dessa illusioner. MVP och tester motsÀger inte varandra. Snarare tvÀrtom, om du gör MVP enligt TDD-praktiken, kommer du att göra det bÀttre och snabbare Àn om du gör det helt utan praktik och pÄ mÄfÄ.
Det Àr en vÀldigt otydlig och komplex tanke. NÀr du hör att nu ska jag skriva ytterligare tester och samtidigt kommer jag att göra nÄgot snabbare, lÄter det helt orealistiskt.
(Dmitrij) MÄnga nÀr de pratar om MVP, det Àr bara för att folk Àr för lata för att skriva nÄgot bra. Och det Àr verkligen tvÄ olika saker. Man bör inte förvandla MVP till nÄgot dÄligt som inte fungerar.
Ja, du har rÀtt.
Och plötsligt Àr MVP i produktion.
För alltid.
Och TDD lÄter vÀldigt ovanligt nÀr man hör att du skriver tester och verkar göra mer arbete. Det lÄter vÀldigt konstigt, men faktiskt gör det att det gÄr snabbare och ser bÀttre ut. NÀr du skriver ett test tÀnker du redan mycket pÄ vilken kod och hur den kommer att kallas, samt vilket beteende vi förvÀntar oss av den. Du sÀger inte bara att jag har skrivit en funktion och den gör nÄgot. Du tÀnker först pÄ att den har vissa villkor, den kommer att kallas pÄ ett visst sÀtt. Du tÀcker det med tester och frÄn det förstÄr du hur dina grÀnssnitt i din kod kommer att se ut. Det pÄverkar verkligen arkitekturen. Din kod blir automatiskt mer modulÀr, eftersom du först försöker förstÄ hur du kommer att testa den, och först dÀrefter skriver du den.
Jag hade det sÄ med TDD att jag vid ett tillfÀlle anlitade en mentor i Ruby nÀr jag fortfarande var Ruby-programmerare. Och han sa: "LÄt oss göra det med TDD." Jag tÀnkte: "à h nej, jag mÄste skriva nÄgot extra nu." Vi kom överens om att jag skulle skriva all fungerande kod pÄ Python med TDD under tvÄ veckor. Efter tvÄ veckor insÄg jag att jag aldrig ville gÄ tillbaka. Genom att försöka tillÀmpa det överallt under tvÄ veckor förstod jag hur mycket enklare det blev att tÀnka. Men det Àr inte uppenbart, sÄ jag rekommenderar till alla att om ni kÀnner att TDD Àr svÄrt, lÄngsamt och överflödigt, försök att hÄlla pÄ med det i tvÄ veckor. För mig rÀckte det med tvÄ.
(Dmitrij) Vi kan utveckla den hÀr tanken utifrÄn infrastrukturen. Innan vi sÀtter igÄng nÄgot nytt gör vi en övervakning och dÀrefter sÀtter vi igÄng. I det hÀr fallet blir övervakningen ett normalt test. Och det finns utveckling genom övervakning. Men nÀstan alla sÀger att det tar lÄng tid, jag orkar inte, jag gjorde ett provisoriskt utkast. Om vi gör övervakningen ordentligt, förstÄr vi tillstÄndet för CI-systemet. I CI-systemet finns mycket övervakning. Vi förstÄr systemets tillstÄnd, vi vet vad som finns inuti. Under utvecklingen bygger vi just systemet sÄ att det nÄr det önskade tillstÄndet.
Dessa metoder har lÀnge varit kÀnda. Vi diskuterade dem för fyra Är sedan. Men över fyra Är har nÀstan ingenting förÀndrats.
Men pÄ denna not vill jag avsluta den officiella diskussionen.
Video (infogad som medieelement, men av nÄgon anledning fungerar det inte):
KĂ€lla: habr.com
