Czy twoi najlepsi programiści powinni sprawdzać czyjś kod w celu kontroli źródła?

29

Jedną z różnic między svn i git jest możliwość kontrolowania dostępu do repozytorium. Trudno to porównać, ponieważ istnieje różnica poglądów na temat tego, komu należy zezwolić na dokonywanie zmian!

To pytanie dotyczy używania git jako scentralizowanego repozytorium dla zespołu w jakiejś firmie. Załóżmy, że członkowie zespołu mają różne poziomy umiejętności, podobnie jak w większości firm.

Wydaje się, że Git zakłada, że ​​Twoi najlepsi (najbardziej produktywni i doświadczeni) programiści mają zaufanie do sprawdzania kodu. W takim przypadku poświęcasz czas na pisanie kodu, aby przejrzeć kod innej osoby w celu sprawdzenia. Czy to się opłaca? Naprawdę chcę skupić się na tym pytaniu, jak najlepiej wykorzystać czas twojego najlepszego programisty, a nie ogólnie na najlepszych praktykach kontroli wersji . Następstwem może być: czy dobrzy programiści rezygnują, jeśli znaczną częścią ich pracy jest przeglądanie kodu innych osób? Myślę, że oba pytania sprowadzają się do: czy recenzja warta jest wydajności?

GlenPeterson
źródło
5
Zdefiniować „najlepszego programistę”? Najlepszy w czym? Stosujesz się do arbitralnych zasad? Rozwijanie kodu? Zapisujesz kod zerowy?
Timo Geusch
3
Przepraszam, wciąż staram się omijać koncepcję sprawdzania niekontrolowanego (tj. Niezatwierdzonego) kodu ... z pewnością jedną z kluczowych zalet korzystania z SCS jest to, że Recenzję można wykonać na podstawie znanego / kontrolowanego iteracja kodu?
Andrew
2
@Andrew z gitdowolnym deweloperem może mieć własne repozytorium (na swoim komputerze osobistym) i publiczne repozytorium osobiste (na serwerze za nim apache), do którego może jedynie dodawać zmiany. Różnica polega na tym, że tylko repozytorium wiodących programistów jest „błogosławione”, z którego wszyscy powinni się kasować. Kod wiodących transakcji z publicznych repozytoriów programisty i łączy je z jego publicznymi repozytoriami. Obaj znali / kontrolowali iterację, a także kontrolę źródła przez cały czas.
Hubert Kario
32
„Wydaje się, że Git zakłada, że ​​Twoi najlepsi (najbardziej produktywni, najbardziej doświadczeni) programiści mają zaufanie do sprawdzania kodu” to błędne domniemanie. Git można skonfigurować tak, jak chcesz. Model „Pull request” jest tylko jednym sposobem - idealnie nadaje się do projektów open source z potencjalnie dużą liczbą nieznanych współpracowników. W większości środowisk komercyjnych model „żądania ściągnięcia” byłby czerwoną flagą, wskazując słabe procesy i procedury SDLC i QC.
mattnz
4
Uważam, że @mattnz ma tutaj rację. Jest to wyłącznie wynikiem silnego wpływu open source na git, gdzie istnieje podstawowy zespół programistów, który kontroluje stan repo, ale inni również mogą wnieść swój wkład.
Steven Evers

Odpowiedzi:

53

Ponieważ z twojego pytania nie wynika jasno, chcę tylko podkreślić, że przepływ pracy strażnika nie jest w żadnym wypadku wymagany z git. Jest popularny wśród projektów typu open source ze względu na dużą liczbę niezaufanych współpracowników, ale nie ma to większego sensu w organizacji. Możesz dać wszystkim dostęp push, jeśli chcesz.

Ludzie zaniedbują w tej analizie to, że dobrzy programiści i tak spędzają dużo czasu na rozwiązywaniu problemów z uszkodzonym kodem innych programistów. Jeśli wszyscy mają dostęp push, kompilacja zostanie zepsuta, a najlepsi programiści często integrują i śledzą winowajców, gdy coś się psuje.

Rzeczą w tym, że każdy ma dostęp push, jest to, że gdy coś się psuje, każdy, kto wyciąga, dostaje zepsutą kompilację, dopóki niepoprawne zatwierdzenie nie zostanie cofnięte lub naprawione. W przepływie pracy strażnika dotyczy to tylko strażnika. Innymi słowy, wpływasz tylko na jednego z najlepszych programistów zamiast na wszystkich.

Może się okazać, że jakość twojego kodu jest dość wysoka, a stosunek kosztów do korzyści strażnika nadal nie jest tego wart, ale nie zaniedbuj znanych kosztów. To, że jesteś przyzwyczajony do tej utraty wydajności, nie oznacza, że ​​nie jest ona poniesiona.

Nie zapomnij też zbadać opcji hybrydowych. Z git łatwo jest skonfigurować repozytorium, do którego każdy może naciskać, a następnie mieć strażnika, takiego jak starszy programista, tester, a nawet automatyczny serwer ciągłej integracji, który decyduje, czy i kiedy zmiana stanie się drugim, bardziej stabilnym repozytorium. W ten sposób możesz uzyskać to, co najlepsze z obu światów.

Karl Bielefeldt
źródło
10
+1: Dla ... Dobrzy programiści i tak spędzają dużo czasu zajmując się uszkodzonym kodem innych programistów.
Jim G.
3
+1 Najlepsza odpowiedź. Zwłaszcza zwrócenie uwagi na to, że jeden twórca popełniający błąd powodujący łamanie kompilacji negatywnie wpływa na wszystkich.
Evan Plaice
Okazało się, że w takiej sytuacji dwaj programiści byli w pełnym wymiarze czasu wykorzystywani do sprawdzania i poprawiania kodu innych osób. Jasne, że jakość kodu w VCS była dobra, ale morale dla tych dwóch osób zmniejszyło się szybciej niż spłukiwanie toalety. To, co zaczęło się jako pozornie dobry pomysł, przerodziło się w koszmar, gdy ci dwaj wybiegli za drzwi do miejsc, w których mogliby, powiedzmy, bardziej kreatywne zadania.
Newtopian
1
To dobra uwaga, @Newtopian. Miejsca, w których widziałem ten sukces, mają więcej modelu mikrousług, a tylko jeden zespół scrumowy ma dostęp do dowolnej mikrousługi, ale odpowiedzialność za cały system jest rozłożona. Jeśli nie masz przynajmniej kilku doświadczonych programistów w zespole scrum, twoje praktyki rekrutacyjne wymagają poprawy.
Karl Bielefeldt,
40

Pracowałem na stanowisku, w którym zameldowanie było ograniczone tylko do kierowników zespołów (a kierownicy zespołów nie mogli zameldować się we własnym kodzie). Służyło to jako nasz mechanizm egzekwowania recenzji kodu, głównie z powodu szeregu incydentów, w których złe popełnienia błędów dostały się do bazy kodu, nawet przy zamkniętych odprawach i analizie statycznej.

Z jednej strony spełniło swoje zadanie. Kilka złych popełnień znaleziono przed wejściem do bazy kodów (i szybko o nich zapomniano przez około tydzień, aż ktoś się na nich natknął). Spowodowało to mniej zakłóceń w bazie kodu. Ponadto mogłem odepchnąć niektóre elementy formatowania / struktury, zanim staną się długiem technologicznym; złapać kilka błędów, zanim stały się błędami. Dało mi to świetne wyczucie tego, co robił mój zespół.

Z drugiej strony spowodowało to, że spontanicznie popadłem w mordercze szaleństwo, gdy moja zmiana 3 linii zajęła 4 godziny, ponieważ musiałem wyśledzić inną ścieżkę i zmusić ich do wykonania zmiany. Zmusiło mnie to do wykonywania znacznie rzadszych zatwierdzeń niż jest to najlepsza praktyka, a czasami prowadziło do problemów z próbą śledzenia zmian w deweloperze, który je zrobił.

Zasadniczo nie polecałbym tego, z wyjątkiem najbardziej potrzebnych środowisk. Robienie recenzji i zatwierdzeń nie było wcale takie złe. Jednak uzależnienie mojego procesu od kaprysów innych było irytujące. Jeśli nie możesz ufać programistom, że sprawdzą kod, zdobądź lepszych programistów.

Telastyn
źródło
8
@HubertKario - Jeśli twoi najlepsi programiści spędzają czas na recenzowaniu kodu, a reszta jest skutecznie blokowana, dopóki nie zostanie ukończona, nie widzę zbyt dużej praktycznej różnicy.
Telastyn
6
Jak są one blokowane? Tworzysz łatkę (zatwierdzasz lokalnie), przesyłasz ją wcześniej i kontynuujesz pracę nad nowym widżetem (tworzysz nowe zatwierdzenia lokalne). Jeśli Twoja zmiana zostanie zastosowana dosłownie, potrzebujesz tylko kasy i scalić repozytorium potencjalnej szansy. Jeśli nie zostało to zastosowane dosłownie, nadal możesz bazować swoją późniejszą pracę. Jeśli zmiana jest naprawdę krytyczna, możesz opublikować ją w swoim publicznym repozytorium i poprosić ludzi, aby wykupili ją stamtąd lub po prostu wysłali jej łatki. W takim przypadku gitwykryje, że zmiana została już wprowadzona i po prostu pomiń stosowanie konkretnej łatki.
Hubert Kario
9
Ostatni wiersz w tym pytaniu jest naprawdę całym punktem w moich oczach. Deweloper niezaufany będzie w najlepszym wypadku nieskuteczny, aw najgorszym nienawidzi swojej pracy. Nie zatrudniaj ludzi, którym nie ufasz. Bezsensownie marnuje pieniądze na ludzi, którym i tak nie pozwolisz wykonywać pracy, za którą im płacisz.
Jimmy Hoffa
1
@HubertKario - wiesz lepiej niż ja. Środowisko, w którym byłem, sprawiło, że żonglowanie różnymi gałęziami / zestawami zmian było denerwujące.
Telastyn
5
@Telastyn Nie wiem, czy mam interpretować twoją odpowiedź tak dosłownie jak ja, ale kolejną wadą byłoby przypisywanie historii winy. Jeśli znajdziesz jakiś kod, którego nie rozumiesz, w końcu poprosisz recenzenta, który go popełnił, a nie programistę, który go napisał.
Daniel Kaplan
28

Nie. Każdy powinien być w stanie dokonać zobowiązania.

Jeśli masz problemy z popełnieniem błędów, to nie jest to zasada kontroli źródła, która jest zła. To twórcy nie upewniają się, że to, co popełnia, działa. Musisz więc zdefiniować jasne wytyczne dotyczące tego, co należy popełnić i kiedy.

Kolejną świetną rzeczą są testy jednostkowe;)

Istnieje jednak alternatywa.

a) Jeśli korzystasz z rozproszonej kontroli wersji, możesz utworzyć główne repozytorium, do którego można wysyłać tylko żądania ściągania. W ten sposób wszyscy deweloperzy mogą uzyskać wersjonowanie własnego kodu, podczas gdy ty masz kontrolę nad główną gałęzią.

b) W subversion i podobnych można użyć gałęzi, w których każdy programista musi utworzyć łatki, aby dostać się do głównej gałęzi.

jgauffin
źródło
1
To. Jeśli popełniasz bez testów jednostkowych i kompilacji, wymaganie przeglądu kodu jest niedoskonałym bandażem.
Brian Knoblauch,
Tak. Dlatego wspomniałem o alternatywach. Recenzje kodu są lepsze niż nic. Brak możliwości aktualizacji kodu jest problemem, na który nie powinien być narażony żaden programista.
jgauffin
2
Testy jednostkowe nie pomagają, jeśli są napisane tym samym <wstaw tutaj swoje ulubione 4 litery> jak kod jednostki.
ott--
@BrianKnoblauch: można argumentować, że jest też odwrotnie. Najlepiej byłoby mieć oba.
Doc Brown
@ ott-- Właśnie usłyszałem historię o dev, który odszedł po popełnieniu okropnego bałaganu poprawki i komentowaniu wszystkich Assertów w swoich testach jednostkowych. Testy są domyślnie udane, więc zwrócenie uwagi na problem zajęło trochę czasu!
Alex
8

Powinieneś rzucić okiem na projekty takie jak Gerrit, które pozwalają wszystkim programistom wepchnąć swój kod do gałęzi „recenzowania”, a kiedy starszy / główny programista będzie zadowolony z tych zmian, może popchnąć ich do wersji master / release.

Jeśli nie są zadowoleni, mogą zostawić komentarze obok linii kodu, poprosić o zaktualizowaną łatkę itp.

W ten sposób każdy z oczekującymi zmianami może go wydostać, gdy tylko będzie gotowy i tylko wykwalifikowani ludzie (z odpowiednimi uprawnieniami +2 w Gerrit) będą mogli wypchnąć ten kod do przetestowania, a następnie do produkcji.

Rochal
źródło
2
Używamy gerrit z wielkim sukcesem. Rozwiązuje każdy problem, z którym OP ma problem, a nawet niektóre, o których nie wie.
mattnz
8

Nie, to słabe wykorzystanie twojego najlepszego talentu. Wyobraź sobie, że wydawnictwo bierze swoich najlepszych autorów i zmusza ich do edytowania; kiepski pomysł.

Powinny być recenzje kodu, ale to nie znaczy, że zawsze Senior sprawdza kod jr. W końcu należy oczekiwać, że wszyscy w zespole osiągną poziom, na którym mogą wnieść kod przy minimalnym doradztwie. Przechodzą przez trzy poziomy zaufania:

  1. Brak - chcę zobaczyć każdy wiersz kodu przed jego sprawdzeniem.
  2. Niektóre - daj mi znać, co robisz, a ja przekażę opinię
  3. Większość - Idź, wykonuj swoją pracę i poproś o pomoc tylko w razie potrzeby.

Zalety uwolnienia swojego talentu:

  • skupić się na projektowaniu
  • zaangażowanie w tworzenie standardów kodowania i strategii egzekwowania (bez ręcznego robienia tego wszystkiego samodzielnie)
  • rozwiązać trudne problemy z kodowaniem
  • zapewnić mentoring (bez zatwierdzania każdej linii kodu)

Są programiści zainteresowani ścieżką zarządzania, którzy wolą nie kodować przez cały dzień; zostaw pozostałych w spokoju.

JeffO
źródło
1
+1. Pozwól zespołowi ocenić zespół - zarówno recenzent, jak i recenzent, mogą zyskać, nawet jeśli recenzent jest mniej doświadczony niż recenzowany. I możesz zrobić całą recenzję PO odprawie. IMO, jeśli uniemożliwisz ludziom odprawę, ich wydajność spadnie (pomimo ich motywacji).
Andy,
5

czy recenzja jest warta wydajności?

Zależy to od „równowagi” zespołu i od konfiguracji recenzji. Oba są kwestią zarządzania i pracy zespołowej, żadna ilość technologii technologicznej kontroli wersji (scentralizowanej lub rozproszonej) nie może mieć na to znaczącego wpływu.

Jeśli zostanie to zrobione źle , spadek wydajności oczywiście zabije wszelkie korzyści z przeglądu; odpowiedzią jest jednak, aby nie porzucić pomysłu recenzji, ale dowiedzieć się, jak zrobić to dobrze .

Jednym ze sposobów sprawdzenia, czy Twoje recenzje są w porządku, jest użycie narzędzia do śledzenia problemów w celu śledzenia czasu poświęcanego na recenzje (niektóre narzędzia do sprawdzania kodu również na to pozwalają). Jeśli okaże się, że recenzje zajmują dużo czasu, włóż trochę wysiłku w znalezienie przyczyn i sposobów poprawy. Ponadto nie zaszkodzi mieć regularne 1: 1 z członkami zespołu, aby odkryć potencjalne problemy z recenzjami kodu.


Jeśli „najlepsi” programiści w zespole są zmuszeni spędzać godziny na przeszukiwaniu niezrozumiałych śmieci wytwarzanych przez kiepskich programistów, rozwiązaniem jest strzelanie do bzdur, a nie odwoływanie się do technologii VCS.

  • W jednym z wcześniejszych projektów przydzielono mi do przeglądu zmian kodu dokonanych przez członka zespołu, który stale słabo wykonuje zadania, w komponencie, którego przygotowanie i uruchomienie testów zajęło prawie godzinę. Zacząłem czytać różnice, a kiedy zauważyłem niemożliwą do skompilowania zmianę, po prostu skończyłem recenzję, opublikowałem niezbędne komentarze i poprosiłem kierownictwo, aby upewnić się, że dalsze prośby o weryfikację zawierają pisemne potwierdzenie, że ich kod się kompiluje. Od tamtej pory nie było „próśb o sprawdzenie” i wkrótce facet wyszedł.

Z drugiej strony, gdy zespół jest odpowiednio zrównoważony, recenzje kodu są zabawne i pouczające. W moim poprzednim projekcie wymagaliśmy 100% przeglądu kodu i ani to nie zajęło dużo czasu, ani nie rozpraszało mnie. Podczas przeglądu wykryto błędy i debaty na temat stylu kodowania i wyborów projektowych, ale wydawało się to po prostu ... normalne .


Jeśli zmiany kodu są blokowane przez kilka dni ... tygodni od dotarcia do kontroli jakości w celu przetestowania „z powodu recenzji”, studiowanie sztuczek VCS byłoby najmniej prawdopodobnym sposobem rozwiązania tego problemu. Zamiast tego lepiej skoncentrować wysiłki na znalezieniu problemów w sposobie organizacji procesu przeglądu.

  • - Och, integracja tej zmiany była znacznie opóźniona, ponieważ recenzent nagle zachorował, co za nieszczęście.
    - Cześć! Hell-lo-oo, czy myślałeś kiedyś o tym, by mieć pomocniczych recenzentów zajmujących się takimi sprawami?
komar
źródło
4

Tak. Ale tylko jeśli mówisz o rozproszonej kontroli źródła. Ze scentralizowanym - to zależy.

Jeśli jest tylko kilku programistów, zajmuje to niewiele czasu. Z pewnością mniej niż poprawki, które będą potrzebne do późniejszego usunięcia błędów i długu technicznego.

Jeśli jest bardzo wielu programistów, możesz przekazać zadanie rzeczywistego przeglądu kodu porucznikom i poprosić głównego programistę o bezzwłoczne wycofanie ich zmian. Działa na jądro Linuksa, nie sądzę, że istnieją większe projekty oprogramowania ...

Ponownie, jeśli projekt jest mały, potencjalni klienci szybko zobaczą, kto daje dobry kod, a kto wytwarza zły kod. Dość szybko zobaczy, że J.Random pisze dobry kod, który wymaga jedynie sprawdzenia decyzji architektonicznych, podczas gdy stażysta pisze zły kod, który należy przejrzeć wiersz po wierszu przed scaleniem. Uzyskane w ten sposób informacje zwrotne zmniejszą obciążenia związane z utrzymaniem na linii i zapewnią doświadczenie z pierwszej ręki niezależnie od tego, czego stażysta faktycznie się uczy i powinien być w firmie. Wyciąganie i scalanie gałęzi z innych gitrepozytoriów zajmuje dosłownie (kilka) kilkanaście sekund, zwykle czytanie tytułów komunikatów zatwierdzeń zajmie więcej czasu, więc po tym, jak wiem, komu można zaufać, aby napisać dobry kod scalanie kodu innej osoby nie jest problemem.

Hubert Kario
źródło
2

Przegląd kodu niekoniecznie wymaga uwagi tylko twoich najlepszych programistów. IMO powinno to być nieformalne. Jeszcze jedna opinia lub druga para oczu na kawałku kodu od nie-nowicjusza, zanim trafi on do produkcji. Pomaga złagodzić poważne niedopatrzenia, a także pomaga ludziom lepiej kodować jako rzemiosło, będąc narażonym na inne perspektywy twórców.

Coś w rodzaju mniej nieprzyjemnego lite-programowania. Innymi słowy, nie powinno to potrwać długo i nie trzeba czekać na kogoś godzinami. Wszystko w twoim procesie rozwoju, które obejmuje ludzi czekających na rzeczy, jest stratą pieniędzy i paraliżuje pęd / morale, IMO.

Gdyby przegląd kodu miał zatrzymać 99,5% błędów, zanim dotrą one do bazy kodu, nie byłoby sensu wyrafinowanej kontroli wersji. To powiedziawszy, git jest początkowo onieśmielający, ale podstawowe ogólne zastosowanie nie jest tak skomplikowane i jest wysoce konfigurowalne. Powinieneś być w stanie zatrzymać się na kilka godzin, aby nauczyć wszystkich, jak go używać. Wszyscy się zobowiązują. Wszyscy nowiutcy z wyjątkiem noobiestów recenzują, dopóki nie wykażą się specjalistyczną wiedzą.

Erik Reppen
źródło
0

Dopóki zgłaszane zmiany są sprawdzane przez „najlepszych programistów”, każdy powinien mieć możliwość przesyłania kodu. Jedyną osobą, która powinna mieć możliwość egzekwowania kontroli nad repozytorium, jest Inżynier ds. Wydania, jeśli taka osoba istnieje.

Osobiście byłbym wkurzony, gdybym musiał sprawdzić kod innych osób.

Niektóre uwagi na temat Twojej edycji: Nie, nie powinny. Recenzje są złem koniecznym, robią więcej dobra niż szkody i dobrzy programiści docenią to. Może niechętnie bierze udział w recenzjach, ponieważ nie podoba im się pomysł „pomniejszych programistów” krytykujących ich kod. Po prostu szkoda. Prawdopodobnie zrezygnowaliby z tego, gdyby linuks był ciągle wadliwy i zamiast tego spędzali czas na sprzątaniu po na wpół upieczonych poddaniach innych ludzi.

James
źródło
0

Tak, recenzja jest tego warta. Nie jestem pewien, czy nastąpił spadek wydajności, jeśli proces przeglądu jest proporcjonalny z następujących powodów:

  • Dzięki temu programiści są uczciwi - jeśli wiesz, że zostanie sprawdzony, ludzie będą używać mniej skrótów
  • Pomaga nowym programistom uczyć się od bardziej doświadczonych programistów
  • Pomaga przenieść wiedzę specyficzną dla domeny
  • Recenzja to kolejna bramka, w której można znaleźć i naprawić błędy i potencjalne problemy

Nie pozwalając wszystkim programistom na korzystanie z kontroli źródła, tracą możliwość śledzenia zmian, cofania błędów i przeglądania rozsądnej historii zmian. Nie jestem pewien, czy kiedykolwiek chciałbyś, aby tylko twoi „najlepsi” programiści mogli się zalogować do git.

To powiedziawszy, uważam za rozsądne, że masz kogoś, kto zarządza niektórymi kluczowymi gałęziami, takimi jak gałąź wydania. W takim przypadku wyobrażam sobie, że każdy może korzystać z repozytorium git, ale tylko niektóre osoby łączą się z gałęzią wydania. Nie jestem pewien, czy istnieje sposób na wymuszenie tego w git, ale powinno to być możliwe w drodze procesu i po prostu sprawdzania, czy nikt inny tego nie sprawdził.

Połączenie z gałęzią wydań może być wykonane przez „najlepszych” programistów, lub bardziej prawdopodobne przez kompetentne osoby po przeprowadzeniu wystarczającej weryfikacji.

Steve
źródło
1
-1: Daje to programistom uczciwość - jeśli wiesz, że zostanie sprawdzony, ludzie będą używać mniej skrótów. - Hmm ... martwiłbym się wprowadzeniem pokusy nadużycia. Oznacza to, że programiści mogą stać się leniwi lub niechlujni, ponieważ wiedzą, że bardziej zaawansowani programiści zawsze przyjmują odpowiedzialność za swój kod w formie recenzji kodu.
Jim G.
1
Recenzent w ogóle nie bierze odpowiedzialności za kod, ale zamiast tego udziela porad i instrukcji na temat problemów z kodem. Pierwotny programista musi rozwiązać problemy i nadal jest odpowiedzialny za kod.
Steve
-1

czy dobrzy programiści rezygnują, jeśli znaczna część ich pracy polega na sprawdzaniu kodu innych osób?

Jeśli nie cieszą się z pracy i są zmuszeni do wykonania tej czynności, to TAK. Jest bardzo prawdopodobne, że tak się stanie. Znalezienie kolejnej interesującej pracy dla dobrego programisty nie jest obecnie dużym wyzwaniem.

Czy twoi najlepsi programiści powinni sprawdzać czyjś kod w celu kontroli źródła?

Absolutnie nie. Jest to z pewnością strata czasu, z wyjątkiem pewnej krytycznej logiki, która musi być w solidnym stanie .

Jednak młodsi lub doświadczeni programiści powinni prawdopodobnie przejść na okres próbny w celu uzyskania jakości kodu , aby być po bezpiecznej stronie i upewnić się, że ich kod jest zgodny z wytycznymi dotyczącymi rozwoju zespołu, przynajmniej przez kilka tygodni przed uzyskaniem przywileju do zobowiązania się.

EL Yusubov
źródło