<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEcDSHc8fSp7ImA9WhBWFUk.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185</id><updated>2013-04-10T00:21:19.975+02:00</updated><category term="checkstyle" /><category term="jsf" /><category term="java" /><category term="web" /><category term="startup" /><category term="software books reviews" /><category term="cmmi" /><category term="oop" /><category term="maven2" /><category term="gsp" /><category term="grails" /><category term="scrum" /><category term="agile" /><category term="searchable" /><category term="groovy" /><category term="tips" /><category term="grails tutorials" /><category term="book review" /><category term="grails book review" /><category term="tdd" /><category term="Privacy Policy" /><category term="jasper" /><category term="testing" /><category term="requirements" /><category term="architecture" /><category term="user story" /><category term="svn" /><category term="kids" /><title>jan blog</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://jan-so.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>92</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/jan-so" /><feedburner:info uri="blogspot/jan-so" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CU4AQ3szcSp7ImA9Wx5TF00.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-6509187298412238212</id><published>2010-08-02T01:00:00.002+02:00</published><updated>2010-08-02T01:05:42.589+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-02T01:05:42.589+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="oop" /><title>Am I getting something wrong? (thinking about OOP)</title><content type="html">&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-color: transparent; font-family: 'Times New Roman'; font-size: medium; "&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;Maybe I am totally wrong but here is what is in my mind. Most of the books that describe object oriented programming, architecture or whatever are making examples using “objects” like person, cat, mammal and then big hierarchy of classes. Of course, more advance books are explaining why huge hierarchy of classes can be wrong and why it is good to use composition. I will not even try to explain that in this post.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;And then having these classes you can read about different aspects of OOP. Some of the examples can be:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;dog.bark()&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;person.walk()&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;person.openDoor()&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;engine.start()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;And I agree that these are almost great examples (except &lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;person.openDoor() &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;where I will come back later on). &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;So let me try to explain where are I am aiming with me question (in the caption of the post).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;For learning OOP these may be good examples but from my experience so far these are cases that I don’t meet so often in practice.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;Let try one example. Imagine class &lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;Can&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt; (not verb but noun). Coming from the examples above one could model method: &lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;Can.open()&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;. Uhmmm, is it really possible that &lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;Can &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;is able to open itself? I wouldn’t say this is reality. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;So what is solution here? Quite straight forward. Model a class &lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;CanOpener&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;. Then model method &lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;CanOpener.open(Can can)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;. This is now much closer to reality.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;But what is &lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;Can &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;and what is &lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;CanOpener &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;from the programming point of view? Well I would say:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;Can&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt; - is data&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;CanOpener&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt; - is service&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;And in most of the projects this is what I meet. Most often you are working with data and then perform something on that data. If you try to model your solution as explained at the beginning of the post you will finish with domain classes that have hundred of methods and probably thousands of lines. But very often domain classes are just data while services are actually performing real work. But be careful not to fall into trap of procedural programming.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;So come back to example from the beginning: &lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;person.openDoor()&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;. As I mentioned this is not good example. And again I would model this quite differently:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;Door&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;DoorOpener&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt; (interface)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;Person &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;(implements DoorOpener)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;It is clear that doors can be opened by person, but they can be opened by engine or wind. So “item” that is able to open door is again service while door is just class keeping data (entity). And yes, you need to add code to open door into &lt;/span&gt;&lt;span style="font-size: 11pt; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;Person &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;but again this can be great situation to use composition. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;I hope I successfully explained how I try to model solutions for programming problems.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;And just short note at the end. Please do not add Service, Manager or similar words at the end of class name. It can easy trap you into procedural programming as you will place too much responsibility into those “managers”.&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=RgO-d5Ot-zE:K-myxBc-nCE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=RgO-d5Ot-zE:K-myxBc-nCE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=RgO-d5Ot-zE:K-myxBc-nCE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=RgO-d5Ot-zE:K-myxBc-nCE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=RgO-d5Ot-zE:K-myxBc-nCE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=RgO-d5Ot-zE:K-myxBc-nCE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=RgO-d5Ot-zE:K-myxBc-nCE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=RgO-d5Ot-zE:K-myxBc-nCE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=RgO-d5Ot-zE:K-myxBc-nCE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=RgO-d5Ot-zE:K-myxBc-nCE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/RgO-d5Ot-zE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/6509187298412238212/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=6509187298412238212" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/6509187298412238212?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/6509187298412238212?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/RgO-d5Ot-zE/am-i-getting-something-wrong-thinking.html" title="Am I getting something wrong? (thinking about OOP)" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>5</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2010/08/am-i-getting-something-wrong-thinking.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUNQHs_eip7ImA9Wx5TFU8.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-864604630313901168</id><published>2010-07-31T00:00:00.000+02:00</published><updated>2010-07-31T00:01:31.542+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-31T00:01:31.542+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><title>Starting with Startup - Agile Acceptance Challenges</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; "&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;When starting with the agile development (Scrum as base in our case) there are always some challenges that you will meet at the beginning and during the road.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;I will try to explain structure of the team and acceptance of different agile parts.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Team&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;We have started with team of 6 (including me). Two of us already had experience with Scrum, one of us had experience with classical water-fall models and three had no experience with project management models. Few months later the team was extended with the tester.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;The structure of the team was (is) following:&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;3 senior developers - 2 with agile experience and 1 with water-fall experience&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;1 intermediate developer - experience only with ad-hoc project management model&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;1 junior developer - no experience with any project management model&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;1 designer - no experience with any real project management model&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;1 tester (few months later) - experience with water-fall models&lt;/div&gt;&lt;br /&gt;So let see how this team went through agile adoption.&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;For each part I will split acceptance into three parts:&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;- &lt;i&gt;with agile experience&lt;/i&gt; - acceptance of the team members who had agile experience&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;- &lt;i&gt;no experience&lt;/i&gt; -acceptance of the team members that had no experience with project management methodologies&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;- &lt;i&gt;water-fall experience&lt;/i&gt; - acceptance of the team members that had experience with water-fall project management models.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Writing requirements (user stories)&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;i&gt;With agile experience&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Team members that already had agile experience had no issues in writing user stories.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;i&gt;No experience&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Team members without experience with project management methodologies accepted user stories as the form of writing requirements. At the beginning there were some issues to write user story of the right size (sometimes they were too small or too big) but they got the right form very quickly.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;i&gt;Water-fall experience&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;In the case of developer user stories have never been really accepted. My feeling was that there was no even wish to understand what is advantage of user stories. User stories were constantly too big (e.g. As admin I can do anything). Actually this colleague have never accommodated to agile development and left the company later.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;In the case of tester acceptance of user stories came much faster. For him it is much easier to understand what to expect when user story is implemented. It is obvious that tester prefers user stories than complex use cases or other functional specification.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Estimation&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;i&gt;With agile experience&lt;/i&gt;&lt;/div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;Surprisingly here we needed some time to accommodate. The reason was that I have decided to use &lt;/span&gt;story points&lt;span class="Apple-style-span" style="font-style: normal; "&gt; as estimation method. But the team member with agile experience was used to &lt;/span&gt;ideal person days&lt;span class="Apple-style-span" style="font-style: normal; "&gt; estimation. It was confusing for him for some time. But at the end estimation model with user stories was fully accepted&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;i&gt;No experience and water-fall experience&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;After some turbulences at the beginning estimation model was accepted. The most issues were regarding over-estimation and under-estimation. But with help estimation became better and now is constant.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Meaning of DONE&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Meaning of DONE in agile is very interesting. You should finish user story in the way that in the future you should not come back to that user story. User story should be ready for production.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;i&gt;With agile experience&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Anybody with agile experience should not have problems to get meaning of DONE. At least that was the case with us.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;i&gt;No experience&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;At the beginning it was not so clear what DONE means. There were questions like: Is it already DONE? Can I improve this? I have such good idea, can I add it? &lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;All the time I have insisted only on implementing user story and focusing on tasks. Very soon they realized what done means and actually realized why DONE is very helpful. &lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;i&gt;Water-fall experience&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Here situation was much more interesting.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Developer with water-fall model experience had constant problems to get work DONE. There were always small tasks that can be easily finished later. There were always some missing features because they were not specified enough in the user story description. The "wrong" influence of the water-fall could be felt most of the time. &lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;But tester was much happier. He read user story and had understanding what to expect from it. This way he can test and easily see if it is DONE. There are no answers like: I will do it later. It quite simple - if you sent user story for testing everything must work.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Testing&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Under "testing" I mean writing unit and integration (as we use Grails) tests. Here situation differs from team member to team member. Some of them understand and know how to write good tests and some of the are still fighting to get the tests right. The most common issues are like: &lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;- writing test that tests too much functionality and spread through number of classes or services. &lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;- writing test that tests method not functionality&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;My feeling is that team accepted agile development very good. For team members without project methodology experience agile acceptance was easy and what is the most important natural. They have feeling that it is the right way to do the work. The most problems had a developer with water-fall experience. But the proof that having water-fall experience does not mean it is impossible to accommodate to agile is new team member that also came with water-fall experience but is accepting agile approach very good.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;What is your experience in accepting agile?&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=uLyuRWRRQCo:9BzCatkteRQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=uLyuRWRRQCo:9BzCatkteRQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=uLyuRWRRQCo:9BzCatkteRQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=uLyuRWRRQCo:9BzCatkteRQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=uLyuRWRRQCo:9BzCatkteRQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=uLyuRWRRQCo:9BzCatkteRQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=uLyuRWRRQCo:9BzCatkteRQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=uLyuRWRRQCo:9BzCatkteRQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=uLyuRWRRQCo:9BzCatkteRQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=uLyuRWRRQCo:9BzCatkteRQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/uLyuRWRRQCo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/864604630313901168/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=864604630313901168" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/864604630313901168?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/864604630313901168?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/uLyuRWRRQCo/starting-with-startup-agile-acceptance.html" title="Starting with Startup - Agile Acceptance Challenges" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2010/07/starting-with-startup-agile-acceptance.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEANQXw5eyp7ImA9WxFVF08.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-7619785943963735349</id><published>2010-06-17T00:17:00.000+02:00</published><updated>2010-06-17T00:19:50.223+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-17T00:19:50.223+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><title>Starting with Startup - Minimizing Unknowns</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; "&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;In the previous post I have explained some &lt;a href="http://jan-so.blogspot.com/2010/05/starting-with-startup-tools-and.html"&gt;reasoning why have we selected certain technologies&lt;/a&gt;, tools and processes. As mentioned all decisions were made to minimize number of unknowns in the project.&lt;br /&gt;&lt;br /&gt;So process was selected in a way so we can adapt easily - means Agile.&lt;br /&gt;Tools and technologies were selected according to project needs and common knowledge of the team.&lt;br /&gt;Hopefully team will get know each other as time passes by and I have believed that everything will go fine (and mostly lucky for us that was the case).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;But the biggest unknown was still there - PROJECT.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You cannot start development before you know what need to be implemented. Just having list of user stories would not be enough. You have to understand similar projects, you need to feel similar projects, know what are your main differences and how to use them to be successful.&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Or in short - team has to share the same &lt;b&gt;VISION&lt;/b&gt;.&lt;/div&gt;&lt;br /&gt;And next few sprints were devoted exactly to this. Project investigation. We have been doing 1 week sprints and each project member was investigating different aspects of the similar projects. We have studied things like:&lt;br /&gt;&lt;ul style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;features&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;user interface&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;easy of use&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;lot of discussion with product owner to get feeling what are his main ideas&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;At the end of each sprint we had demo. Demo was used to present in details what are doing similar companies (should I say competitors :) ). This way all project members (including product owner) were able to better understand what is expected from us and in which direction we should roll out project.&lt;br /&gt;&lt;br /&gt;We did couple of week length sprints and when we have feel confident enough we were able to start with the project.&lt;br /&gt;&lt;br /&gt;So let summarize steps we did so far:&lt;br /&gt;&lt;ul style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;process selection&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;team educatin&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;tools and technology selection&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;project investigation&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;And now we are finally ready to start with the project. So in next posts I will describe some challenges we had during project development. Stay tuned :)&lt;br /&gt;&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iV4rmXEaeyk:R2GZr5NYCOs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iV4rmXEaeyk:R2GZr5NYCOs:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=iV4rmXEaeyk:R2GZr5NYCOs:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iV4rmXEaeyk:R2GZr5NYCOs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=iV4rmXEaeyk:R2GZr5NYCOs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iV4rmXEaeyk:R2GZr5NYCOs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iV4rmXEaeyk:R2GZr5NYCOs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=iV4rmXEaeyk:R2GZr5NYCOs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iV4rmXEaeyk:R2GZr5NYCOs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=iV4rmXEaeyk:R2GZr5NYCOs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/iV4rmXEaeyk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/7619785943963735349/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=7619785943963735349" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/7619785943963735349?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/7619785943963735349?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/iV4rmXEaeyk/starting-with-startup-minimizing.html" title="Starting with Startup - Minimizing Unknowns" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2010/06/starting-with-startup-minimizing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcFR3g_cSp7ImA9WxFWE0k.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-7485231008839945723</id><published>2010-05-31T23:04:00.001+02:00</published><updated>2010-05-31T23:06:56.649+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-31T23:06:56.649+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><title>Starting with Startup - Tools and Technologies Reasoning</title><content type="html">For those that read 'Starting with Startup' posts I want to apologize for not writing recently but last months we have been working a lot. You know how it is in startups :)&lt;br /&gt;&lt;br /&gt;In the previous posts I have explained &lt;a href="http://jan-so.blogspot.com/2010/01/starting-with-startup-selecting.html"&gt;processes&lt;/a&gt; and &lt;a href="http://jan-so.blogspot.com/2010/02/starting-with-startup-setting-up.html"&gt;tools&lt;/a&gt; we have decided to use. There were some comments and questions why this and not that technology and similar.&lt;br /&gt;&lt;br /&gt;When you start with the startup everything is completely new. The following list captures the most important new things that each member of the startup team meet:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;team members&lt;/li&gt;&lt;li&gt;project&lt;/li&gt;&lt;li&gt;processes (you cannot expect that each team member will have experience with the process you select)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;technologies (you cannot expect that each team member will have experience with all technologies you select)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;As we all know it is much easier to predict result if there is minimum of unknowns. And in the startup company more or less everything is unknown - from the project to the project acceptance from final users. So what you try is to minimize unknowns. And to do that you have to carefully select each aspect of the technology and process.&lt;br /&gt;&lt;br /&gt;I would say that selection of agile and Scrum is more or less straight-forward. You want to be able to adapt to each new situation that will come up and what gives you more possibilities for that than agile development.&lt;br /&gt;&lt;br /&gt;How to minimize unknowns in the project will be topic of further posts.&lt;br /&gt;&lt;br /&gt;And at the end comes technology. And here is reasoning similar. You select what suites the best for the team and the project that is in front of you. And that is reason why we didn't select some upcoming technologies like GIT. We have created list of tools we need and then selected those that are the most known to all of us. And the result of selections are in details explained in the previous post.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=djOYpfO9Rf4:jLHNJV8hxlI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=djOYpfO9Rf4:jLHNJV8hxlI:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=djOYpfO9Rf4:jLHNJV8hxlI:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=djOYpfO9Rf4:jLHNJV8hxlI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=djOYpfO9Rf4:jLHNJV8hxlI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=djOYpfO9Rf4:jLHNJV8hxlI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=djOYpfO9Rf4:jLHNJV8hxlI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=djOYpfO9Rf4:jLHNJV8hxlI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=djOYpfO9Rf4:jLHNJV8hxlI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=djOYpfO9Rf4:jLHNJV8hxlI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/djOYpfO9Rf4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/7485231008839945723/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=7485231008839945723" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/7485231008839945723?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/7485231008839945723?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/djOYpfO9Rf4/starting-with-startup-tools-and.html" title="Starting with Startup - Tools and Technologies Reasoning" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2010/05/starting-with-startup-tools-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcAQHs5cCp7ImA9WxBVEks.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-4197873785917364994</id><published>2010-02-15T22:06:00.000+01:00</published><updated>2010-02-15T22:07:21.528+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-15T22:07:21.528+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><title>Starting with the Startup - Setting Up Development Environment</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; "&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;After we have set &lt;a href="http://jan-so.blogspot.com/2010/02/starting-with-startup-start-using-scrum.html"&gt;basics for using Scrum&lt;/a&gt; we can start with our first sprints. Our first sprints were devoted to choosing and setting up development environment.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;So let explore what do we know so far about the project (of course I knew much more than I can write in this post). &lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;* Our main focus are desktop and mobile web applications&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;* Our core business is in the field of affiliate networks&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;* We will use agile process or to be more specific Scrum&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;So I will jump directly into decisions we had to make and what have we decided:&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Web development framework&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Basically we have been deciding between two choices: Grails and Wicket. Who is reading my blog from time to time probably already knows answer to this. We have decided for &lt;b&gt;Grails&lt;/b&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Build process&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Although Grails have nice build commands we needed something that is easier to integrate with the builds of other projects. Basically we have been deciding between maven and ivy. As Grails supports ivy much better than maven we have decided for &lt;b&gt;ivy&lt;/b&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Continuous build process&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;More or less we have not been thinking too much here. We have decided for &lt;b&gt;Hudson&lt;/b&gt;. Hudson is easy to install, has great front-end for management and number of very useful plugins. One note: although Hudson has Grails plugin we are not using it. We are using ivy in the Hudson to build the Grails projects.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Bug tracker&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Although we would be happy not to have bugs that is not reality. So we needed bug tracker. As most of us had experience with Mantis we have decided that our bug tracking tool will be &lt;b&gt;Mantis&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Libraries repository&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;We will be depending on some external libraries. As we don't want to have them stored on Internet we needed some tool that handles dependencies. We have decided for &lt;b&gt;Nexus&lt;/b&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Source code control&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Although there are new source code control system like git we have decided to use probably the most common one &lt;b&gt;Subversion&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Mobile web development framework&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;After lot of investigation you find out that the market with the mobile web application frameworks is quite poor. The only available and really useful open source solution is: &lt;b&gt;WALL NG&lt;/b&gt;. Luckily we have managed to almost fully integrate WALL NG with the Grails.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;IDE Tool&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Although we didn't have any experience with InteliJ Idea as this is currently only tool with good support for groovy/grails we have decided that our IDE tool of selection is &lt;b&gt;InteliJ Idea&lt;/b&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;In-house Grails plugin repository&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;As Grails has number of useful plugins and we knew we will be using them. This leads that we need local Grails plugin repository. Grails repository is set in the Subversion.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Having setup like the one mentioned above should give you fluent build process that is easy to repeat in the any moment. Additionally Hudson will ensure that your build is in the fit condition because it will report all build and test breaks.&lt;/div&gt;&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Vp9OiR-qX9s:wiAw4a5oABg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Vp9OiR-qX9s:wiAw4a5oABg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Vp9OiR-qX9s:wiAw4a5oABg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Vp9OiR-qX9s:wiAw4a5oABg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Vp9OiR-qX9s:wiAw4a5oABg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Vp9OiR-qX9s:wiAw4a5oABg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Vp9OiR-qX9s:wiAw4a5oABg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Vp9OiR-qX9s:wiAw4a5oABg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Vp9OiR-qX9s:wiAw4a5oABg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Vp9OiR-qX9s:wiAw4a5oABg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/Vp9OiR-qX9s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/4197873785917364994/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=4197873785917364994" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/4197873785917364994?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/4197873785917364994?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/Vp9OiR-qX9s/starting-with-startup-setting-up.html" title="Starting with the Startup - Setting Up Development Environment" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2010/02/starting-with-startup-setting-up.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QDR306fyp7ImA9WxBWE08.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-5473837072998760312</id><published>2010-02-04T23:05:00.002+01:00</published><updated>2010-02-04T23:09:36.317+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-04T23:09:36.317+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><title>Starting with the Startup - Start Using Scrum</title><content type="html">&lt;span class="Apple-style-span"   style="  ;font-family:Verdana;font-size:13px;"&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;After &lt;a href="http://jan-so.blogspot.com/2010/01/starting-with-startup-selecting.html"&gt;Scrum has been selected as process&lt;/a&gt; and the &lt;a href="http://jan-so.blogspot.com/2010/01/starting-with-startup-educating-team.html"&gt;team have been educated about agile and Scrum&lt;/a&gt; we can start with setting up development environment. Very important thing to notice is that we can start using Scrum right away. Yes, Scrum can be used for tasks where you need to make decisions, investigation, setup of development environment and similar tasks. &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;As quite often those tasks are not too much time consuming and you want to review current status more often it is best to start with short sprints. E.g. we decided to make one week sprints. This means that you can review your progress, adapt to new findings and adjust your directions on the weekly basis. When you are deciding about length of the sprint you should ask question: For what time period can we be sure that we will not change our minds?&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;The first thing we did was not part of the sprint but we did that with the purpose. We wanted to select some Scrum tool. &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;More or less there are two basic options:&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;  * Using excel for product backlog and sprint backlog&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;  * Using some of existing (commercial or open sourced) Scrum tools&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;We have decided to use &lt;/span&gt;&lt;a href="http://danube.com/scrumworks" id="wse9" title="ScrumWorks"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;ScrumWorks&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; basic edition with the addition of the big pin-board.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;ScrumWorks enables you to have product backlog, sprint backlog with the burndown chart, and some advance reporting options. Pin-board is used for user story cards. Idea is to split the pin-board in columns (e.g. todo, progress, testing, done) so everybody can see the status of the current sprint by simply looking onto it. If you are asking: isn't Scrum tool enough, I would say no. The reason is that if you are not part of the team, to check the status of the sprint it is enough to check the pin-board. Without pin-board you would had to open Scrum tool and this is already enough to give it up on checking status of the sprint. &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;One of the most important features of the agile and Scrum is transparency.&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; We want to be aware of the real situation in each moment. If the project or sprint is late we want to find it out as soon as possible. &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;So we have prepared our Scrum tools and now we are ready to start sprint(s) for setting up development environment.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;So how we set up development environment will be described in the next post.&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=PTlAZpMymt0:l-_tTKowXd8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=PTlAZpMymt0:l-_tTKowXd8:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=PTlAZpMymt0:l-_tTKowXd8:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=PTlAZpMymt0:l-_tTKowXd8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=PTlAZpMymt0:l-_tTKowXd8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=PTlAZpMymt0:l-_tTKowXd8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=PTlAZpMymt0:l-_tTKowXd8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=PTlAZpMymt0:l-_tTKowXd8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=PTlAZpMymt0:l-_tTKowXd8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=PTlAZpMymt0:l-_tTKowXd8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/PTlAZpMymt0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/5473837072998760312/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=5473837072998760312" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/5473837072998760312?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/5473837072998760312?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/PTlAZpMymt0/starting-with-startup-start-using-scrum.html" title="Starting with the Startup - Start Using Scrum" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2010/02/starting-with-startup-start-using-scrum.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4NSH4_fCp7ImA9WxBXGUo.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-4905063669818426935</id><published>2010-01-31T22:37:00.000+01:00</published><updated>2010-01-31T22:39:59.044+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-31T22:39:59.044+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><title>Starting with the Startup - Educating the Team</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; "&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;In the previous post I have explained &lt;a href="http://jan-so.blogspot.com/2010/01/starting-with-startup-selecting.html"&gt;why we have choose agile approach&lt;/a&gt;&lt;b&gt; &lt;/b&gt;or more directly Scrum. But before you start using agile approach it is very important to explain what is agile and Scrum to the whole team and of course to the management.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;In our case we are lucky because we have full support from the management. It means there are no "artificial" obstacles in implementing Scrum. The only real obstacle are we. So before going on I made presentation about Scrum, team members did some reading and then we discussed about the whole approach.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;So when you are educating team do not forget to explain to them:&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ul&gt;&lt;li&gt;Cores of the agile and the Scrum&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;And especially take care to explain:&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ul&gt;&lt;li&gt;Why everything in Scrum is time-boxed&lt;/li&gt;&lt;li&gt;What is user story and what are the differences between user story and use case&lt;/li&gt;&lt;li&gt;What means DONE&lt;/li&gt;&lt;li&gt;What is goal of the sprint&lt;/li&gt;&lt;li&gt;What is velocity and why it gives better estimation when things will be done than "classical" approaches&lt;/li&gt;&lt;li&gt;Why testing is so important in the agile approach&lt;/li&gt;&lt;li&gt;What is burndown chart and how it helps the whole team&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;It may be clear why these points are important but I will shortly explain why I think it is important to take care there is full understanding of them.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Time-boxing&lt;/b&gt; - very often developers are used to implement some tasks as long as they want. Even after deadlines. In Scrum everything is time-boxed because this way everybody have to be focused that features have to be finished in proposed time. So it is not possible to change architecture forever. In one moment you have to decide and do implementation.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;User story - &lt;/b&gt;in lot of companies and even in schools developers are used to thing in use cases. While use cases are good very often they put limitation that need not to be set in given moment. Classical examples are: then user clicks the button.... How the use case knows there is .... button. User story explains functionality that user wants to achieve without too much details.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Done -&lt;/b&gt; Done must mean: I am confident that feature implemented can go online. It is tested, written in good quality and I believe there are no bugs. This should be approach for all features that are marked done. You should not return back to this feature.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Goal of the sprint&lt;/b&gt; - you have to set goal if you want to have good feeling at the end of sprint. How could you know if your sprint was success or failure without clear goal?&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Velocity&lt;/b&gt; - velocity is number that based on the experience (yesterday's weather) tells you how much team can implement in the given period of time. Velocity is better than "classical" approaches because it covers meetings, phone calls, unexpected bugs and everything that is happening more or less regulary. &lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Testing&lt;/b&gt; - if there are no tests how can you change the code and be sure that you didn't break any of the existing functionality. Well you cannot and you have to check everything after each change. If you have lot of tests you just run them and find out immediately if you have broke some existing functionality.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Burndown&lt;/b&gt; - is great tool that tells you without mercy you current status. It will tell you if you are doing good or if you are doing bad. Just have it in front of eyes.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Conclusion:&lt;/b&gt; If you have decided to take agile approach do not forget to educate developers what is agile. It is better to do it at the beginning then fixing problems in the middle.&lt;/div&gt;&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=jX32pMN2ESM:I2gKcam6EBQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=jX32pMN2ESM:I2gKcam6EBQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=jX32pMN2ESM:I2gKcam6EBQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=jX32pMN2ESM:I2gKcam6EBQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=jX32pMN2ESM:I2gKcam6EBQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=jX32pMN2ESM:I2gKcam6EBQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=jX32pMN2ESM:I2gKcam6EBQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=jX32pMN2ESM:I2gKcam6EBQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=jX32pMN2ESM:I2gKcam6EBQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=jX32pMN2ESM:I2gKcam6EBQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/jX32pMN2ESM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/4905063669818426935/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=4905063669818426935" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/4905063669818426935?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/4905063669818426935?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/jX32pMN2ESM/starting-with-startup-educating-team.html" title="Starting with the Startup - Educating the Team" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2010/01/starting-with-startup-educating-team.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUCSXw8fCp7ImA9WxBXFUk.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-7255063986845674421</id><published>2010-01-26T22:08:00.001+01:00</published><updated>2010-01-26T22:11:08.274+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-26T22:11:08.274+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><title>Starting with the Startup - Selecting Processes</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; "&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;In the previous post about &lt;a href="http://jan-so.blogspot.com/2010/01/starting-with-startup.html"&gt;Starting with the Startup&lt;/a&gt; I explained that as our first step we have decided to choose processes. Of course one of the most important decisions to make is to choose right management methodology (framework). The product owner (managing director) was coming from the company with the strong full life cycle (waterfall if you prefer this way) process. He had no idea about any other processes and he was used to work in that way. Even all the next steps he planned were in that direction. There was plan to hire external consultant that will more or less write "book with the boxes" that we will implement. And that will be our solutions.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;The good thing is that although he didn't know for something else than waterfall methodology he didn't like waterfall approach. &lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;So as you may guess it was not hard to explain him what is agile, what is scrum and what are advantages of the agile approach compared to waterfall approach.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;For those who don't know difference just shortly: in waterfall you define and plan the whole project in advance and then just implement what was planned. No changes are allowed or complex change request processes are defined to introduce new requirements. In agile style you create vision and rough plan of your project and then implement your project in increments and iterations. You allow project to grow and change in the way according you new discoveries or business needs.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Selecting agile approach out of the box would be mistake because for any decision you should have a good reasons. So let analyze situation we have.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ul&gt;&lt;li&gt;We are startup company with small number of developers.&lt;/li&gt;&lt;li&gt;We have rough idea what is our goal&lt;/li&gt;&lt;li&gt;Our main focus are desktop and mobile web applications&lt;/li&gt;&lt;li&gt;The market where we are moving is changing rapidly&lt;/li&gt;&lt;li&gt;We are not sure and not aware of all the features we will need in our applications&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Possibility 1: Waterfall (or similar strong processes)&lt;/b&gt; - if we choose this path it means that we need to define all the features of our applications. Oops, we are still not sure how many applications we will have. Not to talk about features of those applications. Ok, but if we analyze problem carefully maybe we would be able to define all the features in all the applications. But the next problem is: market is changing rapidly. Are we sure we want to create detailed plans too far in the future knowing that market will change in the mean time. &lt;i&gt;Decision: this is not the way we should go&lt;/i&gt;.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Possibility 2: Agile (Scrum) &lt;/b&gt;- I would say this is the direct hit. Agile approach is good to use if you have clear vision but not clear plan. If you have small (up to 9 persons) collocated team. If you requirements can change fast according to new discoveries and you need to adjust your goals according to market changes. Well if you check the list above agile is covering situation we have.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Decision:&lt;/b&gt; So actually it was not so hard to make the decision. We have decided to take agile approach implemented with Scrum.&lt;/div&gt;&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=KEgDTHFKqoc:JDPH988C6lE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=KEgDTHFKqoc:JDPH988C6lE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=KEgDTHFKqoc:JDPH988C6lE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=KEgDTHFKqoc:JDPH988C6lE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=KEgDTHFKqoc:JDPH988C6lE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=KEgDTHFKqoc:JDPH988C6lE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=KEgDTHFKqoc:JDPH988C6lE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=KEgDTHFKqoc:JDPH988C6lE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=KEgDTHFKqoc:JDPH988C6lE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=KEgDTHFKqoc:JDPH988C6lE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/KEgDTHFKqoc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/7255063986845674421/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=7255063986845674421" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/7255063986845674421?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/7255063986845674421?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/KEgDTHFKqoc/starting-with-startup-selecting.html" title="Starting with the Startup - Selecting Processes" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2010/01/starting-with-startup-selecting.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkABQHczeSp7ImA9WxBXFEs.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-2114230695548786665</id><published>2010-01-26T00:03:00.001+01:00</published><updated>2010-01-26T00:05:51.981+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-26T00:05:51.981+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><title>Starting with the Startup</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; "&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Few months ago (October last year) I have joined the startup company. An what is the real luck I have joined them really at the beginning. So when I came on my first working day there was server room prepared, tables with computers and few developers that joined the company a month before me. The core business of the company is (will be) affiliate networks and mobile web applications. It is quite young and very innovating area of the current industry trends. If you don't believe me Google it :)&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;The great thing in joining startup right from the beginning is that you have big influence on the whole process. It is never boring and commonly it is taken care that the team is created from great people and developers. And of course it does not mean that big and small companies do not have great people and great developers.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;So when the team is established, servers are prepared and there is rough idea what needs to be implemented you can jump right away into development. You install Eclipse, and start writing code. And doing it this way you will fail in a few months :)&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;First steps to be done are to establish some basic processes. As my part is mainly considered to development processes I will go through development processes and development environment setup.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Well our decisions I will explain in the coming posts. &lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=TPoK4SRWnLA:dXDlRT_pHyU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=TPoK4SRWnLA:dXDlRT_pHyU:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=TPoK4SRWnLA:dXDlRT_pHyU:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=TPoK4SRWnLA:dXDlRT_pHyU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=TPoK4SRWnLA:dXDlRT_pHyU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=TPoK4SRWnLA:dXDlRT_pHyU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=TPoK4SRWnLA:dXDlRT_pHyU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=TPoK4SRWnLA:dXDlRT_pHyU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=TPoK4SRWnLA:dXDlRT_pHyU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=TPoK4SRWnLA:dXDlRT_pHyU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/TPoK4SRWnLA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/2114230695548786665/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=2114230695548786665" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/2114230695548786665?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/2114230695548786665?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/TPoK4SRWnLA/starting-with-startup.html" title="Starting with the Startup" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2010/01/starting-with-startup.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcERnszcCp7ImA9WxBRFUs.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-8196206012946540144</id><published>2010-01-04T01:03:00.003+01:00</published><updated>2010-01-04T01:13:27.588+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-04T01:13:27.588+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kids" /><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title>New feature on spend day with kids</title><content type="html">For those who are using &lt;a href="http://www.spenddaywithkids.com"&gt;spend day with kids&lt;/a&gt; site or find it interesting or useful just to let you know that I have added some new features. Now it is possible to search for indoor and outdoor places to go with kids. So for example now it is possible to search for &lt;a href="http://www.spenddaywithkids.com/home/placesAroundLocation?locationName=london&amp;amp;distance=50&amp;amp;orderBy=closest&amp;amp;_indoor=&amp;amp;indoor=on&amp;amp;_outdoor=&amp;amp;_action_placesAroundLocation=Show+me"&gt;indoor places to go with kids in the range of 50 kms from London&lt;/a&gt; or &lt;a href="http://www.spenddaywithkids.com/home/placesAroundLocation?locationName=new+york&amp;amp;distance=20&amp;amp;orderBy=closest&amp;amp;_indoor=&amp;amp;_outdoor=&amp;amp;outdoor=on&amp;amp;_action_placesAroundLocation=Show+me"&gt;outdoor things to do with kids in the range of 20 kms from New York&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As I have recently changed my job position my free time become really limited so it is really hard to work on pet projects. Even this small change would be almost impossible if there would not be Grails. Thanks to it it's quite easy to add new features. Actually implementation took only few hours and updating all over 1400 places to visit took much more time. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope that in the coming days I will be able to write some posts about my experience with Grails in the startup company. We had lot of interesting points that deserves blogs posts. &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=KoiXm0O81xk:SIsmVzCMH-w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=KoiXm0O81xk:SIsmVzCMH-w:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=KoiXm0O81xk:SIsmVzCMH-w:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=KoiXm0O81xk:SIsmVzCMH-w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=KoiXm0O81xk:SIsmVzCMH-w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=KoiXm0O81xk:SIsmVzCMH-w:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=KoiXm0O81xk:SIsmVzCMH-w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=KoiXm0O81xk:SIsmVzCMH-w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=KoiXm0O81xk:SIsmVzCMH-w:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=KoiXm0O81xk:SIsmVzCMH-w:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/KoiXm0O81xk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/8196206012946540144/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=8196206012946540144" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/8196206012946540144?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/8196206012946540144?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/KoiXm0O81xk/new-feature-on-spend-day-with-kids.html" title="New feature on spend day with kids" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2010/01/new-feature-on-spend-day-with-kids.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04MQHs4cCp7ImA9WxNVFko.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-1355405500454869320</id><published>2009-10-27T22:42:00.003+01:00</published><updated>2009-10-27T22:46:21.538+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-27T22:46:21.538+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title>RSS Builder in Grails in a Few minutes</title><content type="html">&lt;p&gt;As I planned to include RSS feeds into &lt;a href="http://www.spenddaywithkids.com/"&gt;www.spenddaywithkids.com&lt;/a&gt; I needed possibility to create kind of RSS Builder. The good example of what I needed is &lt;a href="http://rss.icerocket.com/"&gt;IceRocket RSS Builder&lt;/a&gt;. So you are not generating RSS feeds directly from the data on your site but you are writing them manually. This way RSS feeds become kind of communication channel between the web site and users. &lt;/p&gt;  &lt;p&gt;I would stay with IceRocket but I couldn’t find possibility to do even simple formatting for RSS items. So my thought was let see how it is complicated to do it in Grails. And it turned out that it takes only few minutes to get very similar functionality. So here is short example done almost step by step.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; As my site is currently running on Grails 1.0.3 maybe not everything will be compatible with 1.1 version out of the box.&lt;/p&gt;  &lt;p&gt;So let go with implementation.&lt;/p&gt;  &lt;p&gt;First create grails application and named it rssbuilder.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;grails create-app rssbuilder&lt;/pre&gt;Then create two domain classes:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; RssChannel {&lt;br /&gt;   String name&lt;br /&gt;   String channelLink&lt;br /&gt;   String description&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;static&lt;/span&gt; constraints = {&lt;br /&gt;       name(blank:&lt;span class="kwrd"&gt;false&lt;/span&gt;, nullable:&lt;span class="kwrd"&gt;false&lt;/span&gt;, unique:&lt;span class="kwrd"&gt;true&lt;/span&gt;)&lt;br /&gt;       channelLink(blank:&lt;span class="kwrd"&gt;false&lt;/span&gt;, nullable:&lt;span class="kwrd"&gt;false&lt;/span&gt;, unique:&lt;span class="kwrd"&gt;false&lt;/span&gt;, url:&lt;span class="kwrd"&gt;true&lt;/span&gt;)&lt;br /&gt;       description(blank:&lt;span class="kwrd"&gt;true&lt;/span&gt;, nullable:&lt;span class="kwrd"&gt;true&lt;/span&gt;, maxSize:30000)&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; RssItem {&lt;br /&gt;   String title&lt;br /&gt;   String itemLink&lt;br /&gt;   String summary&lt;br /&gt;   RssChannel rssChannel&lt;br /&gt;   Date dateCreated&lt;br /&gt;   Date lastUpdated   &lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;static&lt;/span&gt; constraints = {&lt;br /&gt;       title(blank:&lt;span class="kwrd"&gt;false&lt;/span&gt;, nullable:&lt;span class="kwrd"&gt;false&lt;/span&gt;, unique:&lt;span class="kwrd"&gt;false&lt;/span&gt;)&lt;br /&gt;       itemLink(blank:&lt;span class="kwrd"&gt;false&lt;/span&gt;, nullable:&lt;span class="kwrd"&gt;false&lt;/span&gt;, unique:&lt;span class="kwrd"&gt;false&lt;/span&gt;, url:&lt;span class="kwrd"&gt;true&lt;/span&gt;)&lt;br /&gt;       summary(blank:&lt;span class="kwrd"&gt;false&lt;/span&gt;, nullable:&lt;span class="kwrd"&gt;false&lt;/span&gt;, unique:&lt;span class="kwrd"&gt;false&lt;/span&gt;, maxSize:50000)&lt;br /&gt;       rssChannel(blank:&lt;span class="kwrd"&gt;false&lt;/span&gt;, nullable:&lt;span class="kwrd"&gt;false&lt;/span&gt;, unique:&lt;span class="kwrd"&gt;false&lt;/span&gt;)&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;Ah, don’t forget to install two plugins: &lt;a href="http://grails.org/plugin/feeds"&gt;Feeds Plugin&lt;/a&gt; and &lt;a href="http://grails.org/plugin/richui"&gt;RichUI plugin&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now we can generate controllers and views for two domain classes:&lt;br /&gt;&lt;pre class="csharpcode"&gt;grails generate-all RssChannel&lt;br /&gt;grails generate-all RssItem&lt;/pre&gt;Well now if you start application you are able to specify RSS channel and items for RSS channel. To provide possibility to specify better formatting for RssItem we can reuse &amp;lt;richui:richTextEditor tag from the RichUI plugin. In the create and edit view of the RssItem change summary and bind it to the &lt;em&gt;richTextEditor&lt;/em&gt;. More or less you should &lt;em&gt;input &lt;/em&gt;tag with the following:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;richui:richTextEditor&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="summary"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="${rssItem?.summary}"&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;="525"&lt;/span&gt; &lt;span class="attr"&gt;height&lt;/span&gt;&lt;span class="kwrd"&gt;="525"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;Now to generate RSS feed we can reuse functionality of the Feed plugin. So create FeedController class with command grails create-controller Feed.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The code of the feed controller should be:&lt;/p&gt;&lt;pre class="csharpcode"&gt;    def rss = {&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;params&lt;/span&gt;.id) {&lt;br /&gt;           render &lt;span class="str"&gt;"missing id in params"&lt;/span&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       RssChannel rssChannel = RssChannel.get(&lt;span class="kwrd"&gt;new&lt;/span&gt; Long(&lt;span class="kwrd"&gt;params&lt;/span&gt;.id))&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt;(!rssChannel) {&lt;br /&gt;           render &lt;span class="str"&gt;"rss channel not found"&lt;/span&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       render(feedType:&lt;span class="str"&gt;"rss"&lt;/span&gt;, feedVersion:&lt;span class="str"&gt;"2.0"&lt;/span&gt;) {&lt;br /&gt;           title = rssChannel.name&lt;br /&gt;           link = rssChannel.channelLink&lt;br /&gt;           description = rssChannel.description&lt;br /&gt;           RssItem.findAllByRssChannel(rssChannel, [sort:&lt;span class="str"&gt;"dateCreated"&lt;/span&gt;, order:&lt;span class="str"&gt;"desc"&lt;/span&gt;]).each() { item -&amp;gt;&lt;br /&gt;               entry(item.title) {&lt;br /&gt;                   link=item.itemLink&lt;br /&gt;                   item.summary&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;/pre&gt;So now if you start application and create RSS channel and some items in that channel all you need to know is ID of that channel.&lt;br /&gt;&lt;p&gt;If the Id of the channel is e.g. 1 in the browser write &lt;a title="http://localhost:8080/rssbuilder/feed/rss/1" href="http://localhost:8080/rssbuilder/feed/rss/1"&gt;http://localhost:8080/rssbuilder/feed/rss/1&lt;/a&gt; and you will see your feed.&lt;/p&gt;&lt;p&gt;I believe this was really easy :)&lt;/p&gt;&lt;p&gt;As soon as I switch fun &lt;a href="http://www.spenddaywithkids.com"&gt;places to go with kids&lt;/a&gt; to the Grails 1.1 I will create plugin from this.&lt;br /&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iw1BB0_eVdc:T83loOIvw_A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iw1BB0_eVdc:T83loOIvw_A:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=iw1BB0_eVdc:T83loOIvw_A:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iw1BB0_eVdc:T83loOIvw_A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=iw1BB0_eVdc:T83loOIvw_A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iw1BB0_eVdc:T83loOIvw_A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iw1BB0_eVdc:T83loOIvw_A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=iw1BB0_eVdc:T83loOIvw_A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iw1BB0_eVdc:T83loOIvw_A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=iw1BB0_eVdc:T83loOIvw_A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/iw1BB0_eVdc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/1355405500454869320/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=1355405500454869320" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/1355405500454869320?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/1355405500454869320?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/iw1BB0_eVdc/rss-builder-in-grails-in-few-minutes.html" title="RSS Builder in Grails in a Few minutes" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/10/rss-builder-in-grails-in-few-minutes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYGRHcycSp7ImA9WxNVFUw.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-8848140398242397959</id><published>2009-10-26T00:06:00.003+01:00</published><updated>2009-10-26T00:08:45.999+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-26T00:08:45.999+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gsp" /><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title>Grails scaffolding for domain classes in packages</title><content type="html">&lt;p&gt;While working on one simple subproject for &lt;a href="http://www.spenddaywithkids.com/"&gt;spend day with kids&lt;/a&gt; I got one interesting issue. I don't use scaffolding too often but this time I needed to get proof of concept. And I came to something where I am not sure if it is a bug or feature. And just to be clear this is happening with Grails version 1.0.3 and I am not sure if it is reproducible in later versions.&lt;/p&gt;  &lt;p&gt;Note: Having packages for domain classes is highly advisable and you should always use packages for all domain classes.   &lt;br /&gt;So let get to the point. I have create following domain class (please notice that package is defined).&lt;/p&gt;  &lt;pre class="csharpcode"&gt;com.jan.rssbuilder.domain.RssChannel&lt;/pre&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color:&lt;/style&gt;And after that I have created RssChannelController this way:&lt;br /&gt;&lt;pre class="csharpcode"&gt;package com.jan.rssbuilder.domain&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; RssChannelController {&lt;br /&gt;   def scaffold = &lt;span class="kwrd"&gt;true&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;After accessing this controller I got following exception:&lt;br /&gt;&lt;pre class="csharpcode"&gt;java.lang.IllegalStateException: Scaffolder supports action [index] &lt;span class="kwrd"&gt;for&lt;/span&gt; controller [com.jan.rssbuilder.domain.RssChannelController] but getAction returned &lt;span class="kwrd"&gt;null&lt;/span&gt;!&lt;/pre&gt;After changing controller by specifying domain class everything worked fine:&lt;br /&gt;&lt;pre class="csharpcode"&gt;package com.jan.rssbuilder.domain&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; RssChannelController {&lt;br /&gt;   def scaffold = com.jan.rssbuilder.domain.RssChannel&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=rdBMPGFLlTQ:iTNklR5SOcA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=rdBMPGFLlTQ:iTNklR5SOcA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=rdBMPGFLlTQ:iTNklR5SOcA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=rdBMPGFLlTQ:iTNklR5SOcA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=rdBMPGFLlTQ:iTNklR5SOcA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=rdBMPGFLlTQ:iTNklR5SOcA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=rdBMPGFLlTQ:iTNklR5SOcA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=rdBMPGFLlTQ:iTNklR5SOcA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=rdBMPGFLlTQ:iTNklR5SOcA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=rdBMPGFLlTQ:iTNklR5SOcA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/rdBMPGFLlTQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/8848140398242397959/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=8848140398242397959" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/8848140398242397959?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/8848140398242397959?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/rdBMPGFLlTQ/grails-scaffolding-for-domain-classes.html" title="Grails scaffolding for domain classes in packages" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/10/grails-scaffolding-for-domain-classes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEABQXszfCp7ImA9WxNWGEQ.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-4955624883043985496</id><published>2009-10-18T22:10:00.002+02:00</published><updated>2009-10-18T22:12:30.584+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-18T22:12:30.584+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="gsp" /><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title>Tips for working with front-end in Grails</title><content type="html">&lt;p&gt;I have implemented few web projects with Grails and some techniques while working with Grails front-end turned out to be better than other. When I didn’t follow them later on I usually had to refactor the code and did it the correct way.&lt;/p&gt;  &lt;p&gt;If you are reading this blog you noticed that I write very often about developing front-end with Grails. The reason is not that I am the best in the front-end but the reason is that I am the worst in the front-end. I am back-end developer and what I was missing in the majority of web frameworks was impossibility to make front-end more modular. In Grails this is easily to achieve thanks to &lt;a href="http://jan-so.blogspot.com/2008/06/make-gsp-readable-with-grails-templates.html"&gt;Grails templates and tags&lt;/a&gt;. And then you are almost to code in the normal java code.&lt;/p&gt;  &lt;p&gt;But come back to tips.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tip 1:&lt;/strong&gt; Always create one gsp page per state of the result.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tip 2:&lt;/strong&gt; Use templates and tags to make your pages more modular.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tip 3:&lt;/strong&gt; When ever it gives sense send custom model classes to the gsp page (not the domain classes). &lt;/p&gt;  &lt;p&gt;Well tips are nothing without some example. As an example I will take my latest project &lt;a href="http://www.spenddaywithkids.com/"&gt;fun things to do with kids&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In the first installment home page had following responsibilities:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;As a starting point for visitors&lt;/li&gt;    &lt;li&gt;To display found places to go with kids&lt;/li&gt;    &lt;li&gt;To inform user that the city provided cannot be uniquely  identified (there is more than one city with provided name)&lt;/li&gt;    &lt;li&gt;To inform user that no attractions were found around provided city&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As you can see that is obvious break of the SRP (single responsibility principle). Because of too much responsibilities the model I was sending to the page was quite complex and the page contained number of &lt;em&gt;if&lt;/em&gt; blocks. And you must admit that having &lt;em&gt;if&lt;/em&gt; blocks in the html page is not the best practice. Another side effect was that page had about 300 lines that is simply too much.&lt;/p&gt;  &lt;p&gt;So what I did? Well, of course I did some refactoring. &lt;/p&gt;  &lt;p&gt;I have created one page per responsibility and depending on result controller decide which page to display and provides correct data model (is this maybe kind of strategy pattern?). This way it is much easier to understand what pages are doing. And now they are up to 30 lines long.&lt;/p&gt;  &lt;p&gt;But if you check pages you can see they are quite similar:&lt;/p&gt;  &lt;p&gt;To see home page navigate to: &lt;a href="http://www.spenddaywithkids.com/"&gt;spend day with kids&lt;/a&gt;   &lt;br /&gt;To see page with results navigate to: &lt;a href="http://www.spenddaywithkids.com/home/placesAroundLocation?locationName=nottingham&amp;amp;distance=20&amp;amp;orderBy=closest&amp;amp;_action_placesAroundLocation=Show+me"&gt;things to do with kids in Nottingham&lt;/a&gt;   &lt;br /&gt;To see page where there are multiple cities e.g. &lt;a href="http://www.spenddaywithkids.com/home/placesAroundLocation?locationName=Malinovo&amp;amp;distance=100&amp;amp;orderBy=closest&amp;amp;_action_placesAroundLocation=Show+me"&gt;search for Malinovo&lt;/a&gt;. Select Malinovo, Slovakia to see places to visit nearby my home :)   &lt;br /&gt;To see page where there are no results check e.g. for &lt;a href="http://www.spenddaywithkids.com/home/placesAroundLocation?locationName=belgrade&amp;amp;distance=100&amp;amp;orderBy=closest&amp;amp;_action_placesAroundLocation=Show+me"&gt;Belgrade&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;If you checked all these pages you can notice that they are very similar but little bit different. So how do you solve similarities. Very easy. Use &lt;strong&gt;templates and tags&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;And the last but not the least, it is obvious that the data models delivered to the pages can be quite different and even some cases need not to contain any domain classes.&lt;/p&gt;&lt;p&gt;So I hope that those tips will help you while working on your own grails projects.&lt;br /&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=U-MD7sRz0ig:JYaly3IpjUU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=U-MD7sRz0ig:JYaly3IpjUU:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=U-MD7sRz0ig:JYaly3IpjUU:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=U-MD7sRz0ig:JYaly3IpjUU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=U-MD7sRz0ig:JYaly3IpjUU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=U-MD7sRz0ig:JYaly3IpjUU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=U-MD7sRz0ig:JYaly3IpjUU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=U-MD7sRz0ig:JYaly3IpjUU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=U-MD7sRz0ig:JYaly3IpjUU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=U-MD7sRz0ig:JYaly3IpjUU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/U-MD7sRz0ig" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/4955624883043985496/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=4955624883043985496" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/4955624883043985496?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/4955624883043985496?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/U-MD7sRz0ig/tips-for-working-with-front-end-in.html" title="Tips for working with front-end in Grails" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/10/tips-for-working-with-front-end-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MBR3w-eip7ImA9WxNWF0U.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-1538566373491855198</id><published>2009-10-17T13:44:00.002+02:00</published><updated>2009-10-17T14:10:56.252+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-17T14:10:56.252+02:00</app:edited><title>New features on spend day with kids</title><content type="html">I have finally found some free time so I decided to implement some new features on &lt;a href="http://www.spenddaywithkids.com"&gt;spend day with kids&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So far all searches have been performed with the same default parameters. The defaults were distance is 100 kms and the sorting of attractions was by type.&lt;br /&gt;&lt;br /&gt;Very soon after the launch of the site I got mail from Jeff where he proposed that results should be displayed in the order of proximity from the provided city. I liked the idea immediately and now this feature is supported.&lt;br /&gt;&lt;br /&gt;So now you can provide city or even address and specify the distance of places to be searched and additionally to select ordering type. Possible ordering types are of course by distance and by city.&lt;br /&gt;&lt;br /&gt;As you probably know spend day with kids site helps you find great &lt;a href="http://www.spenddaywithkids.com"&gt;family days out&lt;/a&gt; and is implemented with Grails. While developing this site, so far I didn't hit any special interesting features that could be worth for blogging about. But if you have any ideas just let me know&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iXH5j05Jymo:Fo64QUG3-NA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iXH5j05Jymo:Fo64QUG3-NA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=iXH5j05Jymo:Fo64QUG3-NA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iXH5j05Jymo:Fo64QUG3-NA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=iXH5j05Jymo:Fo64QUG3-NA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iXH5j05Jymo:Fo64QUG3-NA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iXH5j05Jymo:Fo64QUG3-NA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=iXH5j05Jymo:Fo64QUG3-NA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=iXH5j05Jymo:Fo64QUG3-NA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=iXH5j05Jymo:Fo64QUG3-NA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/iXH5j05Jymo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/1538566373491855198/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=1538566373491855198" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/1538566373491855198?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/1538566373491855198?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/iXH5j05Jymo/new-features-on-spend-day-with-kids.html" title="New features on spend day with kids" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/10/new-features-on-spend-day-with-kids.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08GQHg8fyp7ImA9WxNWEU8.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-109239724362928665</id><published>2009-10-10T01:01:00.002+02:00</published><updated>2009-10-10T01:10:21.677+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-10T01:10:21.677+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><title>Hope to have more material for blogging</title><content type="html">I am aware that last few weeks I was quite lazy with blogging but as I was changing employer so lot of responsibilities have been in front of me. Of course, important part was knowledge transfer.  From the October I am in my new company.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First I would like to thanks my previous company for having a chance to work on interesting and exciting projects.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the new company I am coming to the position of Head of Software Development. It is a small start up company and we are working on the green field project. Yes, you see it right, its green field :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As my future work will include some new technologies and different market I hope that I will have lot of materials for blogging. We will mainly work with affiliate networks and mobile web development. As this is quite new field for me I believe I will be able to share a lot of interesting discoveries.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As the field we will be working in is very dynamic we are of course on Scrum and agile software development. Dynamic projects and agile software development create great combination. I am very sure we will have lot of fun. &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=xURVOEPm4fM:Er_j8uqhmMw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=xURVOEPm4fM:Er_j8uqhmMw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=xURVOEPm4fM:Er_j8uqhmMw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=xURVOEPm4fM:Er_j8uqhmMw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=xURVOEPm4fM:Er_j8uqhmMw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=xURVOEPm4fM:Er_j8uqhmMw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=xURVOEPm4fM:Er_j8uqhmMw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=xURVOEPm4fM:Er_j8uqhmMw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=xURVOEPm4fM:Er_j8uqhmMw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=xURVOEPm4fM:Er_j8uqhmMw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/xURVOEPm4fM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/109239724362928665/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=109239724362928665" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/109239724362928665?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/109239724362928665?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/xURVOEPm4fM/hope-to-have-more-material-for-blogging.html" title="Hope to have more material for blogging" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/10/hope-to-have-more-material-for-blogging.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAEQXs9eyp7ImA9WxNXGUk.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-2697460949271810337</id><published>2009-10-07T22:13:00.002+02:00</published><updated>2009-10-07T22:18:20.563+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-07T22:18:20.563+02:00</app:edited><title>Software books reviews down - permanently (so far)</title><content type="html">It has been some time as I planned to take down software books reviews. Although I don't think that the idea was bad it takes time to make the site grow and support from the community was not so good.&lt;br /&gt;As running site takes some money, lot of time and I have two other sites online too: &lt;a href="http://www.grailstutorials.com"&gt;grails tutorials&lt;/a&gt; and &lt;a href="http://www.spenddaywithkids.com"&gt;things to do with kids&lt;/a&gt; I have to choose which one to take down.&lt;br /&gt;So my decision was to take down the software books reviews.&lt;br /&gt;&lt;br /&gt;Now I want to be able to concentrate on my new work and to try to extend functionality of the spend day with kids site. I promised few months ago that I will open source grails tutorials and I still plan to do that. The problem is that I need few days of additional work before I open source it and I am not able to find those day.&lt;br /&gt;&lt;br /&gt;So for all that were visiting software books reviews, sorry but I had to take it down.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=tLAB2-KBjp8:_r6ZuZESyKk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=tLAB2-KBjp8:_r6ZuZESyKk:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=tLAB2-KBjp8:_r6ZuZESyKk:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=tLAB2-KBjp8:_r6ZuZESyKk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=tLAB2-KBjp8:_r6ZuZESyKk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=tLAB2-KBjp8:_r6ZuZESyKk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=tLAB2-KBjp8:_r6ZuZESyKk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=tLAB2-KBjp8:_r6ZuZESyKk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=tLAB2-KBjp8:_r6ZuZESyKk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=tLAB2-KBjp8:_r6ZuZESyKk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/tLAB2-KBjp8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/2697460949271810337/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=2697460949271810337" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/2697460949271810337?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/2697460949271810337?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/tLAB2-KBjp8/software-books-reviews-down-permanently.html" title="Software books reviews down - permanently (so far)" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/10/software-books-reviews-down-permanently.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUECSX0yeSp7ImA9WxNXEEU.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-9099364544023818346</id><published>2009-09-27T22:32:00.003+02:00</published><updated>2009-09-27T22:34:28.391+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-27T22:34:28.391+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title>Getting data into Grails tags and templates</title><content type="html">&lt;p&gt;In the post describing &lt;a href="http://jan-so.blogspot.com/2008/06/make-gsp-readable-with-grails-templates.html"&gt;how to create and use grails templates and tags&lt;/a&gt; I made short example that showed how gsp pages can be readable if you are using tags and templates. One of the questions asked in comments was how do I get data into tag and/or template. Instead writing answer as comment I decided to write the whole post.   &lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Scoped variables&lt;/strong&gt;   &lt;br /&gt;Common way to get data into tag and template is using Grails &lt;strong&gt;scoped variables like&lt;/strong&gt; application, session, request. This means that both, tags and templates, have access to those variables so you can use them.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Templates    &lt;br /&gt;&lt;/strong&gt;To send data into templates you can and should use standard approach with the grails model.&lt;/p&gt;  &lt;p&gt;For example if you are rendering template from tag or from controller (or some groovy code) you should use construct like this one:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;render(template:&lt;span class="str"&gt;"/templates/common/messageBoxTemplate"&lt;/span&gt;, model:[title:"hello world"])&lt;/pre&gt;&lt;p&gt;If you are rendering template from gsp page you should use construct like this one (actually taken from grails documentation):&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;g:render&lt;/span&gt; &lt;span class="attr"&gt;template&lt;/span&gt;&lt;span class="kwrd"&gt;="displaybook"&lt;/span&gt; &lt;span class="attr"&gt;model&lt;/span&gt;&lt;span class="kwrd"&gt;="['book':book,'author':author]"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;To be honest I try to avoid using &lt;em&gt;&amp;lt;g:render...&lt;/em&gt; from gsp pages because if you are using tags it is easier to read the gsp page. Another advantage of using tags is that it is easier to refactor the gsp pages. So when you find yourself writing &lt;em&gt;&amp;lt;g:render template...&lt;/em&gt;. in the gsp page, introduce grails tag for that.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The advantage of tags is that they have access to the &lt;strong&gt;GORM classes&lt;/strong&gt; and you can inject any &lt;strong&gt;grails service&lt;/strong&gt; into tag. So if you need to perform some calculation that needs to be displayed on the gsp page tag is the right place for that.&lt;/p&gt;&lt;p&gt;Another way to send data into grails is via &lt;strong&gt;attrs&lt;/strong&gt; map. Each tag is specified in the file ending with TagLib and the format of the tag is:&lt;/p&gt;&lt;pre class="csharpcode"&gt;def messageBox = {attrs, body -&amp;gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;out&lt;/span&gt; &amp;lt;&amp;lt; render(template:&lt;span class="str"&gt;"/templates/common/messageBoxTemplate"&lt;/span&gt;, model:[title:attrs.title, body:body()])&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;So tag is closure with two variables: attrs and body. Using attrs you can access any custom data sent to the tag.&lt;/p&gt;&lt;p&gt;So how do we send that data?&lt;/p&gt;&lt;p&gt;When displaying tag from the gsp page you are using construct like this one:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&amp;lt;g:messageBox title=&lt;span class="str"&gt;"Register, it takes only seconds"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;p&gt;In this case the title is custom data sent to the tag.&lt;/p&gt;&lt;p&gt;To execute given tag from the controller or some other groovy code you can use construct like this one:&lt;/p&gt;&lt;pre class="csharpcode"&gt;g.messageBox(title:&lt;span class="str"&gt;"Register, it takes only seconds"&lt;/span&gt;) {&lt;br /&gt;  &lt;span class="rem"&gt;//body to be displayed&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;So for example, to display number of registered users on the &lt;a href="http://www.grailstutorials.com/"&gt;grails and groovy tutorials&lt;/a&gt; page I am using direct access to database from the tag and then sending those data to the model. But I could also create e.g. application scoped variable for this and gain some performance. So currently the code in the tag looks like this:&lt;/p&gt;&lt;pre class="csharpcode"&gt;def dataInfo = {attrs, body -&amp;gt;&lt;br /&gt;   def postsCount = TutorialLink.count()&lt;br /&gt;   def userCount = User.count()&lt;br /&gt;   &lt;span class="kwrd"&gt;out&lt;/span&gt; &amp;lt;&amp;lt; render(template:&lt;span class="str"&gt;"/templates/common/statsTemplate"&lt;/span&gt;, model:[userCount:userCount, postsCount:postsCount])&lt;br /&gt;}&lt;/pre&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=qTpoAqQAHBE:6mQUIi2YdJ0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=qTpoAqQAHBE:6mQUIi2YdJ0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=qTpoAqQAHBE:6mQUIi2YdJ0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=qTpoAqQAHBE:6mQUIi2YdJ0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=qTpoAqQAHBE:6mQUIi2YdJ0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=qTpoAqQAHBE:6mQUIi2YdJ0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=qTpoAqQAHBE:6mQUIi2YdJ0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=qTpoAqQAHBE:6mQUIi2YdJ0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=qTpoAqQAHBE:6mQUIi2YdJ0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=qTpoAqQAHBE:6mQUIi2YdJ0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/qTpoAqQAHBE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/9099364544023818346/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=9099364544023818346" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/9099364544023818346?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/9099364544023818346?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/qTpoAqQAHBE/getting-data-into-grails-tags-and.html" title="Getting data into Grails tags and templates" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/09/getting-data-into-grails-tags-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUCRnw8fSp7ImA9WxNTFEs.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-4899115002643797949</id><published>2009-08-17T00:37:00.001+02:00</published><updated>2009-08-17T00:37:47.275+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-17T00:37:47.275+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="tdd" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title>Agile, TDD and upfront desing</title><content type="html">As TDD and agile software development are emerging as more and more used technologies for software development lot of software developers are jumping into it without having real knowledge.&lt;br /&gt;&lt;br /&gt;From my point of view one of the misconceptions about TDD and agile is that you don't need any design and architecture upfront. TDD with refactoring will give me the right architecture in all cases.&lt;br /&gt;&lt;br /&gt;Although I am big fun of agile software development I don't believe this is idea of the agile. Agile is here to help develop better software for better customer satisfaction. But it in no cases claims that you should forget about big picture, about documentation and about having at least basic understanding of your system design.&lt;br /&gt;&lt;br /&gt;From my point of view you need to do basic design at least at the high level. Then for important parts you need to go to lower levels (if really necessary).  And then agile together with TDD will help you to really get it right. To separate concerns, to make separation between domain objects in different tiers and so on.&lt;br /&gt;&lt;br /&gt;So as conclusion, agile does not mean no more thinking. Agile means think about the problem, do basic planning and then use TDD and other agile tools to get it right.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Fg1Kgt9EYiU:hVGsj1K82Pk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Fg1Kgt9EYiU:hVGsj1K82Pk:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Fg1Kgt9EYiU:hVGsj1K82Pk:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Fg1Kgt9EYiU:hVGsj1K82Pk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Fg1Kgt9EYiU:hVGsj1K82Pk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Fg1Kgt9EYiU:hVGsj1K82Pk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Fg1Kgt9EYiU:hVGsj1K82Pk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Fg1Kgt9EYiU:hVGsj1K82Pk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Fg1Kgt9EYiU:hVGsj1K82Pk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Fg1Kgt9EYiU:hVGsj1K82Pk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/Fg1Kgt9EYiU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/4899115002643797949/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=4899115002643797949" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/4899115002643797949?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/4899115002643797949?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/Fg1Kgt9EYiU/agile-tdd-and-upfront-desing.html" title="Agile, TDD and upfront desing" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/08/agile-tdd-and-upfront-desing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IMQnc5fip7ImA9WxJaGEg.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-6270942389413305228</id><published>2009-08-10T00:05:00.002+02:00</published><updated>2009-08-10T00:06:23.926+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-10T00:06:23.926+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title>g:form, g:actionSubmit and Internet Explorer 8</title><content type="html">&lt;p&gt;While working on my latest grails powered web site &lt;a href="http://www.spenddaywithkids.com/"&gt;things to do with kids&lt;/a&gt; I have noticed that one form performs ok in Firefox and Chrome but not in Internet Explorer.  If this would be case with &lt;a href="http://www.grailstutorials.com/"&gt;grails tutorials&lt;/a&gt; I wouldn't care too much because majority of visitors have Firefox or Chrome. But my statistics for things to do with kids are showing that there is more visitors using IE than other browsers.&lt;/p&gt;  &lt;p&gt;The problem was following. E.g. on the home page of &lt;a href="http://www.spenddaywithkids.com/"&gt;things to do with kids&lt;/a&gt; you enter the city name and then press enter on your keyboard. In Firefox and Chrome you get the list of places to visit but in IE8 nothing happened.&lt;/p&gt;  &lt;p&gt;But if you used tab to move focus on the Show Me button then everything worked also in IE. &lt;/p&gt;  &lt;p&gt;The initial code looked like this:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;g:form&lt;/span&gt; &lt;span class="attr"&gt;controller&lt;/span&gt;&lt;span class="kwrd"&gt;="home"&lt;/span&gt; &lt;span class="attr"&gt;method&lt;/span&gt;&lt;span class="kwrd"&gt;="GET"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="locationName"&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;="span-10 last"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;g:actionSubmit&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Show me"&lt;/span&gt; &lt;span class="attr"&gt;action&lt;/span&gt;&lt;span class="kwrd"&gt;="placesAroundLocation"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;g:form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;After some investigation I noticed that closure called from IE was actually &lt;em&gt;index&lt;/em&gt; in the HomeController. So this means that in IE8 when enter is pressed while focus is in the input box default action of the controller is called while in Firefox and Chrome action of the button was called.&lt;/p&gt;&lt;p&gt;So to fix the problem with the IE I have slightly change the code. I added form default action so now it looks like this:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;g:form&lt;/span&gt; &lt;span class="attr"&gt;controller&lt;/span&gt;&lt;span class="kwrd"&gt;="home"&lt;/span&gt; &lt;span class="attr"&gt;action&lt;/span&gt;&lt;span class="kwrd"&gt;="placesAroundLocation"&lt;/span&gt; &lt;span class="attr"&gt;method&lt;/span&gt;&lt;span class="kwrd"&gt;="GET"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="locationName"&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;="span-10 last"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;g:actionSubmit&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Show me"&lt;/span&gt; &lt;span class="attr"&gt;action&lt;/span&gt;&lt;span class="kwrd"&gt;="placesAroundLocation"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;g:form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;I didn't check behavior in other versions of IE but if you have similar problem this may help you.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=hEnsxE3wOvY:toyfdHM4NMg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=hEnsxE3wOvY:toyfdHM4NMg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=hEnsxE3wOvY:toyfdHM4NMg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=hEnsxE3wOvY:toyfdHM4NMg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=hEnsxE3wOvY:toyfdHM4NMg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=hEnsxE3wOvY:toyfdHM4NMg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=hEnsxE3wOvY:toyfdHM4NMg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=hEnsxE3wOvY:toyfdHM4NMg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=hEnsxE3wOvY:toyfdHM4NMg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=hEnsxE3wOvY:toyfdHM4NMg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/hEnsxE3wOvY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/6270942389413305228/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=6270942389413305228" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/6270942389413305228?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/6270942389413305228?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/hEnsxE3wOvY/gform-gactionsubmit-and-internet.html" title="g:form, g:actionSubmit and Internet Explorer 8" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/08/gform-gactionsubmit-and-internet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcEQXc5fyp7ImA9WxJbF04.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-7525754428216808987</id><published>2009-07-28T00:11:00.002+02:00</published><updated>2009-07-28T00:33:20.927+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-28T00:33:20.927+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title>You don't need session in Grails service</title><content type="html">From time to time there are questions or blog posts that explain how to obtain access to web session from the grails service or domain class. If you really need to access session from the service class e.g. &lt;a href="http://robertbjarum.blogspot.com/2008/10/accessing-session-httpsession-from.html"&gt;this&lt;/a&gt; post from Robert can help you.&lt;br /&gt;&lt;br /&gt;But before you start reusing session in your services or even domain classes be careful and think if you really want that. Service should be more or less simple Java class and when ever possible should not depend on special environment classes. And session is actually very special web application environment class.&lt;br /&gt;&lt;br /&gt;So what to do if in the service you really need that value from the session? Well the answer is of course very simple. Send it as a method parameter. Or another way is Robert's approach to create service that will return that value from session and inject it into service that really needs that value.&lt;br /&gt;&lt;br /&gt;This way your services will not depend on the web container context and you can easily port them to other environment.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=mtJ26TOtVig:ipSEtrgQNfk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=mtJ26TOtVig:ipSEtrgQNfk:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=mtJ26TOtVig:ipSEtrgQNfk:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=mtJ26TOtVig:ipSEtrgQNfk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=mtJ26TOtVig:ipSEtrgQNfk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=mtJ26TOtVig:ipSEtrgQNfk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=mtJ26TOtVig:ipSEtrgQNfk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=mtJ26TOtVig:ipSEtrgQNfk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=mtJ26TOtVig:ipSEtrgQNfk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=mtJ26TOtVig:ipSEtrgQNfk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/mtJ26TOtVig" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/7525754428216808987/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=7525754428216808987" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/7525754428216808987?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/7525754428216808987?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/mtJ26TOtVig/you-dont-need-session-in-grails-service.html" title="You don't need session in Grails service" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/07/you-dont-need-session-in-grails-service.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IMQ38-eyp7ImA9WxJbEU8.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-6469053568702311148</id><published>2009-07-21T00:36:00.002+02:00</published><updated>2009-07-21T00:39:42.153+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-21T00:39:42.153+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title>UK included on spend day with kids</title><content type="html">As you may know few weeks ago I have launched &lt;a href="http://www.spenddaywithkids.com"&gt;spend day with kids&lt;/a&gt; web site. In the first release only USA was covered but yesterday I have finished entering attractions for UK.&lt;br /&gt;&lt;br /&gt;So please feel invited to visit spenddaywithkids.com and search for ideal places to have a day full of fun with your kids.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Dwt8Ow8H3CI:4ID9xtAICao:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Dwt8Ow8H3CI:4ID9xtAICao:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Dwt8Ow8H3CI:4ID9xtAICao:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Dwt8Ow8H3CI:4ID9xtAICao:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Dwt8Ow8H3CI:4ID9xtAICao:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Dwt8Ow8H3CI:4ID9xtAICao:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Dwt8Ow8H3CI:4ID9xtAICao:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Dwt8Ow8H3CI:4ID9xtAICao:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Dwt8Ow8H3CI:4ID9xtAICao:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Dwt8Ow8H3CI:4ID9xtAICao:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/Dwt8Ow8H3CI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/6469053568702311148/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=6469053568702311148" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/6469053568702311148?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/6469053568702311148?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/Dwt8Ow8H3CI/uk-included-on-spend-day-with-kids.html" title="UK included on spend day with kids" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/07/uk-included-on-spend-day-with-kids.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAGRHkyfip7ImA9WxJUGEs.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-984920797029620060</id><published>2009-07-17T23:01:00.004+02:00</published><updated>2009-07-17T23:05:25.796+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-17T23:05:25.796+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><category scheme="http://www.blogger.com/atom/ns#" term="groovy" /><title>Groovy and Grails help build apps faster</title><content type="html">Actually this is not my post but a very interesting article about productivity gained using Grails and Groovy.&lt;br /&gt;&lt;br /&gt;Usually I am not posting links to other articles but my feeling is that this one deserves this.  I didn't notice link to this articles on other grails/groovy related sites so I want to share it.&lt;br /&gt;&lt;br /&gt;So navigate to "&lt;a href="http://www.ciol.com/developer/languages/news-reports/groovy-and-grails-help-build-apps-faster/10709122151/0/"&gt;Groovy and Grails help build apps faster&lt;/a&gt;" to read the whole case.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Z1FqDO9Mozo:ywsFKbVRNro:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Z1FqDO9Mozo:ywsFKbVRNro:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Z1FqDO9Mozo:ywsFKbVRNro:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Z1FqDO9Mozo:ywsFKbVRNro:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Z1FqDO9Mozo:ywsFKbVRNro:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Z1FqDO9Mozo:ywsFKbVRNro:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Z1FqDO9Mozo:ywsFKbVRNro:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Z1FqDO9Mozo:ywsFKbVRNro:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=Z1FqDO9Mozo:ywsFKbVRNro:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=Z1FqDO9Mozo:ywsFKbVRNro:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/Z1FqDO9Mozo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/984920797029620060/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=984920797029620060" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/984920797029620060?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/984920797029620060?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/Z1FqDO9Mozo/groovy-and-grails-help-build-apps.html" title="Groovy and Grails help build apps faster" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/07/groovy-and-grails-help-build-apps.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMMSHk8cSp7ImA9WxJVGE0.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-4369101578921351457</id><published>2009-07-05T16:07:00.004+02:00</published><updated>2009-07-05T16:34:49.779+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-05T16:34:49.779+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title>Spend day with kids Grails web app launched</title><content type="html">I have launched new Grails powered web site &lt;a href="http://www.spenddaywithkids.com/"&gt;www.spenddaywithkids.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Idea of the web site is to help you find interesting places where you can go with kids. There are places like zoos, water parks, theme parks....&lt;br /&gt;&lt;br /&gt;Developing this application was interesting for me because this was for me the first time I used google maps in some of my application. Also new for me was geocoding but actually this turned out to be as easy as reuse formulas available online. Currently on USA is covered but Europe should come soon.&lt;br /&gt;&lt;br /&gt;Currently I have three sites online: &lt;a href="http://www.grailstutorials.com/"&gt;grails tutorials&lt;/a&gt;, &lt;a href="http://www.softwarebooksreviews.com/"&gt;software books reviews&lt;/a&gt; and &lt;a href="http://www.spenddaywithkids.com/"&gt;spend day with kids&lt;/a&gt;.&lt;br /&gt;For me it is just prove that development of web applications with Grails is easy and fun but know I will concentrate on extending my existing site and hope I will not get any fun idea soon :)&lt;br /&gt;&lt;br /&gt;Let me know if you have some proposals for any of mentioned sites.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=7h5B8eKDpKs:5ZnWnAXOWy0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=7h5B8eKDpKs:5ZnWnAXOWy0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=7h5B8eKDpKs:5ZnWnAXOWy0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=7h5B8eKDpKs:5ZnWnAXOWy0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=7h5B8eKDpKs:5ZnWnAXOWy0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=7h5B8eKDpKs:5ZnWnAXOWy0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=7h5B8eKDpKs:5ZnWnAXOWy0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=7h5B8eKDpKs:5ZnWnAXOWy0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=7h5B8eKDpKs:5ZnWnAXOWy0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=7h5B8eKDpKs:5ZnWnAXOWy0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/7h5B8eKDpKs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/4369101578921351457/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=4369101578921351457" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/4369101578921351457?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/4369101578921351457?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/7h5B8eKDpKs/spend-day-with-kids-grails-web-app.html" title="Spend day with kids Grails web app launched" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/07/spend-day-with-kids-grails-web-app.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIHQX86eSp7ImA9WxJVE0Q.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-2638978241328718854</id><published>2009-06-30T22:50:00.003+02:00</published><updated>2009-06-30T23:32:10.111+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-30T23:32:10.111+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="book review" /><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title>Book Review: Grails in Action</title><content type="html">I was lucky enough to get copy of the book &lt;a href="http://www.amazon.com/gp/product/1933988932?ie=UTF8&amp;amp;tag=janblog-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1933988932"&gt;Grails in Action&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=janblog-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1933988932" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" width="1" height="1" /&gt; from Manning. And of course I have promised to write review of the book.&lt;br /&gt;&lt;br /&gt;My feelings about the book are somehow mixed. Basically book is divided into four parts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Introducing Grails&lt;/li&gt;&lt;li&gt;Core Grails&lt;/li&gt;&lt;li&gt;Everyday Grails&lt;/li&gt;&lt;li&gt;Advanced Grails&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;The first two parts&lt;/span&gt;, Introducing Grails and Core Grails, are for more or less newcomers to the Grails so if you already have experience with Grails they are somehow boring. That wouldn't be a problem if my opinion wouldn't be that they are not written in an appropriate way for the Grails/Groovy beginners. My feeling is that beginners will get confused as the authors jump too much directly into action. So my advice for the beginners is to read e.g. Getting Started with Grails and then come back to the book Grails in Action.&lt;br /&gt;&lt;br /&gt;But even if you already have Grails experience don't just skip over the first two parts, because after having some Grails foundation the first two parts become very useful and very easy understandable. Even for me (and I have some experience with Grails) there were useful information and discoveries.&lt;br /&gt;&lt;br /&gt;Very good approach in this two parts from the authors is that they have devoted lot of energy to explain how to test Grails application. This is something I should definitely start to do on my own projects :)&lt;br /&gt;&lt;br /&gt;The real fun comes with the &lt;span style="font-weight: bold;"&gt;second two parts&lt;/span&gt; - Everyday Grails and Advanced Grails. I have really enjoyed reading chapters from those parts. They are very nice and are really covering lot of skills you will need during real Grails projects.&lt;br /&gt;&lt;br /&gt;In the &lt;span style="font-weight: bold;"&gt;third part&lt;/span&gt; authors are explaining how not to reinvent wheel by using number of available plugins. They show you how to fast and reliably put together advance features by reusing already existing functionality. I liked this approach and using it myself a lot.&lt;br /&gt;There are also chapters devoted to workflows, exposing interface to outside world and using messaging.&lt;br /&gt;&lt;br /&gt;After finishing third part you have really solid foundation to do some serious Grails development.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight: bold;"&gt;fourth part&lt;/span&gt; is really advanced although I would include basic transactional behavior into at least third part of the book as this is probably more everyday grails than advanced grails. The fourth part will explain advance GORM related features, advance usage of spring and something you will for sure meet in the corporate environment - build and deploy process.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;At the end I was very happy that I got a chance to read this book. This book will lead you from the beggining to the really advanced features of the Grails. If you are developing with Grails I am very sure you will have this book near you.&lt;br /&gt;If you are just starting with Grails I would recommend, first read something simplier and then come back to this book. I am sure you will enjoy reading it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And if you want to buy the book you can do it here :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=janblog-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=1933988932&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=z1y9gBvELtg:2SWSrmvLTgc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=z1y9gBvELtg:2SWSrmvLTgc:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=z1y9gBvELtg:2SWSrmvLTgc:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=z1y9gBvELtg:2SWSrmvLTgc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=z1y9gBvELtg:2SWSrmvLTgc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=z1y9gBvELtg:2SWSrmvLTgc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=z1y9gBvELtg:2SWSrmvLTgc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=z1y9gBvELtg:2SWSrmvLTgc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=z1y9gBvELtg:2SWSrmvLTgc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=z1y9gBvELtg:2SWSrmvLTgc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/z1y9gBvELtg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/2638978241328718854/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=2638978241328718854" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/2638978241328718854?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/2638978241328718854?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/z1y9gBvELtg/book-review-grails-in-action.html" title="Book Review: Grails in Action" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/06/book-review-grails-in-action.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MCQHczeCp7ImA9WxJXGUU.&quot;"><id>tag:blogger.com,1999:blog-785059744103848185.post-3613323550855710617</id><published>2009-06-14T15:00:00.005+02:00</published><updated>2009-06-14T16:24:21.980+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-14T16:24:21.980+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="book review" /><title>Book Review: Becoming Agile</title><content type="html">When I started to think that majority of agile books are somehow breaking DRY (don't repeat yourself) principle I was lucky enough to get a copy of the book &lt;a href="http://www.amazon.com/gp/product/1933988258?ie=UTF8&amp;amp;tag=janblog-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1933988258"&gt;Becoming Agile: ...in an imperfect world&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=janblog-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1933988258" alt="" style="border: medium none  ! important; margin: 0px ! important;" width="1" border="0" height="1" /&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Introduction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What I liked the most in this book is that it is completely oriented to the real world. Therefore it will not try to teach you any of the existing agile frameworks but will help you to make your company (team) agile taking into account all constraints surrounding you. Book is oriented around agile principles and authors consider you environment agile if you are following agile manifesto principles.&lt;br /&gt;Another value of the book is that agile introduction is taken  from the complete beginning. From company readiness  assessment up to the project deployment and spreading your agile process through out the whole company. The whole project lifecycle is covered. From the vision, through adapting idea to the deployment. This is something that I was missing the most in lot of books about agile.&lt;br /&gt;&lt;br /&gt;Book follows imaginary company Acme media and its move toward more agile environment.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Getting started&lt;/span&gt; chapter will explain how to check your company readiness to adopt agile processes, ensure buy-in and inject agility into your existing process. When you have selected pilot project you are moving forward.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Kicking off&lt;/span&gt;&lt;/span&gt; chapter explains how to make feasibility study and how to decide if you should continue or stop with the project.&lt;br /&gt;&lt;br /&gt;If you decided to continue with the project &lt;span style="font-weight: bold;"&gt;Populating the product backlog&lt;/span&gt; chapter will show how to create product backlog, what means "just enough" for a feature card and how to estimate and prioritize the product backlog.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Enough information for scheduling&lt;/span&gt; creates release plan and explains in how much details you should plan your iterations. And don't forget that having plan is not enough. What you need is planning because during the project your plan will change for sure.&lt;br /&gt;&lt;br /&gt;When you have release and iteration plan you can move to the &lt;span style="font-weight: bold;"&gt;Building the product&lt;/span&gt; chapter. You will see how to welcome change, how to apply agile principles into development and how to ensure that you have working software at the end of iteration.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Embracing change&lt;/span&gt; chapter cope with adapting to change requirements. It explains common reasons for requirement changes and how to adapt to them. Next parts of this chapter will show you how to plan deploying and how to improve your process using retrospective.&lt;br /&gt;&lt;br /&gt;If your pilot project was successful you will want to spread the agile process throughout the company. The &lt;span style="font-weight: bold;"&gt;Moving forward&lt;/span&gt; chapter will help you with this process.&lt;br /&gt;&lt;br /&gt;Rest of the book explains the whole process from two different points of view. In one chapter the overall diagram of the project lifecycle is displayed and shortly explained while another chapter contains text description of the overall process.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;Although at the beginning I was not sure if I want to read this book I must admit I have really enjoyed reading the book. I believe that this book must be mandatory read for anyone who want to become member of agile community.&lt;br /&gt;The only downside of the book is that it covers really wide area (complete project lifecycle) and thus after reading this book you will need to read other books to improve your knowledge about e.g. estimating, testing, writing good user stories...&lt;br /&gt;&lt;br /&gt;I really recommend this book to everyone that already are or want to enter the agile world.&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=janblog-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=1933988258&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=bvhA6vHeRD4:gmzi47el7Vs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=bvhA6vHeRD4:gmzi47el7Vs:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=bvhA6vHeRD4:gmzi47el7Vs:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=bvhA6vHeRD4:gmzi47el7Vs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=bvhA6vHeRD4:gmzi47el7Vs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=bvhA6vHeRD4:gmzi47el7Vs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=bvhA6vHeRD4:gmzi47el7Vs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=bvhA6vHeRD4:gmzi47el7Vs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/jan-so?a=bvhA6vHeRD4:gmzi47el7Vs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/jan-so?i=bvhA6vHeRD4:gmzi47el7Vs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jan-so/~4/bvhA6vHeRD4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jan-so.blogspot.com/feeds/3613323550855710617/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=785059744103848185&amp;postID=3613323550855710617" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/3613323550855710617?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/785059744103848185/posts/default/3613323550855710617?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jan-so/~3/bvhA6vHeRD4/book-review-becoming-agile.html" title="Book Review: Becoming Agile" /><author><name>jan</name><uri>http://www.blogger.com/profile/09450549833036134264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://jan-so.blogspot.com/2009/06/book-review-becoming-agile.html</feedburner:origLink></entry></feed>
