PR Review – mierzenie i rozwiązania2024-07-13Cześć! Dziś mam dla Ciebie kolejne wydanie współpisane z Krzyśkiem Witczakiem. Kontynuujemy temat PR Review i skupiamy się na podaniu rozwiązań. Przygotowaliśmy ich aż 16 😍 Skupiamy się również jak możemy mierzyć to, czy nasze rozwiązania rzeczywiście pomagają. Czeka na Ciebie również Inżynierska Prasówka z najnowszymi informacjami ze świata IT. A więc w dzisiaj mam dla Ciebie: Miłego czytania 😀 Inżynierska prasówkaRozpoczynamy od LLM i tworzenia własnej aplikacji. I tempo nie zwalnia aż do tworzenia rozwiązań w oparciu o architekturę serverless. Bo pomiędzy: ataki bezpieczeństwa, przemyślenia o code review i zmiany 2024 w branży IT. Zapraszam 👇
Jak usprawnić PR ReviewPoprzedni odcinek newsletteru z Krzyśkiem poświęciliśmy problemom i powodom wystepowania PR Review. Nie chcemy jednak zostawić Ciebie bez rozwiązań. Nie chcemy jednak zostawiać Cię bez rozwiązań. Przychodzimy więc z dzisiejszą kontynuacją 😃 Możesz zauważyć, że spis rozwiązań zamieszczony poniżej jest bardzo długi. Jednocześnie trudno było nam uciec od takiej formy – większość praktyk jest ze sobą połączona. Np. nie wdrożysz Trunk-Based Development, jeśli nie masz odpowiedniego monitoringu. Niczym w serialu Dark: „Everything is connected” Rozpocznijmy jednak od innej strony. Aby wdrażać rozwiązania, trzeba najpierw wiedzieć co poprawiamy. Jak mierzyć, czy jest lepiejNie chcemy tutaj przechodzić od razu do rozwiązań i proponować zmian. Jako pierwszy krok, warto zastanowić się:
To ma na celu:
Warto się nad tym wcześniej zastanowić – jeśli nie skwantyfikujemy zmiany, to osoby na podstawie własnego widzimisię mogą mówić, że jest gorzej. Nawet jeśli wcale nie będzie. Ich poprzednie doświadczenie z PR Review będzie ich pchało z powrotem do starych nawyków. Szczególnie, że na początku rzeczy mogą rzeczywiście iść gorzej niż poprzednio. Jak to obrazował Seth Godwin w swoim poście Understanding Local Max: Na początku rezultaty będą gorsze. Trzeba się nauczyć pracy w parach, usprawnić CI/CD, kooperować z PM by zmniejszać rozmiar partii. To są ciężkie zadania, które dopiero z czasem procentują. Przygotujmy się na tygodnie a nawet miesiące zmieniania nawyków, obserwacji metryk i wprowadzania korekt. Więc co mierzyć? Poniżej spis tego, co możemy mierzyć. Ważna uwaga – nie chcemy mierzyć wszystkiego. Wybieramy to co uważamy za istotne dla naszego zespołu. DORA – prędkość i jakość dostarczaniaWarto rozpocząć od metryk DORA. Tutaj przypomnienie dla czytelników od Allstacks: Pomiar metryk DORA i klasyfikacja naszego zespołu (self-assessment) pozwoli nam szybko stwierdzić, gdzie jesteśmy teraz i określić, gdzie chcielibyśmy być.
DevEx – odczucia pracyKolejnym obszarem, na który możemy zwrócić uwagę jest DevEx – Developer Experience. Z materiałami przychodzi tutaj Abi Noda i jego Applying the DevEx framework, jak i również ankiety Developer Experience od CTO firmy DevEX, Laury Tacho (link). Wspomnieliśmy wcześniej jak klasyczny PR Review wpływa negatywnie na obszary:
Każdy z obszarów DevEx możemy próbować mierzyć i optymalizować. Atrybuty jakościowe – jakość produktuMetryki DORA mierzą prędkość procesów dookoła DevOps. Można spojrzeć szerzej i skupić się na atrybutach jakościowych samego produktu. Jeśli je mierzymy to wdrażając usprawnienia do PR Review nasza jakość powinna wzrastać. Poniżej spis kilkunastu z atrybutów, na które można zwrócić uwagę z ebooka Radka: Drivery architektoniczne w twoim zespole. W ramach zmian dookoła PR Review powinny poprawiać się wskaźniki takie jak:
A to już można kwantyfikować i oceniać. Rozwiązania na Code ReviewCzas na kilka propozycji rozwiązań. Żadna z nich nie jest oczywiście silver bulletem na wszystkie omawiane przez nas problemy – zachęcamy, aby zastanowić się, które z nich występują w Twoim zespole i zbudować zgraną kompozycję z kilku- poniższych propozycji. Pair programmingRozwiązaniem najczęściej rekomendowanym przez popularnych mentorów takich jak Dave Farley czy Martin Fowler jest pair programming. Dla osób słyszących o programowaniu w parach po raz pierwszy polecam krótkie wprowadzenie z artykułu On Pair Programming ze strony Martina Fowlera:
To co jest istotne z perspektywy PR Review to kwestia code review:
Istnieje kilka zasad, które pomagają wprowadzić programowanie w parach do zespołu:
Pair programming nie jest metodą, którą będziecie w stanie zastosować na 100% i w każdym momencie pracy. Błędem jest natomiast odrzucanie tej metody bez podjęcia jakiejkolwiek próby! Non-blocking continuous code reviewsKlasycznie PR review dzieje się tuż przed mergem zmian. Z tego właśnie powodu pojawia się potrzeba, aby review był szybki:
Skuteczne zespoły świadome tego problemu dzielą scope rozwiązania na dwie sekcje:
Jeżeli pomyślimy o jakości kodu w oprogramowaniu zawsze można coś usprawnić, ulepszyć, poprawić, zmienić. Kod nigdy nie jest skończony, nigdy nie mamy pewności, czy nie ma w nim błędów, edge case’ów. Idąc za tą teorią, PR review skupiony przede wszystkim na poprawianiu jakości i dzieleniu się wiedzą również nie musi być etapem blokującym dla biznesu. Jeżeli wyobrazimy sobie “code review” jako kolumnę w kanbanie tuż przed releasem rozwiązania, to teraz zostaje ona przeniesiona na moment po release. Jak to działa w praktyce?
Zauważ, że taka regularna sesja pozwala nam wejść w zagadnienia jakości znacznie głębiej. Z tego typu spotkania powinniśmy wrócić z szeregiem pomysłów na usprawnienia. Niewykluczone, że zajmą one wiele dni, ale biznes nie jest tym aż tak rozgoryczony, bo otrzymał już rozwiązanie, z którym może w międzyczasie eksperymentować. Czy to jest realne do wprowadzenia? Thierry de Pauw opisuje takie podejście w swoim artykule Non Blocking Continuous Code Reviews, a case study i prezentacji na tej podstawie: Podejrzewamy, że zastanawiasz się - ale co z funkcją PR review polegającą na wyłapywaniu błędów i znaczących nieporozumień, rzeczy poza samą jakością kodu? Jak ograniczyć ryzyko? Proponujemy zmixować tą metodę z innymi zaproponowanymi w tym poście 😊 Dev CarouselPrzykładem na zastosowanie cyklicznego sprawdzania kodu przed wdrożeniem dzieli się w swoim artykule Dev Carousels Maciej Jędrzejewski:
Spotkania te odbywają się z zasady rano, trwają od 30 minut do godziny i uczestniczą w nich wyłącznie osoby techniczne. Omawiane są kwestie dotyczące architektury, struktury kodu, wzorców projektowych oraz bieżących problemów i strategii. Spotkania te mają na celu skrócenie czasu przetwarzania pull requestów. Sprawdzamy kod na bieżąco, co prowadzi do poprawy jego jakości oraz zwiększenia efektywności pracy zespołu. Na końcu mamy kod sprawdzony, czyli gotowy do wdrożenia. Maciej podkreśla również, że Dev Carousel sprzyja integracji zespołu, tworząc przestrzeń do wymiany doświadczeń i wiedzy technicznej. Regularność i elastyczność tych spotkań pozwalają na bieżąco monitorować stan projektu. Ship / Show / AskMożemy również spojrzeć na ten problem z zupełnie innej perspektywy. Jak często zdarza nam się angażować PR code review do zmiany jedno-wyrazowego typo, zmiennej czy innego buga? Czy w takiej sytuacji blokada, review i approval zawsze są niezbędne? Na pewno są sytuacje, gdy taki fix jest wart podzielenia się, ale z naszego doświadczenia wynika, że często robimy to tylko dla formalności. Rouan Wilsenach proponuje metodę Ship / Show / Ask, która pomaga nam ograniczyć niepotrzebne PR review i wdrożyć ten proces stopniowo: Ask: Pytaj o review, potem merguj To jest nasza klasyczna metoda PR review, którą staramy się ograniczyć, ponieważ jest kosztowna. Jak i kiedy ją stosować?
Show: najpierw merguj, potem pokaż i poproś o feedback Szukaj okazji kiedy możesz zbudować zaufanie poprzez pokazanie, że nic złego się nie stało - jesteś w stanie dowieźć szybko rozwiązanie, ale jednocześnie tworzysz pole do dyskusji, natomiast nie jest ona dla nikogo blokująca. Świetnie się sprawdza do dzielenia się wiedzą. Jak tę metodę stosować?
Ship: po prostu merguj Wprowadzasz zmianę natychmiastowo bez zakłócania pracy innych osób, najlepiej w sytuacjach, gdzie review jest wyłącznie formalnością. Kiedy ją stosować?
Mogłoby się wydawać, że zmian typu “Ship” i “Show” powinno być mało, ale w praktyce jest ich całkiem sporo. W swoim artykule Rouan przedstawia kilka dodatkowych zasad i sugestii dla zespołów, z którymi warto się zapoznać. Luca Rossi opublikował też niedawno artykuł o bliźniaczej metodzie “Automate / Defer / Pair”, w którym twierdzi, że w zdrowej organizacji najwięcej zmian powinno być typu “non-blocking review” w postaci “Defer”. Co ciekawe, alternatywą dla “Ask” w jego formule jest “Pair”… co dobrze łączy się z innymi pomysłami w naszym poście. Rozwiązania na złagodzenie bólu reviewZmniejszenie skali zmianOd lat słyszymy, że dzielenie user stories na mniejsze kawałki to coś, co warto robić. To podejście wprowadza dla nas kilka ważnych cech:
Wszystkie te cechy przyspieszają delivery. Popularna metoda “no estimate” sugeruje, aby przejść z estymacji godzinowych na punkty, a potem z punktów na zadanie na około “jeden dzień”, tak aby wiadomo było, że developer wrzuca zmiany minimum raz dziennie. Nie opisujemy tutaj konkretnych technik – Radek przygotował na ten temat inny odcinek newsletteru ✂ 5 technik podziału funkcjonalności na mniejsze. Praktyki stopniowego wdrażaniaChcemy dzielić zadania na małe kawałki i wrzucać je bezpiecznie na produkcję, nawet bez review. Musimy więc mieć możliwość ukrywania niedokończonego kodu przed użytkownikiem końcowym. To wymaga od nas zmiany mindsetu – wdrożenie kodu nie będzie tożsame z uruchomieniem. Dobrze to opisuje artykuł Deployment vs. Release: W wprowadzeniu tej idei w życie wspierają nas praktyki stopniowego wdrażania:
Istnieją liczne usługi (płatne i open source) pomagające implementować feature flagi takie jak LaunchDarkly czy Unleash. Pamiętaj, że ten wzorzec ma pomagać w efektywnym wdrażaniu - flagi wdrożeniowe powinny mieć krótki okres życia - w przeciwnym wypadku nasz kod szybko stanie się bardzo zagmatwany. Shift left decyzji technicznychOstatnio wspominaliśmy, że zespoły często mają problem z planowaniem, i “nadrabiają” na review. Wielu problemów jesteśmy w stanie uniknąć przenosząc kluczowe decyzje wcześniej w procesie. Istnieje definicja “feedbacku 80/20”. Zasada ta mówi, że powinniśmy dopasować nasz feedback do etapu prac.
O tym również wspomina często Adam Dymitruk, twórca techniki Event Modelingu – tu jeden z jego postów: Nowoczesne metody Product Discovery starają się angażować developerów bardzo wcześnie na etapie odkrywania wymagań. Proces, który możemy polecić, wygląda następująco:
Nie chcemy podejmować istotnych decyzji architektonicznych bez potwierdzenia ze strony zespołu.Cała idea “shift left” polega właśnie na wyeliminowaniu ad-hocowych decyzji podczas implementacji. Dzięki temu unikamy niezgody na późnych etapach dostarczania. Krótko żyjące brancheAby ułatwić sobie sprawdzanie kodu przed zmergowaniem trzeba mieć mniej kodu do zmergowania #ThankYouCaptainObvious 😅 Aby to wdrożyć w życie musimy przyjąć podejście, które skupia nas na tym by gałęzie kodu były możliwie jak najkrócej żyjące. I jest na to rozwiązanie: Trunk-based development (TBD) to alternatywna strategia branchowania do GitFlow czy GitHub Flow. Strategia ta istnieje w kilku wariantach w zależności od rozmiaru zespołu, ale główna idea polega na tym, że branch na którym pracujemy powinien być “short-lived”. Najczęściej punktem krytycznym tutaj są dwa dni, po których spodziewamy się, że developer zacommituje swoje zmiany do main brancha (trunka). Jak to wpływa na PR review? TBD zakłada, że jeżeli robimy PR review, to musi on być szybki – zasada ta nazywana jest Continuous Code Review.
O czym również warto pamiętać:
Rozwiązania na zachowanie jakościArgumentem strony pro PR Review jest to, że taki model sprawdzania kodu zapewnia jakość. Przygotowaliśmy więc praktyki, które pozwolą wam zachować jakość pomimo braku PR Review. Continuous IntegrationMożesz teraz powiedzieć: „Jak to, przecież narzędzie CI nie zapewni mi jakości”. I masz dużo racji. Ale jednocześnie się mylisz 😃 Nie chodzi nam tutaj o narzędzie (Jenkinsa, GitHub Actions, czy inne). Chodzi nam o praktykę Continuous Integration. Najlepiej wykorzystać tutaj fragmenty z ksiązki książki Continuous Delivery autorstwa Jez Humble i David Farley: 1. Szybkość integracji
Integrujesz swój kod z głównym branchem przynajmniej raz dziennie. Wielkość twoich zmian jest na tyle mała, że kodu do sprawdzenia nie jest dużo. A to zmniejsza diametralnie liczbę potencjalnie wprowadzanych błędów. 2. Testy potwierdzające działanie
Uruchamiasz zbiór testów co integrację. Testy zapewniają, że twoja zmiana nic nie popsuła. Jeśli testy przechodzą, to wiesz, że jesteś gotowy by wrzucać na proda. A jeżeli nie ufasz swoim testom, bo są niedeterministyczne, musisz najpierw rozwiązać ten problem. 3. Build jest krótki i zawsze działający
Jeśli kod buduje się zbyt długo to naprawiacie build. Jeśli proces budowania się zepsuł to priorytetem zespołu jest naprawienie właśnie tego elementu. Aktywnie pracujesz, aby budowanie kodu dawało natychmiastowy feedback. Wg guide’ów XP szybki build to taki który trwa mniej niż 10 minut łącznie z testami. 4. Lokalne środowisko pracy
Środowisko pracy wspiera Cię, umożliwiając lokalne przeprowadzanie wszystkich testów. Posiadasz odpowiednią konfigurację i pliki startowe. Jesteś w stanie lokalnie odtwarzać błędy i testować zmiany. Włączając w swoją pracę aspekty wymienione wyżej, zyskasz mechanizmy integracyjne, które umożliwią uniknięcie części problemów jakościowych dookoła PR Review. Definiowanie i wdrażanie przypadków testowychSprawdzanie przypadków testowych już po napisaniu kodu sprawia, że przywiązujemy się do tego co napisaliśmy - skupiamy na rozwiązaniu, a nie na problemie. Co sprawia, że trudniej jest wyłapać, czy aby na pewno pokryliśmy wszystkie przypadki testowe.
Zastosowanie tych obu technik wymusza:
Dzięki temu wcześnie wykrywamy problemy i redukujemy, lub nawet eliminujemy potrzebę ręcznych przeglądów kodu. Testy są uruchamiane automatycznie i natychmiastowo informują o problemach, co pozwala na szybką reakcję i korektę. Ciekawie to podsumowuje Shormistha Chatterjee w swoim artykule o BDD vs TDD:
Systematyczne i powtarzalne testy są bardziej efektywne i dokładne niż ręczna weryfikacja. Z doświadczenia wiemy, że TDD jest trudne dla wielu developerów, ale jak wszystkie praktyki wymaga przećwiczenia. Często problemem są nasze luki w wiedzy dotyczącej właśnie pisania testów automatycznych i to, że zajmuje nam to więcej czasu niż powinno. Nie przejmuj się jednak – po paru tygodniach pracy w TDD ten problem znika. Statyczna analiza koduNaszym celem jest, aby automatycznie potwierdzać wysoką jakość kodu i wymagane standardy zamiast wymuszać tą aktywność na kolegach z zespołu. Co możemy wykorzystać?
Dzięki temu odpada nam duża część manualnej pracy podczas review. Spory kawałek zapewniania jakości przejmuje automat. Idealnie, jeżeli większość tej analizy możemy wykonać na lokalnej maszynie tak, aby nasz feedback loop był jak najkrótszy. Monitoring i prewencjaWraz ze zwiększeniem prędkości dostarczania i wzrostem złożoności systemu, część zapewniania jakości musimy przenieść na stronę post-wdrożeniową. A w tym pomaga nam obserwowalność. Zamiast inwestować w kosztowne i czasochłonne testy E2E (które również zmagają się z problemami niedeterministyczności), skupiamy się na wdrażaniu mechanizmów obserwowalności. Wielkie firmy technologiczne, takie jak Netflix czy Amazon, już od dawna polegają na zaawansowanej obserwowalności zamiast na tradycyjnych metodach testowania. W środowiskach mikroserwisowych trudno o inną formę obrony. Dziś skupiamy się na 2 aspektach obserwowalności – monitoringu i prewencji. Monitoring, jak sama nazwa wskazuje, skupia naszą uwagę na monitorowaniu kluczowych scenariuszy naszego użytkownika. Dzięki niemu szybko wykrywamy problemy, zanim staną się krytyczne. Jesteśmy powiadamiani natychmiast o anomaliach i odchyleniach od normy. Gdy już zaobserwujemy problemy mamy do dyspozycji szereg mechanizmów prewencji:
Mechanizmy obserwowalności redukują potrzebę ręcznych przeglądów i testów, ponieważ system sam wykrywa i sygnalizuje potencjalne problemy. Automatyczne mechanizmy prewencyjne minimalizują ryzyko błędów, jednocześnie obniżając koszty związane z manualnymi procesami weryfikacji. Nowoczesne firmy inwestują następnie w chaos engineering, aby zaobserwować czy infrastruktura, monitoring i automatyczna prewencja są w stanie poradzić sobie w stresujących sytuacjach. Takie “testy” dają nam znacznie większą pewność jakości i niezawodności niż testy e2e. Więcej o tym opisał Radek w newsletterach: Rozwiązania na zwiększenie zaufaniaJednym z głównych powodów przeprowadzania PR Review nie są problemy funkcjonalne, ale emocjonalne. Nie ufamy naszym kolegom/koleżankom, że wypełnią swoje obowiązki jak należy. To sprawia, że chcemy sprawować bezpośredni nadzór nad ich pracą. Praktyki opisane poniżej adresują te problemy – chcemy zwiększyć zaufanie do naszego zespołu, tak by powierzać im określone obszary produktu, Główną metodą, którą możemy tutaj polecić jest wspomniane już Ship / Show / Ask i przejście więcej na tryb “Ship” i “Show”. Istnieje jeszcze kilka praktyk wartych polecenia: Techniczne Show & TellPodejście Show & Tell często pojawia się dookoła metod zwinnych. Jest to metoda na zaangażowanie interesariuszy w wyniki sprintu – tak, aby przedyskutować to co zostało dowiezione i ustalić dalsze akcje. To samo podejście możemy zastosować do technicznej pracy.
Takie spotkanie skupia się na cyklicznej wymianie wiedzy i uczeniu od siebie wzajemnie. Dzielimy się dobrymi praktykami i jednocześnie adresujemy problemy, z którymi będziemy musieli sobie poradzić w kolejnych tygodniach.Sama dyskusja ma charakter o wiele głębszy niż typowe PR Review. Do Technicznego Show&Tell możemy bardziej się przygotować. Każdy ma na to spotkanie czas. Mamy miejsce na otwarte pytania. Dzięki temu:
Ostatecznie, zaufanie wzrasta. Określenie ważności systemów i obszarówWymagania jakościowe nie są takie same dla wszystkich systemów i obszarów:
Z wyżej wymienionych względów, utrzymywanie tego samego standardu jakości i kodu nie jest optymalnym inżynieryjnie rozwiązaniem. Zastanów się, czy praktyki, które stosujecie są dopasowane do fazy i znaczenia tego projektu. Czy każdy w zespole zdaje sobie z tego sprawę? Zadbaj, aby te praktyki były w zespole wiążącym elementem wzajemnego zrozumienia – niczym kontrakt. Niech każdy wie, co jest od niego oczekiwane, czemu w tym projekcie jesteśmy bardzo dokładni, a w innym mniej. Zobaczysz jak wiele rozbieżności znajdziesz pomiędzy poszczególnymi członkami zespołu. Mając ustalone jasne reguły łatwiej jest sobie ufać, bo każdy wie co jest od niego oczekiwane. Unikanie matkowaniaCiekawym i zupełnie nieoczywistym problemem jest “matkowanie” mniej doświadczonych programistów. Świetni liderzy, mając dobre intencje wyjątkowo dokładnie weryfikują zmiany mniej doświadczonych programistów. Jest to forma mentoringu i nauki. W sytuacjach ekstremalnych może jednak dojść do sytuacji, gdzie zespół polega na liderze jako na swojej “siatce bezpieczeństwa”, trochę jak na kolejnej warstwie testów. Te zachowania są często nieświadome:
Tworzy to ogromny bus factor w zespole, wywiera presję na liderze i przyczynia się do powstania dysbalansu wysiłku. Jeżeli jesteś takim liderem – chociaż to zabrzmi kontrowersyjnie – przestań ratować swój zespół. Gdy zabraknie siatki, wielu z nich szybko dojrzeje i podniesie swoje standardy. Trial by fireCzęsto w naszych firmach zakładamy, że bardziej doświadczona osoba zawsze musi patrzeć mniej doświadczonej na ręce. Jeżeli jednak nie jesteś w stanie usunąć wymogu approvala od członków zespołu nawet po okresie 6 miesięcy, zastanów się, dlaczego tak się dzieje:
Z naszego doświadczenia firmy, które mocno unikają konfrontacji dochodzą do poziomu „ruinus empathy” z Radical Candor: Podejście „trial by fire” promuje przeciwne zachowanie
Jest to prosta zasada i łatwa do wdrożenia w założeniach funkcjonalnych, ale trudniejsza w emocjonalnych. Dlatego upewnij się, że ta obawa o wrzucanie zmian przez twoich kolegów i koleżanki jest uzasadniona - że nie jest to tylko Twój własny strach lub ego. PodsumowanieTo już wszystko na dzisiaj – ten artykuł jest już i tak za długi. 😅 Na tym etapie pewnie dostrzegasz już, że wiele z tych praktyk się uzupełnia, ma części wspólne lub nawet bardzo podobne założenia. PR Code review jest głęboko zakorzeniony w kulturze większości firm a dla wielu developerów odejście od tego procesu wydaje się być wręcz obrazoburcze 😊. Mamy nadzieję, że po lekturze rozumiesz, że istnieją lepsze alternatywy. Zachęcamy do eksperymentów w Twoim zespole i zmierzenia sytuacji przed i po w oparciu o metryki powyżej - a potem wróć do nas, i pochwal się jak Ci poszło! 📧 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 :) |