PR Review – historia, problemy i powody2024-06-28Cześć! Ta edycja newsletteru jest współtworzona wraz z Krzysztofem Witczakiem. Wspólnie zastanawialiśmy się skąd tak duża popularność Pull Request Review. Oraz jakie problemy Pull Request Review tworzy w naszych zespołach. W ramach kolejnego wydania podejmiemy dodatkowo temat rozwiązywania kwestii PR Review i mierzenia, czy jest lepiej. Standardowo, czeka Ciebie również Inżynierska Prasówka. A więc w dzisiaj mam dla Ciebie: Miłego czytania 😀 Inżynierska prasówkaRozpoczniemy od praktyk dookoła systemów rozproszonych. Zakończymy wywodem o tym, dlaczego platformy nie mają znaczenia. A pomiędzy tym MVP, ciekawa refaktoryzacja za pomocą AI i rant na mikroserwisy.
PR Review – z czym pracujemyZ Krzyśkiem Witczakiem złapaliśmy się na Mastermind po publikacji na LinkedIn artykułu Pull Request Review - szybciej, lepiej, inaczej. Wymieniliśmy się spostrzeżeniami wokół problemów dookoła PR Review i jak poprawić ten stan rzeczy. Wyszło z tego tyle notatek, że postanowiliśmy podsumować te informacje dla potomnych 😀 Jedna istotna uwaga:
Lecz najpierw krótka historia o tym, skąd PR Review się wzięło. I dlaczego jest ważne, by o tym pamiętać. Historia Pull RequestCiekawe podsumowanie historii PR możemy znaleźć na blogu Daniela Smith’a w artykule A Brief History of the Pull Request. GitGit został stworzony przez zespół pracujący nad jądrem Linuxa. Wraz z nim powstała też komenda Pull Request, aby uporządkować proces zgłaszania zmian. Wewnętrzni i zewnętrzni kontrybutorzy mogli tą prostą komendą zebrać proponowane zmiany do repozytorium. Następnie mieli możliwość je przesłać mailowo na listę mailingową Linux Kernel Mailing List. Tam oceniali ją natomiast główni maintenerzy. Istotne jest wychwycenie tutaj kontekstu pracy nad jądrem Linuxa:
Przy takich założeniach zadaniem jest oczywiście szukanie błędów i wychwytywanie wrogich aktorów.. GitHubNastępnie, w 2008 roku, powstał GitHub. Same Pull Request zostały wdrożone niewiele później – Oh yeah, there’s pull requests now. Zawierały jednak tylko powiadomienia mailowe do osób wskazanych w GUI. Aktualny kształt Pull Request przyjął w 2010 roku podczas aktualizacji Pull Requests 2.0. Mamy znane nam dyskusje, commity, zmienione pliki: Jednak znamienity jest opis zawarty w oryginalnym powiadomieniu od GitHuba:
Pull Request został bezpośrednio powiązany z przeprowadzeniem sprawdzenia kodu. Jeśli zaś skupimy się na repozytorach firmowych to jednak kontekst pracy się zmienił:
Więc skąd wykorzystanie PR w ramach sprawdzenia kodu? Otoczenie narzędziowe 2010Na powyższą sytuację trzeba nałożyć realia roku 2010. W ramach tamtejszej sytuacji brakowało:
Książki takie jak Continuous Delivery dopiero co wprowadzały tematy automatyzacji pod strzechy, tempo wypuszczania oprogramowania było mniejsze. Dużo więcej było więc wymagane od szeregowego pracownika – manualnego potwierdzenia, uruchomienia lokalnie, sprawdzenia testów. Otoczenie narzędziowe 2024Wszystko to, co zostało opisane powyżej jako braki, dziś już w zasadzie jest w standardzie. Mamy nowoczesne narzędzia (a nawet AI). Diametralnie zmieniło się też tempo dostarczania. Więc czemu ludzie wciąż wykorzystują Pull Request Review w 2024 roku, w ten sam sposób co w 2010? Ciężko powiedzieć. Ale mamy kilka teorii. O nich za chwilę - gdy już opowiemy jakie problemy może zrodzić Pull Request Review stosowane jak w 2010.
Problemy dookoła PR ReviewKonflikt interesówReview staje jest poklepywaniem po plecach. Autor czekający na review często już pracuje nad kolejnym zadaniem i chce jak najszybciej “wypchnąć” wiszące zmiany. Jakiekolwiek uwagi w review są tutaj opóźnieniem. A czas uruchomienia funkcji na produkcji jest widoczny dla wszystkich członków zespołu. Reviewer również jest tego świadomy. Dodatkowo nierzadko dochodzi do błędów kognitywnych dookoła kosztu utopionego – Sunk Cost Fallacy: Im więcej uwag znalezionych w kodzie tym mocniej zmieniamy napisany kod. Kod, na który poświęciliśmy czas by go napisać. Więc naturalnie będziemy chcieli z tym kodem iść dalej na produkcję. W efekcie tworzymy środowisko, gdzie:
W takim środowisku błędne zmiany nie będą zawracane, ponieważ ich koszt socjotechniczny będzie zbyt duży. Nie dowozi jakości produktuRozwijając poprzedni punkt, PR Review daje złudne poczucie jakości produktu.
Możemy zacytować tutaj naukowców z pracy Alberto Bacchelli i Christian Bird Expectations, Outcomes, and Challenges of Modern Code Review”
W rezultacie, istotne błędy mogą zostać przeoczone, a złudne poczucie bezpieczeństwa i jakości prowadzi do problemów w produkcie końcowym. PR Review wielokrotnie to tylko minimum, “plaster” na problemy zespołu związane z faktycznym dbaniem o jakość produktu. Różne percepcje jakościZnane nam są przypadki, gdy zespół ma tak zwaną “tribal knowledge”: kto w teamie robi dokładny review, a kto “rozdaje approvale” 😉 To tworzy sytuacje, w których:
Kończymy z sytuacją, gdy PR Review zapewnia bardzo nieregularną jakość. Nie dowozi jakości koduKolejną ułudą jest postrzegane PR Review jako narzędzia do utrzymania jakości kodu. W praktyce często nie spełnia tej roli. Mamy w branży świadomość, że testy manualne czy automatyczne nie wyeliminują wszystkich błędów. Jednocześnie wydaje nam się, że krótkie review kodu podczas PR jest wystarczającą inwestycją w jakość. Recenzenci często skupiają się na drobnych, powierzchownych problemach zamiast na głębokich, fundamentalnych aspektach kodu. Największą wartość mają zmiany dotyczące architektury i struktury kodu, które znajdują się na dole piramidy Code Review Te zmiany są jednak najtrudniejsze do wykrycia (często brakuje nam czasu i kontekstu) oraz naprawy podczas przeglądu PR. Co wpędza nas w… Wydłużanie Lead TimeOstatnio popularyzowany framework DevEx mocno podkreśla znaczenie dwóch filarów produktywności:
Poleganie na review podczas PR wprowadza wąskie gardła w obu tych obszarach - ponieważ wprowadzamy rozpraszacze dla reszty zespołu w losowych momentach (przerywając ich flow) oraz otrzymujemy pętlę zwrotną stosunkowo wolno (kwestia godzin, zamiast sekund). W 2024 roku, kiedy wszyscy mówią o GenAI, możemy sobie wyobrazić, że wolumen produkowanego kodu na kontrybutora będzie rosnąć, co oznacza jeszcze większe problemy ze skalowaniem się tego procesu. Ostatecznie tworzymy znaczne kolejki w zespole - jak Radek opisał w artykule Dlaczego tak wolno dowozimy. Brak kontekstu i przeładowanieRecenzent nie widzi szerszego kontekstu. Pliki, które nie zostały zmienione, nie są widoczne, więc wymagany jest większy nakład pracy by zobaczyć kod, na który może mieć to wpływ (np. miejsca wywołujące zmienioną klasę). Jeżeli pracujemy w projektach, które posiadają oddzielne repozytoria i jeden zespół dotyka ich wszystkich (np. osobne repo na frontend, bibliotekę komponentów, backend, testy e2e, konfigurację itd.), może być konieczne odnoszenie się do poprzednich lub równoległych PR, aby dostatecznie dobrze zrozumieć kontekst wprowadzanej zmiany. Sytuacja robi się jeszcze gorsza, jeżeli:
Wtedy musimy wczytać większy kontekst, aby faktycznie przeprowadzić jakościowe review. Iluzja wymiany wiedzyNa stronie GitHub PR Review zostały opisane jako proces, który wspiera wymianę wiedzy. Twierdzimy jednak coś innego – dają one iluzję wymiany wiedzy. Komentarze dotyczą zmian, a nie wiedzy wymaganej do wprowadzenia tych zmian. Przez co albo:
Prowadzi to do sytuacji, gdzie reviewer spoza zespołu może blokować zmianę (i zespół) na ostatniej prostej. Nie wynika to ze złych chęci tylko braku kontekstu – czy jest to prototyp zawężony do jednego klienta, a może fundament dla prac kolejnych zespołów? Liderzy czy ownerzy repozytoriów/obszarów w kodzie często oczekują prawa approvala aby trzymać rękę na pulsie i wiedzieć co się dzieje. Jednak etap PR review jest zdecydowanie zbyt późnym w SDLC, aby drastycznie proponować zmianę kierunku rozwoju. Przez co zmiany są wprowadzane przy minimalnej wymianie wiedzy. Przedwczesna optymalizacjaW sieci możemy znaleźć wiele artykułów pouczających programistów, aby podczas Review akceptowali inne rozwiązania problemu niż ich preferowane, jeżeli jest to tylko kwestia opinii. W praktyce bardzo ciężko jest pozbyć się biasów i uniknąć takich komentarzy. Uważamy jednak, że ten problem nasili się podczas PR Review:
Reviewerzy z większym doświadczeniem, mają tendencję do proponowania bardziej złożonych podejść. Szczególnie w zespołach, gdzie kultura techniczna jest mocno rozwinięta. To skutkuje kosztownymi zmianami w implementacji, które nie zawsze przynoszą oczekiwane rezultaty, a czasami wręcz łamią zasady KISS i YAGNI. Niestety, na tym etapie jest często tak wcześnie, że jeszcze nie mamy pewności jaki wzorzec czy model abstrakcji będzie znacząco lepszy od prostszych do utrzymania alternatyw. W rezultacie zaczynamy optymalizować i inwestować w nasze wyobrażenie przyszłości, które może się nie spełnić. Utrudnienie wprowadzania małych usprawnieńJeśli każda zmiana musi przejść przez ten sam ciężki proces to wprowadzanie małych, inkrementalnych zmian jest utrudnione. Wobec czego łatwiej jest:
Trudno w takim środowisku stosować zasadę scoutów
Raczej budujemy środowisko, które odstrasza programistów od aplikowania jej. Rozmiar Review wzrastaPo zaakceptowaniu powyższych punktów, większość PR Review będzie dążyła do wprowadzania coraz większych zmian. A to wpływa na opisaną już jakość. Biorąc na tapet artykuł From Async Code Reviews to Co-Creation Patterns z InfoQ:
Tak duże zmiany odstraszają reviewerów - albo przejdą przez proces bez żadnego sprawdzenia, albo utkną tam na wiele dni. Jeżeli wystarczy nam sił na to drugie, to dochodzi tutaj również problem integracji zmian, ponieważ PR wiszący długo zaczyna odstawać od głównego brancha - pojawiają się konflikty i zablokowani programiści, którzy na zmianę czekają. Narzędzia PR powodują relacje ping-pongNie komunikujemy się ze sobą, przerzucamy PR do kolegi. Utrudnia to budowanie relacji w zespole. Budowanie kultury pracy zespołowej (szczególnie w zdalnych zespołach) jest znacznie trudniejsze, gdy cała komunikacja opiera się na komentarzach w GitHub. To promuje relację siły – osoba zatwierdzająca ma władzę. Zwłaszcza w zespołach asynchronicznych, konflikty, które na słuchawce można by rozwiązać w kilkanaście minut potrafią ciągnąć się dniami poprzez komentarze. Powody występowania PR ReviewPrzede wszystkim, podobnie jak inne dobre praktyki, wiele zespołów akceptuje status quo i wykonuje review, ponieważ takiej formy pracy ich nauczono i nikt tego nigdy nie zakwestionował, ani nie zastanowił się, czy nie da się inaczej 😉 Code Review stało się tożsame z PRCiężko jest sobie dzisiaj wyobrazić lidera technicznego, który z dumą podzieli się z kolegami, że nie robi PR code review. Taka deklaracja szybko zostałaby okrzyknięta antywzorcem, cięciem po jakości, zrzucając lidera do pozycji defensywnej. Dobre umiejętności robienia PR code review są dzisiaj weryfikowane i oceniane podczas rozmów o pracę jako jeden z obszar seniority kandydatów, a u liderów są oczywistym wymogiem – i w niemal każdym przypadku jest to tożsame z PR. Zaskakujące jest jak rzadko spotyka się liderów, którzy omawiają inne sposoby dbania o jakość kodu – a przecież nikt nie powiedział, że review musi się dziać wyłącznie podczas PR. Kultura single ownershipKultura single ownership i duży WiP przez jednostkowe przydzielanie zadań. Zaletą jest na pewno to, jak wiele zmian jest naraz wdrażane. W takim modelu każdy programista ma swoje zadania. Rzadko współpracuje nad kodem z innymi. Zmniejsza to wspólną odpowiedzialność za jakość kodu, więc wolimy sprawdzić kogoś innego kod raz a dobrze. Dodatkowo każdy chce stworzyć wymuskany kod by pokazać pracę zakończoną. Nie chce się dzielić czymś w połowie zakończonym, bo ktoś inny go skrytykuje i powie, że brakuje jeszcze A, B,C (pomimo tego, że jest to opisane w komentarzu do PR – kto je ma czas czytać, jak trzeba czytać kod? 😉) A jeżeli jesteśmy oceniani (bo prezentujemy “skończoną” pracę), no to chcemy pokazać się z najlepszej strony. Brak zaufania / bezpieczeństwa psychologicznegoW Open Source nigdy nie wiemy, kto jest po drugiej stronie, jak dobrze zna repozytorium, jakie ma intencje oraz czy jest to jednorazowa kontrybucja czy długotrwała relacja. Nic dziwnego, że poziom zaufania jest niższy. W miejscu pracy sytuacja jest inna - jesteśmy w jednej organizacji, mamy dostęp do wspólnych narzędzi, standardów, mentorów i wspólne cele. Jeżeli dalej nie mamy zaufania, może to wynikać z różnych powodów:
Może to też wynikać z konfliktów, ego, statusu reviewera (potrzeba kontroli, nadążania za zmianami, trzymania ręki na pulsie) – w każdym przypadku należy się zastanowić, dlaczego approval jest konieczny, i czy problem nie leży w nas samych. Może da się uzyskać podobne lub lepsze rezultaty w inny sposób? Dokładny PR review to ciężka praca, ale jak to się przekłada na efekty? Z naszego doświadczenia, problem braku zaufania występuje szczególnie często w zespołach zdalnych. Błędne incentive dla pracownikówOrganizacje chcą w jakiś sposób skwantyfikować mierzenie efektywności pracowników. Robią to w sposób, który kodyfikuje wykorzystywanie PR Review. Wielokrotnie to sama organizacja wprowadza metryki czy zachowania, które utrwalają PR code review w swojej postaci. Często będzie to mierzenie approvali, ilości komentarzy, zaangażowania czy czasu poświęconego na review. Oczekujemy, że programiści, którzy chcą awansować, aby stać się seniorami lub liderami będą często i dokładnie “trzepać” podczas PR review, bo to główny sposób w jaki postrzegamy dbanie o jakość wprowadzonych zmian i zaangażowanie. Naturalnie, metryki te mają na celu zbalansowanie wysiłku pomiędzy członkami zespołu, odkrycie osób najbardziej zaangażowanych i takich, które pomagają odblokować innych członków zespołów. No i oczywiście, gdyby code review było umiejscowione w innym miejscu w SDLC, nikogo nie trzeba byłoby odblokowywać! Nieświadomie, management wywiera presję na zespoły, aby utrzymały status quo, a u młodych liderów wzmacniają znaczenie przypisywane PR code review. Zmiana musi się wyleżeć by była jakośćW branży istnieje wyobrażenie, że zawsze godzimy się na jakiegoś rodzaju kompromis pomiędzy jakością i szybkością:
Dbanie o zapewnianie jakości dzieje się kosztem prędkości. Wobec czego chcąć posiadać wysoką jakość musimy ją wprowadzać wolno. Więc wolne PR Review nie jest tu problemem. Review jako remedium planowaniaW wielu zespołach zwinnych stosujemy założenie, że “User Story” może być stosunkowo ogólnie napisane, a dobry senior sam zaproponuje rozwiązanie. To prowadzi do sytuacji, gdzie reszta zespołu rozmawia faktycznie o implementacji dopiero mając ją już przed oczami na PR review. Powodów takiej sytuacji jest wiele:
Gdy wejdziemy dostatecznie głęboko, to często okazuje się, że wielu błędnych decyzji i spalonych godzin można było uniknąć. Jeżeli całe planowanie prac w zespole ogranicza się jedynie do krótkich sesji groomingowych, to PR review w oczach liderów jest niezbędną bramką, aby weryfikować jakość… ale czy nie da się robić tego lepiej, wprowadzając mniejszy waste? Ucieczka w ReviewNasza praca często jest bardzo męcząca kognitywnie, wielokrotnie musimy dokonywać trudnych decyzji i nie mamy na to energii. Dla niektórych programistów “ucieczka w review”, zwłaszcza w taki skupiony na problemach stylistycznych, to próba odpoczynku bądź prokrastynacji od trudniejszych aktywności. Podobnie jak wcześniej, PR review staje się plastrem na inne problemy. Faktycznie ma ono sensTo zostawiliśmy na koniec 😀 PR Review jest narzędziem jak każde inne. Istnieją scenariusze (wymienione również wyżej), w ramach których ta praktyka ma sens.
PodsumowanieKiedy rozpoczynaliśmy ten artykuł, to miał być o wiele krótszy. Ale liczba problemów i powodów była dla nas zaskakująca. Dlatego postaraliśmy nie iść na łatwiznę i zebrać je wszystkie razem. Daj znać w komentarzach, czy te również odczuwasz te problemy 😊 📧 Prześlij dalejDzięki, że doczytałeś(aś) do końca. 😊 Wszystkie poprzednie wydania newslettera są dostępne tutaj. Jeśli spodobał Ci się mój newsletter, prześlij go proszę osobom, którym też mógłby się spodobać. Z góry dziękuję. A jeśli nie jesteś jeszcze w newsletterze, to zachęcam do zapisania się. Polecam się na przyszłość! "Inżynierskie podejście do produktów cyfrowych." P.S. Co myślisz o tym newsletterze? Odpisz :) |