Podsumowań projektu część druga: co sobie chwalę?

Po wytknięciu samemu sobie niedociągnięć i zaniedbań w pracy nad projektem, mogę z czystym sumieniem podsumować to, z czego jestem zadowolony.

Spełnienie wymagań konkursu
Wymagania konkursowe nie były zbyt obszerne: należało przez minimum dziesięć tygodni pracować nad dowolnym projektem, efekty pracy opisując na blogu. O spełnieniu tych wymagań mówić mogę dopiero dzisiaj, ponieważ ten wpis jest dwudziestym poświęconym konkursowi, a dopiero taka liczba notek, według regulaminu, jest przepustką do etapu głosowania. Jak widać, ten niepozorny wydawałoby się wymóg, okazał się nie być wcale prosty do zrealizowania. Tak czy inaczej, udało się. Udowodniłem sobie, że potrafię zmotywować się i dostosować do narzuconego z góry tempa pracy. Traktuję to jako cenne doświadczenie, ponieważ nigdy wcześniej nie miałem takiego sprawdzianu.

Daj się poznać!
O ile do spełnienia wymagań konkursu zobowiązywał reguamin, o tyle wypełnienie jego idei zależało już tylko od uczestników. Z satysfakcją stwierdzam, że konkurs był świetną okazją i do „dania się poznać”, i do „poznania”. Regularnie odwiedzałem blogi uczestników, a także innych bloggerów, czy to z ciekawośći, czy to w poszukiwaniu wiedzy. W kwestii „dania się poznać”, muszę wyrazić bardzo pozytywne zaskoczenie. Po pierwsze, nie spodziewałem się tak dużej liczby odwiedzin na blogu. Po drugie, wiele komentarzy zadziwiło mnie ilością ciekawych informacji o tematyce związanej z fakturami VAT, za co dziękuję ich autorom.
Garść statystyk:
– liczba odwiedzin bloga: 3821;
– „busiest day”: 6.09.2010 (150 odwiedzin);
– liczba wpisów konkursowych: 20;
– najpopularniejszy wpis: Postać Docelowa Faktury (562 odwiedzin);
– liczba „wydotnetomaniakowanych” wpisów: 6.

Nauka
Celem konkursu, nie mniej istotnym od dołączenia do internetowej społeczności .NET-owej, było poznanie nowych technologii i praktyk programistycznych. Na tym polu osiągnąłem satysfakcjonujące rezultaty (nie udało mi się tylko poznać zbyt wielu wzorców projektowych, o czym pisałem ostatnio). Przede wszystkim, stworzyłem swój pierwszy projekt w ASP.NET MVC, co planowałem już od dłuższego czasu. Poza tym, zdobyłem podstawowe doświadczenie w korzystaniu z repozytorium kodu i przeprowadzaniu testów jednostkowych. Napisałem także kilka funkcji w jQuery i nauczyłem się generować dokumenty PDF. Oprócz doświaczenia praktycznego, zdobyłem sporo wiedzy teoretycznej, dotyczącej wszystkich tych zagadnień. Mam nadzieję, że przynajmniej kilku Czytelnikom przydały się informacje i linki zamieszczone na blogu.

Motywacja i efekt końcowy
Tutaj krótko: obawiałem się po cichu, że po pierwszym tygodniu trwania konkursu, moja motywacja stopnieje i praca stanie w miejscu. Na szczęście tak się nie stąło – udało mi się połączyć kodowanie i dość intensywne korzystanie z wakacji, a później, w październiku, poświęcić projektowi trochę czasu pomiędzy zajęciami na uczelni, a „życiem studenckim”. Udało mi się zrealizować wszystkie założenia projektowe, zaimplementować najważniejsze funkcjonalności i stworzyć poprawnie działającą, choć prostą, aplikację.

Posłowie
Udział w konkursie uznaję za naprawdę wartościowe doświadczenie. Jestem zadowolony z ilości zdobytej wiedzy, poznanych technologii, odwiedzonych blogów i przeczytanych artykułów. „Fizyczny” efekt tej kilkunastotygodniowej przygody znajduje się tutaj.
Na koniec chciałem podziękować wszystkim, którzy śledzili proces powstawania InvoiceInvoker. Przy okazji zachęcam do wzięcia udziału w ankiecie kończącej konkurs!

Podsumowań projektu część pierwsza: co się nie udało?

Już za cztery dni koniec konkursu Daj się poznać – przyszedł więc czas na podsumowanie tych piętnastu tygodni. Ogólnie mogę powiedzieć, że swój udział w konkursie uważam za udany. W dzisiejszym wpisie nie będzie to widoczne, ponieważ trochę ponarzekam. Aby jednak narzekanie nie było tylko pustosłowiem, postaram się wyciągnąć wnioski ze swoich niepowodzeń.

Test-driven development
Na pierwszy ogień biorę testy jednostkowe. Początkowo pisałem je systematycznie, zachowująć zasady Test-driven development. Później jednak wróciły stare przyzwyczajenia i po zaprojektowaniu klasy, przechodziłem od razu do jej implementacji; testów jednostkowych używając właściwie jedynie jako wygodnego narzędzia do uruchomienia pisanej biblioteki (co prawda, cały czas spełniały swoją rolę – wykrywały ewentualne błędy). Kiedy zabrałem się za warstwę prezentacji, możliwość zobaczenia aplikacji w akcji, przyćmiła chęć pisania testów, co uznaję za niepowodzenie. Po przeczytaniu artykułu Piotra Zielińskiego o testowaniu aplikacji ASP.NET MVC dowiedziałem się jednak, że testowanie to niewiele odbiega formą od testów, które napisałem dla pozostałej części projektu. Mogę więc powiedzieć, że zdobyłem podstawową wiedzę teoretyczną i praktyczną o TDD. Na reprymendę zasługuje za to moja samodyscyplina.
Wniosek na przyszłość: przy pracy nad przyszłymi projektami przyda mi się więcej dyscypliny i dbałości o „best practices”. Być może dobrze zrobiłby mi udział w projekcie zespołowym.

Wzorce projektowe
Krótko: wzorzec repozytorium to sporo mniej, niż chciałem przyswoić i zaimplementować. Poczytałem co prawda o popularnym wzorcu singleton, ale nie znalałem w projekcie miejsca, w którym jego implementacja byłaby naturalna i niewymuszona. Natomiast ucząc się ASP.NET MVC 2, chciałem najpierw wypracować własne stanowisko i podejście, a dopiero później skonfrontować swoje rozwiązania z tymi ogólnie przyjętymi.
Wniosek na przyszłość: powinienem poświęcić trochę czasu na lekturę związaną z wzorcami projektowymi, aby znać miejsca odpowiednie do ich zastosowania jeszcze przed etapem projektowania aplikacji.

Ostateczna forma aplikacji
W obecnej formie, InvoiceInvoker na pewno nie powala ani wyglądem, ani wygodą użytkowania. Nie jest gotowy do „użytku publicznego”, choćby ze względów bezpieczeństwa (przykładowo dlatego, że identyfikatory encji bazy danych to po prostu kolejne liczby całkowite, a nie GUIDy). Dlatego też nie zdecydowałem się na jakikolwiek hosting. Zapraszam jednakże do ściągnięcia źródeł (kiedy opublikuję ich ostateczną postać) i lokalnego uruchomienia aplikacji – wszystkie planowane funcjonalności udało mi się zaimplementować. Co do wyglądu i wygody użytkowania: cóż, przede wszystkim jest to projekt służący jedynie nauce, zdobyciu doświadczenia. Nie bez znaczenia jest też to, że pracuje nad nim tylko jedna osoba – która na dodatek nie posiada rozwiniętego zmysłu estetycznego. Co za tym idzie, arkusz stylów aplikacji niewiele różni się od domyślnego, wygenerowanego automatycznie przez Visual Studio.
Ciężko w tym przypadku o wniosek na przyszłość, ponieważ właśnie takiej postaci aplikacji się spodziewałem. Mimo wszystko, faktem jest, że postać ta nie jest w pełni satysfakcjonująca.

Blogowanie
W tej kwestii mam mieszane uczucia. Z jednej strony, treści i formie wpisów nie mam zbyt wiele do zarzucenia (może tylko tyle, że zbyt duża ich część traktowała sucho o napisanym kodzie, a za mała o teorii, czy tematach okołoprogramistycznych). Z drugiej – częstotliwość pojawiania się notek, a także ilość czasu poświęcona na napisanie każdej z nich sprawia, że nie jestem z siebie zadowolony. Początkowo zapowiadało się nieźle, publikowałem dwa lub trzy wpisy tygodniowo. Z biegiem czasu częstotliwość malała, aż w końcu się odwróciła: pisałem raz na dwa tygodnie. Ma to oczywiście związek z końcem wakacji i początkiem roku akademickiego. Tak czy inaczej, w dalszym ciągu nie wypełniłem wymagań konkursowych – ten wpis jest dopiero dziewiętnastym z dwudziestu wymaganych.
Wniosek na przyszłość: wygląda na to, że raportowanie własnej pracy nie jest dla mnie. Być może po zakończeniu konkursu, kiedy tematyka wpisów nie będzie ograniczona żadnym regulaminem, blogowanie stanie się dla mnie łatwiejsze i przyjmniejsze.

Powyższe niedociągnięcia i zaniedbania nie są na szczęście na tyle poważne, abym zaczął rozważać zmianę planów dotyczących przyszłego zawodu. Tworzą za to listę aspektów związanych z tym zawodem, nad którymi muszę jeszcze popracować.
Aby nie zostawiać Czytelnika z poczuciem, że mój udział w konkursie to nic więcej, tylko pasmo porażek, zapraszam do przeczytania kolejnego wpisu, w którym podsumuję korzyści wyniesione z tego udziału.

Zmiana planów

Minął zaledwie tydzień odkąd zacząłem swoje zmagania z projektem DigitalWallet, a już postanowiłem zawiesić prace nad nim. Nie nie jest to jednak konsekwencją mojego lenistwa, a faktu zorganizowania przez Maćka konkursu Daj się poznać!, w którym, nie bez pewnych oporów, zdecydowałem się wystartować. Opory wynikają oczywiście ze zbieżności niektórych danych – jak nazwisko, imię ojca, adres zameldowania itd. – moich i organizatora. Dlatego na czas trwania konkursu Maciek przestaje być moim bratem i organem podsuwającym pomysły i rozwiązania. Co więcej, każdy remis (o jakim mowa w punkcie 10.b. regulaminu) przegrywam, a także, gdybym za sprawą uśmiechu losu uzyskał najwięcej głosów w fazie wyłaniania zwycięzcy, zrzekam się pierwszeństwa wyboru nagrody na rzecz osoby (lub osób remisujących) z miejsca drugiego. Mam nadzieję, że takie warunki (skonsultowane z organizatorem i przez niego zaakceptowane) rozwieją ewentualne podejrzenia o „ustawienie” konkursu, tak jak rozwiały moje wątpliwości co do etyczności i stosowności mojego w nim udziału.
Abstrahując od kwestii pokrewieństwa: konkurs tej formuły jest zbyt rzadką i zbyt kuszącą okazją, by z niej nie skorzystać. Stanowić będzie to, czego najbardziej brakuje uczącemu się programiście: źródło motywacji, a także sposób i szansę na zaistnienie w dev-społeczności. Wystartuję w nim z projektem innym niż ten rozpoczęty tydzień temu (powodem znowuż jest zbytnie powiązanie z Maciejem), choć pozostanę w tematyce „ekonomicznej” – mój projekt konkursowy to program służący do wystawiania i przechowywania faktur, którego wyimaginowanym odbiorcą jest przedsiębiorca szukający nieskomplikowanej (tzn. służącej jedynie za elektrniczną bazę faktur, nieoferującej wyliczania podatków i wypełniania PIT-ów) aplikacji tego typu.
Mój pośpiech w podejmowaniu decyzji o udziale w konkursie i wyborze projektu wynika stąd, że za kilkanaście godzin wyruszam na wakacje. Wracam w pierwszych dniach sierpnia i zamierzam od razu zabrać się do pracy – nie tracić cennych dni na rozterki i szukanie pomysłu na projekt konkursowy.