Google wave – first immpression

First of all – developers in google are probably always in good mood:

Nic dziwnego, że do tej aplikacji jest na razie ograniczony dostęp

Nic dziwnego, że do tej aplikacji jest na razie ograniczony dostęp

Secondly – it’s great to have the ability to answer a particular question sent to You. Those messages looks like posts on bulletin board. But the difference is that they are forming a tree. And You can answer in any place. So in one Wave one can have multiple and parallel conversations.
As an addition – some of branches can be a discussion that is not visible to other whole-discussion-participants

wave example

wave example

Of course – it’s nothing new if You have seen this famous google video about wave.

But what wasn’t at the film?

The most awkward thing is that after a few minutes of live discussion (with someone who’s online) – You are starting to have that feeling, when You write an ordinary e-mail that recipients can actually see what You are writing. It’s incredible. This is how wave work – when You edit a post – everyone can see while You write this.
Just few minutes of that kind of conversation. You say bye to Your wave buddies. Starts to write an old fashion e-mail, typing, typing. Then You want to delete one sentence that should be different and… wait a sec! Did anybody could see that? And after a few seconds You think “No, wait!” it’s just an e-mail. phew! ;)

I didn’t find the way to disable that. There’s “draft” check-box, but it’s disabled for now. I think it would be nice if I could use check that out permanently.

Anyway – it IS a new way to communicate, which can make the way’s we talk to each other on the Internet significant different.

- from the traditional e-mail we have that different servers can communicate. Not like in IM – when someone’s in other network – can’t talk to him.
- from boards (or Gmail) there’s threads in conversation
- from IM it’s online talk, but on steroids: Your buddies see what You type BEFORE You hit “send”. So everybody is watching Your typo’s instantly… ok, maybe if they’re on the other side of the planet it’s not that “instant”* :D

* greets for Azmath from India

Ok, that’s it.
Now I have suprise. I have two invitation’s to wave left. If You can’t wait for public – You can participate in my contest:
If You are interested in this new toy from uncle Google – write about it on Your blog and send trackback (pingback, whatever) to me. From every trakcbacks I’ll pick up two lucky bloggers randomly, and send them some invitations.

The contest is till 31.10.2009 till midnight! After that I’ll try to contact with winners.

Monitor pozycji google na moim ulubionym hostingu

Mój ulubiony hosting potwierdza, że jest naprawdę fajny i ciągle się rozwija.
Ostatnio postanowił ukłonić się w kierunku pozycjonerów dodając prosty monitoring pozycji google’a dla konkretnej frazy.
Właśnie dodałem sobie kilka fraz do monitorowania (z pomocą przyszedł Google Analytics bo nie pozycjonuję tego bloga aktywnie, więc potrzebowałem podpowiedzi co do frazy, którą chcę monitorować :P)

Oryginalna wiadomość w serwisie informacyjnym Hostingu Vipserv

Na prośbę klienta zajmującego się pozycjonowaniem opracowaliśmy nową opcję do panelu – monitor pozycji w google. Opcja raz dziennie sprawdza pozycję danego adresu w wyszukiwaniu na podaną frazę i zapisuje dane do historii. Z danych sporządza wykresy zmian oraz info o zmainach w ost. 1,3,7 dniach. System może wysyłać raport podsumowujący na ustawione adresy email, codziennie po generacji.
Opcja generalnie normalnym użytkownikom nie będzie specjalnie przydatna. Narzędzia webmastera google dla pojedyńczych witryn spełniają lepiej zadanie. Polecamy zapisanie się do narzędzi webmastera google. Pozwalają one na monitorowanie słów kluczowych powodujących odwiedziny oraz wyświetlenia a w połączeniu ze statystykami google analytics pozwalają na monitoring niemal każdego aspektu odwiedzin na stronie.

TDD na żywym organiźmie

Jakiś czas temu próbowałem nauczyć się stosowania TDD na “testowym” projekcie. Niestety testowanie kontrolerów i widoków wydało mi się zbyt problematyczne.

Pod wpływem zgłębianiu tematu przy okazji pisania pracy magisterskiej zacząłem też myśleć o tym, że pokrycie kodu testami w 100% może nie być możliwe – szczególnie w przypadku, gdy technika ta nie jest znana zespołowi. Jako, że podoba mi się podejście “sztuki rzeczy możliwych” – pomyślałem, że przynajmniej trzeba mieć unit testy w miejscach krytycznych. Zakładając, że stosujemy uczciwie podejście fat model, skinny controller – większość krytycznych elementów znajduje się właśnie w modelach.

Modele łatwiej jest testować niż “wyższe” warstwy modeli MVC, więc tym bardziej wspomniana zasada wydaje się być ważna.

Ostatnio w projekcie natknęliśmy się na ciekawy przypadek. W bazie istniały obiekty, do których mogli być przypisani właściciela (wiele właścicieli do wielu obiektów):
Object habtm Owner
Dodatkowo to przypisanie było ograniczone czasowo, tzn.:
Object1 jest powiązany z OwnerA od 15 marca 2009 do 31 lipca 2009
oraz
OwnerB jest powiązany z Object1 od 01 czerwca do nie_wiadomo_kiedy (to znaczy, że aktualnie jest przypisany, ale nie wiadomo, kiedy ten stan się zakończy, nazwę to przypisaniem otwartym na potrzeby tego wpisu).

Możliwa była sytuacja, gdy Owner1 jest przypisany do ObjectA tak jak w przykładzie powyżej i od 01 listopada do nie_wiadomo_kiedy też z ObjectA.

Nie zagłębiając się więcej w szczegóły dodam tylko, że potrzebna była metoda, która odpowie na pytanie “czy dla danego Object, Owner i danych dat początkowej i końcowej mogę dodać powiązanie?”.

Członek zespołu zabrał się za to zadanie i po jakimś czasie skończył. Jednak wyznał szczerze, że nie jest pewien, czy ten fragment dobrze działa. Problem zdawał się rosnąć w momencie używania przedziałów otwartych z prawej strony. Pomyślałem, żeby zamiast ślęczeć nad kodem przez najbliższą godzinę i ręcznie testować przypadki – pobawić się w TDD.

Może nie bardzo podobało się to programistce, która nad kodem aktualnie pracowała, ale kod ten został wywalony – łatwiej jest stosować TDD gdy zaczyna się od zera (przynajmniej na moim, bardzo początkującym poziomie). Pracowaliśmy od teraz wspólnie nad kodem.

Podejście było takie, żeby dodawać coraz to kolejne kombinacje testów – dodanie powiązania z konkretnymi datami gdy w bazie istnieje przypisanie zamknięte, próba dodania przypisania otwartego gdy w bazie jest zamknięte i wszystkie możliwe kombinacja. Wyszło ich około 20*.

(*) możliwe, że niektóre przypadki są bardzo podobne i się dublują – chciałem jednak mieć je wymienione explicite

Proces wyglądał następująco:
1. test przypadku
2. fail testu
3. poprawa testowanej funkcji
4. pass wszystkich testów
5. test dla następnego przypadku
6. fail testu

Gdy była możliwość dokonywany był refaktoring testowanej funkcji, a raz nawet refaktoring samych testów.

Jaki był bilans tego działania? Pomyślmy jak wyglądałoby życie, gdybyśmy podeszli do tego problemu “po staremu”

Zajęło by to jakąś godzinę, mielibyśmy “dość mocne przekonanie”, że metoda spełnia wymagania. Jednak raczej staralibyśmy się uniknąć dotykania tego fragmentu w przyszłości, bo to oznaczałoby przeprowadzenie testów ręcznych od początku.
Nie posiadalibyśmy jednak twardych dowodów na to, że wszystkie testy zostały przeprowadzone – tylko silne poczucie, że “raczej tak”.

Jak to wyglądało z TDD?
Zajęło to około 4 godzin. Mamy twarde dowody na to, że wszystkie przypadki, które wymyśliliśmy są testowane. Mogą być przetestowane w każdym momencie. Znaleźliśmy błąd polegający na niesprawdzaniu, czy data startowa powiązania jest mniejsza niż końcowa. W efekcie tych działań otrzymaliśmy bardzo przyjemną funkcję logiczną, którą z przyjemnością wrzuciliśmy do funkcji beforeValidate testowanego modelu, aby żaden zapis nie mógł się odbyć przy nieodpowiednich danych.
Gdyby klient zaskoczył nas zmianą wymagań dot. zasad, które zaimplementowaliśmy – bez większych problemów można zabrać się za ich modyfikację pilnując, żeby dotychczasowe testy, które jeszcze są aktualne, przechodziły.
Jako bonus – jeden z członków zespołu dowiedział się czegoś więcej o TDD.

Dlatego jeśli myślisz, że TDD jest przerażające, bo wymaga pisania testów wszędzie (jak ja myślałem na początku), to możesz spróbować stosowania TDD tylko w krytycznych miejscach. Najczęściej w modelach. Kto wie, może po jakimś czasie, gdy oswoimy się z tą techniką pojawi się jakaś koncepcja, żeby zastosować TDD w kontrolerach a później widokach?