3.3 Hogyan írj konstruktív review kommentet
Áttekintő
A code review nem csak arról szól, hogy megtaláld a hibákat – arról is szól, hogyan kommunikálod azokat. Egy rosszul megfogalmazott komment demotiválja a fejlesztőt, védekezővé teszi, és rontja a csapaton belüli bizalmat. Egy jól megírt komment viszont tanít, segít, és hosszú távon jobb fejlesztőt csinál a kollégádból.
Ebben az alfejezetben megtanulod:
- milyen típusú kommentek léteznek és mikor melyiket használd
- hogyan fogalmazz úgy, hogy ne sérts meg senkit
- mi a
nit:előtag és miért szeretik a profi csapatok - hogyan adj pozitív visszajelzést (és miért fontos ez)
- konkrét példákon keresztül: rossz komment → jó komment átírások
Miért számít ez az állásinterjún?
A legtöbb tech interjún megkérdezik: „Hogyan adsz visszajelzést a kollégáidnak?" vagy „Mesélj egy code review szituációról." Ha tudod elmagyarázni a különböző kommenttípusokat és a mögöttük lévő gondolkodást, az egyből megkülönböztet a többi junior jelölttől.
Részletes leírás
A három kommenttípus
A profi fejlesztői csapatokon belül az elfogadott norm az, hogy a review kommentek jelzik a súlyukat. Nem minden észrevétel egyformán fontos – és ezt a szerzőnek is értenie kell, hogy jól priorizáljon.
1. Blocker (kötelező javítás)
Ez az a komment, ami miatt nem lehet mergelni a PR-t. Valódi probléma: biztonsági rés, logikai hiba, production-t törő bug.
Jellemzők:
- Egyértelmű, miért blokkoló
- Konkrét javaslatot tartalmaz a javításra
- Nem személyes, a kódról szól
2. Javaslat (opcionális, de ajánlott)
Nem blokkolja a merge-t, de érdemes megfontolni. Lehet jobb megközelítés, olvashatóbb megoldás, jobb névválasztás.
Jellemzők:
- Feltételes hangnem: „Érdemes lehet...", „Mi lenne ha..."
- Megmagyarázza, miért jobb az alternatíva
- Nem kötelez semmire
3. nit: (nit-pick, apróság)
A nit: (nitpick rövidítése) egy elterjedt konvenció a tech iparban. Olyan apróságokat jelöl vele a reviewer, amik teljesen elhagyhatók – de ha már így is bent van a kezed a kódban, mégis jobb lenne így.
nit: ezt a változót `isLoading`-ra nevezhetnéd `loadingState` helyett
Miért jó ez a konvenció?
- A szerző tudja, hogy nem kell foglalkoznia vele, ha más a prioritása
- A reviewer mégis megoszthatja a véleményét anélkül, hogy felesleges nyomást gyakorolna
- Átlátható a kommunikáció
Hogyan fogalmazz, hogy ne sérts meg senkit?
A code review egyik legnagyobb csapdája: a kód kritikája személyes kritikának tűnik.
Ez különösen igaz juniorokra, akik még nem választják szét magukat és a kódjukat. Ha azt mondod valakinek, hogy „ez rossz", könnyen úgy érzik: „én vagyok rossz".
Az alapszabály: mindig a kódról beszélj, nem a személyről.
| ❌ Személyes | ✅ Kódközpontú |
|---|---|
| „Ezt rosszul csináltad" | „Ez a megközelítés problémát okozhat, mert..." |
| „Miért írtad így?" | „Ezt lehetne így is megoldani: [példa]" |
| „Ez nyilvánvalóan hibás" | „Úgy látom, itt az X eset nincs kezelve" |
| „Ezt mindenki tudja" | „Ezt érdemes tudni: [magyarázat]" |
Tippek a megfogalmazáshoz:
- Használj „mi" formát – „Ha ezt így csináljuk, akkor..." – közös ügy, nem ítélet
- Kérdezz, ne állíts – „Mit szólsz, ha inkább X-et használunk?" vs. „X-et kell használni"
- Magyarázd a miértet – Nem elég azt mondani, hogy „ez rossz". Miért rossz? Mi a következménye?
- Adj alternatívát – Ha kritizálsz, adj egyben javaslatot is
- Ismerj el kontextust – „Látom, hogy ez a jelenlegi architektúrába nehézkesen illik..." – empátia
Pozitív visszajelzés: a legtöbbször kihagyott eszköz
A legtöbb fejlesztő kizárólag hibákat ír a review-ba. Ez hatalmas hiba.
Miért fontos a pozitív visszajelzés?
- Erősíti a jó szokásokat (amit dicsérünk, azt megismétlik)
- Csökkenti a review-tól való félelmet
- Embert csinál belőled, nem csak hibakereső gépet
- Jobb csapatkultúrát épít
Ez nem azt jelenti, hogy minden sorhoz dicséretet kell írni. De ha látsz valami tényleg elegáns megoldást, egy jó névválasztást, egy ügyes tesztet – mondd ki.
Jó megközelítés! Ez sokkal olvashatóbb, mint amit korábban csináltunk.
Tetszik, hogy ezt a sarokesetet is lekezeltük – általában ez szokott elsikkadni.
Ez 10 másodperc és rengeteg goodwill.
A komment struktúrája
Egy jól megírt review komment általában három részből áll:
- Mit látsz (tény, nem ítélet)
- Mi a probléma / miért számít (kontextus)
- Mit javasolsz (alternatíva vagy irány)
Nem kell mindhárom minden esetben – de ha blocker kommentet írsz, ez a minimum.
Életszerű példák
Példa 1: Biztonsági probléma
Rossz komment:
Ez SQL injection! Erre nem gondoltál?
Jó komment:
[Blocker] Ezen a ponton az SQL query összefűzéssel épül fel a user inputból,
ami SQL injection sérülékenységet jelent. Érdemes paraméterezett lekérdezésre
(prepared statement) cserélni – a részlegünkön így szokás: [link vagy példa].
Példa 2: Olvashatóság
Rossz komment:
Ez a függvény értelmezhetetlen.
Jó komment:
nit: Ez a függvény elég komplex – egy rövid kommenttel vagy a változónevek
pontosításával sokat javíthatnánk az olvashatóságon. Mi lenne ha a `d` változót
`daysSinceLastLogin`-ra neveznénk?
Példa 3: Felesleges duplikáció
Rossz komment:
DRY elv! Nem hallottál róla?
Jó komment:
Ez a logika nagyon hasonlít arra, amit a `UserService`-ben is megcsináltunk
(lásd: `calculateDiscount()` metódus). Érdemes lehet kiemelni egy közös helyre,
hogy ha változik, elég egy helyen módosítani.
Példa 4: Hibakezelés hiánya
Rossz komment:
Mi van ha ez null? Gondoltál erre?
Jó komment:
[Javaslat] Ha a `fetchUser()` null-t ad vissza (pl. nem létező user ID esetén),
a következő sor NPE-t dob. Érdemes lehet egy `if (user == null) return;` check-et
betenni, vagy a hívó oldalon kezelni ezt az esetet.
Példa 5: Pozitív visszajelzés
Szép megoldás! Korábban ezen a részen mindig sokat gondolkodtunk –
ez az approach sokkal egyszerűbb és könnyen követhető.
Példa 6: Performancia aggály
Rossz komment:
Ez lassú lesz.
Jó komment:
[Javaslat] Ez a ciklus minden iterációban meghívja az adatbázist – ha a lista
nagy (pl. 1000+ elem), ez komoly performance problémát okozhat (N+1 query).
Mi lenne, ha egy lekérdezéssel előtöltenénk az összes szükséges adatot?
Feladatok és tesztek
Gyakorlati feladat: 5 rossz komment átírása
Az alábbi 5 kommentet írd át konstruktív, professzionális formába. Ahol szükséges, adj blocker/javaslat/nit jelzést is.
1. feladat:
Eredeti komment:
Ez teljesen felesleges komplexitás. Miért ilyen bonyolultan csináltad?
Kontextus: A junior egy 40 soros helper osztályt írt, amit 3 sorban is meg lehetett volna oldani.
2. feladat:
Eredeti komment:
A tesztek hiányoznak!!!
Kontextus: A PR-hoz nem tartoznak unit tesztek, de a csapat policy szerint kellene.
3. feladat:
Eredeti komment:
Ezt soha nem szabad így csinálni. Ez alapvető hiba.
Kontextus: A fejlesztő hardcode-olt egy API kulcsot a kódba.
4. feladat:
Eredeti komment:
Jó, rendben.
Kontextus: A fejlesztő egy ügyesen megírt cache megoldást rakott be, amit a reviewer aprólékosan átnézett.
5. feladat:
Eredeti komment:
Ez a változónév értelmetlen. Ki érti ezt el?
Kontextus: A változó neve tmp2 egy 80 soros függvényen belül.
Tesztkérdések
1. kérdés: Melyik komment tekinthető hatékonynak és konstruktívnak?
a) „Ez hibás implementáció."
b) „Ez a megközelítés problémát okozhat edge case-eknél – ha X feltétel teljesül, Y történik. Mi lenne ha Z-t próbálnánk?"
c) „Miért ilyen bonyolultan oldottad meg ezt?"
d) „Mindenki tudja, hogy ezt így kell csinálni."
2. kérdés: Mit jelent a nit: előtag egy review kommentben?
a) A komment blokkolója a merge-nek
b) A komment egy kötelező biztonsági javításra vonatkozik
c) A komment apróság, nem kötelező foglalkozni vele, de felhívja rá a figyelmet
d) A reviewer nem ért egyet a megközelítéssel, de elfogadja
3. kérdés: Miért fontos pozitív visszajelzést is adni review során?
a) Mert kötelező a céges policy szerint
b) Mert erősíti a jó szokásokat és jobb csapatkultúrát épít
c) Mert különben a reviewer rossznak tűnik
d) Csak akkor szükséges, ha a junior fejlesztő érzékeny
4. kérdés: Melyik a megfelelő sorrend egy jól megírt blocker kommentben?
a) Javaslat → probléma → tény
b) Tény → probléma/következmény → javaslat
c) Személyes vélemény → kritika → elvárt megoldás
d) Link → magyarázat → kérdés
5. kérdés: Az alábbi kommentek közül melyik a „javaslat" típusú (nem blocker)?
a) „[Blocker] Ez SQL injection sérülékenységet jelent, mielőtt ez mergel, javítani kell."
b) „nit: Ezt a változót talán jobb lenne isVisible-re nevezni."
c) „Érdemes lehet megfontolni egy Factory pattern használatát itt – nem kötelező, de karbantarthatóbbá tenné."
d) „Szép megoldás, sokat egyszerűsített a korábbi kódhoz képest."
6. kérdés: Mi a legnagyobb probléma ezzel a kommenttel: „Ezt mindenki tudja, hogy nem szabad így csinálni."?
a) Túl rövid
b) Személyes hangvételű és nem ad konkrét segítséget
c) Hiányzik a nit: előtag
d) Nem tartalmaz linket a dokumentációra
7. kérdés: Melyik megfogalmazás ösztönzi inkább a konstruktív párbeszédet?
a) „Ez teljesen rossz megközelítés."
b) „Miért gondoltad, hogy ez működni fog?"
c) „Mit szólnál, ha X megközelítést próbálnánk? Az Y okból hatékonyabb lehet."
d) „Ez nem az elvárható minőség."
8. kérdés: Egy junior fejlesztő PR-jában minden rendben van, a kód jól megírt és tesztelt. Mit tegyen a reviewer?
a) Semmit, csak approve-olja komment nélkül
b) Írjon egy rövid pozitív megjegyzést, pl. „Jól megírt, köszönöm!" – és approve-olja
c) Keresse azokat a részeket, ahol még javítható lenne, hogy legyen érdemi tartalma a review-nak
d) Kérdezze meg a seniortól, hogy tényleg jó-e
9. kérdés: Melyik mondat fejezi ki legjobban a „kód ≠ személyiség" elvét?
a) „Látom, hogy ez a fajta megközelítés szokott problémát okozni ilyen szituációban."
b) „Te mindig így csinálod, és mindig hibás lesz."
c) „Nyilván nem gondoltad végig alaposan."
d) „Én sosem csinálnám így."
10. kérdés: Mi a nit: komment legfőbb értéke a csapat számára?
a) Lehetővé teszi, hogy a reviewer minden kis hibát felsoroljon anélkül, hogy blokkolná a merge-t
b) Kötelezi a szerzőt, hogy az összes apróságot javítsa
c) Helyettesíti a blocker kommentet alacsony prioritású esetekben
d) Csökkenti a review jóváhagyáshoz szükséges időt
Megoldások (tesztkérdések)
- b – Konkrét, magyaráz, és javaslatot ad
- c – Apróság, nem kötelező foglalkozni vele
- b – Erősíti a jó szokásokat és jobb csapatkultúrát épít
- b – Tény → probléma → javaslat
- c – Feltételes hangnem, explicit nem kötelező
- b – Személyes hangvételű és nem ad konkrét segítséget
- c – Kérdés formájú javaslat, magyarázattal
- b – Pozitív visszajelzés is értékes, approve-olva
- a – A megközelítésről szól, nem a személyről
- a – Apróságokat lehet jelezni a merge blokkolása nélkül