Att etablera och optimera en kodgranskningsprocess är avgörande för hälsan i alla programvaruutvecklingslivscykler.
Förespråkare för kodgranskning hänvisar till en siffra från Steve McConnells bok Code Complete, som säger att omfattande kodinspektioner upptäckte omkring 60 % av defekterna, jämfört med 25–45 % vid standardkontroller.
I den här artikeln går vi igenom nycklarna till en rigorös kodgranskningsprocess och ger expertråd om hur man gör det på rätt sätt.
12 bästa metoder för mer produktiva kodgranskningar
”Överlag bidrar kodgranskningar till att skapa en kultur av kontinuerlig förbättring och delat ansvar för kodkvaliteten, vilket i slutändan leder till mer tillförlitlig och underhållbar programvara”, säger Derek Ashmore, chef för applikationstransformering på molnkonsultföretaget Asperitas.
Det finns ingen garanti för det resultatet – att bara be en utvecklare granska en annan utvecklares kod leder sannolikt inte till optimala resultat. Vanliga utmaningar omfattar inkonsekvent eller knapphändig återkoppling, personliga fördomar samt konkurrerande prioriteringar eller tidsbegränsningar som får kodgranskningar att kännas som en börda.
För att skapa goda förutsättningar för framgång föreslår Ashmore och Stone tips och bästa metoder för att införa eller förbättra din kodgranskningsprocess.
1. Fokusera på koden, inte personen
”Granska alltid koden, inte utvecklaren”, säger Ashmore.
Sträva efter att göra återkopplingen objektiv, respektfull och konstruktiv. Småaktig eller personlig kritik kan undergräva hela processen. Det är ingen ”nu fick jag dig”-lek.
2. Fastställ tydliga riktlinjer och standarder
Det är nästan omöjligt att ha positiva och produktiva kodgranskningar när deltagarna inte känner till målen eller standarderna som de arbetar mot. Att lära sig förbättra programvarukvaliteten bör vara en standardprocess.
Ledningen bör sätta rätt ton tidigt och kalibrera om vid behov. Tydlig kommunikation är ett måste.
”Se till att alla teammedlemmar känner till kodningsstandarderna och riktlinjerna”, säger Ashmore. ”Detta omfattar namnkonventioner, formatering och bästa metoder för arkitektur. Granskare bör vara samordnade kring dessa för att kunna ge konsekvent återkoppling.”
3. Begränsa omfattningen av varje granskning
Du har förmodligen hört uttrycket ”försök inte koka havet” och dess varianter. Principen gäller även här: att be människor göra för mycket i en enda granskning kan leda till misstag och motstånd från personer med många andra ansvarsområden.
”Att granska stora pullförfrågningar kan vara överväldigande och medföra risk för förbisedda saker”, säger Ashmore. ”Mindre, fokuserade granskningar är enklare att hantera och mer effektiva. Sikta på att granska hanterbara kodavsnitt, vanligtvis högst 200–400 rader.”
4. Ge först återkoppling på struktur och logik
Ashmore rekommenderar också att man åtgärdar strukturella och logiska problem innan man går vidare till mindre detaljer som stil och formatering.
”Detta säkerställer att kodens grundläggande delar är stabila innan du börjar leta efter småsaker”, säger han.
5. Använd automatisering för rutinmässiga kontroller
Automatiserade kodgranskningsverktyg kan spara mycket tid, precis som vid många andra repetitiva IT-processer. Detta är ett sätt som verktygsstödda granskningar kan komplettera, snarare än ersätta, formella granskningar som leds av människor.
”Automatisera kontroller av stil, formatering och andra enkla konventioner med hjälp av verktyg som kodanalysverktyg eller CI-pipelines”, säger Ashmore. ”Det sparar granskarnas tid och låter dem fokusera på mer kritiska problem som kodens logik och struktur.”
6. Uppmuntra beskrivande commitmeddelanden
”Be utvecklarna skriva tydliga och beskrivande commitmeddelanden”, rekommenderar Ashmore. ”Det ger sammanhang åt varje ändring, gör granskningsprocessen smidigare och hjälper framtida teammedlemmar att förstå kodens historik.”
Detaljer från upphovspersonerna är avgörande, särskilt om någon utanför projektet ska granska dem. ”Det ger inte bara granskarna hela sammanhanget – vad som ändras och varför – utan gör det också möjligt för dem att lära sig av upphovspersonens arbete”, säger Stone.
”För granskare spelar detaljer en lika viktig roll. De hjälper upphovspersonen att förstå syftet med ett förslag, oavsett om det gäller en mindre petitess eller ett kritiskt problem som skulle kunna få något att sluta fungera.”
7. Ställ klargörande frågor
Uppmuntra frågor som en viktig mekanism för att skapa konstruktiv feedback. En fråga gör det möjligt för författaren eller utvecklaren att reflektera och svara meningsfullt i stället för att gå i försvarsställning. Det gör det också möjligt för granskare att bättre förstå tidigare val i stället för att göra antaganden.
”Frågor kan leda till bättre förståelse och ge utvecklaren möjlighet att förklara sitt resonemang eller överväga alternativa angreppssätt”, säger Ashmore.
På samma sätt rekommenderar Stone att granskare undviker dogmatiska övertygelser eller uttalanden i sin feedback. Om en viss kodrad inte kommer att orsaka problem bör feedback behandlas som förslag snarare än krav.
”I stället för att säga ’gör så här’ eller ’gör så där’ håller vi oss till ett mer öppet, samarbetsinriktat och brainstormande arbetssätt,” säger Stone. ”[Prova] ’vad tycker du om det här?’”
8. Leta efter potentiella problem, inte bara buggar
Vissa kodgranskningar fokuserar snävt på faktiska buggar eller defekter. Det är helt okej, men omfånget kan bli för begränsat. Holistiska kodgranskningar kan också leta efter gränsfall, prestandakonsekvenser och skalbarhetsproblem.
De kan också vara ett tillfälle att hantera teknisk skuld – de kompromisser som tidigare gjorts för att hålla en deadline eller nå något annat mål.
”Bra kodgranskningar går längre än att bara upptäcka buggar och innebär att man funderar på hur koden kommer att bete sig i olika scenarier,” säger Ashmore.
9. Uppmuntra testtäckning
”Se till att nya funktioner eller ändringar innehåller lämpliga tester”, säger Ashmore.”Uppmuntra till att lägga till enhetstester och integrationstester när det är relevant för att hjälpa till att hitta buggar och dokumentera förväntat beteende.”
10. Var snabb och lyhörd
Ashmore rekommenderar också att tidsbegränsa granskningarna och sätta tidsfrister för feedback, till exempel 24 timmar eller en annan rimlig tidsram:
”Snabb feedback hjälper till att bibehålla momentum. Svara dessutom snabbt på frågor eller klargöranden från utvecklaren.”
11. Balansera beröm och kritik
Både Ashmore och Stone betonar värdet av positiv feedback och att uppmärksamma framgångar – inte bara att kritisera eller påpeka brister. Detta är viktigt för kontinuerliga förbättringar och för att förstärka bästa praxis och positiva resultat.
”Glöm inte att uppmärksamma bra arbete”, säger Ashmore.
Detta är viktigt för kontinuerliga förbättringar och för att förstärka bästa praxis och positiva resultat.
”Att uppmärksamma varandras briljanta ögonblick, oavsett hur stora eller små de är, bekräftar, motiverar och inspirerar”, säger Stone.
”Positiva kommentarer som ’TIL’ (idag lärde jag mig …) eller ’Det här är snyggt! Hur fungerar det?’ förstärker positiva beteenden, får oss att le och påminner om syftet med granskningsprocessen.”
12. Dokumentera och dela lärdomar
Dokumentation är bra, särskilt när den hjälper till att identifiera och lösa återkommande problem eller snabbt hjälper nya teammedlemmar att komma in i arbetet.
”När återkommande problem eller mönster uppstår bör du dokumentera dem för framtida bruk”, säger Ashmore. ”Överväg att skapa ett gemensamt arkiv med checklistor, riktlinjer och vanliga problem från granskningar för att effektivisera framtida granskningar.”
Även om kommentarer är förslag och inte regler är det fortfarande viktigt att författare sluter cirkeln genom att bekräfta granskarnas kommentarer.
Stone tillägger, ”Detta säkerställer att all feedback har setts, hanterats och beaktats. Det främjar också ytterligare samtal och kunskapsöverföring, vilket är avgörande för kontinuerliga förbättringar.”
Varför är kodgranskningar viktiga?
På sätt och vis talar vikten av kodgranskningar och verktyg för kodgranskning för sig själv: processen handlar helt och hållet om att förbättra programvarans kvalitet, tillförlitlighet och affärsresultat – samtidigt som defekter, säkerhetsproblem, teknisk skuld och andra potentiella problem minskas.
Men, enligt Mike Stone, medgrundare av The Gnar Company, ett företag baserat i Boston som utvecklar anpassade webb- och mobilapplikationer, kan de vara en del av en övergripande sund organisationskultur.
Stone säger att hans företag arbetar efter mottot ”ingenjörer, men människor” för att proaktivt motverka vissa negativa antaganden om utvecklares förmåga att samarbeta väl med andra.
“Det är både en nickning till vår samarbetsinriktade natur och vårt engagemang för att trotsa den fruktade stereotypen om ”att arbeta med utvecklare”, säger Stone till The CTO Club. ”Vår kodgranskningsprocess är varken något som görs i efterhand eller en bonusuppgift, utan en integrerad del av vår process och kultur.”
Kodgranskningar ger teamet en regelbunden mekanism för att kommunicera och samarbeta.
”När vi granskar och firar varandras kod stärker vi vår känsla av ömsesidigt ansvar och gemensamt ägarskap över det arbete vi utför”, säger Stone.”Vi är också stolta över vårt fortsatta engagemang för ett väl utfört arbete.”
Typer av kodgranskningar
Kodgranskningsprocesser kan se olika ut mellan team och organisationer – många böcker om DevOps-testning förklarar detta uppenbara faktum. Du kan dock gruppera många av dem i två kategorier, som inte utesluter varandra.
- Formella kodgranskningar: Det här är strukturerade sessioner där utvecklare presenterar sina kodändringar för kollegor för granskning och kommentarer. Den här typen innebär ofta en detaljerad inspektion, diskussion och dokumentation. Formella granskningar är grundliga men kan vara tidskrävande och stressande om ni inte har en sund kultur. (En positiv och skuldfri kultur bör minska det.)
- Verktygsassisterade granskningar: Utvecklare skickar in sina pull requests för granskning med hjälp av plattformar som GitHub, GitLab eller Bitbucket. Dessa verktyg underlättar kommentarer direkt i koden, automatiserade kontroller och versionshantering, vilket gör processen effektivare och enklare att följa (detta är också en av de främsta fördelarna med versionshanteringssystem).
Verktygsassisterade granskningar grupperas ibland under det bredare paraplyet av ”lättviktiga” kodgranskningar eller kodgranskningsprocesser som är mindre formella och ofta mindre tidskrävande. Andra exempel på lättviktiga kodgranskningsprocesser är parprogrammering, en bästa praxis inom DevOps där två utvecklare samarbetar: den ena skriver kod och den andra granskar den medan de arbetar.
Att avgöra vilken eller vilka typer av kodgranskningar som passar bäst för ditt team är ett viktigt tidigt steg.
10 De bästa verktygen för kodgranskning
Here's my pick of the 10 best software from the 10 tools reviewed.
Clicks on the links below may earn a commission, which supports our independent testing and review of software and services. Learn more about how we stay transparent.
Nyckelpersoner i kodgranskningar
Ett annat viktigt tidigt steg är att identifiera rätt teammedlemmar för rätt roller i kodgranskningsprocessen. De specifika personerna varierar något beroende på teamets sammansättning, men utvecklare – eller alla som skriver kod i er organisation – bör finnas med på listan. (Jaså.)
Andra möjligheter är roller som ingenjörer för webbplatsers driftsäkerhet, DevOps-ingenjörer, säkerhetsingenjörer och alla som är intresserade av positiva och skuldfria kodgranskningar för att förbättra programvarukvaliteten.
Oavsett roll eller person delas deltagarna i kodgranskningen vanligtvis in i två kategorier: författare (personerna som skriver koden) och granskare (personerna som granskar koden). Senare i artikeln delar vi med oss av råd för båda rollerna.
Mätvärden för kodgranskning
Att mäta kodgranskningarnas effektivitet är avgörande för att upprätthålla kodkvaliteten, förbättra granskningseffektiviteten och optimera utvecklingsarbetsflöden. Utan att följa objektiva mätvärden kan team ha svårt att identifiera flaskhalsar, utvärdera framsteg eller säkerställa konsekvens i granskningsprocessen.
Genom att införa mätbara standarder kan team förfina sitt arbetssätt, fördela resurser effektivt och förbättra samarbetet.
Vanliga mätvärden för kodgranskning
Genom att följa viktiga mätvärden får man insikter i hur väl kodgranskningar genomförs och kan identifiera områden som behöver förbättras. Några av de vanligaste mätvärdena för kodgranskning är:
- Defekttäthet – Mäter antalet defekter som hittas per kodenhet. Detta beräknas genom att dividera antalet defekter med tusentals kodrader (kLOC). En högre defekttäthet kan tyda på låg kodkvalitet, medan en lägre täthet tyder på färre fel och bättre efterlevnad av kodningsstandarder.
- Defektfrekvens – Beräknar hur ofta defekter identifieras i granskningsprocessen. Detta fastställs genom att dividera antalet defekter med det totala antalet timmar som lagts på att granska koden. Genom att övervaka detta mått kan team bedöma om granskningsprocessen är grundlig och effektiv.
- Inspektionsfrekvens – Mäter hur snabbt ett team granskar en viss mängd kod. Detta fastställs genom att dividera det totala antalet granskade kodrader (LoC) med antalet inspektionstimmar. En balans bör upprätthållas mellan effektivitet och grundlighet för att undvika stressade eller ineffektiva granskningar.
- Granskningsomfattning – Anger procentandelen kodändringar som genomgår kollegial granskning. En högre granskningsomfattning säkerställer att alla kritiska uppdateringar får en ordentlig granskning, vilket minskar risken för oupptäckta fel.
- Tid till slutförd granskning – Mäter hur lång tid det tar för en pullförfrågan eller inskickad kodändring att gå igenom hela granskningsprocessen. Kortare granskningstider bidrar till att upprätthålla projektets framdrift, men alltför snabba granskningar kan leda till förbisedda problem.
- Omarbetsfrekvens – Följer hur ofta kodändringar kräver modifieringar efter en granskning. En hög omarbetsfrekvens kan tyda på otydliga krav, låg kvalitet på den ursprungliga koden eller inkonsekvent återkoppling under granskningen.
Hur mått för kodgranskning påverkar processförbättring
Genom att analysera dessa mått kan team identifiera ineffektivitet, förbättra samarbetet och fatta datadrivna beslut om sitt utvecklingsarbetsflöde. Några sätt som mått driver processförbättring är:
- Identifiera komponenter med hög risk – Defekttäthet hjälper till att hitta områden i kodbasen som är mer benägna att innehålla fel. Team kan tilldela ytterligare resurser eller införa striktare granskningsprocesser inom dessa områden för att förbättra kvaliteten.
- Optimera granskningseffektiviteten – Genom att övervaka inspektionsfrekvensen och tiden till slutförd granskning kan team balansera snabbhet och noggrannhet, vilket säkerställer att kodgranskningar inte blir flaskhalsar samtidigt som de förblir grundliga.
- Förbättra kodkvaliteten – Genom att följa defektfrekvens och omarbetsfrekvens kan team förfina kodningsstandarder, tillämpa bästa praxis och förbättra de första kodinlämningarna.
- Effektivisera samarbetet – Att säkerställa en hög granskningsomfattning främjar ansvarstagande inom teamet och ett gemensamt ägarskap för kodbasen, vilket leder till bättre långsiktig underhållbarhet. I kombination med verktyg för kodsamarbete i realtid gör granskningsmått det möjligt att uppnå högsta möjliga nivå av gemensam utveckling och förbättrar teamarbetet på lång sikt.
Genom att införa strukturerade mått för kodgranskning kan utvecklingsteam kontinuerligt förfina sina granskningsprocesser, minska antalet defekter och skapa mer tillförlitlig programvara. Genom att göra dessa mått till en återkommande del av utvecklingen säkerställs att kodgranskningar förblir effektiva, transparenta och i linje med projektmålen.
Säkerhetsgranskning vid kodgranskningar
Säkerhet är en grundläggande aspekt av programvaruutveckling, och kodgranskningar är viktiga för att identifiera och minska potentiella sårbarheter innan de når produktionsmiljön. En särskild säkerhetsgranskningsprocess säkerställer att koden är funktionell, effektiv och motståndskraftig mot exploateringar, dataintrång och obehörig åtkomst.
Viktiga områden inom säkerhetsgranskning
Säkerhetsinriktade kodgranskningar undersöker koden med avseende på sårbarheter, felkonfigurationer och efterlevnadsproblem. Några av de vanligaste säkerhetsriskerna att leta efter är:
- Injektionssårbarheter – Kontroll av SQL-injektion, kommandoinjektion och andra angreppsvektorer där användarindata hanteras på ett olämpligt sätt.
- Hårdkodade autentiseringsuppgifter – Identifiering av känsliga uppgifter som API-nycklar, lösenord och krypteringsnycklar som inte bör lagras direkt i koden.
- Osäker autentisering och auktorisering – Säkerställ att åtkomstkontrollmekanismer är korrekt implementerade och att användarnas autentiseringsprocesser är säkra.
- Bristande felhantering – Granskning av felmeddelanden för att förhindra att känsliga systemdetaljer läcker till slutanvändare.
- Otillräcklig kryptering – Kontroll av att känsliga data är krypterade under överföring och vid lagring med branschstandardiserade algoritmer.
- Osäkra beroenden – Bedömning av tredjepartsbibliotek och ramverk med avseende på kända säkerhetssårbarheter.
Genom att integrera säkerhetsgranskning i kodgranskningsprocessen kan team förebygga vanliga säkerhetshot och förbättra programvarans övergripande motståndskraft.
Den säkerhetsfokuserade mänskliga granskarens roll
Även om automatiserade verktyg kan upptäcka en rad säkerhetssårbarheter är mänsklig tillsyn avgörande för att säkerställa en heltäckande säkerhetsgranskning. En granskare med säkerhetsexpertis kan:
- Identifiera kontextspecifika säkerhetsrisker som automatiserade verktyg kan förbise.
- Bedöma sårbarheter i affärslogiken som kanske inte utlöser traditionella säkerhetsskanningar.
- Vägleda utvecklare i bästa praxis för säkerhet och främja en kultur av säker kodning.
- Säkerställa efterlevnad av säkerhetspolicyer och regulatoriska standarder som är relevanta för branschen.
Genom att ha en dedikerad säkerhetsgranskare som en del av kodgranskningsprocessen säkerställs att säkerhet integreras i utvecklingen från början, vilket minskar risken för att sårbarheter når produktion.
Integrering av specialiserade säkerhetsverktyg
För att stärka säkerhetsgranskningen bör team införliva specialiserade säkerhetsverktyg i sin kodgranskningsprocess. Dessa verktyg hjälper till att automatisera säkerhetsanalysen och lyfta fram potentiella risker innan mänskliga granskare går igenom koden. Vanliga verktyg omfattar:
- Verktyg för statisk säkerhetstestning av applikationer (SAST) – Analyserar källkod efter sårbarheter utan att köra programmet.
- Verktyg för dynamisk säkerhetstestning av applikationer (DAST) – Testar körande applikationer efter säkerhetsbrister.
- Beroendeskannrar – Identifierar sårbarheter i tredjepartsbibliotek och ramverk.
- Kodlinters med säkerhetsregler – Upptäcker felaktiga säkerhetskonfigurationer och upprätthåller metoder för säker kodning.
Även om dessa verktyg avsevärt förbättrar säkerhetsgranskningen bör de inte ersätta mänskliga granskare. En kombination av automatiserad analys och manuell säkerhetsexpertis ger det bästa skyddet mot sårbarheter.
Verktyg för kodgranskningar
Oavsett hur ni utvecklar och implementerar kodgranskningar i organisationen finns det många verktyg som kan hjälpa till – för automatisering, versionshistorik, dokumentation eller andra ändamål. Det finns så många alternativ att det kan verka överväldigande att hitta de rätta.
Oroa dig inte! CTO Clubs expertgranskare hjälper dig. Här är fyra listor som hjälper dig att komma igång:
- 20 bästa verktygen för kodgranskning för utvecklare
- 20 bästa verktygen för kodanalys
- De 23 bästa verktygen för statisk kodanalys för Java
- 24 bästa programvarorna för källkodshantering som lyfter din kod
Checklista för kodgranskning
En checklista för kodgranskning är en strukturerad vägledning som säkerställer konsekvens, noggrannhet och efterlevnad av bästa praxis för kodning under granskningsprocessen. Genom att följa en checklista kan team systematiskt utvärdera olika aspekter av koden, minska sannolikheten för defekter, förbättra underhållbarheten och stärka säkerheten.
En väl utformad checklista bidrar till att effektivisera granskningsprocessen och ger ett standardiserat tillvägagångssätt för att bedöma kodkvaliteten innan koden slås samman med kodbasen.
Viktiga checklistpunkter för kodgranskningar
En heltäckande checklista för kodgranskning bör omfatta viktiga områden som läsbarhet, säkerhet, testtäckning, underhållbarhet och prestanda. Nedan följer några kritiska aspekter att ta med:
Läsbarhet och underhållbarhet
- Är koden lätt att förstå och väldokumenterad?
- Är funktions- och variabelnamnen meningsfulla och beskrivande?
- Är koden fri från onödiga kommentarer eller överflödig kod?
- Följer koden den etablerade stilguiden och formateringsstandarderna?
- Är logiken strukturerad på ett sätt som är lätt att följa?
Säkerhetsaspekter
- Utsätter koden systemet för säkerhetsbrister som SQL-injektion eller skriptkörning mellan webbplatser (XSS)?
- Är autentiserings- och auktoriseringsmekanismer korrekt implementerade?
- Lagras känsliga autentiseringsuppgifter (t.ex. API-nycklar och lösenord) säkert och är de inte hårdkodade?
- Används lämpliga krypteringstekniker för lagring och överföring av känsliga data?
- Är felhanteringen implementerad på ett sätt som inte läcker systemdetaljer?
Testtäckning och kodens tillförlitlighet
- Ingår enhetstester för nya funktioner eller ändringar?
- Täcker testerna gränsfall och möjliga felscenarier?
- Finns integrations- och funktionstester på plats där det behövs?
- Hanterar koden oväntade indata på ett robust sätt?
- Har automatiserade tester genomförts utan fel före granskningen?
Prestanda och optimering
- Är koden optimerad för effektivitet utan onödig komplexitet?
- Finns det potentiella minnesläckor eller prestandaflaskhalsar?
- Är databasfrågor optimerade för att undvika onödig belastning?
- Används loopar och rekursiva funktioner på lämpligt sätt för att förhindra överdriven beräkning?
Återanvändbarhet och skalbarhet
- Följer koden principer som modularisering och inkapsling?
- Används återanvändbara funktioner, komponenter eller tjänster där det är tillämpligt?
- Introducerar koden onödiga beroenden som kan påverka skalbarheten?
- Är API-anrop och datahantering optimerade för framtida tillväxt?
Så implementerar du en checklista för kodgranskning
För att använda en checklista effektivt krävs att den integreras i utvecklingsarbetsflödet. Här är några praktiska sätt att implementera och använda en checklista för kodgranskning:
- Bädda in checklistan i mallar för pull requests för att säkerställa att varje pull request innehåller en checklista som utvecklarna måste fylla i före inskickning.
- Använd automatiserade verktyg för att verifiera punkterna i checklistan, till exempel statisk kodanalys och kodgranskare, för att hjälpa till att upprätthålla stilguider och automatiskt identifiera säkerhetsproblem.
- Uppmuntra ansvarstagande mellan kollegor genom att utse granskare som verifierar att alla punkter i checklistan har hanterats innan koden godkänns.
- Förfina checklistan kontinuerligt i takt med att teamet utvecklas och uppdatera den så att den återspeglar nya bästa metoder, tekniska förändringar och lärdomar från tidigare granskningar.
- Ge utbildning i hur checklistan används för att säkerställa att alla utvecklare förstår betydelsen av varje punkt och hur koden ska utvärderas därefter.
Genom att integrera en checklista för kodgranskning i arbetsflödet kan team upprätthålla kodningsrutiner av hög kvalitet, minimera fel och säkerställa att säkerhet, prestanda och underhållbarhet hanteras konsekvent.
Avslutande tankar
Väl genomförda, regelbundna kodgranskningar är en viktig del av programvarukulturer som bygger på samarbete och kontinuerlig förbättring.
"Kodgranskningar är inte bara ett sätt att förbättra kodkvaliteten; de är en möjlighet att bygga en samarbetsinriktad och utvecklingsorienterad kultur. Genom att välkomna detaljerad och genomtänkt återkoppling och uppmärksamma framgångar kan team förvandla kodgranskningar till en hörnsten för innovation och lagarbete," hävdar Stone.
Prenumerera på The CTO Clubs nyhetsbrev för de senaste insikterna från ledande tänkare inom programvarubranschen.
