tl;dr;
- Jeśli nie jest agile (pracujesz tak jak biznes chce, z planowaniem) - to absolutnie story pointy nie mają żadnego sensu.
- Jeśli jesteś Agile - to story pointy, brak szacowania, brak planowania, ma sens.
Odpowiedź:
@Althorion Bardzo się cieszę że odpisałeś w taki racjonalny, spokojny sposób. Już odpowiadam.
Zasadnicze pytanie - po co?
Tak serio - jaki jest sens estymować czasowo zadanie? Weźmy konkretne powody na tapet. Opieranie się na estymatach czasowych to taki stary model produkcji trochę.
Bo w biznesie wszystko się liczy wg czasu — wg czasu rozlicza się pracowników (płacąc im pensję co miesiąc, a nie co xyz zaimplementowanych feature’ów), wg czasu się planuje projekty (kiedy zabrać się za następny? Jak długo zapewniać wsparcie?), wg czasu planuje się zatrudnianie/zwalnianie pracowników, wg czasu tworzy się wyceny, wg czasu przygotowuje raporty finansowe…
Bo w biznesie _wszystko_ się liczy wg czasu
to jest jedno z (moim zdaniem) błędnych założeń, i należy się go wyzbyć, jak chce się być agile.
No okej, czyli to co opisałeś to taki "standardowy" sposób biznesowy na wytwarzanie oprogramowania, i rozumiem go. Ma swoje zalety, tylko jest jeden problem z nim. On zakłada że da się coś wyestymować - że programista/programiści popatrzą na task/zadanie, i będą potrafili powiedzieć ile zajmie dowiezienie go - i niestety często nie potrafią :/ "Estimate" to jest po prostu mądre słowo na "zgadywanie". Statystyki z wielu projektów pokazują że estimate'y dot. oprogramowania mylą o 4x w jedną lub drugą stronę (czyli estimate na 28 dni, może zając 7, lub 112 dni, statystycznie). Moim zdaniem sporym problemem jest to że "ludzie u góry" domagają się pewności, od ludzi którzy nie mogą jej dać - manager nade mną "ile zajmie to zadanie, dokładnie?" - "nie wiem" - "to wyestymuj" (czyli zgadnij). Programiści wtedy wpadają w taką pułapkę, i zgadują ile może coś zająć, i taki manager potem snuje plany na podstawie danych które mogą się okazać (i często się okazują) nie prawdziwe. Ile razy programisci się spóźniali i mówili "aa, bo się okazało że to jest bardziej skomplikowane". To jest właśnie to - to nie jest przez niewiedzę, tylko przez to że nikt nie jest dobry w zgadnięcie ile coś zajmie. Trzeba po prostu spróbować zacząć coś zrobić, i minimalizować konsekwencje - małe iteracje.
Można powiedzieć że Agile to jest sposób na minimalizowanie konsekwencji wynikających z działania kiedy nie mamy pewności (czyli małe iteracje, feedback od klienta.
Jak idziesz do dentysty albo do taksówki i pytasz "ile czasu zajmie to kanałowe" albo "ile czasu do centrum", to oni Ci odpowiedzą, nie dlatego że estymują, tylko dlatego że robili to samo już setki razy, i pamiętają ile to zajęło. Z wytwarzaniem oprogramowania jest inaczej - zawsze robimy coś nowego, więc nie wiemy ile to zajmie.
To teraz odpowiem na wszystkie rzeczy po kolei:
Jeśli zespół nie jest w stanie odpowiedzieć, czy daną usługę będzie realizował rok, dwa, czy półtora, to nie sposób tego przetłumaczyć na potrzebne zasoby. Nie wiadomo, ile to będzie kosztować, nie wiadomo, jak i czy zatrudniać kogoś dodatkowego, nie wiadomo, czy i kiedy zacząć się rozglądać za kolejnym kontraktem, nie wiadomo nic.
I nawet, jak nasze szefostwo jest bardzo agile, i woli „dowozić iteratywnie”, to reszta świata nie jest. Jak ktoś kupuje customowy sklep internetowy, to musi wiedzieć, kiedy będzie działał, bo od tego zależy, od kiedy będzie potrzebował ludzi do obsługi, towar na magazynach, całą resztę zaplecza. Jak ktoś rozpisuje kontrakt na oprogramowanie, to musi wiedzieć, kiedy je dostanie, bo od tego zależy, od kiedy musi mieć serwerownię, administratorów, resztę zaplecza. Jak robimy coś in-house, to też szefostwo musi wiedzieć, kiedy będzie, bo od tego zależy, kiedy rozpocząć działania marketingowe i jakie, żeby nie wypalić przedwcześnie ani nie zrobić nic za późno.
No i nawet, jak żadna z tych rzeczy nie zachodzi, to wciąż pozostaje ta kwestia, że ludziom się regularnie płaci pensje, czy można na ich oprogramowaniu zarabiać, czy jeszcze nie. Więc chce się wiedzieć, czy będzie się to jeszcze robić krótko, czy długo. Nikt nie jest na tyle cierpliwy i wyrozumiały, żeby mu było wszystko jedno, czy projekt przejdzie do następnej fazy za miesiąc, czy za pięć lat…
Bo zadałem pytanie "po co komu estymaty", i pozwolę sobie podsumować w punktach Twoją odpowiedź:
- "według czasu rozlicza się pracowników"
- "według czasu planuje się projekty"
- "według czasu planuje się zatrudnianie i zwalnianie pracowników"
- "według czasu tworzy się wyceny"
- "według czasu przygotowuje się raporty finansowe"
- "przetłumaczenie projektu na potrzebne zasoby"
- "oszacowanie kosztu"
- "czy zatrudnić kogoś nowego"
- "czy złapać nowy kontrakt"
- "informacja dla klienta kiedy coś będzie gotowe"
- "kiedy rozpocząć działania marketingowe"
- "wiedza dla managementu ile trzeba będzie płacić pracownikom za ich pracę, przed wydaniem softu".
- "cierpliwośc czy projekt będzie za miesiąc czy za pięć lat".
Rozumiem wszystkie te argumenty - są bardzo sensowne, i moim zdaniem, do żadnej z tych rzeczy nie potrzebujesz estymate'ów czasowych (bo moja teza brzmi że "estimate" == "zgadywanie"). Postaram się odpowiedzieć na nie wszystkie.
-
"według czasu rozlicza się pracowników"
- W Agile projektach po prostu ludziom się płaci na etacie, 8h dziennie, przez 21 dni w miesiącu. Nie widzę powodu czemu estymowanie zadań miałoby w tym pomóc.
- Jeśli ktoś jest kontraktorem, to płaci mu się za przepracowany czas. Co jeśli ktoś ma mały budżet? Patrz punkt niżej.
-
"według czasu planuje się projekty"
- Odpowiedź Agile na "planowanie projektu" jest bardzo prosta. Agile mówi: nie ma potrzeby planować projektu. To jak to wygląda: bierzesz osobę lub zespół, dajesz im projekt, i oni robią najmniejszą, najprostszą możliwą rzecz jaką mogą zrobić i wdrożyć na środowisko testowe lub od razu na produkcję, robią coś co można przygotować w dzień lub kilka dni. Pierwsza wersja można powiedzieć że jest "zdegenerowana", sam basic feature, bez architektury, bez bibliotek, bez frameworków, basic hello world, który robi tylko i wyłącznie jedną, najprostszą, najgłupszą rzecz którą klient chce. Zaczynają od najważniejszej rzeczy. Czyli to wygląda tak, że jak duża firma X chce zbudować powiedzmy kopię Netflixa, na którym ma się dać oglądać filmy, to zespuł buduje głupią stronę na której jest tylko lista filmów, i jeszcze nie da się nic oglądać, i wrzuca na środowisko (testowe, staging, uat albo prod, zależy jak klient chce). Klient potem patrzy na tą apkę, i daje feedback. Owszem - strona nie działa, nie da się oglądać filmów, ale to nic. Klient patrzy, i daje feedback, programiści go zbierają. Nikt nie zakłada że oprogramowanie jest gotowe i nikt nie zakłada że wiedzą co robią, klient też tego nie wie. Jest to dosyć nieprzyjemne, ale w Agile wszyscy biorący udział w projekcie muszą mieć mindset "nie wiem co robię, to jest początek projektu, nikt nie wiem jak on będzie wyglądał, spróbujmy małą rzecz, zobaczmy co z niej wyjdzie, jak się nie uda, to stracimy mały - minimalizujmy konsekwencję niewiedzy". Programiści zbierają feedback od klienta, i spędzają kolejny dzień, dwa, trzy na nowej wersji, i tym razem np dodają drugi najważniejszy feature (skąd wiedzą który jest najważniejszy, klient im powiedział w feedbacku), to możę być lajkowanie filmów, to może być logowanie, to może być faktyczne oglądanie filmów, etc.) Poświęcają max jeden,dwa, trzy dni na dostarczenie tego, i znowu pokazują klientowi. Produkt oczywiście nadal nie jest gotowy, ale klient otwiera stronę, i patrzy czego mu tam brakuje. W dowolnym momencie klient możę powiedzieć "porzucamy projekt", w dowolnym momencie klient może powiedzieć "potrzebujemy jeszcze zmian", i w dowolnym momencie klient może powiedzieć "nie potrzebujemy więcej zmian, jest dobrze tak jak jest". Nie ma powodu żeby znać "przyszłość" i estymować (pod tym względem). Jeśli klient zlecił oglądanie filmów, to programiści starają się to dostarczyć w te 1-3 dni, jeśli im się nie udaje, to muszą zrobić coś co trochę przypomina oglądanie filmów, np pokazanie miniaturku. To nie jest to co klient chciał, ale nie mogą z tym nic zrobić - nie wyrobią się tak w 3 dni. Więc pokazują klientowi wersje z miniaturkami bez filmów, i mówią "tyle zrobiliśmy". Klient mówi "ale miały być filmy", programiści mówią: "musieliśmy dodać wgrywanie obrazków, nie udało nam się tego tak zrobić", daliśmy Ci miniaturki. Klient mówi; "muszą być filmy", programiści zaczynają pracę, i tym razem powiedzmy udaje im się zahardkodzić film tak że można oglądać tylko jeden, przychodzą do klienta i pokazują mu. Klient jest zadowolony. I tak dalej. Zbierają feedback od klienta, klient mówi: "dobra, to teraz zróbcie żeby dało się lajkować film", i programiści zaczynają pracę nad lajkami, i wracają znowu za 1-2 dni. Powiedzmy że da się lajkować, ale nie mieli czasu zrobić "odlajkowywania" (nie napisali ifów i testów pod odlajkowanie). Klient mówi że to spoko, bo i tak nie chce odlajkowania. Klient daje kolejny feedback, i programiści go robią - powtórz.
-
"według czasu tworzy się wyceny"
-
@Althorion Tutaj chodzi o wycenę pensji dla programistów, czy chodzi o to za ile sprzedać gotowy soft?
-
"według czasu przygotowuje się raporty finansowe"
-
@Althorion Tego też nie do końca rozumiem, mógłbyś lepiej wyjaśnić w jaki sposób estimate'y poszczególnych zadań mają być potrzebne do takiego raportu?
-
"przetłumaczenie projektu na potrzebne zasoby"
- To samo co z programistami - nie potrzebujesz tłumaczyć czasu na potrzebne zasoby, bo w każdym jednym momencie widzisz aktualny progress, więc można na to reagować na bieżąco. To właśnie znaczy agile w słowie agile. Agile znaczy "zwinny", dosłownie - czyli nie planujesz, tylko reagujesz.
-
"oszacowanie kosztu"
- W Agile nie ma potrzeby szacować kosztów, bo w dowolnym momencie można powiedzieć "stop, nie pracujemy więcej". Zaczynamy projekt od jednej iteracji, jeden/dwa/trzy dni, więc w najgorszym wypadku stracisz kasę na kilka dni. Jak chcesz rozwijać produkt dalej, to zapłać za jedną iteracje, i dostaniesz nową wersję, która jest trochę bliżej tego co chcesz. Zaczynamy od najważniejszych rzeczy, więc jak już się zrobi najważniejszą rzecz, to klient widzi że ona już jest zrobiona - mamy działający software, więc nie ma już niepewności z tym związanej.
-
"czy zatrudnić kogoś nowego"
- To jest decyzja managementu, i nie wymagają do tego estimate'ów od programistów. Projekt się zaczyna, programisci robią kilka iteracji, oddają nową wersję po 1/2/3 dniach, i management sam widzi jakie zmiany udało się wdrożyć przez te trzy dni. Może podjąć decyzję, czy chce dopłacić więcej do projektu czy mniej. Sam zatrudniałem programistów do takich zespołów, i nie musiałem znać "estimate'ów czasowych" takich zadań.
-
"informacja dla klienta kiedy coś będzie gotowe"
- Klient nie potrzebuje wiedzieć kiedy coś będzie gotowe, bo po pierwsze: cały czas widzi aktualną wersję, która wychodzi codziennie, albo co kilka dni (w najgorszym wypadku co tydzień albo dwa). Każdego nowego dnia wchodzi na stronę, i bardzo szybko widzi zmiany.
- Co jak klient się domaga terminów? Należy mu odpowiedzieć: "nie wiemy kiedy to będzie gotowe, ale damy Ci najważniejszy feature za kilka dni i możesz sam ocenić".
-
"kiedy rozpocząć działania marketingowe"
- To klient musi sam zdecydować, na podstawie tego co widzi w gotowym produkcie. Estimate'y (czyli zgadywania) programistów mu nie pomogą w tym, klient sam widzi jak szybko soft się rozwija. Jeśli jakiś konkretny feature jest potrzebny pod działania marketingowe, to klient może dać feedback programistom: "chce rozpocząć działania marketingowe i po to potrzebuję feature X, zróbcie go", i programiści zaczynają go robić, i dadzą jakąś początkową wersję za 1/2/3 dni, klient zobaczy i zdecyduje sam czy to jest good-enough na rozpoczęcie działań marketingowych czy nie. Jeśli okaże się że klapa, to w najgorszym case'ie straci te kilka dni na przygotowanie tego.
-
"wiedza dla managementu ile trzeba będzie płacić pracownikom za ich pracę, przed wydaniem softu".
- Management nie potrzebuje takiej wiedzy, bo w każdym momencie może przestać wytwarzać taki soft, i management cały czas widzi aktualny progres. I ponownie - estimate programistów niewiele tutaj pomoże. Management widzi że kasa na 1/2/3 dni pracy programistów daje im określony return (czyli np wydają 1000zł dziennie, i za to 1000zł mają jedną nową wersję), mogą zdecydować sami czy chcą nadal inwestować w projekt czy nie. Feedback loop jest mały. Nie potrzebują widzieć "w przyszłośc".
-
"cierpliwośc czy projekt będzie za miesiąc czy za pięć lat".
- Tego w sumie argumentu nie rozumiem.
-
"czy złapać nowy kontrakt"
-
@Althorion to rozumiem że chodzi o kontrakt z programistami? Czy o kontrakt z zewnętrzną firmą?
-
"według czasu planuje się zatrudnianie i zwalnianie pracowników"
- Nigdy nie słyszałem żeby ktoś planował zwalnianie pracowników. Natomiast jeśli ktoś planuje zatrudnienie nowych praconików, to szczerze mówiąc nie wiem jak "estimate" poszczególnych zadań miałoby w tym pomóc. Mógłbyś dopowiedzieć?
Większość moich odpowiedzi brzmi "nie potrzebujesz planować", bo widzę że niektóre argumenty są trochę circular, tzn. "ja potrzebuje coś zaplanować, bo ktoś inny musi coś zaplanować". To ja tylko odpowiadam: jak robisz Agile, to nie musisz planować.
Wymaga to zmiany mindset'u, owszem. Nie jest to też proste. Ale jak zaczniesz myśleć w taki sposób, to to nawet ma sens.
I na dodatek, powiem tak - to wszystko co napisałem wyżej, to nie jest tak, że taki sposób działania jest jakoś "lepszy". Tylko chodzi o to że "estimate'y" to jest zgadywanie, jest niedokładne, ludzie podczas estymowania się mylą. Tak na logikę - skąd programista miałby wiedzieć ile zajmie wykonanie jakiegoś zadania, jak nie wie co klient do końca chce - klient też nie do konca wiec co chce (klient Ci tylko powie czy mu się podoba co jest teraz czy nie).
Gdyby ludzie byli dobrzy w estymowaniu - czyli można zerknąć na projekt, i dokłądnie powiedzieć "to zadanie zajmie 15 godzin", to spoko - to cały Agile jest nie potrzebny. Ale nie jesteśmy. Biznesy się oszukują że można "oszacować" zadania, bo fantazja że możemy mieć pewnośc w tym temacie jest bardzo kusząca, ale rzeczywistośc niestety mówi że większość estimate'ów w programowaniu jest nietrafiona. Więc nierozsądne jest opierać coś na nietrafionych danych (estimate'ach). Coś zawsze wychodzi nowego, nikt nie przewiduje przyszłości.
Moja teza brzmi: nic dobrego Ci nie dadzą estymaty czasowe - nie potrzeba ich, a mogą zaszkodzić. Możemy o tym porozmawiać
Moja jest taka — estymaty czasowe to jedyne estymaty, które są komukolwiek z zewnątrz potrzebne do czegokolwiek. Jak je będą mieli, to mogą sobie wyliczyć i zaplanować całą resztę; jak ich nie mają, to nie mogą wyliczyć i zaplanować nic. Jeśli więc oprogramowania się nie robi dla samych siebie, takiej trochę „sztuki dla sztuki” — a prawie nigdy, poza open source, tak nie jest — to bez wyliczania, budżetowania, i planowania następnych faz nic się nie osiągnie.
Tylko że te estymaty nie są dokładne i wiarygodne, to są tylko zgadywania. Więc jeśli biznes planuje coś na niedokładnych danych, to wyjdzie mu niedokładny plan, i to jest słabe.
A nawet jeśli, to przecież SP to są estymaty czasowe. Tak jak pisałem wyżej — jest velocity, gdzie nas pilnują, żeby było możliwie niezmienne, i długość sprintu, która jest niezmienna, więc z tego wychodzi, przez proste dzielenie, ile wypada czasu na każdy SP. A jak nas nie pilnują, żeby velocity było niezmienne, to możemy sobie zaoszczędzić czasu i wysiłku, wpisując SP dowolnie, bo czemu nie? Estymacja czasowa całkowicie od tego wybuchnie… ale skoro się upieramy, że to nie problem, to co jest problemem?
To co piszesz, nie wiem dokładnie co to jest za model pracy, ale na pewno nie Agile. Już powiem czemu.
Przy czym od razu mówię - nie próbuję podważać tego co mówisz. Ja tylko mówię że ten "system" (ze story pointami, sprintami), cała ta zabawa tylko wtedy ma sens kiedy jesteśmy Agile - i trochę to opisałem wyżej. Natomiast jeśli ktoś nie jest agile (nie robi tego co tutaj opisałem wyżej), to wiadomo że żadne SP, żadne sprinty, żadne nic nie ma sensu - i jeśli ktoś nie jest agile, to się zgadzam - SP nie mają sensu. Story pointy mają sens tylko w otoczeniu zespołu i managementu który jest agile - bez niego, nie mają żadnego (i można estymować w godzinach/dniach).
Tak jak pisałem wyżej — jest velocity, gdzie nas pilnują, żeby było możliwie niezmienne, i długość sprintu, która jest niezmienna, więc z tego wychodzi, przez proste dzielenie, ile wypada czasu na każdy SP.
Noo, tak i nie. To nie jest tak że w agile trzeba "pilnować velocity". W agile, sprinty są po to żeby próbować zmierzyć velocity (ale zmierzyć, a nie wymusić albo pilnować). Po co zmierzyć - właściwie tylko po jedną rzecz (w Agile) - i tą jedną rzeczą jest priorytetyzowanie następnych zadań, po nic innego.
Przy czym ja nie mówię jak Ty albo ktoś inny ma pracować - ja tutaj w tym poście opisuję tylko sposób w jaki ktoś może być Agile, i w jaki sposób SP oraz sprinty mogą w tym pomóc. Jeśli ktoś nie jest agile (bo np robi faux-agile), to to co tutaj piszę, dla niego jest całkowicie nieadekwatne.
Oprócz estymacji do tego dochodzą inne czynniki - np. to że często programiści jak sobie zaplanują np sprint na dwa tygodnie - to zrobią ich wizję tego co klient chce, a nie na prawdę co klient chce. Może się okazać że poświęcą cały sprint, na coś co jest zupełnie nie trafione. To jest bardzo ryzykowna zagrywka. Po co czekaż z feedbackiem od klienta 2 tygodnie, skoro można mu pokazać 1/14tą, i spytać "w dobrą strone to idzie czy w złą?", i wtedy klient Ci powie. Jeśli zrobisz tą 1/14tą, i okaże się że to nie jest do końca co klient chce, to stracisz jeden dzień a nie dwa tygodnie.