<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1926196101893070420</id><updated>2011-12-30T01:52:57.051-08:00</updated><category term='tdd'/><category term='j2ee'/><category term='java'/><category term='ejb'/><category term='BDD'/><title type='text'>Of Agile Intentions</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://agileintention.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://agileintention.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rob Park</name><uri>http://www.blogger.com/profile/13351527989637364786</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_WOaozf6VVBc/TAEXKfWE3cI/AAAAAAAAABI/VutGxxjjJJc/S220/With+Cowboy.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1926196101893070420.post-4793273071710519362</id><published>2010-05-29T06:31:00.001-07:00</published><updated>2010-05-29T06:56:31.434-07:00</updated><title type='text'>Last Weekend's Code Retreat in Boulder</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;First up, thanks to Adam Esterline for coordinating &lt;a href="http://coderetreat.ning.com/events/coderetreat-boulder"&gt;last Saturday’s code retreat.&lt;/a&gt;  Then thanks to &lt;a href="http://www.rallydev.com/"&gt;Rally Software&lt;/a&gt; for hosting the event, for sponsoring lunch, and for supplying a half dozen developers.  It’s great to see a company with multiple software craftsmen interested in spending a Saturday working on their craft. And thanks to &lt;a href="http://leandog.com/"&gt;LeanDog&lt;/a&gt; for sponsoring breakfast and consistently looking to sponsor craftsmanship in the software community.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;As an added bonus, due to the small crowd, it was decided that we’d head up to the real office and use actual pairing stations for the day.  Pairing does not require a nice setup to work.  The biggest benefits are simply in the collaborative nature of writing code.  That said, pairing can be tiring, since it is such a focused, concentrated effort, so it is nice to be able help facilitate that focus by having a comfortable setup where each of you can easily see what’s going on in the code, make changes, and not be constantly turning the monitor so you can get a better view.  This setup was different than ones I’ve used before.  Two very large monitors, two keyboards, and two mice composing two mirrored setups attached to a common Mac tower.  The monitors were set on the corners of the tables (rather than side-by-side),facilitating face to face discussion (when not focused on the screen).  It was a nice switch from a 15” laptop.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;We followed the Corey Haines prescribed method of code retreating (see &lt;a href="http://www.coderetreat.com/how-it-works.html"&gt;How It Works&lt;/a&gt;) for the most part and after a basic introduction to &lt;a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life"&gt;Conway’s Game of Life&lt;/a&gt;, we began iteration 1.  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;At the start, all the pairs were thinking the same way, work top down.  Start with the Grid.  (&lt;a href="http://agileintention.blogspot.com/2009/07/top-down.html"&gt;I swear this wasn’t my influence&lt;/a&gt;) This crew was already quite proficient at TDD and at things like keeping methods small. In turn, this iteration was about getting our brains into the game.  In my pair, we only ran into to some trouble once it got down to the point to code up the rules for the Cell.  Until that point, all steps were precise and small.  The trouble was now avoiding a big step, but the iteration ended, so we reverted everything and took a break.  (In retrospect, I think we were thinking too big for that next step.  We’ll see if the next time I remember some of my later thoughts on avoiding that.)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WOaozf6VVBc/TAEX9Ci0lgI/AAAAAAAAABs/arhoel6PgNs/s1600/GameOfLife.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 144px; height: 144px;" src="http://4.bp.blogspot.com/_WOaozf6VVBc/TAEX9Ci0lgI/AAAAAAAAABs/arhoel6PgNs/s320/GameOfLife.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5476684959281616386" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;Something that happens to me every time I work with Game of Life (similarly &lt;a href="http://rubyquiz.com/quiz14.html"&gt;LCD Display kata&lt;/a&gt;) is I end up drawing out examples.  Here’s a rendition of the index card we had:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;￼&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;One of these times I really want to go ahead and give a shot to iterating on some simple visualizations.  Maybe a Grid.visualize() using System.out.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;Iteration 2. We switched pairs and again had a common curiosity of how would this feel differently if we were to start from the inside with Cell.  The cell was put together pretty fast.  I was quite happy with our 1 line implementation (and it would have still been 1 line if we had fixed the bug in it).  We still had a bunch of time, so we went to working on the Grid.  Even though we didn’t end up completing the Grid still, it was insightful that we weren’t going to have any of the “big step” issues we ran into at the end of iteration 1.  Given the Cell had its rule set to evolve, it was easy write simple tests for evolving the Grid.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;On to iteration 3 and &lt;a href="http://www.blogger.com/post-create.g?blogID=1926196101893070420"&gt;"TDD like you mean it”&lt;/a&gt;.  I’m still fascinated by how to make this work, but I need a lot more practice.  I think Adam and I were the only two who had tried it before, so the rest of the group was new to the concept.  Short version: it’s fun; it fries your brain a bit.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;After lunch, we moved into the experimenting stage.  For iteration 4, the experiment was avoid using if statements (assertions in tests not included).  I don’t have great notes from my pair’s results, but the other pair ended up in an interesting place.  From what I understood, they created a decision table of some sort  where each cell could map its evolution from its current state.  From a distance, it looked complex and not exactly expressive.  They also got caught up in the data, which caused some slips in their test driving. An interesting concept, that I’ve seen something like in production code, so cool to see how making it expressive is a real challenge.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;Iteration 5’s experiment was nothing but 1 line methods (return this; // didn’t count).  My pair and I got rolling along pretty quickly.  Having done some experimenting with fluent interfaces before, this helped us especially in the tests to keep to 1 line; not test 1 thing; not assert 1 thing; but 1 line.  Fun :)  As we got deeper into Grid though, it got more challenging.  We decided to go ahead and get to green with &lt;b&gt;&lt;i&gt;many&lt;/i&gt;&lt;/b&gt; line methods (read: nested for loops) and then refactor.  (Again in retrospect, I think we needed a smaller step here.) Anyway, we put our refactoring hats on and started to pick it apart.  It was definitely good practice in finding ways to extract methods and the code did get more and more expressive.  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;Finally iteration 6 (getting tired), we had a bit of discussion around being Acceptance Test Driven.  Since we were in Java, we were discussing &lt;a href="http://jbehave.org/"&gt;JBehave&lt;/a&gt; and looking at how that would have influence the design of our Grid’s interface.  I do see this as a benefit to ATDD (and BDD), but I’m most interested in getting people to work this way in order to emphasize the importance and dramatic effect of having a discussion about a requirement in terms of specific (executable) examples written from the user’s perspective by a collective of analyst, developer, and tester.  But I digress...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;It was a great day.  For me, very nice to be close to home.  And as is always the case with code retreats, it was great pairing with other craftsmen, off the treadmill of the normal work day.  It was a very insightful day for me.  I need to find another one to attend...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;But wait... as it turns out at &lt;a href="http://agile2010.agilealliance.org/"&gt;Agile 2010&lt;/a&gt; in Orlando this August, I’ll be facilitating a &lt;a href="http://agile2010.agilealliance.org/technical.html"&gt;code retreat session&lt;/a&gt; (Wednesday, 11 August 2010, 09:00 - 10:30).  We’ll have 2 shorter than normal iterations, but for those interested we’ll continue iterating afterward in the open space.  Hope to see you there.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1926196101893070420-4793273071710519362?l=agileintention.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileintention.blogspot.com/feeds/4793273071710519362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agileintention.blogspot.com/2010/05/last-weekends-code-retreat-in-boulder.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default/4793273071710519362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default/4793273071710519362'/><link rel='alternate' type='text/html' href='http://agileintention.blogspot.com/2010/05/last-weekends-code-retreat-in-boulder.html' title='Last Weekend&apos;s Code Retreat in Boulder'/><author><name>Rob Park</name><uri>http://www.blogger.com/profile/13351527989637364786</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_WOaozf6VVBc/TAEXKfWE3cI/AAAAAAAAABI/VutGxxjjJJc/S220/With+Cowboy.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_WOaozf6VVBc/TAEX9Ci0lgI/AAAAAAAAABs/arhoel6PgNs/s72-c/GameOfLife.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1926196101893070420.post-8079949278612056993</id><published>2010-05-14T12:46:00.000-07:00</published><updated>2010-05-14T12:50:32.266-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BDD'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Developer Priorities and Guiding Principles</title><content type='html'>Sometimes you have an inclination about a design and then when you get into implementing, you run into a conflict with your inclination and possibly get stuck wondering what to do.&lt;br /&gt;&lt;br /&gt;Recently, a pair on my current project was test-driving their solution to the current story.  They had to query a service for some search results, but there were some special conditions.  If the service throws an exception, present message A.  If there are 0 records returned, message B. If there are over a 100 records returned, message C.  Otherwise return the results themselves.&lt;br /&gt;&lt;br /&gt;A fairly simple approach to this would be to have your controller delegate to a business class, get the results, and then inspect the results and return the appropriate answer with just a couple if’s.  Opinions may differ right there. Some might like the fact that the specialized error message being displayed is “in the presentation tier”.  Others might say, “why is your controller making choices like that?”  And others might say, “if..else?yuck”.&lt;br /&gt;&lt;br /&gt;Well lets use our priorities to figure out what we’re going to do.  First, be test-driven. We should first and foremost be delivering a testable and tested solution.  To me, it wasn’t even an option to just return that result set past the controller to the view and code the decision (aka logic) of displaying results vs. error message and what error message in the UI proper.  At least in our environment (JSPs &amp; WebLogic), that’s not testable.  &lt;br /&gt;&lt;br /&gt;Next priority, remove duplication.  I’m not going to get into the purity discussion of whether you write the duplicate logic first and then refactor it vs. write the first case then refactor it at the start of the second case vs. “see it coming” and put the first case in the right place (or so we hope).  In fact, in the case I’m referring to, we did the latter, but right behind this feature is another feature to do the same thing (notably with the exact same error conditions) from another angle. The second feature will have a different controller, but will be able to reuse the same business class.  Anyway, we felt justified in that decision.  &lt;br /&gt;&lt;br /&gt;Back to the duplication.  In order to avoid duplication, the suggestion was to push the logic of analyzing the result set to the business class, where in the special cases we’ll throw an exception with the appropriate message.  Now maybe some of you are reacting like this pair did to the suggestion 1) is no results really an error? and 2) it makes me itch that we’re pushing the message Strings into the business tier.  My response... I agree, but... I consider the first 2 priorities to be much more important than this itch I have.  a) it’s in one place, so when the itch festers, we can fix it for both cases quickly. b) it’s tested, so when the itch festers, we can fix it safely.&lt;br /&gt;&lt;br /&gt;In fact, in this case, both cases will have BDD tests on them while the business class will be fully TDD’d.&lt;br /&gt;&lt;br /&gt;My point: have a bias towards action and use your development priorities as a guide.&lt;br /&gt;My opinion: 1) testability 2) remove duplication.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1926196101893070420-8079949278612056993?l=agileintention.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileintention.blogspot.com/feeds/8079949278612056993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agileintention.blogspot.com/2010/05/developer-priorities-and-guiding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default/8079949278612056993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default/8079949278612056993'/><link rel='alternate' type='text/html' href='http://agileintention.blogspot.com/2010/05/developer-priorities-and-guiding.html' title='Developer Priorities and Guiding Principles'/><author><name>Rob Park</name><uri>http://www.blogger.com/profile/13351527989637364786</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_WOaozf6VVBc/TAEXKfWE3cI/AAAAAAAAABI/VutGxxjjJJc/S220/With+Cowboy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1926196101893070420.post-6399751752925269166</id><published>2010-01-12T18:42:00.000-08:00</published><updated>2010-01-13T04:52:44.699-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ejb'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='j2ee'/><title type='text'>Application Servers and Test-Driven Development</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Verdana;"&gt;If you are considering tying your next project to an application server, you should seriously consider the consequences of this.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;What are you really after?&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Why do you think this is a good idea?&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Verdana;"&gt;More than likely there are a handful of alternatives to all of your concerns.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;And if you were to pursue these alternatives, you will greatly improve the productivity of your team.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Verdana;"&gt;If you are a member of such a team where you have little to do with the decision to run under an application server, I will also make some suggestions on how to work around the server more effectively.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Verdana;"&gt;Background&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Verdana;"&gt;I am a very strong believer that being test-driven is excellent start towards generally improving your productivity.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;I am also a believer in being story-test-driven, however that’ll be a discussion for another day.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;When I say “test-driven”, I am specifically referring to the red-green-refactor mantra of TDD.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;With respect to application servers, this does not include JunitEE and/or Cactus style testing.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;It’s simply not practical to write a test, compile it, build an ear, deploy it, and run your test to see it fail.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;On my current project, the average round trip to make this happen once is about 30 minutes.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;In the TDD circle of life, generally speaking, I want this cycle to be less than 5 seconds (once the test is written).&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Verdana;"&gt;There are many reasons to be test-driven in your development.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Writing tests first ensures your code is testable.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Writing tests first clearly influences your design.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Writing tests first definitely helps you minimize over-engineering your solution (which also saves you a lot of time).&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;And the left over artifact of tests helps you avoid unintentional breaks from future enhancement and from refactoring.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;The tests support refactoring, which in turn keeps you from suffering code rot.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;And code rot might not kill your project instantly, but it will kill morale.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;There are many other reasons as well, but I’d recommend you read &lt;a href="http://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1263386950&amp;sr=8-1"&gt;Test Driven Development&lt;/a&gt; by Kent Beck, &lt;a href="http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1263387011&amp;sr=1-1"&gt;Refactoring&lt;/a&gt; by Martin Fowler, and &lt;a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1263387051&amp;sr=1-1"&gt;Clean Code&lt;/a&gt; by Robert Martin for that.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;As for app server development and test-driven strategies, I would strongly recommend you read &lt;a href="http://www.amazon.com/Expert-One-One-Development-without/dp/0764558315/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1263387142&amp;sr=1-1"&gt;J2EE Development without EJB&lt;/a&gt; by Rod Johnson.&lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Verdana;"&gt;Now if you do happen to have an application server, you need to consciously work to architect around it in order to be able to effectively test-drive your code.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Things to consider: First, minimize your dependencies on the app server.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Regardless of what front-end framework you use, keep the front-end extremely thin and light.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;You can certainly use JavaScript on your client, because you can unit test JavaScript with any of a handful of frameworks, none of which require you to be running the app server to run your tests.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;By thin and light I’m referring to JSPs, JPFs, Actions, etc.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;You want little to no logic in these files.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Utilize some form of MVC here to maintain a good separation of concerns.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;If you keep nothing but simple mappings from domain/model objects to view objects and otherwise just make simple calls to the POJOs just beyond the application server, then you can keep the top-most level of your POJO model focused on the behaviors required by the application.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;You can easily TDD your way from there.&lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Verdana;"&gt;Just a thought: I recommend making it a goal of yours to start up the application server as few times as possible every iteration.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;I’m even thinking about keeping a metric for this, because I’m sure it will be directly correlated with story cycle time.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Verdana;"&gt;I hope this could help frame your dealings with an application server with a little bit of stategic thinking as well as help make your testing strategy more effective.&lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Verdana;"&gt;May all your tests run green.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1926196101893070420-6399751752925269166?l=agileintention.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileintention.blogspot.com/feeds/6399751752925269166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agileintention.blogspot.com/2010/01/application-servers-and-test-driven.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default/6399751752925269166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default/6399751752925269166'/><link rel='alternate' type='text/html' href='http://agileintention.blogspot.com/2010/01/application-servers-and-test-driven.html' title='Application Servers and Test-Driven Development'/><author><name>Rob Park</name><uri>http://www.blogger.com/profile/13351527989637364786</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_WOaozf6VVBc/TAEXKfWE3cI/AAAAAAAAABI/VutGxxjjJJc/S220/With+Cowboy.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1926196101893070420.post-2663703648364072703</id><published>2009-07-12T18:13:00.000-07:00</published><updated>2009-07-12T18:16:29.334-07:00</updated><title type='text'>Top Down</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span" style="font-family: arial; "&gt;I’ve been following a top-down approach to programming for years.  I feel like it is the best approach to not over-engineering things.  Along with ATDD and TDD, it’s a very methodical, disciplined approach.  It’s also customer-centric, since by starting with an acceptance test, you’re focusing on the behavior the customer wants. &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;At this weekend’s #coderetreat (&lt;/span&gt;&lt;a href="http://coderetreat.ning.com/"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;http://coderetreat.ning.com/&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;, July 2009, &lt;/span&gt;&lt;st1:city st="on"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Farmington Hills&lt;/span&gt;&lt;/st1:city&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;, &lt;/span&gt;&lt;st1:state st="on"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;MI&lt;/span&gt;&lt;/st1:state&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;), I was intrigued by the approaches taken in attacking &lt;/span&gt;&lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Conway&lt;/span&gt;&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;’s Game of Life (&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;http://en.wikipedia.org/wiki/Conway's_Game_of_Life&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;).  With the game of life, it turns out there are 2 major approaches that seemed to dominate.  The first approach we’ll call “cell”, which is a bottom-up approach (much to my chagrin ;-)).  The other we’ll call “grid” and that’s the top-down approach.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;With cell being bottom-up (or inside out), you start with a cell and TDD the behaviors of life and death for the cell first.  Now for a kata, that’s fine, because you can only do so much in 1 hour before the next iteration. &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;I was looking to approach the problem as an application however, a craft I’m always interested in honing, I so went straight to grid.  That’s not necessarily the best name, but from this perspective, my pair and I started with questions like “what will the user need to see first?”   “OK, a grid and then the user will need to set some initial cells to alive.”  And so on.  It should be relatively obvious, that the design from this approach will emerge quite differently.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;In the past, I’ve worked with FitNesse and more recently with easyb.  Both of which could do the trick of ATDD’ing the grid, but Jeff “Cheezy” Morgan introduced us to the new and improved JBehave at #coderetreat.  JBehave has a super short setup time and actually runs seamlessly via the JUnit runner.  So we ATDD’d our grid with in the afternoon with JBehave by defining the behaviors the user would require.  Such as:&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:.5in;mso-layout-grid-align:none; text-autospace:none"&gt;&lt;span style="font-size: 8pt; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Given I have a grid&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:.5in;mso-layout-grid-align:none; text-autospace:none"&gt;&lt;span style="font-size: 8pt; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;And I select some cell at 2 and 4 to be alive&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:.5in;mso-layout-grid-align:none; text-autospace:none"&gt;&lt;span style="font-size: 8pt; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;And I select some cell at 3 and 3 to be alive&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:.5in;mso-layout-grid-align:none; text-autospace:none"&gt;&lt;span style="font-size: 8pt; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;And I select some cell at 3 and 4 to be alive&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:.5in;mso-layout-grid-align:none; text-autospace:none"&gt;&lt;span style="font-size: 8pt; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;When I evolve&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:.5in;mso-layout-grid-align:none; text-autospace:none"&gt;&lt;span style="font-size: 8pt; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Then the cell at 3 and 3 is alive&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:.5in"&gt;&lt;span style="font-size: 8pt; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;And the cell at 2 and 5 is alive&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;And I’m excited to do more with JBehave.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;So I’m actually advocating first and foremost attending #coderetreat and using a kata-based approach to honing your craftsmanship skills.  Second, I’m recommending trying to approach things very consciously from the customer’s perspective and in a way that will lead quickly to executable software, specifically top-down.  Use your ATDD framework of choice (even XUnit), define a behavior of the application, then TDD the necessary units to deliver that behavior… rinse… repeat.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1926196101893070420-2663703648364072703?l=agileintention.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileintention.blogspot.com/feeds/2663703648364072703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agileintention.blogspot.com/2009/07/top-down.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default/2663703648364072703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default/2663703648364072703'/><link rel='alternate' type='text/html' href='http://agileintention.blogspot.com/2009/07/top-down.html' title='Top Down'/><author><name>Rob Park</name><uri>http://www.blogger.com/profile/13351527989637364786</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_WOaozf6VVBc/TAEXKfWE3cI/AAAAAAAAABI/VutGxxjjJJc/S220/With+Cowboy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1926196101893070420.post-1641099842656231326</id><published>2009-04-04T08:47:00.000-07:00</published><updated>2009-04-04T08:51:26.196-07:00</updated><title type='text'>Don’t Get Burned</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Tahoma;"&gt;I believe that sprint burndowns are a crutch.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;You should be aware of their misuse and you should figure out what you can do to move beyond them.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Tahoma;"&gt;Like crutches, a sprint burndown can be useful to get you on your feet.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Their intention is to help you see where you are with respect to the stories estimated during sprint planning.&lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Tahoma;"&gt;If you feel you /need/ a sprint burndown, then I’d ask why?&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Do the current stories in flight and done so far not tell you where you are?&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;If not, then that’s the thing I’m saying you should be looking into and fixing.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Perhaps your stories are too big, so they’re in progress for 5+ days and you want to know if it’s going to be 4 days or 6 days?&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Perhaps the team is not communicating enough?&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Is there a high percentage of the team working on each story (especially larger stories)?&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Are there at least a few team or partial team meetings around the design of each story (and I don’t mean during planning) as well as around design changes discovered?&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;If not, why not?&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Would that help communicate the status of the story?&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Tahoma;"&gt;If your team is healthy, then you should be regularly experimenting with process improvements.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Try removing the burndown.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Retrospect on what was missing without it.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Perhaps bring it back and strive to fix some of the other issues as well.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Then try removing it again when you feel the communication or whatever has improved.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Ultimately though, planning (and tracking of the plan) is waste, plain and simple, and we should strive to minimize it.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Tahoma;"&gt;&lt;span style="mso-spacerun:yes"&gt;That’s all presuming you’re using your burndown properly in the first place.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Here are a few things to beware to never do even if you do keep a burndown. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Tahoma;"&gt;Don’t let your burndown manage you.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Just because 7 of 10 tasks are done, remember the story is /not done/ and so it is building inventory (i.e. useless to the customer) until the story is done.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;At the end of the sprint, it’s a binary done vs. not done.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Tahoma;"&gt;Don’t get actual hours confused with ideal hours.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;No one should even begin to think that because you have x engineers for n days at approximately j hours per day that you should be able to deliver x * n * j hours of work this sprint.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Fred Brooks told us years ago, “the man-month as a unit for measuring the size of a job is a dangerous and deceptive myth”.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;I believe the context fits here.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Tahoma;"&gt;Yesterday’s weather relates to velocity, which is story estimates not task estimates.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;This is not a precise number.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;We’re talking about estimates here.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Estimates are not precise and to think that they are is bad for business.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;If you want things to be more precise, then shorten your sprint length and go from what’s been delivered.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;That’s precise, because it’s done.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Tahoma;"&gt;Don’t let the tasks manage you.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;The next healthy thing to do after eliminating the sprint burndown is eliminating task breakdowns altogether, but that’s another topic.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Just leave it to say that because you have tasks from sprint planning, don’t just each grab your tasks and go to your cubes and work on them.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;It’s far more effective to have a pair (or more) tackle the story as a team.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;We want to /encourage/ communication.&lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Tahoma;"&gt;And this may sound obvious, but trust me, it doesn’t always happen.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;If a task on the board is no longer relevant, remove it.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;If something else must be done for the story to be done, add it.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;If you see a refactoring to do while working on the story, do it.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Tahoma;"&gt;Now that’s all about sprint burndowns.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;Release burndowns can be a different story, however, but again a future topic.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1926196101893070420-1641099842656231326?l=agileintention.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileintention.blogspot.com/feeds/1641099842656231326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agileintention.blogspot.com/2009/04/dont-get-burned.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default/1641099842656231326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default/1641099842656231326'/><link rel='alternate' type='text/html' href='http://agileintention.blogspot.com/2009/04/dont-get-burned.html' title='Don’t Get Burned'/><author><name>Rob Park</name><uri>http://www.blogger.com/profile/13351527989637364786</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_WOaozf6VVBc/TAEXKfWE3cI/AAAAAAAAABI/VutGxxjjJJc/S220/With+Cowboy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1926196101893070420.post-7118542762053809547</id><published>2009-03-22T07:08:00.001-07:00</published><updated>2009-03-22T07:08:45.088-07:00</updated><title type='text'>Simple Is Not Easy</title><content type='html'>&lt;div&gt; &lt;div&gt;Simple requires discipline and courage. &lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Just implementing some feature without tests and without really considering  the class responsibilities involved… that’s easy… well for a little while  anyway. However, being disciplined to test-drive your change in and then  refactor mercilessly for single responsibility, removing duplication, etc that’s  how you keep your design simple.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Just exposing your class’s data and then reaching into it further,  violating the Law of Demeter, that’s easy. However, being disciplined to  recognize you have some inappropriate touching going on and instead at least  encapsulating that into tested methods will help keep your design simple.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Even then, if you do recognize for example a class is too big, just taking  some of it (hopefully related pieces) and putting them in dependent classes can  be easy. However, ensuring that you do so without creating a nest of intertwined  dependencies, required to keep it simple, isn’t necessarily easy.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;I am interested in simple designs and disciplined approaches to keep a  design emerging simply. I am also interested how to better influence others to  do the same.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1926196101893070420-7118542762053809547?l=agileintention.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileintention.blogspot.com/feeds/7118542762053809547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agileintention.blogspot.com/2009/03/simple-is-not-easy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default/7118542762053809547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1926196101893070420/posts/default/7118542762053809547'/><link rel='alternate' type='text/html' href='http://agileintention.blogspot.com/2009/03/simple-is-not-easy.html' title='Simple Is Not Easy'/><author><name>Rob Park</name><uri>http://www.blogger.com/profile/13351527989637364786</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_WOaozf6VVBc/TAEXKfWE3cI/AAAAAAAAABI/VutGxxjjJJc/S220/With+Cowboy.jpg'/></author><thr:total>0</thr:total></entry></feed>
