Hej, Habr! Tidigare klagade jag pÄ livet i Infrastrukturen som kodparadigm och erbjöd inget för att lösa den nuvarande situationen. Idag Àr jag tillbaka för att berÀtta vilka tillvÀgagÄngssÀtt och metoder som hjÀlper dig att fly frÄn förtvivlans avgrund och styra situationen i rÀtt riktning.

I en tidigare artikel Jag delade med mig av mina intryck av detta omrÄde, försökte reflektera över den aktuella situationen inom detta omrÄde och föreslog till och med att standardpraxis som alla utvecklare kÀnner till kunde hjÀlpa. Det kan tyckas att det fanns mÄnga klagomÄl pÄ livet, men det fanns inga förslag pÄ en vÀg ut ur den nuvarande situationen.
Vilka vi Àr, var vi Àr och vilka problem vi har
Vi Àr för nÀrvarande i Sre Onboarding Team, som bestÄr av sex programmerare och tre infrastrukturingenjörer. Vi försöker alla skriva infrastruktur som kod (IaC). Vi gör detta eftersom vi i grunden vet hur man skriver kod och har en historia av att vara utvecklare "över genomsnittet".
- Vi har en uppsÀttning fördelar: en viss bakgrund, kunskap om praxis, förmÄgan att skriva kod, en vilja att lÀra sig nya saker.
- Och det finns en hÀngande del, som ocksÄ Àr ett minus: bristande kunskap om infrastrukturhÄrdvara.
Teknikstapeln vi anvÀnder i vÄr IaC.
- Terraform för att skapa resurser.
- Packare för sammansÀttning av bilder. Dessa Àr Windows, CentOS 7-bilder.
- Jsonnet för att göra en kraftfull build i drone.io, samt för att generera packer json och vÄra terraform-moduler.
- Azure.
- Ansible nÀr du förbereder bilder.
- Python för extratjÀnster och provisioneringsskript.
- Och allt detta i VSCode med plugins som delas mellan teammedlemmar.
Slutsats frÄn min var sÄ hÀr: Jag försökte ingjuta (först av allt i mig sjÀlv) optimism, jag ville sÀga att vi kommer att prova de metoder och metoder som vi kÀnner till för att hantera de svÄrigheter och komplexiteter som finns inom detta omrÄde.
Vi kÀmpar för nÀrvarande med följande IaC-problem:
- Ofullkomlighet av verktyg och medel för kodutveckling.
- LÄngsam utbyggnad. Infrastruktur Àr en del av den verkliga vÀrlden, och den kan vara lÄngsam.
- Brist pÄ tillvÀgagÄngssÀtt och praxis.
- Vi Àr nya och vet inte sÄ mycket.
Extreme programmering (XP) till undsÀttning
Alla utvecklare Àr bekanta med Extreme Programming (XP) och de metoder som ligger bakom det. MÄnga av oss har arbetat med detta tillvÀgagÄngssÀtt, och det har varit framgÄngsrikt. SÄ varför inte anvÀnda de principer och praxis som anges dÀr för att övervinna infrastrukturutmaningar? Vi bestÀmde oss för att ta detta tillvÀgagÄngssÀtt och se vad som hÀnder.
Kontrollera tillÀmpligheten av XP-metoden för din branschHÀr Àr en beskrivning av miljön som XP Àr vÀl lÀmpad för, och hur den relaterar till oss:
1. Dynamiskt förĂ€ndrade mjukvarukrav. Det stod klart för oss vad slutmĂ„let var. Men detaljerna kan variera. Vi bestĂ€mmer sjĂ€lva vart vi behöver taxi, sĂ„ kraven Ă€ndras med jĂ€mna mellanrum (frĂ€mst av oss sjĂ€lva). Om vi ââtar SRE-teamet, som gör automatiseringen sjĂ€lv, och sjĂ€lva begrĂ€nsar kraven och omfattningen av arbetet, sĂ„ passar denna punkt bra.
2. Risker orsakade av tidsbundna projekt med ny teknik. Vi kan stöta pÄ risker nÀr vi anvÀnder vissa saker som Àr okÀnda för oss. Och detta Àr 100% vÄrt fall. Hela vÄrt projekt var anvÀndningen av teknologier som vi inte var helt bekanta med. I allmÀnhet Àr detta ett konstant problem, eftersom... Det finns mÄnga nya tekniker som dyker upp inom infrastruktursektorn hela tiden.
3,4. Litet, samlokaliserat utökat utvecklingsteam. Den automatiserade tekniken du anvĂ€nder tillĂ„ter enhets- och funktionstester. Dessa tvĂ„ punkter passar oss inte riktigt. För det första Ă€r vi inte ett samordnat team, och för det andra Ă€r vi nio stycken, som kan betraktas som ett stort team. Ăven om, enligt vissa definitioner av ett "stort" team, Ă€r mycket 14+ personer.
LÄt oss titta pÄ nÄgra XP-metoder och hur de pÄverkar hastigheten och kvaliteten pÄ feedback.
XP Feedback Loop Princip
Enligt min uppfattning Àr feedback svaret pÄ frÄgan, gör jag rÀtt, ska vi dit? XP har ett gudomligt schema för detta: en tidsÄterkopplingsslinga. Det intressanta Àr att ju lÀgre vi Àr, desto snabbare kan vi fÄ OS att svara pÄ nödvÀndiga frÄgor.

Detta Àr ett ganska intressant Àmne för diskussion, att det i vÄr IT-bransch gÄr att snabbt fÄ ett OS. FörestÀll dig hur smÀrtsamt det Àr att göra ett projekt i ett halvÄr och först dÄ fÄ reda pÄ att det var ett misstag i början. Detta hÀnder i design och i alla konstruktioner av komplexa system.
I vÄrt fall med IaC hjÀlper feedback oss. Jag kommer omedelbart att göra en liten justering av diagrammet ovan: releaseplanen har inte en mÄnatlig cykel, utan sker flera gÄnger om dagen. Det finns nÄgra metoder kopplade till denna OS-cykel som vi kommer att titta pÄ mer i detalj.
Viktigt: feedback kan vara en lösning pÄ alla ovanstÄende problem. I kombination med XP-övningar kan det dra dig upp ur förtvivlans avgrund.
Hur man tar sig upp ur förtvivlans avgrund: tre övningar
Tester
Tester nÀmns tvÄ gÄnger i XP-feedbackslingan. Det Àr inte bara sÄ. De Àr extremt viktiga för hela extremprogrammeringstekniken.
Det förutsÀtts att du har enhets- och acceptanstest. Vissa ger dig feedback pÄ nÄgra minuter, andra pÄ nÄgra dagar, sÄ de tar lÀngre tid att skriva och recenseras mer sÀllan.
Det finns en klassisk testpyramid, som visar att det borde finnas fler tester.

Hur gÀller detta ramverk för oss i ett IaC-projekt? Egentligen... inte alls.
- Enhetstester kan, trots att det borde finnas mÄnga, inte bli för mÄnga. Eller sÄ testar de nÄgot vÀldigt indirekt. Vi kan faktiskt sÀga att vi inte skriver dem alls. Men hÀr Àr nÄgra applikationer för sÄdana tester som vi kunde göra:
- Testar jsonnet-koden. Det hÀr Àr till exempel vÄr drönarrörledning, som Àr ganska komplicerad. Jsonnet-koden tÀcks vÀl av tester.
Vi anvÀnder detta . - Testar för skript som körs nÀr resursen startar. Skript skrivs i Python, och dÀrför kan test skrivas pÄ dem.
- Testar jsonnet-koden. Det hÀr Àr till exempel vÄr drönarrörledning, som Àr ganska komplicerad. Jsonnet-koden tÀcks vÀl av tester.
- Det Àr potentiellt möjligt att kontrollera konfigurationen i tester, men det gör vi inte. Det Àr ocksÄ möjligt att konfigurera regler för kontrollresurskonfiguration via . Dock Àr kontrollerna dÀr helt enkelt för grundlÀggande för terraform, men mÄnga testskript Àr skrivna för AWS. Och vi Àr pÄ Azure, sÄ det hÀr gÀller inte igen.
- Komponentintegreringstester: det beror pÄ hur du klassificerar dem och var du placerar dem. Men de fungerar i princip.
SÄ hÀr ser integrationstester ut.

Detta Àr ett exempel nÀr man bygger bilder i Drone CI. För att nÄ dem mÄste du vÀnta 30 minuter tills Packer-bilden bildas och sedan vÀnta ytterligare 15 minuter för att de ska passera. Men de finns!Bildverifieringsalgoritm
- Packer mÄste först förbereda bilden helt.
- Bredvid testet finns en terraform med en lokal stat, som vi anvÀnder för att distribuera den hÀr bilden.
- Vid utfÀllning anvÀnds en liten modul som ligger i nÀrheten för att göra det lÀttare att arbeta med bilden.
- NÀr den virtuella datorn har distribuerats frÄn bilden kan kontroller pÄbörjas. I princip utförs kontroller med bil. Den kontrollerar hur skripten fungerade vid start och hur demonerna fungerar. För att göra detta loggar vi via ssh eller winrm in pÄ den nyligen upphöjda maskinen och kontrollerar konfigurationsstatus eller om tjÀnsterna Àr uppe.
- Situationen Àr liknande med integrationstester i moduler för terraform. HÀr Àr en kort tabell som förklarar funktionerna i sÄdana tester.

Feedback pÄ pipeline Àr cirka 40 minuter. Allt hÀnder under vÀldigt lÄng tid. Det kan anvÀndas för regression, men för nyutveckling Àr det i allmÀnhet orealistiskt. Om du Àr vÀldigt, vÀldigt förberedd pÄ detta, förbered körande skript, dÄ kan du minska det till 10 minuter. Men dessa Àr fortfarande inte enhetstester, som gör 5 stycken pÄ 100 sekunder.
FrÄnvaron av enhetstester vid sammansÀttning av bilder eller terraform-moduler uppmuntrar till att flytta arbetet till separata tjÀnster som helt enkelt kan köras via REST, eller till Python-skript.
Vi behövde till exempel se till att nÀr den virtuella maskinen startar registrerar den sig sjÀlv i tjÀnsten , och nÀr den virtuella maskinen förstördes tog den bort sig sjÀlv.
Eftersom vi har ScaleFT som tjÀnst Àr vi tvungna att arbeta med den via API:et. Det stod ett omslag skrivet dÀr som man kunde dra och sÀga: "GÄ in och radera det och det." Den lagrar alla nödvÀndiga instÀllningar och Ätkomster.
Vi kan redan skriva normala tester för detta, eftersom det inte skiljer sig frÄn vanlig programvara: nÄgon form av apiha hÄnas, du drar den och ser vad som hÀnder.

Resultat av testerna: Enhetstestning, som borde ge OS pÄ en minut, ger det inte. Och typer av tester högre upp i pyramiden Àr effektiva, men tÀcker bara en del av problemen.
Parprogrammering
Tester Àr förstÄs bra. Du kan skriva mÄnga av dem, de kan vara av olika slag. De kommer att arbeta pÄ sina nivÄer och ge oss feedback. Men problemet med dÄliga enhetstester, som ger det snabbaste operativsystemet, kvarstÄr. Samtidigt vill jag fortfarande ha ett snabbt OS som Àr lÀtt och trevligt att arbeta med. För att inte tala om kvaliteten pÄ den resulterande lösningen. Lyckligtvis finns det tekniker som kan ge Ànnu snabbare Äterkoppling Àn enhetstester. Detta Àr parprogrammering.
NÀr du skriver kod vill du fÄ feedback pÄ dess kvalitet sÄ snabbt som möjligt. Ja, du kan skriva allt i en funktionsgren (för att inte bryta nÄgot för nÄgon), göra en pull-förfrÄgan i Github, tilldela den till nÄgon vars Äsikt har vikt och vÀnta pÄ svar.
Men du kan vĂ€nta lĂ€nge. MĂ€nniskor Ă€r alla upptagna, och svaret, Ă€ven om det finns ett, kanske inte Ă€r av högsta kvalitet. Anta att svaret kom direkt, recensenten förstod omedelbart hela idĂ©n, men svaret kommer fortfarande sent, i efterhand. Jag önskar att det var tidigare. Det Ă€r detta som parprogrammering syftar till â direkt, i skrivande stund.
Nedan Àr parprogrammeringsstilarna och deras tillÀmpbarhet vid arbete med IaC:
1. Klassisk, Erfaren+Erfaren, skift för timer. TvĂ„ roller â förare och navigatör. TvĂ„ personer. De arbetar pĂ„ samma kod och byter roller efter en viss förutbestĂ€md tidsperiod.
LÄt oss övervÀga kompatibiliteten för vÄra problem med stil:
- Problem: ofullkomlighet i verktyg och verktyg för kodutveckling.
Negativ pÄverkan: det tar lÀngre tid att utvecklas, vi saktar ner, takten/rytmen i arbetet tappas.
Hur vi kÀmpar: vi anvÀnder ett annat verktyg, en gemensam IDE och lÀr oss ocksÄ genvÀgar. - Problem: LÄngsam distribution.
Negativ effekt: ökar tiden det tar att skapa en fungerande kod. Vi blir uttrÄkade medan vi vÀntar, hÀnderna strÀcker sig ut för att göra nÄgot annat medan vi vÀntar.
Hur vi slÄss: vi övervann det inte. - Problem: brist pÄ tillvÀgagÄngssÀtt och praxis.
Negativ pÄverkan: det finns ingen kunskap om hur man gör det bra och hur man gör det dÄligt. FörlÀnger mottagandet av feedback.
Hur vi kÀmpar: ömsesidigt utbyte av Äsikter och metoder i pararbete löser nÀstan problemet.
Det största problemet med att anvÀnda denna stil i IaC Àr den ojÀmna arbetstakten. I traditionell mjukvaruutveckling har man en vÀldigt enhetlig rörelse. Du kan spendera fem minuter och skriva N. Spendera 10 minuter och skriv 2N, 15 minuter - 3N. HÀr kan du spendera fem minuter och skriva N, och sedan spendera ytterligare 30 minuter och skriva en tiondel av N. HÀr vet du ingenting, du har fastnat, dum. Utredningen tar tid och distraherar frÄn sjÀlva programmeringen.
Slutsats: i sin rena form Àr den inte lÀmplig för oss.
2. Ping-pong. Detta tillvÀgagÄngssÀtt innebÀr att en person skriver testet och en annan gör implementeringen för det. Med tanke pÄ att allt Àr komplicerat med Unit-tester, och du mÄste skriva ett integrationstest som tar lÄng tid att programmera, försvinner all lÀtthet med pingis.
Jag kan sÀga att vi försökte separera ansvar för att designa ett testskript och implementera kod för det. En deltagare kom pÄ manuset, i den hÀr delen av arbetet var han ansvarig, han hade sista ordet. Och den andra ansvarade för genomförandet. Det gick bra. Kvaliteten pÄ manuset med detta tillvÀgagÄngssÀtt ökar.
Slutsats: tyvÀrr tillÄter inte arbetstakten anvÀndningen av pingis som parprogrammering i IaC.
3. Stark stil. . Tanken Àr att en deltagare blir direktivnavigator och den andra tar rollen som avrÀttningsförare. I detta fall Ävilar rÀtten att fatta beslut uteslutande navigatören. Föraren skriver bara ut och kan pÄverka vad som hÀnder med ett ord. Rollerna förÀndras inte pÄ lÀnge.
Bra för att lÀra, men krÀver starka mjuka fÀrdigheter. Det var hÀr vi vacklade. Tekniken var svÄr. Och det handlar inte ens om infrastruktur.
Slutsats: det kan potentiellt anvÀndas, vi ger inte upp att försöka.
4. Mobbing, svÀrmande och alla kÀnda men inte listade stilar Vi anser det inte, eftersom Vi har inte provat det och det Àr omöjligt att prata om det i samband med vÄrt arbete.
AllmÀnna resultat om anvÀndning av parprogrammering:
- Vi har en ojÀmn arbetstakt, vilket Àr förvirrande.
- Vi stötte pÄ otillrÀckligt bra mjuka fÀrdigheter. Och ÀmnesomrÄdet hjÀlper inte till att övervinna dessa brister hos oss.
- LÄnga tester och problem med verktyg gör parad utveckling svÄr.
5. Trots detta blev det framgÄngar. Vi kom pÄ vÄr egen metod "Convergence - Divergence". Jag ska kort beskriva hur det fungerar.
Vi har fasta partners under nÄgra dagar (mindre Àn en vecka). Vi gör en uppgift tillsammans. Vi sitter tillsammans en stund: en skriver, den andre sitter och tittar pÄ supportteamet. Sedan skingras vi under en tid, var och en gör nÄgra oberoende saker, sedan kommer vi samman igen, synkroniserar vÀldigt snabbt, gör nÄgot tillsammans och skingras igen.
Planering och kommunikation
Det sista blocket av praxis genom vilket OS-problem löses Àr organisationen av arbetet med sjÀlva uppgifterna. Detta inkluderar Àven erfarenhetsutbyte som ligger utanför pararbete. LÄt oss titta pÄ tre metoder:
1. MÄl genom mÄltrÀdet. Vi organiserade den övergripande ledningen av projektet genom ett trÀd som gÄr oÀndligt in i framtiden. Tekniskt sett görs spÄrningen i Miro. Det finns en uppgift - det Àr ett delmÄl. FrÄn det gÄr antingen mindre mÄl eller grupper av uppgifter. SjÀlva uppgifterna kommer frÄn dem. Alla uppgifter skapas och underhÄlls pÄ denna tavla.

Det hÀr schemat ger ocksÄ feedback, vilket sker en gÄng om dagen nÀr vi synkroniserar pÄ rallyn. Att ha en gemensam plan inför alla, men strukturerad och helt öppen, gör att alla kan vara medvetna om vad som hÀnder och hur lÄngt vi kommit.
Fördelar med visuell syn pÄ uppgifter:
- Kausalitet. Varje uppgift leder till nÄgot globalt mÄl. Uppgifterna grupperas i mindre mÄl. InfrastrukturdomÀnen i sig Àr ganska teknisk. Det Àr inte alltid omedelbart klart vilken specifik pÄverkan, till exempel att skriva en runbook vid migrering till en annan nginx, har pÄ verksamheten. Att ha mÄlkortet i nÀrheten gör det tydligare.

Kausalitet Àr en viktig egenskap hos problem. Det svarar direkt pÄ frÄgan: "Gör jag rÀtt?" - Parallellism. Vi Àr nio, och det Àr helt enkelt fysiskt omöjligt att kasta alla pÄ en uppgift. Uppgifter frÄn ett omrÄde kanske inte heller alltid rÀcker. Vi tvingas parallellisera arbetet mellan smÄ arbetsgrupper. Samtidigt sitter grupperna pÄ sin uppgift en tid, de kan förstÀrkas av nÄgon annan. Ibland faller mÀnniskor bort frÄn denna arbetsgrupp. NÄgon Äker pÄ semester, nÄgon gör en rapport för DevOps-konferensen, nÄgon skriver en artikel om Habr. Att veta vilka mÄl och uppgifter som kan göras parallellt blir vÀldigt viktigt.
2. ErsĂ€ttande föredragshĂ„llare av morgonmöten. PĂ„ stand-ups har vi det hĂ€r problemet â mĂ€nniskor gör mĂ„nga uppgifter parallellt. Ibland Ă€r uppgifter löst sammankopplade och det finns ingen förstĂ„else för vem som gör vad. Och Ă„sikten frĂ„n en annan lagmedlem Ă€r mycket viktig. Detta Ă€r ytterligare information som kan förĂ€ndra hur problemet ska lösas. SjĂ€lvklart brukar det vara nĂ„gon med dig, men rĂ„d och tips Ă€r alltid anvĂ€ndbara.
För att förbÀttra denna situation anvÀnde vi tekniken "Changing the Leading Stand-Up". Nu roteras de enligt en viss lista, och det har sin effekt. NÀr det Àr din tur tvingas du dyka in och förstÄ vad som hÀnder för att kunna köra ett bra Scrum-möte.

3. Intern demo. HjÀlp med att lösa ett problem frÄn parprogrammering, visualisering pÄ problemtrÀdet och hjÀlp vid scrummöten pÄ morgonen Àr bra, men inte idealiskt. Som ett par begrÀnsas ni bara av er kunskap. UppgiftstrÀdet hjÀlper till att globalt förstÄ vem som gör vad. Och presentatören och kollegorna pÄ morgonmötet kommer inte att dyka djupt in i dina problem. De kanske missar nÄgot.
Lösningen fann man genom att demonstrera det utförda arbetet för varandra och sedan diskutera det. Vi trÀffas en gÄng i veckan under en timme och visar detaljer om lösningar pÄ uppgifter vi gjort den senaste veckan.
Under demonstrationen Àr det nödvÀndigt att avslöja detaljerna i uppgiften och se till att demonstrera dess funktion.
Rapporten kan göras med hjÀlp av en checklista.1. GÄ in i sammanhanget. Var kom uppdraget ifrÄn, varför var det ens nödvÀndigt?
2. Hur löstes problemet innan? Till exempel krÀvdes massiva musklick, eller sÄ var det omöjligt att göra nÄgonting alls.
3. Hur vi förbÀttrar det. Till exempel: "Titta, nu finns det scriptosik, hÀr Àr readme."
4. Visa hur det fungerar. Det Àr tillrÄdligt att direkt implementera nÄgot anvÀndarscenario. Jag vill ha X, jag gör Y, jag ser Y (eller Z). Till exempel distribuerar jag NGINX, röker webbadressen och fÄr 200 OK. Om ÄtgÀrden Àr lÄng, förbered den i förvÀg sÄ att du kan visa den senare. Det Àr tillrÄdligt att inte bryta det för mycket en timme före demot, om det Àr ömtÄligt.
5. Förklara hur framgÄngsrikt problemet löstes, vilka svÄrigheter kvarstÄr, vad som inte Àr slutfört, vilka förbÀttringar som Àr möjliga i framtiden. Till exempel nu CLI, dÄ blir det full automatisering i CI.
Det Àr lÀmpligt för varje högtalare att hÄlla det till 5-10 minuter. Om ditt tal uppenbarligen Àr viktigt och kommer att ta lÀngre tid, samordna detta i förvÀg i sre-takeover-kanalen.
Efter öga mot öga-delen Àr det alltid en diskussion i trÄden. Det Àr hÀr den feedback vi behöver pÄ vÄra uppgifter visas.

Som ett resultat görs en undersökning för att faststÀlla nyttan av det som hÀnder. Detta Àr feedback pÄ talets kÀrna och uppgiftens betydelse.

LÄnga slutsatser och vad som hÀnder hÀrnÀst
Det kan tyckas att tonen i artikeln Àr nÄgot pessimistisk. Detta Àr fel. TvÄ lÀgre nivÄer av feedback, nÀmligen tester och parprogrammering, fungerar. Inte lika perfekt som i traditionell utveckling, men det finns en positiv effekt av det.
Tester, i sin nuvarande form, ger endast delvis kodtÀckning. MÄnga konfigurationsfunktioner hamnar oprövade. Deras inflytande pÄ sjÀlva arbetet nÀr man skriver kod Àr lÄgt. Det finns dock en effekt frÄn integrationstester, och de lÄter dig oförskrÀckt utföra omfaktoreringar. Detta Àr en stor prestation. Dessutom, med förskjutningen av fokus till utveckling pÄ högnivÄsprÄk (vi har python, go), försvinner problemet. Och du behöver inte mÄnga kontroller för "limmet"; en allmÀn integrationskontroll rÀcker.
Att arbeta i par beror mer pÄ specifika personer. DÀr finns uppgiftsfaktorn och vÄra mjuka fÀrdigheter. Med vissa mÀnniskor fungerar det mycket bra, med andra fungerar det sÀmre. Det finns definitivt fördelar med detta. Det Àr tydligt att Àven om reglerna för pararbete inte följs tillrÀckligt, har sjÀlva det faktum att man utför uppgifter tillsammans en positiv effekt pÄ kvaliteten pÄ resultatet. Personligen tycker jag att det Àr lÀttare och roligare att arbeta i par.
SÀtt pÄ högre nivÄ att pÄverka OS - planering och arbete med uppgifter ger precis effekter: högkvalitativt kunskapsutbyte och förbÀttrad utvecklingskvalitet.
Korta slutsatser pÄ en rad
- HR-utövare arbetar i IaC, men med mindre effektivitet.
- StÀrk det som fungerar.
- Kom pÄ dina egna kompensationsmekanismer och metoder.
KĂ€lla: will.com



