czwartek, 30 września 2010

Jak w zasadzie działają moduły flexa

Ponieważ straciłem ostatnio sporo czasu na próbach podłączenia modułu do istniejącej już aplikacji (nie mając dostępu do aplikacji/źródeł), postanowiłem podzielić się swoimi przemyśleniami.

Generalnie, flex jako flex jest bardzo fajnym narzędziem, ale jak każda technologia ma trochę problemów. Ja ostatnio natrafiłem na problemy związane z podłączeniem modułu który komunikował się za pomocą WebService. Warto nadmienić, że sam moduł, został przygotowany nie jako moduł, ale jako osobna aplikacja webowa, co dostarczyło mi dodatkowych problemów. Przejdźmy do sedna:

Moduły/Aplkiacje flexowe można ładować na kilka sposobów. Po pierwsze możemy skorzystać z loadera i przy jego pomocy załadować aplikację. Przykładowy kod wygląda następująco:
MXML:

 <mx:moduleloader url="SomeModule.swf"/>

AS:


var loader : ModuleLoader = new ModuleLoader();
loader.url = "SomeModule.swf";
contentPanel.addChild(loader);


Sprawy oczywiście się dalej komplikują, bo jak można się domyślić, nie jest to jedyny sposób ładowania modułów. Po pierwsze możemy użyć różnych loaderów. Dla przykładu SwfModuleLoader nadaje się do załadowania aplikacji a nie modułu (jak również swf wykonanego we flashu). Zastosowanie tego loadera potrafi rozwiązać wiele problemów które można spotkać z innymi loaderami, w szczególności można przy jego pomocy prawidłowo ustawić moduł na ekranie. Obsługuje on również eventy związane ze zmianą wielkości obszaru aplikacji. Użycie tego loadera rozwiązało moje problemy związane z ładowaniem modułu (o których napiszę dalej).

Aby sprawy dalej skomplikować, można również użyć ModuleManager, co zostało zastosowane w przypadku aplikacji do której się podłączałem. Stosowanie ModuleManager wymaga jednak nieco innego podejścia. Jest to element który zarządza załadowanymi modułami. Przykładowy kod zastosowania wygląda następująco:


var moduleInfo : IModuleInfo;
moduleInfo = ModuleManager.getModule(_url);
moduleInfo.load();
var module:Object = moduleInfo.factory.create();
container.addChild(module);


Jak widać, flex pozwala na na prawdę dużą dowolność. W szczególności można użyć po prostu Loader. W zasadzie nie było by to aż tak skomplikowane, gdyby nie fakt, że dodatkowo jest jeszcze takie pojęcie jak ApplicationDomain. Domena aplikacji de-facto oznacza, w jakim środowisku dany moduł powinien zostać załadowany. Domenę ładuje się następująco:


var applicationDomain:ApplicationDomain = ...;

-----------------------------------------------------

var moduleInfo : IModuleInfo;
moduleInfo = ModuleManager.getModule(_url);
moduleInfo.load(applicationDomain);

-----------------------------------------------

var loader : ModuleLoader = new ModuleLoader();
loader.url = "SomeModule.swf";
contentPanel.addChild(loader, applicationDomain);




Pod zmienną applicationDomain z przykładu można podstawić 3 (w zasadzie 4) wartości. Pierwsza (domyślna) to wartość:

var applicationDomain:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);

lub

var applicationDomain:ApplicationDomain = null;


Tego typu zapis oznacza, że moduł jest modułem dzieckiem. Do rodzica można dostać się poprzez ApplicationDomain.parrentDomain. Niestety, jest to tylko teoria. Obie domeny co prawda są odseparowane, ale jeżeli korzystamy w naszej aplikacji z singletonów, to będą się one zachowywać na dwa sposoby. Albo będą modułowe, albo aplikacyjne. Jeżeli singleton nie został zainicjalizowany w aplikacji (a wystarczy tylko wspomnienie takie jak var sig:SomeSingleton = null), to jego zasięg będzie dotyczył tylko modułu (nawet, jeżeli występuje w innych modułach). Natomiast, jeżeli został zainicjalizowany w aplikacji, to będzie to singleton aplikacyjny. Przypomnę, że w moim wypadku nie miałem dostępu do kodu aplikacji, a więc nie byłem w stanie sprawdzić, czy singleton którego używam, był użyty w aplikacji.
Samo to nie jest jeszcze straszne, ale są dalsze konsekwencje. Może wystąpić sytuacja, w której sigleton dynamicznie powołuje do instnienia obiekty klas (po nazwie klasy). Takie zachowanie ma na przykład SchemaTypeRegistry.getInstance().registerClass(...) używane do rejestrowania klas dla WebService. Nagle pojawia się Error #1065, oznaczający, że nie można załadować klasy, ponieważ nie została ona dołączona do skompilowanego kodu. Dokładnie rzecz ujmując ApplicationDomain znajdujący się w aplikacji (w przypadku singletona aplikacyjnego) próbuje powołać do życia obiekt, dla którego klasa znana jest tylko w ApplicationDomain modułu. Osobiści podejrzewam, że jest to jakiś błąd w flexie, ale jak szukałem informacji na temat, to przekrój czasowy w jakim można znaleźć posty na ten temat jest imponujący (2005-2010). Nawet Flex 4 posiada bardzo podobnie wyglądający błąd.

Jak pisałem, są jeszcze 2 warianty przypisania AppliacationDomain:

var applicationDomain:ApplicationDomain = new ApplicationDomain();

oraz

var applicationDomain:ApplicationDomain = ApplicationDomain.curentDomain;


Pierwszy sposób tworzy całkowicie odrębną domenę aplikacji. Osobiście tematu nie zbadałem, ale to co mogę powiedzieć, to to, że aplikacja nie chciała mi się uruchomić z modułem, musiałem zmienić moduł na aplikację, żeby osiągnąć jakikolwiek efekt.

Ostatni sposób, tworzy wspólną domenę dla modułu oraz aplikacji. Takie podejście powoduje, że nagle klasy których mi brakowało, znajdują się w tej samej domenie co aplikacja. Oznacza to, że mój problem przestaje istnieć, jednak warto wspomnieć, że nie ma również separacji modułu i aplikacji.

Więcej informacji można znaleźć w tych artykułach:
http://livedocs.adobe.com/flex/3/loading_applications.pdf
http://livedocs.adobe.com/flex/3/html/help.html?content=modular_5.html
http://life.neophi.com/danielr/2006/07/flex_2_runtime_error_1065.html

czwartek, 16 września 2010

Jak uwalić projekt - Epilog

Ponieważ minęło trochę czasu, postanowiłem napisać obiecany epilog do poprzedniej historii.

Firma odkryła, że jest jakiś problem i zatrudniała Audytora. Audytor zajął się oglądaniem jak są prowadzone projekty, głównie na poziomie zarządzania. Audyt zajął około miesiąca i obejmował głównie rozmowy z project managerami i dyrektorem technicznym. Po miesiącu Audytor został nowym dyrektorem technicznym, natomiast dyrektor techniczny został architektem systemu (który przecież trwa już od ponad roku).
Projekt w tym czasie spokojnie sam posuwał się do przodu. Kierownictwo było zajęte głównie roszadami oraz przygotowywaniem papierków, negocjacjami z klientem oraz audytorem/nowym dyrektorem. Oznacza to, że tak na prawdę, nikt nie kontrolował jak idą prace. Co prawda programiści są kompetentni, więc tyle ile mogą robią, ale mimo wszystko kompletny brak kontroli jest nieco niepokojący.

W między czasie, zaczeło wychodzić (przynajmniej w gronie programistów), że nowi programiści (zdalni) w zasadzie niewiele wnoszą do projektu, a dodatkowo poświeca się im sporo czasu. Mimo to, zawsze można jeszcze pod-zlecić innej firmie część prac. O ile osobiście uważam, że jest to całkiem niezły pomysł, to w sytuacji w której dokumentacja jest na poziomie niskim (nie zgodnym z założeniami, nie dokładnym, nie aktualnym, itd.), nie da się ani dobrze oszacować czasu, ani nie da się po prostu pod-zlecić. Trzeba dodatkowo dać kogoś, w zasadzie na pełen etat kto będzie wyjaśniał wątpliwości. Mimo to, pod-zlecanie stało się nowym motto firmy. Żeby było lepiej, to zawsze można wziąć firmę po znajomości (a nie koniecznie po kwalifikacjach jej pracowników).

Miesiąc po objęciu stanowiska przez nowego dyrektora zaczęły się ruchy w poszukiwaniu czasu programistów. Pojawiły się duże znaki zapytania odnośnie urlopów oraz prośby zaplanowania go na później jeżeli tylko się da. Pojwaiły się również spotkania personalne z dyrektorem w zakresie: Co robisz, ile ci to jeszcze zajmie, kiedy planujesz urlop i jak ma on się do tego co masz zaplanowane do zrobienia. Mam jednak wrażenie, że mimo dobrych chęci, nie wnosiły one niczego w projekt. Oczywiście część programistów zajmowała się tylko komunikacją z zleceniobiorcami (w tym programistami zewnętrznymi) więc nie zajmowali się programowaniem. Co interesujące, dzięki temu ruchowi, prace spowolniły tempo.

Mniejwięcej w tamtym okresie sprawy przybrały jeszcze gorszy obrót, bo okazało się, że dwóch najbardziej doświadczonych programistów stwierdziło, że odchodzi. Ponieważ jeden miał na głowie bezpieczeństwo aplikacji a drugi silnik, to rozpoczęto działania w celu przekazania zadań związanych z silnikiem. Przekazanie bezpieczeństwa zostawiono na 2 ostatnie dni pracy. W końcu ten autorski rozbudowany system spełniający masę wymagań (często na wyrost) na pewno łatwo można przekazać...

Mniejwięcej w tamtym okresie okazało się również, że firma oficjalnie zawiesza projekt, ze względu na brak umówionej płatności ze strony klienta. W zasadzie, można by przyjąć, że to już był koniec projektu. Oczywiście firma planowała jeszcze wywiązać się ze zobowiązań kontynuując projekt wewnętrznie, ale oficjalnie projekt był zawieszony.
Klient oczywiście chciał, żeby projekt był kontynuowany, ale z punktu widzenia firmy, lepsza była ścieżka sądowa.

Na tym etapie rozpoczęto również zrywanie umów z podwykonawcami (czyli po około miesiącu).

Stan: Realizacja projektu w miarę obiektywnie 75% (ale pewne problemy nie zostały w ogóle podjęte), wg firmy 90 - 95%. Oficjalnie zawieszony.
Zespół: 3 programistów 2 osoby od kontaktów.
[EDIT] Zgodnie z komentarzem. Brak testów obciążeniowych, a funkcjonalność ta co jest, przetestowana pobieżnie, przez testerów którzy nie znają się na pisaniu testów i programowaniu (czytaj: Osoby które przeklikają aplikację).

Ta zupełnie teoretyczna historia mogła się wydarzyć na prawdę. Takich firm w Polsce jest wiele. Nie każdy, mimo tego, że potrafi wykonać mały produkt, powinien brać się za realizację dużych projektów. Dodatkowo, warto jednak zatrudnić specjalistów, w dziedzinach które dla dużych projektów są istotne, takich jak analitycy, architekci, specjaliści z danych dziedzin. Małe projekty nie wymagają tak silnego zaplecza. Można je realizować znacznie luźniej, uzupełniając pewne elementy w biegu. W przypadku dużych projektów, błędy w architekturze, dokumentacji, zarządzaniu kosztują firmy na prawdę duże pieniądze.

PS. Pozdrowienia dla tych, którzy jednak czytają tego bloga :)

czwartek, 6 maja 2010

Problem z 59Hz

Od 3 lat posiadam dobry moniotr LCD. Do tej pory nie było z nim problemów.. aż do czasu. Zmieniłem komputer, a ponieważ musiałem oszczędzić na karcie graficznej to kupiłem najtańszą, ale taką która obsłuży rozdzielczość 1900x1200. Niestety okazało się to nie wystarczające. Co prawda karta obsługuje tą rozdzielczość, ale okazuje się, że pod Windows 7 (i z tego co czytałem również w Vista) są dość ciekawe sterowniki dla monitorów.

Windows źle rozpoznaje częstotliwość podawaną przez monitor. Część monitorów LCD pracuje w częstotliwości 59.94. Niestety Windows nie rozpoznaje ich jaką tą częstotliwość tylko 59Hz. O ile dla zwykłego monitora nie stanowi to problemu, o tyle dla LCD powoduje brak synchronizacji. Dla złącz DVI powoduje brak ekranu (lub jego pojawianie się i znikanie (na przykład 1s jest.. 10s nie ma), dla złącza VGA powoduje migotanie lub pasy na ekranie.

Problem jest taki, że na liście obsługiwanych częstotliwości mam 59 i 60Hz, ale nigdy nie można ustawić 60Hz (które jest prawidłowe), ponieważ monitor zgłasza że obsługuje 59.94 (a więc nie 60).

Microsoft temat zamknął określając że wszystko jest w porządku (http://support.microsoft.com/kb/2006076).

Rozwiązania:
  • Zmiana karty graficznej - Tak wiem... teoretycznie problem z monitorem, ale w praktyce monitor już wcześniej pracował prawidłowo z moim Laptopem, a po zmianie karty graficznej problem zniknął. (Poprzednia karta jest w porządku, z monitorem kineskopowym działa ok)
  • Powerstrip - program pozwala na dość mocne sterowanie kartą graficzną (w tym częstotliwościami dla monitora)
  • Można próbować definiować własne rozdzielczości, ale u mnie nie zdało to egzaminu.

środa, 28 kwietnia 2010

Jak uwalić projekt informatyczny za grube pieniądze

Na usta cisną mi się tylko słowa Grega Zorby "Jaka piękna katastrofa" , ale wybiegam odrobinę w przyszłość.

Postanowiłem się podzielić z szerszą publiką moimi przemyśleniami na temat zarządzania projektami informatycznymi, a przede wszystkim, jak nie powinno się prowadzić projektu. Ponieważ obowiązuje mnie tajemnica, będę się starał unikać szczegółów, a pewne fakty mogą zostać przeze mnie zmienione.

Uczestniczę obecnie w projekcie który do małych nie należy a jego wartość wyceniona została na sumę, której w LOTTO z reguły wygrać się nie da. Projekt zawiera bardzo wiele powiązanych ze sobą systemów, zaczynając od CRM poprzez CMS, GIS, oraz zarządzanie bazą danych (w tym graficzną jej reprezentację) z poziomu GUI. Aplikacja pozwala na pracę w przeważającej części za pomocą przeglądarki. Z samego zakresu technologii, jak również jego wartości jasno wynika, że projekt do małych nie należy. Jak na projekt tej wielkości przystało, projekt jest zarządzany zgodnie z jedną z bardziej popularnych metodyk (jednak tylko na styku z klientem). Czas realizacji: około 1,5 roku + utrzymanie.

A teraz prosty przepis, jak taki projekt uwalić:
Na początek mamy podpisanie umowy, w ramach której obiecujemy klientowi gruszki na wierzbie. Przy czym, klient sam nie do końca wie co mu jest potrzebne, więc wymaga jak najwięcej się da. Nie ma przy tym sensu sprawdzenie, czy wymagania w ogóle mają sens, lub czy się wzajemnie nie wykluczają. Klient w końcu nigdy w życiu nie dał by sprzecznych ze sobą wytycznych, nawet jeżeli jest kilkanaście osób które ze strony klienta mogą decydować i wspólnie podejmować decyzje. Dodatkowo, ponieważ klient wymaga wstępnego projektu, można wziąć projekt innego systemu i trochę przystosować. Ponad dwustu tabel w dokumentacji bazy danych i tak nikt nie będzie czytał. W zasadzie, jak się głębiej nad tym zastanowić. To te tabele można żywcem wziąć, po co to przystosowywać, dopisać tylko do tego jakąś otoczkę.

Kolejnym krokiem jest zebranie wymagań. Ten krok można w zasadzie pominąć, bo przecież wymagania zostały już w zasadzie zebrane w ramach umowy, a tylko doprecyzować jak to w zasadzie ma być w ramach analizy.

A więc przystępujemy do analizy. Oczywiste jest, że w tej fazie, osoby zbierające wymagania nie muszą mieć ani doświadczenia, ani śladowego wykształcenia informatycznego. W końcu system który będzie wykonywany można zaplanować całkowicie w oderwaniu od sprzętu czy oprogramowania. Jeżeli przypadkiem okazuje się, że nie można do końca zebrać wymagań, to należy w dokumentacji wpisać jakieś ogólniki - uzupełni się w ramach projektu technicznego. Ponieważ zespól zbierający te informacje nie musi być duży, w zasadzie wystarczy 5 osób, to może się okazać, że będzie problem z dotrzymaniem terminów. Na szczęście, klient wymaga więcej, niż było podpisane w umowie, w związku z czym można podpisać aneks do analizy. Osób co prawda więcej nie będzie, ale zawsze można dłużej pisać. Klient niestety jest cwańszy, bo co prawda zgadza się na przesunięcie terminu oddania analizy (z aneksem), ale nie pozwala na przesunięcie terminu oddania projektu technicznego, którego realizacja ma być wykonana w terminie, a co najwyżej zostanie uzupełniony później o aneks. W ten oto sposób, aneks zostaje ze sporymi bólami oddany w terminie, co wypada w połowie czasu przewidzianego na oddanie projektu technicznego.

Stan:
Połowa czasu przewidzianego na projekt techniczny.
Analiza - po łepkach, nie kompletna a miejscami sprzeczna.
Aneks do analizy - tak samo
Projekt Techniczny -brak

A więc teraz można przystąpić do realizacji projektu technicznego. Najlepiej jak go zrobi jedna osoba techniczna. Osoba techniczna, to zresztą odrobinę nadużycie semantyczne. w/w osoba, to programista, z 3,5 letnim doświadczeniem, nawet dość szerokim, ale twierdzący, że jego najsłabszą stroną są bazy danych. A więc najlepiej będzie, jeżeli to właśnie ta osoba zaprojektuje bazę danych. Jednak, aby trochę życie ułatwić część bazy danych już jest gotowa i nie należy jej dotykać. Wynika to z faktu, że są gotowe narzędzie wypełniające tą bazę. Co prawda nikt tak na prawdę nie wie jakie to narzędzia, w jakim języku są napisane ani czy ta struktura która jest to właśnie z tych narzędzi, ale są. Oczywiście programista kompletnie nie jest wprowadzony w tematykę GIS, na której całość aplikacji się opiera. Wszystkie osoby które mają jakiekolwiek pojęcie są oczywiście zajęte pisaniem aneksu do analizy, a programista ma wytyczne "zrób projekt techniczny, tam jest analiza". W razie pytań dostaje odpowiedź "wszystko jest w analizie", co oczywiście załatwia sprawę. Po zakończeniu aneksu do analizy (przypominam w połowie trwania projektu technicznego), okazuje się, że w sumie nie wiadomo dlaczego, ale projekt techniczny jest w lesie, klient dodatkowo poza modelem danych wymaga jeszcze projektu interfejsów oraz przypadków użycia, a dodatkowo to co jest, nie jest zgodne z aneksem do analizy, który przecież już od 3 dni leży w repozytorium. Programista zostaje należycie opieprzony za jego niekompetencję a wiec sprawa jest załatwiona. Wprawiony team od analizy siada i wspólnymi siłami oraz posiłkując się dokumentacją z poprzedniego projektu generuje setki stron dokumentów technicznych. Co prawda są pewne zgrzyty, bo okazuje się, że chyba jednak nie wszystko jest w analizie, główny standard wymiany danych jest nie dopracowany (mimo, że zatwierdzony przez klienta). W związku z tym pewne elementy nie zostają doprecyzowane. Ponieważ termin realizacji projektu technicznego stoi pod wielkim znakiem zapytania atmosfera jest bardzo nieprzyjemna i napięta, ale praca wre.
Wreszcie następuje przełom. Okazuje się, że klient zgodził się na rozszerzenie. Oznacza to, że mamy 1,5 miesiąca więcej na wykonanie projektu technicznego. Co prawda klient wymaga teraz trochę więcej i w ramach rozszerzenia przemyca pewne funkcjonalności, ale mimo to są szanse się wyrobić, szczególnie, że projekt interfejsów i przypadki użycia są w powijakach. Jest jednak mały haczyk, polegający na tym, że równolegle należy rozpocząć już implementację, bo projekt techniczny do rozszerzenia idzie jakby torem obok.

To jest dobry moment na rozpoczęcie rekrutacji zespołu który ten projekt zrealizuje. A więc na dobry początek należy stwierdzić ile osób potrzeba. Ponieważ mamy kupę czasu (i nie są znane pełne wymagania), programista szacuje, że potrzeba około 6 osób od zaraz, do samej części CRM, CMS aby projekt zrealizować, około 5 do GIS. Oczywiście programista nie wie co mówi, ale rekrutacja się rozpoczyna. Po dwóch miesiącach rekrutacji są w zespole programistycznym już 3 osoby (w tym programista, który cały czas zajmuje się projektem technicznym). Od tego momentu, programista staje się team leaderem, ponieważ jest osobą techniczną która ma najbardziej całościowy pogląd na cały projekt (i jedyną która ma jakikolwiek pogląd od strony technicznej).

A więc po 2 miesiącach stan jest taki, że zostaje wykonany szkielet aplikacji oraz wypracowane zostają standardy kodowania w wybranych (nowych) technologiach. Warto nadmienić, że cały zespół części technologii uczy się od zera. W końcu jak by przynajmniej jedna osoba znała technologię....

Myślę, że to jest moment, w którym możemy określić, że tak na prawdę (z 2 miesięcznym opóźnieniem) rozpoczęła się faza implementacji.
Status:
2 miesiące do tyłu
3 osoby w zespole (zamiast 6).
0 osób w zespole GIS (zamiast 5).
Projekt techniczny bazujący na kulawej analizie wykonany przez zbyt małą grupę ludzi nie mających o tym zielonego pojęcia. - Sumarycznie 1,5 tyś stron.
Projekty Interfejsów taki, że każdy interfejs nie jest powiązany z żadnym innym (i nie przystaje do technologii).
Przypadki Użycia w dużej części nie są powiązane z interfejsami a dodatkowo część z nich jest pozostałością z innego systemu.

Ponownie zostaje zadane pytanie ile osób potrzeba - odpowiedź - na dzień dzisiejszy 7 w samym zespole do CRM, CMS. Na zapotrzebowanie do innych zespołów nie ma odpowiedzi, ponieważ prace nie są jeszcze na ten moment zaplanowane. Miesiąc później zespół liczy już 5 osób. Liczba ta utrzymuje się przez kolejne miesiące. Kierownictwo ma coraz większe zastrzeżenia do opóźnień i wielokrotnie stara się otrzymać od zespołu informację kiedy nadgonią opóźnienia. Warto nadmienić, że żadne nadgodziny, a przynajmniej płatne nie wchodzą w grę.

Mijają 3 miesiące i okazuje się, że jednak opóźnienia zamiast maleć rosną. Winny jest team leader który nie potrafi doprowadzić do zmniejszenia opóźnienia. Drań jeden dodatkowo próbuje się bronić, mówiąc, że od początku mówił, że potrzeba 7 osób a nie 5. W zespole od GIS również nie dzieje się dobrze. Zespół nie dość, że jest między dwoma projektami, to jeszcze wredny team leader zespołu GIS postanowił odejść z pracy. Coś mówił o burdelu w zarządzaniu, wymagał jakiś procedur i nie pozwalał na to, żeby jednej osobie zlecało pracę 5 osób w ciągu jednego dnia, ale szefostwo wie, że i tak tylko wprowadzał niepotrzebny zamęt w projekcie i w sumie lepiej że go nie będzie.

Mijają 2 tygodnie. Klient zaczyna się niepokoić stanem prac i twierdzi, że jak prace nie zostaną nadgonione, to będzie trzeba wprowadzić plan naprawczy. Zarząd, a za nim kierownictwo projektu nie zgadzają się jednak na to, żeby już wprowadzać plan naprawczy, w związku z czym zespół dostaje polecenie zrobić tak, żeby następna prezentacja aplikacji przeszła bez problemów. Team leader informuje kierownictwo, że jedyną możliwością aby to zrobić, to będzie zrobienie kompletnej wydmuszki (mockupu), już nie tak jak do tej pory, że jest masa błędów, ale generalnie jest, tylko całkowitej wydmuszki. Propozycja zostaje przyjęta.

Mijają 3 tygodnie. Udało się. Klient jest zadowolony ze zwiększonych postępów pracy. Co prawda w czasie prezentacji następuje spora awaria bazy danych więc nie wszystkie funkcjonalności można pokazać, ale ogólnie prezentacja kończy się sukcesem. Co prawda programiści zostają przedstawieni jako banda niekompetentnych... (oszczędzę sobie szczegółów), ale prezentacja przeszła dobrze.

Z bliżej nie określonych powodów w następnym tygodniu prace jakoś nie idą za szybko.

Są decyzje. Teraz już nie ukrywamy problemów. Można zacząć naprawiać błędy.

Minął kolejny miesiąc. Prace co prawda nie postępują, ale aplikacja zaczyna powoli działać. Zaczynają się co prawda problemy z określeniem postępów prac. Tym razem przy wyznaczaniu harmonogramu prac nikt już się nie konsultuje z team leaderem, bo w końcu tak spieprzył poprzedni harmonogram prac, że nie ma to sensu. Aby zapewnić pełną kontrolę nad źle zarządzanym projektem, tematem zajmuje się od tej pory project manager. Co prawda team leader niby nadal jest team leaderem, ale wszelkie podziały prac i decyzje są dokonywane poza nim.

2 tygodnie później, po ostrej awanturze za powolne wykonywanie obowiązków programisty, team leader (teraz już 7 osobowego zespołu) rezygnuje ze swojego stanowiska. Nikt inny nie zostaje wyznaczony do tej (nikomu nie potrzebnej) roli.

Stan na dzień:
-2 miesiące względem pierwotnego harmonogramu.
- +0 miesięcy względem harmonogramu z planu naprawczego (przy czym wg. starego team leadera już pierwszy miesiąc jest niewykonalny, ale jego nikt o zdanie nie pyta)
-7 osoób w zespole, z czego 2 osoby mają pracować zdalnie
- brak team leadera
- brak nałożonych kar ze strony klienta (ale są już odpowiednie zapisy odnośnie planu naprawczego)

C.D.N.