W naszym zespole jest nowy programista. W naszej firmie stosowana jest zwinna metodologia . Ale programista ma inne doświadczenie: uważa, że określone części kodu muszą być przypisane do konkretnych programistów. Więc jeśli jeden programista utworzył procedurę lub moduł programu, byłoby uważane za normalne, że wszystkie zmiany procedury / modułu byłyby dokonywane tylko przez niego.
Na plus, podobno dzięki proponowanemu podejściu oszczędzamy wspólny czas programowania, ponieważ każdy programista dobrze zna swoją część kodu i szybko wprowadza poprawki. Minusem jest to, że programiści nie znają całkowicie systemu.
Czy uważasz, że to podejście będzie dobrze działać w przypadku systemu średniej wielkości (rozwój witryny sieci społecznościowej)?
project-management
code-ownership
sergzach
źródło
źródło
Odpowiedzi:
Podobnie jak wiele z tych pytań, myślę, że odpowiedź brzmi:
To zależy
Istnieje powód, by sądzić, że zajmowanie stanowiska, że każdy programista powinien znać każdą linię kodu, jest błędne.
Jeśli przez chwilę założymy, że ktoś z głębokim zrozumieniem fragmentu kodu wprowadzi zmiany 5 razy szybciej niż ktoś, kto go nie zna (nie jest to ogromny skok wiary w moje doświadczenie) i zajmuje to około miesiąca doświadczenia w kodowaniu, aby naprawdę dobrze zrozumieć moduł o znacznych rozmiarach (również nie bezzasadny), możemy uruchomić niektóre (całkowicie fałszywe i fikcyjne) liczby:
Powiedzmy, że programista A wykonuje 1 jednostkę pracy dziennie. W ciągu 4 tygodni 5 dni roboczych może wykonać 20 jednostek pracy.
Tak więc programista B, zaczynając od 0,2 jednostki pracy na dzień, a kończąc na 0,96 jednostki pracy w jego / jej 20. dniu (21 dnia jest tak dobry jak programista A), wykona 11,6 jednostki pracy w tym samym Okres 20 dni. W tym miesiącu programista B osiągnął wydajność 58% w porównaniu z programistą A. Jednak teraz masz innego programistę, który zna ten moduł tak samo jak pierwszy.
Oczywiście, przy przyzwoitym projekcie możesz mieć ... 50 modułów? Zapoznanie się z nimi wszystkimi zajmuje około 4 lat, a to oznacza, że programista uczący się pracuje średnio z wydajnością 58% w porównaniu do programisty A ... hmmm.
Rozważmy więc ten scenariusz: ci sami programiści, ten sam projekt (A wie wszystko, a B nie wie o niczym.) Powiedzmy, że w roku jest 250 dni roboczych. Załóżmy, że obciążenie rozkłada się losowo na 50 modułów. Jeśli podzielimy obu programistów równomiernie, zarówno A, jak i B otrzymają 5 dni roboczych na każdy moduł. A może wykonać 5 jednostek pracy na każdym module, ale B otrzymuje, zgodnie z moją małą symulacją Excela, 1,4 jednostki pracy wykonanej na każdym module. Łącznie (A + B) wynosi 6,4 jednostki pracy na moduł. To dlatego, że B spędza większość czasu bez umiejętności korzystania z modułu, nad którym pracują.
W tej sytuacji bardziej optymalne jest skupienie B na mniejszym podzbiorze modułów. Jeśli B skupia się tylko na 25 modułach, otrzymują 10 dni na każdy, co daje 3,8 jednostki pracy na każdym. Programista A mógłby następnie spędzić 7 dni na 25 modułach, nad którymi B nie pracuje, i 3 dni każdy na tych samych modułach co B. Całkowita wydajność waha się od 6,8 do 7 jednostek na moduł, średnio 6,9, a to znacznie więcej niż 6,4 jednostek na moduł wykonaliśmy, gdy A i B równomiernie rozłożyły pracę.
Gdy zawężamy zakres modułów, na których działa B, uzyskujemy jeszcze większą wydajność (do pewnego stopnia).
Trening
Argumentowałbym również, że ktoś, kto nie wie tyle o module, przerwie osobie, która robi o wiele więcej niż ktoś z większym doświadczeniem. Tak więc powyższe liczby nie biorą pod uwagę, że im więcej czasu B spędza na kodzie, którego nie rozumieją, tym więcej czasu A zajmują, zadając pytania, a czasem A musi pomagać w naprawie lub rozwiązywaniu problemów. Trenowanie kogoś jest zajęciem czasochłonnym.
Optymalne rozwiązanie
Dlatego uważam, że optymalne rozwiązanie musi opierać się na pytaniach takich jak:
Dlatego myślę, że „to zależy”. Nie chcesz dzielić 20 modułów pomiędzy dwóch programistów w połowie (10 każdego), ponieważ wtedy nie masz elastyczności, ale nie chcesz też krzyżować 10 programistów na wszystkich 50 modułach, ponieważ tracisz dużo wydajność i nie potrzebujesz aż tak dużej redundancji.
źródło
To okropny pomysł . W krótkim okresie może być szybszy, ale zachęca do źle udokumentowanego trudnego do zrozumienia kodu, ponieważ tylko koder, który go napisał, jest odpowiedzialny za jego utrzymanie. Kiedy ktoś odchodzi z firmy lub jedzie na wakacje, cały plan zostaje zmarnowany. Utrudnia także przydzielanie obciążeń; co się stanie, gdy dwa pilne błędy wymyślą kod, który „właściciel” jest koderem?
Powinieneś kodować jako zespół . Ludziom w naturalny sposób przydzielane będą zadania i koncentrować się na określonych obszarach, ale należy zachęcać do dzielenia się pracą i współpracować, a nie zniechęcać.
źródło
To zależy od dziedziny problemu.
Jeśli chodzi o rzeczy ogólne (tj. Proste akcje CRUD itp.), To zgadzam się z Tomem Squiresem (każdy powinien móc nad tym pracować i edytować).
Jednak ...
Jeśli dane rozwiązanie wymaga wiedzy specjalistycznej w dziedzinie (dużo czasu zostało zainwestowane w przeszłości lub przed wdrożeniem należy przeprowadzić wiele badań, ponieważ jest to coś, co wymieniasz jako wymaganie dotyczące pracy jako specjalistyczną wiedzę, która: nie wszyscy w projekcie mają), wtedy zdecydowanie należy przypisać właściciela do tej części kodu. To powiedziawszy, każdy powinien mieć możliwość wprowadzania modyfikacji w razie potrzeby, ale zawsze powinien być sprawdzony przez osobę, która jest właścicielem tego obszaru projektu.
Nie chcesz, aby cały zespół (lub kilka osób w zespole) badał i uczył się tego samego przedmiotu (zmarnowane cykle). Przypisz właściciela, ale poproś go, aby udokumentował swoje ustalenia i projekty, a może poprowadzi nieformalne (lub formalne, nieważne) szkolenia dotyczące technologii.
źródło
To okropny pomysł . Pracowałem w firmie, która zastosowała to podejście i jest to prawie przepis na mnóstwo długów technicznych . Najważniejsze jest to, że dwie głowy są prawie zawsze lepsze niż jedna. Dlaczego? Ponieważ jeśli nie jesteś idiotą, wiesz, że nie jesteś doskonałym programistą i nie dostaniesz każdego błędu, który popełnisz. Dlatego potrzebujesz zespołu - więcej oczu patrzy na ten sam kod z różnych perspektyw.
Sprowadza się do jednej rzeczy: dyscypliny . Ilu znasz samotnych programistów, którzy są naprawdę zdyscyplinowani w swoim stylu kodowania? Kiedy nie kodujesz z dyscypliną, bierzesz skróty (ponieważ „naprawisz to później”) i cierpi na łatwości konserwacji kodu. Wszyscy wiemy, że „później” nigdy nie nadejdzie. Fakt : Trudniej jest stosować skróty, gdy jesteś bezpośrednio odpowiedzialny przed kolegami z zespołu. Dlaczego? Ponieważ twoje decyzje będą kwestionowane i zawsze trudniej jest uzasadnić skróty. Wynik końcowy? Tworzysz lepszy, łatwiejszy w utrzymaniu kod, który jest również bardziej niezawodny.
źródło
Zaletą jest to, że nie wszyscy muszą wszystko badać i rozumieć. Wadą jest to, że sprawia, że każda osoba jest niezbędna dla własnego obszaru kodu, a nikt inny nie wie, jak go utrzymać.
Kompromisem byłoby posiadanie co najmniej 2 właścicieli dla każdego obszaru kodu. Wtedy ktoś może iść na urlop, podjąć nową pracę lub przejść na emeryturę, a nadal jest ktoś, kto zna kod (i może przeszkolić nową drugą osobę). Nie wszyscy muszą się uczyć wszystkiego, co jest nieco bardziej wydajne.
Nie pozwól, aby te same 2 (lub 3) osoby cały czas pracowały razem. Wymieniaj pary dla różnych obszarów, aby wiedza została również przypadkowo udostępniona podczas pracy z inną osobą na powiązanym obszarze programu.
źródło
Tak, w krótkim okresie jest nieco bardziej wydajny. I na tym kończą się korzyści. To nawet nie zbliża się do przeważenia kosztów.
Co dzieje się, gdy jest na wakacjach, jest niespodziewanie chory, odchodzi lub zostaje potrącony przez przysłowiowy autobus? Co się stanie, gdy chcesz zwiększyć zasoby, aby uzyskać jedno zadanie szybciej niż inne? Jak skuteczne mogą być recenzje kodu? W jaki sposób menedżer, zwłaszcza ten, który nie jest w bazie kodu, może wiedzieć, czy programista ciężko pracuje, czy naciąga wełnę na oczy? Kto zauważy, że dług techniczny zacznie się zaciągać?
Z mojego doświadczenia wynika, że ludzie, którzy lubią pracować w ten sposób, to w najlepszym razie łowcy chwały, w najgorszym razie leniwi. Lubią być jedyną osobą, z którą możesz się spotkać z danym problemem i lubią, aby ich kod pozostawał prywatny. I często lubią szybko kodować, bez względu na czytelność.
Nie oznacza to, że w zespole 50 programistów każdy powinien znać cały kod, ale zespół 5-7 powinien posiadać moduł wystarczająco duży, aby utrzymać tych ludzi w pracy. Nikt nie powinien posiadać niczego.
źródło
Istnieją co najmniej trzy kwestie, na które wskazują pozostałe odpowiedzi; ale chciałbym spróbować potraktować oba z nich razem. Dwie kwestie to:
Gdy temat dotyczy wyłącznie wiedzy specjalistycznej, sukces projektu może zależeć od wysokiego poziomu wiedzy na temat dziedziny; ale nie zależy to od wiedzy konkretnego eksperta w tej dziedzinie. Eksperci, choć być może rzadcy i cenni, nadal są zasadniczo wymienni; jeden doświadczony księgowy podatkowy jest równie przydatny w projekcie oprogramowania do planowania podatkowego, jak inny, z punktu widzenia wiedzy w swojej dziedzinie. Kwestia staje się jednym z tego, jak dobrze ekspert jest w stanie przenieść swoją wiedzę do projektu.
Gdy tematem jest wyłącznie przywództwo, powodzenie projektu zależy głównie od spójności i wglądu w decyzje podejmowane przez kierownika projektu; chociaż faworyzujemy kierowników projektów, którzy mają doświadczenie w tej dziedzinie lub są dowodzeni jako liderzy projektów, czasami ma to drugorzędne znaczenie. „Lider” może zmieniać się z dnia na dzień, jeśli podejmowane decyzje będą spójne w poszczególnych przypadkach, a każda decyzja zostanie szybko wykonana przez zespół. Jeśli to działa poprawnie; wiele decyzji nie musi być „podejmowanych” przez kierownika projektu, ponieważ zespół już rozumie, jakie decyzje zostaną podjęte.
Nie sądzę, aby pytanie dotyczyło kodu bez ego, ale ciężko jest rozmawiać o własności kodu, nie omawiając również, jak ważna jest ta kwestia. Utrzymanie projektu jest prawdopodobnie większą częścią cyklu rozwoju. Aby zrozumieć ten problem, należy zastanowić się, co by się stało, gdyby niektórzy programiści musieli go natychmiast opuścić. Co by się stało, gdyby cały zespół musiał zostać zastąpiony? Jeśli projekt jest poddany w wątpliwość, ponieważ zależy od niektórych kluczowych graczy, istnieje wysokie ryzyko niepowodzenia. Nawet jeśli nigdy nie stracisz ani jednego członka zespołu, sam fakt, że do realizacji projektu potrzebny jest jeden lub kilku programistów, oznacza, że możesz nie pracować tak wydajnie, jak gdybyś mógł się dowiedzieć, czy jest więcej programistów.
źródło
Własność kodu ma tendencję do zapobiegania refaktoryzacji, tworzenia wąskich gardeł programowania i powodowania problemów z ego, gdy w kodzie występują problemy, które należy rozwiązać.
Polecam skonsultować się z autorami kodu przed zmianą, mimo że kod o wysokim standardzie powinien być wystarczająco udokumentowany, przetestowany jednostkowo, przetestowany pod kątem integracji i przetestowany systemowo, aby uczynić to zbędnym, nadal nie może zaszkodzić uzyskanie innej opinii.
źródło
Jest to złe z wielu powodów, pracowałem w sklepie, w którym próbowali zmienić to z bardziej rozsądnego i było brzydkie.
Powody, dla których jest to złe:
Największe z nich to problemy personalne i dokumentacja. Ta osoba pewnego dnia wyjdzie, a chłopcze przez kilka tygodni będziecie przesuwać harmonogram w lewo.
Lepszym rozwiązaniem jest zaznajomienie wszystkich z każdą częścią podstawy kodu (lub z pół tuzina części, jeśli jest naprawdę duża i różnorodna) do tego stopnia, że mogą
Każda osoba zwykle wie trochę więcej na temat niektórych rzeczy niż inne, więc w przypadku trudnych problemów dwie lub trzy osoby mogą się łączyć, lub ekspert od defacto może wziąć na siebie. Pracowałem w grupach, w których tak było i wyszło naprawdę ładnie. Nie tylko nie było żadnego z wymienionych powyżej wad, personel był znacznie bardziej przewidywalny, ponieważ nie szukaliśmy ekspertów.
Zaletą wyłącznego posiadania kodu jest to, że „właściciel kodu” może robić rzeczy szybciej niż inni, ale jest to prawdą tylko wtedy, gdy każdy jest „właścicielem kodu” w projektach, które się nie pokrywają. Innymi słowy, jeśli ludzie obracają się wokół przewagi „wyłącznego właściciela kodu” odchodzi.
źródło
Zobacz numer ciężarówki aka Bus Factor
źródło
Podobnie jak w przypadku wielu rzeczy, jest to duże „zależy”. Jeśli jest to ścisłe „nikt inny nie może popracować nad kodem”, prawdopodobnie ma zły wpływ. Jeśli jest to „właściciel musi dokonać przeglądu kodu przed zaakceptowaniem zmiany”, jest to średnio dobre, w zależności od tego, jak chętny jest właściciel, aby zaakceptować zmianę zewnętrzną.
źródło
Wada jest poważna; „numer ciężarówki” twojego zespołu zmienia się prawie na 1.
Aby przejrzeć, „numer ciężarówki” definiuje się po prostu jako „ilu członków zespołu, w najgorszym przypadku, może zostać trafionych ciężarówką, zanim zespół niezbędny do wykonania jakiegoś krytycznego zadania zostanie utracony”.
Jest rzeczą naturalną i do pewnego stopnia zachęcić deweloperów do skupienia się na subdyscyplinach; gdyby wszyscy musieli wiedzieć wszystko, co ma związek z projektem, nic by się nie stało, ponieważ wszyscy dowiedzieliby się, co zrobili wszyscy inni, dlaczego działa i jak można go zmienić bez zerwania. Ponadto, jeśli deweloperzy robią różne rzeczy w różnych obszarach, jest mniej prawdopodobne, że zmiany się zderzą. Na ogół dobrze jest mieć dwóch lub trzech programistów lub pary programistów, które działają przede wszystkim w określonym podsystemie projektu i dobrze o tym wiedzą.
Jeśli jednak tylko jedna osoba ma kiedykolwiek dotknąć określonej linii kodu, to kiedy ten facet rezygnuje, zostaje zwolniony, idzie na urlop lub kończy w szpitalu, a ta linia kodu jest wykazywana jako przyczyna błędu to musi zostać naprawione, ktoś inny musi wejść i zrozumieć kod. Jeśli nikt inny, jak tylko facet, który to napisał, nigdy go nie widział, zajmie to trochę czasu, aby dojść do takiego poziomu zrozumienia, który pozwoli programistom wprowadzić zmiany, które naprawią błąd, nie robiąc więcej. TDD może pomóc, ale tylko informując programistę, że dokonali „złej” zmiany; ponownie, programista musi zrozumieć, jakie testy wykonują dany kod, aby upewnić się, że testy zakończone niepowodzeniem nie będą próbowały sformułować błędnych twierdzeń.
źródło
Nie podchodzę do tego ekstremalnie, ale wolę odpowiedzialność za kod . Piszesz uszkodzony kod, powinieneś go naprawić. Można to zrobić na poziomie indywidualnym, pary lub zespołu. Zapobiega przekazaniu bałaganu komuś innemu do posprzątania. Dotyczy to również zmian.
Zastąpią go problemy z obciążeniem i harmonogramem. Byłoby głupotą powstrzymywać się od naprawienia poważnego błędu, ponieważ winowajca jest na dwa tygodnie wakacji.
Nie chodzi o to, aby twoja drużyna grała w „grę obwinianą” lub nie przesadzała z licznymi błędami (i tak nie wszystkie są równe). Oprzyj go na tym, kto ostatni sprawdził kod lub poprosił przełożonego o podjęcie decyzji i przypisanie go komuś zamiast przejścia przez każdą część każdego wiersza kodu.
Lepsi programiści prawdopodobnie naprawią wiele kodów innych osób, bez względu na to, jak je przypisujesz.
źródło