wycieczka do piekła

Im więcej różnych programistów lub zespołów roboczych pracuje nad projektem informatycznym w czasie całej jego historii, tym trudniej jest „zgrać” efekty ich działań i tym niższej jakości jest produkt tego projektu. Obserwacja ta wydaje się oczywista, wręcz banalna, a mimo to bywa zupełnie niepojęta dla przedstawicieli pewnego specyficznego, choć zadziwiająco popularnego nurtu zarządzania.

larum grają

Wbrew temu, co się niektórym wydaje, nie wystarczy znaleźć człowieka, który „zna” dany język czy środowisko i wrzucić go do zespołu na tydzień czy miesiąc aby poprawić kondycję projektu. Wiedza na temat technologii jest niemal zupełnie bez znaczenia wobec faktu braku znajomości danego projektu. Z drugiej strony z moich (zresztą równie oczywistych) obserwacji wynika, że tendencję do wchłaniania wszystkich „zasobów ludzkich” z okolicy przejawiają zazwyczaj projekty w mocno zaawansowanym stadium upadku. Zatem tym bardziej znajomość najróżniejszych „bo tak już jest” i „tak ma być”, których projekt w tym stadium jest pełny, jest niezbędna do tego, by w ogóle zrozumieć co się wokół dzieje.

Pomijam już fakt, że zwiększenie ilości „robotników” w projekcie powyżej pewnej masy krytycznej powoduje spadek ogólnej wydajności ze względu na ogromne (względnie) nakłady na komunikację. Przecież takiego nowego zawodnika nie można pozostawić samego — trzeba mu pokazać, nauczyć, wdrożyć, potem obserwować, kontrolować — trzeba mu poświęcić wiele czasu, którego na pewno nikt w tym momencie nie ma. Pomijam również to, jak (nie)wielu menadżerów zarządzających projektami informatycznymi zdaje sobie z tego prostego faktu sprawę. To kwestia zdolności lub braku zdolności kierowania ludźmi i ewentualnie wpływu polityki na sposób myślenia odpowiedzialnych za „human resources”. Natomiast bardziej interesująca wydaje się kondycja psychiczna programisty postawionego w takiej sytuacji...

przybyłem, zobaczyłem, uciekłem

Sytuacje werbowania wszystkich do projektu w stanie „musimy zdążyć, bo tak nam dołożą, że się nie pozbieramy” widziałem zdecydowanie zbyt wiele razy i wszystkie one wiązały się z bardzo silnym wrażeniem obrzydzenia. Nie chodzi już nawet o bałagan organizacyjny, o niejasne kompetencje, notoryczne niedotrzymywanie terminów najłatwiejszych nawet zadań, czy najróżniejsze drobne nieporozumienia — to są rzeczy oczywiste jeśli potraktujemy je jako ruchy przedagonalne. Moje obrzydzenie dotyczyło kwestii jakości produktu czy samego kodu nawet.

Na przykład co mam myśleć o programie, w którym występuje taka sekwencja wywołań metod:

pobierzListaPismDoWydruku()
getListaOdwolanDlaRaport()
dajListeOdwolanDoRaportu()

i na dokładkę istnieje jeszcze getter:

public Vector getListaPisOdw() {
return listaPismDoWydruku;
}

Gdzie tu jakakolwiek konsekwencja? Gdzie jakikolwiek schemat nazewnictwa? Na jakiej podstawie można się zorientować co jest wołane z czego i dlaczego?

W tym samym programie, kawałek obok znajduję np. taki niezwykle sensowy fragment:

this.lista = null;
if (this.lista==null)
...

Oczywiście znając historie projektu potrafię sobie dokładnie wytłumaczyć dlaczego ten kod wygląda właśnie tak — to po prostu efekt wielokrotnego „kopiowania z mniej-więcej-dostosowaniem nazw”, podpatrywania rozwiązań zastosowanych przez kolegów w innym, choćby lekko podobnym module i niejednokrotnie bezmyślnego kopiowania całych fragmentów. W efekcie metoda nazywa się tak, jak nazywała się trochę podobna w innym zupełnie miejscu, a jej kod zawiera to, co pozostało po wycięciu chyba-zbędnych fragmentów z innej chyba-podobnej metody.

I czy ktoś się tym przejmuje? Nie. Ponieważ większość zatrudnionych przy tym projekcie programistów nie czuje z nim absolutnie żadnego związku emocjonalnego — każdy jest tutaj tylko na chwilę, tylko po to, żeby „zaczęło działać”, tylko dlatego, że projekt się walił i zassał wszystkich z okolicy. W efekcie nikomu na tym kodzie nie zależy i każdy działa wg asekuracyjnego schematu „syf zastałem, syf zostawiłem”. A że brzydkie to jest jak nieszczęście..? No fakt, brzydkie, powolne i niekonserwowalne, ale ... „przecież to nie moje”.

dygresja - Java śmierdzi bardziej

Java jako platforma potęguje opisane powyżej zjawisko. I nie mówię tego dlatego, że Javy szczerze nienawidzę. Wręcz odwrotnie — nienawidzę jej właśnie dlatego, że potęguje wszelkie negatywne zjawiska jakie mogą wystąpić w projekcie informatycznym.

W projekcie opartym na Javie nie da się efektywnie uczestniczyć z doskoku. Nie da się wejść na chwilę, zrobić coś i zniknąć. To jest zbyt rozbudowane, zbyt pełne niejasnych zależności i (dla praktyka to pewnik) zbyt nieudokumentowane.

Oczywiście mówię tutaj o projektach rzeczywistych — Java jako platforma z punktu widzenia teoretycznych i akademickich rozważań jest świetna i piękna jak maszyna oszałamiająca mnogością błyszczących trybików. Jednak w rzeczywistości te trybiki są zawsze zardzewiałe, w różnych dziwnych miejscach wiązane drutem czy sznurkiem nawet, a wszystko dookoła śmierdzi zjełczałym smarem. Fuj... Jedyne pocieszenie — „to nie moje”. :-/

Komentarze

#1 | 2005.02.16 13:14 | gshegosh

A co proponujesz zamiast Javy? Czy wybór innej platformy może zastąpić wybór lepszego sposobu zarządzania ludźmi?

#2 | 2005.02.16 14:22 | MiMaS

A co proponujesz zamiast Javy?

Np. .NET, jeżeli oczywiście jest to możliwe ze względu na wybraną/narzuconą platformę systemową. Javę należy traktować jako zło konieczne i stosować wyłącznie w sytuacjach, w których nie ma innego wyjścia... IMHO oczywiście.

Czy wybór innej platformy może zastąpić wybór lepszego sposobu zarządzania ludźmi?

Oczywiście, że nie. Ale zauważ, że napisałem iż Java potęguje negatywne zjawiska, nie powoduje. Złe zarządzanie w sytuacji paniki, w jaką wpadają odpowiedzialni za bardzo upadający bardzo poważny projekt, jest rzeczą tyleż pewną, co zrozumiałą — panika właśnie na tym polega. A ponieważ projekt nie jest prowadzony idealnie od początku, to tym bardziej nie stanie się nagle z dnia na dzień przedsięwzięciem wzorcowym, prawda?

Javie, jako platformie, ośmielam się (nie po raz pierwszy zresztą) stawiać zarzut zbyt dużego skomplikowania, które powoduje, że problemy wynikające ze złego kierowania zespołami, dużej zmienności uczestników projektu, złego (lub braku!) projektu, braku wytycznych dotyczących kodowania czy nazewnictwa choćby, urastają do takich rozmiarów, że nikt i nic nie jest w stanie ich rozwiązać. Wyobrażam sobie, że gdyby projekt, o którym wspominam we wpisie, był napisany w technologii .NET (a ten akurat mógłby być), to nawet gdyby był pisany w różnych językach programowania, z wykorzystaniem webserwisów, czy czego tylko sobie życzysz, to i tak składałby się z mniejszej ilości komponentów i jako taki byłby do uratowania. A dodatkowo, co by nie mówić o jakości i/lub wydajności serwerów Microsoftu, to i tak całość rozwiązania byłaby IMHO wydajniejsza niż aktualny zestaw Tomcatów, JBossów i całego tego badziewia...

#3 | 2005.02.16 17:10 | [anonim]

Zauważ jednak, że zastosowanie .NETa nie rozwiąże problemu takiego, że programiści piszą pobierz/get/daj/wywróżListaPismDoWydruku. Nieuważny/nierozważny developer także w .NET może napisac:

this.lista = null;
if (this.lista==null)

Nie zauważam zresztą w takim np. C# jakichś specjalnych różnic względem Javy, które wymuszałyby pisanie bardziej eleganckiego kodu. Byc może ilośc komponentów użytych do tego samego zadania w .NET będzie odrobinę mniejsza niż w Javie, ale to pochodna młodszego wieku .NETa - gdy przejdzie on kilka cykli rozbudowy/przebudowy niektórych API, stanie się takim samym "potworkiem", jak Java.
Nie uważam .NETa za łatwiejszy od Javy. Więcej, większośc mechanizmów wygląda mi podejrzanie znajomo.
Ratowanie takiego projektu to głównie jego refactoring, a tu pole do popisu ma raczej IDE niż sama platforma; niekonsekwencje typu pobierz/get/daj usunąłbym w Eclipse dwoma kliknięciami, są narzędzia które wychwycą i niepotrzebny warunek w if.
Oczywiście, takie narzędzia istnieją także dla .NET i dyskusja zaczyna przypominac tę o wyższości jednych świąt nad innymi.
Za Javą moim zdaniem przemawia właśnie jej heterogenicznośc, jeśli JBoss z Cataliną mi nie pasuje, zawsze mogę wybrac Weblogica, OASa czy jeszcze coś innego.
Dla .NET istnieje tylko IIS. Co z tego, że będę miał - załóżmy - elegantszy kod, skoro i tak będzie on wysypywany przez serwer-kontener już przy obciążeniu 50 sesjami?

#4 | 2005.02.17 08:54 | MiMaS

Nie zauważam zresztą w takim np. C# jakichś specjalnych różnic względem Javy

Szanowny panie anonimie, nie chodzi mi o język jako taki - to doprawdy najmniejszy szczegół. Dlatego powyżej nadużywam słowa „platforma” aby zaznaczyć, że chodzi mi o zestaw miliona różnych komponentów, który składa się na „koszmar na Javie”, a nie o język. Do języka nic nie mam.

.NET [...] gdy przejdzie kilka cykli rozbudowy/przebudowy niektórych API, stanie się takim samym "potworkiem", jak Java.

Możliwe. Wtedy będzie trzeba się szybko rozejrzeć za czymś nowym, świeżym ;-)

niekonsekwencje typu pobierz/get/daj usunąłbym w Eclipse dwoma kliknięciam

Doprawdy? To poproszę instrukcję. Przypominam, że jest to sekwencja wywołań. Szczegóły (które uważałem dotychczas za mało istotne) wyglądają tak:

beanStronyJSP.pobierzListaPismDoWydruku()
--> jakasSmiesznaFasada.getListaOdwolanDlaRaport()
--> klasaKtoraNieWiemPoCoJest.dajListeOdwolanDoRaportu()
--> stadJuzNiedalekoDoEJBBazy

Czyli każda z tych metod jest w innej warstwie. Twoja instrukcja może być z obrazkami, jeśli łaska.

Dla .NET istnieje tylko IIS.

Kwestia czasu. Słyszałeś o mono?

A poza tym, o ile dobrze pamiętam, główna treść wpisu nie dotyczyła wyższości technologii jednej nad drugą, tylko raczej kanału jaki powoduje pisanie systemu z doskoku... Tak było czy tylko mi się wydaje? Więc może nie brnijmy za bardzo w dyskusje nie na temat, ok?

#5 | 2005.02.17 09:16 | gshegosh

Zapomniałem wypełnić podpis i zrobił się ze mnie anonim :)
Masz rację, dyskusja zabrnęła w złą stronę.

Co do refactoringu w Eclipse, to proponuję zainteresować się pozycją "Refactoring" w kontekstowym menu, gdy kursor znajduje się w edytorze na nagłówku metody. By do tego nagłówka przeskoczyć, wystarczy Ctrl+Click na nazwie klasy, gdzie metoda jest wywoływana.
W prosty sposób można zmienić nazwę metody (automatycznie we wszystkich miejscach jej wywołania) a nawet jej sygnaturę.
Można też łatwo przenieść metodę z klasyNieWiemPoCoOnaJest do superRozsadnieUzywanejKlasy.

 

Uwaga: Ze względu na bardzo intensywną działalność spambotów komentowanie zostało wyłączone po 60 dniach od opublikowania wpisu. Jeżeli faktycznie chcesz jeszcze skomentować skorzystaj ze strony kontaktowej.