O śmierci systemów mówimy najmniej. I chyba nawet nie dlatego, że
sprawa to przykra. Rzadko kiedy przy niej jesteśmy.
To prawda - bywają nagłe wypadki. Projekty zabite jeszcze przed
uruchomieniem albo tak niedoskonałe, że unicestwione wkrótce po nim. O
nich mówimy - ale zastanawiamy się głównie nad procesem
rozwojowym. Czemu źle rosło, co trzeba było robić inaczej, jak to w
przyszłości poprawić.
Ale systemy udane też umierają.
Choroba
Patche, patche do patchy, obejścia, skrótowce, uwiązanie do nieudanych
API albo niefortunnych przyzwyczajeń użytkowników, ślady pośpiesznych
kompromisów, nieudokumentowane a niezbędne zachowania, mieszaniny
pomysłów wielu osób, coraz bardziej niepełne testy.
Klarowny kształt rozmywa się i rozpada. Coraz więcej miejsc, w których
strach cokolwiek zmienić, coraz więcej elementów żyjących własnym
niekontrolowanym życiem, coraz wszystko sztywniejsze, oporniejsze.
Kojarzy mi się to z chorobą.
Jeśli trwa to zbyt długo, jeśli zajdzie za daleko - następuje koniec.
Zmiany są już za trudne, za drogie, zbyt bolesne.
Zasłyszana z wiarygodnych ust anegdota: jeden z angielskich banków
nie wprowadza już żadnych zmian w swojej infrastrukturze informatycznej.
Nie tylko nie rozwija używanych aplikacji ale nawet nie aktualizuje
oprogramowania systemowego i nie modernizuje hardware.
Boją się cokolwiek ruszyć, bo nie umieją ocenić konsekwencji.
Śmiałem się. A potem przypomniałem sobie nigdy nie udokumentowane i
teoretycznie od ośmiu lat nieużywane API, ciągle krytycznie mi
potrzebne przy testach.
Starość
Z kolei przestarzałość jest częściej pretekstem niż prawdziwą
przyczyną. Argumentu o języku programowania sprzed piętnastu lat
łatwo użyć i łatwo jest go zrozumieć. Ale tak naprawdę często kryje
się za nim potrzeba przepisania od nowa zbyt już trudnej w utrzymaniu
aplikacji.
Więcej o nowościach będę chciał napisać przy innej okazji (lekko
zacząłem w bajce o programującym durniu). Może tylko jedna
uwaga: w tym samym czasie, w którym jedni narzekają na przestarzałość
C++, Javy, Perla czy SQL-owych baz danych, inni wdrażają nowoczesne
systemy pisane właśnie w tych technologiach. Albo z użyciem COBOLu,
CICSa oraz bazy na mainframe.
Jaki jest tu prawdziwy problem? Rekrutacja. Nowe, modne technologie są
powszechnie znane, a kto ich nie zna - chętnie się nauczy. Im narzędzie
starsze i mniej efektowne, tym trudniej odświeżać i poszerzać zespół.
Tak czy siak: starsze platformy lub narzędzia same z siebie jeszcze
nie muszą oznaczać śmierci systemu. O ile trwa jego rozwój funkcjonalny.
Brak duszy
Coraz bardziej jestem przekonany, że aby system żył, musi mieć duszę.
Musi stać za nim człowiek. Konkretny człowiek.
Czasem jeden lider, czasem jakaś stanowiąca trzon zespołu grupa. W obu
wypadkach - ktoś, kto ma jasną wizję danej aplikacji, stale pozostaje
zaangażowany w jej rozwój, jest zmotywowany, ma też niezbędne środki i
autorytet by autentycznie nadzorować prowadzone prace.
Ta rola nie musi być dożywotnia, pochodnię można przekazać następcy
(bywa to nawet korzystne jeśli pierwotny lider zaczyna się czuć
wypalony czy po prostu łaknie nowych wyzwań).
Ale nie można jej puszczać obiegiem.
Szczerze, serdecznie nienawidzę programistoroboczogodzinnego trybu
pracy, w którym doskakuje się do coraz to innej aplikacji, wstawia
taką czy inną łatę, po czym porzuca temat i biegnie do innych
spraw. By przy kolejnej wizycie znaleźć niespójne ślady działalności
paru innych osób.
To coś nie jest moje. Nie jest Twoje. Nie jest jego. Jest niczyje.
Nie ma duszy, więc będzie się rozwijać czysto reaktywnie,
chaotycznie, na chybcika. Rękami coraz bardziej niechętnych ofiar
łapanek, realizujących absolutne minimum i pozbywających się gorącego
kartofla przy pierwszej sposobności.
4+6+7+9+5+2+1+6
Widmo MS Project ciągle krąży. Nawet gdy narzędzie to nie jest
używane, pozostawia w głowach myślenie rolami a nie osobami oraz
sprowadzanie zadań do prostych zależności i szacowanych czasów
realizacji.
I dodawanie do 40.
Ziutek Nowak, trzeci tydzień października. 19 godzin na kilka drobnych
poprawek w projekcie A, 14 na testowanie projektu B, 7 zostaje, więc
niech zrobi jakieś zgłoszenie dotyczące C. Tak będzie efektywnie.
W rzeczywistości 8 godzin pójdzie na przełączanie kontekstu, od
technicznej reanimacji środowiska developerskiego po przypominanie
sobie, o co właściwie chodzi w projekcie. Drugie 8 zapłacą inne
osoby - wypytywane, muszące udzielać pomocy, pilnujące. Zaś skoro przy
samej pracy o motywację będzie trudno, końcowy efekt będzie gorszy,
niż gdyby Ziutkowi po prostu dano popracować przy A.
No - ale nic się nie może zmarnować.
Johanna Rothmann napisała (w
Manage It
): w mojej pracy wielozadaniowość jest
najważniejszą przyczyną opóźnień w projektach, projektów
nie dostarczających właściwych produktów czy dostarczających
produktów niewystarczającej jakości (...) Przerzucanie między
zadaniami może kosztować od 20% do 90% czasu.
Później radzi, by jeśli już jest to absolutnie niezbędne, ograniczyć
przełączanie kontekstu do weekendów, dając przynajmniej pełny tydzień
na pracę nad powiązanymi zadaniami w jednym projekcie.
Parę artykułów dyskutujących problem wielozadaniowości z
bardziej psychologicznego punktu widzenia można znaleźć
tutaj.
Paul Graham (w artykule o którym już niedawno wspominałem) ciekawie
komentuje samą sprawę
rozliczania pracy w oparciu o godziny - uznając to za wyraz bezradności
firm w ocenianiu działań pracowników. I do problemów indywidualnych
dorzuca aspekt społeczny. Ludzie zmuszeni do wykazania się czasem
spędzonym przy projektach nie tylko sami będą zdemotywowani
ale też będą przeszkadzać tym, którzy naprawdę pracują (choćby
masą niepotrzebnych spotkań i dyskusji).
Drugie życie
Aplikacja zbliża się do śmierci technicznej? Trudno.
Można przepisać od nowa.
To prawda.
Ale to kosztuje czas. Dużo czasu. Czasu, w którym nad starym wisi
już miecz, a nowego jeszcze nie ma. Wysiłku, który nie dostarczy
użytkownikom niczego nowego, co najwyżej trochę irytacji.
Do tego ta sama choroba, która zabiła stary system, czyni trudnym
ustalenie dokładnej funkcjonalności jego następcy. Po co właściwie
jest wywoływana ta usługa? Czy ktokolwiek wie, jak działa ten ekran?
Pośpiech i niewiedza mogą nawet sprowokować do skopiowania starego
bałaganu.
Boli też wdrożenie. Zastępowanie działającego ważnego systemu
innym jest dużo dużo trudniejsze niż pierwsza instalacja czy upgrade
do nowej wersji. Migracja danych. Ponowne szkolenie użytkowników
i administratorów. Przebudowa narzędzi administracyjnych (monitoring,
raportowanie błędów, procedury instalacyjne, ...). Strojenie wydajności.
A wszystko to przy konieczności utrzymania ciągłej pracy.
Nietrudno o przykłady spektakularnych niepowodzeń.
Swego czasu głośny był artykuł Joela Spolskiego, z bardzo krytyczną oceną
przepisywania aplikacji od nowa.
Pozornie autor wyszedł na durnia. Przeglądarka
Mozilla w końcu powstała, okazała się lepsza od starego Netscape, dziś
jako Firefox święci triumfy.
Trzeba jednak pamiętać, że ogromny udział miał w tym Microsoft, który na pięć lat wstrzymał
rozwój swojej przeglądarki (mając swoją rozsądną motywację - walcząc o zachowanie
przewagi desktopu nad WWW). Mało prawdopodobne, by gdziekolwiek powtórzyły
się aż tak korzystne warunki.
No i nie zapominajmy, że firma Netscape tego sukcesu nie dożyła.
Dorzucę jeszcze jedną rzecz, o której nie wspomniałeś wprost. Systemy starzeją się także z powodu złego zarządzania ludźmi. Gdy odchodzą z firmy, wraz z nimi odchodzi wiedza. Nie tylko nieudokumentowane funkcje systemu, ale także pamięć o wszystkich zgłoszeniach, problemach i możliwościach ich rozwiązania. Ta wiedza jest bezcenna przy przepisywaniu systemu od podstaw, ale nikt w ten sposób na nią nie patrzy. Nawet jeśli w zespole pozostało paru weteranów, to rzadko kiedy mają pełną wiedzę.
O wyliczaniu czasu mówił nie będę, każdy to przerabiał.