poniedziałek, 20 grudnia 2010

Wewnętrzne frameworki

Musiałem właśnie coś zmienić w projekcie, w którym ktoś wpadł na pomysł aby rozwiązać pewne problemy za pomocą wewnętrznego frameworka. A raczej stworzyć całą aplikację w oparciu o nigdzie nikomu nieznany framework. Na mojej prywatnej liście programistycznego zła wewnętrzne frameworki zajmują zasłużone wysokie miejsce. Nie twierdzę tu oczywiście, że nie ma dobrych wewnętrznych frameworków, ale ja się z takimi jeszcze nie spotkałem (a dawno temu sam jeden popełniłem zamiast poszukać czegoś uniwersalnego).

Wszystko zaczyna się od tego, że ktoś wpada na pomysł by coś przyspieszyć. "Zamiast pisać kod zróbmy sobie framework. Będziemy mogli łatwo dodawać kolejne funkcjonalności i w ten sposób oszczędzimy czas. I wszystko będzie uniwersalne i będziemy mogli to wykorzystać w kolejnych projektach".  Najczęściej żadne z założeń się nie sprawdza, funkcjonalności wykraczają poza możliwości frameworku co dodaje do niego kolejne narośle mające rozwiązywać nieprzewidziane wcześniej problemy. W ten sposób zamiast tworzyć kod aplikacji rozwijamy framework (który najczęściej jest w stanie zrozumieć tylko jego twórca), aby z satysfakcją dodać do naszej aplikacji jedną linijkę XML-a, tudzież jakiegoś wewnętrznego języka.Frajdy dodaje fakt, że tworzenie frameworku jest najczęściej zadaniem bardzo twórczym i przyjemnym. O wiele przyjemniejszym niż późniejsze korzystanie z niego.

Jak dla mnie największymi wadami wewnętrznych frameworków są:
- Brak jakiejkolwiek dokumentacji, co powoduje, że nowa osoba dowiaduje się o różnych smaczkach utykając na głupim błędzie, przez który pozostali programiści zdążyli już przebrnąć. W tym momencie Google, standardowe narzędzie programisty na nic się nie zdaje.
- Uzależnienie firmy, dla której tworzy się oprogramowanie od frameworku. Najczęściej jest to dla niej bilet w jedną stronę, bo znalezienie programistów, którzy chcieliby się babrać w utrzymywaniu cudzego frameworku... no cóż, graniczy z cudem
- Ograniczenie rozwoju programisty, który jest zmuszony pisać w nigdzie nie znanym frameworku. Po pewnym czasie faktycznie zaczyna rozumieć framework, ale wiedza ta jest kompletnie nieprzenośna. W żaden sposób nie poprawia to jego ogólnego technicznego obycia, bo co z tego, że jest frameworkowym ekspertem jeżeli nie jest w stanie tej wiedzy nigdzie indziej zastosować. Słowem, z każdą chwilą szanse na zmianę pracy maleją a frustracja rośnie.
- Brak 100% zaufania do frameworku - skoro powstał tylko na potrzeby danego projektu, to jesteśmy jego jedynymi użytkownikami. Niby są testy, ale skoro nawet w Hibernate mającym tysiące użytkowników znajdują się okazjonalne błędy, to możemy podejrzewać że w naszym też się znajdą, wtedy gdy się tego nie spodziewamy.

Z pewnością są sytuacje, w których napisanie frameworku w jakiś sposób się zwraca, jednak z tego co zaobserwowałem, najczęściej rodzi to frustracje ponieważ czegoś się po prostu zrobić nie da. Nauczka dla samego siebie, jeżeli kiedykolwiek będę miał możliwość wyboru czy tworzyć frameworki czy korzystać nawet ze skomplikowanych rozwiązań, które są ogólnodostępne, zdecydowanie wybieram to drugie.

7 komentarzy:

  1. Twój wpis można podsumować jednym skrótem: YAGNI. Zgadzam się w zupełności.

    OdpowiedzUsuń
  2. Przypomina mi to sytuację sprzed 2-3 lat, gdy szukałem pracy i trafiłem na rozmowę do jednej z większych polskich firm IT. Po standardowych pytaniach okazało się, że w projekcie, do którego miałem dołączyć używają tam:
    - własnego języka podobnego do HQL
    - własnego serwera aplikacji
    - własnego frameworku frontendowego
    Myślę, ale fajnie, Ci goście napisali własny HQL i własny serwer aplikacyjny! Ale to muszą być wymiatacze!
    Ale po chwili przyszła refleksja: popracuję u nich, powiedzmy, 2 lata i po tych 2 latach do CV dojdzie mi tylko 2 lata doświadczenia w Javie, bo przecież jaki jest sens umieszczania w CV znajomości serwera o nazwie MyCompanyInternalAppServer i frameworku MyCompanyInternalWebFramework? :)
    Odpuściłem sobie i w sumie nie żałuję, bo potem okazało się, że firmę nazywają polską odmianą pewnego dyskontu spożywczego :)

    PS: Fajnie by było, gdyby można było u Ciebie umieszczać komentarze podając tylko swoje WWW bez konieczności autoryzowania się przez Google, Wordpress, itp :)

    OdpowiedzUsuń
  3. Dyskont nie dyskont ale kase trzepie profesor.

    Kiedyś tam robiłem i generalnie dobrze wspominam te czasy duzo się nauczyłem i dobrego i złego (grunt, że na ogół wiedziałem, że złe to złe). O wlasnych serwerach aplikacji nie slyszalem (kto to kupi?) wiec to pewnie jakis ewenement był, pozostale rzeczy to się zgadzam, generalnie jak w kazdej firmie - zależy do jakiego projektu trafisz (czytaj: wszedzie panuje burdel i brak standardow - mniejszy badz wiekszy).

    Nie mam intencji bronienia tej firmy jedyne co to po paru latach perspektywy uwazam, ze wielu innych chcialby dojsc do ich poziomu (i mowie o wytarzaniu oprogramowania a nie sprzedazy).

    Niemniej jednak pisanie wewnetrznych frameworkow (i nie publikowanie ich jako OpenSource) jest złe. W zupełności zgadzam się z autorem.

    OdpowiedzUsuń
  4. @Tomasz - faktycznie, nie zauważyłem tego, dzięki. Co do własnego serwera aplikacyjnego - to na pewno byli wymiatacze:) W końcu znakomita większość programistów to tzw. "klienci", czyli użytkownicy serwerów, języków programowania i frameworków. Jeżeli ktoś napisał własny serwer aplikacyjny to należy mu się szacunek. Jeżeli posiada on dobrą dokumentację i są ludzie, którzy są odpowiedzialni za jego rozwój, to może to nawet mieć jakiś sens. Gorzej jeżeli coś jest rozwijane ad-hoc - "O, nie działa. To dopiszmy coś do naszego serwera aplikacyjnego".

    Pewnie wiele frameworków zaczynało swoje życie jako "wewnętrzne". Chociażby niektóre w Apache Software Fundation były wsparciem dla innego frameworka, ale tak jak Paweł pisze po jakimś czasie tworzył się z tego nowy opensourcowy framework.
    Z drugiej strony open source nie jest moim zdaniem żadnym wymaganiem. Jeżeli za technologią stoi duża firma to taki framework przestaje być już wewnętrzny i nie miałbym aż takich obaw tworząc w nim oprogramowanie.

    OdpowiedzUsuń
  5. Ja jak zwykle będę adwokatem diabła ;) Wewnętrzne frameworki to zło. Zazwyczaj ;)

    Bo jeżeli spojrzeć na niektóre dobrej jakości FW dostępne w sieci jako Open Source na różnych licencjach, takie jak chociażby Code Igniter, Symfony Ruby On Rails, to właśnie wcześniej były wewnętrzne frameworki, które ludzie z powodzeniem stosowali.

    Całe zło o którym piszesz z nienawiścią wg mnie nie dotyczy FR, ale raczej braku dokumentacji – i nie musi to być koniecznie framework, ale może być biblioteka, komponent czy cała aplikacja
    której bez dokumentacji (i testów) strach się dotknąć.

    Tu jeszcze poniżej miał być cały wywód, ale to chyba temat na dłuższą dyskusję przy herbacie ;)

    OdpowiedzUsuń
  6. Dlatego zamiast frameworków preferuję pisanie bibliotek. Jeśli, dajmy na to, mamy problem z wyświetlaniem czegoś na ekranie i po dłuższym zastanowieniu problem można uogólnić na różne przypadki zgodne także z poprzednimi projektami, to warto pomyśleć, nad napisaniem kilku oddzielnych klas i zapakowanie całej funkcjonalności w bibliotekę, której wykorzystanie zamknie się w paru linijkach kodu. Najważniejsze to umieć znaleźć poprawne uogólnienie, potem już można sobie twórczo pomarzyć o funkcjach nowego tworu. ;]

    OdpowiedzUsuń
  7. Biblioteka a framework,czyli szablon to nie to samo. To drugie tworzy pewien schemat dzialania aplikacji. Nie mozesz tak po prostu uznac ze dorzucisz do aplikacji np.Strutsow,ale jak najbardziej mozesz w dowolnym momencie zaczac uzywac np Jodatime. Framework to cos wiecej niz tylko zestaw klas, ktore mozesz uzywac gdy przyjdzie Ci na to ochota. Po poczatkowej decyzji zmiana staje sie coraz trudniejsza. I dlatego tak bardzo nalezy z tym uwazac.

    OdpowiedzUsuń