<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>webbricks &#187; Agile</title>
	<atom:link href="http://blog.grzegorzpawlik.com/category/agile/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.grzegorzpawlik.com</link>
	<description>Doświadczenie, to coś, co zdobywamy tuż po chwili w której było nam potrzebne ...</description>
	<lastBuildDate>Tue, 07 Feb 2012 10:09:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>TDD z przymróżeniem oka</title>
		<link>http://blog.grzegorzpawlik.com/2012/01/tdd-z-przymrozeniem-oka/</link>
		<comments>http://blog.grzegorzpawlik.com/2012/01/tdd-z-przymrozeniem-oka/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 13:57:06 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1733</guid>
		<description><![CDATA[Tutorial Driven Development &#8211; kiedy stwierdzasz, że masz za mało motywacji, żeby się nauczyć kompletnie nowej technologii tak po prostu. Angażujesz się jednak w projekt, który wymaga jej użycia. Jesteś kompletnie zielony, więc cykl pracy wygląda mniej więcej tak: nowy &#8230; <a href="http://blog.grzegorzpawlik.com/2012/01/tdd-z-przymrozeniem-oka/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Tutorial Driven Development &#8211; kiedy stwierdzasz, że masz za mało motywacji, żeby się nauczyć kompletnie nowej technologii tak po prostu. Angażujesz się jednak w projekt, który wymaga jej użycia. </p>
<p>Jesteś kompletnie zielony, więc cykl pracy wygląda mniej więcej tak:</p>
<ol>
<li>nowy problem</li>
<li>google</li>
<li>znajdujesz tutorial (lub odpowiedź na stack-overflow), który go (lub wystarczająco podobny) rozwiązuje</li>
<li>implementujesz rozwiązanie zgodnie z tekstem</li>
<li>dostosowujesz do swoich potrzeb</li>
<li>powtarzasz cykl</li>
</ol>
<p>Po pewnym czasie listę można zredukować o punkt 4 &#8211; od razu przystępujemy do modyfikacji. Po kolejnych cyklach pomijamy punkt 2 i wiemy, że analogie są w napisanym przez nas kodzie- musimy sobie przypomnieć &#8220;jak to się robiło&#8221;. Coraz mniej też jest problemów, które w ten sposób potrzebujemy rozwiązać aż w końcu sięgamy po tą technikę tak rzadko, że już nie można mówić o Tutorial Driven Development. <strong>Czujemy się swobodnie z nową technologią</strong>, a z tąd już prosta (choć długa) droga do zostania ekspertem.</p>
<div id="attachment_1751" class="wp-caption aligncenter" style="width: 510px"><a href="http://blog.grzegorzpawlik.com/wp-content/uploads/2012/01/proffesional.jpg" rel="lightbox[1733]" title="."><img src="http://blog.grzegorzpawlik.com/wp-content/uploads/2012/01/proffesional.jpg" alt="" title="." width="500" height="333" class="size-full wp-image-1751" /></a><p class="wp-caption-text">foto: Sigurd R</p></div>
<p>Ps. Ten wpis miał być humorystyczny, ale w trakcie pisania uświadomiłem sobie, że opisuję koncepcję <a href="http://en.wikipedia.org/wiki/Shuhari" title="Shu-ha-ri">Shu-ha-ri</a>).</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2012/01/tdd-z-przymrozeniem-oka/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Świetna książka PHP: Hight quality frameworks and applications</title>
		<link>http://blog.grzegorzpawlik.com/2012/01/swietna-ksiazka-php-hight-quality-frameworks-and-applications/</link>
		<comments>http://blog.grzegorzpawlik.com/2012/01/swietna-ksiazka-php-hight-quality-frameworks-and-applications/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 17:06:00 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[książki]]></category>
		<category><![CDATA[Cont. Integration]]></category>
		<category><![CDATA[QA]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[unit tests]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1720</guid>
		<description><![CDATA[Świetna dla każdego, kto pracuje na systemach z zaszłościami (Legacy Systems) myśli, że refaktoring takich systemów nie jest możliwy testy automatyczne muszą być równie przyjemne jak hemoroidy boi się, że aplikacja, w którą zainwestował już sporo powoli staje się niemożliwa &#8230; <a href="http://blog.grzegorzpawlik.com/2012/01/swietna-ksiazka-php-hight-quality-frameworks-and-applications/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_1727" class="wp-caption alignleft" style="width: 310px"><a href="&quot;http://www.amazon.com/gp/product/0470872497/ref=as_li_ss_tl?ie=UTF8&amp;tag=webbricks-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0470872497"><img src="http://blog.grzegorzpawlik.com/wp-content/uploads/2012/01/hqfaa.png" alt="Real-Worls Solutions for Developing High Quality PHP Frameworks and Applications" title="Designing Hight Quality Frameworks and Applications" width="300" height="300" class="size-full wp-image-1727" /></a><p class="wp-caption-text">Real-Worls Solutions for Developing High Quality PHP Frameworks and Applications</p></div><br />
Świetna dla każdego, kto </p>
<ul>
<li>pracuje na systemach z zaszłościami (Legacy Systems)</li>
<li>myśli, że refaktoring takich systemów nie jest możliwy</li>
<li>testy automatyczne muszą być równie przyjemne jak hemoroidy</li>
<li>boi się, że aplikacja, w którą zainwestował już sporo powoli staje się niemożliwa w utrzymaniu</li>
<li>myśli, że system, którego używa od lat trzeba przepisać od zera</li>
</ul>
<p>
Pozycja zdecudowanie nie jest przeznaczona dla tych, którzy zaczynają swoją przygodę z PHP. Jeśli jednak już okrzepłeś i szukasz czegoś więcej &#8211; polecam gorąco.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2012/01/swietna-ksiazka-php-hight-quality-frameworks-and-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zespół programistów jest jak maszyna</title>
		<link>http://blog.grzegorzpawlik.com/2011/11/zespol-programistow-jest-jak-maszyna/</link>
		<comments>http://blog.grzegorzpawlik.com/2011/11/zespol-programistow-jest-jak-maszyna/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 16:30:40 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1696</guid>
		<description><![CDATA[I nie chodzi mi o to, że można członków zespołu traktować jak trybiki i dowolnie wymieniać. Chyba, że wyobrazisz sobie ręcznie robiony, szwajcarski zegarek, w którym każdy trybik jest długo i dokładnie szlifowany, aby pasował do reszty (wymiana go jest &#8230; <a href="http://blog.grzegorzpawlik.com/2011/11/zespol-programistow-jest-jak-maszyna/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I nie chodzi mi o to, że można członków zespołu traktować jak trybiki i dowolnie wymieniać. Chyba, że wyobrazisz sobie ręcznie robiony, szwajcarski zegarek, w którym każdy trybik jest długo i dokładnie szlifowany, aby pasował do reszty (wymiana go jest możliwa, ale zdajesz sobie sprawę z kosztów).</p>
<p>Ale wróćmy do głównego wątku. Jeśli nie byłeś nigdy członkiem takiego zespołu, a chciałbyś takim zarządzać, to czytaj uważnie. </p>
<p>Z natury <a href="http://blog.grzegorzpawlik.com/2008/06/czy-kazdy-moze-byc-programista/" title="Czy każdy może być programistą?">jestem leniwy</a>. Ale jestem dość specyficznym leniem, który nie lubi nic nie robić. Dlatego w ogóle zostałem programistą &#8211; lubię automatyzować i ulepszać rzeczy, które są nudne i żmudne do ręcznego wykonywania.</p>
<p>Zatem zaczął mi doskwierać pewien proces. Przy pewnym projekcie dość często musimy aktualizować utrzymywane systemy, które mają kilka instancji(w tej chwili 3, a ma być więcej). Wygląda to mniej więcej tak:</p>
<ol>
<li>zaloguj się na serwer</li>
<li>cd instancja#1</li>
<li>git pull</li>
<li>wpisz hasło</li>
<li>odpal migrację</li>
<li>cd ../instancja#2</li>
<li>git pull</li>
<li>wpisz hasło</li>
<li>odpal migrację</li>
<li>cd ../instancja#3</li>
<li>git pull</li>
<li>wpisz hasło</li>
<li>odpal migrację</li>
<li>TADA!</li>
</ol>
<p>Serio. Pierwszym krokiem było napisanie skryptu, które te kroki odpala samodzielnie. Zaczęło to wyglądać tak:</p>
<ol>
<li>zaloguj się na serwer</li>
<li>./update-me.sh</li>
<li>wpisz hasło</li>
<li>wpisz hasło</li>
<li>wpisz hasło</li>
</ol>
<p>Drugim krokiem było skonfigurowanie GITa tak, aby nie wymagał hasła na niektórych maszynach (<a href="http://linuxproblem.org/art_9.html">przy pomocy kluczy rsa</a>) Proces uprościł się do</p>
<ol>
<li>zaloguj się na serwer</li>
<li>./update-me.sh</li>
</ol>
<p>Jaki jest efekt? Pierwszy, który się narzuca to oszczędność czasu. Zakładając, że taki update odbywał się 3 razy dziennie to zaoszczędziliśmy jakąś minutę. Nie wydaje się to rozsądne, gdyż oba zadania zajęły mi kilka godzin. Z księgowego punktu widzenia mamy stratę.</p>
<p>Jednak uważny obserwator mógł stwierdzić, że mamy w tym projekcie instancję główną i &#8220;towarzyszące&#8221;. W pierwotnym, ręcznym, procesie pozostałe dwie często zostawały w tyle. Rodziło to problemy przy testowaniu i mergowaniu zmian. </p>
<p>Dodatkowo prosty update to częsty update, zatem i testerzy nie muszą się dopraszać, żeby zaktualizować wersje, bo zwyczajnie są w najnowszej wersji.</p>
<p>Wracając do mojej tezy: Zespół to maszyna, programiści to (nie tak łatwo wymienialne) trybiki, procesy to miejsca, gdzie trybiki i inne części się ścierają. Niedoświadczonemu operatorowi może się wydawać, że przestoje spowodowane oliwieniem maszynerii to stracone pieniądze. W końcu przez te X godzin mogła wyprodukować Y $$$.</p>
<p>Refaktoring, automatyzacja i inne usprawnienia oliwią procesy w zespole programistów. Gdy nie ma niepotrzebnych tarć można rozwinąć optymalną prędkość, a awarie są mniej prawdopodobne.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2011/11/zespol-programistow-jest-jak-maszyna/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Różne różności&#8230;</title>
		<link>http://blog.grzegorzpawlik.com/2011/10/rozne-roznosci/</link>
		<comments>http://blog.grzegorzpawlik.com/2011/10/rozne-roznosci/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 16:54:02 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Ciekawe cytaty]]></category>
		<category><![CDATA[Inne]]></category>
		<category><![CDATA[książki]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1668</guid>
		<description><![CDATA[W prawdzie nie zdarza mi się pisać o marketingu internetowym etc., ale zebrało mi się kilka linków, którymi chciałbym się z Wami podzielić. Ciekawa analiza czterech gigantów: Apple, Google, Microsoft i Google. I dlaczego Amazon jest na dobrej drodze, aby &#8230; <a href="http://blog.grzegorzpawlik.com/2011/10/rozne-roznosci/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>W prawdzie nie zdarza mi się pisać o marketingu internetowym etc., ale zebrało mi się kilka linków, którymi chciałbym się z Wami podzielić.</p>
<h2>Ciekawa analiza czterech gigantów: Apple, Google, Microsoft i Google.</h2>
<p>I dlaczego <a href="http://www.digitaltrends.com/mobile/our-kindle-fire-impressions-and-why-amazon-is-destined-to-dominate/" title="Dominacja Amazona?">Amazon jest na dobrej drodze, aby osiągnąć dominację na rynku</a>?</p>
<p>Pozwolę sobie zacytować charakterystykę wielkiej czwórki z tego artykułu</p>
<blockquote cite="http://www.digitaltrends.com/mobile/our-kindle-fire-impressions-and-why-amazon-is-destined-to-dominate/"><p>
Why Amazon will lead the big four:</p>
<ul>
<li>Apple sells content and writes software to sell hardware. It is a hardware company.</li>
<li>Microsoft sells content and makes hardware to sell software. It is a software company.</li>
<li>Google sells or gives away content and software to sell advertisements. It is an ad sales company.</li>
<li>Amazon sells or gives away hardware and software to sell content. It is an online retailer — a content </li>
<p>company.</ul>
</blockquote>
<h2>Interesujące przemyślenia dotyczące technologii flash i jej przyszłości</h2>
<p><a href="http://mir.aculo.us/2011/09/15/more-thoughts-on-flash-from-microsoft-no-less/?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed%3A+miraculous+%28mir.aculo.us%29">Czy flash ma przyszłość?</a>. Co myśli o tym <a href="http://www.apple.com/hotnews/thoughts-on-flash/">Steve Jobs</a> i <a href="https://blogs.msdn.com/b/b8/archive/2011/09/14/metro-style-browsing-and-plug-in-free-html5.aspx">Dean Hachamovitch (jeden z leaderów zespołu w Microsofcie)</a>?</p>
<p>Bardzo ciekawy fragment, który oddaje filozofię Apple, jako całości:</p>
<blockquote cite="http://www.apple.com/hotnews/thoughts-on-flash/"><p>
If developers grow dependent on third party development libraries and tools, they can only take advantage of platform enhancements if and when the third party chooses to adopt the new features. We cannot be at the mercy of a third party deciding if and when they will make our enhancements available to our developers.
</p></blockquote>
<p>Przyznam się, że też za flashem nie będę płakał. Nigdy nie miał sensownego wsparcia na platformy linuxowe. Do niedawna domyślnie każdy element flash miałem zablokowany (flashblock)&#8230;</p>
<h2>Dla tych, którzy lubią społeczne aspekty sieci i marketingu&#8230;</h2>
<p>Poradnik <a href="http://www.distilled.net/linkbait-guide/">jak przygotować skuteczną infografikę</a>. Jeśli przygotujesz jakąś przy pomocy tych wskazówek &#8211; pochwal się proszę w komentarzu.</p>
<h2>Dla estetów i całej reszty</h2>
<p>Ci pierwsi dostaną argumenty za, ci drudzy mają okazję przekonać się dlaczego jest istotna i <a href="http://www.squidoo.com/getting-smart-about-typography">skąd czerpać odpowiednią wiedzę o typografii</a>.</p>
<h2>I na koniec, żeby było coś o projektach stricte informatycznych.</h2>
<blockquote cire="http://www.devblogi.pl/2011/09/czy-twoje-oprogramowanie-jest.html"><p>
Kto rozwija plany testów dla oprogramowania open-source? Kto aktualizuje zrzuty ekranów w instrukcji użytkownika i pomocy online? Oraz kto tłumaczy dokumentację na polski i turecki? Kto weryfikuje, czy dana funkcjonalność nie łamie Amerykańskiej Ustawy o Niepełnosprawnych, bądź Niemieckich Praw odnośnie Prywatności? Wtedy, gdy pracowałem nad Linuxem, odpowiedzią było &#8220;Nikt. Nie ma czegoś takiego jak plan testów, drukowana instrukcja użytkownika, jedyną dokumentacją, jaka istnieje, to ta po angielsku, oraz nikt nie przejmuje się zgodnością z jakimikolwiek prawami.&#8221; Może coś się pozmieniało od tamtego czasu.
</p></blockquote>
<p>Dowiedz się <a href="http://www.devblogi.pl/2011/09/czy-twoje-oprogramowanie-jest.html">dlaczego open source&#8217;owi lżej na sercu?</a></p>
<h2>Przy okazji (jeśli dotarłeś aż tutaj, to znaczy, że artykuł jest wystarczająco ciekawy)</h2>
<p>Noszę się z zamiarem kupna <a href="http://www.amazon.com/gp/product/B005890G8O/ref=famstripe_kt3g">kindle&#8217;a (nie tabletu)</a>, żeby między innymi mieć szybki dostęp do dobrej literatury branżowej (czyli anglojęzycznej) i artykułów takie jak te powyżej. Zatem jeśli mój blog wydał Ci się pomocny, jeśli wydaje Ci się, że jest coś wart &#8211; możesz rozważyć zafundowanie mi <a href="https://www.amazon.com/gp/gc/order-email?ie=UTF8&#038;ref_=gc_compchart_4ways_email">bonu podarunkowego amazona</a>. <strong>1$ jest super kwotą</strong> &#8211; możesz zapłacić na przykład z paypall&#8217;a. Możesz mi go wysłać na adres podaruj.mi.kindle@gmail.com :)<br />
Jeśli masz blog, to w wiadomości umieść swój adres &#8211; umieszczę go na swojej stronie, jeśli zechcesz.<br />
Będę też zachwycony, jeśli dołączysz też jakąś osobistą wiadomość od siebie.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2011/10/rozne-roznosci/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nie mów mi co mam zrobić&#8230;</title>
		<link>http://blog.grzegorzpawlik.com/2011/09/nie-mow-mi-co-mam-zrobic/</link>
		<comments>http://blog.grzegorzpawlik.com/2011/09/nie-mow-mi-co-mam-zrobic/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 15:29:50 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1649</guid>
		<description><![CDATA[&#8220;Proszę o dodanie możliwości usuwania błędnie dodanego X do Z&#8221;. Często zdarza mi się słyszeć lub czytać takie zgłoszenie. Sęk w tym, że dodane X spowodowało wiele procesów automatycznych w aplikacji, czyli dodanie A, usunięcie B i zmianę statusów w &#8230; <a href="http://blog.grzegorzpawlik.com/2011/09/nie-mow-mi-co-mam-zrobic/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>&#8220;Proszę o dodanie możliwości usuwania błędnie dodanego X do Z&#8221;.</p>
<p>Często zdarza mi się słyszeć lub czytać takie zgłoszenie. Sęk w tym, że dodane X spowodowało wiele procesów automatycznych w aplikacji, czyli dodanie A, usunięcie B i zmianę statusów w C i D. Tak wyglądają złożone systemy informatyczne, o czym wielu użytkowników zwyczajnie nie wie (po to ukrywamy tą logikę w aplikacji, abyś Ty mógł wydajnie pracować nie myśląc o tych wszystkich szczegółach).</p>
<p>Zatem <strong>tracimy czas</strong>, żeby przeanalizować potencjalne skutki usunięcia X oraz na szukanie sposobów na przywrócenie spójności systemu po tej operacji chirurgicznej. Aż w końcu okazuje się, że samo istnienie błędnego X w systemie w niczym nie przeszkadza &#8211; ma być zwyczajnie niewidoczny na wydruku Z, który idzie do klienta.</p>
<p>Gdybyś od razu powiedział <strong>szczerze czego potrzebujesz</strong> &#8211; dałbym Ci to w 5 minut!</p>
<p><img src="http://blog.grzegorzpawlik.com/wp-content/uploads/2011/09/robert_kubica_09.jpg" alt="" title="zzzzium!" width="500" height="333" class="aligncenter size-full wp-image-1650" /></p>
<p>No właśnie&#8230; gdybyś <strong><u>nie mówił mi co mam robić, a zamiast tego powiedział mi czego potrzebujesz</u></strong>. Umówmy się: Ty jesteś specjalistą od używania systemu, ja jestem specjalistą od mechaniki jego działania. Nie mówisz swojemu mechanikowi, którą śrubę ma dokręcić &#8211; mówisz mu, że tu stuka&#8230; a ma nie stukać.</p>
<p>Bądź precyzyjny w kwestii swoich potrzeb. </p>
<p>Wchodząc w szczegóły techniczne może się wydawać, że zyskujemy precyzję, ale tak naprawdę <strong>tracimy kontekst</strong>. Kontekst pozwala mi znaleźć takie rozwiązania Twoich rozterek, które będą współgrały z aktualnymi mechanizmami aplikacji, zamiast je rozrywać na kawałki.<br />
Gdy go nie ma, musimy wyjść najpierw od szczegółu, do ogółu i z powrotem. To dłuższa i niepotrzebna droga.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2011/09/nie-mow-mi-co-mam-zrobic/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wewnętrzna jakość</title>
		<link>http://blog.grzegorzpawlik.com/2011/09/wewnetrzna-jakosc/</link>
		<comments>http://blog.grzegorzpawlik.com/2011/09/wewnetrzna-jakosc/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 20:34:12 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1636</guid>
		<description><![CDATA[Słyszałeś o tym, że istnieje coś takiego jak wewnętrzna i zewnętrzna jakość? Jakość zewnętrzna to wszystko to, co widzi użytkownik. To funkcje jakie spełnia aplikacja. Nie chodzi jedynie o usability i kwestie związane z wyglądem zewnętrznym. Też o jakość zaimplementowanych &#8230; <a href="http://blog.grzegorzpawlik.com/2011/09/wewnetrzna-jakosc/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Słyszałeś o tym, że istnieje coś takiego jak wewnętrzna i zewnętrzna jakość?</p>
<p><strong>Jakość zewnętrzna</strong> to wszystko to, co widzi użytkownik. To funkcje jakie spełnia aplikacja. Nie chodzi jedynie o usability i kwestie związane z wyglądem zewnętrznym. Też o jakość zaimplementowanych możliwości. Czy po kliknięciu drukuj pojawia się dialog drukowania, czy pdf do ściągnięcia, którego można wydrukować po otwarciu? Czy cały proces biznesowy jest obsługiwany, czy może o część elementów dbają użytkownicy? Czy elementy z zewnętrznych systemów importują się perfekcyjnie, czy w 10% potrzebna jest interwencja użytkownika lub nawet programisty?</p>
<p>Niższa jakość zewnętrzna nie zawsze oznacza, że jest źle. To jest decyzja, którą podejmuje właściciel produktu (product owner) pod warunkiem, że dysponuje pełną informacją o sytuacji. Jeśli wie, że perfekcyjny import opóźni wdrożenie o cały miesiąc, a &#8220;prawie dobry&#8221; oznacza wykorzystanie okazji biznesowej już teraz (relatywnie niewielkim nakładem pracy ludzi) &#8211; może wybrać opcję &#8220;prawie dobrą&#8221;. Oczywiście może poprosić o wersję idealną przy kolejnej iteracji.</p>
<p><strong>Jakość wewnętrzna</strong> zkolei to coś, czego zrozumienie przychodzi ciężko czasem nawet programistom. To brak <a href="http://blog.grzegorzpawlik.com/2010/03/dlug-techniczny/">długu technicznego</a> (<a href="http://blog.grzegorzpawlik.com/2010/03/dlug-techniczny-przyklad-z-zycia-wziety/">przykład</a>), podatność kodu na zmiany wymagań, niewrażliwość na regresję (wprowadzanie błędów wraz z nowym kodem, powracanie tych już naprawionych).</p>
<p><strong>Jakość wewnętrzna aplikacji jest <u>nienegocjowalna</u></strong> w zespołach Agile.</p>
<p>Gdy jest ona niska, nowe błędy są odkrywane przy każdym wdrożeniu, Twoja aplikacja choruje, a zespół traci czas na jej łatanie &#8211; wolniej implementuje nowe elementy. Sponsor/właściciel produktu nie wykorzystuje w pełni nadarzających się okazji na rynku. To wszystko trwa aż do dramatycznego momentu, kiedy okazuje się że nie da się już produktu rozwijać. Pomyśl tylko&#8230; zespół programistów dwa lata rozwijał aplikację i teraz musi zacząć od nowa. Aplikację, na którą wydałeś setki tysięcy złotych. I jedyne co masz, to doświadczenie Twoich programistów (o ile cały zespół nie wymienił się w tym czasie przynajmniej raz). Dla nich to świetne szkolenie, ale z Twojego punktu widzenia niezbyt opłacalne.</p>
<p>Znam trzy narzędzia, które dbają o wysoką jakość wewnętrzną. </p>
<p>Pierwszy (nietechniczny) już podałem: <strong>jakość wewnętrzna nie podlega negocjacji</strong>. Gdy product owner chce importu, ale nie ma czasu zaimplementować go perfekcyjnie &#8211; nie jest opcją zaimplementowanie go na szybko w technologii spagehetti code. Możesz negocjować zakres funkcji do zaimplementowania, nigdy jakość wewnętrzną. Klient nawet nie powinien znać opcji &#8220;super szybkiej&#8221;, z dwóch powodów:</p>
<ol>
<li>na pewno by ją wybrał, ponieważ&#8230;</li>
<li>nie wie, że to zabije jego projekt</li>
</ol>
<p>Posługując się analogią budowlaną: Klient chciałby mieć tańszy dom. Wykonawca proponuje zamiast wylania fundamentów (co trwa i kosztuje) wsypanie do wykopu śmieci, które ma z poprzedniej budowy. Klient oczywiście się nie zgadza, bo to śmiertelne zagrożenie dla jego rodziny. Oczywiście w naszym kraju to jest niemożliwe &#8211; kierownik budowy poszedłby do więzienia. IT nie ma nadzoru budowlanego &#8211; nieszczęście w szczęściu ;)</p>
<p>Pozostałe (techniczne): <strong>refaktoring kodu i testy</strong>. Refaktoring (czy refaktoryzacja) usuwa dług techniczny, który zawsze zaciągasz rozwijając aplikację. Aktywnie z nim walczy, stale przebudowując kod <a href="http://pl.wikipedia.org/wiki/DRY">usuwając powtórzenia</a> i poprawiając architekturę systemu.</p>
<p>Jednak refaktoring jest strasznie trudny. Nowe funkcje mogą <a href="http://en.wikipedia.org/wiki/Regression_testing">wprowadzić nowe i przywrócić stare błędy</a>. Zmiana kodu, która nie wprowadza nowych funkcji, ale wprowadza błędy w ogóle nie jest sexy. Dlatego potrzebujesz automatycznych testów.</p>
<p>Testy jednostowe, testy integracyjne i wszystkie inne jakie jesteś w stanie zautomatyzować mogą ochronić Cię przed regresją kodu. Dzięki nim programista nie boi się refaktoringu &#8211; zmienia, klika &#8211; widzi wielki zielony napis &#8220;OK&#8221; i jest szczęśliwy.</p>
<p>Takie podejście zwraca się w długim terminie. Życzę wszystkim, aby mieli okazję pracować którzy potrafią tak daleko patrzeć.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2011/09/wewnetrzna-jakosc/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Chochlik w Twoim markecie?</title>
		<link>http://blog.grzegorzpawlik.com/2011/08/chochlik-w-twoim-markecie/</link>
		<comments>http://blog.grzegorzpawlik.com/2011/08/chochlik-w-twoim-markecie/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 19:18:56 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1626</guid>
		<description><![CDATA[Wyobraź sobie, że jesteś menadżerem w supermarkecie w bajkowej krainie. Wszystko jest ok, ale w Twoim magazynie mieszka chochlik, który chowa wózek widłowy. Nie robi tego złośliwie &#8211; po prostu taką ma naturę, inne chochlikowe sprawy zajmują mu głowę. Wystarczy &#8230; <a href="http://blog.grzegorzpawlik.com/2011/08/chochlik-w-twoim-markecie/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Wyobraź sobie, że jesteś menadżerem w supermarkecie w bajkowej krainie. Wszystko jest ok, ale w Twoim magazynie mieszka chochlik, który chowa wózek widłowy. Nie robi tego złośliwie &#8211; po prostu taką ma naturę, inne chochlikowe sprawy zajmują mu głowę.<br />
Wystarczy go zapytać i od razu wskazuje miejsce gdzie go można znaleźć.</p>
<p>Niestety &#8211; często wychodzi i trudno go złapać. Twoi magazynierzy bez wózka nie mogą wykonać wszystkich swoich zadań i w końcu okazuje się, że siedzą bezczynnie. Po jakimś czasie znajdujesz chochlika, albo udaje Ci się do niego dodzwonić. Niestety wskazówki przez telefon są nieprecyzyjne, więc szukanie wózka zajmuje więcej czasu.</p>
<p>Kiedy magazynierzy nie pracują towaru zaczyna brakować na półkach &#8211; klienci odchodzą do konkurencji i tracisz pieniądze.</p>
<p>Jesteś menadżerem. Co zrobisz?</p>
<p>Ważne! Nie możesz się pozbyć chochlika. W magicznej krainie każdy supermarket musi mieć chochlika &#8211; bez niego znika ;)</p>
<p>Masz jakiś pomysł?</p>
<p>Ja zrobiłbym wszystko, aby zatrzymać chochlika na magazynie w godzinach pracy. Zapłać mu, urządź mu przytulną norkę &#8211; sprowadź wszystkie wygody, których potrzebuje, aby nie chciał wychodzić.</p>
<p>Jeśli się nie uda &#8211; kup mu komórkę i błagaj, żeby miał ją włączoną i zawsze przy sobie.</p>
<p><u>Mimimalizuj szkody</u>, które się wydarzają, gdy chochlika nie ma pod ręką!</p>
<p>W projekcie IT właściciel produktu (product owner) jest takim chochlikiem. Nigdy nie wyjawi Ci wszystkich szczegółów na temat funkcji, której potrzebuje. Nie złośliwie &#8211; po prostu myśli o swoim biznesie, a nie o zależnościach i ograniczeniach w oprogramowaniu, które ten biznes ma wspierać. To Twoje zadanie.</p>
<p>Zrób wszystko, żeby product ownera mieć pod ręką. Jeśli to jest niemożliwe &#8211; zorganizuje gorącą linię. Uświadom mu, że bez jego wiedzy projekt stoi. Programiści muszą zgadywać i zawsze zgadną źle. Albo zaimplementują coś zbyt luźno i trzeba będzie poprawić (a błąd, który trafił na produkcję jest droższy!) albo zbyt restrykcyjnie i stracą cenny czas na implementację zbyt skomplikowanych ograniczeń. Czasem zgadną dobrze, ale nikt nie nie trafia szóstki co losowanie&#8230;</p>
<p>Jeśli nie możesz w każdej chwili skontaktować się z product ownerem &#8211; nie jesteś zwinny. Albo Twoje ruchy są zbyt ograniczone strachem przed podjęciem błędnej decyzji&#8230; albo próbując iść do przodu wyrządzasz szkody, jak słoń w składzie porcelany.</p>
<p><u>Nie każ swoim programistom czekać</u> na wyjaśnienia. Posadź z nimi product ownera. Jak nie chce &#8211; wprowadź programistów do siedziby jego firmy.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2011/08/chochlik-w-twoim-markecie/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Czym jest Agile?</title>
		<link>http://blog.grzegorzpawlik.com/2011/08/czym-jest-agile/</link>
		<comments>http://blog.grzegorzpawlik.com/2011/08/czym-jest-agile/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 22:50:37 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1615</guid>
		<description><![CDATA[Agile nie jest metodyką wytwarzania oprogramowania. Jest filozofią, na której można je budować. Mówimy o zwinnych metodykach, a nie zwinnej metodyce. Zwinnymi metodykami są XP, Scrum i wszystkie te nienazwane stosowane w milionach firm, które spełniają kilka wymogów.. &#8230;a w &#8230; <a href="http://blog.grzegorzpawlik.com/2011/08/czym-jest-agile/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Agile nie jest metodyką wytwarzania oprogramowania.<br />
Jest filozofią, na której można je budować.<br />
Mówimy o zwinnych metodykach, a nie zwinnej metodyce.<br />
Zwinnymi metodykami są XP, Scrum i wszystkie te nienazwane stosowane w milionach firm, które spełniają kilka wymogów..<br />
&#8230;a w zasadzie to tylko jeden &#8211; <strong>metodyka jest zwinna, jeśli zespół działający zgodnie z nią jest zwinny</strong>.</p>
<h1>Co to znaczy, że zespół jest zwinny?</h1>
<p><span id="more-1615"></span></p>
<p>Po pierwsze &#8211; to nie jest kwestia tego czy jesteś zwinny czy nie. Pytanie brzmi: <strong>jak bardzo jesteś zwinny?</strong></p>
<p>Zwinny &#8211; potrafiący sprawnie reagować na zmiany. Głównie wymagań klienta, które wynikają ze zmian otoczenia (biznesowego, technologicznego).</p>
<p>Zespół jest zwinny, jeśli ma z tyłu głowy informację “wszystko się zmienia”. Jeśli zespół marudzi, że klient powiedział tak i powinien się tego trzymać, to ma problem ze zwinnością.</p>
<p>To są podstawy, każda z metodyk ma swoje narzędzia, którymi wspiera zwinność zespołu. </p>
<p>Niektóre elementy ważne dla Twoje zwinności: </p>
<ul>
<li><a href="http://blog.grzegorzpawlik.com/2011/08/chochlik-w-twoim-markecie/" title="Chochlik w Twoim markecie?">Twój kontakt z właścicielem produktu</a></li>
<li><a href="http://blog.grzegorzpawlik.com/2011/09/wewnetrzna-jakosc/" title="Wewnętrzna jakość">Wewnętrzna jakość</a></li>
</ul>
<p><del datetime="2011-08-31T19:19:33+00:00">O szczegółach napiszę później nieco więcej, więc</del> Będę pisał o kolejnych elementach, więc podepnij się proszę pod <a href="http://feedburner.google.com/fb/a/mailverify?uri=WebBricks" title="rss feed">kanał rss</a> (albo pozwól na <a href="http://feedburner.google.com/fb/a/mailverify?uri=WebBricks">powiadamianie przez e-mail</a>)</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2011/08/czym-jest-agile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Znów o migracji baz danych słów kilka</title>
		<link>http://blog.grzegorzpawlik.com/2011/07/znow-o-migracji-baz-danych-slow-kilka/</link>
		<comments>http://blog.grzegorzpawlik.com/2011/07/znow-o-migracji-baz-danych-slow-kilka/#comments</comments>
		<pubDate>Sat, 16 Jul 2011 09:51:46 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1587</guid>
		<description><![CDATA[Kiedyś twierdziłem, że migracja bazy danych składa się z migracji struktury i migracji danych. Z tym akurat trudno się sprzeczać, ale co gorsza twierdziłem, że to są osobne sprawy i można je załatwić przy pomocy osobnych narzędzi. Otóż zmieniłem zdanie &#8230; <a href="http://blog.grzegorzpawlik.com/2011/07/znow-o-migracji-baz-danych-slow-kilka/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="/?p=538">Kiedyś twierdziłem</a>, że migracja bazy danych składa się z migracji struktury i migracji danych. Z tym akurat trudno się sprzeczać, ale co gorsza twierdziłem, że to są osobne sprawy i można je załatwić przy pomocy osobnych narzędzi.<br />
Otóż zmieniłem zdanie i twierdzę, że należy mieć jedno narzędzie.<br />
<span id="more-1587"></span><br />
Oto przykład. Wyobraź sobie System Rezerwacji Czegokolwiek ;) Możesz tam zarezerwować na przykład stolik w restauracji, albo koparkę gdy przebudowujesz swój ogród.</p>
<p>System do tej pory, dla każdego rodzaju rezerwacji wyliczał status rezerwacji (nowa, w trakcie, zakończona) w sposób dynamiczny. Rezerwacja stolika w restauracji jest zakończona, kiedy w systemie widnieje płatność za posiłek. Dla koparki to już za mało: musi zostać wystawiona faktura, istnieć przelew, a poza tym musi zostać dołączony dokument odbioru sprzętu w dobrym stanie.</p>
<p>Teraz okazuje się, że warto (ze względu na wydajność) zapisywać status jako cache, aby nie musieć wyliczać go za każdym razem. Rozważmy teraz dwa podejścia do migracji.</p>
<h4>System z niskim (albo żadnym) poziomem abstrakcji, czyli pliki sql&#8230;</h4>
<p>Masz dobre narzędzie, w którym możesz przeprowadzić migrację struktury bazy. Bez problemu napiszesz zapytanie alter table, dodasz pole. Jednak jeśli chcesz w tym samym systemie zmigrować dane (czyli dla wszystkich istniejących już rezerwacji na produkcji wyliczyć status i ustawić go w nowym polu) masz dwa wyjścia.</p>
<p>Albo napiszesz logikę biznesową odpowiadającą za wyliczanie statusów po raz drugi, albo napiszesz osobny skrypt, który będzie miał dostęp do obiektów biznesowych, gdzie zwyczajnie wywołasz metodę i jej wynik zapiszesz w nowym polu.</p>
<p>Pierwsze rozwiązanie jest oczywistą stratą czasu, no i oczywiście ryzykujesz wprowadzenie nowych błędów do systemu. W drugim przypadku, musisz zapamiętać że przy wdrożeniu nowego rozwiązania należy odpalić skrypt migracji. Jedna migracja z drugą nie są powiązana, a być powinny &#8211; uruchomienie jednej bez drugiej, albo w osobnej kolejności nie ma sensu.</p>
<h5>Liquidbase</h5>
<p>Tu warto wspomnieć o systemach, które wprowadzają pewien poziom abstrakcji (np. <a href="http://www.liquibase.org/">liquidbase</a>), jednak jest to jedynie abstrakcja od silnika bazy danych. Nadal niestety nie mają one dostępu do obiektów biznesowych.</p>
<h4>System o wysokim poziomie abstrakcji, zintegrowany z całą aplikacją</h4>
<p>Oczywiście mam tu coś konkretnego na myśli. Najlepszym przykładem jaki znam są migracje w Ruby on Rails. Rozwiązanie wyglądałoby mniej więcej tak (pseudoPHPkod)</p>
<pre name="code" class="php">
 class Migration1 {
   function up() {
     /* struktura */
     dodaj_pole_do_tabeli("rezerwacja", "status", "integer");
     /* dane */
     $rezerwacje = pobierz_wszystkie_rezerwacje(); //2
     foreach($rezerwacje as $rezerwacja) {
         $rezerwacja->status = $rezerwacja->wyliczStatus();
         $rezerwacja->zapisz();
     }
   }
   function down(){
     usun_pole_z_tabeli("rezerwacja", "status")
   }
 }
</pre>
<p>Widać tu wyraźnie, że migracja jest jednym spójnym krokiem. Migracja struktury i następująca zaraz po niej migracja danych. Sama klasa migracji ma bezpośredni dostęp do warstwy logiki biznesowej i może z niej bez przeszkód korzystać. </p>
<p>Piszę to dlatego, ze próbowałem pierwszego sposobu, gdyż jest on łatwiejszy w implementacji, gdy twój framwork nie ma zaimplementowanego sposobu drugiego. I przekonałem się, że warto albo zmienić framework na taki, który oferuje sposób drugi. Albo włożyć więcej energii w dostosowanie środowiska pracy aby jednak migracje były na wysokim poziomie abstrakcji.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2011/07/znow-o-migracji-baz-danych-slow-kilka/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to demo?</title>
		<link>http://blog.grzegorzpawlik.com/2011/06/how-to-demo/</link>
		<comments>http://blog.grzegorzpawlik.com/2011/06/how-to-demo/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 05:30:42 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1572</guid>
		<description><![CDATA[Use Case, Kryteria akceptacji, Przypadki testowe &#8211; jest wiele sposobów na to, żeby zdefiniować wymagania i zweryfikować poprawność ich implementacji. Ich wyszukane nazwy mogą być jednak odstraszające, klienci mogą nie być zachwyceni, że muszą się czegoś nowego nauczyć. Dlatego podoba &#8230; <a href="http://blog.grzegorzpawlik.com/2011/06/how-to-demo/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Use Case, Kryteria akceptacji, Przypadki testowe &#8211; jest wiele sposobów na to, żeby zdefiniować wymagania i zweryfikować poprawność ich implementacji.</p>
<p>Ich wyszukane nazwy mogą być jednak odstraszające, klienci mogą nie być zachwyceni, że muszą się czegoś nowego nauczyć. Dlatego podoba mi się określenie &#8220;How to demo?&#8221;.</p>
<p><strong>Opisz co musiałbym zrobić z systemem, żeby udowodnić Ci, że Twoje wymaganie zostało zaimplementowane?</strong></p>
<p>Na przykład historyjka </p>
<blockquote style="color: #666;"><p>Logowanie do systemu:<br />
wchodzę na stronę główną, wpisuję poprawne dane do logowania, po kliknięciu zaloguj widzę spersonalizowaną stronę startową (spersonalizowana, to taka, która mówi &#8216;witaj, Grzegorz&#8217;, o ile zalogował się Grzegorz)</p></blockquote>
<p>Proste, prawda?</p>
<p>Oczywiście UMLowiec powie, że trzeba w tym Use Casie dodać alternatywne, błędne &#8216;przebiegi&#8217;. Ja jednak powiem, że załatwią to osobne historyjki:</p>
<blockquote style="color: #666;"><p>Nieudane logowanie do systemu<br />
wchodzę na stronę główną, wpisuję niepoprawne dane do logowania, system pokazuje formularz logowania z dodatkowymi informacjami:<br />
- błędna para login/hasło<br />
- zapomniałeś hasła? (to jest link)</p></blockquote>
<p>i dalej, </p>
<blockquote style="color: #666;"><p>Przypomnienie hasła<br />
Po kliknięciu &#8220;zapomniałeś hasła&#8221; klient jest proszony o podanie adresu e-mail na który się zarejestrował, oraz kodu z obrazka. Gdy email jest w bazie, a kod prawidłowy klient dostaje e-mail z wygenerowanym, tymczasowym hasłem</p></blockquote>
<p>następnie:</p>
<blockquote style="color: #666;"><p>Logowanie przy pomocy tymczasowego hasła<br />
&#8230;</p></blockquote>
<p>Dalej sam już dasz sobie radę.</p>
<p>Myślę, że takie układanie historyjek jest szybkie, poza tym klient nie musi się tego uczyć &#8211; wystarczy, że przy odrobinie naszych wskazówek nauczy się oddzielać zadania od siebie, aby historyjki były krótkie (a przez to proste).<br />
Oczywiście zdarzają się skomplikowane zadania biznesowe &#8211; jednak zaprawieni i wytrenowani w łatwiejszych przypadkach możecie z przyjemnością zagłębić się w ten nowy wymagający i fascynujący (mam nadzieję) temat.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2011/06/how-to-demo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

