<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  --><rss xmlns:lj="http://www.livejournal.org/rss/lj/1.0/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
  <title>Traversing the Ocean of Knowledge</title>
  <link>http://sirenian.livejournal.com/</link>
  <description>Traversing the Ocean of Knowledge - LiveJournal.com</description>
  <lastBuildDate>Wed, 14 May 2008 12:28:31 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>sirenian</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/sirenian" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/47679.html</guid>
  <pubDate>Wed, 14 May 2008 12:28:31 GMT</pubDate>
  <title>RIP As a... I want... So that...</title>
  <link>http://sirenian.livejournal.com/47679.html</link>
  <description>If you're more interested in the results than the conversation, skip to &lt;a href="#summary"&gt;the summary&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Recently, I've realised that a lot of BDD has been very dev-focused. There's a reason for that. Dan's a dev, I'm a dev and most of the people who helped to evolve BDD are devs.&lt;br /&gt;&lt;br /&gt;BDD's about the interaction between the business and the technical people in software. I want to know how it's working from the other side. So, I've been learning more about the customers, and particularly, more about BAs and their role. I had the recent fortune to run into Angela Martin at &lt;a href="http://agileindia.org/agilemumbai08/index"&gt;Agile India&lt;/a&gt;, where she taught me the art of grouping stories into coherent releases, while still keeping the stories granular enough that progress can be measured and delivery made regular and predictable.&lt;br /&gt;&lt;br /&gt;Last night at &lt;a href="http://www.xpdeveloper.net/xpdwiki/Wiki.jsp?page=XtC"&gt;XtC&lt;/a&gt; I met up with Chris Matts (of &lt;a href="http://www.infoq.com/articles/real-options-enhance-agility"&gt;Real Options&lt;/a&gt; fame) who told me we're doing it all wrong. "It's not an art, it's a process," he said. "You're focused on the stories; that's why you think it's an art form. The focus should be the value you're releasing."&lt;br /&gt;&lt;br /&gt;"Right", I say. "So, when we originally planned the stories that would deliver the value, we knew what would contribute to that value. But we've lost sight of that. Changes have been made. As devs, all we have are those narratives - the 'As a &amp;lt;role&amp;gt;, I want &amp;lt;a feature&amp;gt;, so that &amp;lt;some benefit is achieved&amp;gt;'. So we need to work out which of the benefits add up to the value we're aiming for. That helps us work out which stories we should try to complete for a release. The QAs are helping us work out what's ready; the BAs are helping us work out what's important."&lt;br /&gt;&lt;br /&gt;"That's the problem," says Chris. "You're putting the role first. It's the value that's most important. Try this: In order to &amp;lt;deliver some value&amp;gt;, as a &amp;lt;role&amp;gt;, I want &amp;lt;some feature&amp;gt;. Instead of working out why people want a feature, and whether it contributes to the value, now we're working out who needs a feature, then assigning the story. So our stories are much more focused. If all the stories that contribute to a value are ready, we release."&lt;br /&gt;&lt;br /&gt;I guess if we get to the point where we can release with only some of the stories ready, we didn't break down our values into granular enough elements. And when we want to work out what goes in a release, it's easy. The word 'release' is more meaningful. There's some untapped money out there - some market share, some cost saving, some battle against a competitor. All the features we produce go towards releasing that value for our customers to use - and it's the &lt;i&gt;value&lt;/i&gt; we're releasing, not the features.&lt;br /&gt;&lt;br /&gt;Thanks, Chris, for that.&lt;br /&gt;&lt;br /&gt;I need to also thank Dave for giving me a better understanding of what a &lt;a href="http://www.agilemanagement.net/Articles/Weblog/PrioritizingRequirements.html"&gt;value&lt;/a&gt; is, and for founding the &lt;a href="http://finance.groups.yahoo.com/group/kanbandev"&gt;Kanban&lt;/a&gt; group on Yahoo, who I'm told are responsible for the new template.&lt;br /&gt;&lt;br /&gt;&lt;a name="summary"&gt;In summary&lt;/a&gt;: my preferred narrative now reads:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;In order to&lt;/b&gt; &amp;lt;achieve some value&amp;gt;&lt;br /&gt;&lt;b&gt;As a&lt;/b&gt; &amp;lt;role&amp;gt;&lt;br /&gt;&lt;b&gt;I want&lt;/b&gt; &amp;lt;some feature&amp;gt;.&lt;br /&gt;&lt;br /&gt;Because, in order for my work to have any meaning, as a dev, I want to know why you want it.</description>
  <comments>http://sirenian.livejournal.com/47679.html</comments>
  <category>business value</category>
  <category>bdd</category>
  <category>narratives</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/47505.html</guid>
  <pubDate>Thu, 24 Apr 2008 15:20:15 GMT</pubDate>
  <title>Running your own Retrospective</title>
  <link>http://sirenian.livejournal.com/47505.html</link>
  <description>I'm running a training course for TDD and OO design at one of our clients.&lt;br /&gt;&lt;br /&gt;Normally when I teach this, it's to Thoughtworkers or client staff working with Thoughtworkers. This time, I'm teaching fairly experienced clients who have some idea of OO already. I've been trying to teach more advanced techniques - communication with customers and how it drives design; starting with the UI and a good concept of 'done', etc.&lt;br /&gt;&lt;br /&gt;I could see that occasionally, some of the participants looked uncomfortable. Whenever I asked them for feedback, they told me that they were having fun and learning a lot! Yet I could see that they were still uncomfortable - they just couldn't tell me why.&lt;br /&gt;&lt;br /&gt;So, at the end of the second day, we ran a small retrospective. Normally, I would ask a facilitator to run the retrospective for me, but we didn't have one. Here are some things I did that seemed to work, and help the retrospective to run smoothly.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Make them feel safe with you&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;It's &lt;a href="http://www.thekua.com/atwork/2008/04/24/when-retrospectives-go-wrong-controlling-the-conversation/"&gt;awkward running a retrospective when you're the one who's likely responsible for the things that aren't working quite as well as they could&lt;/a&gt;. It's especially true if you're a stranger to the group, or the group isn't used to giving and receiving feedback, or both. I wanted to introduce to the participants the idea that they should feel safe giving me feedback; that I would react to that feedback positively and wouldn't criticise them for giving it. I also wanted to give them an idea of how they might run retrospectives for themselves.&lt;br /&gt;&lt;br /&gt;So this is what I told my participants:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 10%; margin-right: 10%"&gt;I've run this training course for a lot of people. I come with a very generic course, and tailor it as best I can to the people who turn up. Every group is different. Some people prefer different techniques to others. You no doubt have your own thoughts about what might work for you.&lt;br /&gt;&lt;br /&gt;I'd like to use a retrospective format to get an idea of how best I can tailor this course for you.&lt;br /&gt;&lt;br /&gt;In a retrospective, we start with the &lt;a href="http://www.retrospectives.com/pages/retroPrimeDirective.html"&gt;Prime Directive&lt;/a&gt;: that no matter what we find out, we know that everyone is a good person and has done the best job they can in the situation. I believe you're all good people. I hope I'm a good person. I think that the job I'm doing here is a good one, but I'd like to make it better. There are ways in which you could phrase feedback positively. That would be nice! But even if you can't find a way to express things positively - I still want the feedback. I have a lot of confidence in myself and my abilities. I can take it!&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Then, I ran the safety check. The participants felt safe enough (mostly 4s on a 1-5 scale) so I went ahead.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Make them feel safe with each other&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;I asked all the participants to draw a picture to represent how they felt about the course so far.&lt;br /&gt;&lt;br /&gt;I could see their eyes light up as everyone put the pictures on the board. Eight faces with question marks, puzzled expressions and light-bulbs. Everyone felt slightly puzzled, slightly confused yet enlightened! I think this helped them realise that their confusion wasn't unique.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Make them feel safe with themselves&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;People are usually happier giving feedback if they can find a way to phrase it positively. Fortunately, this is easy! For every "less of" there's usually a "more of"; for every "stop doing" there's often a "start doing"; for every "fear" there's a "hope".&lt;br /&gt;&lt;br /&gt;Often in retrospectives we insist that people put one thing in each category. I didn't want to do that this time, because I felt that people would be uncomfortable with the idea of giving me lots of "less of". Instead, I left them free to think of more positive ways of expressing what they wanted.&lt;br /&gt;&lt;br /&gt;I encouraged them to think of ways of changing things by adding three categories:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;More of / hope&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Less of / fear&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Puzzles&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I explained what the categories were for, and asked them to come up with about five things that they wanted to put in these categories. To show them what I meant, I drew a pint of beer and put it in the "hope" category, then told them that I hoped that we could all go out one evening for something less formal.&lt;br /&gt;&lt;br /&gt;Then I let the participants loose on the board!&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Proof that it works&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;The participants wrote things like "Hope for more time to come up with a solution!","Hope not to be so confused by other people's designs", "Hope for more tea breaks", "Hope for better understanding", "Hope we get to learn more about Agile", etc. There were very few fears - "Afraid I'll fall behind" - and a couple of puzzles that were either easy to answer or I promised would be answered as part of the course.&lt;br /&gt;&lt;br /&gt;I asked them to talk in more detail and give examples of times when they'd been confused, etc. We came up with a lot of action items as a result of the things they put on the board:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Break down exercises into smaller chunks&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Baseline code bases (move to one common solution for the exercise) frequently, to allow people to swap pairs and stop them being overwhelmed by the differences when they do&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Allow more time for analysis of the solution and for questions&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Participants to tell me when they want a tea break&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Pub next Thursday&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I also found some things which they wanted me to teach which weren't really part of the course, so I made a mental note to slip the easy things in when the time came, or provide them with links to resources where they could learn themselves.&lt;br /&gt;&lt;br /&gt;I checked that they thought the action items would meet their hopes. That feedback was very valuable, and far more useful than "Oh, we're having fun and learning a lot!"&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The safety check is the most important thing&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;It was very important to me that the feedback I got was honest and accurate. For that reason, I was extremely careful with the safety check. I made sure that it was visibly anonymous - I got one of the participants to gather up the pieces of paper, and made sure that they used identical paper and pens so that no one could be identified.&lt;br /&gt;&lt;br /&gt;If they hadn't felt safe, it would have given me feedback about my approachability, and how well I had expressed my desire to get feedback. It might also have indicated that people didn't feel safe with each other. I guess if that had happened I would have run more icebreakers, more fun exercises that let people relax, and I'd have looked carefully to see if there was any personal feedback that I needed to take on board or give to individual participants. I'd also have tried hard to find an independent facilitator to run the retrospective - but I wouldn't run it with a low safety check. I also let the participants know this, and reassured them that I'd do some different things to try and make the environment better if the safety check was low.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Thanks Pat!&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.thekua.com"&gt;Pat Kua&lt;/a&gt; loves retrospectives, and has taught me their importance and a number of techniques for running them. They're my second-favourite practice. My favourite is Small Releases - actually delivering the things you promised to deliver - and I use retrospectives to work out why I can't deliver, or how we can deliver better, or sooner. This can apply just as well to training courses as to code.&lt;br /&gt;&lt;br /&gt;I was quite surprised by how well the retrospective worked. Talking about it with my co-trainer Arvind afterwards helped me realise how the things I had done instinctively added to the environment of safety and helped the participants give me the feedback I needed. I hope it's helpful for you too.</description>
  <comments>http://sirenian.livejournal.com/47505.html</comments>
  <category>retrospectives</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/47346.html</guid>
  <pubDate>Mon, 21 Apr 2008 16:36:17 GMT</pubDate>
  <title>Agile Mumbai slides are up</title>
  <link>http://sirenian.livejournal.com/47346.html</link>
  <description>&lt;a href="http://agilefaqs.com/nareshjain.html"&gt;Naresh Jain&lt;/a&gt; has very kindly &lt;a href="http://www.slideshare.net/nashjain/behavior-driven-development-350219/"&gt;put up the slides&lt;/a&gt; from my BDD presentation at &lt;a href="http://agileindia.org/agilemumbai08/index"&gt;Agile Mumbai&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I deviated quite heavily from previous presentations I've done and talked about the history of BDD, how it evolved and the people and events that made it happen. You can find links on the last page to some of the more influential sites, groups and people - all good places / entities to hang around for innovative thought and challenging questions.&lt;br /&gt;&lt;br /&gt;Many thanks again, and particularly to &lt;a href="http://dannorth.net"&gt;Dan&lt;/a&gt; for being unavailable, Naresh and &lt;a href="http://agileindia.org/index.htm"&gt;Agile India&lt;/a&gt; for inviting me instead and &lt;a href="http://www.thoughtworks.com"&gt;Thoughtworks&lt;/a&gt; for letting me go.</description>
  <comments>http://sirenian.livejournal.com/47346.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/46867.html</guid>
  <pubDate>Mon, 21 Apr 2008 12:20:31 GMT</pubDate>
  <title>BDD for TDDers</title>
  <link>http://sirenian.livejournal.com/46867.html</link>
  <description>&lt;a href="http://anthonybailey.livejournal.com"&gt;Anthony Bailey&lt;/a&gt; and I had &lt;a href="http://anthonybailey.livejournal.com/34156.html#cutid1"&gt;a conversation over email&lt;/a&gt; about what good, experienced TDDers might get out of BDD.&lt;br /&gt;&lt;br /&gt;If you've been wondering what all the fuss is about, maybe this will help! Thanks, Anthony, for tidying the conversation up so nicely.</description>
  <comments>http://sirenian.livejournal.com/46867.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/46846.html</guid>
  <pubDate>Thu, 17 Apr 2008 15:48:11 GMT</pubDate>
  <title>JBehave 2, naming tests and developing libraries with BDD</title>
  <link>http://sirenian.livejournal.com/46846.html</link>
  <description>&lt;a href="http://www.pbell.com"&gt;Peter Bell&lt;/a&gt; and I had a &lt;a href="http://www.pbell.com/index.cfm/2008/4/17/I-Just-Got-Test-Infected-An-IM-with-Liz-Keogh"&gt;great conversation&lt;/a&gt; over Skype yesterday, which he's kindly blogged. We covered test names, and also talked about how to develop libraries using BDD. Again, this is how I do things; it's not necessarily the only way.&lt;br /&gt;&lt;br /&gt;Peter's mentioned JBehave 2, so the secret's out now - yes, it's in progress. It's not publically available because it's just a spike at the moment. We're starting afresh, learning some of the lessons that made JBehave 1.0 hard to use, taking advantage of JUnit 4's features, and drawing heavily on the success of RSpec.&lt;br /&gt;&lt;br /&gt;Our goals for JBehave 2 include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;no internal support for mocking - should be able to use any of the libraries&lt;/li&gt;&lt;br /&gt;&lt;li&gt;extends JUnit - right-click and run both behaviours and scenarios&lt;/li&gt;&lt;br /&gt;&lt;li&gt;uses &lt;a href="http://code.google.com/p/hamcrest/"&gt;Hamcrest's&lt;/a&gt; matchers&lt;/li&gt;&lt;br /&gt;&lt;li&gt;uses plain-text scenarios à la RSpec&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Here's a sneak preview of the spike so far.&lt;br /&gt;&lt;br /&gt;We have a scenario file, &lt;code&gt;i_can_toggle_a_cell&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Given a 5 by 5 game
When I toggle the cell at (2, 3)
Then the grid should look like 
.....
.....
.....
..X..
.....
When I toggle the cell at (2, 4)
Then the grid should look like 
.....
.....
.....
..X..
..X..
When I toggle the cell at (2, 3)
Then the grid should look like 
.....
.....
.....
.....
..X..&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We have a small class in the same package to run this, called &lt;code&gt;ICanToggleACell.java&lt;/code&gt; (the Scenario class is a JUnit test):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;package com.lunivore.gameoflife;

import org.jbehave.scenario.Scenario;

import com.lunivore.gameoflife.steps.GridSteps;

public class ICanToggleACell extends Scenario {
	
	@SuppressWarnings("unchecked")
	public ICanToggleACell() {
		super(new GridSteps());
	}
}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And we have steps defined thus:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;package com.lunivore.gameoflife.steps;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.jbehave.Ensure.ensureThat;

import org.jbehave.scenario.annotations.Given;
import org.jbehave.scenario.annotations.Then;
import org.jbehave.scenario.annotations.When;
import org.jbehave.scenario.steps.Steps;

import com.lunivore.gameoflife.domain.Game;
import com.lunivore.gameoflife.view.string.StringRenderer;

public class GridSteps extends Steps {
	
	private Game game;
	private StringRenderer renderer;

	@Given("a $width by $height game")
	public void theGameIsRunning(int width, int height) {
		game = new Game(width, height);
		renderer = new StringRenderer();
		game.setObserver(renderer);
	}
	
	@When("I toggle the cell at ($column, $row)")
	public void iToggleTheCellAt(int column, int row) {
		game.toggleCellAt(column, row);
	}
	
	@Then("the grid should look like $grid")
	public void theGridShouldLookLike(String grid) {
		ensureThat(renderer.asString(), equalTo(grid));
	}

}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm excited that this actually works. The next step is to get appropriate error messages when the scenario fails! We're working hard to get this out to you as soon as we can; watch this space.</description>
  <comments>http://sirenian.livejournal.com/46846.html</comments>
  <category>jbehave2</category>
  <category>bdd</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/46424.html</guid>
  <pubDate>Tue, 01 Apr 2008 10:31:33 GMT</pubDate>
  <title>Your horoscope for April</title>
  <link>http://sirenian.livejournal.com/46424.html</link>
  <description>&lt;h3&gt;How people&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;You've spent years making yourself invaluable to your friends, family and colleagues. Your confidence is at an all-time high - how many people in the world can do what you do? Watch out, though; pride cometh before a fall. You're a &lt;a href="http://en.wikiquote.org/wiki/Hannibal_(film)"&gt;deep roller&lt;/a&gt;. Let's hope one of your parents was not.&lt;br /&gt;&lt;br /&gt;Your tool of the month is &lt;a href="http://studios.thoughtworks.com/mingle-hidden/introducing-mingle-proj-o-matic"&gt;Mingle Proj-o-matic&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Why people&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Yesterday the room was crowded. The smell of pressure hung heavy in the air. The quiet tap of fingers on keyboards, the whispered conversations, the passionate arguments, the occasional round of applause as a story reaches completion - these were the sounds that punctuated your life. So how come it's suddenly so quiet?&lt;br /&gt;&lt;br /&gt;Your word of the month is &lt;a href="http://dictionary.reference.com/browse/anachronism"&gt;anachronism&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Who people&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;They promised a future in which robots clean the house, food is manufactured by holes in the wall, money is irrelevant, war is history and learning is taken in pill form. It hasn't happened yet. There'll always be work for people people - shelve any plans you had for holiday this month; you're needed right where you are!&lt;br /&gt;&lt;br /&gt;Your pub of the month is &lt;a href="http://www.asklaila.com/listing/Bangalore/Airport Road/The Leela Palace/Bdd6aUT1/"&gt;Leela Palace, Bangalore&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;When people&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;A blank page can stifle the most imaginative mind - sometimes creativity requires a place to start. Still, if mistakes are cheap then there's room to play. Imagine a world in which you could write things down in English, and &lt;a href="http://rspec.info"&gt;just have it work&lt;/a&gt;. Imagine what would happen if you didn't even need to write it down. The brain is the most amazing computer in the world... so far.&lt;br /&gt;&lt;br /&gt;Your quote of the month is:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Arthur_C._Clarke"&gt;Any sufficiently advanced technology is indistinguishable from magic.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;i&gt;&lt;a href="http://sirenian.livejournal.com/38028.html"&gt;What's my sign?&lt;/a&gt;&lt;/i&gt;</description>
  <comments>http://sirenian.livejournal.com/46424.html</comments>
  <category>zodiac</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/46114.html</guid>
  <pubDate>Mon, 31 Mar 2008 13:29:19 GMT</pubDate>
  <title>Perverse Incentives</title>
  <link>http://sirenian.livejournal.com/46114.html</link>
  <description>I proposed an Open Space session at Agile Mumbai to discuss &lt;a href="http://en.wikipedia.org/wiki/Perverse_incentive"&gt;Perverse Incentives&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Gaming_the_system"&gt;gaming the system&lt;/a&gt; in Agile projects.&lt;br /&gt;&lt;br /&gt;A perverse incentive is one which produces an effect that works against the interests of the people who proposed the incentive in the first place. Gaming the system can be thought of as working deliberately through the path of least resistance or greatest reward, towards the incentive, even if the effect of working that way is perverse.&lt;br /&gt;&lt;br /&gt;Many thanks to the Open Spacers who came up with the practices.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Here are some situations which led to the discussion.&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Situation 1:&lt;/b&gt; An IM notices that the team often underestimate cards. He berates the team for not spotting the problems that will slow them down and fixing them or at least factoring them in.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Desired effect:&lt;/b&gt; The team deal with the problems that are slowing them down and speed up. The estimates become more accurate once the surprises have gone away.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Actual effect:&lt;/b&gt; The team factor in larger estimates and contingency - it's easier than spotting and dealing with the tricky problems. Because they don't always need that contingency, there's less pressure to finish the tasks to which they've committed themselves. Without that pressure, they slow down.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Situation 2:&lt;/b&gt; Two developers go off on their own to investigate a possible solution to a tricky problem. They don't tell anyone they're doing it. The solution they're thinking of was already investigated and discounted. When the PM realises how much time has been wasted, he puts a process in place to ensure that any work that gets started has been approved with the team lead, that the business value has been agreed with the BAs, and that acceptance criteria have been defined. Anyone who starts work without following the process is reminded of the time wasted on the project by people doing work that's not valuable.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Desired effect:&lt;/b&gt; Less time is wasted doing work that doesn't deliver business value.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Actual effect:&lt;/b&gt; Developers waste time waiting for the team leads and BAs to come out of meetings. Refactoring and other cleaning up, which doesn't deliver business value directly, slides. The project slows down. Developers feel untrusted, and project leads spend all their time chasing up developers to make sure they're following the process.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Situation 3:&lt;/b&gt; The customer is unavailable when the developers want him. The developers spot the bottleneck and ask the business to assign more of the customer's time to them.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Desired effect:&lt;/b&gt; The customer answers the developers' questions, and the developers can deliver the right thing.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Actual effect:&lt;/b&gt; The customer loses touch with the users and with his peers. He doesn't get to use the end product, so becomes less interested in it. When the product is delivered, the users want many changes and the application no longer solves the needs of the business. The business also suffers because the customer is an skilled expert, and is less available to help the business in its day-to-day work.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;These were all real situations which we either encountered or were concerned about happening on our projects. We also brought up some examples outside of the software domain, in the fields of &lt;a href="http://www.dailymail.co.uk/pages/live/articles/news/news.html?in_article_id=515332&amp;amp;in_page_id=1770"&gt;healthcare&lt;/a&gt; and &lt;a href="http://findarticles.com/p/articles/mi_qn4158/is_20031009/ai_n12724965"&gt;education&lt;/a&gt;. That prompted a slew of other examples, and the discussion kicked off.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;These are the questions we wanted to answer:&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What stops processes delivering their desired effect? When processes are created that do deliver the right effect, how are they crafted and what is their focus?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;What meta-practices could we put in place that would help stop perverse incentives from being created?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Human perception skews us towards perverse incentives.&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;During the discussion, we quickly realised that we have an emotional attachment to weakness. Good practices and implemented solutions are invisible; they don't impinge on our consciousness. A bad practice or a problem stops us from doing what we want. It demands our attention; demands that we stop what we're doing and fix the problem. So our focus is skewed, and we automatically allow our efforts to drift. We fix the bad practices, instead of introducing good practices. We confront the problems, instead of finding a route around them.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Some practices which help us avoid perverse incentives.&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;NB: Whenever I've used words like "measure", I would also like to include curious observation, intelligent reasoning, judgement through experience and blind intuition - anything which is going to affect the changes you make as a result of the measurement. Some of these ways of measuring are more practical than others, depending on the context, and who's doing it. Pick one that works for you.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Measure reality, not comparative reality.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Don't measure how many stories were underestimated; measure how much they were underestimated by. Don't measure how often the customer is unavailable; measure how many hours he's there / not there. This will help you to measure the true scope of the problem. It will also help to remind you to...&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Keep the balance when measuring.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If you're measuring underestimation, also measure overestimation. If you're measuring how often a customer is unavailable when you want him, also measure how often a customer is available, but unused. If you're measuring how many developers waste time because they haven't followed the process, measure how much work gets done because developers don't have to wait to follow the process.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Consider aspects of the practice you're about to change that might be beneficial.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Consider how those meetings in which the customer spends his time might help your project. Measure how much the developers who went off on their own learnt about the domain and the technology, and how much work they got done in the following month as a result. Consider the time that project leads who aren't chasing up errant developers can spend on other things.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Measure objectives as directly as you can.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If you want to make your customer happy, get your customer's feedback, not the devs'. If you want to deliver business value faster, measure how much business value you're delivering. If you think that rogue developers are slowing down development, look at the change in velocity. Don't guess or apply reasoning if you can get real figures.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Fit your process to reality, not reality to your process.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If your process requires your customer to be there and he's not, maybe change the process - get some BAs, or arrange for another customer to help you. If the estimates are consistently awry, change the process of estimation rather than trying to fix problems that may be unfixable (there is &lt;a href="http://virtualschool.edu/mon/SoftwareEngineering/BrooksNoSilverBullet.html"&gt;no silver bullet&lt;/a&gt;). If your developers waste time doing something that's already been investigated, make sure the results of investigations are published in a place where they'll read it.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Concentrate on the things that enable you to get work done.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Counteract the skew towards weaknesses by deliberately emphasising strengths. We know this works when applied to &lt;a href="http://www.google.co.in/search?q=build+on+strengths+not+weaknesses"&gt;people&lt;/a&gt; and their abilities. It can also work when applied to a process and its practices. &lt;a href="http://appreciativeinquiry.case.edu/intro/whatisai.cfm"&gt;Appreciative Enquiry&lt;/a&gt; can help create an environment conducive to spontaneity, to getting things done and coming up with imaginative solutions based on things that worked before (and which are therefore less likely to be perverse).&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Give feedback, especially if something or someone works well.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We tend to focus on weaknesses in ourselves. Help the team appreciate their strengths, and avoid focusing on their weaknesses. If there's something that needs doing and nobody is doing it, don't berate the team - find someone who does it well and get them to join in.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Provide evidence when providing feedback.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;What evidence is there that the developers have slowed the team down? That the customer's unavailability has negatively affected the project? How many unfinished or rejected stories were there as a result?&lt;br /&gt;&lt;br /&gt;What did the developers learn as a result of their investigation? What did we learn about our processes? What did the customer provide us with as a result of the meetings?&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Make sure that the person in charge of an aspect of the project has an interest in maximising that aspect.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Don't praise the IM because his team meets the estimates - praise him because the amount they're actually doing goes up.&lt;br /&gt;&lt;br /&gt;Make sure the customer assigned to answer the team's queries has an interest in the final product.&lt;br /&gt;&lt;br /&gt;If you want developers to stop wasting time, introduce them to the customer, and ask the customer to tell them how valuable their work on the end product is - give them the motivation to deliver.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Bring in a fresh perspective.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Good improvements are often incremental. Sometimes it's hard to see which practices you've put in place that enable a project everyone said couldn't be done. An external observer can make you re-examine what you do, as well as helping you to pass on those unique practices to other projects and teams.&lt;br /&gt;&lt;br /&gt;Alternatively, try teaching your practices to people who aren't familiar with your project or methodology. When they ask questions about how that works, given your situation, write the answers down.&lt;/li&gt;&lt;/ol&gt;</description>
  <comments>http://sirenian.livejournal.com/46114.html</comments>
  <category>perverse incentives</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/45880.html</guid>
  <pubDate>Wed, 26 Mar 2008 15:31:20 GMT</pubDate>
  <title>Ignorance is bliss</title>
  <link>http://sirenian.livejournal.com/45880.html</link>
  <description>I used to get angry with ignorant people, until I realised that it only made them hide their ignorance. Then I realised that I was ignorant too. Now I love ignorant people best of all. I deliberately seek them out; they give me the greatest buzz in the world.&lt;br /&gt;&lt;br /&gt;I particularly love helping them appreciate their ignorance, mitigate against it, and eventually displace their ignorance to somewhere else.&lt;br /&gt;&lt;br /&gt;Some people like to call this movement "learning" and the act of helping people with it "teaching", but really, the idea that we can somehow put an end to ignorance is entirely illusory. The only thing we can do is to move the ignorance around, and find out which places it moves fastest and with the most fun attached.&lt;br /&gt;&lt;br /&gt;We call those places "strengths", and people who can move their ignorance quickly are "fast learners". "Experts" have done more shifting of their ignorance than others. "Gurus" are the ones who've managed to handle an exponentially increasing amount of ignorance, finding more of it in themselves than most people can ever handle. Some of them have found patterns for shifting the ignorance quickly. It's still there, though.&lt;br /&gt;&lt;br /&gt;I want to be a guru one day. Gurus are the best. They teach me all the new places of ignorance that I never knew were there, and open my mind up to just how much of the stuff there is. I can't imagine anything worse than running out of things to learn. Having lots of ignorance to play with is just lovely.&lt;br /&gt;&lt;br /&gt;Now, where did I put that Ruby tutorial?</description>
  <comments>http://sirenian.livejournal.com/45880.html</comments>
  <category>learning</category>
  <category>strengths</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/45637.html</guid>
  <pubDate>Wed, 05 Mar 2008 12:55:54 GMT</pubDate>
  <title>Do I always write a test?</title>
  <link>http://sirenian.livejournal.com/45637.html</link>
  <description>I've just been reading the debate between Bob Martin and Jim Coplien on InfoQ, centred around Bob's assertion that "nowadays it is irresponsible for a developer to ship a line of code he has not executed in a unit test."&lt;br /&gt;&lt;br /&gt;I have to confess... despite my desire for BDD, I don't always do automated tests for everything. The place I'm most likely to skip automated tests is when something shows up in a GUI.&lt;br /&gt;&lt;br /&gt;That might strike you as odd, if you know that BDD's outside-in starts from the GUI and works downwards. It's probably less odd if you also know that automated testing is no substitute for manual testing. Here are a couple of things for which I haven't written a test.&lt;br /&gt;&lt;br /&gt;From Hellbound, the Tetris game in JBehave's examples:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
public class AcceleratingHeartbeatBehaviour extends UsingMiniMock {{

    public void shouldBeatAfterElapsedTime() throws Exception {
        &amp;lt;Test code exists&amp;gt;
    }
    
    public void shouldBeatMoreQuicklyWithEachBeat() {
        // No way of ensuring this with automation. 
    }
    
    public void shouldStopAnyExistingTimerThreadsBeforeStarting() {
        // No way of ensuring this with automation. 
    }
    
    public void shouldMoveImmediatelyToNextWaitingPhaseWhenSkippingABeat() {
        // Nor this.
    }
    
    public void shouldNotBeatAfterBeingStopped() throws Exception {
        &amp;lt;There's some test code for this one too&amp;gt;    
    }
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It's not entirely true that there's no way of ensuring these things with automation (and the main drawback here was the time it took, which spoils the &amp;lt; 5 second regression test suite). One could extract out clock classes, etc. But then, you're sacrificing readability and ease of design - a single class is enough. Why would you do this, anyway? The only way of telling whether the timing of a game is fast enough to be challenging but slow enough to be feasible is to play it!&lt;br /&gt;&lt;br /&gt;It's much the same with this, from the same Game of Life and GameFrame class as the &lt;a href="http://sirenian.livejournal.com/45524.html"&gt;last post&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
public class GameFrameBehaviour extends Behaviour {

    @Test
    public void shouldHaveAButtonForTheNextGeneration() throws Exception {
        &amp;lt;See last post for this code&amp;gt;
    }
    
    @Test
    public void shouldCreateCellsInGameCorrespondingToMouseClicks() {
        // I'm not putting any examples here, because in reality the
        // only way to tell if this works is to test it manually!
    }

}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I tried writing an automated test to check that mouse-clicks corresponded to cells appearing in the grid. I got it wrong; the automated test passed but the cells were appearing in the wrong place. I made the same mistakes with Swing's coordinate system in both the test and the code. This time round I can't even be bothered; it's easier just to use it, check that I got it right, and never change the behaviour of the grid GUI again (at least, not without manual retesting).&lt;br /&gt;&lt;br /&gt;There are other places where I'll skip unit tests too - getters, mostly. I'll even skip automated system-level tests if there isn't an appropriate harness. I've done this in my own code; I've done this at client sites.&lt;br /&gt;&lt;br /&gt;Do I feel guilty or unprofessional?&lt;br /&gt;&lt;br /&gt;No.&lt;br /&gt;&lt;br /&gt;Does it stop me describing how the class behaves?&lt;br /&gt;&lt;br /&gt;No. I usually add empty methods to describe an aspect of behaviour that I don't want to test. At least they get read; they also remind me that I have a missing test, and should use careful inspection if I change the code.&lt;br /&gt;&lt;br /&gt;Does it mean that I can get away without testing it altogether?&lt;br /&gt;&lt;br /&gt;No. I have to test it manually, from the GUI, instead.&lt;br /&gt;&lt;br /&gt;But then, you're doing that anyway... aren't you? Because I think Bob would agree on one point with me: nowadays it is irresponsible for a developer to ship a line of code he has not &lt;i&gt;tested&lt;/i&gt;, and all your tests are worthless if it doesn't actually work.</description>
  <comments>http://sirenian.livejournal.com/45637.html</comments>
  <category>bdd</category>
  <category>skinning cats</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/45524.html</guid>
  <pubDate>Wed, 05 Mar 2008 09:30:26 GMT</pubDate>
  <title>Four mocks? One test? No problem!</title>
  <link>http://sirenian.livejournal.com/45524.html</link>
  <description>Last year, my colleague Ben introduced us to the joys of hand-rolling mocks. This allowed us to ignore interactions we weren't worried about, leading to cleaner tests.&lt;br /&gt;&lt;br /&gt;This year, I'm mocking again. I've mentioned it briefly before, but now that I've used &lt;a href="http://code.google.com/p/mockito"&gt;Mockito&lt;/a&gt; a bit more, I &lt;i&gt;really&lt;/i&gt; love it. Here's a quick summary to show why.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
public class GameBehaviour {
    
    @Test
    public void shouldApplyRulesToOriginalGridThenEachGeneratedGridInTurn() {
        // Given
        Rules rules = mock(Rules.class);
        Grid firstGrid = mock(Grid.class);
        Grid secondGrid = mock(Grid.class);
        Grid anyGrid = Grid.NULL;
        
        GridFactory factory = mock(GridFactory.class);
        stub(factory.createGrid(anyInt(), anyInt())).toReturn(firstGrid);
        
        stub(rules.applyTo(firstGrid)).toReturn(secondGrid);
        stub(rules.applyTo(secondGrid)).toReturn(anyGrid);
                
        // When
        Game game = new Game(5, 5, rules, factory);
        game.nextGeneration();
        game.nextGeneration();
        
        // Then
        verify(rules).applyTo(firstGrid);
        verify(rules).applyTo(secondGrid);
    }
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There are some quite complex factors in this Game of Life - infinite, bounded or wrapped grids, rules which could be Conway's or the High Life rules, etc. - hence the design pattern overkill. Here's something simpler:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
public class GameFrameBehaviour {

    @Test
    public void shouldHaveAButtonForTheNextGeneration() throws Exception {
        // Given
        WindowControl windowWrapper = new WindowControl("game.frame");
        Game game = mock(Game.class);
        new GameFrame(game);
        
        // When
        windowWrapper.clickButton("next.step");
        
        // Then
        verify(game).nextGeneration();
    }
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I leave it to you to work out what these look like with other mocking frameworks. You can look at &lt;a href="http://code.google.com/p/mockito/wiki/MockitoVSEasyMock"&gt;Szczepan's comparisons&lt;/a&gt; to get an idea.&lt;br /&gt;&lt;br /&gt;Thanks, Szczepan.</description>
  <comments>http://sirenian.livejournal.com/45524.html</comments>
  <category>mockito</category>
  <category>bdd</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/45267.html</guid>
  <pubDate>Mon, 03 Mar 2008 09:55:46 GMT</pubDate>
  <title>Your horoscope for March</title>
  <link>http://sirenian.livejournal.com/45267.html</link>
  <description>&lt;h3&gt;How people&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;God grant you the serenity to accept the things you cannot change, the courage to change the things you can and the fortune to have little need for either. Some things exist just to make your life easier. Hope you get yours soon.&lt;br /&gt;&lt;br /&gt;Your tool of the month is &lt;a href="http://www.apple.com/macbookpro/"&gt;the MacBook Pro&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Why people&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;It seemed a simple enough task, so you gave it to someone else to do! You thought that a few hints and tips would be enough to set them in the right direction - but now you come to look at it, you realise that hidden underneath the simplicity was a right can of worms, which they've happily opened up and tipped back onto your desk. Messy.&lt;br /&gt;&lt;br /&gt;Your word of the month is &lt;a href="http://dictionary.reference.com/search?r=2&amp;amp;q=lumbricide"&gt;lumbricide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Who people&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;We started with drums and beacon fires, moved on to mail and semaphore and eventually developed the radio. Now the internet provides the ultimate in communication. Pity the signal-to-noise ratio is so low! Still, with sites like &lt;a href="http://www.facebook.com"&gt;FaceBook&lt;/a&gt; and &lt;a href="http://www.myspace.com"&gt;MySpace&lt;/a&gt;, you too can ensure that the web is a better place for having you in it. If you get the chance, send me zombie blood.&lt;br /&gt;&lt;br /&gt;Your pub of the month is &lt;a href="http://www.asklaila.com/listing/Bangalore/M.G+Road/Styx+Pub/04GZnVwN/"&gt;Styx, Bangalore&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;When people&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;You know you're too busy when you get off the plane and get onto the phone; get off of the phone and get on with the job; get off to a good start and get on with the new guy. With all this getting on and getting off, it's hardly surprising you've forgotten something. If only you could remember what it was!&lt;br /&gt;&lt;br /&gt;Your quote of the month is:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Footfalls echo in the memory&lt;br /&gt;Down the passage which we did not take&lt;br /&gt;Towards the door we never opened&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/TS_Eliot" style="margin-left:10%"&gt;T.S. Eliot&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;i&gt;&lt;a href="http://sirenian.livejournal.com/38028.html"&gt;What's my sign?&lt;/a&gt;&lt;/i&gt;</description>
  <comments>http://sirenian.livejournal.com/45267.html</comments>
  <category>zodiac</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/44935.html</guid>
  <pubDate>Mon, 18 Feb 2008 09:53:34 GMT</pubDate>
  <title>BDD on Wikipedia</title>
  <link>http://sirenian.livejournal.com/44935.html</link>
  <description>I finally got around to updating / rewriting the &lt;a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development"&gt;BDD page&lt;/a&gt; on &lt;a href="http://wikipedia.org"&gt;Wikipedia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is either based on things Dan's said or written, or things others (including me) have said or written and which he's approved in my hearing as "official BDD". I may well have made mistakes. I haven't written any in-text citations as yet; will do that as and when I next have time (if no one else gets there first!)&lt;br /&gt;&lt;br /&gt;Now, when someone asks me what the difference is between BDD and TDD, I have somewhere to point to. Many thanks to the contributors who wrote the predecessor. BDD's come a long way since the article was first written, but your thoughts really helped me formulate mine.&lt;br /&gt;&lt;br /&gt;Go edit. :)</description>
  <comments>http://sirenian.livejournal.com/44935.html</comments>
  <category>bdd</category>
  <category>wikipedia</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/44708.html</guid>
  <pubDate>Fri, 08 Feb 2008 15:06:50 GMT</pubDate>
  <title>Introducing Tyburn</title>
  <link>http://sirenian.livejournal.com/44708.html</link>
  <description>When I first started working with &lt;a href="jbehave.org"&gt;JBehave&lt;/a&gt;, I wrote a Tetris game. I had trouble finding Swing harnesses that didn't depend on JUnit. So I wrote one.&lt;br /&gt;&lt;br /&gt;JBehave 2.0 won't include Swing support. The harness was completely independent of JBehave anyway. So, we decided that I should pull it out into its &lt;a href="http://code.google.com/p/tyburn"&gt;own project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;At the moment, it works by finding a named window and components. Here's an example of how to use it:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;WindowControl control = new WindowControl("my.named.frame");&lt;br /&gt;control.clickButton("a.button");&lt;br /&gt;control.enterText("a.textfield", "Text1");&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I've tried to make it fast, minimal and extensible, since everyone seems to want different things from their Swing harness. If you have a request for a feature, please let me know!&lt;br /&gt;&lt;br /&gt;A shout goes out to &lt;a href="http://monkeyisland.pl/"&gt;Szczepan&lt;/a&gt; for the gorgeous &lt;a href="http://code.google.com/p/mockito/"&gt;Mockito&lt;/a&gt;, which I used in the &lt;strike&gt;tests&lt;/strike&gt; examples. Finally, mocks that can do Given / When / Then, instead of Given / Expect / Finish recording / When / Then go back to expectations cos you've forgotten what you wanted your code to do in the first place.&lt;br /&gt;&lt;br /&gt;See lots of examples, together with Mockito beauty, &lt;a href="http://code.google.com/p/tyburn/source/browse/trunk/src/behaviour/org/lunivore/tyburn/WindowControlBehaviour.java?r=5"&gt;here&lt;/a&gt;.</description>
  <comments>http://sirenian.livejournal.com/44708.html</comments>
  <category>mockito</category>
  <category>outside-in</category>
  <category>bdd</category>
  <category>tyburn</category>
  <category>swing</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/44499.html</guid>
  <pubDate>Fri, 01 Feb 2008 04:25:55 GMT</pubDate>
  <title>Your Horoscope for February*</title>
  <link>http://sirenian.livejournal.com/44499.html</link>
  <description>&lt;h3&gt;How people&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Sometimes it's nice to get your head down without any distractions, but beware - are you cut off from the rest of the world? No one is stopping to wait for you. Get the most important things done now, and leave yourself plenty of time to play. Other gems are buried in the sandpit.&lt;br /&gt;&lt;br /&gt;Your tool of the month is &lt;a href="http://www.blacktree.com/"&gt;Quicksilver&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Why people&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;It's always strange when an alien to your planet turns out not only to speak your language, but to read your mind. Still, they're here for a reason. From higher up, they can see everything you can and more - is there something beyond your horizon that you need to know about?&lt;br /&gt;&lt;br /&gt;Your word of the month is &lt;a href="http://dictionary.reference.com/browse/maelstrom"&gt;Maelstrom&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Who people&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Remember all those people you haven't seen for a while? It's time to look them up and drag them out of hibernation. You may find it difficult to get in touch, but persevere - perhaps they're looking for you, too. When the storm hits, the best place to be is in the centre of everything.&lt;br /&gt;&lt;br /&gt;Your eatery of the month is &lt;a href="http://bangalore.burrp.com/establishment/view/113274923"&gt;Barbeque Nation, Bangalore&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;When people&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;The tree you've been tending for the past few years has finally borne fruit. Ironically this means it's time to leave your garden behind, but don't worry; others will learn how to tend it. Pack a few seeds, your favourite books and just go - the people you rely on won't be far behind.&lt;br /&gt;&lt;br /&gt;Your quote of the month is: &lt;a href="http://en.wikipedia.org/wiki/Logan_Pearsall_Smith"&gt;Hearts that are delicate and kind and tongues that are neither - these make the finest company in the world.&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;*&lt;i&gt;I stopped doing these because I didn't think so many people were interested. Turns out I have some fans in India, and some comments I hadn't read. Thank you! The Horoscope returns!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a href="http://sirenian.livejournal.com/38028.html"&gt;What's my sign?&lt;/a&gt;&lt;/i&gt;</description>
  <comments>http://sirenian.livejournal.com/44499.html</comments>
  <category>zodiac</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/44156.html</guid>
  <pubDate>Mon, 28 Jan 2008 12:08:01 GMT</pubDate>
  <title>Given, When, Then - the only way?</title>
  <link>http://sirenian.livejournal.com/44156.html</link>
  <description>Someone told me that out there, somewhere, are people who believe that "Given, When, Then" is the only way to analyse a story. I don't believe it's true. Sometimes there are more concise ways to get the same information. For example:&lt;br /&gt;&lt;br /&gt;"Refunded or replaced items should always be returned to stock, unless they're faulty."&lt;br /&gt;&lt;br /&gt;That's four separate scenarios, encapsulated quite well in a very short sentence!&lt;br /&gt;&lt;br /&gt;So why do we emphasise Given, When and Then in BDD?&lt;br /&gt;&lt;br /&gt;Well, we can describe the behaviour in a different way. However, when we'd like to know when we're done, we have to use a concrete example, whether it's automated or manually driven. The only way to know whether the above sentence holds true for our system - whether the behaviour is correct - is to actually run through all four scenarios. Until they all work, we're not done.&lt;br /&gt;&lt;br /&gt;So, perhaps you, the business representative or analyst, don't like using the language of contexts, events and outcomes. However, we devs use it all the time, as do QAs. However you get the information, and however you phrase it to us, the examples that you pass on to us define the scope of the story, the detail, and the end product.&lt;br /&gt;&lt;br /&gt;An automated example sets up some contexts, causes some events to occur, and checks for certain outcomes (and perhaps then uses the result as the basis for more events and outcomes).&lt;br /&gt;&lt;br /&gt;A manual test does this too.&lt;br /&gt;&lt;br /&gt;With automation, particularly, it seems that contexts, events and outcomes are frequently reused to create different scenarios. Phrasing things in a way which makes them explicit can sometimes help us to reuse code in our scenarios, making the regression test suite cleaner and easier to maintain. This makes it easy to create new examples for behaviour we haven't coded yet, which means we know more quickly when we're done, which means you get your system delivered faster.&lt;br /&gt;&lt;br /&gt;If we get the wrong Givens, Whens, or Thens, or we've missed a couple of contexts that might lead to different outcomes, then perhaps the system we produce might behave in ways that you didn't intend, if at all.&lt;br /&gt;&lt;br /&gt;You don't have to be pedantic about the language - it's OK to balance common sense with detailed explanations, and concentrate on the unexpected and on edge-cases - but if in doubt, you may find that using examples makes things a little clearer.&lt;br /&gt;&lt;br /&gt;You may also want to read through our examples when we're done. Just to check.</description>
  <comments>http://sirenian.livejournal.com/44156.html</comments>
  <category>scenario</category>
  <category>bdd</category>
  <category>example</category>
  <category>skinning cats</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/43994.html</guid>
  <pubDate>Thu, 17 Jan 2008 04:47:37 GMT</pubDate>
  <title>Find your own way to cook</title>
  <link>http://sirenian.livejournal.com/43994.html</link>
  <description>A mother was cooking a joint of meat for her family. She cut off a large slice from the side of the joint, then put both pieces into the gravy.&lt;br /&gt;&lt;br /&gt;"Why are you doing that?" her daughter asked.&lt;br /&gt;&lt;br /&gt;"It helps it cook properly. That's the way my mother always did it," the mother replied.&lt;br /&gt;&lt;br /&gt;"Why does it help?"&lt;br /&gt;&lt;br /&gt; "I don't know. Maybe I'll ask your grandmother next time I phone her."&lt;br /&gt;&lt;br /&gt;So the mother phoned the grandmother. "Why do you always cut a slice of meat from the side when you cook the joint?" she asked.&lt;br /&gt;&lt;br /&gt;"It helps it cook properly," said the grandmother.&lt;br /&gt;&lt;br /&gt;"But why?"&lt;br /&gt;&lt;br /&gt;"I don't know. It's just the way my mother taught me to do it. Maybe we should ask her why!"&lt;br /&gt;&lt;br /&gt;So the family went to see the elderly great-grandmother. "Why do we always cut a piece of meat from the side of the joint, before we put it in the sauce?" the mother asked.&lt;br /&gt;&lt;br /&gt;"You still do that?" the old lady laughed. "I love you, and love that you trust in what I do, but you should find your own way to cook. I did it because it was the only way it would fit in my pot!"&lt;br /&gt;&lt;br /&gt;&lt;p style="font-size:smaller"&gt;(My father told me this story when I was a child; apparently it appears in "Surely you're joking, Mr Feynman" by Richard Feynman.)&lt;/p&gt;</description>
  <comments>http://sirenian.livejournal.com/43994.html</comments>
  <category>habits</category>
  <category>parable</category>
  <category>unlearning</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/43644.html</guid>
  <pubDate>Thu, 13 Dec 2007 12:55:53 GMT</pubDate>
  <title>10 signs of work goodness - revisited</title>
  <link>http://sirenian.livejournal.com/43644.html</link>
  <description>You know work is good when:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Your smile is infectious, even on the tube.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Every day you find out something new...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;...and pass on something to someone else.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You wonder &lt;i&gt;how&lt;/i&gt; you're going to have fun, not &lt;i&gt;when&lt;/i&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No tunnel is so long that you can't see the light at the end...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;...and you're learning to climb hills instead of ploughing through them.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The team can reach agreement on anything except where to have lunch.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You come to work with questions, and leave with different questions.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Your friend asks you, "How was your day?" and really wants to know.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Sometimes you amaze yourself.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;I wrote these ten things down back in &lt;a href="http://sirenian.livejournal.com/30240.html"&gt;January last year&lt;/a&gt;. The client I was at was difficult, and I wasn't actually getting any of these things. It seemed like a positive way to express my frustration.&lt;br /&gt;&lt;br /&gt;A scant eight minutes after I wrote the post, I got a phone call telling me to pack my bags. I was &lt;a href="http://sirenian.livejournal.com/30602.html"&gt;going to Xian&lt;/a&gt;. I left the difficult client behind.&lt;br /&gt;&lt;br /&gt;Now, looking back at those ten things, it seems to me that despite the occasional off day, I have them. All of them. Better still, I've learnt how to keep them, even at difficult clients.&lt;br /&gt;&lt;br /&gt;That's why I'm revisiting this post. It's also why, after three years at the job, I'm still proud to be a Thoughtworker. You guys rock my world.</description>
  <comments>http://sirenian.livejournal.com/43644.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/43398.html</guid>
  <pubDate>Fri, 30 Nov 2007 15:51:52 GMT</pubDate>
  <title>A Mind of Its Own</title>
  <link>http://sirenian.livejournal.com/43398.html</link>
  <description>I'm reading the book "A Mind of Its Own", by Cordelia Fine. I sometimes find it hard to make headway with this kind of material and put it down after the first couple of chapters, but for whatever reason this one has gripped me.&lt;br /&gt;&lt;br /&gt;It's all about the strange tricks that the brain can play on itself, and the things that people do as a result. Particularly, we become blindsided to our own faults.&lt;br /&gt;&lt;br /&gt;Then I came across this perfect example, in &lt;a href="http://www.guardian.co.uk/environment/2007/nov/30/conservation.golf"&gt;an article&lt;/a&gt; about Donald Trump's plan to build a £1 million golf course being turned down by Aberdeen council, with the help of assorted committees, protesters and a fisherman:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-right:10%; margin-left:10%"&gt;&lt;quote&gt;Sorial defended accusations the Trump team had been &amp;quot;arrogant and patronising&amp;quot; in its approach. &amp;quot;There's a view we are arrogant. We are not arrogant. We set certain standards. It may be incomprehensible to smaller minds, but we have always set high standards. We presented them with a plan and hoped they could open their minds, but it was too much for them.&amp;quot;&lt;/quote&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I can't understand how anyone could misconstrue such grace and humility. Shocking. Chalk one up for the Aberdonians.</description>
  <comments>http://sirenian.livejournal.com/43398.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/43099.html</guid>
  <pubDate>Mon, 19 Nov 2007 14:40:28 GMT</pubDate>
  <title>Bug Driven Development: a danger of delivering the pretty GUIs first</title>
  <link>http://sirenian.livejournal.com/43099.html</link>
  <description>After &lt;a href="http://sirenian.livejournal.com/42871.html"&gt;my last post&lt;/a&gt;, Negin and I were quite pleased that we'd got as far as we had.&lt;br /&gt;&lt;br /&gt;So was our Business Analyst. "So, this story that was estimated at 3 days," she said. "Can I say it's only taken one?"&lt;br /&gt;&lt;br /&gt;"No! We're not done yet!" I protested.&lt;br /&gt;&lt;br /&gt;"Really? It &lt;i&gt;looked&lt;/i&gt; like you were almost done on Friday... what happened?"&lt;br /&gt;&lt;br /&gt;Oh, well. At least we know it &lt;i&gt;looks&lt;/i&gt; good.</description>
  <comments>http://sirenian.livejournal.com/43099.html</comments>
  <category>outside-in</category>
  <category>bdd</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/42871.html</guid>
  <pubDate>Fri, 16 Nov 2007 14:18:58 GMT</pubDate>
  <title>BDD: Bug Driven Development</title>
  <link>http://sirenian.livejournal.com/42871.html</link>
  <description>Today, Negin and I paired on a brand new piece of work.&lt;br /&gt;&lt;br /&gt;"We'll need to create this domain object," she said, "and a database table."&lt;br /&gt;&lt;br /&gt;"I don't want to do that," I said. "I'd rather fix the stuff that's broken."&lt;br /&gt;&lt;br /&gt;She looked puzzled. "What do you mean? We haven't written any code yet."&lt;br /&gt;&lt;br /&gt;"Well, we know that if you go to the URL, you should see the form. But when I go there I get a 404 error."&lt;br /&gt;&lt;br /&gt;"Well, yes. We haven't written any code yet."&lt;br /&gt;&lt;br /&gt;"So, it's broken. It doesn't work yet. We should fix that."&lt;br /&gt;&lt;br /&gt;So we wired up the container and knocked out a controller. We restarted the server and refreshed the URL. Spring told us we had left out a couple of things. We fixed those.&lt;br /&gt;&lt;br /&gt;Negin tapped something into the template and refreshed the URL again. "We have a page. It says HELLOOOOO! across the top. Now what?"&lt;br /&gt;&lt;br /&gt;"Well, we got rid of the 404 error. But the page doesn't look right."&lt;br /&gt;&lt;br /&gt;"Of course not. We haven't written the form yet."&lt;br /&gt;&lt;br /&gt;"We should fix that."&lt;br /&gt;&lt;br /&gt;We wrote the form. It didn't look right, so we added the styling. Our business analyst peered over our shoulders at what we were doing. "Looks like you're doing well. Why doesn't the drop-down have my data in?"&lt;br /&gt;&lt;br /&gt;Negin said, "You're right. We should fix that. This is fun!"&lt;br /&gt;&lt;br /&gt;"It is," I said. "Don't you just love that we get &lt;i&gt;paid&lt;/i&gt; for this?"</description>
  <comments>http://sirenian.livejournal.com/42871.html</comments>
  <category>outside-in</category>
  <category>bdd</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/42609.html</guid>
  <pubDate>Wed, 14 Nov 2007 10:56:56 GMT</pubDate>
  <title>Crazy like a fox.</title>
  <link>http://sirenian.livejournal.com/42609.html</link>
  <description>At my current client, everyone loves BDD, and everyone starts their tests with the word 'should', describing the behaviour of the associated class. I'm currently looking at this code:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public class PrimaryMixingIteratorTest extends EasyMockObjectTestBase{
    public void testShouldIterateLikeAFox() throws Exception {
        //...
    }
}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public class SecondaryMixingIteratorTest extends EasyMockObjectTestBase{
    public void testShouldIterateLikeABadger() throws Exception {
        //...
    }
}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once I've remembered how foxes and badgers iterate, this code might make more sense to me. Remind me to run that '&lt;i&gt;should&lt;/i&gt; is not a silver bullet' brown bag soon...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; If you tied a fox and a badger together and dropped them into the corner of a square pond, they'd make a splash. Imagine that splashes happened in squares instead of circles, and that the quarter of the concentric square formed by the fox and badger started at the top-right then went to the bottom-right then bottom-left. Now imagine that the fox shouts out which row the splash happens in, and the badger shouts out the columns.&lt;br /&gt;&lt;br /&gt;It's a way of combining the values of two infinitely-sized lists for an arbitrary number of combinations, without loading the lists into memory. Makes &lt;i&gt;so&lt;/i&gt; much more sense. Hold on, I'm getting a phone call from the RSPCA...</description>
  <comments>http://sirenian.livejournal.com/42609.html</comments>
  <category>bdd</category>
  <category>no silver bullet</category>
  <category>should</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/42417.html</guid>
  <pubDate>Tue, 13 Nov 2007 18:35:53 GMT</pubDate>
  <title>When do I refactor code?</title>
  <link>http://sirenian.livejournal.com/42417.html</link>
  <description>This question has kicked around a bit at Thoughtworks lately, sparked by this article:&lt;br /&gt;&lt;a href="http://blogs.construx.com/blogs/stevemcc/archive/2007/11/01/technical-debt-2.aspx"&gt;http://blogs.construx.com/blogs/stevemcc/archive/2007/11/01/technical-debt-2.aspx&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I thought I'd blog what I do, since a few bits of feedback lead me to believe I might be good at it.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;I don't refactor when...&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;...I spend five minutes on it and realise I'm not getting anywhere. I can always think about a more incremental approach and come back to it later.&lt;br /&gt;&lt;br /&gt;...I don't understand the benefit that the code provides. Sometimes it turns out that it doesn't provide any; I usually double-check that assumption before I delete the code. I might talk to the person who wrote the code to get their ideas.&lt;br /&gt;&lt;br /&gt;...I am technically ignorant. I might give it a go, especially if my pair knows how to help - it's an opportunity for me to learn something new - but I'll usually timebox it, and revert if I take too long.&lt;br /&gt;&lt;br /&gt;...I'm under pressure of time to get something done... but it'll be on my todo list, and I won't ask permission to finish it off properly once the pressure's less (and if you don't like that, give me another reason not to do it).&lt;br /&gt;&lt;br /&gt;...it's hard, and I don't need to. If it's someone else's code and no one's using it, reading it or changing it, the time saved won't pay itself back any time soon. If it's my code, it got that way because it's built on top of someone else's, and I need to sort that out first. This is how tech debt arises. If it turns out that it's holding us back, and it's time to pay for it, then I might volunteer to be part of that pair.&lt;br /&gt;&lt;br /&gt;...someone absolutely forbids me from doing it, notwithstanding the above. Anyone doing this is letting themselves in for my 'told you so' when it comes back to bite. If it's going to take less than an hour, you might as well let me go ahead and do it anyway - we'll spend half an hour arguing, and (even though I no longer sulk about it) I'm far less productive when you kill my spontenaiety.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;I do refactor when...&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;...it doesn't fall into one of the above. This includes easy refactorings that I don't &lt;i&gt;need&lt;/i&gt; to make. If I've seen it, something must have sent me there! That means the chances of someone else reading it are reasonable.&lt;br /&gt;&lt;br /&gt;I should mention that I've never been forbidden from refactoring anything. I've seen it happen once. Two pairs both tried to use the resulting mess. The refactoring would have taken one pair two hours; the mess caused each of two pairs a full day. There were definitely some 'told you so' moments, which is why I think the arguments are worthwhile.&lt;br /&gt;&lt;br /&gt;I have, in the past, made huge and significant mistakes while trying to refactor! This learning experience has helped me become better at it. Everyone should have that opportunity.&lt;br /&gt;&lt;br /&gt;Nowadays, I rarely ask permission. I justify my time by the time it's likely to save in the future - whether in related code, similar code or simply because people (including me) are learning from good habits. If I can't justify the time, I don't refactor!</description>
  <comments>http://sirenian.livejournal.com/42417.html</comments>
  <category>refactor</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/42084.html</guid>
  <pubDate>Tue, 13 Nov 2007 12:16:39 GMT</pubDate>
  <title>Lotus Notes: Making mail quotas meaningless</title>
  <link>http://sirenian.livejournal.com/42084.html</link>
  <description>There are at least three good reasons why we're using Lotus Notes, so mostly this post is just here to make me feel better. Thank you for sharing my pain; please comment with any solutions you've found for this problem.&lt;br /&gt;&lt;br /&gt;Today, I decided that I would delete all my old Lotus Notes mails that have been building up. This is partly because I've been getting warnings for the last three weeks about my quota, and partly because I remember my empty inbox with fondness.&lt;br /&gt;&lt;br /&gt;I click my Inbox on the Workspace.&lt;br /&gt;&lt;br /&gt;I start at the bottom, with my mail from way back in 2005. I can't just shift-select a ton of mails - I have to individually tick every single one. I have a preview window; of course, this means that if I accidentally click on something large, Lotus Notes carefully loads the attachment into memory before allowing me to delete it. (I have no idea why it does this, since it loads it all over again if you actually open the mail. And again if you decide to open the attachment.)&lt;br /&gt;&lt;br /&gt;I tick a screenful of mail, press delete, and get the "Type Mismatch" dialog:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lunivore.com/image/stupidity/LotusNotesTypeMismatch.jpg" alt="I don&amp;#39;t know whether Lotus Notes still thinks it&amp;#39;s being helpful here or not." /&gt;&lt;br /&gt;&lt;br /&gt;All the mails now have crosses against them, but haven't actually been deleted.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lunivore.com/image/stupidity/LotusNotesIdeaOfDeletingThings.jpg" alt="Why does Lotus Notes think this is helpful?" /&gt;&lt;br /&gt;&lt;br /&gt;I figure that maybe, just maybe, Lotus Notes will do this if I log out. So, I quit Lotus Notes. When I open it again, all the crosses have gone and the mails are still there.&lt;br /&gt;&lt;br /&gt;So, I try again. Tick. Tick. Tick. This time, I just close my inbox. Lotus notes kindly asks me, this time, if I want to delete 77 mails. Absolutely I do! But apparently, Lotus Notes exists in a different timezone to us mere mortals, and it's too early:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lunivore.com/image/stupidity/LotusNotes0241.jpg" alt="This is Lotus Notes being surreal." /&gt;&lt;br /&gt;&lt;br /&gt;Hm. My mails are still there, and the crosses have gone again.&lt;br /&gt;&lt;br /&gt;I have spent hours now trying to delete my mail. Of course, now I remember why they were building up in the first place...</description>
  <comments>http://sirenian.livejournal.com/42084.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/41910.html</guid>
  <pubDate>Wed, 31 Oct 2007 10:30:41 GMT</pubDate>
  <title>A quick OOPSLA write up</title>
  <link>http://sirenian.livejournal.com/41910.html</link>
  <description>Finally back at my own home.&lt;br /&gt;&lt;br /&gt;Highlights were:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Kathy_Sierra"&gt;Kathy Sierra&lt;/a&gt; turning up unexpectedly, and her &lt;a href="http://headrush.typepad.com/"&gt;"Creating Passionate Users"&lt;/a&gt; keynote&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://martinfowler.com/"&gt;Martin Fowler&lt;/a&gt; turning into a &lt;a href="http://youtube.com/watch?v=Z-1X3duvryA"&gt;werewolf&lt;/a&gt; at the panel reflecting on &lt;a href="http://info.computer.org/portal/site/computer/menuitem.eb7d70008ce52e4b0ef1bd108bcd45f3/index.jsp?&amp;amp;pName=computer_level1&amp;amp;path=computer/homepage/misc/Brooks&amp;amp;file=index.xml&amp;amp;xsl=article.xsl&amp;amp;;jsessionid=HyV8xMksnh88LgTTknvzR8TtzdW7tM5nbXWLcMBgvNWcdTzJpr3p!545993162"&gt; No Silver Bullet"&lt;/a&gt; (this is our Chief Scientist... did I ever say how much I love working for &lt;a href="http://www.thoughtworks.com"&gt;Thoughtworks&lt;/a&gt;?)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Discussions with &lt;a href="http://dannorth.net"&gt;Dan&lt;/a&gt; and &lt;a href="http://domainlanguage.com/about/ericevans.html"&gt;Eric Evans&lt;/a&gt; about the &lt;a href="http://en.wikipedia.org/wiki/Palm_Islands"&gt;history of dredging&lt;/a&gt;, and BDD playing with DDD&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Meeting many luminaries who are proof that weighty thoughts can coexist with (and even create?) a lightness of spirit&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Coming back to England with bags full of both.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;</description>
  <comments>http://sirenian.livejournal.com/41910.html</comments>
  <category>oopsla</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink="true">http://sirenian.livejournal.com/41561.html</guid>
  <pubDate>Tue, 30 Oct 2007 19:46:34 GMT</pubDate>
  <title>Lessons from the Goth Conga* line at Whitby</title>
  <link>http://sirenian.livejournal.com/41561.html</link>
  <description>You can be fast, or have control, but must sacrifice one for the other.&lt;br /&gt;How much of each you can have depends on your platforms.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: -2em;"&gt;(*Actual music was the Locomotion. No self-respecting goth would be seen dead dancing to the Conga.)&lt;/span&gt;</description>
  <comments>http://sirenian.livejournal.com/41561.html</comments>
  <lj:security>public</lj:security>
</item>
</channel>
</rss>
