<?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-3288433757755130449</id><updated>2011-12-05T15:09:34.130+01:00</updated><category term='Simple Design'/><category term='Pomodoro'/><category term='Acceptance Testing'/><category term='Retrospective'/><category term='Continuous Integration'/><category term='TDD'/><category term='Planning Game'/><category term='Organization'/><category term='User story'/><category term='Kanban'/><category term='On-site customer'/><category term='Selenium'/><category term='Scrum'/><category term='Process'/><category term='Slack'/><category term='Pair Programming'/><category term='Unit Testing'/><category term='Planning Poker'/><category term='Demo'/><title type='text'>XP Creuna</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Creuna XP Team</name><uri>http://www.blogger.com/profile/03754691427263313444</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>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-8307940770118542537</id><published>2010-05-28T10:08:00.007+02:00</published><updated>2010-06-08T15:09:57.294+02:00</updated><title type='text'>Where's my team?</title><content type='html'>&lt;div&gt;When the application was put into production the original team split up and the developers was put on different projects. Most of the new projects was build on the same foundation and a lot of the experience could be reused. Those projects was much smaller and we did figure that we could build them in parallel instead of keeping the team and building them one after the other. Looking back I'm not sure this was the right decision and will never know. Anyway, we had to support the old application to fix bugs and add features on request.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;New features!&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Our customer wanted a few new features after the application went into production. With all the automated tests we could be quite confident that adding features would not break the application. We added new filtering and sorting functions, added feed forward for the filters and new fields for a few lists on web pages. &lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Bugs?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Yes, we did have one or two minor bugs, and one that really did make us reflect on our testing methods. &lt;/div&gt;&lt;div&gt;The bug removed a lot of data our customer had entered, as you can imagine this is not what they expected. Also, the first time it happened we could not believe it, as it was impossible for us to replicate. Until it happened a few times again. We did have unit test and automated acceptance test for the scenario and were confident the bug would have been trapped, that obviously was not true.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, what was the case? We have three buttons, one "yes" and one "no" and one "regret". When clicking "yes" or "no" the "yes" and "no" buttons are hidden and the "regret" button is shown. Clicking the "regret" button restores the state so you can click "yes" or "no" again. A quite simple scenario, right? &lt;/div&gt;&lt;div&gt;Well, opening another browser, clicking the "yes" button and switch back to your first browser you still can click the "yes" or "no" button as that page has not been reloaded. Our backend logic is built to always allow you to click the "no" button, and that is correct in this case. Clicking the "no" button (from the first browser session) while actually being in the regret state made a call to a function that should never been called. This function was an update statement that updated more records than it should. We later found that due to a refactoring a parameter was removed from a SQL statement and never put back. Our unit tests tested the function with correct parameters but only using one record. This was a mistake, the test should have made the same test with more than one record.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But, while one of the bugs where severe there have been so few bugs that the effort put down into testing have payed off, a lot!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;What's next?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;From all the stuff I've learnt from this project I see Pair Programming and Unit Testing as two of the most important lessons as a developer. There are a lot of other practices that is good, but may fall in the category of project management.&lt;/div&gt;&lt;div&gt;So, next up is to convince others that Pair Programming and Unit Testing is really great stuff.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-8307940770118542537?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/8307940770118542537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2010/05/wheres-my-team.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/8307940770118542537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/8307940770118542537'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2010/05/wheres-my-team.html' title='Where&apos;s my team?'/><author><name>Simon</name><uri>http://www.blogger.com/profile/14081519525165093972</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></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-3606032956799014455</id><published>2010-03-01T13:53:00.004+01:00</published><updated>2010-03-01T14:06:04.737+01:00</updated><title type='text'>Project delivered - on time!</title><content type='html'>March 1 is here, and we are LIVE! We also have a demonstration video of the public web on YouTube, narrated by Danny Saucedo of EMD. Check it out!&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="295"&gt;&lt;param name="movie" value="http://www.youtube.com/v/gxG7INBW23U&amp;hl=sv_SE&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/gxG7INBW23U&amp;hl=sv_SE&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stockholm.se/-/Nyheter/Forskola--Skola/Dags-att-valja-forskoleklass/"&gt;E-tjänsten för val till förskoleklass har öppnat&lt;/a&gt; (stockholm.se)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-3606032956799014455?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/3606032956799014455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2010/03/project-delivered-on-time.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/3606032956799014455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/3606032956799014455'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2010/03/project-delivered-on-time.html' title='Project delivered - on time!'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/02987079709890896170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_l-LLksOg9eE/R9bjxIwpurI/AAAAAAAAAAM/24-1aJgI-VI/S220/tommy2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-4047212927706425980</id><published>2010-02-11T17:56:00.004+01:00</published><updated>2010-02-12T08:33:16.642+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Pomodoro'/><category scheme='http://www.blogger.com/atom/ns#' term='Acceptance Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Pair Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>How we do this - development</title><content type='html'>Following up the last post, about our process, here’s how we do our development. During development we do try to use as much &lt;strong&gt;XP Practices&lt;/strong&gt; as we can.&lt;br /&gt;&lt;br /&gt;We have&lt;strong&gt; Continuous Integration&lt;/strong&gt; using &lt;em&gt;CruiseControl&lt;/em&gt; that also runs all our unit tests with &lt;em&gt;NUnit&lt;/em&gt;. We also set it up to show code coverage using &lt;em&gt;NCoverExplorer&lt;/em&gt; (currently 87 %). We have two targets per project. One target builds and runs tests whenever something is committed to our &lt;em&gt;Subversion&lt;/em&gt; repository and the other target does the same thing every night and also deploys it to our test server.&lt;br /&gt;&lt;br /&gt;We have &lt;strong&gt;Automated Acceptance Tests&lt;/strong&gt; using &lt;em&gt;Selenium&lt;/em&gt;. Unfortunately we haven’t succeeded in making our nightly build target run them after the deployment as we intended to, but instead we run them manually when we come in the morning and once during lunch. Some why they time out nine times out of ten when we have the build server start the test…&lt;br /&gt;&lt;br /&gt;We try to use &lt;strong&gt;TDD&lt;/strong&gt; as much as possible. Other than NUnit we use the mock library &lt;em&gt;Rhino Mocks&lt;/em&gt; to make all unit tests self contained. We also have the plug in &lt;em&gt;ReSharper&lt;/em&gt; installed on everyone’s &lt;em&gt;Visual Studio 2008&lt;/em&gt; to get support for running NUnit tests, extended refactoring menu and enforced coding standard. ReSharper also gives us pointers on better ways to code, like pointing out that a method could be made static. It also gives some, imho, bad ideas though out of the box that needs to be changed in the configuration, for example removing curly brackets around one line clauses. Read more on my opinion about that particular issue on my personal blog, &lt;a href="http://tommycode.blogspot.com/2008/03/never-skip-curly-brackets.html"&gt;The Tommy Code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We do quite a lot of &lt;strong&gt;Pair Programming&lt;/strong&gt;. Initially we did virtually everything in pairs, but the further we get with the project the less we’ve done in pairs. “Just fixing it” is, the way I see it, not as important to do with a navigator. When in pairs we try to follow the &lt;em&gt;Pomodoro&lt;/em&gt; rule of taking a break after every 25 minutes to make it less intense and to be able to stay focused. We don’t make estimates or task lists for the day though, just having a timer (&lt;em&gt;Pomodairo&lt;/em&gt;) that tells us to take a break every 25 minutes.&lt;br /&gt;&lt;br /&gt;We also switch pairs frequently, achiving &lt;strong&gt;collective code ownership&lt;/strong&gt; for the entire project. Unfortunatly that doesn't include Front-end (html, css, javascript) or Test (Acceptance testing and manual tests), which are each done by a specific person. We have done some pair programming with one of them and one from the rest of the team, but far less than I would have wanted. We also had everyone in the team write one Acceptance Test each do know how it's done, which was a great idea.&lt;br /&gt;&lt;br /&gt;We &lt;strong&gt;keep design as simple as possible&lt;/strong&gt;, but no simpler, and always try to remind each other when we notice someone taking height for more than we need to do at this moment in their implementation. We of course try our best to follow the &lt;em&gt;DRY principle&lt;/em&gt;, coding everything once and only once. I’ve noticed that it gets harder with unit tests with a lot of mocking, which may differ slightly between the different test cases, so I have to admit that there are some principle violations in the test assembly. Also, of course, we try to &lt;a href="http://www.antiifcampaign.com/"&gt;avoid if-statements&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To be able to have the unit tests covering as much code as possible, getting high &lt;strong&gt;Code Coverage&lt;/strong&gt;, we do our web pages in a design pattern inspired by &lt;em&gt;The Humble Dialog Box&lt;/em&gt;, an article by Michael Feathers. That leaves our aspx files, including the code behind, as stupid as possible and puts all the logic in a composer object in a separate project with no knowledge of the HTTP context. We first had an idea about using ASP.NET MVC but decided that we had enough new elements in our project with all the XP stuff.&lt;br /&gt;&lt;br /&gt;That concludes the walk through of how we do this. We’d love to hear your thoughts about it and will be happy to answer any questions. Use the comment field!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-4047212927706425980?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/4047212927706425980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2010/02/how-we-do-this-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/4047212927706425980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/4047212927706425980'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2010/02/how-we-do-this-development.html' title='How we do this - development'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/02987079709890896170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_l-LLksOg9eE/R9bjxIwpurI/AAAAAAAAAAM/24-1aJgI-VI/S220/tommy2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-3277428161147837907</id><published>2010-02-09T17:27:00.007+01:00</published><updated>2010-02-11T17:51:20.231+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Demo'/><category scheme='http://www.blogger.com/atom/ns#' term='User story'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning Poker'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning Game'/><category scheme='http://www.blogger.com/atom/ns#' term='On-site customer'/><category scheme='http://www.blogger.com/atom/ns#' term='Retrospective'/><category scheme='http://www.blogger.com/atom/ns#' term='Kanban'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Slack'/><category scheme='http://www.blogger.com/atom/ns#' term='Process'/><title type='text'>How we do this - process</title><content type='html'>I get a lot of questions about how we do this project. I’m going to start with describing the &lt;strong&gt;process&lt;/strong&gt; in this post and am already preparing a follow up about the actual development. Comments and questions about our process are most welcome, but if it’s something about the development you might be better off wait for that post. That being said, here’s how we do it, the process part.&lt;br /&gt;&lt;br /&gt;Our cycle (re)starts on Thursdays. Each Thursday before lunch we meet our customer to make sure we're on the right track. Since we have decided on two week iterations, every second Thursday we first have a &lt;strong&gt;sprint demo&lt;/strong&gt; and then (re)prioritize all remaining stories in the backlog. The other Thursday we just discuss issues from the first half of the iteration and status of other ongoing tasks - i.e. stuff that people outside the team are doing. That may be setting up the production servers in the customers’ environment for example.&lt;br /&gt;&lt;br /&gt;On the sprint ends we have a &lt;strong&gt;retrospective&lt;/strong&gt; where the whole team, except the customer, get together and discuss the sprint. At first we had it before the customer meeting with the demo, but we always had to rush it in the end to get done before the customer came. Once we invited the customer to join or retrospective, but since the involvement during sprints is so low the customer didn't have much to say. Hence we decided we'd keep doing without and moved the retrospective to after lunch. The time before the customer arrives we now use to prepare for the demo.&lt;br /&gt;&lt;br /&gt;The next step in the process is the &lt;strong&gt;task breakdown&lt;/strong&gt; of the top prioritized stories. We get the whole team together and the Interaction Designer, who has somewhat the role of the on-site customer, will walk us through the stories and show the prototype. We take the the stories one-by-one and after the walkthrough we break down the story to tasks. When the breakdown is complete we play Planning Poker to estimate each task in measure of days, with half a day being the lowest estimate. Tasks a lot smaller than that we try to merge together.&lt;br /&gt;&lt;br /&gt;When we had the retrospective before lunch we had task breakdown after lunch. I felt we needed some more &lt;strong&gt;slack&lt;/strong&gt; to really end the first sprint before starting a new one though, so that was another reason for changing the meeting calendar. As we moved the retrospective to the after lunch slot, we now break down the stories on Friday after our daily standup meeting. I feel that it gives us a lot better rhythm. That also leaves some air on Thursdays to execute some ideas from the retrospective and deal with some technical debt.&lt;br /&gt;&lt;br /&gt;Speaking of the &lt;strong&gt;daily standup&lt;/strong&gt; we have it each morning at 9.15 except for Mondays, when we have a general meeting for the entire company at that time, and have our standup after that. We have all done Scrum before and have learned to value the daily standup meeting a lot. That’s about all we took from Scrum that doesn’t exist in XP though, except maybe the role Board Master that we invented to have some responsibility for our Kanban board.&lt;br /&gt;&lt;br /&gt;We have the standup meeting in front of the &lt;strong&gt;Kanban board&lt;/strong&gt;. Our board now has the columns &lt;em&gt;Selected&lt;/em&gt;, &lt;em&gt;Development&lt;/em&gt;, &lt;em&gt;Test&lt;/em&gt; and &lt;em&gt;Done&lt;/em&gt;, where the Development column is split into three sub columns - &lt;em&gt;In progress&lt;/em&gt;, &lt;em&gt;Trash&lt;/em&gt; and &lt;em&gt;Ready for Test&lt;/em&gt;. The trash column is the only addition from our original board. It is used for collecting all tasks before they are all done. When all tasks are done we will move the story card to Ready for Test and the trashcan can be emptied.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-3277428161147837907?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/3277428161147837907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2010/02/how-we-do-this-process.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/3277428161147837907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/3277428161147837907'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2010/02/how-we-do-this-process.html' title='How we do this - process'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/02987079709890896170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_l-LLksOg9eE/R9bjxIwpurI/AAAAAAAAAAM/24-1aJgI-VI/S220/tommy2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-3480976439667765725</id><published>2010-01-27T11:16:00.004+01:00</published><updated>2010-01-27T13:45:48.231+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>The Art of Unit Testing</title><content type='html'>To deal with the issue I mentioned in the post &lt;a href="http://www.blogger.com/xpcreuna.blogspot.com/2009/11/tdd-is-hard.html"&gt;TDD is Hard&lt;/a&gt; earlier I bought the book &lt;em&gt;The Art of Unit Testing&lt;/em&gt; by Roy Osherove. It helped a lot! Osherove writes plenty about how to make the tests cope with changes in the code and about writing maintainable tests.&lt;br /&gt;&lt;br /&gt;He also mentioned Test Coverage tools as a good way to build reliable tests. Making sure every line is covered by a test doesn't test all possible results tho, but it's a good start. For example if you want to test a method that validates email addresses you might just have a RegExp. That row will be covered by the first test you write. Still I wouldn't find it reliable by just making a test with one email address. Here I didn't find any solution in the book, so I'd be interested to hear how you make sure your test is reliable.&lt;br /&gt;&lt;br /&gt;How ever, I downloaded the last free version of NCover Explorer (&lt;a href="http://www.kiwidude.com/dotnet/DownloadPage.html"&gt;1.4.0.7&lt;/a&gt;). It showed to be a very competent tool that let me find a bunch of untested code paths, and also a few completely untested classes. We also added a simple version to our Cruise Control project that gives us a figure with the current coverage (88 % right now). We have not excluded code that are excluded from the unit tests with the Ignore attribute though, so the real coverage is higher. We use the Ignore attribute for some integration tests that require a VPN connection to work.&lt;br /&gt;&lt;br /&gt;Among the tips from the book I found the most important one was to have at most one &lt;em&gt;mock&lt;/em&gt; object in a test, while other &lt;em&gt;fake&lt;/em&gt; objects should be &lt;em&gt;stubs&lt;/em&gt;. He also claimed that a test should have only one Assert verifying the outcome, but I'm not sure I agree with that. He is the expert tho, but I guess I need to burn my own fingers before I agree with that.&lt;br /&gt;&lt;br /&gt;As a conclusion I would recommend this book to anyone. The one who wants to start doing unit testing will probably get the most from the book, but I think that also the one who is just curious about it and definatly the one who's been doing it for some time (that's me!) will have a good read too. I bet that even the expert might get some new insights while reading it. And it's a quick read - I think I spent less than 10 hours to read it all, except the appendixes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-3480976439667765725?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/3480976439667765725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2010/01/art-of-unit-testing.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/3480976439667765725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/3480976439667765725'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2010/01/art-of-unit-testing.html' title='The Art of Unit Testing'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/02987079709890896170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_l-LLksOg9eE/R9bjxIwpurI/AAAAAAAAAAM/24-1aJgI-VI/S220/tommy2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-1891453271033665597</id><published>2009-12-23T15:39:00.003+01:00</published><updated>2009-12-23T15:58:41.775+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning Game'/><title type='text'>Merry Christmas!</title><content type='html'>Christmas is closing in and the Whole Team will be gone until 7 january. We're leaving mid-sprint, one week done and one week to be done 7 january and forward. It was either that or having slack time for a week working freely. Having a four day sprint didn't feel like an option. Any way I think it will work fine with a two-session sprint. And certainly better than unplanned time.&lt;br /&gt;&lt;br /&gt;On another topic I received a Christmas gift today as I finally got the book I ordered three weeks ago. It should have been delivered in 3-6 days, but I guess it was busy times for the book shop... The book is &lt;em&gt;The Art of Unit Testing&lt;/em&gt; by Roy Osherove. I've heard a lot of good things about the book so I hope it will be an interesting read. I'll try to post a review when we're back.&lt;br /&gt;&lt;br /&gt;Merry Christmas to all of you, and a Happy New Year. See you in the next decade!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-1891453271033665597?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/1891453271033665597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/12/merry-christmas.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/1891453271033665597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/1891453271033665597'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/12/merry-christmas.html' title='Merry Christmas!'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/02987079709890896170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_l-LLksOg9eE/R9bjxIwpurI/AAAAAAAAAAM/24-1aJgI-VI/S220/tommy2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-6347690107149110849</id><published>2009-12-09T15:59:00.000+01:00</published><updated>2009-12-09T16:00:32.775+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Acceptance Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Selenium'/><title type='text'>Selenium not a success story</title><content type='html'>Since the beginning of this project our Test Manager has been developing automated acceptance tests for our User Stories using &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt;. While it is great to have automated acceptance tests, it is not so great when you can't get them to run on your build server. The whole point of automated acceptance tests is to get feedback as soon as possible so you can correct either the tests or the code that broke them.&lt;a href="http://clearspace.openqa.org/thread/17226"&gt; &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Our goal is to run the Selenium server as a Windows service. First I read this post &lt;a href="http://clearspace.openqa.org/thread/17226"&gt;http://clearspace.openqa.org/thread/17226&lt;/a&gt; where I got the impression it was not possible to get Selenium to run as a service.&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt; Then I read this post &lt;a href="http://clearspace.openqa.org/message/39530"&gt;http://clearspace.openqa.org/message/39530&lt;/a&gt; telling that it was possible. Anyhow we have not got the Selenium to run successfully as a service, or rather, it does run but not reliable.&lt;br /&gt;&lt;br /&gt;What are our options?&lt;br /&gt;We decided to timebox the life of the Selenium server experiments to a maximum of a week. During that time we will set another developer to look at the problem to get a new perspective. There are three options to try here:&lt;br /&gt;1. Get the Selenium server to run as a service. As we already know it might not be possible.&lt;br /&gt;2. Always login to the server and start the Selenium server manually and not log out. The Selenium server works fine when you are interactively logged in.&lt;br /&gt;3. Try to start the Selenium server using a scheduled task. I don't think we have tried this.&lt;br /&gt;&lt;br /&gt;Another option than getting the acceptance tests to run on the build server is to run the tests on the developers machine, just like with unit tests.&lt;br /&gt;&lt;br /&gt;I will give you our final decision in a future post and would of course appreciate your feedback on how you are working with automated acceptance tests and what tooling you use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-6347690107149110849?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/6347690107149110849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/12/selenium-not-success-story.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/6347690107149110849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/6347690107149110849'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/12/selenium-not-success-story.html' title='Selenium not a success story'/><author><name>Simon</name><uri>http://www.blogger.com/profile/14081519525165093972</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></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-4480046262457442385</id><published>2009-11-27T17:05:00.003+01:00</published><updated>2009-11-27T17:21:01.570+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pair Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Easing up the XP</title><content type='html'>We have not reached the desired productivity level just yet even though development is faster for each day. Since we have a challenging dead line we have decided to ease up a little on the XP to get faster forward. This is what we did.&lt;br /&gt;&lt;br /&gt;We first had a retrospective with the guys in the team to get their idea of what is slowing each of them down. Pair Programming and inexperience with TDD was the key problems. Some said that coding in pair takes longer than doing it alone since you need to explain everything you do. Some said that thinking about creating the test first probably took three times as long as just doing it.&lt;br /&gt;&lt;br /&gt;The actions we decided on was&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If you get stuck with the Test First, just do the code and write the test after.&lt;/li&gt;&lt;li&gt;If you feel that you don't add anything while Pairing, go to the task board and start investigating the next task.&lt;/li&gt;&lt;li&gt;Don't ask too much and don't tell too much while Pair Programming. Stick to the problem you're working on.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-4480046262457442385?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/4480046262457442385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/11/easing-up-xp.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/4480046262457442385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/4480046262457442385'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/11/easing-up-xp.html' title='Easing up the XP'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/02987079709890896170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_l-LLksOg9eE/R9bjxIwpurI/AAAAAAAAAAM/24-1aJgI-VI/S220/tommy2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-6956130400937301128</id><published>2009-11-12T11:40:00.003+01:00</published><updated>2009-11-12T11:51:17.685+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>TDD is hard</title><content type='html'>Writing the tests isn't the hard part. At least not for me. It's when you have them. I often find myself do my refactorings first and then correct the tests to work again once refactoring is done.&lt;br /&gt;&lt;br /&gt;How do you work with refactoring in a TDD project?&lt;br /&gt;&lt;br /&gt;Another hard part is to stop writing the tests - to find the decent level where you have good tests and remain productive. I could spend an entire day writing tests to validate some data, but that wouldn't be very productive. Probably 15 minutes may produce the code needed with just a small number of tests - adding more tests would make sure that even more cases work, but they all probably do from the start.&lt;br /&gt;&lt;br /&gt;When do you settle and think a test is good enough and move on to the next function?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-6956130400937301128?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/6956130400937301128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/11/tdd-is-hard.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/6956130400937301128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/6956130400937301128'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/11/tdd-is-hard.html' title='TDD is hard'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/02987079709890896170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_l-LLksOg9eE/R9bjxIwpurI/AAAAAAAAAAM/24-1aJgI-VI/S220/tommy2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-3770390725216631047</id><published>2009-11-04T08:46:00.000+01:00</published><updated>2009-11-04T09:38:27.909+01:00</updated><title type='text'>Intensity</title><content type='html'>In the past three weeks...&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I've learnt the basics of XP.&lt;br /&gt;&lt;div&gt;I've learnt the basics of Planning Poker.&lt;br /&gt;I've learnt the basics of Pair Programming.&lt;br /&gt;I've learnt the basics of Test Driven Development (TDD) with &lt;a href="http://www.ayende.com/projects/rhino-mocks.aspx"&gt;Rhino mocks&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;I've learnt that a project that grows with new members rapidly is exhausting.&lt;br /&gt;&lt;div&gt;I've learnt that you must develop &lt;a href="http://sharepoint.microsoft.com/Pages/Default.aspx"&gt;MOSS&lt;/a&gt; sites in a Virtual Machine.&lt;br /&gt;I've learnt how to enable stack trace on MOSS.&lt;/div&gt;&lt;div&gt;I've learnt new keyboard shortcuts in Visual Studio.&lt;br /&gt;&lt;br /&gt;and probably more...&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-3770390725216631047?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/3770390725216631047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/11/intensity.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/3770390725216631047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/3770390725216631047'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/11/intensity.html' title='Intensity'/><author><name>Simon</name><uri>http://www.blogger.com/profile/14081519525165093972</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></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-1959801830349971414</id><published>2009-10-30T11:18:00.003+01:00</published><updated>2009-10-30T11:20:29.549+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Current number of Unit Tests</title><content type='html'>I just added a new Gadget in the sidebar, where we'll show the current number of Unit Tests in our project. We're starting now at 21 unit tests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-1959801830349971414?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/1959801830349971414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/current-number-of-unit-tests.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/1959801830349971414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/1959801830349971414'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/current-number-of-unit-tests.html' title='Current number of Unit Tests'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/02987079709890896170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_l-LLksOg9eE/R9bjxIwpurI/AAAAAAAAAAM/24-1aJgI-VI/S220/tommy2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-1645025187632391629</id><published>2009-10-23T16:26:00.010+02:00</published><updated>2009-10-23T17:23:43.850+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='User story'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning Game'/><category scheme='http://www.blogger.com/atom/ns#' term='Acceptance Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Simple Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Pair Programming'/><title type='text'>Presenting XP - our XP</title><content type='html'>I just held my fourth presentation of XP this month. The first was on the startup meeting, the second with the team, the third was for the customer and today it was for the entire tech department of Creuna Sweden.&lt;br /&gt;&lt;br /&gt;The first occation was alot about selling the idea to the company. That presentation was based on the article &lt;a href="http://xprogramming.com/xpmag/whatisxp"&gt;What is XP&lt;/a&gt; by Ron Jefferies along with a couple of slides I added about why this was good for us, both in this project and in the long run. On the rest of the presentations I have just had one slide, &lt;a href="http://xp123.com/xplor/xp0202/xp-one-page.PDF"&gt;One Page XP&lt;/a&gt; by Bill Wake, and talked freely about XP from upper left to lower right, adding things as I pass the different stages.&lt;br /&gt;&lt;br /&gt;The second occation was to get the team started, trying to figure our the roles and responsibilities among us. What are the Interaction Designer, the Test Leader and the Project Manager supposed to do? We've decided on having the Interaction Designed being in charge of the user stories, and coordinating them with the customer. Along with the Test Leader she then writes proposed Acceptance Tests for each story. The Test Leader is then in charge of implementing the Automated Acceptance Test using Selenium and also doing the manual testing where Selenium can't be used. The Project Manager mainly do XP while playing The Planning Game and keeping the Overall Schedule. Other than that she keeps track of how we're doing with time and estimates and arrange everything around to let the rest of the team focus on producing - she's somewhat like a Scrum Master.&lt;br /&gt;&lt;br /&gt;The third was more of a introduction where we wanted the customer to know what to expect and to get to know how much the customer wanted to be involved. We got the customer to agree on sitting one day every week at our office, and also got to know that more involvment in the story creation was wanted. We settled for a process where Angelina will produce the stories and then walk the customer through them in a separate meeting before we plan. It's a solution we all think will work really good.&lt;br /&gt;&lt;br /&gt;This last one was more educational to let everyone else at the company know what XP is, what it can do for us and what pros and cons we've found so far. About half of the group knew briefly what XP is on before hand, but only a few had more than shallow knowledge. The most discussion was when I came to the Design Philosophy box in the lower left where we talked about Good Design versus Simple Design. I stated that all Design Principles still are valid and that Simple Design just states that you shouldn't make your design "future proof". An example that came up was that you might not want to use a Factory for creating objects if you only can see need for one implementation, which I agreed to but added that you'd anyway would make that class implement an Interface that others use to access it - making it easy to add a Factory later on if needed while it isn't adding code that isn't needed. I found it peculiar that no discussion at all was raised around Pair Programming - except our thought about how to deal with new developers added to the team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-1645025187632391629?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/1645025187632391629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/presenting-xp-our-xp.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/1645025187632391629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/1645025187632391629'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/presenting-xp-our-xp.html' title='Presenting XP - our XP'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/02987079709890896170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_l-LLksOg9eE/R9bjxIwpurI/AAAAAAAAAAM/24-1aJgI-VI/S220/tommy2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-4665003009761984629</id><published>2009-10-22T21:23:00.014+02:00</published><updated>2009-10-23T14:29:22.578+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='User story'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning Poker'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning Game'/><title type='text'>Planning Poker</title><content type='html'>&lt;div&gt;Today Tommy brought his Planning Poker deck to our Planning Game session (&lt;a href="http://xpcreuna.blogspot.com/2009/10/planning-game.html"&gt;see previous post&lt;/a&gt;). I've only read about planning poker before but never used it in practice.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Deck:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The Planning Poker deck is like an ordinary deck of cards but instead of clubs, diamonds, hearts and spades with different values there are only numbers representing days. On the back of each card there is a color to group them. Each color consists of thirteen cards numbered 0, 1/2, 1, 2, 3, 5, 8, 13, 20, 40, 100. It also have two "wildcards", one coffeecup meaning take a break and one question mark meaning we have to discuss this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://4.bp.blogspot.com/_PYWP9xq8yPU/SuGf6Nk4EGI/AAAAAAAAAAs/1JF-G9bUAxs/s320/planningpoker.jpeg" style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5395769650992124002" /&gt;&lt;div&gt;Planning Poker Deck&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Game play:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We were four players. Each player picked a pile of cards with the same color. As in most card games you are not supposed to show you cards face to your competitors. Then we read one of our User Stories and each player played the card representing the number of days they believed it would take to finish it. Estimates included automated acceptance tests as this is the definition of done in our case. The card you played was placed at the table with face down, and then turned by all players simultaneously so you wouldn't cheat:) If all players played the same estimate this estimate was written down on the User Story. If all players played different estimates we discussed back and fourth until we all felt comfortable with the estimate. Equally if some player played a much higher or lower value than the rest of us. The coffeecup or the question mark was not used, maybe next time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even though there's no real competition as there are no winner, except the whole team if the estimates are good, it was much more fun than just sit down and do estimates. I really recommend you to try it.&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/3288433757755130449-4665003009761984629?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/4665003009761984629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/planning-poker.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/4665003009761984629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/4665003009761984629'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/planning-poker.html' title='Planning Poker'/><author><name>Simon</name><uri>http://www.blogger.com/profile/14081519525165093972</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_PYWP9xq8yPU/SuGf6Nk4EGI/AAAAAAAAAAs/1JF-G9bUAxs/s72-c/planningpoker.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-2949855727564047157</id><published>2009-10-22T17:33:00.003+02:00</published><updated>2009-10-22T18:03:57.846+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='User story'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning Poker'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning Game'/><category scheme='http://www.blogger.com/atom/ns#' term='Acceptance Testing'/><title type='text'>The Planning Game</title><content type='html'>Today we played our first Planning Game. We started this morning with playing Planning Poker to estimate all the stories we've come up with. It turned out really good, but we didn't manage to estimate all the stories on the hour we had before the customer arrived for the Release Planning and Iteration Planning. A small pile of assumed low priority stories remained, but we probably managed to estimate more stories this way than would have been the case if we had estimated the usual way.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_l-LLksOg9eE/SuB7d5XtntI/AAAAAAAAABU/PgYuBrXvhIo/s1600-h/image001.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5395448107136556754" border="0" alt="" src="http://3.bp.blogspot.com/_l-LLksOg9eE/SuB7d5XtntI/AAAAAAAAABU/PgYuBrXvhIo/s400/image001.jpg" /&gt; &lt;p align="center"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-size:85%;"&gt;Simon, Tommy and Angelina playing Planning Poker&lt;/span&gt; &lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-size:85%;"&gt;&lt;/p&gt;&lt;/span&gt;When the customer arrived we first prioritized all the stories we had, including the ones that we didn't have time to estimate. Once the priorities were in place it was a no-brainer to choose what to include in the first iteration. We simply calculated how much time we would be able to spend during the iteration and then selected stories from the top until we reached the available time. The stories with high priority were all estimated by the morning session. We also created a release plan with some set dates for different parts of the project.&lt;br /&gt;&lt;br /&gt;Moving on to Iteration Planning we had a bunch of proposed Acceptance Tests prepared to define each story. These were discussed by the Whole Team, including the customer. We slightly redefined a few of the stories by changing details in the proposed tests, and also came up with some extra tests needed to prove the function. Along with the definition of Acceptance Tests we also performed the Task Breakdown of each story. Here it seemed that the developers were the only ones really needed though, so in the future we might do that after the Iteration Planning.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-2949855727564047157?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/2949855727564047157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/planning-game.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/2949855727564047157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/2949855727564047157'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/planning-game.html' title='The Planning Game'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/02987079709890896170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_l-LLksOg9eE/R9bjxIwpurI/AAAAAAAAAAM/24-1aJgI-VI/S220/tommy2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_l-LLksOg9eE/SuB7d5XtntI/AAAAAAAAABU/PgYuBrXvhIo/s72-c/image001.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-5598158654771821805</id><published>2009-10-22T13:22:00.001+02:00</published><updated>2009-10-22T21:22:28.687+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Continuous Integration</title><content type='html'>&lt;div&gt;For a few days we've been working to get the build server ready. We find it crucial to the entire project that the build and deploy works flawless, also continuous integration is mandatory in an XP project. Currently we test the continuous integration setup with a small template project for Microsoft Office SharePoint Server 2007 (MOSS).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So far we've managed to get Cruise Control.Net to trigger on commits to our Subversion repository. We already do this for our other projects so it was an easy task. What differs is that it also runs all unit tests and later it will also run all the automated acceptance tests.&lt;/div&gt;&lt;div&gt;It was quite nice to see the red/green bars of failed and successful NUnit tests in Cruise Control after a code commit to Subversion.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Before the build was actually working I was worried MOSS  would make me install the whole Share point package on to the build server just to build and create a deploy package. &lt;/div&gt;&lt;div&gt;But, no worries, making it build was quite simple I just had to copy Microsoft.SharePoint.dll to our assemblies folder (this is our lib or libraries folder). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tommy and I paired up to figure out how to use &lt;a href="http://www.codeplex.com/wspbuilder"&gt;WSPBuilder&lt;/a&gt; without the need to install Windows SharePoint Services (WSS) to the build server. According to the WSPBuilder documentation it is required. First time we run WSPBuilder it complained that some assemblies where missing. By adding the -DLLReferencePath parameter referencing our library assemblies for WSPBuilder it was outputting the wsp file we wanted.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next up is to get the wsp package to install nightly on the test web server. We don't believe we can do deploys every commit as MOSS is not super fast when deploying wsp packages.&lt;/div&gt;&lt;div&gt;Is this wise or not? Would you put the deployment into the continuous builds? Please give us your opinion.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-5598158654771821805?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/5598158654771821805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/continuous-integration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/5598158654771821805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/5598158654771821805'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/continuous-integration.html' title='Continuous Integration'/><author><name>Simon</name><uri>http://www.blogger.com/profile/14081519525165093972</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></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-6245856000331699522</id><published>2009-10-16T16:37:00.004+02:00</published><updated>2009-10-16T16:50:52.154+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='User story'/><title type='text'>More about writing user stories</title><content type='html'>In this project we've decided that I, as Interaction Designer, should write the user stories. I've worked in projects where we've used stories for planning our work before, but then we've mostly focused on the size and the independency of the stories. We've also prioritized functions before writing the stories, and writing them have been done by the whole team as a part of the planning activity.&lt;br /&gt;&lt;br /&gt;This time we've been writing stories with the mindset to make them, Independent, Negotiable, Valuable, Estimatable, Small and Testable. We've learned these rules from &lt;a href="http://xp123.com/wwake/"&gt;Bill Wake&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;An Interaction Designer should be aware of the user value in everything they do, and I find it useful to formulate the user stories so that they express how every part of our project is of value either to the end user or to the customer. In this way everyone in the team will be reminded of why a function should be developed and it will also be a good help to prioritize the stories later.&lt;br /&gt;&lt;br /&gt;The writing of user stories in this project has been much about documenting a prototype that we've created in the pre-study. This work has been good because we've once again been forced to challenge everything we've decided to develop with the question "Why would the end user like to have/do this?"&lt;br /&gt;&lt;br /&gt;To me the most difficult part of writing the user stories have been to make them independent. We have a step-by-step flow where the user first signs in, then fills in a form, and at last submits the information. Having a story including filling in a form while excluding the submitting part is not an independent story, but including the submitting part may make the story to big. Instead we’ve tried to split that story into several stories where some is about functions that make it possible to fill in the form (e.g. listing and manipulating information), and another one is about actually filling in the information and submitting it.&lt;br /&gt;&lt;br /&gt;It has also been hard to make the stories both small and negotiable. Adding too much detail is easy, especially since we already know a lot about details from the pre-study.&lt;br /&gt;&lt;br /&gt;Writing stories alone is hard. After a while you come to the point when you do not question your own writings, if you’ve once thought that a story seems to be, for example, negotiable it is difficult to reconsider it without a second persons view of it. Therefore I’ve had a great help from the developers and the Test Manager in my team. Discussing the stories has lead to new, deleted and rewritten stories.&lt;br /&gt;&lt;br /&gt;The next step will be to take the user story draft to discuss with our customer!&lt;br /&gt;&lt;br /&gt;To learn more about writing user stories I’ve been reading:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The first three chapters in &lt;a href="http://www.amazon.co.uk/User-Stories-Applied-Development-Signature/dp/0321205685"&gt;User stories applied by Mike Cohn&lt;/a&gt;. I think I learned the most from this reading, I appreciate that it has several describing examples.&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.mountaingoatsoftware.com/advantages-of-the-as-a-user-i-want-user-story-template"&gt;Advantages of the “As a user, I want” user story template&lt;/a&gt; from Mike Cohn’ s blog&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.extremeprogramming.org/rules/userstories.html"&gt;User stories at extremeprogramming.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/User_story"&gt;User stories at Wikipedia&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A chapter about User stories in &lt;a href="http://www.amazon.com/dp/0321278658/ref=cm_sw_su_dp"&gt;Extreme programming explained by Kent Beck&lt;/a&gt;. I found this reading quite brief (probably because I read it after all the other reading), but it may be good to get a first idea of what this is about.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-6245856000331699522?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/6245856000331699522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/more-about-writing-user-stories.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/6245856000331699522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/6245856000331699522'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/more-about-writing-user-stories.html' title='More about writing user stories'/><author><name>Angelina</name><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></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-1242743807333340072</id><published>2009-10-16T12:10:00.004+02:00</published><updated>2009-10-16T13:20:08.069+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pomodoro'/><category scheme='http://www.blogger.com/atom/ns#' term='Pair Programming'/><title type='text'>Pair !Programming</title><content type='html'>The first few weeks of this project a lot of time have been spent in meetings, discussing how to do this, writing stories, prioritizing and setting up the environment. Today we decided to start doing the "pair" part anyway, so today we're doing Pair Build-Machine Configuration.&lt;br /&gt;&lt;br /&gt;We've decided to use &lt;a href="http://www.pomodorotechnique.com/"&gt;The Pomodoro Technique&lt;/a&gt; while starting with this Pair-thing. To begin we will do three Pomodori development and one Pomodori reflection before lunch, and then another similar set of four Pomodori after lunch. Our guess is that we after a while, when we have gained some experience with this, will add more development and remove at least one of the reflections.&lt;br /&gt;&lt;br /&gt;Do you think it sounds like a good way to start?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-1242743807333340072?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/1242743807333340072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/pair-programming.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/1242743807333340072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/1242743807333340072'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/pair-programming.html' title='Pair !Programming'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/02987079709890896170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_l-LLksOg9eE/R9bjxIwpurI/AAAAAAAAAAM/24-1aJgI-VI/S220/tommy2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-2684430986376682312</id><published>2009-10-09T15:22:00.000+02:00</published><updated>2009-10-09T15:59:33.156+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='On-site customer'/><category scheme='http://www.blogger.com/atom/ns#' term='Organization'/><title type='text'>Writing User Stories</title><content type='html'>As the first task doing XP we've started writing user stories for our project. We've decided to use the “As a &lt;type&gt;, I want &lt;some&gt; so that &lt;some&gt;” story template after reading &lt;a href="http://blog.mountaingoatsoftware.com/advantages-of-the-as-a-user-i-want-user-story-template"&gt;this post&lt;/a&gt; by Mike Cohn. We consider the &lt;em&gt;so-that&lt;/em&gt; clause required though, since we think it ads a alot of value to think about why we do things - we have allready removed one of the features we had planned after challenging it with that question.&lt;br /&gt;&lt;br /&gt;Yes, we have planned features. Actually the entire project is planned up front, which is another challenge for this project. It was preceded by a pre-study and the picture about what should be done is pretty clear to us allready. Our interaction designer and our project manager have spent alot of time with the customer to get this picture, which we know is not very XP-like. The good thing is that these two internal persons have so good understanding about the product that they can act as the &lt;em&gt;on-site customer&lt;/em&gt; that we can't have for real.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3288433757755130449-2684430986376682312?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/2684430986376682312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/writing-user-stories.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/2684430986376682312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/2684430986376682312'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/writing-user-stories.html' title='Writing User Stories'/><author><name>Tommy</name><uri>http://www.blogger.com/profile/02987079709890896170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_l-LLksOg9eE/R9bjxIwpurI/AAAAAAAAAAM/24-1aJgI-VI/S220/tommy2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3288433757755130449.post-8710916332624131047</id><published>2009-10-09T14:28:00.001+02:00</published><updated>2009-10-09T16:00:00.582+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='On-site customer'/><category scheme='http://www.blogger.com/atom/ns#' term='Acceptance Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Pair Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Organization'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Cannonball into XP</title><content type='html'>A few weeks ago we were finally granted to use eXtreme Programming on a new project. It's a web application with a fair amount of business functionality. We have decided for the Cannonball-approach as Kent Beck refers to in his paper &lt;a href="http://www.threeriversinstitute.org/Toe%20Dipping.pdf"&gt;“Getting Started with XP”&lt;/a&gt;. &lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We both have some initial understanding about XP and have been anxious to try it out, but haven’t had support until now. We have experience from some of the practices, but not all, and have spent the first few weeks reading up on more details, like &lt;a href="http://amzn.com/0321278658"&gt;Extreme Programming Explained&lt;/a&gt; (Kent Beck) and &lt;a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches"&gt;Scrum and XP from the trenches&lt;/a&gt; (Henrik Kniberg).&lt;/div&gt;&lt;div&gt;&lt;p class="MsoNormal"&gt;Currently we use continuous integration on all projects already, and as senior developers we have plenty of experience with refactoring. We have used the Scrum process, and thereby Stories and Iterations amongst other things. Tommy have also been experimenting with TDD for a couple of years. &lt;/p&gt;&lt;p class="MsoNormal"&gt;As for our concerns, none of us have done much pair programming or automated acceptance tests before. Another issue is our organization at Creuna which does not map directly to XP. Being consultants having an &lt;i&gt;on site customer&lt;/i&gt; can be difficult for example.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Commenting this post we would love to get your input on how you started with XP. Also, during this project, don't hesitate to give us comments how you would solve similar problems.&lt;/p&gt;&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/3288433757755130449-8710916332624131047?l=xpcreuna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xpcreuna.blogspot.com/feeds/8710916332624131047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/cannonball-into-xp.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/8710916332624131047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3288433757755130449/posts/default/8710916332624131047'/><link rel='alternate' type='text/html' href='http://xpcreuna.blogspot.com/2009/10/cannonball-into-xp.html' title='Cannonball into XP'/><author><name>Creuna XP Team</name><uri>http://www.blogger.com/profile/03754691427263313444</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></entry></feed>
