Czy są inne zalety zwinnych praktyk niż praca między sprintami?

9

Niedawno zainteresowałem się zwinnymi praktykami w tworzeniu oprogramowania i od tego czasu widziałem wiele artykułów wskazujących, że praktyki te pozwalają obniżyć ogólne koszty.

Logika tego zazwyczaj wygląda następująco: jeśli zmienią się twoje wymagania, możesz odzwierciedlić tę zmianę w kolejnym zaległym sprincie, co doprowadzi do obniżenia kosztów, ponieważ zaprojektowanie nowej funkcji i wdrożenie jej jest zbliżone pod względem czasu, więc koszty spadają, zgodnie ze znaną zasadą, że im później trzeba zmienić swoje wymagania, tym droższe będzie spełnienie tego wymagania.

Ale średnie i duże projekty oprogramowania są złożone. Nagła zmiana wymagań nie oznacza, że ​​nie będziesz musiał dotykać innych części systemu, aby spełnić to wymaganie. W wielu przypadkach architektura będzie musiała zostać znacznie zmodyfikowana, co oznacza również, że będziesz musiał ponownie wdrożyć wszystkie funkcje oparte na starszej architekturze. Cała kwestia obniżenia kosztów trochę tutaj odchodzi. Oczywiście, jeśli nowy wymóg wymaga nowej niezależnej części systemu, to nie jest problem, stara architektura po prostu rośnie, nie trzeba jej ponownie przemyślać i reimplementować.

I odwrotnie. Jeśli używasz wodospadu i nagle zdajesz sobie sprawę, że należy wprowadzić nowy wymóg, możesz zmienić projekt. Jeśli wymaga to zmiany istniejącej architektury, przeprojektuj ją. Jeśli tak naprawdę nie zadziera z tym, ale po prostu wprowadza nową część systemu, to idź i wykonaj całą pracę, nie ma problemu.

Biorąc to pod uwagę, wydaje mi się, że jedyną zaletą zwinnego rozwoju jest działająca funkcja kompletnych kompilacji między sprintami, a dla wielu ludzi i podejrzeń nie jest to krytyczne. Ponadto zwinne wydaje się, że powoduje to ogólną wadliwą architekturę oprogramowania, ponieważ funkcje są jakby klepane jedna na drugiej, zwinne zespoły dbają tylko o to, czy funkcja działa, a nie o to, jak działa. Wydaje się, że gdy systemy z czasem stają się coraz bardziej złożone, zwinne praktyki programistyczne faktycznie zwiększają chaos w ogólnej architekturze produktu, co ostatecznie skutkuje wyższymi kosztami, ponieważ wprowadzanie zmian będzie coraz trudniejsze, a wodospad pozwala na doskonalenie architektury zanim cokolwiek wypuścisz.

Czy ktoś może mi wskazać, gdzie popełniam błąd, ponieważ oczywiście wiele osób używa zwinnych w środowiskach produkcyjnych, więc gdzieś się mylę.

tux91
źródło
Masz rację. Chciałbym zauważyć, że termin „wodospad” nie ma 1 uniwersalnej definicji (jak wiele innych terminów w IT). Większość ludzi uważa, że ​​nie wolno ci kodować, chyba że pełne 2000 stron wymagań zostanie napisanych i podpisanych. Tak wcale nie musi być.
NoChance
Tak, przez „wodospad” mam na myśli liniowy proces (najbardziej zasadniczo) specyfikacji funkcjonalnych -> projektu -> kodu między kamieniami milowymi, a nie sprintów. I oczywiście wymagania 2000 stron i specyfikacje techniczne nie są koniecznością, podstawowe obowiązki klas i ich wzajemne relacje są często wystarczające jako projekt najwyższego poziomu.
tux91
3
@EmmadKareem: Właściwie tak jest w przypadku Wodospadu. Nie zaczynasz kodować, dopóki każdy szczegół projektu nie będzie ostateczny. Na szczęście faktyczny wodospad rzadko jest stosowany w programowaniu - głównie dlatego, że tak naprawdę nie działa.
tdammers
1
@tdammers, dzięki za komentarz. Stało się to jednak kilka razy. Metoda wodospadu nie ma właściciela i może być stosowana i interpretowana w różny sposób. Nie ma żadnej reguły, która mówi, żeby nie kodować, dopóki ... albo ... ... to dlatego, że nie jest to metodologia. Uważam, że w dobrej metodologii ma to sens szczególnie w projektach, w których użytkownicy znają sedno tego, czego potrzebują od systemu.
NoChance
@Emmad Kareem: Zgadzam się z tobą. Myślę, że zwinne metody są bardziej odpowiednie dla projektów, w których wymagania nie są jasne i potrzeba dużo prototypowania i opinii użytkowników, aby uzyskać ostateczne wymagania. Z drugiej strony istnieją przypadki, w których podstawowe wymagania są jasne od samego początku. W takich przypadkach przyjąłbym metodę rozwoju bardziej podobną do wodospadu (z pewną przestrzenią do poprawek po drodze) niż do metody zwinnej. Myślę, że to naprawdę zależy od rodzaju projektu, nad którym pracujesz.
Giorgio

Odpowiedzi:

7

Po pierwsze, model „wodospadu” zawsze był słabym człowiekiem, który opisywał, jak NIE prowadzić projektu rozwoju oprogramowania. Sprawdź to.

W każdym razie większość projektów SDLC „wodospadowych” wiąże się z procesem „zarządzania zmianami”, gdy ludzie odkrywają, że założenia zapisane w specyfikacjach nie są już aktualne (i zawsze dzieje się tak w dużych złożonych projektach). Niestety proces zarządzania zmianami jest zbudowany jako środek obsługi wyjątków i jest głupio drogi, co oznacza, że ​​projekt skończy się późno lub będzie niskiej jakości.

Ideą metodologii Agile jest to, że zmiana jest dana - nastąpi. Dlatego należy wykonać standardowe operacje „zarządzania zmianami” zamiast obsługi wyjątków. Nie jest to łatwe, ale ludzie odkryli, że jeśli używasz wielu dobrych praktyk projektowych, możesz to zrobić.

Innym poważnym problemem związanym z projektowaniem od przodu jest to, że (najczęściej) tak dużo czasu spędza się na gromadzeniu wymagań, jak i na projektowaniu, rozwoju i testowaniu. Ponadto, jeśli testowanie jest ostatnią fazą i zostanie wykryty poważny problem, jest bardzo mało prawdopodobne, aby został naprawiony w twoim przedziale czasowym.

Być może jedną z najlepszych cech podejścia zwinnego jest to, że wymaga ciągłej interakcji (to znaczy prawdziwej komunikacji) między zespołem opracowującym rozwiązanie a klientem, który tego potrzebuje. Priorytety są tworzone, aby elementy o najwyższym priorytecie były wykonywane jako pierwsze (a jeśli skończy się czas, wycinane są elementy o niskim priorytecie). Informacje zwrotne przychodzą szybko.

Wracając do kwestii dramatycznych zmian - naprawdę musisz użyć metod łagodzących zmiany. Dobre zasady SOLID OO mogą odegrać dużą rolę w tym, podobnie jak budowanie solidnych zautomatyzowanych pakietów testowych, aby można było przetestować oprogramowanie regresji. Powinieneś robić te rzeczy bez względu na metodologię, ale stają się one naprawdę niezbędne, jeśli próbujesz być zwinny.

Matthew Flynn
źródło
Wielkie dzięki. Dla wszystkich, którzy chcą przeczytać o tym, jak projektowanie działa sprawnie i dlaczego nie jest tak źle: http://jamesshore.com/Agile-Book/incremental_design.html
tux91
8

Cóż, jest kilka zalet. Po pierwsze, klienci nie czytają dokumentów specyfikacji. Zawsze. Waterfall zakłada, że ​​wszyscy na początku zgodzą się na specyfikację, a kiedy rok później oprogramowanie zostanie dostarczone klientowi odpowiadające specyfikacji, będą zadowoleni. W praktyce klienci odkrywają tylko te rzeczy, których naprawdę potrzebują, naprawdę nie potrzebują i naprawdę muszą być czymś innym, gdy aktywnie bawią się samym oprogramowaniem. Zwinny dostaje działający prototyp w ręce klientów, więc te rozłączenia są natychmiast wychwytywane. Zwinne to nie tylko reagowanie na zmieniające się wymagania. Chodzi również o to, by te zmieniające się wymagania pojawiały się wcześnie, gdy koszt zmiany jest niski, a nie na końcu, gdy koszt zmiany jest wysoki.

Drugą zaletą jest to, że ponieważ Agile ma często dobrze widoczne wyniki, projekty rzadziej wypadają z szyn. Dzięki dużemu projektowi Wodospad zbyt łatwo jest zostać daleko w tyle, nawet nie zdając sobie z tego sprawy. Waterfall produkuje wielomiesięczne marsze śmierci pod koniec projektu. Dzięki Agile, ponieważ dostarczasz klientom co kilka tygodni, wszyscy dokładnie wiedzą, gdzie jest projekt, a poślizgi są szybko łapane (i dostosowywane). Z mojego doświadczenia wynika, że ​​Waterfall produkuje tygodnie lub miesiące po 100 godzin tygodniowo. Zwinność oznacza, że ​​być może będziesz musiał poświęcić kilka 12 godzin na koniec sprintu.

Trzecią zaletą jest to, że projekty zwinne są bardziej motywujące. Bardzo trudno jest ludziom mieć poczucie prowadzenia w ciągu całego projektu. Termin wydaje się bardzo odległy, a ten brak bezpośredniości oznacza, że ​​ludzie mają tendencję do odkładania na później, nadmiernego polerowania wzorów, a poza tym po prostu nie działają zbyt produktywnie. Jest to szczególnie prawdziwe, ponieważ początkowe miesiące spędzane są na rzeczach, których ludzie nie lubią robić, takich jak specjalne dokumenty. Ponieważ Agile zawsze ma bardzo bezpośrednie, konkretne terminy w najbliższej przyszłości, ludzie są bardziej zmotywowani. O wiele trudniej jest zwlekać z konkretnym terminem na ustalony zestaw zadań, które mają się odbyć w przyszłym tygodniu.

Gort the Robot
źródło
Pierwszy argument, do tego właśnie mam wrażenie, że jestem zwinny. Radzenie sobie z ciągle zmieniającymi się wymaganiami. Ponadto, jeśli chodzi o wczesne zmienianie wymagań, nadal istnieje ogromna możliwość zepsucia architektury, która prowadzi do reimplementacji wielu istniejących kodów. Drugi argument, czy możesz wyjaśnić, dlaczego projekty wodospadów powodują marsze śmierci? Wydaje się, że mała dyscyplina w połączeniu ze zwięzłą specyfikacją techniczną może zdziałać cuda. Trzeci argument, jaki jest problem z budowaniem projektu wodospadu od dołu do góry i możliwością jego budowy od czasu do czasu?
tux91
2
Moje doświadczenie z projektami Waterfall polega na tym, że są one zawsze na czas przez pierwsze 90% planowanego czasu, w którym to momencie są nagle o kilka miesięcy opóźnione. Model Agile nalegania na pokazy przy każdym sprincie czyni to znacznie mniej prawdopodobnym. Kiedy ludzie wiedzą, że staną się odpowiedzialni za półtora tygodnia, zwykle są lepiej zmotywowani niż wtedy, gdy zostaną pociągnięci do odpowiedzialności za dziewięć miesięcy. To tylko ludzka psychologia.
Gort the Robot
1
Cóż, wydaje mi się, że nie mogę kłócić się z doświadczeniem, chociaż moje doświadczenie było trochę inne, z dobrym projektem ręcznego kodowania nie ma wielu problemów po drodze, a szacunki też wydają się całkiem dobre. Nadal uważam, że powstała architektura będzie bardziej solidna, jeśli użyje się wodospadu.
tux91
2
Istnieje kilka obszarów - głównie te kluczowe dla bezpieczeństwa, np sygnalizacja kolejowa, awionika - gdzie klienci robić bardzo uważnie przeczytać specyfikacje. Są dość rzadkie i i tak prowadzą do bardzo różnych metodologii rozwoju.
Donal Fellows
4

W odpowiedzi na cytat z pytania, który jest fundamentalnym błędnym przekonaniem przeciwników zwinnych

„... podczas gdy wodospad pozwala dopracować architekturę przed wydaniem czegokolwiek.” jest błędem, pozwólcie mi to naprawić; „... podczas gdy wodospad pozwala dopracować architekturę , abyś nigdy niczego nie wypuszczał.

Implikacja, że ​​Waterfall w jakiś sposób zapewnia architekturę wyższej jakości, jest zasadniczo fałszywa i całkowicie obalona przez empiryczne dowody historyczne.

Gdyby Facebook został zaprojektowany w stylu wodospadu z 500 milionami użytkowników jako twarde i szybkie wymaganie i nie zostałby wydany, dopóki nie zostanie dopracowana architektura do obsługi, która zostanie dopracowana, nikt nigdy nie usłyszałby o tym dzisiaj.

To samo dotyczy YouTube, Twittera i wielu innych firm.

Dostali coś, co klient mógł dotknąć i zareagować na pracę, i wypuścili to tak szybko, jak to możliwe. Otrzymali informację zwrotną, dopracowali ją i wydali ponownie; powtarzać. W tych trzech przykładach odpowiadają tylko funkcjami, które klienci akceptują i chcą, i marnują tak mało czasu, jak to możliwe, na rzeczy, które klienci uważają za mało lub bez wartości.

Każdy, kto ma znaczące lata doświadczenia w tworzeniu oprogramowania, zgodzi się, że nie ma czegoś takiego jak doskonała architektura. Tylko jeden, który zaczyna się dalej od entropii i dużej kuli błota niż inne alternatywy. Zwinny to potwierdza i bierze to pod uwagę. Wbudowanie w proces, takie jak zadłużenie techniczne, szybka zmiana priorytetów i refaktoryzacja.


źródło
3
Używając słowa „nigdy”, czy mówisz, że nie ma tam żadnych programów, które zostały wykonane przy użyciu wodospadu? Ponadto, dlaczego „nigdy” niczego nie zwalnia, jeśli masz zestaw wymagań dotyczących konkretnego kamienia milowego, który z powodzeniem wdrożono?
tux91
1
@ tux91, robisz mój punkt za mnie; nic nigdy nie będzie idealne, biorąc pod uwagę, że potrzeby zmieniają się natychmiast po umieszczeniu projektów na papierze i są przestarzałe przed napisaniem jednego wiersza kodu. Tak więc cytowane przeze mnie stwierdzenie jest błędem, nigdy nie udoskonalisz architektury, a zatem nigdy niczego nie uwolnisz.
1
@ tux91 nadal czytam dla zrozumienia, powiedziałem, że nie ma prefektury i jeśli nie wydasz, dopóki nie będzie tak jak w cytacie, nic nigdy nie zostanie wydane. Nie powiedziałem, co twierdzisz, kropka, to jest w twojej głowie i twojej interpretacji. To, co powiedziałem, to argument, że wodospad w jakiś sposób zapewnia lepszą jakość architektury, jest błędny i zasadniczo wadliwy. I te argumenty na temat NASA i wodospadu, a co nie; poza tym, że nie był związany z programistami , zabił 3 astronautów na ziemi, co nie jest lśniącą historią sukcesu.
1
@ tux91 wrt użycie słowa „nigdy”, jestem tutaj z Jarrodem: pytanie brzmi „wodospad pozwala ci na doskonalenie ...” - co odpowiada mu całkowicie odpowiednim (w tym nierealistycznym „doskonałym” kontekście) słowem „nigdy”. Jedynym powodem, dla którego nie głosowałem za tym, jest to, że staram się unikać głosowania na odpowiedzi na mało konstruktywne pytania
komnata
1
@gnat tak, myślę, że nie pomyślałem, kiedy użyłem słowa idealna , to nie jest to, co chciałem, naprawdę
tux91
3

Scrum sam w sobie nie określa żadnych praktyk technicznych, ponieważ jest to ogólne ramy.

Zwinne tworzenie oprogramowania wymaga od zespołu doskonałości technicznej. Wynika to z następujących praktyk technicznych z XP (programowanie ekstremalne). Na przykład, musisz nauczyć się o refaktoryzacji, tdd, całym zespole, programowaniu par, projektowaniu przyrostowym, ci, współpracy itp.

Takie postępowanie pozwala szybko i bezpiecznie radzić sobie ze zmianami, co jest również głównym powodem stosowania zwinnego programowania.

Jedyną miarą zwinności, która ma znaczenie, jest to, że regularnie (co tydzień, co dwa tygodnie) wydajesz klientowi wartościowe, działające oprogramowanie. Możesz to zrobić? Jesteś zwinny w mojej książce.

Martin Wickman
źródło
Nie dostaję tego, że „można szybko i bezpiecznie poradzić sobie ze zmianami”, ponieważ implikuje to, że trudniej jest zmienić projekt oparty na wodospadzie. Dlaczego? To tylko baza kodów. Określ, co chcesz zmienić, zaprojektuj to i jak pasuje do istniejącej architektury, kodu, testowania i wydania. Po prostu nie nazywaj tego sprintem, zamiast tego nazwij to kamieniem milowym. Nie wygląda na to, że zajęłoby to więcej czasu lub stanowiłoby więcej trudności niż zwinność. Różnica polega na tym, że planujesz bardziej ostrożnie, ale nie musisz robić tak rygorystycznie XP.
tux91
@ tux91 Zaktualizowałem moją odpowiedź. Jeśli chodzi o architekturę, polecam przeczytać to lub obejrzeć o 26:20 o tym, co nazywamy „projektowaniem przyrostowym”.
Martin Wickman,
2

Dla mnie główną zaletą zwinności jest zmniejszenie ryzyka w projekcie.

Dostarczając iteracyjnie i otrzymując wiele opinii od bazy użytkowników, zwiększasz szansę, że dostarczysz coś, czego naprawdę chcą, i zrobisz to, pragmatycznie dostarczając im najważniejsze funkcje tak wcześnie, jak to możliwe. Teoretycznie będzie to możliwe dzięki lepszym oszacowaniom i planowaniu. Jest to oczywiście bardzo atrakcyjne z punktu widzenia biznesu - znacznie więcej niż tylko wersja, którą można wydać.

Można argumentować, że ta ciągła zmiana zagraża systemowi i obniża jakość, ale powiedziałbym dwie rzeczy. 1) Ta zmiana i tak dzieje się w bardziej tradycyjnych projektach dostarczania oprogramowania - jest po prostu nieuwzględniona i pojawia się później w projekcie, kiedy to, jak wskazałeś, trudniej i drożej jest zmienić. 2) Agile ma wiele do powiedzenia na temat radzenia sobie z tą zmianą, jeśli chodzi o korzystanie z doświadczonych zmotywowanych osób i praktyk, takich jak TDD, parowanie i recenzje kodu. Bez zmiany nastawienia na jakość i ciągłe doskonalenie, akceptuję tę częstą zmianę, która pociąga za sobą sprawność, może powodować problemy.

Benjamin Wootton
źródło
Tak, właśnie to myślę o jedynej przewadze wodospadu. Są jednak chwile, kiedy nie chcesz nikomu pokazywać swojego produktu, gdy jest on w fazie rozwoju, ponieważ po prostu nie jest gotowy, nie ma jeszcze zalet. Lub jeśli masz dość mocne pojęcie o tym, co chcesz zbudować w końcu. Testy, programowanie par i przeglądy kodu nie gwarantują jednak, że uzyskasz dobrą ogólną architekturę produktu, są one wykonywane tylko po to, aby zagwarantować, że nowe funkcje działają poprawnie.
tux91
1

W wielu przypadkach architektura będzie musiała zostać znacznie zmodyfikowana, co oznacza również, że będziesz musiał ponownie wdrożyć wszystkie funkcje oparte na starszej architekturze.

Jeśli twoja architektura wymaga znacznej modyfikacji w wyniku zmiany wymagań, masz złą architekturę lub złe wymagania. Dobra architektura pozwala odroczyć jak najwięcej decyzji i oddzielić elementy systemu. Dobre wymagania (użytkownika) nie są takie jak „użyj innej bazy danych”.

Więc działajmy przy założeniu, że mamy dobrą działającą architekturę. Jeśli tak jest, wówczas zwinne metodyki rozwoju tracą to „mycie” dzięki metodologiom projektowania z dużym wyprzedzeniem. W końcu podstawową cechą metodologii zwinnego programowania są praktyki takie jak TDD, które promują luźne sprzężenie w kodzie, umożliwiając kontynuowanie projektu z dużą prędkością, niezależnie od tego, czy jest na początku, czy bardzo dojrzały.

Erik Dietrich
źródło
0

W wielu przypadkach architektura będzie musiała zostać znacznie zmodyfikowana, co oznacza również, że będziesz musiał ponownie wdrożyć wszystkie funkcje oparte na starszej architekturze. Cała kwestia obniżenia kosztów trochę tutaj odchodzi.

Po zwinnym procesie istnieje większa szansa na złapanie tego wymagania przed opracowaniem zbyt dużej ilości oprogramowania (i należy je zmienić). Kiedy spędzasz kilka miesięcy, nie pracując z klientem i nie dając mu czegoś do obejrzenia, te główne problemy architektoniczne wychwytujesz dopiero wtedy, gdy „pomyślisz”, że jesteś gotowy do dostarczenia.

Wolę raczej wdrożyć te zmiany w działającej aplikacji, która ma zasięg testowy, niż ogromną kupę kodu, który nawet się nie kompiluje. Będąc szefem pomocy technicznej, otrzymałem płytę CD z aplikacją, która była w fazie rozwoju i nawet się nie zainstalowała. Mogliśmy znaleźć ten problem w pierwszym tygodniu, ale zamiast tego nadszedł czas, aby zamówić kolację, ponieważ była to długa noc.

JeffO
źródło