Recenzje kodu czy naprawdę działają w prawdziwym Agile?

13

Więc zacząłem pracować dla dużego korpusu, jednego z tych 3 liter w nazwie, i oni próbują stać się Zwinnymi, ale mają mnóstwo procesów, które nie uważam za Zwinne.

Ten, który najbardziej mnie skończył, to recenzje kodu. Moja ostatnia praca dotyczyła startupu, który powiedziałbym, że jest najbardziej zwinnym zespołem programistycznym, jaki widziałem, w którym pracowałem i / lub kiedykolwiek słyszałem.

W każdym razie, moim argumentem jest to, że Code Review to strata czasu w iteracyjnym lub zwinnym rozwoju, w którym UX / UI jest ekstremalny / intensywny (pomyśl o doskonałości Apple / Steve Jobs). Może ktoś tutaj pomoże zrozumieć, zanim mnie zwolni?

Oto mój proces rozwoju i ten przy ostatnim uruchomieniu ... bardzo zwinny.

Robimy wczesne prace nad funkcjami sortowania zadań / zadań programistycznych. Wyśmiewalibyśmy kilka wersji i przedstawialiśmy użytkownikom, zespołowi i działowi marketingu, aby uzyskać opinie. Następnie wykonujemy kolejną iterację makiety, aby uzyskać jedną rundę od tych samych interesariuszy powyżej. Następnie podzielimy pracę i zaczniemy. Mamy kamienie milowe i daty do spełnienia, ale wciąż się rozłączamy. Nie mamy recenzji kodu w żadnym z tych przypadków. Kilka razy w ciągu tygodni naszego rozwoju ponownie przeprowadzamy sesje z interesariuszami, aby sprawdzić, czy nadal zgadzają się cechy / funkcje / UX / UI są nadal odpowiednie i zgodne z celem.

Gdy zbliżamy się do końca 8-tygodniowego cyklu iteracji, QA rozpoczyna testy, następnie przechodzi do użytkowników wersji alfa, a wreszcie do użytkowników wersji beta. Ale w fazie alfa i beta programiści omawiają nowe funkcje i starsze funkcje, wprowadzając iteracyjne codzienne lub godzinne zmiany w interfejsie użytkownika w celu ulepszenia interfejsu użytkownika. Tak więc funkcja, która była opracowywana w tym wydaniu, może zostać zmieniona jeszcze 3 razy w ciągu ostatnich czterech tygodni, aby ją ulepszyć i udoskonalić lub dodać kilka drobnych funkcji (np. Sprawić, że komponent będzie trochę płynniejszy lub inteligentniejszy). Czasami zmiany mogą być powierzchowne, co oznacza, że ​​żadne operacje CRUD nie są zmieniane ani modyfikowane, ale wszystkie zmiany w interfejsie użytkownika ulegają zmianie.

Więc przy takim procesie rozwoju, ekstremalnie zwinny, czy recenzje kodu nie byłyby stratą czasu? Oznacza to, że gdybym miał innego programistę lub dwóch, którzy sprawdzili mój kod, ale ten kod zmienia się jeszcze 3 razy, zanim wyjdzie za drzwi, z powodu wszystkich ulepszeń interfejsu użytkownika / interfejsu użytkownika, czy nie marnujemy czasu na pierwsze 3 razy, gdy sprawdzili go kod, ponieważ ten kod / komponent / interfejs użytkownika został zezłomowany?

Nigdy nie mieliśmy wielu problemów z jakością z tym procesem i tak, jeśli programista opuścił całą wiedzę, wyszedł za drzwi, ale zawsze znaleźliśmy inteligentnych programistów, którzy mogliby ją przejąć i przejąć.

I tak, mamy wielu testerów, ponieważ mogą oni musieli przetestować rzeczy 3 lub 4 razy. Proszę też nie rozłączać się pytaniem, dlaczego wszystkie zmiany UI / UX ... tak właśnie się robi ... to wtedy aplikacja zdobywa mnóstwo nagród dla UI / UX, a użytkownicy zabiją za app. Proces myślowy polega na tym, że jeśli mogę coś ulepszyć nawet o 2%, ponieważ mam dodatkową godzinę, zrób to. Użytkownicy będą szczęśliwsi, co oznacza więcej $ lub użytkowników. I tak, nasi użytkownicy są w porządku z ciągłą zmianą aplikacji, ponieważ tak robiono od pierwszego dnia, aby nie postrzegali jej jako złej lub negatywnej.

Mam nadzieję, że ten post nie wygląda tak pompatycznie, ale po prostu nie widzę, jak Recenzje Kodeksu nie są marnotrawstwem. Być może 2% całego naszego kodu w sprawdzonym kodzie ma błędy. W każdym wydaniu możemy znaleźć 3 błędy poprzez przegląd kodu. Czyli kończy się 40 godzin sprawdzania kodu na programistę na wydanie (4 x 40 = 160 godzin), aby znaleźć 3 do 5 błędów? Szanse są 50%, że 3 do 5 błędów zostałoby wychwyconych przez QA. Czy nie lepiej byłoby spędzić 40 godzin na programistę, dodając nową funkcję lub ulepszając istniejące?

użytkownik25702
źródło
@DeadMG: User Experience
Steven A. Lowe
4
@ user25702: opisany przez ciebie proces nie brzmi jak Agile, to brzmi jak RUP / spiral. W szczególności „Kilka razy w ciągu tygodni naszego rozwoju ponownie przeprowadzamy sesje z interesariuszami, aby sprawdzić, czy nadal zgadzają się cechy / funkcje / UX / UI są nadal odpowiednie i zgodne z celem”. jest anty-zwinny; funkcje są zawieszane podczas iteracji, aby uniknąć problemów z ruchomym celem związanych z podejściami RUP / spiralnymi. Co do twojego nominalnego pytania, nie widzę tu dużej wartości w recenzjach kodu, jeśli tylko jesteś pewien, że błędy zostałyby znalezione przez QA.
Steven A. Lowe
1
8-tygodniowe iteracje nie są zwinne i zdecydowanie nie są „ekstremalnie zwinne”.
Martin Wickman,
Niektórzy premierzy uważają, że iteracje oznaczają, że mamy kilka krótkich iteracji na początku i kilka długich iteracji w środku, a następnie tyle krótkich iteracji na końcu, ile potrzeba. Problem polega na tym, że miesza się to z rytmem bitewnym rozwoju oprogramowania i umiejętnością wczesnego wykrywania błędów. 8-tygodniowa iteracja byłaby jedną z tych środkowych iteracji. Zgadzam się, że to nie jest zwinne.
Berin Loritsch,
Jeśli chcesz dyskutować o recenzjach kodu, zalecamy pobranie statystyk. Dokumentuj czas potrzebny na przegląd kodu (w sumie roboczogodzin), liczbę wykrytych w nich błędów / problemów, a także wagę problemu. Dla mojego zespołu okazało się, że spędziliśmy co najmniej 16 roboczogodzin na recenzję, stwierdziliśmy średnio 2-3 błędy, z których wszystkie miały charakter kosmetyczny. Łatwo było argumentować za metodologią opartą na pierwszym teście, aby zastąpić wzajemne oceny w obliczu tych liczb.
Berin Loritsch,

Odpowiedzi:

13

Jest kilka rzeczy, które recenzje kodów mogą dla Ciebie zrobić, a niektóre nie. Argumenty na rzecz recenzji kodu:

  • Własność zbiorowa
  • Znajdź błędy (QC)
  • Egzekwuj spójny styl (QA)
  • Mentoring

Wiele zwinnych procesów radzi sobie z nimi na różne sposoby:

  • Własność zbiorowa: wszyscy w zespole są odpowiedzialni za projekt, co oznacza, że ​​oczy wszystkich będą skierowane na kod w dowolnym momencie.
  • Bezpłatne refaktoryzacja: przenosi recenzje kodu na wyższy poziom i pozwala każdemu zespołowi na przeprowadzenie refaktoryzacji w razie potrzeby.
  • Testy jednostkowe (QC): testy jednostkowe są bardziej wydajne i mniej podatne na błędy ludzkie niż kontrola wzrokowa. W rzeczywistości muszę jeszcze znaleźć bardziej skuteczny środek.
  • Programowanie w parach (QA): zajmuje się opieką mentorską i zapewnia wczesne porady dotyczące refaktoryzacji po napisaniu kodu. Jest to również wciąż kontrowersyjny temat, ale uważam, że pomaga to w rozwoju nowego programisty. To także dobry moment na egzekwowanie standardów kodowania.

Zasadniczo istnieją inne możliwości zadbania o potencjalne korzyści, jakie normalnie uzyskałbyś podczas przeprowadzania wzajemnych ocen. Moje osobiste doświadczenia z recenzjami są takie, że są to bardzo nieefektywne mechanizmy i nie są skuteczne w znajdowaniu błędów lub większych wad projektowych. Mają jednak swoje miejsce w niektórych zespołach, a przy projektach, w których zwinność nie jest możliwa (z jakiegokolwiek powodu), są one bardzo potrzebne.

Berin Loritsch
źródło
3
Wydaje się, że obecna odpowiedź zawiera pewne dezinformacje. Wspólna własność nie oznacza „cały czas patrzeć na cały kod”. Refaktoryzacja nie ma nic wspólnego z wykrywaniem wad. Testy jednostkowe i inspekcja służą różnym celom i w rzeczywistości każdy może wykryć różne rodzaje wad (przykłady w innych odpowiedziach). Programowanie w parach, choć jest formą recenzji, nie jest prawdziwym zamiennikiem np. Inspekcji Fagana. Twoje osobiste doświadczenia wydają się nietypowe, szczególnie w odniesieniu do błędów projektowych - jakie rodzaje recenzji wykonałeś? Jak oceniłeś skuteczność recenzji?
Michael
1
Czas wykonywania przeglądu vs. stwierdzone wady i ich dotkliwość. Porównaliśmy to z tymi samymi wskaźnikami z testami jednostkowymi. Problemy wykryte podczas przeglądania kodu prawie zawsze były związane z formatowaniem kodu i zajmowały więcej czasu. Ten sam czas poświęcony na przeprowadzanie testów jednostkowych odkrył prawdziwe problemy i nie zajął się już przygotowywaniem i wykonywaniem.
Berin Loritsch,
„Własność zbiorowa”: Z mojego doświadczenia wynika, że ​​jest to złudzenie: recenzenci często wybierają drobne szczegóły i nie widzą dużego obrazu w kodzie napisanym przez innych. Następnie, jeśli chodzi o modyfikację tego kodu, tak naprawdę go nie rozumieją i (1) nie odważą się go zmienić lub (2) intensywnie przepisują go, aby go zrozumieć. Podejście (2) często ma dwa skutki uboczne: (A) wprowadzają błędy i (B) pierwotny programista nie rozumie już kodu.
Giorgio
Punkt B pokazuje, że często zdarza się, że nie jest to własność zbiorowa, ale indywidualne przenoszenie własności przez jednego programistę przez cały czas. W ten sposób każdy członek zespołu z grubsza wie, co robi kod i jak jest zorganizowany, ale nikt tak naprawdę go nie rozumie. Prawdziwa własność zbiorowego kodu wymagałaby znacznie więcej czasu i dyskusji na temat kodu, aby uzyskać wspólne zrozumienie, ale często ten czas jest po prostu niedostępny.
Giorgio
11

Czy jednak recenzje kodu służą wyłącznie do znajdowania błędów? Wydaje ci się, że to prawda, a ja nie.

Twierdzę, że recenzje kodu mogą dotyczyć bardziej zbiorowego prawa własności do kodu, upewnienia się, że wiedza jest podzielona na wiele głów i przygotowania innych do dziedziczenia kodu, który może dotyczyć zarówno nowych funkcji, jak i błędów. Lubię recenzje kodu jako sposób na sprawdzenie i wyważenie systemu, ponieważ nigdy nie wiadomo, kiedy ktoś może mieć pojęcie, gdzie można napisać coś od nowa, aby zachować konwencje.

JB King
źródło
4

Programowanie w parach to odpowiedź XP na recenzje kodów. Zasadniczo każdy wiersz kodu jest sprawdzany podczas pisania. To ekstremalne recenzje kodu.

Dave
źródło
7
Mocno się z tym kłóciłbym. Jasne, jest recenzowany przez dwie osoby, ale te osoby są na ogół na tej samej stronie, w trakcie pisania kodu. Recenzja kodu to osoba z zupełnie innym stanem umysłu, która patrzy na Twój kod i znajduje problemy z „doh!
Billy ONeal
4

Przeglądy i testy kodu często nie wychwytują tego samego rodzaju błędów, a błędy wychwycone przez przegląd kodu mogą być łatwiejsze do naprawienia, ponieważ lokalizacja błędu jest znana.

Nie możesz wiedzieć, czy kod jest wolny od błędów, tylko dlatego, że pomyślnie przeszedł testowanie, ale żaden nie został zarejestrowany. „Testowanie może tylko udowodnić obecność błędów, a nie brak”. (Dijkstra?)

Przegląd kodu utrzymuje również ten sam styl kodu i jest w stanie znaleźć miejsca, w których kod nie jest dobry, ale na razie działa. Oszczędza koszty utrzymania na drodze.

Również wymagania dużej korporacji i startupu są różne. Startupy zwykle kończą się niepowodzeniem i muszą działać szybko. Duże korporacje czerpią znacznie więcej korzyści z robienia rzeczy właściwie, niż tak szybko, jak to możliwe. Możesz preferować pracę w startupach niż w dużych firmach, ale nie jest to powód, aby próbować narzucać strategie uruchamiania tam, gdzie nie pasują.

David Thornley
źródło
2

Czy twoje recenzje kodu wyświetlają tylko zmiany UI / UX? Twierdziłbym, że to nie jest przegląd kodu, to test użyteczności. Przeglądy kodu dotyczą znacznie więcej problemów, których użytkownicy / testerzy / biznes / cokolwiek nigdy nie widzą, ponieważ są w kodzie. Wskazówka jest tam w nazwie.

Teraz zgodzę się z tobą, że gdzieś trzeba narysować linię. Czy przeglądasz 4 iteracje tej samej zmiany interfejsu? A może przechodzisz przez 4 iteracje, z których każda potencjalnie czyni kod mniej konserwowalnym? Powiedziałbym, że spróbuj zmierzyć oba podejścia i znaleźć odpowiednią równowagę dla swojego zespołu, ale nie rezygnuj całkowicie z recenzji kodu.

Nawet jeśli przegląd kodu nigdy nie ujawnia problemu, ma tę zaletę, że rzadko się go zauważa, dopóki go nie ma: każdy kawałek kodu jest oglądany przez dwóch programistów, więc dwóch programistów wie, co było zmianą i co zamierzano osiągnąć . Tak więc jeden z nich zachoruje następnego dnia i jest nieobecny przez tydzień, drugi może odebrać każdą pilną pracę, którą wykonują.

pdr
źródło
1

Zgadzam się, że wspólna własność i parowanie kodu wraz z TDD i CI to zwinne antidotum na formalne sesje przeglądu kodu.

Nawet pod UP / Spiral nie byłem wielkim fanem konkretnego kroku procesu, jakim jest „przegląd kodu”, ponieważ wydaje mi się, że problemy, które można znaleźć, zostaną znalezione później niż mogłyby, gdyby zamiast tego zainwestowano tę samą energię współpraca i prosta automatyzacja.

Czułem, że ponieważ: - niektóre wspólne przeglądy projektu (zwykle wyrażone w UML przynajmniej na tablicy) oznaczały problemy projektowe na dużą skalę lub złe użycie interfejsów API itp. Zostały złapane przed napisaniem dużej ilości kodu. - FxCop, CheckStyle, FindBugs (lub podobny) działający wraz z automatycznymi kompilacjami ciągłej integracji w celu przechwytywania nazw, stylistyki, widoczności, powielania kodu itp.

Byliśmy w stanie ponieść porażkę wcześniej i uzyskać informacje zwrotne szybciej niż przyzwyczajenie związane z przeglądaniem kodu dalszego użytkownika.

Nie twierdzę, że to strata czasu, aby od czasu do czasu usiąść i rzucić okiem na bazę kodu, ale sprawienie, by przegląd kodu był bramkowym krokiem do wywołania czegoś zrobionego, wydaje się, że powoduje to wiele prac w toku, które mogły być uniknięto dzięki lepszej kontroli / współpracy na wcześniejszym etapie.

mmeyer
źródło
0

Jednym z głównych celów, których oczekuję od przeglądów kodu, jest zwiększenie łatwości obsługi kodu. Przeglądy kodu powinny pomagać każdemu w pisaniu przejrzystego kodu, w miarę zgodnego z dobrymi standardami kodowania. Większość kodu wymaga dużej konserwacji, szczególnie w dużych firmach. Zwrot za możliwy do utrzymania kod powinien rozpocząć się przed wydaniem kodu, a następnie kontynuować.

Przeglądy kodu same w sobie nigdy nie powinny powodować zmian w kodzie. Jeśli przegląd kodu wskazuje, że zmiany są wymagane, wdrożenie zmiany spowoduje zmianę kodu.

Stan kodu może ulec zmianie w wyniku przeglądu, ale powinno to być w większości nieistotne dla wspomnianych problemów.

Jeśli przegląd kodu powoduje wiele zmian w kodzie, oznacza to, że coś jest uszkodzone w procesie programowania. Biorąc pod uwagę liczbę testerów, którą masz, może to być rzut na ścianę i pozwolić testerom znaleźć mentalność problemu.

Sprawy powinny iść do testerów w stanie ukończonym. Jak najwięcej testów powinno być zautomatyzowanych, aby testerzy nie testowali za każdym razem tych samych rzeczy.

UI / UX wymaga trochę czasu na testowanie, ale posiadanie ekspertów w zakresie projektowania / programowania na froncie powinno to skrócić. Wymaga również twarzy przed ekranem. Jednak we wszystkich aplikacjach, z którymi pracowałem, była to stosunkowo niewielka część kodu.

Koszt wprowadzenia zmian (w tym poprawek błędów) ogólnie rośnie na każdym etapie, przez który przechodzi. Znajdowanie błędów w rozwoju jest na ogół tańsze niż naprawianie ich po testowaniu ich znalezienia.

BillThor
źródło