Tester pÄ produktion: Canary Deployment

Kanarie Ă€r en liten fĂ„gel som stĂ€ndigt sjunger. Dessa fĂ„glar Ă€r kĂ€nsliga för metan och kolmonoxid. Även vid en lĂ„g koncentration av överflödiga gaser i luften förlorar de medvetandet eller dör. GuldgrĂ€vare och gruvarbetare tog med sig fĂ„glar: sĂ„ lĂ€nge kanariefĂ„glar sjunger kan man arbeta, om de tystnar – finns det gas i gruvan och det Ă€r dags att gĂ„. Gruvarbetare offrade den lilla fĂ„geln för att kunna ta sig ut ur gruvan vid liv.

Tester pÄ produktion: Canary Deployment

En liknande praxis har ocksÄ hittat in i IT. Till exempel i den standardiserade uppgiften att deployera en ny version av en tjÀnst eller applikation i produktion efter testning. Testmiljön kan vara för dyr, automatiserade tester tÀcker inte allt som man önskar, och att inte testa och offra kvalitet Àr riskabelt. Just i sÄdana fall hjÀlper metoden Canary Deployment, dÀr en liten del av verklig produktionstrafik slÀpps pÄ den nya versionen. Detta tillvÀgagÄngssÀtt hjÀlper att sÀkert kontrollera den nya versionen i produktion, genom att offra lite för en stor mÄlsÀttning. Mer om hur metoden fungerar, vad den Àr bra för och hur den kan implementeras, kommer att berÀttas av Andrey Markelov (Andrey_V_Markelov), med exemplet frÄn implementeringen pÄ företaget Infobip.

Andrey Markelov — ledande ingenjör-programmerare pĂ„ Infobip, har arbetat med utveckling av applikationer i Java inom finans och telekommunikation i 11 Ă„r. Utvecklar Open Source-produkter, deltar aktivt i Atlassian Community och skriver plugins för Atlassians produkter. Evangelist för Prometheus, Docker och Redis.

Spela video

Om företaget Infobip

Detta Àr en global telekommunikationsplattform som gör det möjligt för banker, detaljhandeln, e-handelsföretag och transportföretag att skicka meddelanden till sina kunder via SMS, push, e-post och röstmeddelanden. I en sÄdan verksamhet Àr stabilitet och tillförlitlighet viktiga för att kunderna ska fÄ sina meddelanden i tid.

IT-infrastrukturen hos Infobip i siffror:

  • 15 datacenter runt om i vĂ€rlden;
  • 500 unika tjĂ€nster i drift;
  • 2500 instanser av tjĂ€nster, vilket Ă€r mycket mer Ă€n antalet team;
  • 4,5 TB mĂ„natlig trafik;
  • 4,5 miljarder telefonnummer;

Verksamheten vĂ€xer, och med den antalet release. Vi genomför cirka 60 releaser per dag, eftersom kunderna vill ha fler funktioner och kapacitet. Men det Ă€r svĂ„rt – det finns mĂ„nga tjĂ€nster och fĂ„ team. Vi mĂ„ste snabbt skriva kod som ska fungera i produktion utan fel.

Releaser

En typisk release gÄr till sÄ hÀr. Till exempel finns tjÀnsterna A, B, C, D och E, dÀr varje utvecklas av ett separat team.

Tester pÄ produktion: Canary Deployment

Vid nÄgot tillfÀlle bestÀmmer sig teamet för tjÀnst A för att deploya en ny version, men teamen för tjÀnsterna B, C, D och E Àr inte medvetna om det. Det finns tvÄ alternativ för hur teamet för tjÀnst A kan agera.

De kommer att genomföra en inkrementell release: först byta ut en version och sedan den andra.

Tester pÄ produktion: Canary Deployment

Men det finns ett andra alternativ: teamet hittar ytterligare resurser och maskiner, deployar den nya versionen och sedan switchar de routern sÄ att versionen börjar fungera i produktion.

Tester pÄ produktion: Canary Deployment

Oavsett alternativ kommer det nĂ€stan alltid att uppstĂ„ problem efter deployment, Ă€ven om versionen har testats. Man kan testa manuellt, automatiserat eller hoppa över testningen — problem kommer att uppstĂ„ oavsett. Det enklaste och mest korrekta sĂ€ttet att lösa dem Ă€r att rulla tillbaka till en fungerande version. Sedan kan vi ta hand om skadorna, orsakerna och Ă„tgĂ€rda dem.

SĂ„ vad vill vi?

Vi vill inte ha problem. Om kunder upptÀcker dem snabbare Àn vi, kommer det att skada vÄrt rykte. DÀrför mÄste vi finnas problem snabbare Àn vÄra kunder.Genom att arbeta proaktivt minimerar vi skadorna.

Samtidigt vill vi snabba upp deployment, sĂ„ att det sker snabbt, enkelt, naturligt och utan stress frĂ„n teamet. Ingenjörer, DevOps-ingenjörer och programmerare mĂ„ste tas om hand — releasen av en ny version Ă€r stressande. Teamet Ă€r inte en förbrukningsvara, vi strĂ€var efter att anvĂ€nda mĂ€nskliga resurser rationellt..

Deploymentsproblem

Kundtrafiken Ă€r oförutsĂ€gbar.Det Ă€r omöjligt att förutsĂ€ga nĂ€r kundtrafiken kommer att vara minimal. Vi vet inte var och nĂ€r kunderna pĂ„börjar sina kampanjer — kanske ikvĂ€ll i Indien och imorgon i Hongkong. Med hĂ€nsyn till den stora tidskillnaden garanterar en deployment Ă€ven klockan 02:00 inte att kunderna inte kommer att pĂ„verkas.

Leverantörsproblem.MeddelandetjÀnster och leverantörer Àr vÄra partners. Ibland har de driftstörningar som orsakar fel under deployment av nya versioner.

Distribuerade team.Team som utvecklar frontend och backend Àr belÀgna i olika tidszoner. PÄ grund av detta kan de ofta inte enas sinsemellan.

Datacenter kan inte replikeras i staging.I ett datacenter finns det 200 stativ — att replikera det i en sandlĂ„da Ă€r nĂ€stan omöjligt.

Nertid timesÀr oacceptabla! Vi har en acceptabel tillgÀnglighetsnivÄ (Error Budget) nÀr vi arbetar 99,99 % av tiden, och de resterande procenten Àr 'fehlerÀtt'. Att nÄ 100 % pÄlitlighet Àr omöjligt, men det Àr viktigt att stÀndigt övervaka nedtider och avbrott.

Klassiska lösningar

Att skriva kod utan buggar. NÀr jag var ung utvecklare kom chefer till mig med önskan att göra en release utan buggar, men det Àr inte alltid möjligt.

Att skriva tester. Tester fungerar, men ibland inte riktigt som företaget vill. Att tjÀna pengar Àr inte testernas uppgift.

Testa pÄ stage. Under mina 3,5 Är pÄ Infobip har jag aldrig sett att stage status faktiskt delvis matchar produktionen.

Tester pÄ produktion: Canary Deployment

Vi försökte till och med utveckla denna idĂ©: först hade vi en stage, sedan preproduktion, och sedan preproduktion av preproduktionsversionen. Men det hjĂ€lpte inte heller — de matchade inte ens i kapacitet. Med stage kan vi garantera grundlĂ€ggande funktionalitet, men vi vet inte hur den kommer att fungera under belastningar.

Det Àr den som utvecklade som gör releasen. Detta Àr en bra praxis: Àven om nÄgon Àndrar namnet pÄ en kommentar, lÀggs det omedelbart till i produktionen. Det hjÀlper till att utveckla ansvar och att inte glömma de Àndringar som gjorts.

Det finns ocksÄ ytterligare svÄrigheter. För utvecklaren Àr det stressande att spendera mycket tid pÄ att kontrollera allt manuellt.

Överenskomna releaser. Denna lösning föreslĂ„s vanligtvis av ledningen: 'LĂ„t oss komma överens om att ni varje dag ska testa och lĂ€gga till nya versioner'. Det funkar inte: det finns alltid ett team som vĂ€ntar pĂ„ att alla andra ska bli klara eller tvĂ€rtom.

Smoke-tester

Ett annat sÀtt att lösa vÄra problem med deployment. LÄt oss titta pÄ hur smoke-tester fungerar i exemplet nÀr team A vill implementera en ny version.

Först implementerar teamet en instans i produktion. Meddelanden i instansen frÄn mocks imiterar verklig trafik, sÄ att det matchar den normala dagliga trafiken. Om allt fungerar bra, vÀxlar teamet till den nya versionen för verklig trafik.

Tester pÄ produktion: Canary Deployment

Ett annat alternativ Àr att implementera med extra hÄrdvara. Teamet testar den i produktion, byter sedan och allt fungerar.

Tester pÄ produktion: Canary Deployment

Nackdelar med smoke-tester:

  • Man kan inte lita pĂ„ tester. Var kan man fĂ„ samma trafik som i produktion? Man kan anvĂ€nda gĂ„rdagens eller veckogammal trafik, men de stĂ€mmer inte alltid överens med den aktuella.
  • SvĂ„rt att underhĂ„lla. Man mĂ„ste underhĂ„lla testkonton, stĂ€ndigt Ă„terstĂ€lla dem inför varje deployment nĂ€r aktiva poster skickas till lagret. Det Ă€r svĂ„rare Ă€n att skriva ett test i sin egen sandlĂ„da.

Den enda bonusen hÀr Àr att man kan kontrollera prestanda.

Canary-releaser

PÄ grund av nackdelarna med smoke-tester började vi anvÀnda canary-releaser.

Praktiker, liknande hur gruvarbetare anvĂ€nde kanariefĂ„glar för att indikera gasnivĂ„er, har ocksĂ„ hittat sin plats inom IT. Vi slĂ€pper in lite riktig produktionstrafik till den nya versionen, samtidigt som vi försöker hĂ„lla oss inom Service Level Agreement (SLA). SLA Ă€r vĂ„r "rĂ€tt till fel" som vi kan anvĂ€nda en gĂ„ng om Ă„ret (eller under nĂ„gon annan tidsperiod). Om allt gĂ„r bra, lĂ€gger vi till mer trafik. Om inte – vi Ă„terstĂ€ller tidigare versioner.

Tester pÄ produktion: Canary Deployment

Implementering och detaljer

Hur implementerade vi canary-releaser? Till exempel, en grupp kunder skickar meddelanden via vÄr tjÀnst.

Tester pÄ produktion: Canary Deployment

Deployment gÄr till sÄ hÀr: vi tar bort en nod frÄn lastbalanseraren (1), Àndrar version (2) och slÀpper separerat in lite trafik (3).

Tester pÄ produktion: Canary Deployment

Överlag kommer alla i gruppen att bli nöjda, Ă€ven om en anvĂ€ndare Ă€r missnöjd. Om allt gĂ„r bra – Ă€ndrar vi alla versioner.

Tester pÄ produktion: Canary Deployment

Jag visar schematiskt hur det ser ut för mikrotjÀnster i de flesta fall.

Det finns Service Discovery och ytterligare tvÄ tjÀnster: S1N1 och S2. Den första tjÀnsten (S1N1) meddelar Service Discovery nÀr den startar, och Service Discovery kommer ihÄg den. Den andra tjÀnsten med tvÄ noder (S2N1 och S2N2) meddelar ocksÄ Service Discovery vid start.

Tester pÄ produktion: Canary Deployment

Den andra tjÀnsten fungerar för den första som en server. Den första begÀr information om sina servrar frÄn Service Discovery, och nÀr den fÄr den, letar och kontrollerar den dem ("health check"). NÀr den har kontrollerat skickar den meddelanden till dem.

NÀr nÄgon vill deploya en ny version av den andra tjÀnsten, meddelar den Service Discovery att den andra noden kommer att vara en canary-nod: den kommer att fÄ mindre trafik eftersom en deployment kommer att Àga rum. Vi tar bort canary-noden frÄn lastbalanseraren och den första tjÀnsten skickar ingen trafik dit.

Tester pÄ produktion: Canary Deployment

Vi Ă€ndrar version och Service Discovery vet att den andra noden nu Ă€r en canary — den kan ges en lĂ€gre belastning (5 %). Om allt gĂ„r bra uppdaterar vi versionen, Ă„terstĂ€ller belastningen och fortsĂ€tter arbeta.

För att genomföra allt detta behöver vi:

  • lastbalansering;
  • övervakning, eftersom det Ă€r viktigt att veta vad varje anvĂ€ndare förvĂ€ntar sig och hur vĂ„ra tjĂ€nster fungerar i detalj;
  • versionsanalys, för att förstĂ„ hur bra den nya versionen kommer att fungera i produktion;
  • som möjliggör snabbare testning, distribution och leverans av ny funktionalitet till anvĂ€ndarna. Till exempel skapas det i alla vĂ„ra projekt automatiskt en CI-pipeline vid varje commit. I den byggs en avbild, testas, distribueras till olika Kubernetes-miljöer för felsökning och vidare kontroller, och om allt gĂ„r bra - nĂ„r förĂ€ndringarna slutligen anvĂ€ndaren. Detta Ă€r inte lĂ€ngre raketvetenskap, utan en vanlig företeelse för mĂ„nga - förmodligen Ă€ven för dig, eftersom du lĂ€ser denna artikel. — vi skriver sekvensen för distribution (deployment pipeline).

Tester pÄ produktion: Canary Deployment

Lastbalansering

Detta Àr det första vi mÄste tÀnka pÄ. Det finns tvÄ strategier för lastbalansering.

Det enklaste alternativet, nÀr en nod alltid Àr en canary. Denna nod fÄr alltid mindre trafik och vi börjar distributionen med den. Vid problem kommer vi att jÀmföra dess prestanda före och under distributionen. Till exempel, om antalet fel har fördubblats, sÄ har Àven skadan ökat med detsamma.

Canary-noden definieras under distributionsprocessen. NÀr distributionen Àr klar och vi tar bort canary-statusen frÄn den, kommer trafikbalansen att ÄterstÀllas. Med fÀrre maskiner fÄr vi en rÀttvis fördelning.

Övervakning

Fundamentet för canary-releaser. Vi mÄste förstÄ exakt varför vi gör detta och vilka mÀtvÀrden vi vill samla in.

Exempel pÄ mÀtvÀrden som vi samlar in frÄn vÄra tjÀnster.

  • Antalet fel, som skrivs i loggar. Detta Ă€r en uppenbar indikator pĂ„ att allt fungerar som det ska. Generellt Ă€r detta en bra mĂ€tning.
  • Svarstider (latens). Denna mĂ€tning övervakas av alla eftersom alla vill arbeta snabbt.
  • Köstorlek (genomströmning).
  • Antalet framgĂ„ngsrika svar per sekund.
  • Den genomsnittliga svarstiden för 95 % av alla förfrĂ„gningar.
  • AffĂ€rsmĂ€tningar: hur mycket pengar verksamheten tjĂ€nar under en viss period eller anvĂ€ndartapp. Dessa mĂ€tvĂ€rden kan vara viktigare för vĂ„r nya version Ă€n de som ingenjörer lĂ€gger till.

Exempel pÄ mÀtvÀrden i de flesta populÀra övervakningssystem.

Counter. Detta Àr en viss ökande kvantitet, till exempel antalet fel. Denna mÀtning Àr enkel att interpolera och studera grafen: igÄr var det 2 fel, men idag 500, vilket innebÀr att nÄgot har gÄtt fel.

Antalet fel per minut eller per sekund Àr en avgörande indikator som kan berÀknas med hjÀlp av Counter. Dessa uppgifter ger en klar bild av systemets prestanda över tid. Vi ska titta pÄ grafen för antalet fel per sekund för tvÄ versioner av produktionssystemet.

Tester pÄ produktion: Canary Deployment

I den första versionen fanns det fÄ fel, kanske audit-tjÀnsten inte fungerade. I den andra versionen Àr allt mycket sÀmre. Man kan sÀga med sÀkerhet att det finns problem, sÄ vi mÄste ÄtergÄ till denna version.

Gauge. Metriker Àr liknande Counter, men vi registrerar vÀrden som kan bÄde öka och minska. Till exempel tiden för frÄgaresponser eller storleken pÄ kö.

PĂ„ grafen Ă€r ett exempel pĂ„ svarstid (latency). Grafen visar att versionerna Ă€r lika, och de gĂ„r att arbeta med. Men om man tittar noggrant kan man se hur storleken förĂ€ndras. Om tiden för frĂ„garesponser ökar nĂ€r anvĂ€ndare lĂ€ggs till, Ă€r det tydligt att det finns problem — sĂ„ var det inte tidigare.

Tester pÄ produktion: Canary Deployment

Summary. En av de viktigaste indikatorerna för företaget Àr percentiler. Metriken visar att i 95% av fallen fungerar vÄrt system sÄ som vi vill. Vi kan acceptera om det finns problem nÄgonstans, eftersom vi förstÄr den allmÀnna trenden, hur bra eller dÄligt allt fungerar.

Verktyg

ELK Stack. Att implementera canary Ă€r möjligt med Elasticsearch — vi registrerar fel nĂ€r hĂ€ndelser intrĂ€ffar. Med en enkel API-anrop kan vi fĂ„ antalet fel vid vilken tidspunkt som helst och jĂ€mföra med tidigare perioder: GET /applg/_cunt?q=level:errr.

Prometheus. Har presterat bra i Infobip. Det lÄter oss implementera mÄngdimensionella metrik eftersom etiketter anvÀnds.

Vi kan anvÀnda nivÄ, instance, service, kombinera dem i ett system. Med hjÀlp av offset kan man se till exempel vÀrdet för storleken för en vecka sedan med ett enda kommando. GET /api/v1/query?query={query}, dÀr {query}:

rate(logback_appender_total{ 
    level="error",  
    instance=~"$instance" 
}[5m] offset $offset_value)

Versionsanalys

Det finns flera strategier för versionanalys.

Titta pÄ metrik endast för canary-noden. Ett av de enklaste alternativen: vi deployerar en ny version och studerar endast dess funktionalitet. Men om en ingenjör vid denna tidpunkt börjar granska loggar, stÀndigt nervöst laddar om sidor, sÄ Àr denna lösning inget annorlunda Àn de andra.

Canary-noden jÀmförs med vilken annan nod som helst. Detta Àr en jÀmförelse med andra instanser som arbetar med full trafik. Om det gÄr sÀmre eller inte bÀttre med lÄg trafik Àn pÄ riktiga instanser, sÄ Àr nÄgot fel.

Canary-noden jÀmförs med sig sjÀlv frÄn tidigare. Noder som har tilldelats canary kan jÀmföras med historiska data. Till exempel, om allt var bra för en vecka sedan, kan vi anvÀnda dessa data för att förstÄ den aktuella situationen.

Automatisering

Vi vill avlasta ingenjörerna frÄn manuella jÀmförelser, dÀrför Àr det viktigt att implementera automatisering. Deployment-processen ser vanligtvis ut sÄ hÀr:

  • Vi startar;
  • tar bort noden frĂ„n belastningsbalanseraren;
  • sĂ€tter canary-noden;
  • aktiverar belastningsbalanseraren med en begrĂ€nsad mĂ€ngd trafik;
  • jĂ€mför vi.

Tester pÄ produktion: Canary Deployment

I det hÀr steget implementerar vi automatiserad jÀmförelse. Hur det kan se ut och varför det Àr bÀttre Àn kontroll efter deployment, fÄr vi se med ett exempel frÄn Jenkins.

Detta Àr en pipeline till Groovy.

while (System.currentTimeMillis() < endCanaryTs) {
    def isOk = compare(srv, canary, time, base, offset, metrics)
    if (isOk) {
        sleep DEFAULT SLEEP
    }   else {
        echo "Canary misslyckades, behöver ÄtergÄ"  
        return false
    }
}

HĂ€r definierar vi i loopen att vi kommer att jĂ€mföra den nya noden under en timme. Om canary-processen inte har avslutats — anropar vi funktionen. Den rapporterar om allt Ă€r okej eller inte: def isOk = compare(srv, canary, time, base, offset, metrics).

Om allt Ă€r bra — sleep DEFAULT SLEEP, till exempel en sekund, och fortsĂ€tter. Om inte, avbryter vi — deployment misslyckades.

Beskrivning av metrik. LÄt oss titta pÄ hur funktionen compare kan se ut i DSL.

metric(
    'errorCounts',
    'rate(errorCounts{node=~"$canaryInst"}[5m] offset $offset)',
    {   baseValue, canaryValue ->
        if (canaryValue > baseValue * 1.3) return false 
        return true
    }
)

Anta att vi jÀmför antalet fel och vill veta antalet fel per sekund under de senaste 5 minuterna.

Vi har tvĂ„ vĂ€rden: det basala och canary-noden. VĂ€rdet för canary-noden Ă€r det aktuella. Det basala Ă€r baseValue — detta Ă€r vĂ€rdet för vilken annan nod som inte Ă€r en canary. Vi jĂ€mför vĂ€rdena med formeln som vi etablerar baserat pĂ„ vĂ„r erfarenhet och observationer. Om vĂ€rdet canaryValue Ă€r dĂ„ligt, misslyckades deployment och vi Ă„tergĂ„r.

Varför behövs allt detta?

En mÀnniska kan inte kontrollera hundratals och tusentals metrik, Àn mindre göra det snabbt. Automatiserad jÀmförelse hjÀlper till att kontrollera alla metrik och meddelar snabbt om problem. Tid för meddelande Àr kritisk: om nÄgot intrÀffade under de senaste 2 sekunderna, sÄ Àr skadan inte sÄ stor som om det hade hÀnt för 15 minuter sedan. Medan nÄgon mÀrker problemet, skriver till supporten, och supporten ÄtergÄr Ät oss, kan vi förlora kunder.

Om processen har avslutats framgÄngsrikt, distribuerar vi automatiskt alla andra noder. Under denna tid gör ingenjörerna ingenting. Endast nÀr de kör canary, beslutar de vilken statistik de ska anvÀnda, hur lÀnge jÀmförelsen ska pÄgÄ och vilken strategi som ska tillÀmpas.

Tester pÄ produktion: Canary Deployment

Om det uppstÄr problem rullar vi automatiskt tillbaka canary-noden, arbetar med tidigare versioner och korrigerar de fel som upptÀckts. Med hjÀlp av statistiken Àr det lÀtt att hitta dem och se skadan frÄn den nya versionen.

Hinder

Att genomföra detta Àr förstÄs inte enkelt. Först och frÀmst behövs en gemensam övervakningssystem. Ingenjörerna har sina egna mÀtvÀrden, support och analytiker har andra, och affÀrsverksamheten har tredje. Ett gemensamt system Àr det gemensamma sprÄket som bÄde affÀr och utveckling kommunicerar pÄ.

Det Àr nödvÀndigt att praktiskt testa stabiliteten hos mÀtvÀrdena. Testningen hjÀlper att förstÄ vilket minimiuppsÀttning mÀtvÀrden som krÀvs för att sÀkerstÀlla kvaliteten..

Hur kan vi uppnÄ detta? AnvÀnd canary-tjÀnsten inte vid distribution. Vi lÀgger till en viss tjÀnst pÄ den gamla versionen, som nÀr som helst kan ta en bestÀmd nod, minska trafiken utan distribution. EfterÄt jÀmför vi: vi studerar felen och letar efter den grÀns dÀr vi uppnÄr kvalitet.

Tester pÄ produktion: Canary Deployment

Vilken nytta har vi fÄtt av canary-releaser

Vi minimerade skadenivÄn frÄn buggar. De flesta distributionsfel beror pÄ oöverensstÀmmelse av data eller prioritet. SÄdana fel har minskat avsevÀrt, eftersom vi kan lösa problemet inom de första sekunderna.

Vi har optimerat teamens arbete. Nykomlingar har en "rÀtt att göra fel": de kan distribuera i produktion utan rÀdsla för att göra misstag, vilket ger dem ytterligare initiativ och motivation att arbeta. Om de bryter nÄgot, kommer konsekvenserna inte att vara kritiska, och den som gjort misstaget blir inte uppsagd.

Vi har automatiserat distributionen. Det Àr inte lÀngre en manuell process som tidigare, utan en riktig automatiserad. Men det tar lÀngre tid.

Vi har identifierat viktiga mÀtvÀrden. Hela företaget, frÄn affÀrssidan till ingenjörerna, förstÄr vad som verkligen Àr viktigt i vÄr produkt, vilka mÀtvÀrden, till exempel kundavhopp och tillströmning. Vi kontrollerar processen: testar mÀtvÀrdena, inför nya, ser hur de gamla fungerar, för att bygga ett system som tjÀnar pengar mer effektivt.

Vi har mÄnga bra metoder och system som hjÀlper oss. Trots detta strÀvar vi efter att vara professionella och göra vÄrt jobb av hög kvalitet, oavsett om vi har ett system som kan hjÀlpa oss eller inte.

IngenjörsmĂ€ssiga tillvĂ€gagĂ„ngssĂ€tt och metoder — huvudfokus för konferensen TechLead Conf. Om du har uppnĂ„tt framgĂ„ngar pĂ„ vĂ€gen mot teknisk perfektion och Ă€r redo att berĂ€tta vad som hjĂ€lpt dig — skicka in en ansökan för att hĂ„lla en presentation.

Vi planerar att hĂ„lla TechLead Conf den 8 juni. Vi förstĂ„r att det för nĂ€rvarande Ă€r svĂ„rt att fatta beslut om deltagande i konferensen. Men samtidigt anser vi att karantĂ€n inte Ă€r en anledning att stoppa professionell kommunikation och utveckling. DĂ€rför kommer vi pĂ„ nĂ„got sĂ€tt att hitta ett sĂ€tt att diskutera tech lead-utmaningar och metoder för att lösa dem — om det behövs kommer vi att gĂ„ online och skapa ett nĂ€tverk dĂ€r!

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster