Professional Scrum Developer I

Scrum Komentarze (0) »

Professional Scrum Developer II znów się pochwalę… udało mi się zdać egzamin i zdobyć certyfikat Professional Scrum Developer I.

Podobnie jak egzamin PSM I, tak i PSD I składa się z 80 pytań w języku angielskim typu: true/false, jedno i wielokrotnego wyboru na które mamy 60 minut. Próg zdania jest znów taki sam jak w przypadku PSM I i wynosi 85%. Samo podejście kosztuje 200$ (na szczęście firma mnie sponsorowała :) ), i tu oba egzaminy się różnią :)

Test ukończyłem ze sporym zapasem, ponad 15 minut i wynikiem 88.8 %. Nie ukrywam stresowałem się trochę … No i w sumie blisko granicy niezdania byłem. Poniżej podsumowanie jakie otrzymałem po zakończeniu. Nie ukrywam, że biorąc pod uwagę, iż posiadam już certyfikat PSM I wstyd mi za wynik z Scrum Framework ….

psd

Jeśli chodzi o przygotowania to było ciężko ze znalezieniem materiałów. Ostatecznie korzystałem z:

No i w zasadzie tyle. Co warto wspomnieć - ponownie jak w przypadku PSM I, masa pytań z Developer-Open-Assessment się powtórzyła na egzaminie. Warto na pewno powtórzyć sobie jeszcze zagadnienia takie jak:

  • metryki kodu,
  • Scrum of Scrums,
  • burn-down charts,
  • TDD, BDD, ATD, …,
  • repozytorium kodu (branche, merge)

Professional Scrum Master I

Scrum Komentarze (4) »

PSM IMuszę się pochwalić: zdałem dziś egzamin i tym samym jestem posiadaczem certyfikatu: Professional Scrum Master I :)

Szczerze mówiąc egzamin okazał się znacznie łatwiejszy niż przypuszczałem, ale zacznę od początku.

Sam egzamin to 80 pytań typu true / false lub wielokrotnego wyboru w języku angielskim, na jego ukończenie mamy 60 minut. W internecie na innych blogach można znaleźć informacje, że jest to niewiele czasu, ale wg mnie bardzo dużo (ukończyłem w ok 36 min) i jeśli ktoś ma taką potrzebę spokojnie może się zastanowić nad niektórymi pytaniami. Żeby zdać egzamin trzeba mieć 85% poprawnych odpowiedzi. Mi udało się uzyskać wynik 95%. Podejście do egzaminu kosztuje 100$ (no i niestety jest tylko jedno “życie”, czego bardzo się obawiałem).

Do egzaminu przygotowywałem się następująco:

  • Przeczytałem Scrum Guide po Polsku
  • Przeczytałem Scrum Guide po angielsku
  • Przeczytałem Scrum Primer 2.0
  • Rozwiązywałem Open Assessment na Scrum.org wielokrotnie (aż miałem za każdym razem 100% - ze 30 razy pewnie by się uzbierało) - UWAGA masa pytań pokrywa się z tymi w Open Assessment więc warto “znać je na pamięć” - oszczędzamy wtedy czas na trudniejsze pytania no i zyskujemy “darmowe” punkty.
  • Wykupiłem “Mocki” na testtakeronline.com (20$ które na prawdę warto wydać) - tu chyba 50 razy zrobiłem pytania w trybie Quiz i 4 razy podchodziłem do mocka - ale zawsze miałem 81 - 84%. Polecam do obycia się z typem pytań.

Oczywiście wcześniej przeczytałem kilka książek o Scrumie (m.in. “Scrum. O zwinnym zarządzaniu projektami”, “agile w praktyce”) ale do testu to one raczej nie są koniecznością (chociaż obie mogę polecić !!!).

No to teraz trzeba się brać do roboty i poprawnie wdrożyć wiedzę w życie …

UPDATE: obecnie “wejściówka” na egzamin kosztuje 150$

jUnit + Reflections by zaoszczędzić kilka chwil

Java Komentarze (0) »

Kilka razy (… ok może kilkanaście ;) ) zdarzyło mi się napisać klasy reprezentujące encje Hibernate i zapomnieć dopisać je do XML’a z mappingiem. Te niedopatrzenie wychodzi na jaw w momencie deploy’u aplikacji. No ale żeby wiedzieć co jest grane trzeba zajrzeć do logów. Wiadomo nie zajmuje to może jakoś specjalnie wiele czasu ale na pewno rozbija rytm pracy i nie potrzebnie zmusza do przeszukiwania logów.

Plan jest taki: Piszemy jUnitowy test, który sprawdzi czy czasem nie zapomnieliśmy o umieszczeniu wpisu z mappingiem w XML’u dla którejś z encji.

Każda encja jest oznaczona adnotacją @Entity (jeśli używamy adnotacji oczywiście), więc najpierw musimy znaleźć wszystkie klasy oznaczone tą adnotacją, a potem sprawdzić czy odpowiedni wpis znajduje się w pliku XML.

Aby znaleźć wszystkie klasy oznaczone @Entity najlepszym rozwiązaniem wydaje się użycie mechanizmu refleksji. Ja poszedłem na łatwiznę i wykorzystałem bibliotekę Reflections - która dostarcza wysokopoziomowego API.

OK w takim razie w jaki sposób wyszukać wszystkie klasy adnotowane @Entity ?

 Set> set = new Reflections(pakiet).getTypesAnnotatedWith(Entity.class);

W ten sposób zyskujemy dostęp do wszystkich klas adnotowanych @Entity znajdujących się w pakiecie pl.kedziorski. Z obiektu Class łatwo wyciągnąć pełną nazwę klasy, którą umieszcza się w pliku z mappingami.

  clazz.getCanonicalName();

Teraz wystarczy już tylko sprawdzić czy plik XML z mappingiem zawiera znalezioną nazwę.

private Boolean isContainingMapping(String className){
		BufferedReader br;
		try {
			br = new BufferedReader(new FileReader(hibernateMappingFilePath));
 
			String line;
			while ((line = br.readLine()) != null) {
			   if(line.contains(className)) {
				   br.close();
				   return true;
			   }
			}
			br.close();
			return false;
		} catch (IOException e) {
			return false;
		}
	}

Akurat tu sprawdzam linijka po linijce - można by wykorzystać fakt, że mamy do czynienia z plikiem XML i zrobić to znacznie ładniej, ale nie o to mi chodzi. Całość testu, który zabezpiecza zapominalskich przed niepotrzebnym wrzucaniem builda, który i tak się nie uruchomi wygląda następująco:

 import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Set;
 
import javax.persistence.Entity;
 
import org.junit.Assert;
import org.junit.Test;
import org.reflections.Reflections;
 
public class HibernateMappingsTest {
	private static final String hibernateMappingFilePath = "src/main/webapp/WEB-INF/database/DataSource.xml";
	private static final String pakiet = "pl.kedziorski";
 
	@Test
	public void testMappings(){
		Set> set = new Reflections(pakiet).getTypesAnnotatedWith(Entity.class);
		for (Class<!--?--> clazz : set) {
			Assert.assertTrue(isContainMapping(clazz.getCanonicalName()));
		}
		Assert.assertTrue(true);
	} 
 
	private Boolean isContainMapping(String className){
		BufferedReader br;
		try {
			br = new BufferedReader(new FileReader(hibernateMappingFilePath));
 
			String line;
			while ((line = br.readLine()) != null) {
			   if(line.contains(className)) {
				   br.close();
				   return true;
			   }
			}
			br.close();
			return false;
		} catch (IOException e) {
			return false;
		}
	}
}

W podobny sposób wykorzystałem Reflections do wymuszania pewnej konwencji w projekcie - otóż każda moja encja ma statyczne pole Null , które zawiera NullObject tej klasy. Dodatkowo implementuje interfejs NullObject i metodę isNull(). Wykorzystuje te pole m.in w generycznym DAO i ważne jest aby było ono w każdej encji - no ale niestety czasami zdarza mi się o nim zapomnieć (… czasami przez kopiuj-wklej pole Null ma nie ten typ co powinno) - i przed tym również można dość łatwo zabezpieczyć się korzystając z mechanizmu reflekcji i testu. Kod poniżej już bez omawiania.

import java.lang.reflect.Field;
import java.util.Set;
 
import org.junit.Assert;
import org.junit.Test;
import org.reflections.Reflections;
 
import pl.kedziorski.NullObject;
 
public class NullPropertyTest {
 
	private static final String pakiet = "pl.kedziorski";
 
	@Test
	public void testNullPropertyPresence() throws SecurityException, NoSuchFieldException{
		Set&gt; set = new Reflections(pakiet).getSubTypesOf(NullObject.class);
		for (Class<!--? extends NullObject--> clazz : set) {
			clazz.getField("Null");
		}
		Assert.assertTrue(true);
	}
 
	@Test
	public void testNullPropertyType() throws SecurityException, NoSuchFieldException{
		Set&gt; set = new Reflections(pakiet).getSubTypesOf(NullObject.class);
		for (Class<!--? extends NullObject--> clazz : set) {
			if(!clazz.getSimpleName().startsWith("Null")){
				Field field = clazz.getField("Null");
				Assert.assertTrue("Złamana konwencja NullObject!! Niepoprawny typ pola 'Null'. Klasa: "+clazz.getCanonicalName(),field.getDeclaringClass().equals(clazz));
			}
		}
	}
	@Test
	public void testNullPropertyValueNotSimpleNull() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
		Set&gt; set = new Reflections(pakiet).getSubTypesOf(NullObject.class);
		for (Class<!--? extends NullObject--> clazz : set) {
			if(!clazz.getSimpleName().startsWith("Null")){
				Field field = clazz.getField("Null"); 
 
				Assert.assertNotNull("Złamana konwencja NullObject!! Pole 'Null' == null. Klasa: "+clazz.getCanonicalName(), field.get(null));
			}
		}
	}
 
	@Test
	public void testNullPropertyValue() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
		Set&gt; set = new Reflections(pakiet).getSubTypesOf(NullObject.class);
		for (Class<!--? extends NullObject--> clazz : set) {
			if(!clazz.getSimpleName().startsWith("Null")){
				Field field = clazz.getField("Null");
				Assert.assertEquals("Złamana konwencja NullObject!! Klasa: "+clazz.getCanonicalName(),"Null"+clazz.getSimpleName(), field.get(null).getClass().getSimpleName());
			}
		}
	}
}

Mam nadzieje że komuś się przyda - jeśli ktoś ma jakiś pomysł przed czym jeszcze można by się zabezpieczyć w ten sposób - będę wdzięczny za komentarz. Jeśli jest jakaś ciekawsza metoda to również proszę o wpis z namiarem w komentarzu;)

Projekt jako ogród

Książki Komentarze (1) »

Ogród

Oj długo nic nie pisałem na blogu…

Jestem właśnie w trakcie lektury książki “Pragmatyczny programista od czeladnika do mistrza” A Hunt, D. Thomas (link). W podrozdziale “Refaktoryzacja” znalazłem świetne porównanie projektów programistycznych do otaczającego nas świata.

“Oprogramowanie przypomina bardziej ogród niż tradycyjny plac budowy - więcej tam elementów organicznych niż betonu. Sadzimy w naszym ogrodzie wiele roślin zgodnie z początkowym planem i panującymi warunkami. Część roślin szczególnie dobrze rozwija się w towarzystwie innych gatunków, które nie zasłaniają światła lub - wprost przeciwnie - zapewniają cień oraz osłonę przed wiatrem i deszczem. Przerośnięte rośliny są przycinane, a rośliny, których kolory odbiegają od projektowanego zabarwienia całości, trafiają w inne, bardziej odosobnione miejsca. Wyrywamy chwasty i nawozimy rośliny, które wymagają dodatkowej opieki. Stale monitorujemy zdrowie całego ogrodu, wprowadzając na bieżąco niezbędne poprawki (w glebie, w samych roślinach i w całym projekcie).”

W mojej ocenie wydaje się idealnie oddawać naturę projektu.

Nagrania z Confitury 2011

Info, Konferencje, Video Komentarze (1) »

Wczoraj zauważyłem, że część nagrań z Confitury jest już dostępna w sieci - gorąco zachęcam do obejrzenia prezentacji na których się nie było.

Wszystkie nagrania będą dostępne pod adresem: http://video-it.pl/category/confitura/confitura-2011/

W tej chwili jest to 17 wystąpień i w miarę udostępniania filmów przez organizatorów zbiór ten będzie rosnąć.

Google+ (Google plus)

Google, Info Komentarze (9) »

google1Sporo ostatnio można w sieci znaleźć info na temat nowej zabawki Googla.

Ja od wczoraj mam dostęp do Google+ i muszę przyznać, że podoba mi się prostota, intuicyjność i super design serwisu (Inne zmiany w google też są moim zdaniem jak najbardziej na plus). Co prawdą póki co nie dostrzegam jeszcze zbyt wielkich różnic funkcjonalnych między Google+ a Wallem w Facebooku ale serwis i tak mi się podoba. Głównym wyróżnikiem Google+ mają być kręgi - ogólnie fajna opcja.

Jeśli ktoś chciałby zaproszenie - śmiało piszcie w komentarzach.

Zachęcam do obejrzenia review Google+ w wykonaniu pracownika LA Times  Nathana Olivarez-Giles’a http://video-it.pl/2011/07/google-has-circles-sparks-and-hangouts-but-will-it-nab-facebook-users-nathan-olivarez-giles

Update:

Google troche usprawniło zapraszanie nowych osób do Google + i teraz powinno udać się zarejestrować poprzez link: Zaproszenia Google +

Confitura 2011 (dawna Javarsovia)

Java, Konferencje Komentarze (2) »

Wczorajszy dzień spędziłem w Warszawie w Centrum Konferencyjno-Kongresowe przy ulicy Bobrowieckiej, gdzie odbywała się największa i najciekawsza darmowa, javowa konferencja w Polsce - Confitura 2011 (dawniej Javarsovia).

Confitura 2011

Na konferencje zawitaliśmy autem aby nie gotować się w pociągu - oczywiście nie obyło się bez problemów - kolege wstukał w GPS nie tę ulicę co trzeba i w pewnym momencie zorientowaliśmy się że jesteśmy po drugiej stronie Wisły - szybka weryfikacja a tu w GPS’ie celem jest ulica Bobrowa zamiast Bobrowieckiej :) Na szczęście udało nam się zdążyć i około godziny 9.00 byliśmy już na miejscu. Szybka rejestracja i wykład sponsorki (akurat przeznaczony na wyciszenie po podróży i rozmowę z kolegami którzy czekali już na nas w Warszawie ;] ). Na konferencji jak zawsze super atmosfera. Masa geek’ów chłonna wiedzy. Brawa dla organizatorów za organizację tak wielkiego przedsięwzięcia.

Jeśli chodzi o prezentacje to moja ścieżka wyglądała następująco:

  • Jakub Koperwas - Aspekt bezpieczeństwa w tworzeniu aplikacji internetowych.
  • Patrycja Wegrzynowicz - Patterns and Anti-Patterns in Hibernate
  • Bartek Majsak - Jak wycisnąć maksimum z testów?
  • Paweł Lipiński - Re-fuck-toryzacja czyli sprowadzanie sp****go kodu na właściwe tory.
  • Tomek Łabuz - Zastosowanie przetwarzania asynchronicznego w aplikacjach
  • Piotr Przybylak - Pisz po pijaku, przeglądaj na trzeźwo

Najbardziej podobało mi się zakończenie prezentacji Pawła Lipińskiego - po prostu mistrzowski filmik :) Dzięki temu że miałem okazję posłuchać Sławka Sobótki w Toruniu zdecydowałem się posłuchać o bezpieczeństwie aplikacji webowych - było warto - jak zawsze na takich prezentacjach dochodzi do mnie jak słabo zabezpieczam to co piszę :( - czas wziąć się w garść.

Udało mi się znaleźć zdjęcia z konferencji - całkiem pokaźna ilość :) - dostępne tu.

Nawet udało się znaleźć zdjęcie gdzie nas złapano w kadr.

dsc_2240

PS. Paweł umieścił filmik ze swoją piosenką.

GWT speed up

GWT, Java Komentarze (1) »

Ostatnimi czasy dość często muszę kompilować projekt który piszę w GWT - sprawa jest dość uciążliwa bo zajmuje około 6 min, a zdarza mi się robić to kilka a nawet kilkanaście razy dziennie.
Jako że na ogół w trakcie pisania testuje siebie ficzery lub ich kawałki pod jedną przeglądarką (FF) nie potrzebuje ani obsługi wielu języków ani wielu przeglądarek.
Dodatkowo aplikacja może chodzić nieco wolniej niż na produkcji. Godzę się na te kompromisy by zyskać sporo na czasie kompilacji. Jak wiemy każda przerwa wytrąca z rytmu pracy jeśli jest za długa (u mnie już minuta wystarcza :) ). Poniżej kilka sposobów aby nie tracić niepotrzebnie focus’u podczas kompilacji.

Przyspieszanie kompilacji GWT:

  • komentujemy wszystkie języki - czas spadł do 2min 30sec
    
    
  • ustawiamy tylko jedna przeglądarkę (u mnie Firefox)- czas spadł do 40sec
    
    
  • pomijamy optymalizację GWT - czas spadł do 23sec
    
    
    

Całkiem spory zysk: dla przypomnienia startowaliśmy z około 6 minut a skończyliśmy na 23 sekundach - mnie to zadowala :)
A wy jakie macie sposoby by przyspieszyć kompilację ?

Sławomir Sobótka w Toruniu

Dobre praktyki, Eclipse, Google, Info, Java, Konferencje, Wtyczki do eclipse Komentarze (1) »

TGD.NET

Nawet nie wyobrażacie sobie mojego zdziwienia gdy rano zaraz po przebudzeniu sprawdziłem maile na telefonie a tam informacja z Toruńskiej Grupy Developerów .NET , że Sławek Sobótka wystąpi w Toruniu.

Fajnie rozkręca się TGD .Net, niedawno byłem na organizowanej przez nich konferencji, teraz zaprosili Sławka - gratuluje.

Szkoda, że w Toruniu żaden JUG nie działa.

Wykłady:

  • Domain Driven Design - Wszystko ma swoje miejsce i wszystko jest na miejscu

“Czy zastanawialiście się co jest przyczyną rozkładu średnich i dużych systemów? Czy jest on nieunikniony i jest jedynie kwestią czasu? A może jednak istnieje jakiś sposób na utrzymanie entropii w ryzach? Podczas prezentacji zobaczymy w jaki sposób Domain Driven Design pomaga w okiełznaniu chaosu. W prezentacji znajdą się główne techniki modelowania takie jak Ubiquitous Language, Bounded Context, Strategic Design. Zostaną przedstawione również podstawowe techniki implementacji DDD: przykłady Building Blocks, Command-query Responsibility Segregation, system zdarzeń, przypadki racjonalnego wykorzystania zarówno ORM jak i czystego i SQL.

  • Command-query Responsibility Segregation - ewolucja architektury warstwowej w stronę modularyzacji i skalowania

Z biegiem kariery, tworząc kolejny system lub aplikację, stajemy przed problemami innej klasy. Inna klasa problemu to inne wymagania odnośnie technologii, metodyki i architektury. Popularne architektury warstwowe mogą być nieodpowiednie do pewnych klas problemów - mogą np. narzucać nieracjonalne wykorzystanie ORM lub promować naiwne modelowanie domeny biznesowej. Podczas prezentacji przedstawię nowe ujęcie warstw - architekturę Command-query Responsibility Segregation, która wspiera aplikacje średniej i dużej skali. Architektura CqRS promuje zdobycze nowoczesnej inżynierii oprogramowania takie jak: Domain Driven Design i noSQL, otwiera system na skalowanie oraz w naturalny sposób rozwiązuje typowe problemy z mapowaniem relacyjno-obiektowym. Główne składowe nowej architektury to: dwa stosy warstw, rozwarstwienie logiki, komunikacja zdarzeniowa oraz opcjonalnie event sourcing (składowanie danych w modelu behawioralnym - w przeciwieństwie do klasycznego modelu strukturalnego)

Miejsce: Wydział Matematyki i Informatyki (ul. Chopina)

Data: 13.05.2011

Godzina: 17.00 - 20.00

Rejestracja: WSS , CodeGuru

Do zobaczenia w piątek 13.  ;-)

SCJP/OCPJP 6 - zdane :)

Java Komentarze (17) »

Oracle Java SE 6 Certified Programmer
Udało się. Wczoraj w godzinach porannych zdałem egzamin na SCJP 6 / OCPJP 6

Uzyskałem 83% - z czego jestem raczej bardzo zadowolony (jadąc byłem pewny, że będzie ciężko)

Egzamin zdawałem w Bydgoszczy (csinf.pl) - Centrum małe ciche - w sali byłem sam :) Miła Pani która to wszystko obsługiwała - byłem skazany na sukces :)

Voucher na SCJP kupiłem bodajże w marcu 2010 - Oracle przysłało mi go jakoś w połowie kwietnia z expire date:  1. Maja

Oczywiście całkiem o nim zapomniałem i jakieś 3 tygodnie temu zdałem sobie sprawę że trzeba wziąć się do roboty - przeczytałem kolejny raz książkę Mariusza Lipińskiego przygotowującą do SCJP - przeczytałem kilka razy 2 minutes drills z ksiązki Sierra i Bates “SCJP Sun Certified Programmer for Java 6 Study Guide (Exam 310-065)” - całej nie miałbym szans dokładnie przeczytać  bo ma +- 900stron no i jest po angielsku a wtedy jeszcze wolniej mi idzie:]

Dodatkowo ściągnąłem sobie Examlab dla SCJP 6 i robiłem sobie testy (żadnego nie zdałem ;] ) - są one co prawda dla starszej wersji SCJP gdzie były 72 pytania ale zmiany są nie znaczne. Jako, że nie zdałem nic z mocków przed prawdziwym egzaminem nie dziwi, że jechałem z przekonaniem, że marne mam szanse :) Ale egzamin okazał się znacznie łatwiejszy niż mocki (to może być moja subiektywna ocena). W zasadzie nie był aż tak podchwytliwy jak one. Albo po prostu lepiej mi podrasowały pytania. Nie ważne - ważne że do przodu :)

Co do samego egzaminu SCJP - jest w sieci wiele opinii że nic on nie daje, że nauka do niego to kwestia nauki wyszukiwania czy nawiasy są po domykane itp. Ja osobiście ucząc się na ten egzamin zdałem sobie sprawę jak słabo znam Jave - z wielu udogodnień nie korzystałem bo ich nie znałem. Teraz już je znam i nie zawaham się ich użyć :) Oczywiście cała zabawa w kompilator raczej nie jest zbyt przydatna - od tego mamy nasze wypchane ficzerami IDE :)

No to by było tyle - w ciągu 8 tygodni ma dojść do mnie paczka z certyfikatem.

Silnik: Wordpress - Theme autorstwa N.Design Studio. Spolszczenie: Adam Klimowski.
RSS wpisów RSS komentarzy Zaloguj








2zł Nordic Gold