Jeszcze słowo o TDD

O TDD napisano wiele, sam napisałem całkiem sporo i mówiłem całkiem sporo podczas kilku prelekcji. Używam TDD od ponad 5 lat już. Powinienem być super mega ninja pro TDD master. Mimo tego jakiś czas temu, pisząc bardzo prosty kod, na prawdę super prosty, naszła mnie taka refleksja:

Jest zielone, jest ok.

[Fact]
public void Example_test()
{
    _pinger.Ping().Returns(c =>
    {
        throw new Exception();
    });
    Assert.DoesNotThrow(()=>_monitor.CheckAvaliability());
    _destinationSystem.Received(1).Ping(Arg.Is<IDiagnostics>(diag => diag.State == ""));
}

Powyższy kawałek kodu używa NSubstitute (.Ping().Returns(c=>…..) do mockownia. Oraz XUnit-a do testów. Napisałem test jak wyżej, napisałem kod. Niby wszystko zielone, niby ok. Jakimś cudem jednak pokusiło mnie, żeby dorzucić AutoData. AutoData to taki sprytny atrybut, który pozwala generować dane testowe. W moim przypadki Message z wyjątki ma znaczenie, dlatego stwierdziłem, że Message można spokojnie generować – tutaj kod jest taki, że mam pudełko, które jak zrobi coś złego to to złe ma wyjść z drugiej strony – case dla AutoData jak malowany.

[Theory,AutoData]
public void Example_test(string exceptionMessage)
{
    _pinger.Ping().Returns(c =>
    {
        throw new Exception(exceptionMessage);
    });<
    Assert.DoesNotThrow(()=>_monitor.CheckAvaliability());
    _destinationSystem.Received(1).Ping(Arg.Is<IDiagnostics>(diag => diag.State == exceptionMessage));
}

No i zonk!!! Test już nie bardzo to przechodzi. Pomyślałem, bez jaj, przecież implementacja jest tak prosta, że tego nie da się zepsuć – nawet nie wiem po co pisałem na to test, ale nie uprzedzajmy faktów…. Debug testu i….. okazało się, że jednak w kodzie gdzie łapię wyjątek, to oprócz logowania tak jak to powinno być to już message-a  nie przepisuję. Kto by pomyślał.

Testy jednostkowe nie dają 100% gwarancji, że powstanie kod bez bugów, nie dają nawet jakiejkolwiek gwarancji, co jednak dają, to dużo wyższą szansę, że powstały kod będzie miał mniej bugów niż bez testów. W moim przypadku, okazało się, ze prosta refaktoryzacja – lub bez AutoData dodanie kilku przypadków testowych, pozwoliła złapać buga zanim kod poszedł na produkcję.

Cena darmochy ciąg dalszy

tools

Szybko czas leci i od ostatniego wpisu minął prawie kwartał. Nawet nie wiem kiedy. W poprzednim wpisie marudziłem na FireBirda – pseudo bazę danych. Ciekawą polemikę podjął Gutek w swoim wpisie. Nie mogę się zgodzić jednak z

takie rzeczy mają prawo się dziać, w końcu, i tak mamy dostęp do naprawdę całkiem spoko bazy danych. A co w przypadku rzeczy które są „prawie” darmowe?

FireBird jest darmowy jednak nie do końca. Wymaga on pracy developera a ta kosztuje realne pieniądze. Zresztą:

nazywam „prawie” darmowe rzeczy, które są darmowe do ściągnięcia i nawet na siłę da się w nich za darmo programować, ale nie jest to już takie proste

No właśnie, praca z FireBirdem prosta nie jest co pokazał Michał Jawulski pokazując mi jak ustawić transakcje, żeby można było zrobić rename tabeli – sorry nie rename bo tego do  tej pory nie wiem jak zrobić – delete i recreate. Nie wspominając o 1=0 – ciągle mnie to zadziwia. To co mnie jednak najbardziej zadziwia to

Spójność danych

Okazuje się, że w FireBirdzie można w dla kolumy powiedzmy X która zawiera kilka nuli to tu to tam, dodać constraint not null. FireBird nie powie słowa. Ot doda not null constraint dla kolumny. Wszystko pięknie gra bo już nie wrzucimy nowego rekordu z nullem w kolumnie X i nikomu zupełnie nie przeszkadza, że w not null jest jednak null  (w starych danych). WOW ale najlepsze jest jak się zrobić backup – bo się zrobi. Tyle tylko, że już restore nie zadziała (podobno bo nie sprawdzałem osobiście – jak ktoś potrafi jednak użyć takiego backupa to proszę przemówić).

Złośliwy programista

No właśnie, co jeśli budując program w jakimś defaultowym słowniku programista niby przypadkowo, niby złośliwie, ot tak, wrzuci jakiś jeden null a potem doda not null i taką bazę będzie redystrybuował ze swoją aplikacją? Baza będzie nierestorowalna, więc w sytuacji ekstremalnej, gdzie admin w swojej niekompetencji nigdy nie sprawdzi czy restore działa, pewnego dnia obudzi się z zepsutą bazą i bez backupów (które mógł by użyć)….

… dlatego FireBird w mojej ocenie to pseudo baza, której powinno się unikać jak się da.

Cena darmochy

iStock_000024510285Small

Dobrze nazwana klasa, dobrze nazwana zmienna, dobrze nazwana tabela to połowa sukcesu w naszym zawodzie. Czytelny kod zdradzający już na pierwszy rzut oka intencje autora to skarb. Nie trzeba się głowić OCB, WTF, ot czytamy i wiemy co to to robić powinno. Jeśli jeszcze to robi to po prostu miodzik.

Dobra nazwa to podstawa!

No i taka sytuacja, nazwa tabeli w bazie dostała nie bardzo czytelną nazwę – autor użył skrótów bo baza FireBird pozwala na zaledwie 31 znaków w nazwie tabeli i za bardzo nawet nie można tego zmienić (http://stackoverflow.com/questions/20155517/is-it-possible-to-extend-firebird-table-name-length). Trochę później autor stwierdził, że trzeba zmienić tą nazwę na bardziej czytelną bo nic z niej nie wiadomo – nie wiedział jeszcze o nadchodzącej masakrze ale nie uprzedzajmy faktów.

Zonk… nie da się zmienić nazwy tabeli. Ot FireBird nie przewiduje takiej możliwości…. serio w “bazie danych” FireBird nie ma możliwości zmiany nazwy tabeli (http://www.firebirdfaq.org/faq363/). FB DBNazi mówił, że nazwa jest ok i żeby ją zostawić ale nie, biedak się uparł. Tabelka miała kilka zależności więc trzeba było poprawić skrypty, założyć nową tabelkę, tu poprzepinać tam pogłaskać, zabawa po pachy – idealnie na piątkowy poranek – tak przed weekendem. Jeszcze tylko usunąć starą tabelkę…..

…. taa…. kto by się spodziewał, że w FireBird nie bardzo można usunąć tabelkę jeśli ktoś jest podłączony do bazy. To nie ma znaczenia, że nikt nie używa tej tabeli, ot jest ktokolwiek podłączony to nie usuniesz nic bracie*. Baza testowo/developerska więc spoko, ubijemy co tam wisi, tylko że gdzieś 2 apache korzystały z tej bazy, jakieś 2-3 inne usługi gdzieś też posłusznie połączone, ja dziubiąwszy dodatek do outlooka również pośrednio cośtam ssałem z tej bazy. A… i jeszcze jeden dev pojechał na wywczas a na komputerze chyba zostawił aktywne połączenie IBExpertem (takie SQL Managemenet Studio tylko że płatne, brzydkie i wydające dźwięki – serio). Suma sumarum nasz biedny dev co to nazwę chciał mieć ładną, spowodował że prawie cały dział musiał zawiesić pracę a i kilku wdrożeniowców do pomocy przybiegło. Jak się wszyscy odłączyli a i on sam zrestartował IBExperta w końcu dostąpił zaszczytu usunięcia tabeli. Gromkie oklaski – serio klaskaliśmy temu kozakowi że dokonał tego – i już spokojnie możemy wszyscy ruszyć dalej pchać interaktorami encje w otchłań wszechmocnego FireBird-a.

*) nieprawdą jest że jeśli są podłączeni ludkowie to nie usuniesz nic. FireBird to taka “baza danych”, w której da się usunąć plik bazy w czasie pracy i serwer nawet nie zająknie. W wszystko dalej będzie ładnie działało w pamięci – ale już 1 tabelki to nieeeeee bo bezpieczeństwo bo acid bo transakcje czy co tam jeszcze.

Jeszcze mało?

select a,b,c
from whatever
where 1 = 0

Spowoduje oczywiście, przeskanowanie całej tabeli!!! Wszak dla każdej krotki trzeba sprawdzić czy aby na pewno warunek w where jest prawdziwy czy fałszywy.

Serio mało jeszcze?

No to podobno ze statystykami jest jakoś tak, że baza lepiej działa jak się zrobi backup i restore – ot tak profilaktycznie.

Jeśli chcesz skorzystać z tej super “bazy danych” to warto nadmienić, że FireBird jest darmowy – jeśli nie liczyć ogromu pracy potrzebnej przez wymienione powyżej kwiatuszki a to podobno nie wszystkie cuda jakie ofertuje to coś.

TDD is dead czyli telenowela dla jajogłowych

lodowka

David H Hannson, autor Ruby on Rails opublikował artykuł: http://david.heinemeierhansson.com/2014/tdd-is-dead-long-live-testing.html no i poszło… mleko się rozlało. Burza większa niż o sosnę (tą rozdartą – nie o brzozę, brzozy są niepolityczne).

tdd

Uncle Bob napisał http://blog.8thlight.com/uncle-bob/2014/05/11/FrameworkBound.html ale jak wieść gminna niesie to jest wersja politycznie poprawiona bo czyjeś uczucia religijne zostały obrażone – oryginalna wersja jest jeszcze w feedly i/lub cache googla. Generalnie wydarzyło się to tak szybki, że zanim przeczytałem artykuł to był już zmieniony – dobrze że koledzy z zespołu mi o tym powiedzieli bo dzięki nim przeczytałem oba te teksty.

Potem wielka debata Is TDD Dead z Martinem Fowlerem, Kentem Beckiem i Davidem Hannsonem, o której chyba pół internetu grzmiało (https://plus.google.com/events/ci2g23mk0lh9too9bgbp3rbut0k).

Następny odcinek czyli DHH problem http://codon.com/the-dhh-problem

W pracy pół poniedziałku TDD i tego samego dnia polska grupa celebryto.netowa wciągnęła się w telenowelę.

learn to use tdd

Co będzie dalej, gdzie ta telenowela się skończy? Podobno – znowu wieść gminna niesie że w 4 odcinku debaty Fowler – Beck – Hannson ma się okazać, że DHH jest synem (lub ojcem) Uncle Bob-a.

lodowka

Ci co oglądali South Park i pamiętają odcinek z piekłem i niebem wiedzą, że prawidłowa odpowiedź przyjdzie po śmierci (spoiler:  mormoni). Dla mnie na tą chwilę faktem jest to, że TDD jest trudne do ogarnięcia, ale nie trudne w podstawach bo te są łopatologicznie proste. Można je ogarnąć w kilka godzin czy dni. Problem jest taki, że wymaga to olbrzymiej determinacji od programisty oraz ciągłego trzymania się metodyki. Linijka po linijce, kawałek po kawałki dzień po dniu nabierać trzeba doświadczenia w TDD. Dzięki temu już po kilku latach jest szansa, że będziemy mieli wyczucie, kiedy używać TDD a kiedy nie, kiedy pisać wór testów na jedną mała klasę a kiedy napisać 5 testów na wór klas. Unit Testing testuje UNIT czyli jednostkę – jednostka to nie 1 klasa  czy 1 metoda, to może być zbiór klas. Żeby to czuć, kiedy iść w tą a kiedy w inną stronę to trzeba mieć dużo doświadczenia. Wydaje mi się, że czuję to, po ponad 4 latach z TDD (w różnym natężeniu), wydaje mi się, że to potrafię mimo, że jest jeszcze masa do nauczenia przedemną. Jedno jest pewne, TDD nie tworzy architektury i jej nie polepszy. TDD jedynie może zdegradować architekturę jeśli postawimy ołtarzyk tej metodyce. TDD to świetne narzędzie, które wymaga wprawy i umiejętności użycia.

Wg. mojej percepcji świata, TDD to przyszłość, to potężna umiejętność i warto w to inwestować. Jeśli mam rację to super, bo wszyscy przeciwnicy TDD odpadną z rynku i będzie jeszcze więcej miejsca. Jeśli się mylę, no cóż, zawszę mogę usunąć testy i wrócić do mozolnego „przeklikiwania” kodu lub zostać skrytym anonimowym tdd-owcem. Życie pokaże. Tymczasem czas iść do lodówki i mieć nadzieję, że telenowela tam nie zawitała, mieć nadzieję, że ostatni bastion spokoju u chłodu ostał się.

Windows 8 Pro za darmo !!!!

IMG_20140423_212429

Majowy weekend w pełni, słońce grzeje, pełen relaks. Microsoft podobno ma wydać Windows-a 9 zupełnie za darmo. Wydaje się to prawdopodobne skoro Windows Phone ma być za darmo dla urządzeń z xx” poniżej ileś tam.

Wszystko fajnie ale po co czekać. Zgarnij darmowego Windows 8 Pro już dzisiaj.

a Rafflecopter giveaway

Disclajmer: losowanie tylko dla uczestników z Polski – nie chcę wysyłać za granicę. Wartość nagrody – 1zł. Tyle zapłaciłem za pudełko. Jeśli ktoś ma z tym problem – proszę o kontakt, kopia faktury do wglądu.

Aktualizacja: Sprawdziłem dokładnie pudełko – to jest Uaktualnienie do systemu Windows 8 Pro (Win PRO 8 32-bit/64-bit Polish VUP DVD). Jeśli kogoś wprowadziłem w błąd – przepraszam.

Aktualizacja2:
Zwycięzcą został Krzysztof Gratuluję.