Czy ktoś wie co to SAFe?

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10230
0
somekind napisał(a):
Riddle napisał(a):

Ale z tego co pamiętam, to jednym z filarów SAFe jest "predictibility". I jeśli moja dedukcja działa dobrze to nie można można mieć jednocześnie predictibility i reagowania na zmiany. Jeśli reagujesz na zmiany, to siłą rzeczy to musi być unpredictable.

Zmiany... ale które?

No np klient zmienił zdanie co do jakiejś funkcjonalności, wpadł nowy case o którym nie pomyślał, wpadł inny pomysł jak coś rozwiązać, wpadł jakiś blocker, wpadło jakieś nowe info, wyszła jakaś trudność w implementacji, klient po przemyśleniu stwierdził że funkcjonalność jednak nie ma sensu (albo jest redundantna z inną istniejącą), klient po namyśle stwierdził że to nie jest priorytetowe, wyszło coś bardziej pilnego, designer stwierdził że coś nie ma sensu albo ma słaby ux, ktoś znalazł gotowe albo płatne rozwiązanie (i trzeba rozważyć build vs buy) masa jest powodów.

I teraz jak ktoś słyszy, że "designer w połowie robienia taska zauważył słaby ux", to mogą mu się zapalić dwie lampki:

  • Lampka jedna: To znaczy że to powinno być wykryte wcześniej! Programista nie powinien zacząć robić zadania, zanim designer tego nie przeklepie. Noi bam, idziemy do waterfalla.
  • Lampka druga: To wystarczy zareagować na to, i jakoś to poprawić. Ostatnia zmiana była bardzo mała, więc nie ma problemu żeby ją wyrzucić do kosza i zacząć od nowa. We're agile.
somekind napisał(a):

Jak często zachodzi potrzeba reagowania na nie?

Ciężko powiedzieć. Czasem nie trzeba przez miesiąc dwa, czasem codziennie. Dlatego warto wprowadzać jak najmniejsze zmiany.

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0
Riddle napisał(a):

No np klient zmienił zdanie co do jakiejś funkcjonalności, wpadł nowy case o którym nie pomyślał, wpadł inny pomysł jak coś rozwiązać,

No i jeśli jest to mała rzecz, to się implementuje. Jeśli coś większego, to trzeba zaplanować dorobienie tego w przyszłości.
Co tu nie jest agile?

wpadł jakiś blocker, wpadło jakieś nowe info, wyszła jakaś trudność w implementacji,

Blocker czy trudność w implementacji to akurat nie są zmiany, i to są rzeczy, które nie mają najmniejszego związku ze sposobem prowadzenia projektu.

klient po przemyśleniu stwierdził że funkcjonalność jednak nie ma sensu (albo jest redundantna z inną istniejącą),

No to brzmi na plus dla przewidywalności, bo jeśli wypada cały ficzer z zakresu produktu, to na pewno nie będzie obsuwy z jego dostarczeniem. :)

klient po namyśle stwierdził że to nie jest priorytetowe, wyszło coś bardziej pilnego

A więc trzeba robić cos bardziej pilnego, nie widzę tu problemu.

ktoś znalazł gotowe albo płatne rozwiązanie (i trzeba rozważyć build vs buy) masa jest powodów.

No to chyba znaczy jednak, że ktoś dał d**y z analizą. Pytanie co teraz - bo jeśli zostajemy przy własnym rozwiązaniu, to nic się nie zmienia. Jeśli wybieramy "gotowe", które będzie szybsze w zaimplementowaniu/dostosowaniu, to zyskujemy na przewidywalności.

Ciężko powiedzieć. Czasem nie trzeba przez miesiąc dwa, czasem codziennie. Dlatego warto wprowadzać jak najmniejsze zmiany.

No to ciekawe, bo z tej listy rzeczy, typu biznes nagle jednak zmienia się priorytet, to mi się zdarzyło może z raz w roku. Gdyby zdarzało się częściej, to bym miał silne wrażenie, że ludzie po stronie biznesu, kompletnie nie wiedzą, co robią.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10230
0
somekind napisał(a):
Riddle napisał(a):

No np klient zmienił zdanie co do jakiejś funkcjonalności, wpadł nowy case o którym nie pomyślał, wpadł inny pomysł jak coś rozwiązać,

No i jeśli jest to mała rzecz, to się implementuje. Jeśli coś większego, to trzeba zaplanować dorobienie tego w przyszłości.
Co tu nie jest agile?

Wracając do postu od którego się zaczęło:

somekind napisał(a):
Riddle napisał(a):

Ale z tego co pamiętam, to jednym z filarów SAFe jest "predictibility". I jeśli moja dedukcja działa dobrze to nie można można mieć jednocześnie predictibility i reagowania na zmiany. Jeśli reagujesz na zmiany, to siłą rzeczy to musi być unpredictable.

Zmiany... ale które?

Odpowiem inaczej - moim zdaniem jeśli chcesz być agile, to taka cecha jak predictibility nic nie wnosi - nie ma sensu starać się do niej dążyć. Nie opłaca się robić planu na x tygodni w przód, bo:

  • po pierwsze, on nic nie daje wartościowego
  • a po drugie, przeszkadza w reagowaniu na zmiany

Dużo lepszą strategią jest wykonywać aktualnie priorytetowe zadanie, i mieć z tyłu głowy: "nie wiem jaki będzie kolejny task".

Widzę to trochę jak gra w szachy. Planujesz sobie 3 ruchy do przodu - nagle przeciwnik robi ruch którego się nie spodziewałeś - co robisz? Idziesz z trzema zaplanowanymi ruchami, czy robisz coś innego, bo teraz masz nowe informacje? Lepszym podejście imo jest popatrzeć teraz na planszę, i zastanowić się jaki ruch teraz jest najlepszy, a kolejny wybrać dopiero jak zobaczysz jaki ruch przeciwnik zrobi.

Dokładnie tak samo jest z agile, zamiast planować 3 taski do przodu, lepiej zrobić jeden, pokazać klientowi, zebrać informacje od niego i wtedy wybrać kolejny, jak już się dowiesz co user o tym myśli, i zbierzesz wszystkie pozostałe infa (te o których pisałem w poście wyżej).

Oczywiście można sobie posortować backlog, po priorytetach i traktować go jak "aktualny snapshot", typu "zakładając że klient nie zmieni zdania i nie wyjdą żadne nowe informacje, to taski zrobię w tej kolejności". Tylko to zalożenie "jeśli klient nie zmieni zdania i nie wyjdą nowe informacje" jest bardzo fragile, bo klient prawie zawsze gdzieś zmieni zdanie albo wyjdzie jakieś nowe info. Samo programowanie jakiegoś systemu i nauka nowych rzeczy to są nowe informacje, które mogą wpłynąć na kolejność zadań i scope.

Także można mieć "predicibility" w takim sensie ze backlog to jest aktualny scope; ale nie można mieć predictibility w takim sensie żeby powiedzieć że ten scope się za godzinę nie zmieni.


somekind napisał(a):
Riddle napisał(a):

wpadł jakiś blocker, wpadło jakieś nowe info, wyszła jakaś trudność w implementacji,

Blocker czy trudność w implementacji to akurat nie są zmiany, i to są rzeczy, które nie mają najmniejszego związku ze sposobem prowadzenia projektu.

Jeśli klient się dowie że jest jakiś blocker, to powinien móc zdepriorytezować task, jeśli tak uzna.

somekind napisał(a):
Riddle napisał(a):

ktoś znalazł gotowe albo płatne rozwiązanie (i trzeba rozważyć build vs buy) masa jest powodów.

No to chyba znaczy jednak, że ktoś dał d**y z analizą. Pytanie co teraz - bo jeśli zostajemy przy własnym rozwiązaniu, to nic się nie zmienia. Jeśli wybieramy "gotowe", które będzie szybsze w zaimplementowaniu/dostosowaniu, to zyskujemy na przewidywalności.

Tylko że reagowanie na zmiany jest lepszą strategią do wytwarzania oprogramowania, niż wcześniejsze analizy.

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
1
Riddle napisał(a):

Odpowiem inaczej - moim zdaniem jeśli chcesz być agile, to taka cecha jak predictibility nic nie wnosi - nie ma sensu starać się do niej dążyć. Nie opłaca się robić planu na x tygodni w przód, bo:

  • po pierwsze, on nic nie daje wartościowego
  • a po drugie, przeszkadza w reagowaniu na zmiany

Jak pisałem - nie przeszkadza w niczym, a już na pewno nie w reagowaniu na zmiany. Jeśli klient chce zmian, to jest dostanie.
Jeśli zaś nie będzie chciał, to biznes mniej wie, kiedy co dostanie. Myślę, że biznes lubi takie rzeczy wiedzieć.

Dużo lepszą strategią jest wykonywać aktualnie priorytetowe zadanie, i mieć z tyłu głowy: "nie wiem jaki będzie kolejny task".

No to jest być może super podejście, jeśli pracuje się samodzielnie. W większej grupie osób, aktualnie priorytetowych zadań można wykonywać wiele jednocześnie.
A jeśli nie wiadomo, co czeka w przyszłości, to można podjąć strasznie głupie decyzje odnośnie obecnie implementowanego zadania pod względem jego projektu czy doboru technologii, itp.

Widzę to trochę jak gra w szachy. Planujesz sobie 3 ruchy do przodu - nagle przeciwnik robi ruch którego się nie spodziewałeś - co robisz? Idziesz z trzema zaplanowanymi ruchami, czy robisz coś innego, bo teraz masz nowe informacje? Lepszym podejście imo jest popatrzeć teraz na planszę, i zastanowić się jaki ruch teraz jest najlepszy, a kolejny wybrać dopiero jak zobaczysz jaki ruch przeciwnik zrobi.

No w szachach brak przemyślenia n kombinacji po m ruchów do przodu to strategia gwarantowanej przegranej.

I w tworzeniu softu też nie jest lepiej działać w ten sposób. W większości przypadków nie ma zmian w planie, więc można zgodnie z nim podążać. W przypadku zmiany wymagań po prostu się na nie reaguje - zaprzestaje wykonywania zgodnie z obecną specyfikacją i opracowuje nową. Co tu nie jest agile?

Dokładnie tak samo jest z agile, zamiast planować 3 taski do przodu, lepiej zrobić jeden, pokazać klientowi, zebrać informacje od niego i wtedy wybrać kolejny, jak już się dowiesz co user o tym myśli, i zbierzesz wszystkie pozostałe infa (te o których pisałem w poście wyżej).

Czyli po każdym wykonanym zadaniu jest przestój, bo czeka się na info od klienta? Przecież żeby klient dał jakieś info, musi tego softu poużywać - to są dni, tygodnie, a czasem i miesiące zanim coś sensownego będzie w stanie powiedzieć.

Dla mnie to totalna abstrakcja, bo pracuję w zespole pięcioosobowym, a w ciągu 2 tygodni robimy kilka-kilkanaście zadań. W ciągu dwóch miesięcy tych zadań jest kilkadziesiąt, nawet jeśli kilka się zmieni, to jest to tak marginalny wpływ na cały plan, że spokojnie można pominąć.

Także można mieć "predicibility" w takim sensie ze backlog to jest aktualny scope; ale nie można mieć predictibility w takim sensie żeby powiedzieć że ten scope się za godzinę nie zmieni.

Za godzinę nie, bo zmiana już zaprojektowanego ficzera wymaga zebrania tylu osób, że w godzinę się ich nie uda powiadomić.
Zmienić co najwyżej można priorytety już zaprojektowanych zadań, i poprzesuwać je w ramach najbliższego planu. No i można przejrzeć obecny dług technologiczny i wywalić rzeczy, które są już nieaktualne.

Jeśli klient się dowie że jest jakiś blocker, to powinien móc zdepriorytezować task, jeśli tak uzna.

Nikt nie broni.
Zresztą, jeśli jest blocker, to przecież nikt nie czeka aktywnie na jego rozwiązanie, po prostu bierze się następną rzeczy z listy.

Tylko że reagowanie na zmiany jest lepszą strategią do wytwarzania oprogramowania, niż wcześniejsze analizy.

Sugerujesz brak analiz?
W sensie, po co wymagania, niech programiści sami je sobie wymyślą?
Jak w takim podejściu wygląda integracja z jakimkolwiek 3rd party? Skoro nie było czasu na przeanalizowanie, to pewnie kończy się nadgodzinami spędzonymi na rozpoznawaniu bojem w trakcie robienia zadania z narzuconym deadlinem... którego i tak się nie spełni.
No i najważniejsze, w takim podejściu nie ma szans na to, że nagle okaże się, że istnieje gotowe rozwiązanie, bo aby tego się dowiedzieć trzeba cokolwiek przeanalizować. A skoro nie analizujemy, to sami piszemy wszystko. Ewentualnie korzystamy z kilku bibliotek, które poznaliśmy w poprzedniej pracy.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10230
0
somekind napisał(a):
Riddle napisał(a):

Odpowiem inaczej - moim zdaniem jeśli chcesz być agile, to taka cecha jak predictibility nic nie wnosi - nie ma sensu starać się do niej dążyć. Nie opłaca się robić planu na x tygodni w przód, bo:

  • po pierwsze, on nic nie daje wartościowego
  • a po drugie, przeszkadza w reagowaniu na zmiany

Jak pisałem - nie przeszkadza w niczym, a już na pewno nie w reagowaniu na zmiany. Jeśli klient chce zmian, to jest dostanie.
Jeśli zaś nie będzie chciał, to biznes mniej wie, kiedy co dostanie. Myślę, że biznes lubi takie rzeczy wiedzieć.

Powtarzam już, bo widzę że się nie rozumiemy.

Biznes może sobie planować co tylko chce - nie ma z tym problemu. Mi chodzi o to że nie powinniśmy wytwarzać oprogramowania z myślą o tym czy coś jest zaplanowane czy nie.

somekind napisał(a):
Riddle napisał(a):

Dużo lepszą strategią jest wykonywać aktualnie priorytetowe zadanie, i mieć z tyłu głowy: "nie wiem jaki będzie kolejny task".

No to jest być może super podejście, jeśli pracuje się samodzielnie. W większej grupie osób, aktualnie priorytetowych zadań można wykonywać wiele jednocześnie.

Na więcej osób też to się przekłąda.

Może powinienem powiedzieć "każdy z członków zespołu robi aktualnie najbardziej priorytetowe zadanie (czyli jeśli mamy 5 osób, to te 5 osób robi 5 najbardziej priorytetowych zadań), mają w głowie nie wiem jaki będzie kolejny task". Jak najbardziej tak. Chodzi o to żeby się skupić na tym co się aktualnie robi, i nie próbować przewidywać co będzie potem - nie ma ku temu potrzeby (z punktu widzenia wytwarzania oprogramowania).

somekind napisał(a):
Riddle napisał(a):

A jeśli nie wiadomo, co czeka w przyszłości, to można podjąć strasznie głupie decyzje odnośnie obecnie implementowanego zadania pod względem jego projektu czy doboru technologii, itp.

Tak! To jest bardzo ważny element, poruszyłeś bardzo ważny punkt - i on również jest zaadresowany. Jak - nie mając wiedzy co będzie później - podjąć decyzje?

Odpowiedź na to brzmi: staraj się nie podejmować decyzji - a raczej, staraj się odroczyć ważne decyzje najpóźniej jak się da, zostawiaj sobie otwarte furtki żeby móc zmienić design, pisz testy które są luźno-dowiązane żeby móc w razie czego szybko je zmienić, stwórz kod w taki sposób, że nawet jeśli podejmiesz głupią decyzję - to żeby jej konsekwencje były bardzo małe lub żadne - kod powinien być na tyle elastyczny, żeby dało się łatwo zmienić tą decyzję, zwłaszcza jeśli zostanie podjęta później niż wcześniej.

To jest niestety konieczność, bo jak bardzo byśmy nie chcieli wiedzieć "co będzie później", to niestety nie wiemy. Na tym właśnie polega cały agile - na zrozumieniu że "nie wiem co będzie potem". Wszystkie metodyki dookoła agile, są po to żeby radzić sobie z wytwarzaniem oprogramowania w świetle tego że nie wiesz jak to będzie wyglądało później. To jest całe sedno.

somekind napisał(a):
Riddle napisał(a):

Widzę to trochę jak gra w szachy. Planujesz sobie 3 ruchy do przodu - nagle przeciwnik robi ruch którego się nie spodziewałeś - co robisz? Idziesz z trzema zaplanowanymi ruchami, czy robisz coś innego, bo teraz masz nowe informacje? Lepszym podejście imo jest popatrzeć teraz na planszę, i zastanowić się jaki ruch teraz jest najlepszy, a kolejny wybrać dopiero jak zobaczysz jaki ruch przeciwnik zrobi.

No w szachach brak przemyślenia n kombinacji po m ruchów do przodu to strategia gwarantowanej przegranej.

I w tworzeniu softu też nie jest lepiej działać w ten sposób. W większości przypadków nie ma zmian w planie, więc można zgodnie z nim podążać. W przypadku zmiany wymagań po prostu się na nie reaguje - zaprzestaje wykonywania zgodnie z obecną specyfikacją i opracowuje nową. Co tu nie jest agile?

Oczywiście - planując ruch myślisz o ruchach do przodu, jasne! Analizujesz, który ruch teraz zrobić, biorąc pod uwagę możliwe przyszłe ruchy, jak najbardziej, można o tym myśleć. Można przeanalizować nawet 10 ruchów do przodu.

Ale kiedy przeciwnik zrobi ruch, to wszystkie poprzednie analizy mogą się okazać już nie aktualne, bo ten ruch je zinwalidował, więc musisz ponownie zacząć kminić co zrobić na podstawie aktualnej planszy. W momencie w którym się znajdziesz w sytuacji w której przeciwnik zrobił ruch - jakie znaczenie ma to że miałeś wcześniej plan? Nie ma znaczenia, znaczenie ma tylko aktualna plansza i aktualny plan.

W skrócie to co chcę powiedzieć - możesz sobie planować rzeczy do przodu, oczywiście. Ale nie powinieneś zakładać że wiesz, nie powinieneś sądzić "mam taki plan, więc to się stanie", powinieneś ciągle zakładać że te plany się mogą zmienić, i nie powinieneś pracować przez ich pryzmat. Najlepiej byłoby wytwarzać oprogramowanie zakładając że jesteś w błędzie. Tzn. na tym przynajmniej polega Agile.

somekind napisał(a):
Riddle napisał(a):

Dokładnie tak samo jest z agile, zamiast planować 3 taski do przodu, lepiej zrobić jeden, pokazać klientowi, zebrać informacje od niego i wtedy wybrać kolejny, jak już się dowiesz co user o tym myśli, i zbierzesz wszystkie pozostałe infa (te o których pisałem w poście wyżej).

Czyli po każdym wykonanym zadaniu jest przestój, bo czeka się na info od klienta? Przecież żeby klient dał jakieś info, musi tego softu poużywać - to są dni, tygodnie, a czasem i miesiące zanim coś sensownego będzie w stanie powiedzieć.

To już jest mniej dobry argument - nic nie mówiłem o żadnych przestojach. Oczywiście tak to nie powinno wyglądać, nie powinno być żadnych przestojów, żadnego czekania na info od klienta, nie powinno być nic co Cię spowalnia.

Rozumiem, że masz klienta który daje info powiedzmy po 5-10 dniach. Jeśli chcesz być agile, to powinno to wyglądać tak:

  1. Bierzesz task, który jest mały, jego wykonanie powinno zająć kilka godzin, koniecznie mniej niż dzień
    • Jeśli task zajmie tydzień, to należy go rozbić na mniejsze
  2. Robisz task w kilka godzin (najlepiej dostając review co kilkadziesią minut, albo w Pair Programming, albo siedząc obok kogoś, w najgorszym razie raz na koniec zadania)
  3. Testy przechodzą, najlepiej stosować continuous integration, przetestować wszystko, wrzucić na server testy, przeklikać czy działa, i wypuścić go najlepiej na produkcję, a jak nie to na środowisko UAT bliskie produkcji, tak żeby klient miał możliwość przetestować je, jeśli będzie chciał.
  4. Nie czekasz na klienta.
  5. Zaczynasz kolejne zadanie od (od punktu 1), które teraz ma najwyższy priorytet. Jak je skończysz to potem kolejne, i kolejne krokami 1.-4.
  6. W czasie tych 5-10 dni klient sobie może wejść i przeklikać.
  7. Klient wchodzi, klika, zauważa jakąś rzecz.
  8. Klient może teraz wejść w backlog i pozamieniać priorytety jak mu się tylko podoba. Klient widzi które taski są w "in progress", i jeśli chce, to nadal może zmienić priorytet tych zadań.
  9. Jeśli tak się stanie, i czyjś task straci priorytet, to taka osoba powinna przestać je robić, i zacząć robić ten który teraz jest aktualnie najwyżej. Jeśli 5 osób pracuje, i np 3 z nich robią zadania które nadal są top 5 to one je robią, a te dwie pozostałe których zadania spadły w priorytetach powinny przestać je robić, i zacząć robić pozostałe 2 z tych top 5.

To są oczywiście kroki dla programistów, nie dla klienta. Nigdzie w liście tych kroków nie potrzebujesz "przewidzieć" które zadanie będzie następne.

somekind napisał(a):
Riddle napisał(a):

Także można mieć "predicibility" w takim sensie ze backlog to jest aktualny scope; ale nie można mieć predictibility w takim sensie żeby powiedzieć że ten scope się za godzinę nie zmieni.

Za godzinę nie, bo zmiana już zaprojektowanego ficzera wymaga zebrania tylu osób, że w godzinę się ich nie uda powiadomić.

To dla mnie jest sygnał że ten "feature" to jest duży byt, którego wykonanie trwa długo - i mówiąć wykonanie mam na mysli analizowanie, designowanie, programowanie, testowanie, etc. Tak wnioskuję na podstawie tego, że mówisz że dużo osób musi przybić pieczątkę.

No to moim zdaniem, jak to czytam, to raczej to nie może być Agile :/ To jest jakaś kopia agile. Nie jesteś w stanie być agile, jeśli zadania są tak duże, po prostu.

Siłą rzeczy - zbyt duża wielkość tasków nie pozwala być agile.

somekind napisał(a):
Riddle napisał(a):

Tylko że reagowanie na zmiany jest lepszą strategią do wytwarzania oprogramowania, niż wcześniejsze analizy.

Sugerujesz brak analiz?
W sensie, po co wymagania, niech programiści sami je sobie wymyślą?
Jak w takim podejściu wygląda integracja z jakimkolwiek 3rd party? Skoro nie było czasu na przeanalizowanie, to pewnie kończy się nadgodzinami spędzonymi na rozpoznawaniu bojem w trakcie robienia zadania z narzuconym deadlinem... którego i tak się nie spełni.
No i najważniejsze, w takim podejściu nie ma szans na to, że nagle okaże się, że istnieje gotowe rozwiązanie, bo aby tego się dowiedzieć trzeba cokolwiek przeanalizować. A skoro nie analizujemy, to sami piszemy wszystko. Ewentualnie korzystamy z kilku bibliotek, które poznaliśmy w poprzedniej pracy.

Znowu - poruszasz bardzo ważne tematy! I bardzo dobre argumenty.

Odpowiem po kolei:

somekind napisał(a):

Sugerujesz brak analiz?

Analizy powinny być, ale tylko i wyłącznie w momencie rozpoczęcia zadania - nie przed. Dokładniej mówiąc, w momencie w którym wykonanie tego 3rd party będzie najbardziej priorytetowym zadaniem, wtedy siadasz i to robisz, i wtedy, jeśli potrzeba rozpoczynasz analizę tego - chyba że ten task straci priorytet, wtedy musisz przestać i wziąć coś bardziej priorytetowego.

somekind napisał(a):

W sensie, po co wymagania, niech programiści sami je sobie wymyślą?

Jeśli chodzi o wymagania użytkowe - jak coś powinno działać, to ustala je klient/biznes, nie programiści. Klient mówi "what it does", programiści mówią "how it does it".

somekind napisał(a):

Jak w takim podejściu wygląda integracja z jakimkolwiek 3rd party? Skoro nie było czasu na przeanalizowanie, to pewnie kończy się nadgodzinami spędzonymi na rozpoznawaniu bojem w trakcie robienia zadania z narzuconym deadlinem... którego i tak się nie spełni.

Żadnych nadgodzin, wszyscy pracują tyle ile powinni. Żadnego deadline'u ma nie być, programista po prostu bierze task i robi go aż skończy.

Jak wygląda integracja z third party: no wbrew pozorom bardzo prosto: Klient chce zrobić pełną integrację, której napisanie powinno zająć 3 miesiące. Co się robi w Agile? Wykminiasz najprostszą, najmniejszą rzecz jaką jesteś w stanie zrobić - powiedzmy że samą tylko autoryzację, która zwraca true jak się uda, false jak się nie uda (nawet bez refresh tokena). Zaczynasz to robić, i jak skończysz pokazujesz klientowi. Klient potem decyduje co dalej z tym zrobić. Wrzucasz takie coś na jakiś serwer testowy, tak żeby klient mógł to zobaczyć, musisz jakoś umożliwić klientowi zobaczenie tego, najlepiej na serwerze bliskim produkcji. Klient może to zobaczyć, może nie. Niezależnie od tego czy zobaczy czy nie, możesz zacząć od razu nowe zadanie - np tym razem, oprócz autoryzacji, dodaj jeszcze refresh token, i znowu wdróż to na serwer bliski produkcji. Powinno to być proste, bo powinien być deployment pipeline który pozwala na szybkie wrzucanie zmian. Jeśli Twój deployment pipeline jest powolny, np release takiego feature'a trwa kilka godzin, to niestety :/ taki powolny pipeline uniemożliwia Ci bycie agile :/ Nie możesz być agile, jeśli nie możesz szybko wdrożyć swoich zmian żeby pokazać klientowi. Właściwie to integracja z takim third-party wygląda dokładnie tak samo jak opisałem kroki 1.-4. wyżej.

Jak rozumiem, zakładasz (poprawnie) że integracja 3rd party będzie długa i kosztowna - i to jest prawda. Ale myślę tez że zakładasz, że jak klient to zleci, to trzeba to wykonać "w jednym kroku"/"wszystko na raz" - i to jest nie prawda (przynajmniej nie w agile). Powinieneś robić to małymi krokami, i powinieneś pokazać klientowi małe kroki, nawet jeśli to nie jest "używalne".

Użyłeś określenia "rozpoznwanie bojem" - pretty much tak. Nie widzę nic złego w takim podejściu. Wszyscy jesteśmy profesjonalistami, wiemy jak wykonać swoją pracę, wiemy jak podejść do takiej integracji, i wiemy jak ją zrobić dobrze, wiemy jakie kryteria musi spełnić dobra integracja, wiemy kiedy jest źle zrobiona. Nikt Ci nie każe zrobić 3 miesięcy pracy "na czuja", to jest właśnie anty-agile. Rozbij tą 3 miesięczną integracje na bardzo małe kroki, zacznij od czegoś co da się zrobić w jednym dniu, a nadal będzie jakimś krokiem w dobrą stronę - np od autoryzacji i żadnego innego faktycznego feature'a.

Większość ludzi jak słyszy takie podejście; "Po co mam pokazywać klientowi samą autoryzację, skoro i tak będę musiał zrobić potem X, Y, Z". Albo pomyślą "Klient mnie wyśmieje że jeszcze nie jest skończone", albo "Klient chciał całą integrację, więć nie pokazę mu nieskończonego zadania". Takie podejście jest nie-agile'owe. Musisz pokazać klientowi to co się udało zrobić, na tym polega praca w małych krokach. Musisz umożliwić klientowi zobaczenie aktualnej planszy szachowej - w tym wypadku to że sama autoryzacja zwraca true/false i nic więcej, musisz tą autoryzację wrzucić na maszynę bliską produkcji, przepuszczać małe kroki faktycznym procesem zanim poświęcisz 3 miesiące na jego development. Tutaj właśnie jest ten problem z "predicitiblity". Ludziom się wydaje, że skoro mają plan na całą taką integrację 3 miesięczną, to nie muszą pokazywać progressu z niej klientowi dopóki nie skończą. I to jest błąd (IMO), bo częściej niż nie, można się pomylić, częściej niż nie wyjdzie coś nowego, czego nie przewidziałeś. Załóż, że nie wiesz, załóż, że plan się zmieni. Zrób najmniejszy, najbardziej prymitywny kawałek, i pokaż klientowi, zbierz feedback - jeśli nic nie wyjdzie nowego - super, wygrałeś, możesz jechać dalej. Jeśli klient da Ci feedback - też super, masz nowe informacje, które pomogą Ci w następnym kroku.

Miang
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1801
0
Riddle napisał(a):

Może powinienem powiedzieć "każdy z członków zespołu robi aktualnie najbardziej priorytetowe zadanie (czyli jeśli mamy 5 osób, to te 5 osób robi 5 najbardziej priorytetowych zadań), mają w głowie nie wiem jaki będzie kolejny task". Jak najbardziej tak. Chodzi o to żeby się skupić na tym co się aktualnie robi, i nie próbować przewidywać co będzie potem - nie ma ku temu potrzeby (z punktu widzenia wytwarzania oprogramowania).

agile manifesto
" there is value in the items on the right"
czyli nie odrzucamy ich kompletnie

Odpowiedź na to brzmi: staraj się nie podejmować decyzji - a raczej, staraj się odroczyć ważne decyzje najpóźniej jak się da, zostawiaj sobie otwarte furtki żeby móc zmienić design, pisz testy które są luźno-dowiązane żeby móc w razie czego szybko je zmienić, stwórz kod w taki sposób, że nawet jeśli podejmiesz głupią decyzję - to żeby jej konsekwencje były bardzo małe lub żadne - kod powinien być na tyle elastyczny, żeby dało się łatwo zmienić tą decyzję, zwłaszcza jeśli zostanie podjęta później niż wcześniej.

ano właśnie to , podejmować decyzji i być odpowiedzialnym nikt nie chce, lepiej zrzucić to na tzw. biznes, i potem zrzucić na nich nasze błedy (ironia)

To jest niestety konieczność, bo jak bardzo byśmy nie chcieli wiedzieć "co będzie później", to niestety nie wiemy. Na tym właśnie polega cały agile - na zrozumieniu że "nie wiem co będzie potem". Wszystkie metodyki dookoła agile, są po to żeby radzić sobie z wytwarzaniem oprogramowania w świetle tego że nie wiesz jak to będzie wyglądało później. To jest całe sedno.

metodyki które zaprzeczają samej idei agile

Ale kiedy przeciwnik zrobi ruch, to wszystkie poprzednie analizy mogą się okazać już nie aktualne, bo ten ruch je zinwalidował, więc musisz ponownie zacząć kminić co zrobić na podstawie aktualnej planszy. W momencie w którym się znajdziesz w sytuacji w której przeciwnik zrobił ruch - jakie znaczenie ma to że miałeś wcześniej plan? Nie ma znaczenia, znaczenie ma tylko aktualna plansza i aktualny plan.

W skrócie to co chcę powiedzieć - możesz sobie planować rzeczy do przodu, oczywiście. Ale nie powinieneś zakładać że wiesz, nie powinieneś sądzić "mam taki plan, więc to się stanie", powinieneś ciągle zakładać że te plany się mogą zmienić, i nie powinieneś pracować przez ich pryzmat. Najlepiej byłoby wytwarzać oprogramowanie zakładając że jesteś w błędzie. Tzn. na tym przynajmniej polega Agile.

tylko tym ruchem w szachach którego się nie spodziewasz może być co najwyżej "solniczka na E6" inne są do przewidzenia

somekind napisał(a):

Jak w takim podejściu wygląda integracja z jakimkolwiek 3rd party? Skoro nie było czasu na przeanalizowanie, to pewnie kończy się nadgodzinami spędzonymi na rozpoznawaniu bojem w trakcie robienia zadania z narzuconym deadlinem... którego i tak się nie spełni.

Żadnych nadgodzin, wszyscy pracują tyle ile powinni. Żadnego deadline'u ma nie być, programista po prostu bierze task i robi go aż skończy.

Jak wygląda integracja z third party: no wbrew pozorom bardzo prosto: Klient chce zrobić pełną integrację, której napisanie powinno zająć 3 miesiące. Co się robi w Agile? Wykminiasz najprostszą, najmniejszą rzecz jaką jesteś w stanie zrobić - powiedzmy że samą tylko autoryzację, która zwraca true jak się uda, false jak się nie uda. Zaczynasz to robić, i jak skończysz pokazujesz klientowi. Klient potem decyduje co dalej z tym zrobić.

Błędnym przekonaniem, jak rozumiem, jest to że zakładasz (poprawnie) że integracja 3rd party będzie długa i kosztowna - i to jest prawda. Ale myslę tez że zakładasz, że jak klient to zleci, to trzeba to wykonać "w jednym kroku" - i to jest nie prawda (przynajmniej nie w agile).

jak klient to zlecił to marketoid powinien tak zawrzeć umowę żeby klient zapłacić niezależnie od tego czy zmieniał potem zdanie

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
2
Riddle napisał(a):

Biznes może sobie planować co tylko chce - nie ma z tym problemu. Mi chodzi o to że nie powinniśmy wytwarzać oprogramowania z myślą o tym czy coś jest zaplanowane czy nie.

Czyli nigdy nie wiemy co i po co robimy... ja bym nie dał rady, to trzeba wyższe stany świadomości osiągać, żeby w takim chaosie wytrzymać.

Chodzi o to żeby się skupić na tym co się aktualnie robi, i nie próbować przewidywać co będzie potem - nie ma ku temu potrzeby (z punktu widzenia wytwarzania oprogramowania).

Jak najbardziej jest potrzeba. Bo jeśli np. robię coś w jakimś starym API, o którym wiem, że jest przewidziane do wycofania za 3 miesiące, to nie będę się silił na jakąś refaktoryzację przy okazji. Jeśli implementuję nowy ficzer w jakiejś bibliotece, o której wiem w jakich API, i w jaki sposób jest używana, to implementuję go tak, aby zapewnić jak najłatwiejszą integrację z tymi API. Itd., itp.

Odpowiedź na to brzmi: staraj się nie podejmować decyzji - a raczej, staraj się odroczyć ważne decyzje najpóźniej jak się da, zostawiaj sobie otwarte furtki żeby móc zmienić design, pisz testy które są luźno-dowiązane żeby móc w razie czego szybko je zmienić, stwórz kod w taki sposób, że nawet jeśli podejmiesz głupią decyzję - to żeby jej konsekwencje były bardzo małe lub żadne - kod powinien być na tyle elastyczny, żeby dało się łatwo zmienić tą decyzję, zwłaszcza jeśli zostanie podjęta później niż wcześniej.

Ale my mówimy o momencie, w którym już jesteśmy najpóźniej jak się da w kontekście podejmowania decyzji.
Jeżeli kod ma np. zapisywać konkretne dane do konkretnej bazy, to tu nie ma czego odraczać. I tak jest z każdym kodem, który ma wykonywać konkretny cel biznesowy.

To jest niestety konieczność, bo jak bardzo byśmy nie chcieli wiedzieć "co będzie później", to niestety nie wiemy. Na tym właśnie polega cały agile - na zrozumieniu że "nie wiem co będzie potem". Wszystkie metodyki dookoła agile, są po to żeby radzić sobie z wytwarzaniem oprogramowania w świetle tego że nie wiesz jak to będzie wyglądało później. To jest całe sedno.

To ja bym prosił o linka ze źródłem tej definicji agile.
Bo zawsze słyszałem o szybkim reagowaniu na zmiany, o współpracy międzyzespołowej, szybkim feedbacku - ale o tym, że agile polega na błądzeniu we mgle słyszę pierwszy raz.

  1. Zaczynasz kolejne zadanie od (od punktu 1), które teraz ma najwyższy priorytet. Jak je skończysz to potem kolejne, i kolejne krokami 1.-4.

Dobrze, tylko w ten sposób zanim dostanę info zwrotne od klienta mogę tak zaimplementować np. 10 kolejnych tasków, zanim klient zobaczy wynik pierwszego i stwierdzi, że on jednak w ogóle tego nie potrzebuje. Czyli zmarnowałem bardzo dużo pracy, bo zamiast się dowiedzieć i zaplanować pracę, robiłem taski na pałę.

Ogólnie to zarządzanie priorytetami kilkugodzinnych tasków przez klienta brzmi jak jakiś cholerny mikromanagement. Albo już nawet pikomanagement.
Klient może priorytetyzować konkrent ficzery (czyli to, czego chce klient), nie zadania (czyli to, jak programiści dzielą sobie pracę).

To dla mnie jest sygnał że ten "feature" to jest duży byt, którego wykonanie trwa długo - i mówiąć wykonanie mam na mysli analizowanie, designowanie, programowanie, testowanie, etc. Tak wnioskuję na podstawie tego, że mówisz że dużo osób musi przybić pieczątkę.

No mówimy o tym, co jest ważne dla klienta. Np. zamiast wchodzić na rynek sprzedaży warzyw w Nowej Zelandii, chcemy sprzedawać dżinsy w Indiach.
Trzeba w to zamieszać sporo ludzi od biznesu, architektów, liderów zespołów od rozliczeń, walut, koszyka, logistyki, dostawy, i wielu innych.

No to moim zdaniem, jak to czytam, to raczej to nie może być Agile :/ To jest jakaś kopia agile. Nie jesteś w stanie być agile, jeśli zadania są tak duże, po prostu.

W takim razie prawdopodobnie żaden biznes nie jest agile.

Siłą rzeczy - zbyt duża wielkość tasków nie pozwala być agile.

Taski mogą być dowolnie małe, biznes czy klient po prostu nie operuje na tym poziomie.

Analizy powinny być, ale tylko i wyłącznie w momencie rozpoczęcia zadania - nie przed. Dokładniej mówiąc, w momencie w którym wykonanie tego 3rd party będzie najbardziej priorytetowym zadaniem, wtedy siadasz i to robisz, i wtedy, jeśli potrzeba rozpoczynasz analizę tego - chyba że ten task straci priorytet, wtedy musisz przestać i wziąć coś bardziej priorytetowego.

Świetnie, tylko klient chce wiedzieć ile czasu zajmie wytworzenie API, którego jedna z funkcji wymaga integracji z tym zewnętrznym API. Na jakiej zasadzie mam udzielić odpowiedzi, skoro nie znam tego zewnętrznego API?

Jeśli chodzi o wymagania użytkowe - jak coś powinno działać, to ustala je klient/biznes, nie programiści. Klient mówi "what it does", programiści mówią "how it does it".

Chodzi mi o wymagania odnośnie ficzerów, które mam zaimplementować. Jakie dane na wejściu, co na wyjściu, co się dzieje po drodze, gdzie logujemy, gdzie utrwalamy, z czym się integrujemy i w jaki sposób, itd, itp.
Mam sobie to wymyślać w trakcie robienia zadania? Skąd będę wiedział, czy skończyłem zadanie, skoro nie wiem, co miałem zrobić?

Większość ludzi jak słyszy takie podejście; "Po co mam pokazywać klientowi samą autoryzację, skoro i tak będę musiał zrobić potem X, Y, Z". Albo pomyślą "Klient mnie wyśmieje że jeszcze nie jest skończone", albo "Klient chciał całą integrację, więć nie pokazę mu nieskończonego zadania". Takie podejście jest nie-agile'owe. Musisz pokazać klientowi to co się udało zrobić, na tym polega praca w małych krokach. Musisz umożliwić klientowi zobaczenie aktualnej planszy szachowej - w tym wypadku to że sama autoryzacja zwraca true/false i nic więcej, musisz tą autoryzację wrzucić na maszynę bliską produkcji, przepuszczać małe kroki faktycznym procesem zanim poświęcisz 3 miesiące na jego development.

Bo klienta nie obchodzi jakieś false wyświetlone w Postmanie. Klient chce API, w którym konfiguruje sobie szablony wiadomości email, oraz workera, który czyta z kafki i na podstawie eventu wysyła zgodny z odpowiednim szablonem email do klienta.
Klient na podstawie jakiegoś false nie podejmie decyzji czy ten pomysł ma sens, będzie o tym wiedział dopiero, gdy zobaczy maile w skrzynce.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10230
0

@somekind Wiele rzeczy które opisałeś są prawdziwe, z wieloma się zgadzam, ale jest kilka rzeczy z którymi się gryzę.

Zacznę od najprostszych:

somekind napisał(a):
Riddle napisał(a):

No to moim zdaniem, jak to czytam, to raczej to nie może być Agile :/ To jest jakaś kopia agile. Nie jesteś w stanie być agile, jeśli zadania są tak duże, po prostu.

W takim razie prawdopodobnie żaden biznes nie jest agile.

No niestety tak :/ Mało która firma która claimuje że jest agile, faktycznie jest :/

To co większość firm robi, to po prostu zaczyna używać niektórych nazw, takich jak "sprint", "user story", "story point", "retro", etc. ale nie zmieniają procesów, więc nie mają żadnych korzyści, ergo nie są agile. Przykre.

somekind napisał(a):
Riddle napisał(a):

Chodzi o to żeby się skupić na tym co się aktualnie robi, i nie próbować przewidywać co będzie potem - nie ma ku temu potrzeby (z punktu widzenia wytwarzania oprogramowania).

Jak najbardziej jest potrzeba. Bo jeśli np. robię coś w jakimś starym API, o którym wiem, że jest przewidziane do wycofania za 3 miesiące, to nie będę się silił na jakąś refaktoryzację przy okazji. Jeśli implementuję nowy ficzer w jakiejś bibliotece, o której wiem w jakich API, i w jaki sposób jest używana, to implementuję go tak, aby zapewnić jak najłatwiejszą integrację z tymi API. Itd., itp.

Jak rozumiem - Twój argument brzmi: "chcę wiedzieć czy jakieś API ma być wycofane za jakiś czas, żeby wiedzieć czy mam go poprawiać".

Odpowiadam: jak najbardziej. Oczywiście, że możesz wiedzieć czy klient planuje usunięcie API czy nie, i jeśli dowiesz się że klient ma plan usunąć API, to jak najbardziej powinieneś wziąć to pod uwagę, podejmując decyzję, czy refaktorować to miejsce.

Zaznaczam: W agile chodzi o to żeby ufać ludziom. Ufać, również Tobie, jako programiście. To co powinieneś zrobić w takiej sytuacji:

  • Klient mówi ze za trzy miesiące planuje wycofać jakieś API
  • Ty akurat bierzesz zadanie które dotyka tego API
  • Zastanawiasz się czy naklepać go na szybko na odwal się, czy zrefaktorować je tak żeby było dobrze.
  • Tutaj wchodzi zaufanie do Ciebie jako programisty:
  • Powinieneś mieć w głowie takie dwie rzeczy:
    • Po pierwsze - wiesz że klient planuje usunięcie tego konkretnego API
    • Po drugie - zakładasz że ten plan może się uda, może nie (czyli faktycznie może to API zostanie usunięte, może nie).
  • I na podstawie tych dwóch rzeczy to Ty podejmujesz decyzję czy zrobić refaktor tego API czy nie:
    • Bierzesz pod uwagę:
      • Czas jaki musisz na to poświęcić
      • Ryzyko jakie to za sobą niesie
      • Potencjalny zyski jakie niesie ze sobą
      • Oraz oczywiście bierzesz pod uwage plan klienta na usunięcie tego API
      • Ale bierzesz też pod uwagę, że ten plan nie jest na 100%, że to może się udać, ale nie koniecznie. Sam musisz ocenić jak duże prawodpodobieństwo to niesie.
  • I na tej podstawie Ty podejmujesz decyzję czy zrobić refaktor czy nie. Oczywiście inni programiści też mogą się dołożyć do tej decyzji, ale nie klient. Klient jedyne co Ci może powiedzieć, to jak bardzo pewny jest usunięcia tego API, albo na 10%, na 50% albo na 100%. Tylko uwaga - nawet jak klient Ci powie że na 100% usuwamy coś za trzy miesiące, to nie daj się zwieść - nie koniecznie to musi to oznaczać.

I wtedy Ty, jako programista, kierując się swoją wiedzą, decydujesz czy zrobić ten refaktor czy nie. Możesz uznać że nie, i to jest w porządku. Tylko chodzi o to żeby kierować się tym, że ten "plan" nie jest pewiankiem.

To miałem na myśli mówiąc że predicibility nie jest potrzebne. To czego potrzebujemy to informacje, feedback, wiedzę (o tym że klient chce usunąć API, oraz kiedy planuje to zrobic), ale nie możemy ślepo wierzyć że skoro klient mówi że za 3 miesiące tak będzie, to znaczy że tak będzie. To miałem na myśli mówiąc że predicibility jest nie potrzebne. Faktycznie pewnym tego usunięcia możesz być w momencie w którym weźmiesz storkę na usunięcie go. Także zgadzam się że programiści muszą mieć informacje, muszą mieć insight, muszą wiedzieć co klient chce zrobić - ale kiedy ja mówiłem że "predictibility jest niepotrzebne", miałem na myśli że nie jest potrzebne programować TERAZ z myślą tylko i wyłącznie o tym że jest jakieś ustalenie o dacie.

  • Możesz programować z myślą o planach klienta (important)
  • Możesz programować z myślą o tym co klient by chciał (important)
  • Możesz programować z myślą, że jakaś rzecz zaraz będzie usunięta,
  • Ale raczej nie warto programować z myślą o jakieś ustalonej dacie - bo to nie działa po prostu.
somekind napisał(a):
Riddle napisał(a):
  1. Zaczynasz kolejne zadanie od (od punktu 1), które teraz ma najwyższy priorytet. Jak je skończysz to potem kolejne, i kolejne krokami 1.-4.

Dobrze, tylko w ten sposób zanim dostanę info zwrotne od klienta mogę tak zaimplementować np. 10 kolejnych tasków, zanim klient zobaczy wynik pierwszego i stwierdzi, że on jednak w ogóle tego nie potrzebuje. Czyli zmarnowałem bardzo dużo pracy, bo zamiast się dowiedzieć i zaplanować pracę, robiłem taski na pałę.

Okej, i to jest kolejna bardzo ważna rzecz na którą zwróciłeś uwagę.

Zgadzam się ze wstępem: Faktycznie, to jest bardzo ogromny problem, że robisz jakieś 10 tasków, i potem klient mówi że "nie o to mi chodziło". I wtedy zmarnowałeś bardzo dużo pracy. Tak, to jest prawda, i to jest bardzo duży problem.

I rozwiązania jakie to ma są takie:

  • Albo, możesz zrobić "analizę" próbują wydedukować które feature'y są potrzebne a które nie (tylko że takie coś działa gorzej, i wygląda jak waterfall)
  • Albo możesz zrobić małą rzecz, i (owszem) ryzykować że okaże się że jest niepotrzebna/zła/nie udana. I tutaj ludzie się boją tego ryzyka. Nie chcą marnować czasu na nieudany feature. Jaka jest na to rada? Bardzo prosta - trzeba robić małe kroki, tak małe że zajmą kilka godzin, maks jeden dzień. Wtedy, jeśli okaże się że robiłeś coś niepotrzebnego, to najwyżej stracisz te kilka godzin. Oczywiście wymaga to tego, żeby klient zerknął na aktualną zmiane.

Więc tak - Agile wymaga od klienta tego żeby patrzył na częste zmiany. Jeśli jest tak jak mówisz, że zrobiłeś 10 małch featuer'ów i klient nie raczy łaskawnie na nie popatrzeć, to niestety ale przez takiego klienta Agile jest utrudniony. To że klient nie patrzy często na aktualny stan, wydłuża feedback loop. A wiec ryzyko robienia czegoś, co się może okazać nieudane rośnie. Należy wtedy powiedzieć klientowi: "Potrzebujemy, żebyś częściej patrzył na aktualny stan projektu". Jeśli to jest nieakceptowalne, należy poprosić klienta czy mógłby oddelegować osobę odpowiedzialną za to. Jeśli nie ma kogoś takiego, to po prostu akceptujeym duży feedback loop, oraz ryzyko tego że będziemy robić czasem coś, co się okaże zmarnowane.

Pamiętaj że programiści to nie są debile, też się starają wytworzyć dobry produkt, i też chcą zrobić go dobrze tak jak należy. Nikt nie ma złej woli. To co daje nam ominięcie analizy, i zamiast tego zaczęćie robienia małych kroczków - to jest szansa żeby zebrać szybki feedback od klienta. Taki feedback od klienta na podstawie nawet jednodniowej pracy jest dużo bardziej wartościowy niż miesiące analiz.

Napiszę to jeszcze raz, żeby zaznaczyć istotę zdania: Ja, osobiście, dużo bardziej wolałbym zebrać feedback od klienta, po tym jak zobaczył moją ubogą, prymitywną wersję programu po jednym dniu; niż wynik miesięcznej analizy.

Poza tym, drugiego dnia dostanę drugi feedback, trzeciego dnia trzeci - każdy kolejny będzie dużo lepszy, bo będzie na podstawie ciągle rozwijanego programu. Żadna analiza nie zastąpi takiego feedbacku.

somekind napisał(a):

Ogólnie to zarządzanie priorytetami kilkugodzinnych tasków przez klienta brzmi jak jakiś cholerny mikromanagement. Albo już nawet pikomanagement.

Źle się zrozumieliśmy - ja nie próbuję populować żadnego zarządzania niczym. Chodzi o zebranie feedbacku.

somekind napisał(a):

Klient może priorytetyzować konkrent ficzery (czyli to, czego chce klient), nie zadania (czyli to, jak programiści dzielą sobie pracę).

No oczywiście że tak! Ty decydujesz kiedy piszesz testy, Ty decydujesz kiedy refaktorujesz kod, Ty decydujesz w jaki sposób deployujesz coś na produkcje, wszystkie decyzje związane z wytwarzaniem oprogramowania podejmujesz Ty - czyli programiści.

Ale to klient decyduje który feature jest najbardziej priorytetowy teraz.

Jeśli widzisz że aktualne priorytety klienta są: feature'y X, Y, Z. I zaczynasz robić X, planując że potem zrobić Y a potem Z; i nagle po zobaczeniu X, klient zmieni priorytet na: feature'y X, Z, Y, to on nie ingeruje w Twoją pracę, nie zarządza Tobą, nie robi mikromanagmentu. Klient Ci w ten sposób daje znać co jest ważniejszym feature'em do dodania, i powinieneś go posłuchać. Oczywiście możesz go nie posłuchać, i zrobić nadal X, Y, Z (czyli zrobić najpierw zadanie które teraz wiesz żę jest mniej priorytetowe), ale to nie jest Agile.

PS: Mówiąc X, Y, Z, mam na mysli funkcjonalności.

somekind napisał(a):
Riddle napisał(a):

To dla mnie jest sygnał że ten "feature" to jest duży byt, którego wykonanie trwa długo - i mówiąć wykonanie mam na mysli analizowanie, designowanie, programowanie, testowanie, etc. Tak wnioskuję na podstawie tego, że mówisz że dużo osób musi przybić pieczątkę.

No mówimy o tym, co jest ważne dla klienta. Np. zamiast wchodzić na rynek sprzedaży warzyw w Nowej Zelandii, chcemy sprzedawać dżinsy w Indiach.
Trzeba w to zamieszać sporo ludzi od biznesu, architektów, liderów zespołów od rozliczeń, walut, koszyka, logistyki, dostawy, i wielu innych.

To jest wszystko prawda. Ale w pewnym momencie Ci ludzie powiedzą: okej, zaczynamy budować jakieś oprogramowanie. I jeśli wykonanie tego oprogramowania ma zająć 3 miesiące - to nie warto tego robić "na raz". Warto zrobić najuobższą wersję jak tylko się da, najszybciej jak się da, i spytać o feedback. To jest Agile.

somekind napisał(a):
Riddle napisał(a):

Jeśli chodzi o wymagania użytkowe - jak coś powinno działać, to ustala je klient/biznes, nie programiści. Klient mówi "what it does", programiści mówią "how it does it".

Chodzi mi o wymagania odnośnie ficzerów, które mam zaimplementować. Jakie dane na wejściu, co na wyjściu, co się dzieje po drodze, gdzie logujemy, gdzie utrwalamy, z czym się integrujemy i w jaki sposób, itd, itp.
Mam sobie to wymyślać w trakcie robienia zadania? Skąd będę wiedział, czy skończyłem zadanie, skoro nie wiem, co miałem zrobić?

Okej, znowu - bardzo ważne pytania i bardzo ważna kwestia. Cieszę się że do tego doszliśmy.

Kilka tematów:

  • skąd wiedzieć jakie dane wejścia/wyjścia
  • co się dzieje po drodze
  • gdzie logujemy, gdzie persystencja
  • z czym się integrujemy i w jaki sposób
  • czy mam to sobie wymyślać podczas robienia zadania
  • skąd będę wiedział czy skończyłem zadanie
  • nie wiem co miałem zrobić.

Okej sporo pytań, postaram się odpowiedzieć na nie.

"Nie wiem co miałem zrobić" - featur który bierzesz powinien być napisany z perspektywy użytkownika, np "jako użytkownik, kiedy odpowiadam na post, chciałbym żeby ten post był automatycznie obserwowany". To jest user story - czyli opowieść usera co chciałby zrobić. W user story nie ma słowa o bazie, stronie, urlach, http, restach, etc. User story ma opisać co użytkownik chce zrobić, i jaki ma być oczekiwany rezultat.

"Czy mam sam sobie wymyślać rozwiązania podczas robienia zadania" - w gruncie rzeczy tak. Klient tylko chce, żeby po dodaniu posta, ten post był obserwowany. Ty, jako programista, musisz sprawić że tak będzie - a to czy to obserwowanie będzie zapisane w bazie, w cache'u, w kolejce, w profilu czy gdzieś, to już jest Twoja odpowiedzialność jako programisty żeby wybrać najlepsze miejsce do tego celu. Niektóre rzeczy warto trzymać w bazie, inne w cache'u - klienta to nie obchodzi - Ty masz podjąć decyzję. Klient najwyżej Ci może powiedzieć czy te dane mają być trzymane pernamentnie, czy tymczasowo - a to w jaki sposób to osiągniesz, to znowu Twoja brocha.

"skąd mam wiedzieć jakie dane wejścia/wyjścia" - tutaj trzeba rozróżnić jakie dane - czy są to dane o których klient wie (nazwa użytkownika, kategoria, grupa), czy dane o których klient nie wie (jakieś idki, timestampy, etc.). Jeśli chodzi o dane o których klient wie, te dane powinny być zawarte w user story. Jeśli dane o których klient nie wie, to to jest Twoja decyzja żeby to ustalić.

"skąd będę wiedział czy skończyłem" - jeśli wytwarzasz oprogramowanie tak jak mówiłem, czyli robisz mały feature, najlepiej na kilka godzin, to pokazujesz go klientowi, i klient mówi czego jeszcze brakuje. Jesli klient powie "jest git", to skończyłeś. Jeśli klient nie pojawia się żeby dać feedback, to skończyłeś wtedy, kiedy dzieje się to co jest opisane w user story, tzn. jeśli dodajesz post, i jest on automatycznie obserwowany, to skończyłeś.

"gdzie logujemy, gdzie persystencja" - jeśli to nie jest zawarte w user story, to to jest Twoja odpowiedzialność, i Ty masz podjąć decyzję, albo jeszcze lepiej - jeśli masz możliwośc, odrocz podjęcie tej decyzji na później. Jeśli nie masz to trudno, podejmij ją teraz.

"z czym się integrujemy i w jaki sposób" - znowu - zależy czy klient ma wiedzieć o tej integracji czy nie. Jeśli ma wiedzieć, bo np chce dodać integracje płatności ze Stripe, to klient decyduje z kim i w jaki sposób. Jeśli to jest integracja, o której klient nie wie, bo nie jest client-facing, np integracja z redisem żeby zwiększyć performance, to Ty jako programista o tym decydujesz i nie mówisz klientowi ani słowa (chyba że w jakiś sposób ta integracja byłaby klient-facing).

"co się dzieje po drodze" - jeśli mówisz o implementacji, to to jest całkowicie Twoja działka, jako programisty.


Dwa ostatnie są dosyć podobne do siebie, więc odpowiem na nie zbiorczo:

somekind napisał(a):
Riddle napisał(a):

To jest niestety konieczność, bo jak bardzo byśmy nie chcieli wiedzieć "co będzie później", to niestety nie wiemy. Na tym właśnie polega cały agile - na zrozumieniu że "nie wiem co będzie potem". Wszystkie metodyki dookoła agile, są po to żeby radzić sobie z wytwarzaniem oprogramowania w świetle tego że nie wiesz jak to będzie wyglądało później. To jest całe sedno.

To ja bym prosił o linka ze źródłem tej definicji agile.
Bo zawsze słyszałem o szybkim reagowaniu na zmiany, o współpracy międzyzespołowej, szybkim feedbacku - ale o tym, że agile polega na błądzeniu we mgle słyszę pierwszy raz.

somekind napisał(a):
Riddle napisał(a):

Biznes może sobie planować co tylko chce - nie ma z tym problemu. Mi chodzi o to że nie powinniśmy wytwarzać oprogramowania z myślą o tym czy coś jest zaplanowane czy nie.

Czyli nigdy nie wiemy co i po co robimy... ja bym nie dał rady, to trzeba wyższe stany świadomości osiągać, żeby w takim chaosie wytrzymać.

Oczywiście w Agile nie chodzi o błądzenie we mgle, i nie chodzi o pracowanie w chaosie.

W Agile "po prostu" chodzi o to, żeby pracować w małych krokach (bardzo małych, mniejszych niż tydzień, idealnie jeden dzień), i po każdym kroku zbierać feedback od klienta, żeby mieć lepszy wgląd w to, w jaką stronę rozwój oprogramowania ma iść. Jeśli po tym jednym dniu, zbierzemy feedback od klienta, i się okaże że on inwaliduje nasz plan, to musimy go zmienić po prostu. To jest Agile.

Nie jesteś zatrudniony w firmie żeby wytworzyć Twoją wizję aplikacji, tylko wizję klienta. Jeśli Twoja wizja i wizja klienta się różnią, to wizja klienta bierze górę. Trzeba mu to umożliwić, a umożliwić mu to się da, jeśli robi się bardzo małe kroki, i po każdym kroku daje klientowi wgląd w aktualny stan, nawet jeśli to ma być prymitywna wersja.

Nie widzę tutaj chaosu i chodzenia we mgle.

somekind napisał(a):
Riddle napisał(a):

Większość ludzi jak słyszy takie podejście; "Po co mam pokazywać klientowi samą autoryzację, skoro i tak będę musiał zrobić potem X, Y, Z". Albo pomyślą "Klient mnie wyśmieje że jeszcze nie jest skończone", albo "Klient chciał całą integrację, więć nie pokazę mu nieskończonego zadania". Takie podejście jest nie-agile'owe. Musisz pokazać klientowi to co się udało zrobić, na tym polega praca w małych krokach. Musisz umożliwić klientowi zobaczenie aktualnej planszy szachowej - w tym wypadku to że sama autoryzacja zwraca true/false i nic więcej, musisz tą autoryzację wrzucić na maszynę bliską produkcji, przepuszczać małe kroki faktycznym procesem zanim poświęcisz 3 miesiące na jego development.

Bo klienta nie obchodzi jakieś false wyświetlone w Postmanie. Klient chce API, w którym konfiguruje sobie szablony wiadomości email, oraz workera, który czyta z kafki i na podstawie eventu wysyła zgodny z odpowiednim szablonem email do klienta.
Klient na podstawie jakiegoś false nie podejmie decyzji czy ten pomysł ma sens, będzie o tym wiedział dopiero, gdy zobaczy maile w skrzynce.

Jeśli ja miałbym klienta, który chce żebym mu zbudował API, w którym można skonfigurować szablony maili, oraz skonfigurować jakiś proces który wysyła maile z kafki na podstawie tych szablonów, to podszedłbym do tego tak:

  • Pogadałbym z klientem przez godzinę lub dwie, po co on to API potrzebuje, spytałbym jaki problem próbuje rozwiązać. Spytałbym go jakie ma wymagania odnośnie tego API, jakiego ruchu się spodziewa (możliwe że nie wie), jak bardzo bezpieczne ma być, czy ma działać z kafką czy innymi message brokerami, czy będzie schowane za API, czy ma jakieś inne techniczne uwagi.
  • Jeśli wszystko ustalone, to zaproponowałbym wykonanie pierwszego, najdrobniejszego taska jaki się da. Musi to być bardzo mała rzecz, taką którą da się zrobić w jeden dzień, i jednak robi coś. Rzuciłem wcześniej że autoryzacja, bo ja od tego bym zaczął ale to może być cokolwiek.
  • Dla przykładu - wiem że API ma puszczać eventy z kafki jako maile.
    • Jak ja od tego bym zaczął? Napisałbym API, które wysyła maila tak po prostu, bez żadnego eventu, do klienta. Wpisałbym tam jakąś tymczasową treść, nawet bez żadnego formatowania
    • To było szybkie, dzień się jeszcze nie skończył więc jadę dalej,
    • Tworzę testową kafkę, na którą wrzucam jeden event, i piszę kod który łapie ten event i wysyła maila. Zależnie od skomplikowania systemu to może ale nie musi zająć całego dnia.
    • Oczywiście piszę testy na wszystko
    • Jeśli skończyłem, to proszę klienta o adres mailowy (prawdziwy albo testowy, zależy jak woli), i wysyłam mu maila z mojego programu.
    • Pytam klienta czy taki mail jest okej - tutaj niespodzianka - pytam go czy jest okej, mimo że wiem że nie jest.
    • Klient teraz mi opowiada o tym co jest nie tak:
      • Nie ma szalbonów - to wiem, potwierdza się moje przekonanie
      • Klient mówi że to powinno iśc do kilku maili - o, tego nie wiedziałem - zapisuję sobie
      • Klient mówi że w mailu powinny być kolorki i obrazki - to się ma do szablonów, wiec tego też się spodziewałem
    • Oczywiście mogłoby być tak, że ja pokażę maila klientowi i klient powie "jest spoko", albo powie tylko to co już wiedziałem - wtedy wiem że dobrze wykminiłem wszystko z pierwszego spotkania.
  • Programuję od razu dalej:
  • Piszę kod który przechwytuje jeden z kilku eventów, powiedzmy create order, delete order, pay order, oraz dodaję prosty markup do emaila, nie jakiś skomplikowany
  • Teraz wrzucam na testową kafkę te trzy eventy, i wysyłam maila z programu do klienta.
  • To samo co wcześniej, klient patrzy na maila, i mówi że część rzeczy nadal nie działa, że część jest okej.
    • Znowu robię to samo - pytam go czy wszystko jest okej, mimo że wiem że prawie wszystkiego brakuje:
    • Klient mówi że nadal nie ma szablonów - to wiem
    • Klient mówi że chce tylko create order i delete order, że pay order nie chce. To mnie dziwi - zaczynam z nim rozmawiać, jak chciałby to rozróżnić, rozmawiamy o potencjalnym rozwiązaniu
    • Ponieważ klient już któryś raz mówi o szablonach, to dla mnie znak że te szablony są ważne, więc to jest sygnał dla mnie że tym się powinienem zacząć dalej
  • Teraz siadam do zrobienia szablonu. Na razie robię żeby nie był konfigurowalny, bo chcę szybko skończyć robienie go. Dodaję kolorki, listy, i obrazki w HTML. Znowu wrzucam fake event na kafkę, i wysyłam maila do klienta.
  • Klient patrzy na maila na telefonie, i widzi że się rozjeżdżają - to dla mnie sygnał że szablony mają wspierać telefony też - tego się spodziewałem
  • Klient patrzy na szablon i mówi że mu się podoba - to jest potwierdzenie dla mnie, że dobrze zgadłem co klient chce
  • Ale klient mówi że nie chce obrazków w szablonie - to jest dla mnie pomocna informacja, bo nie będę musiał ich serwować.
  • Klient mówi że chciałby skonfigurować maile.
  • Słucham wszystkiego co mówi klient, i tworzę kolejną wersję. Tym razem wysyłam inny rodzaj szablonu dla create order, inny dla delete order. Wrzucam te dwa eventy na kafkę, i program już sam wysyła dwa maile do klienta z nimi.

I tak w kółko.

To jest Agile. Nie ma tutaj miejsca na pracę we mgle, nie ma miejsca na chos. To co robię to:

  1. Spróbuj zgadnąć co klient chce, zbierz informacje, wyciągnij od niego wszystko co możesz - ale miej na uwadze, że klient, tak samo jak Ty - nie wie czego chce.
  2. Zrób najmniejszą, najprostszą wersję oprogramowania, która dla klientowi cokolwiek na co może popatrzeć i go użyć.
  3. Zbierz ponownie informacje od niego
  4. Powtórz 2. - 3. dopóki klient nie powie "okej, jest git".
somekind napisał(a):
Riddle napisał(a):

Analizy powinny być, ale tylko i wyłącznie w momencie rozpoczęcia zadania - nie przed. Dokładniej mówiąc, w momencie w którym wykonanie tego 3rd party będzie najbardziej priorytetowym zadaniem, wtedy siadasz i to robisz, i wtedy, jeśli potrzeba rozpoczynasz analizę tego - chyba że ten task straci priorytet, wtedy musisz przestać i wziąć coś bardziej priorytetowego.

Świetnie, tylko klient chce wiedzieć ile czasu zajmie wytworzenie API, którego jedna z funkcji wymaga integracji z tym zewnętrznym API. Na jakiej zasadzie mam udzielić odpowiedzi, skoro nie znam tego zewnętrznego API?

Ale nie znasz tego zewnętrznego API, więc nie wiesz ile może zająć wytworzenie go.

Najszczerszy estimate jaki możesz powiedzieć klientowi to "nie wiem" - bo nie wiesz. Nie korzystałeś nigdy z niego, skąd masz wiedzieć ile to zajmie.

Są na to dwa wyjścia:

  • Albo zrobić "analizę" żeby spróbować wydedukować ile czasu może zająć zaprogramowanie czegoś
  • Albo po prostu zacząć robić to zadanie, i dostarczyć absolutne minimum. Teraz masz przynajmniej jeden krok. Można jechać dalej. To po prostu działa.

Klient chce wiedzieć ile czasu potrzeba na zbudowanie tej integracji, żeby wiedzieć czy opłaca mu się wydawać kase na pracę programistów, i musi wiedzieć czy coś będzie gotowe czy nie. Ale to samo możesz załatwić dostarczając absolutne minimum, żeby klient faktycznie zobaczył jak to działa. Klient nie chce daty, nie chce planów - klient chce wiedzieć, czy uda mu się dostarczyć to co on chce. I to samo można załatwić jednym albo dwoma krokami Agile, czy jak to nazwałeś "ogarnianiem w boju". Tylko że nie przez trzy miesiące, tylko w kilka dni. I tak - w kilka dni nie da się tego zrobić - ale nie musisz dostarczać całego rozwiązania, żeby klient zobaczył czy opłaca mu się w to wchodzić czy nie.

Zakończenie

Na koniec dodam jeszcze taką rzeczy: Taki sposób programowania nie jest łatwy do wprowadzenia. Wymaga zmiany przyzwyczajeń, zmiany sposobu w jaki działamy.

Robi też bardzo trudną rzecz dla niektórych, mianowicie zmusza nas do kontaktu z ludźmi. Jak dostaniesz task na 3 miesiące, to możesz się zakopować w pokoju z colą i słuchawkami, i po prostu kodzić przez 3 miesiące jakieś API. Sporo programistów lubi tak pracować. Tylko że po pierwsze to nie jest agile, a po drugie to przynosi gorsze rezultaty. Lepsze rezultaty przynosi stały kontakt z ludźmi. Programiści, wbrew pozorom nie lubią kontaktów z ludźmi, lubią sobie programować.

Tylko że siedzenie samemu w domu przez 3 miesiace z chipsami i colą, jest dobre i fajne jak piszesz coś dla siebie - jak jesteś jednoczesnie autorem i swoim klientem, że masz perfekcyjną wiedzę nt tego jak ten program ma wyglądać.

Ale jak pracuejsz dla kogoś innego, kogoś czyja wizja może być inna niż Twoja, to najlepszym sposobem na wytworzenie dobrego oprogramowania są częste interakcje z innymi ludźmi, z klientami, oraz częste możliwości zmiany planów. Programiści tego nie lubią - co wyjaśnia czemu w wielu firmach niestety nie ma Agile prawdziwego.

Finalne zakończenie

Jak czytam Twoje posty @somekind, to mi to wygląda jakbyś nie potrzebował predictibility. Ty potrzebujesz feedbacku od klienta - czyli dokładnie tego, co Agile się stara załatwić.

Miang
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1801
1
Riddle napisał(a):

Jak najbardziej jest potrzeba. Bo jeśli np. robię coś w jakimś starym API, o którym wiem, że jest przewidziane do wycofania za 3 miesiące, to nie będę się silił na jakąś refaktoryzację przy okazji. Jeśli implementuję nowy ficzer w jakiejś bibliotece, o której wiem w jakich API, i w jaki sposób jest używana, to implementuję go tak, aby zapewnić jak najłatwiejszą integrację z tymi API. Itd., itp.

Jak rozumiem - Twój argument brzmi: "chcę wiedzieć czy jakieś API ma być wycofane za jakiś czas, żeby wiedzieć czy mam go poprawiać".

Odpowiadam: jak najbardziej. Oczywiście, że możesz wiedzieć czy klient planuje usunięcie API czy nie, i jeśli dowiesz się że klient ma plan usunąć API, to jak najbardziej powinieneś wziąć to pod uwagę, podejmując decyzję, czy refaktorować to miejsce.

jeśli jest chociażby poszlaka że jakieś API może zostać wycofane a aplikacja komunikuje sie z tym API to nie jest najważniejsze refakturowanie żeby ładniejszy i zgodniejszy z ksiązką wujaszka griszki (czy kogoś) kod powstał, najważniejsze jest wprowadzenie zmian w taki sposób żeby:

  • dało się podmienić na używanie innego API
  • albo pobieranie informacji które dawało to API w inny sposób (np. poprzez import)
  • albo wyłączyć daną funkcjonalność
somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0
Riddle napisał(a):

No niestety tak :/ Mało która firma która claimuje że jest agile, faktycznie jest :/

Nie chodzi o deklaracje, chodzi o to, że biznes działa na poziomie strategicznym (oferowania produktu/usługi/udogodnienia dla klienta) a nie na poziomie zwracania true/false z API.

I wtedy Ty, jako programista, kierując się swoją wiedzą, decydujesz czy zrobić ten refaktor czy nie. Możesz uznać że nie, i to jest w porządku. Tylko chodzi o to żeby kierować się tym, że ten "plan" nie jest pewiankiem.

Ale kto mówi, że plan jest pewnikiem? Plan jest z definicji zamierzeniem.
Co to w ogóle za pomysł?!

kiedy ja mówiłem że "predictibility jest niepotrzebne", miałem na myśli że nie jest potrzebne programować TERAZ z myślą tylko i wyłącznie o tym że jest jakieś ustalenie o dacie.

No dobrze, ale co z tego? Nigdy nie programowałem z myślą o dacie.

I rozwiązania jakie to ma są takie:

  • Albo, możesz zrobić "analizę" próbują wydedukować które feature'y są potrzebne a które nie (tylko że takie coś działa gorzej, i wygląda jak waterfall)

Nie, zaplanowanie pracy to nie jest waterfall. Planowanie zadań to jest normalne działanie w praktycznie każdej pracy, zwłaszcza inżynierskiej/technicznej. Z jakiegoś tylko powodu w IT znajduje się sporo anarchistów, którzy odrzucają planowanie i chcą od razu napieprzać kod - nie wiadomo po co, nie wiadomo dlaczego, byle był kod. (Może im płacą za kod - nie wiem.)

Waterfall polega na podzieleniu pracy nad całym systemem na oddzielne fazy, których nie można wykonywać równolegle.

Napiszę to jeszcze raz, żeby zaznaczyć istotę zdania: Ja, osobiście, dużo bardziej wolałbym zebrać feedback od klienta, po tym jak zobaczył moją ubogą, prymitywną wersję programu po jednym dniu; niż wynik miesięcznej analizy.

Tyle, że po jednym dniu na ogół nie zobaczy niczego, co dałoby się ocenić i zrecenzować.
Tzn. pewnie ci klienci, dla których ponad dekadę temu pisałem proste systemiki typu rejestr czasu pracy w małej fabryce, mogliby - bo i poziom skomplikowania ficzerów był niewielki.
Ale to nie zagra z klientem, który ma 40mld $ rocznego przychodu, i wymaga systemów odpowiedniej skali, w których praca pojedynczego programisty jest właściwie niewidoczna z zewnątrz, bo jeden ficzer dla klienta wymaga współpracy wielu zespołów.

To jest wszystko prawda. Ale w pewnym momencie Ci ludzie powiedzą: okej, zaczynamy budować jakieś oprogramowanie. I jeśli wykonanie tego oprogramowania ma zająć 3 miesiące - to nie warto tego robić "na raz". Warto zrobić najuobższą wersję jak tylko się da, najszybciej jak się da, i spytać o feedback. To jest Agile.

I zrobienie szybko małej wersji i spytanie o feedback, ani trochę się nie kłóci z posiadaniem logicznego harmonogramu pracy w celu wytworzenia całego tego softu.

Okej sporo pytań, postaram się odpowiedzieć na nie.

Ja nie chciałem, żebyś mi odpowiadał na pytania odnośnie podstaw mojej profesji, którą wykonuję jakieś 3 razy dłużej od Ciebie. :)

Zwłaszcza, że wcale nie odpowiedziałeś - bo skoro zakazujesz analizowania, planowania, zbierania wymagań i ich spisywania, to ja po prostu chcę wiedzieć, jak taki agilowy task ma wyglądać. Jedno zdanie: "zrób API dla klienta X", a reszty programista ma się domyśleć w trakcie?

To jest Agile. Nie ma tutaj miejsca na pracę we mgle, nie ma miejsca na chos. To co robię to:

  1. Spróbuj zgadnąć co klient chce, zbierz informacje, wyciągnij od niego wszystko co możesz - ale miej na uwadze, że klient, tak samo jak Ty - nie wie czego chce.
  2. Zrób najmniejszą, najprostszą wersję oprogramowania, która dla klientowi cokolwiek na co może popatrzeć i go użyć.
  3. Zbierz ponownie informacje od niego
  4. Powtórz 2. - 3. dopóki klient nie powie "okej, jest git".

Tak, to jest właśnie chaos - nie mam wymagań ani projektu, robię kawałeczki softu, który nikogo nie obchodzi i nie ma go jak zobaczyć (chociażby dlatego, że klient nie umie obsługiwać Postmana ani curla).

Klient chce wiedzieć ile czasu potrzeba na zbudowanie tej integracji, żeby wiedzieć czy opłaca mu się wydawać kase na pracę programistów, i musi wiedzieć czy coś będzie gotowe czy nie. Ale to samo możesz załatwić dostarczając absolutne minimum, żeby klient faktycznie zobaczył jak to działa. Klient nie chce daty, nie chce planów - klient chce wiedzieć, czy uda mu się dostarczyć to co on chce. I to samo można załatwić jednym albo dwoma krokami Agile, czy jak to nazwałeś "ogarnianiem w boju". Tylko że nie przez trzy miesiące, tylko w kilka dni. I tak - w kilka dni nie da się tego zrobić - ale nie musisz dostarczać całego rozwiązania, żeby klient zobaczył czy opłaca mu się w to wchodzić czy nie.

Klient nie chce daty, planów, ani niczego wiedzieć. Klient chce wykonania usługi, za którą płaci - w tym wypadku dostarczenia mu aplikacji zintegrowanej z 3rd party API.
A nasz biznes chce wiedzieć, na kiedy jesteśmy w stanie to dowieźć. Tylko zanim odpowiemy, musimy najpierw poznać to API - więc najpierw planujemy sobie zadanie polegające na zapoznaniu się z tymże. Dopiero, gdy wiemy, na czym stoimy, możemy zacząć planować, a potem oczywiście wykonać ten soft. Feedback od klienta przyjdzie później, potem co najwyżej trzeba będzie coś poprawić, ale nie stracimy ani jednego dnia z naszej pracy - bo wiemy, co robimy - do momentu zebrania wymagań od klienta, przez specyfikację techniczną, po implementację.
Nie każdy pracuje w agencji interaktywnej.

Jak czytam Twoje posty @somekind, to mi to wygląda jakbyś nie potrzebował predictibility.

Świetnie. A czy ja kiedykolwiek pisałem, że potrzebuję tego?
Napisałeś wielki elaborat, ale czy nie zgubił Ci się czasem wątek? To jest dyskusja o SAFe, którego celem jest dostarczenie przewidywalności dla biznesu, nie programistów.
Biznes chce wiedzieć, kiedy dostanie ficzery, które od programistów zamówił. Można składać czcze obietnice - jest wiele firm, które działają w ten sposób, że marketingowcy bez żadnej analizy obiecują niewykonalne deadliny, a można próbować estymować na podstawie jakiegoś harmonogramu.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10230
0
somekind napisał(a):

Klient nie chce daty, planów, ani niczego wiedzieć. Klient chce wykonania usługi, za którą płaci - w tym wypadku dostarczenia mu aplikacji zintegrowanej z 3rd party API.
A nasz biznes chce wiedzieć, na kiedy jesteśmy w stanie to dowieźć. Tylko zanim odpowiemy, musimy najpierw poznać to API - więc najpierw planujemy sobie zadanie polegające na zapoznaniu się z tymże. Dopiero, gdy wiemy, na czym stoimy, możemy zacząć planować, a potem oczywiście wykonać ten soft. Feedback od klienta przyjdzie później, potem co najwyżej trzeba będzie coś poprawić, ale nie stracimy ani jednego dnia z naszej pracy - bo wiemy, co robimy - do momentu zebrania wymagań od klienta, przez specyfikację techniczną, po implementację.
Nie każdy pracuje w agencji interaktywnej.

No dobrze, możesz sobie tak pracować.

Ale to nie jest Agile.

somekind napisał(a):

I zrobienie szybko małej wersji i spytanie o feedback, ani trochę się nie kłóci z posiadaniem logicznego harmonogramu pracy w celu wytworzenia całego tego softu.

Trochę tak, trochę nie.

Zrobienie szybko małej wersji i spytanie o feedback faktycznie nie kłóci się z posiadaniem harmonogramu pracy, to prawda. Ale w Agile, po każdej jednej małej zmianie wersji ten harmonogram może się zmienić (i często właśnie się zmienia).

Jeśli masz jakiś harmonogram, a potem po małych zmianach się go kurczowo trzymasz i nie chcesz go zmienić, to to nie jest Agile. Po każdej małej zmianie do harmonogramu mogą zostać dołożone nowe feature'y, usunięte niepotrzebne, może się im zmienić kolejność, etc. Właśnie przez te zmiany harmonogramu "Agile" jest agile. Dlatego ja osobiście wolę nie robić harmonogramów - bo po co, skoro i tak się mogą zmienić. Dużo lepiej jest robić aktualnie najważniejsze zadanie.

Ego: Jeśli masz harmonogram, który nie może się zmienić (i na podstawie są robione jakieś twarde ustalenia, np deadline'y albo terminy) - to to nie jest Agile.

somekind napisał(a):
Riddle napisał(a):

No niestety tak :/ Mało która firma która claimuje że jest agile, faktycznie jest :/

Nie chodzi o deklaracje, chodzi o to, że biznes działa na poziomie strategicznym (oferowania produktu/usługi/udogodnienia dla klienta) a nie na poziomie zwracania true/false z API.

Ale to że biznes działa na poziomie strategicznym, nie znaczy że wytwarzanie oprogramowania też ma tak wyglądać. W Agile nie chodzi o to jaką biznes ma wybrać strategie.

Poza tym, przyczepiłeś się tego true/false, a to był tylko przykład. Ja chciałem powiedzieć, że w Agile chodzi o to żeby dostarczyć biznesowi najmniejszą wartościową rzecz którą ich produkt ma robić - taką którą można zrobić w jeden lub kilka dni, najszybciej jak się da. Taką żeby zobaczyli progres, mimo że mikroskopijny.

somekind napisał(a):
Riddle napisał(a):

Napiszę to jeszcze raz, żeby zaznaczyć istotę zdania: Ja, osobiście, dużo bardziej wolałbym zebrać feedback od klienta, po tym jak zobaczył moją ubogą, prymitywną wersję programu po jednym dniu; niż wynik miesięcznej analizy.

Tyle, że po jednym dniu na ogół nie zobaczy niczego, co dałoby się ocenić i zrecenzować.

No i tu się mylisz, bo totalnie się da. Tak działają wszystkie zespoły które faktycznie stosują Agile.

Tylko to często wymaga zmiany przyzwyczajeń, bo większość ludzi myśli że trzeba zacząć projekt od postawienia giga frameworka, builda, bazy i innych rzeczy - a nie trzeba. Pierwsza wersja może być bardzo prosta bez całej infrastruktury. Na całą infre będzie czas później, wtedy kiedy będziemy lepiej wiedzieć jak program ma działać, jak zrobimy tyle małych iteracji, że zbierzemy tyle feedbacku od klienta, że będziemy mieć lepsze pojęcie jakie decyzje projektowe podjąć.

somekind napisał(a):
Riddle napisał(a):

Tzn. pewnie ci klienci, dla których ponad dekadę temu pisałem proste systemiki typu rejestr czasu pracy w małej fabryce, mogliby - bo i poziom skomplikowania ficzerów był niewielki.
Ale to nie zagra z klientem, który ma 40mld $ rocznego przychodu, i wymaga systemów odpowiedniej skali, w których praca pojedynczego programisty jest właściwie niewidoczna z zewnątrz, bo jeden ficzer dla klienta wymaga współpracy wielu zespołów.

No to powiem to again - możesz sobie tak pracować, ale to nie jest Agile.

Jeśli dostarczenie pojedynczego feature'a wymaga współpracy wielu zespołów, to to siłą rzeczy nie ma prawa być Agile. Jedyny sposób żeby zrobić z tego agile, to byłoby podzielić ten feature na mniejsze kawałki.

somekind napisał(a):

Zwłaszcza, że wcale nie odpowiedziałeś - bo skoro zakazujesz analizowania, planowania, zbierania wymagań i ich spisywania, to ja po prostu chcę wiedzieć, jak taki agilowy task ma wyglądać. Jedno zdanie: "zrób API dla klienta X", a reszty programista ma się domyśleć w trakcie?

Programista (lub zespół programistów) ma wymyśleć sam wszystkie szczegóły implementacyjne. Natomiast klient ma sprecyzować, i ma umieścić w zadaniu to, czego użytkownik systemu może się spodziewać kiedy z niego korzysta.

Poza tym nie zakazuję analizowania, planowania i zbierania wymagań.

  • Analizowanie powinno być wykonywane, tylko że równocześnie z programowaniem (jednocześnie z robieniem taska) - nie wcześniej. Albo może mówiąc inaczej - jeśli zaczynasz analizowanie - to w tym momencie zaczynasz też programowanie tego taska - nie później.
  • Planowanie powinno być, ale nie "twarde", tzn zaplanuj sobie co zrobisz potem, ale nie podejmuj decyzji na podstawie tego planu, i zawsze zakładaj że plan się może zmienić jutro
  • Zbieranie wymagań powinno być za każdym razem po wydaniu małej wersji softu - czyli jak zrobisz 10 release'ów, to powinieneś 10 razy ponownie zebrać wymagania od klienta.

Można powiedzieć że Agile to jest iterowany waterfall, tylko że jedna iteracja trwa jeden dzień. Każdy dzień agile'a to taki jeden waterfall-ik :D I potem kolejny, i kolejny.

somekind napisał(a):
Riddle napisał(a):

To jest Agile. Nie ma tutaj miejsca na pracę we mgle, nie ma miejsca na chos. To co robię to:

  1. Spróbuj zgadnąć co klient chce, zbierz informacje, wyciągnij od niego wszystko co możesz - ale miej na uwadze, że klient, tak samo jak Ty - nie wie czego chce.
  2. Zrób najmniejszą, najprostszą wersję oprogramowania, która dla klientowi cokolwiek na co może popatrzeć i go użyć.
  3. Zbierz ponownie informacje od niego
  4. Powtórz 2. - 3. dopóki klient nie powie "okej, jest git".

Tak, to jest właśnie chaos - nie mam wymagań ani projektu, robię kawałeczki softu, który nikogo nie obchodzi i nie ma go jak zobaczyć (chociażby dlatego, że klient nie umie obsługiwać Postmana ani curla).

Okej, znowu ważna rzecz poruszona. Zaczynasz projekt i mówisz "nie mam wymagań ani projektu". To jest zawsze prawda, że na początku projektu każdy ma najmniejszą ilość dostępnych informacji jaką będzie miał w życiu projektu. Najwięcej informacji ma się zawsze na sam koniec. Więc co masz w ogóle zacząć robić, jak nie wiesz co masz robić bo nie masz wymagań. I na to są dwie drogi:

  • waterfallowa - zrób analizę
  • agiel'owa - zrób pierwszą drobną wersję, i pokaż klientowi

Zauważ że jak zaczynasz projekt, to klient Ci nie powie "no to zacznijcie i siema", tylko najpewniej Ci opowie trochę co ten program ma robić, co on chce zdziałać. Poza tym, już sam fakt że mówisz "mój projekt to API" to też trochę zbyt technicznym językiem jest powiedziane. Jeśli klient nie umie korzystać z postmana ani curla, to dla mnie to jest sygnał że to API to jest tylko środek do celu - trzeba by ustalić co jest tym celem dla klienta, i zacząć do tego dążyć.

somekind napisał(a):

Klient nie chce daty, planów, ani niczego wiedzieć. Klient chce wykonania usługi, za którą płaci - w tym wypadku dostarczenia mu aplikacji zintegrowanej z 3rd party API.
A nasz biznes chce wiedzieć, na kiedy jesteśmy w stanie to dowieźć. Tylko zanim odpowiemy, musimy najpierw poznać to API - więc najpierw planujemy sobie zadanie polegające na zapoznaniu się z tymże. Dopiero, gdy wiemy, na czym stoimy, możemy zacząć planować, a potem oczywiście wykonać ten soft. Feedback od klienta przyjdzie później, potem co najwyżej trzeba będzie coś poprawić, ale nie stracimy ani jednego dnia z naszej pracy - bo wiemy, co robimy - do momentu zebrania wymagań od klienta, przez specyfikację techniczną, po implementację.
Nie każdy pracuje w agencji interaktywnej.

Jak czytam Twoje posty @somekind, to mi to wygląda jakbyś nie potrzebował predictibility.

Świetnie. A czy ja kiedykolwiek pisałem, że potrzebuję tego?
Napisałeś wielki elaborat, ale czy nie zgubił Ci się czasem wątek? To jest dyskusja o SAFe, którego celem jest dostarczenie przewidywalności dla biznesu, nie programistów.
Biznes chce wiedzieć, kiedy dostanie ficzery, które od programistów zamówił. Można składać czcze obietnice - jest wiele firm, które działają w ten sposób, że marketingowcy bez żadnej analizy obiecują niewykonalne deadliny, a można próbować estymować na podstawie jakiegoś harmonogramu.

Okej, czyli Twój klient nie chce daty, planów i nie chce wiedzieć niczego - interesuje go efekt.

Natomiast coś co nazywasz biznesem, chce wiedzieć na kiedy jesteśmy w stanie to dowieźć. Pytanie zasadnicze - po co chce to wiedzieć? Nie neguję tego, tylko pomyślałem że zapytam przed odpowiedzią.

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
2
Riddle napisał(a):

Ale to nie jest Agile.

Straszne.

Zrobienie szybko małej wersji i spytanie o feedback faktycznie nie kłóci się z posiadaniem harmonogramu pracy, to prawda. Ale w Agile, po każdej jednej małej zmianie wersji ten harmonogram może się zmienić (i często właśnie się zmienia).

Zasadniczo im bardziej doświadczony zespół, tym szanse na zmianę mniejsze.

Poza tym, przyczepiłeś się tego true/false, a to był tylko przykład. Ja chciałem powiedzieć, że w Agile chodzi o to żeby dostarczyć biznesowi najmniejszą wartościową rzecz którą ich produkt ma robić - taką którą można zrobić w jeden lub kilka dni, najszybciej jak się da. Taką żeby zobaczyli progres, mimo że mikroskopijny.

No, a dla biznesu najmniejsza wartościowa rzecz, to jest często cały produkt, który robi coś, co biznesowi jest potrzebne, a nie dzień pracy programisty, któremu jakaś religia coś takiego nakazuje.

Tylko to często wymaga zmiany przyzwyczajeń, bo większość ludzi myśli że trzeba zacząć projekt od postawienia giga frameworka, builda, bazy i innych rzeczy - a nie trzeba. Pierwsza wersja może być bardzo prosta bez całej infrastruktury. Na całą infre będzie czas później, wtedy kiedy będziemy lepiej wiedzieć jak program ma działać, jak zrobimy tyle małych iteracji, że zbierzemy tyle feedbacku od klienta, że będziemy mieć lepsze pojęcie jakie decyzje projektowe podjąć.

Nigdy nie pracowałeś przy większym sofcie, prawda?

Jeśli dostarczenie pojedynczego feature'a wymaga współpracy wielu zespołów, to to siłą rzeczy nie ma prawa być Agile.

Czyli Agile jest możliwe tylko przy fullstackach, którzy hostują aplikacje na RPi schowanych w szufladzie swojego biurka.
Może i tak.

  • Analizowanie powinno być wykonywane, tylko że równocześnie z programowaniem (jednocześnie z robieniem taska) - nie wcześniej. Albo może mówiąc inaczej - jeśli zaczynasz analizowanie - to w tym momencie zaczynasz też programowanie tego taska - nie później.

Nie ma to żadnego sensu. Celem analizy jest zebranie wymagań, nie da się zacząć taska nie mając wymagań.

Okej, znowu ważna rzecz poruszona. Zaczynasz projekt i mówisz "nie mam wymagań ani projektu". To jest zawsze prawda, że na początku projektu każdy ma najmniejszą ilość dostępnych informacji jaką będzie miał w życiu projektu.

Nie, to nie jest prawda. To Ty nie masz informacji. Ja mam, bo podchodzę do tworzenia softu w sposób inżynierski, a nie chaotyczny.

Zauważ że jak zaczynasz projekt, to klient Ci nie powie "no to zacznijcie i siema", tylko najpewniej Ci opowie trochę co ten program ma robić, co on chce zdziałać. Poza tym, już sam fakt że mówisz "mój projekt to API" to też trochę zbyt technicznym językiem jest powiedziane. Jeśli klient nie umie korzystać z postmana ani curla, to dla mnie to jest sygnał że to API to jest tylko środek do celu - trzeba by ustalić co jest tym celem dla klienta, i zacząć do tego dążyć.

No i tak to działa - ludzie odpowiedzialni za cele dla klienta zbierają i opracowują informacje, które trafiają dalej do zespołów odpowiedzialnych za konkretne ficzery. A zespoły z kolei opracowują sobie swoje odcinki pracy.

Okej, czyli Twój klient nie chce daty, planów i nie chce wiedzieć niczego - interesuje go efekt.

Interesuje go efekt w konkretnej dacie.

Natomiast coś co nazywasz biznesem, chce wiedzieć na kiedy jesteśmy w stanie to dowieźć. Pytanie zasadnicze - po co chce to wiedzieć? Nie neguję tego, tylko pomyślałem że zapytam przed odpowiedzią.

Zapewne biznes nie chce zawieść klienta obiecując mu coś, co jest nierealne do dostarczenia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.