Jakie są sposoby na złagodzenie skutków Miesiąca Mitycznego Człowieka?


16

Prawo Brooksa: dodanie siły roboczej do późnego projektu oprogramowania czyni to później.

W swojej książce No Silver Bullet - Istota i wypadki inżynierii oprogramowania Frederick Brooks definiuje koncepcję miesiąca mitycznego człowieka :

Założeniem Brooksa jest to, że złożonych projektów programistycznych nie można idealnie podzielić na odrębne zadania, nad którymi można pracować bez komunikacji między pracownikami i bez ustanawiania zestawu złożonych wzajemnych powiązań między zadaniami a pracownikami je wykonującymi .

Od 1982 roku z pewnością posunęliśmy się naprzód i zebraliśmy trochę doświadczenia w łagodzeniu tego problemu. Jakie są rozwiązania, które z powodzeniem zastosowałeś w swojej pracy, aby dodać zasoby do projektu bez powodowania dodatkowych problemów.


5
Głosuję za zamknięciem tego pytania jako nie na temat, ponieważ lepiej pasuje do Software Engg. SE ( softwareengineering.stackexchange.com ), a także dlatego, że nie jest ściśle związane z Devops
Dawny33

2
To jest ściśle specyficzne pytanie DevOps. Dotyczy to bezpośrednio procesu dostarczania oprogramowania. Czy na pewno rozumiesz, co oznacza DevOps?
Jiri Klouda

3
Ciągle mówisz DevOps, nie sądzę, że to znaczy, co myślisz, że to znaczy.
Jiri Klouda

3
@ Dawny33: Proszę przeczytać jedną z podstawowych książek DevOps - The Phoenix Project. Nie znajdziesz żadnej wzmianki o AWS, Docker, Jenkins ani innych narzędziach. Cała książka dotyczy procesu, hierarchii organizacyjnej i struktury, sposobu pracy w zespołach. DevOps to sposób na wprowadzenie pomysłów naukowych, które usprawniły produkcję w Japonii, a później w Stanach Zjednoczonych, w proces tworzenia oprogramowania. Pomysły oparte na pracach Edwarda W. Deminga i Eliyahu M. Goldratta. To, co widzisz jako DevOps, to tylko powierzchnia, narzędzia i wyniki. Zbędne części.
Jiri Klouda

5
@ Dawny33 To pytanie nie jest odpowiednie dla inżynierii oprogramowania. Chociaż ten ogólny temat brzmi, pytanie jest zdecydowanie zbyt ogólne. Poszukuje opinii, a nie próbuje rozwiązać problem. Nie sugeruj innym społecznościom, jeśli nie rozumiesz, jakie typy pytań akceptują. Jeśli to pytanie zostanie opublikowane w dziale inżynierii oprogramowania, zostanie odrzucone, zamknięte i prawdopodobnie usunięte bardzo szybko. Prowadzi to do słabego komfortu użytkowania.
Thomas Owens,

Odpowiedzi:


18

Co to jest MMM

Najpierw chcę wyjaśnić kontekst prawa Brook'a. Jakie założenie skłoniło go do stworzenia go w 1975 roku?

Miesiąc roboczy to hipotetyczna jednostka pracy reprezentująca pracę wykonaną przez jedną osobę w ciągu jednego miesiąca; Prawo Brooksa mówi, że nie można zmierzyć użytecznej pracy w ciągu osobo-miesięcy.

źródło: https://en.wikipedia.org/wiki/The_Mythical_Man-Month

W przeszłości złożone projekty programistyczne oznaczałyby duże systemy monolityczne. Brooks twierdzi, że nie można ich idealnie podzielić na odrębne zadania, nad którymi można pracować bez komunikacji między programistami i bez ustanawiania zestawu złożonych relacji między zadaniami a osobami je wykonującymi.

Jest to bardzo prawdziwe w przypadku bardzo spójnych monolitów oprogramowania. Bez względu na to, jak wiele oddzielenia zostało zrobione, wciąż duży monolit nakazuje czas potrzebny nowym programistom na poznanie monolitu. Zwiększony narzut komunikacji, który zużywa coraz więcej dostępnego czasu.

Ale czy tak naprawdę musi tak być? Czy musimy pisać monolity i utrzymywać kanały komunikacji n(n − 1) / 2tam, gdzie njest liczba programistów?

Wiemy, że istnieją firmy, w których tysiące programistów pracuje nad dużymi projektami ... i to działa. Musi więc coś się zmienić od 1975 roku.


Możliwość ograniczenia MMM

W 2015 r. PuppetLabs i IT Revolution opublikowały wyniki raportu o stanie DevOps z 2015 r . W raporcie skupiono się na rozróżnieniu między organizacjami o wysokich wynikach a organizacjami o niższych wynikach.

Wysoko wydajne organizacje wykazują nieoczekiwane właściwości. Na przykład, mają najlepszą wydajność w czasie realizacji projektu. Najlepsza stabilność operacyjna i niezawodność w działaniu. Jak również najlepsze osiągnięcia w zakresie bezpieczeństwa i zgodności.

Jedną z zaskakujących rzeczy podkreślonych w raporcie jest liczba wdrożeń na dzień. Ale nie tylko wdrożenia dziennie, zmierzyli także wdrożenie / dzień / programistę i jaki jest efekt dodania większej liczby programistów w organizacjach o wysokiej wydajności w porównaniu do organizacji o niskiej wydajności.

To jest wykres z tego raportu -

Wdrożenia na dzień na programistę

Podczas gdy organizacje o niskiej wydajności dostosowują się do założeń Mythical Man Month. Wysoko wydajne organizacje mogą liniowo skalować liczbę wdrożeń / dni / deweloperów w zależności od liczby programistów.

Doskonała prezentacja Gene Kim na DevOpsDays London 2016 mówi o tych ustaleniach.


Jak to zrobić

Po pierwsze, jak zostać organizacją o wysokich wynikach? Jest kilka książek, które mówią o tym, za mało miejsca w tej odpowiedzi, więc po prostu będę do nich link.

W przypadku oprogramowania i organizacji IT jednym z kluczowych czynników umożliwiających uzyskanie wysokiej wydajności organizacji jest: skupienie się na jakości i szybkości .

Na przykład Ward Cunningham wyjaśnia Dług Techniczny jako wszystkie rzeczy, które pozwolono nam pozostawić nierozwiązane. Jest to akceptowane przez kierownictwo, ponieważ zawsze wiąże się z obietnicą, że zostanie to naprawione w odpowiednim czasie.

Nigdy nie ma wystarczająco dużo czasu, a zadłużenie techniczne staje się coraz gorsze.

Co powoduje wzrost długu technicznego?

  • starszy kod
  • ręczna konfiguracja środowisk
  • testowanie ręczne
  • ręczne wdrożenia

Starszy kod Zgodnie z definicją podaną w części „Efektywna praca ze starszym kodem” autorstwa Michaela Feathersa, każdy kod, który nie ma automatycznego testowania.

Wszelkie skróty czasowe służą do wprowadzenia kodu do produkcji; operacje są obciążone utrzymywaniem tego długu na zawsze. Następnie proces wdrażania staje się coraz dłuższy.

Gene w swojej prezentacji opowiada historię firmy, która ma sześciotygodniowe wdrożenia. Zaangażowanie dziesiątek tysięcy wyjątkowo podatnych na błędy żmudnych kroków, wiążących 400 osób, i robiliby to cztery razy w roku.

Jednym z założeń DevOps jest to, że niezawodność wynika z częstszego wykonywania mniejszych wdrożeń.


Przykład

Te dwie prezentacje pokazują wszystkie rzeczy, które Amazon zrobił, aby skrócić czas potrzebny na wdrożenie kodu na produkcji.

Według Gene'a jedyną rzeczą, która zmienia się w czasie w tych wysoko wydajnych organizacjach, jest liczba programistów. Tak więc na przykładzie Amazona można powiedzieć, że w ciągu czterech lat zwiększyli swoje wdrożenia dziesięciokrotnie, dodając więcej osób.


Oznacza to, że pod pewnymi warunkami, przy odpowiedniej architekturze, właściwych praktykach technicznych, właściwych normach kulturowych, produktywność programistów może rosnąć wraz ze wzrostem liczby programistów. DevOps jest zdecydowanie w środku tego wszystkiego.


4

To, co zrobiłem (i to jest tylko subiektywne), jest następujące:

Kiedy kierownik myślący o terminie chce dodać ludzi do mojego zespołu, aby skrócić potrzebny czas i wydaje się być w MMM, najpierw dyskutuję z nim, dlaczego to może być złe. Moją ulubioną analogią jest przypomnienie im, że jeśli jedna kobieta może urodzić dziecko za dziewięć miesięcy, dziewięć kobiet nie będzie mieć jednego dziecka za miesiąc, ale urodzi dziewięć dzieci za dziewięć miesięcy. Czas nie jest skrócony, tylko przetwarzanie równoległe jest lepsze.

Gdy decyzja jest wymuszana na naszym zespole, zwykle staramy się albo dalej dzielić niektóre zadania, a gdy nie jest to możliwe, zwykle polegamy na programowaniu par , w którym jeden programista jest odpowiedzialny za pisanie, a drugi dyktuje kod (i okresowo przełącza się ).

Samo pisanie kodu jest wolniejsze, ale podczas testowania jest mniej literówek / błędów i błędów z powodu nieuniknionej recenzji podczas pisania. Wydaje mi się, że ogólna jakość kodu jest również nieco lepsza, ale nie mam danych, które by to potwierdzały.


1
Podoba mi się pomysł programowania par. To jest rzeczywiście coś, co może pomóc. Mogę być w stanie wyjaśnić, dlaczego później na podstawie teorii, nad którą pracowałem.
Jiri Klouda

proszę, czekaj na to!
Peter Muryshkin

4

Mówiąc wyłącznie z perspektywy CI, zwiększenie liczby programistów pracujących nad projektem zazwyczaj przekłada się na większą liczbę osób pracujących w tej samej branży.

Tradycyjne systemy CI mają pod tym względem problem ze skalowalnością: prawdopodobieństwo awarii / regresji / blokad zwiększa spowolnienie prędkości integracji i zaprasza mniejsze zespoły do ​​zerwania i przejścia do oddziałów potomnych (tj. Dalsze spowolnienia). Zobacz Jak można skalować ciągłą integrację bardzo dużych projektów / zespołów? . Jest to zgodne z koncepcją Mythical Man Month.

Rozwiązanie, które sugeruję w odpowiedzi na to pytanie, wysoce skalowalny system CI umożliwi migrację w kierunku prawdziwego CI - integracja oparta na pojedynczej gałęzi / magistrali dla całych większych zespołów (nawet przy dużych rozmiarach).

Dzięki wszystkim na tej samej stronie, korzystającym z tych samych zautomatyzowanych narzędzi / procesów i znacznej większości weryfikacji jakości zautomatyzowanych w samym systemie CI, znacznie łatwiej jest zmieniać role i skupiać się między członkami zespołu. Cały proces rozwoju staje się płynniejszy, bardziej przewidywalny, bardziej zrelaksowany.

Wprowadzanie nowych ludzi na pokład w takim środowisku, zwiększanie produktywności poprzez odciążenie mniej trudnych zadań od bardziej doświadczonych członków zespołu, którzy mogą następnie podjąć trudniejsze, jest łatwiejsze.

Wszystko to, jak sądzę, można postrzegać jako kojące efekty koncepcji Miesiąca Mitycznego Człowieka.


W organizacjach o wysokiej wydajności dodanie większej liczby programistów zwykle oznacza utworzenie większej liczby niezależnych zespołów, które piszą oddzielne oprogramowanie. Pozwala to większej liczbie osób osiągnąć więcej i szybciej. Posiadanie ich wszystkich za pośrednictwem jednej gałęzi integracji jest anty-wzorcem i najprawdopodobniej znacznie spowolni.
Evgeny

Having them all communicate via a single integration branch is an anti-pattern- dlaczego? Jeśli zostaną oddzielone od siebie w tym sensie, że nie będą już musieli integrować swojej pracy, wówczas dotkną gałęzi w sposób nie nakładający się / sprzeczny. Jeśli ich praca nadal wymaga integracji, przejście na dodatkowe oddziały opóźni i skomplikuje integrację poprzez odejście od metodologii CI i utratę wszystkich jej zalet.
Dan Cornilescu

Myślę, że nie zgadzamy się co do znaczenia „gałęzi”. Dobrze jest mieć jedno duże repozytorium z jedną gałęzią (git lub svn) i ponieść koszty związane z pracą nad tym samym. Dobrze jest też mieć wiele repozytoriów, w których każde repozytorium ma gałąź, która śledzi konkretną oddzieloną usługę. Zależy to od narzędzia, ilości narzutu, który dodaje do zatwierdzenia i kodu kasy.
Evgeny,

Ach, przepraszam, tak - jestem do tego przyzwyczajony i zapominam, że inni tak nie są. Według gałęzi mam na myśli ogólną reprezentację gałęzi SCM na wysokim poziomie, tak naprawdę nie ma znaczenia, jakie są szczególne cechy rzeczywistych systemów SCM, o ile są one zarządzane razem w sposób monolityczny . 1 duże repo z mainodgałęzieniem lub 10 side-by-side repo (moduły git?) Każde z mainodgałęzieniem powinno być prawie równoważne z perspektywą CI.
Dan Cornilescu,

Zatem moje stwierdzenie z pierwszego komentarza jest prawdziwe. Niezależności nie można osiągnąć w wieży babel, gdy masz monolit, koszty ogólne są bardzo wysokie dla wszystkich - więc wszyscy są obciążeni. Znacznie lepiej jest reprezentować oddzielone projekty jako oddzielne małe systemy VCS do zarządzania. Jeśli pamiętasz wystarczająco dużo, niektóre firmy korzystały z ClearCase i innych VCS do zarządzania CAŁYM kodem firmy - narzut był okropny.
Evgeny
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.