To jest bardzo zawiły temat, i wbrew pozorom nie taki prosty.
Zasadność
Zasadność code review, czyli to żeby na dodawany kod spojrzała więcej niż jedna osoba jest jaknajbardziej na miejscu. Są silne dane które potwierdzają to, że im więcej osób zerknie na kod, tym wyższej jakości z mniejszą ilością bugów będzie. Także tutaj, jak najbardziej 10/10
Gate-keeping
Niestety, prawdą jest, że w firmach często robią się struktury "ważnych" i "ważniejszych", i niektórzy "seniorzy" próbują "blokować" wprowadzanie zmian, np poprzez blokowanie wjazdu do master
a i otwierają go tylko przez pull requesty, pod którym musi się podpisać jeden z seniorów. To jest tzn. "gate keeping", czyli ograniczanie programistom dostępu do kodu, właśnie pod przykrywką "code review" i dobrych praktyk.
Z code review nie ma to za wiele wspólnego - nie pełni to funkcji korekt/poprawek, tylko raczej przymuszania do konwencji/rozwiązań (ewentualnie czasem może pełnić też funkcję "mentorowania" że senior blokuje zmiany juniora kiedy mają jakiś oczywisty błąd, ale to rzadko).
W takich wypadkach najczęstsze przyczyny "odrzucenia" PR'a to:
- nie dopasowanie się do jakiejś konwencji, stylu
- umieszczenie kodu w "złych" miejscach (i mówiąc "złych" mam na myśli w odejściu od aktualnej konwencji)
- literówki
- rozwiązanie które się nie podoba review'ującemu
- ownership kodu jednej/kilku osób
Czyli inne powody niż powinny wyjść w trakcie faktycznego code review.
Wprowadzenie Code-Review
Są różne sposoby na wprowadzenie code review. Pomysł z Pull Requestami wziął się oczywiście z projektów open-source - kiedy chcieliśmy dać możliwość wprowadzania zmian wszystkim, ale chcieliśmy mieć kontrolę nad tym co wprowadzają (błędy, bugi, trolling, luki w zabezpieczeniach). Więc pomysł z Pull Requestami swoją bazę ma w gate-keepowaniu - i to ma sens, kiedy bronimy się przed każdym możliwym trollem na całym świecie, jak nasze repo jest publiczne.
Ale pomysł z gate-keepowaniem w organizacji, do którego dostęp mają tylko osoby które podpisały z nami umowę, i mamy do nich zaufanie - raczej nie jest na plus.
Alternatywy do wprowadzanie code review:
- Poziom 0: Pull Requesty - każda najmniejsza zmiana wymaga robienia Pull Requesta, i proszenie o review.
- Wady jakie to ma:
- Po pierwsze, zbyt duży feedback loop - czasem na review trzeba czekać godziny, jak nie dni
- Utrudniona komunikacja, bo piszemy w komentarzach zamiast na slacku/face-to-face
- Review przebiega często przez interfejs webowy (np w diffie na githubie), a prawdziwe code review powinno wyglądać tak że reviewer checkout'uje kod u siebie na lokalu, uruchamia kod, sprawdza czy działa, przechodzi ten sam proces myślowy,
- Prowadzi do pewnego rodzaju "klapek na oczach", do tego stopnia że często osoby pracujące w ten sposób nawet nie zdają sobie sprawy że "można inaczej".
- Obniża zaufanie do innych programistów, budzi poczucie że musimy "pilnować" dostępu przed "złymi zmianami".
- Każda zmiana z reguły wymaga istnienia odpowiedniego taska w jirze (co utrudnia wprowadzanie refaktorów lub poprawek nie związanych z taskami)
- Zalety jakie to ma:
- Praktycznie żadne
- Gate-keeping, jeśli można nazwać to "zaletą"?
- Poziom 1: Mentorowanie, tzn. osoba tworzy rozwiązanie, wrzuca go na branch, prosi mentora o sprawdzenie, mentor przegląda zmiany na swoim lokalnym komputerze, i daje okejkę lub nie (np na slacku lub face to face), wtedy junior sam merguje zmiany do mastera. Jeśli junior uzna że jakaś zmiana nie wymaga review, np poprawka w ReadMe.md czy coś takiego, to może zrobić merge'a do
master
a w ogóle bez wiedzy mentora.
- Zalety:
- Reviewerowi łatwiej jest checkoutować kod, i faktycznie go uruchomić na swojej maszynie - to jest ogromny plus na pull requestami (gdzie praktycznie nikt nie checkoutuje kodu)
- Budzi się większe zaufanie pomiędzy mentorem i juniorem
- Lepsze na dłuższą metę, jeśli chcemy uczyć juniora
- Wady:
- Nie jest tak szybkie jak pair programming
- Feedback loop jest podobny jak przy pull requestach
- Poziom 2: Pair programming
- Zalety:
- Feed-back loop jest praktycznie zerowy, dlatego że review następuje podczas pisania kodu
- Lepszy design, dlatego że mentor aktywnie bierze udział w powstawaniu rozwiązania
- Bardzo dobry knowledge-sharing
- Wady:
- Praktycznie żadnych
- Jedyną jaka jest to to, że ludzie którzy tego nie próbowali, bardzo się obawiają tego spróbować
- Istnieje powszechne przekonanie że pair programming jest wolniejszy niż "normalne developowanie"
Dobre code-review
Uwagi na code review - dobre sugestie:
- Ktoś znalazł buga
- Ktoś zauważył kawałek kodu bez testów
- Ktoś zauważył niezgodność z wymaganiem
- Ktoś zauważył dodanie długu technicznego
- Ktoś robi brainstorming pomysłów
Uwagi na "code review", które są złym symptomem:
- reject przez niedopasowanie się do konwencji
- reject przez nie wpasowanie się w styl reviewera
- reject przez arbitralne preferencje reviewera
Konwencje
I tak jak się zgadzam, że konwencje i umówiony jakiś styl kodu, np poprzez (.editorconfig
) nie jest złym pomysłem - tak nie sądzę że enforce'owanie go przez code review to najlepszy pomysł. Takie coś powinno wyjść na retro, albo podczas pisania kodu w pair programming, albo w jakiś inny sposób.
Możliwe ze "code review" ma złą nazwę, i nie powinno nazywać się "code review", tylko "solution review".