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:
- Programista A: ma głębokie zrozumienie
- Programator B: brak
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:
- Jak duży jest twój zespół? Czy sensowne jest przeszkolenie wszystkich osób w każdej części, czy jeśli mamy 10-osobowy zespół, czy możemy po prostu upewnić się, że każdy moduł jest znany co najmniej 3 osobom? (Przy 10 programatorach i 50 modułach każdy programista musi znać 15 modułów, aby uzyskać 3-krotny zasięg).
- Jaka jest rotacja twojego pracownika? Jeśli oddajesz pracowników średnio co 3 lata, a to naprawdę zajmuje więcej czasu, aby poznać każdy zakątek systemu, to nie będzie ich wystarczająco długo, aby szkolenie się zwróciło.
- Czy naprawdę potrzebujesz eksperta, aby zdiagnozować problem? Wiele osób używa wymówki „co, jeśli ta osoba jedzie na wakacje”, ale wiele razy wzywano mnie do diagnozowania problemu w systemie, z którym nie miałem doświadczenia. Może być prawdą, że doświadczona osoba może znaleźć ją znacznie szybciej, ale to nie znaczy, że nie możesz bez niej żyć przez tydzień lub dwa. Niewiele systemów oprogramowania jest tak krytycznych dla misji, że problem musi zostać zdiagnozowany w ciągu 1 godziny zamiast 5 godzin, inaczej świat się skończy. Musisz rozważyć te zagrożenia.
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.