Po co robimy code review
Code review to nie egzamin. To nie okazja żeby udowodnić, że jesteś mądrzejszy od kolegi. To narzędzie, które służy trzem celom:
- Jakość kodu - druga para oczu łapie błędy, które autor przeoczył. Nie chodzi o literówki - chodzi o logiczne błędy, edge case, problemy z bezpieczeństwem.
- Dzielenie się wiedzą - review to najlepsza forma nauki. Reviewer poznaje nowy kod, autor dostaje feedback. Po kilku miesiącach cały zespół zna cały codebase.
- Spójność - utrzymanie jednolitego stylu, wzorców i konwencji w projekcie. Bez review każdy pisze po swojemu.
Jeśli Twoje code review sprowadza się do klikania "Approve" bez czytania - nie robisz review. Jeśli sprowadza się do wyłapywania brakujących średników - robisz robotę lintera.
Co sprawdzać podczas review
Nie da się sprawdzić wszystkiego w każdym PR. Skup się na tym co naprawdę ważne, od najważniejszego:
- Czy rozwiązuje problem? - zanim patrzysz na kod, zrozum co PR ma robić. Przeczytaj opis, sprawdź powiązane zadanie. Najpiękniejszy kod jest bezwartościowy jeśli nie rozwiązuje właściwego problemu.
- Architektura i design - czy kod jest w dobrym miejscu? Czy interfejsy mają sens? Czy nie łamie istniejących wzorców? To najtrudniejsze do naprawienia później.
- Logika biznesowa - czy warunki są poprawne? Czy edge case jest obsłużony? Czy dane są walidowane na granicy systemu?
- Bezpieczeństwo - SQL injection, XSS, brak autoryzacji, wyciek danych w logach. Te błędy są kosztowne.
- Czytelność - czy za pół roku zrozumiesz ten kod? Nazwy zmiennych, długość funkcji, komentarze przy nieoczywistej logice.
- Testy - czy są testy? Czy testują właściwe scenariusze? Czy nie są kruche (zależne od implementacji zamiast zachowania)?
Czego nie sprawdzać ręcznie:
- Formatowanie i styl - od tego jest linter i formatter. Skonfiguruj je raz i zapomnij.
- Typowanie - od tego jest kompilator / type checker.
- Proste błędy składniowe - CI powinien to łapać automatycznie.
Jak dawać feedback
Sposób w jaki piszesz komentarze ma ogromne znaczenie. Ten sam feedback może motywować albo demolować.
Zasady dobrego feedbacku:
- Komentuj kod, nie osobę - "Ta funkcja jest trudna do zrozumienia" zamiast "Napisałeś nieczytelny kod". Różnica subtelna, ale istotna.
- Wyjaśniaj dlaczego - "Użyj prepared statement" to rozkaz. "Prepared statement zapobiega SQL injection - ten input pochodzi od użytkownika" to edukacja.
- Sugeruj, nie narzucaj - "Czy rozważałeś użycie map() zamiast pętli?" brzmi lepiej niż "Nie rób pętli, użyj map()". Chyba że to kwestia bezpieczeństwa - wtedy bądź stanowczy.
- Oznaczaj priorytet - nie każdy komentarz jest blokerem. Używaj prefiksów: "nit:" (drobnostka), "suggestion:" (propozycja), "blocker:" (musi być naprawione).
- Chwal dobre rozwiązania - "Fajne użycie pattern matching tutaj!" kosztuje sekundę, a buduje pozytywną atmosferę.
Jak przyjmować feedback
Review działa w dwie strony. Autor też ma swoją rolę:
- Nie bierz do siebie - komentarze dotyczą kodu, nie Ciebie. Każdy pisze kod który można poprawić.
- Odpowiadaj na komentarze - nawet jeśli to tylko "Done" lub "Dobra uwaga, poprawione". Reviewer musi wiedzieć, że jego feedback został przeczytany.
- Tłumacz swoje decyzje - jeśli nie zgadzasz się z komentarzem, wyjaśnij dlaczego wybrałeś takie podejście. Może masz kontekst, którego reviewer nie ma.
- Ułatw review - mały PR, dobry opis, powiązane zadanie. Duży PR bez opisu to proszenie się o powierzchowne review.
Rozmiar PR - mniejszy znaczy lepszy
To najważniejsza zasada efektywnego code review. Badania pokazują że jakość review drastycznie spada powyżej 200-400 linii zmian.
Dlaczego małe PR są lepsze:
- Łatwiej zrozumieć kontekst zmiany
- Szybciej się je reviewuje (15 minut zamiast godziny)
- Mniejsze ryzyko konfliktów z innymi branchami
- Łatwiej je cofnąć jeśli coś pójdzie nie tak
- Szybszy feedback loop - nie czekasz 3 dni na review
Jak tworzyć małe PR:
- Dziel zadanie na logiczne kroki (refactoring osobno, nowa funkcja osobno, testy osobno)
- Feature flagi pozwalają mergować niedokończoną funkcję bez wpływu na użytkowników
- Jeden PR = jedna zmiana logiczna. Nie mieszaj bugfixa z refactoringiem z nową funkcją.
Opis PR - kontekst jest kluczowy
Dobry opis PR to połowa sukcesu review. Reviewer nie powinien musieć zgadywać co i dlaczego zmieniasz.
Minimum w opisie:
- Co - jedna-dwie linie opisujące zmianę
- Dlaczego - link do zadania, opis problemu który rozwiązujesz
- Jak przetestować - kroki do zweryfikowania że zmiana działa
- Screenshot - jeśli zmiana dotyczy UI, pokaż przed i po
Czas review - nie blokuj zespołu
PR czekający na review 3 dni to zablokowana praca. Autor przeskakuje na inne zadanie, traci kontekst, a merge conflicts rosną.
Dobre praktyki czasowe:
- Review w ciągu 24 godzin - ideał to review tego samego dnia. Maksymalnie następnego dnia rano.
- Blok na review - zarezerwuj 30 minut dziennie na review. Rano albo po obiedzie - stały czas, nawyk.
- Nie przerywaj głębokiej pracy na review - sprawdź PR gdy skończysz bieżące zadanie, nie w środku implementacji.
- Szybkie PR najpierw - mały PR (do 50 linii) zajmuje 5 minut. Nie odkładaj go na jutro.
Automatyzacja - niech maszyny robią to co potrafią
Każdy komentarz w review który mógł być automatyczny to zmarnowany czas człowieka:
- Linter - styl kodu, formatowanie, konwencje nazewnictwa
- Type checker - błędy typów, brakujące parametry
- Testy w CI - czy nic nie zepsuło, czy nowe testy przechodzą
- SAST - statyczna analiza bezpieczeństwa, znane podatności
- Coverage report - czy pokrycie testami nie spadło
Skonfiguruj te narzędzia raz, wymagaj ich przejścia przed review. Reviewer nie powinien tracić czasu na rzeczy, które maszyna sprawdzi szybciej i dokładniej.
Code review a juniorzy
Review kodu juniora to okazja do nauczania, nie krytyki. Kilka zasad:
- Tłumacz "dlaczego" przy każdym komentarzu - junior uczy się zasad, nie tylko poprawek
- Linkuj do dokumentacji i artykułów - "Ten wzorzec to Strategy Pattern, tutaj dobre wyjaśnienie: [link]"
- Bądź cierpliwy - to co dla Ciebie oczywiste, dla juniora może być nowe
- Zachęcaj juniorów do reviewowania kodu seniorów - to najlepsza forma nauki
Najczęstsze błędy w code review
- Review only happy path - sprawdzasz czy działa, ale nie sprawdzasz co się stanie gdy coś pójdzie nie tak. A produkcja to głównie edge case.
- Bikeshedding - godzinna dyskusja o nazwie zmiennej, zero uwagi na logikę biznesową. Skup się na tym co ważne.
- Rubber stamping - klikanie Approve bez czytania. Gorsze niż brak review, bo daje fałszywe poczucie bezpieczeństwa.
- Gatekeeping - blokowanie PR bo "ja bym to zrobił inaczej". Jeśli kod jest poprawny, czytelny i rozwiązuje problem - nie musi być napisany po Twojemu.
- Za duże PR - 2000 linii zmian w jednym PR to nie review, to przeglądanie. Nikt nie jest w stanie utrzymać takiego kontekstu w głowie.
Podsumowanie
Dobre code review to balans: wystarczająco dokładne żeby łapać ważne problemy, wystarczająco szybkie żeby nie blokować zespołu. Komentuj konstruktywnie, trzymaj PR małe, automatyzuj co się da. I pamiętaj - celem jest lepszy kod i lepszy zespół, nie udowadnianie kto ma rację.