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

<channel>
	<title>Chris Hedgate &#187; Uncategorized</title>
	<atom:link href="http://www.hedgate.net/articles/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hedgate.net</link>
	<description>Contextual Chameleon</description>
	<lastBuildDate>Sat, 19 Feb 2011 02:43:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Three facts about change that are often overlooked</title>
		<link>http://www.hedgate.net/articles/2011/02/19/three-facts-about-change-that-are-often-overlooked/</link>
		<comments>http://www.hedgate.net/articles/2011/02/19/three-facts-about-change-that-are-often-overlooked/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 02:43:49 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=409</guid>
		<description><![CDATA[You have this great idea for an improvement in your team/company/organization. &#8220;If only we would change from X to Y, then we would be so much better off.&#8221; You have seen the data for it, heard about it or even experienced it yourself. Of course everyone will follow you to a better future. Right? Unfortunately, [...]]]></description>
			<content:encoded><![CDATA[<p>You have this great idea for an improvement in your team/company/organization. <em>&#8220;If only we would change from X to Y, then we would be so much better off.&#8221;</em> You have seen the data for it, heard about it or even experienced it yourself. Of course everyone will follow you to a better future. Right?</p>
<p>Unfortunately, change is not that simple. Most people are hesitant to change, they create workarounds for problems they have and trying to make them change often fails. Resistance to change is not about politics or opposing views. Most of the attempts that try to change something and fails do so not because the change was bad, but because of the way the change process itself was managed. Here are three very important facts about change that are often overlooked, leading to almost certain failure in changing.</p>
<h3>1. Your vision is not their vision</h3>
<p>In the words of my friend <a href="http://jkarlsson.com/">Joakim Karlsson</a>, <em>change is a pull system</em>. It may be obvious to you that if your team or organization would just do this change, you would all be much more effective. But do not expect your coworkers/manager/friends (or whoever you want to change (with)) to think so. If you try to push your change on them you are almost certain to fail.</p>
<p>This does not mean that you should just sit back and wait of course. Instead you need to convince them that they need the change. But it is not enough to say that things will get better, or that this new technology is proven to be better. You have to put it in context for each specific individual or group you are trying to convince. What problems are they having today, and how will the future created by this change affect them specifically? The more specific you can be about describing both the current status quo, the change and most importantly the improved future from their perspective the more likely you are to get people interested in the change. And then you will not need to push the change on them, they will be requesting it to happen.</p>
<h3>2. It gets worse before it gets better</h3>
<p>So you managed to convince your boss to try your idea. He will be back in a week to follow up and see the effects of it. Or maybe you did not even try convincing anyone. After all, when the change is implemented who could possibly have any objection to it when things are already much better?</p>
<p style="text-align: center;"><a href="http://www.hedgate.net/wp-content/uploads/change1a.png"><img src="http://www.hedgate.net/wp-content/uploads/change1a.png" alt="The way we think about the effects of change (E=Effectivity, T=Time)" title="The way we think about the effects of change (E=Effectivity, T=Time)" width="265" height="158" class="size-full wp-image-421" /></a></p>
<p>Wrong! No matter how great your idea truly is, no matter how much improvement it means to your effectiveness, changing what you have now always hurts your effectiveness in the short run. People are used to doing things one way and it does not matter if that is an ineffective way of doing them, if they are forced to change they will do things worse for some time until they learn the new way and settle in with it.</p>
<p style="text-align: center;"><a href="http://www.hedgate.net/wp-content/uploads/change1b.png"><img src="http://www.hedgate.net/wp-content/uploads/change1b.png" alt="What really happens when things change" title="What really happens when things change" width="265" height="158" class="size-full wp-image-426" /></a></p>
<p>There is lots to say about this curve and how to help people through it, as well as how to work to shorten the time between the change and when you are back at the starting level. For now though we will just keep it at accepting and realizing the importance of this curve. Do not expect immediate gains from the change.</p>
<h3>3. It takes time to see the benefits</h3>
<p>Finally, you have managed to convince and get people interested in the change, and all of you have also understood that it will be a time of chaos before things get better. But the question is, when has it gotten better? Or more importantly, when can we start reaping the benefits of the change?</p>
<p style="text-align: center;"><a href="http://www.hedgate.net/wp-content/uploads/change2.png"><img src="http://www.hedgate.net/wp-content/uploads/change2.png" alt="Benefits of change" title="Benefits of change" width="266" height="160" class="aligncenter size-full wp-image-428" /></a></p>
<p>It is very easy to think that as soon as the period P1 is over it will all be ok. But you have to remember that during P1 you lost effectiveness. Many change efforts fail because they expect net gains at this stage. But net gains are not achieved until you go through the period P2. Instead of getting surprised by this, set your goals for the end of P2 and keep working to support the change efforts all the way.</p>
<hr />
<p>Keep these three facts in mind when you plan your change and improvement efforts and you will have a much better chance of succeeding with them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2011/02/19/three-facts-about-change-that-are-often-overlooked/feed/</wfw:commentRss>
		<slash:comments>216</slash:comments>
		</item>
		<item>
		<title>Retrospective tip: Let activities build upon each other</title>
		<link>http://www.hedgate.net/articles/2011/02/15/retrospective-tip-let-activities-build-upon-each-other/</link>
		<comments>http://www.hedgate.net/articles/2011/02/15/retrospective-tip-let-activities-build-upon-each-other/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 01:34:56 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=399</guid>
		<description><![CDATA[When planning a retrospective you as the facilitator need to come up with a set of activities that help the group in discussing and learning about whatever goal you have for that particular retrospective. If you follow a basic framework for planning your retrospectives, such as the one proposed by Diana Larsen and Esther Derby [...]]]></description>
			<content:encoded><![CDATA[<p>When planning a retrospective you as the facilitator need to come up with a set of activities that help the group in discussing and learning about whatever goal you have for that particular retrospective. If you follow a basic framework for planning your retrospectives, such as the one proposed by Diana Larsen and Esther Derby (Set the Stage, Gather Data, Generate Insights, Decide What to Do &#038; Close the Retrospective), this often turns into simply choosing an activity for each phase with no real connection between them.</p>
<p>For instance, you might choose to do a timeline to gather data, then a brainstorming activity to generate ideas for improvements and finally a dot-vote to decide what to do. While this can work just fine, I have found that when I am able to combine several activities so they build upon each other the result can be much better. Here is one example of how this can be achieved.</p>
<p><img src="http://www.hedgate.net/wp-content/uploads/retrospective-300x155.png" alt="Satisfaction Histogram and FRIM leading into Force-Field Analysis" title="Retrospective" width="300" height="155" class="size-medium wp-image-401" /></p>
<p>This week I facilitated a retrospective for the new development team that I have assembled at work. This was the first time that this team did a retrospective after working together for four weeks and I wanted them to start thinking about how satisfied they are with how things are working out. After getting started with an introduction to retrospectives and checking in we did a quick anonymous vote for how satisfied they were with work, in four dimensions. I chose two dimensions regarding the product increment they completed (Quality and Quantity of the increment) and two dimensions regarding how it was achieved (Teamwork and Support (-ing Environment)). Every one voted 1-5, I tallied the votes and then created a Satisfaction Histogram<sup>[1]</sup> on a flip chart.</p>
<p>After a quick discussion about the results I hung the histogram on the wall and we then moved on to a second activity for gathering data, Diana Larsen&#8217;s <a href="http://www.futureworksconsulting.com/blog/2007/04/27/frim-another-way-to-gather-data/">FRIM</a> which is one of my favorites for this. At this stage we did not talk more about the dimensions of satisfaction, they just wrote down good and bad things that happened during the four weeks and posted them on a grid according to frequency and impact. We finished with a good discussion of patterns and themes on the grid.</p>
<p>While the group was busy with the FRIM activity I prepared four flip charts for the next activity, doing a Force Field Analysis<sup>[1]</sup>. For each one of the dimensions I had written the name at the top and then divided the chart into two sides. On the left (negative side) were forces that was restraining the group&#8217;s satisfaction in that dimension of work, and on the right (positive side) were forces that was reinforcing it. Now I asked the group to move the post-it notes from the FRIM grid to these flip charts. They also ranked them (using both frequency and impact plus a bit of intuitive &#8220;gut feeling&#8221;) to show which forces were larger than others.</p>
<p>This set of activities is an example of how you can move back and forth between gathering data and generating insights, to really get as complete a picture as you can and drill into it to really understand it. When the group was done they had a good idea of which forces were the most important to focus on and we could move into the phase of coming up with actions to do during the next iteration.</p>
<p>One interesting insight that one of the participants made was that it was interesting to see that there were only positive post-it notes for the dimension that the group initially voted the highest satisfaction for. Their initial instinctive feelings turned out to be very similar to the much more detailed picture they created through multiple rounds of thinking and analyzing, which was pretty cool.</p>
<p><strong>Credits/references</strong><br />
[1] <a href="http://www.amazon.com/Agile-Retrospectives-Making-Teams-Great/dp/0977616649">Agile Retrospectives: Making Teams Great, Diana Larsen and Esther Derby</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2011/02/15/retrospective-tip-let-activities-build-upon-each-other/feed/</wfw:commentRss>
		<slash:comments>153</slash:comments>
		</item>
		<item>
		<title>Feedback exercise &#8211; showing the value of instant feedback</title>
		<link>http://www.hedgate.net/articles/2011/01/23/feedback-exercise-showing-the-value-of-instant-feedback/</link>
		<comments>http://www.hedgate.net/articles/2011/01/23/feedback-exercise-showing-the-value-of-instant-feedback/#comments</comments>
		<pubDate>Sun, 23 Jan 2011 03:42:46 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[creativity]]></category>
		<category><![CDATA[exercise]]></category>
		<category><![CDATA[experiential]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=374</guid>
		<description><![CDATA[Could you draw a copy of the image above without seeing it, acting only on someone&#8217;s description of it? What if the other person was only allowed to describe it in written text, and you are not allowed to talk to each other at all? That is the idea of an experiential exercise that I [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.hedgate.net/wp-content/uploads/feedback-shapes.png"><img src="http://www.hedgate.net/wp-content/uploads/feedback-shapes-300x225.png" alt="Sample shapes" title="shapes" width="300" height="225" class="aligncenter size-medium wp-image-379" /></a></p>
<p>Could you draw a copy of the image above without seeing it, acting only on someone&#8217;s description of it? What if the other person was only allowed to describe it in written text, and you are not allowed to talk to each other at all? That is the idea of an <a href="/articles/2008/12/05/notes-on-designing-experiential-meetings/">experiential exercise</a> that I like to include in classes and workshops when I want the participants to experience the importance of instant feedback.</p>
<h3>Basic setup</h3>
<p>Here is the way I usually use it these days. First, the participants form pairs. One will take the role of developer, the other will be the customer. I then tell them that they will be &#8220;developing&#8221; drawings, by copying an original drawing to a blank paper. The customer is the only one who will be allowed to see original drawing, and the developer is the only one who will be allowed to draw. I then inform them that we will run two rounds.</p>
<h3>Round 1</h3>
<p>In the first round the customer must create a specification for the developer, by describing the original drawing in writing. Only text, no symbols or drawings. The customer and developer are not allowed to talk to each other during the entire round.</p>
<p>After five minutes the requirements phase is finished and they move into the implementation phase, when the developer is allowed to start drawing (if they have received a specification of course). The customer is allowed to watch as the developer draws, and if they want to they can provide further instructions in writing throughout the implementation phase. I usually place the developers and customers in different rooms and instruct the customers that they are only allowed to write at their own &#8220;desks&#8221;.</p>
<p>After ten minutes the implementation phase is finished and I bring everyone together, standing with their pair colleague. Each customer shows their original drawing and the developer shows their produced copy, and we have a quick vote to decide which pair got the best result.</p>
<h3>Round 2</h3>
<p>I ask the pairs if they want to change roles for the second round, and then introduce the new rules. In this round the customer and developer will sit next to each other. The basic rules are the same, only the customer can see the original drawing and only the developer may draw (e.g. touch the pen), but this time they can communicate in any way they want. They can talk directly and the customer can even point to the paper. The full round lasts for ten minutes and there is no requirements phase, they can immediately start talking and drawing.</p>
<h3>Insights and learning points</h3>
<p>Apart from the obvious fact that the results were much better in round 2, with less time to complete them, there are also many other insights that can be made from this exercise. Depending on how you play it some of them might be more clear than others. Here are a few things that usually come up when we debrief the exercise (always debrief!).</p>
<ul>
<li><strong>Following made-up rules:</strong> We often find ourselves following &#8220;rules&#8221; that do not even exist, we made them up ourselves. Sometimes customers think they are not allowed to use measurement units (such as &#8220;3 centimeters wide&#8221;) to describe the drawing, even though no such rule is given.</li>
<li><strong>Creating a common language:</strong> In the pause between the two rounds the pair will often talk about their drawing and find common ways they have of describing something. For instance, some will call the solid blue circle in the drawing above a donut. This common &#8220;language&#8221; makes it easier to describe abstract things such as a drawing (or software).</li>
<li><strong>Iterating the drawing:</strong> This usually happens during the second round, where some pairs sometimes adopt a process of first quickly sketching out the basic layout of the shapes to have something to point to and discuss. They will then start on a new paper and make a better drawing, and possibly iterate like this multiple times.</li>
<li><strong>&#8220;This is just a simulation&#8221;:</strong> Very often this comes up in some way. One favorite of mine is when people say that they sit in different buildings so they have to communicate by writing to each other. Asking them if the exercise have changed their mind on the value of clearer communication and instant feedback is usually enough to get them started on planning how to make it work anyway.</li>
</ul>
<h3>Variations</h3>
<p>I usually run the exercise the way I have described above, as part of an introduction to agile methodologies, to show the difference between trying to communicate by written specifications versus sitting down together and working collaboratively. There are lots of ways it can be altered depending on what insights and learning you want the participants to get from it. Here are a few that I have tried and some that I thought about while writing this.</p>
<ul>
<li><strong>Improving through retrospectives:</strong> One of my favorite subjects is retrospectives, and variations of this exercise can help teach participants how to use them. For instance, run several shorter rounds and do a retrospective between each one, where the the pairs learn and find improvements to their process. You can choose to only work with written specifications for instance, and let the pairs use the retrospectives to discuss how the specs can be improved and a common language can be used in them.</li>
<li><strong>Include a messenger:</strong> In round 1 use a messenger (maybe call them Project Manager, or Business Analyst) who is responsible for delivering the customers written specifications to the developer and giving the customer feedback on the result. The customer is not allowed to move from his desk, so he never sees the work as it progresses and have to rely on the information from the messenger.</li>
<li><strong>Involvement of product owner in development:</strong> One of the worst anti-patterns I know is the product owner who takes part in the planning of an iteration and then disappears, until he then shows up at the demo and disqualifies the work the team has done during the iteration. Real product owners take part in the daily work of the team, and it is very simple to show this with a variation of this exercise.</li>
<li><strong>Information loss in multiple handoff situations:</strong> Let the customer describe the drawing (probably should be a simpler drawing in this case) to a business analyst, who describes it to an architect, who then describes it to a designer, who describes it to the developer (introduce as many levels as you wish) and see what results you get.</li>
</ul>
<p>When thinking about variations I think it is important to remember that an exercise should be as simple as possible for whatever learning it should support. Remove any element that does not directly support that learning point. If you have more ideas for variations of this exercise please post a comment. Thanks!</p>
<p>I have uploaded a <a href="http://www.slideshare.net/chrishedgate/feedback-exercise-showing-the-value-of-instant-feedback">presentation on Slideshare</a> that introduces the exercise and includes some sample drawings (basic shapes laid out in various ways) you can use.</p>
<p><small><br />
<strong>Credits</strong><br />
I got the original inspiration for this exercise from <a href="http://jamesshore.com/">James Shore</a> and his exercise called <a href="http://jamesshore.com/Presentations/OffingTheOffsiteCustomer.html">Offing the Off-Site Customer</a>.</p>
<p>Alistair Cockburn also has a somewhat similar exercise he calls <a href="http://alistair.cockburn.us/The+Draw-This-Drawing+Game">The Draw-This-Drawing Game</a> which is a bit more complex and used for more specific learning points.<br />
</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2011/01/23/feedback-exercise-showing-the-value-of-instant-feedback/feed/</wfw:commentRss>
		<slash:comments>235</slash:comments>
		</item>
		<item>
		<title>Duoblog: What is the secret of great presentations?</title>
		<link>http://www.hedgate.net/articles/2009/06/29/duoblog-what-is-the-secret-of-great-presentations/</link>
		<comments>http://www.hedgate.net/articles/2009/06/29/duoblog-what-is-the-secret-of-great-presentations/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 16:00:35 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[duoblog]]></category>
		<category><![CDATA[presentation]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=337</guid>
		<description><![CDATA[Scalability. Great presentations scale. Most importantly, a great presentation can always be scaled down. If you can deliver a great presentation in 45 minutes you should also be able to say the same thing in 10 minutes. Or in a 45 second elevator pitch for that matter. So, how do you create a presentation with [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.hedgate.net/wp-content/uploads/matryoshka_doll.jpg" alt="matryoshka_doll" title="matryoshka_doll" width="200" height="120" class="alignright size-full wp-image-352" />Scalability. Great presentations scale. Most importantly, a great presentation can always be scaled down. If you can deliver a great presentation in 45 minutes you should also be able to say the same thing in 10 minutes. Or in a 45 second elevator pitch for that matter. So, how do you create a presentation with that in mind? My advice is to start with the one thing that you want the audience to learn, then build on that.</p>
<hr/>
<p><em>This blog post is part of my <a href="http://www.hedgate.net/articles/2009/06/29/introducing-the-duoblog-series/">Duoblog Series</a>. For each topic I ask someone I know and respect as an expert on that topic to write a blog post with the same title as my post. We then post them at the same time without knowing what the other person wrote.</em></p>
<p><em>For advice on creating a great presentation I turn to <a href="http://www.claudioperrone.com/" title="Claudio Perrone's Monologues">Claudio Perrone</a>. When I first met Claudio two years ago he had just been accepted to speak at a conference, his first public speaking engagement. Claudio is an amazing learner and quickly studied everything from storytelling and moviescript writing to creating powerful visual presentations. I have been fortunate enough to see him present a couple of times so I know that he can really engage an audience with stunning visuals and a great story.</em></p>
<p><em>Read <a href="http://www.claudioperrone.com/blog/articles/2009/06/29/duoblog-what-is-the-secret-of-a-great-presentation">Claudio Perrone&#8217;s answer to &#8220;What is the secret of great presentations&#8221;</a> on his blog.</em></p>
<hr/>
<h3>So much to say, so little time</h3>
<p>Picture this: You have been given a chance to present your company&#8217;s new product in a 45 min presentation. You want to create a great presentation to make people really enthusiastic about it. So, you fire up Powerpoint and start making bullet points for everything fantastic you can say about your product. The more great things you mention, the better people will feel about it, right?</p>
<p>Unfortunately, this seems to be what a lot of presentations are about. The speaker tries to mention as many things as possible in the time they have available. Each slide has so many bullets that she does not even remember to mention all of them. When time runs out she jumps to the final slide to wrap things up, while mumbling that there were more interesting things to say if only there had been more time. The audience remembers a fraction of what was said, and probably have a hard time summarizing it.</p>
<p>I believe that this happens when the speaker starts by considering how much time is available for the presentation and then works to fill that time with interesting stuff, rather than the other way round.</p>
<h3>Creating a great presentation</h3>
<p>Start by defining what you would say if you only had a short moment to say it, no matter how much time you actually have for your presentation. There is probably a specific reason why you are giving this presentation. Whether you are talking about a new technology or an idea you have, there is something about it that you think is important enough that you want to tell others about it. This is the core message you should deliver, and it should take no longer than 45 seconds to deliver it. If you can make people more enthusiastic and wanting to hear more about the topic then you know you have succeeded, and you are ready to add more things to the presentation.</p>
<p>If you have more time available, think about how you can make that message clearer and more powerful. Resist the temptation to add another core message to the presentation. Instead add some supporting ideas that give some more detail, still with the core message in focus. To avoid adding too much consider what you would say if you had 10 minutes to present your idea. If you have even more time then add another level of detail, this time giving further support for the ideas introduced in the previous level. In this way the presentation scales up, and everything you say is still related to the one central idea you want people to learn from your presentation.</p>
<h3>A powerful message that people will remember</h3>
<p>Now that you have taken a different approach to creating your presentation you will need to think about how to frame the core message so that the audience will understand and remember it.</p>
<p>Put yourself in the shoes of your audience and ask &#8220;What&#8217;s in it for me?&#8221;. If you do not give people a reason to remember it, why would they? Put your message into a context that the audience can relate to. Describe a situation or problem that they will recognize from their own life, and then present your idea and how it solves or relates to that problem.</p>
<p>Introduce the core message very early in the presentation, right after setting up the context it should be delivered in. Also repeat it throughout the presentation. Specifically make sure that you end with the core message again, since people generally remember best what they learn at the start and end of a learning session.</p>
<p>Finally, do not be afraid to use Powerpoint or other visual aid. People favor different learning modes (auditory, visual and kinesthetic), and multi-sensory learning is a powerful memory aid. Seeing keywords in written form, accompanied by powerful images, can help your audience remember better. The important thing is to avoid confusing presentation with documentation. A bullet list with some key points is a great aid when later reviewing something, but that does not mean it has to be a part of the actual presentation. Instead provide a separate file for documentation.</p>
<h3>Scale your presentation up from the one thing people should learn</h3>
<p>In summary, creating a great presentation starts with a clear and concise core message that the audience can relate to. The presentation is then scaled up level by level to add more detail, all the time repeating that core message. If you feel the time is to short, make it shorter.</p>
<p><span style="text-align: center"><img src="http://www.hedgate.net/wp-content/uploads/matryoshka_revisited.jpg" alt="matryoshka_revisited" title="matryoshka_revisited" width="300" height="225" class="aligncenter size-full wp-image-357" /></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2009/06/29/duoblog-what-is-the-secret-of-great-presentations/feed/</wfw:commentRss>
		<slash:comments>220</slash:comments>
		</item>
		<item>
		<title>Introducing the Duoblog Series</title>
		<link>http://www.hedgate.net/articles/2009/06/29/introducing-the-duoblog-series/</link>
		<comments>http://www.hedgate.net/articles/2009/06/29/introducing-the-duoblog-series/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 15:58:07 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[duoblog]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=332</guid>
		<description><![CDATA[When thinking about how to get inspiration for blogging I came up with an idea I have named Duoblogging. The concept is simple. I choose a topic that I want to blog about. Next, I contact someone I know who I respect as an expert on that topic, and ask that person to simultaneously write [...]]]></description>
			<content:encoded><![CDATA[<p>When thinking about how to get inspiration for blogging I came up with an idea I have named Duoblogging. The concept is simple. I choose a topic that I want to blog about. Next, I contact someone I know who I respect as an expert on that topic, and ask that person to simultaneously write a blog post on the same topic. We decide together on a title we will both use for our posts, but other than that we do not know what the other person writes. We then both publish our blog posts at the same time, linking to each other. The idea is basically that one plus one is greater than two. By reading both posts readers will hopefully be able to infer even more than what is said in the posts.</p>
<p>I will be updating this post with links to each duoblog post as they are written in the future. Stay tuned!</p>
<h3>Duoblog posts</h3>
<ul>
<li>2009-06-29: <a href="http://www.hedgate.net/articles/2009/06/29/duoblog-what-is-the-secret-of-great-presentations">What is the secret of great presentations?</a>, with <a href="http://www.claudioperrone.com/blog/articles/2009/06/29/duoblog-what-is-the-secret-of-a-great-presentation">Claudio Perrone</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2009/06/29/introducing-the-duoblog-series/feed/</wfw:commentRss>
		<slash:comments>234</slash:comments>
		</item>
		<item>
		<title>Pairing should be the norm</title>
		<link>http://www.hedgate.net/articles/2009/06/11/pairing-should-be-the-norm/</link>
		<comments>http://www.hedgate.net/articles/2009/06/11/pairing-should-be-the-norm/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 22:21:18 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=321</guid>
		<description><![CDATA[I recently participated in a discussion regarding pair programming. There were not really anyone against pair programming in general, so the discussion was mostly about what situations or types of tasks are good for pair programming. What always bothers me with this type of discussion is that it seems like most people consider pair programming [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.hedgate.net/wp-content/uploads/1132479_maine_coons_kittens.jpg" alt="kittens" title="kittens" width="225" height="175" class="alignright size-full wp-image-325" />I recently participated in a discussion regarding pair programming. There were not really anyone against pair programming in general, so the discussion was mostly about what situations or types of tasks are good for pair programming. What always bothers me with this type of discussion is that it seems like most people consider pair programming to be something we decide to do because it fits a specific situation. In my opinion it should be the other way around. For any given situation <strong>we might decide not to pair program</strong> because of some circumstance, but that should be <strong>a conscious decision to disregard our normal standard of always working in pairs</strong>.</p>
<p>The problem with considering pair programming as something we decide to do in some situations, as opposed to deciding not to do it in some situations, is that it is too easy to stick with the norm by not making that decision. &#8220;<em>This task is too simple, that task is too complex and requires some serious thinking, I do not feel like pairing today</em>&#8221; are all easy excuses to use when you do not have to answer why. A conscious decision of disregarding a work standard requires much more than &#8220;not feeling like it today&#8221;.</p>
<p>When I propose that pair programming should be the norm people often react by listing situations where it would be wrong and wasteful (according to them at least) or by identifying problems with working with someone else all the time (<em>&#8220;what if someone smells bad?&#8221;</em>), almost regressing to an anti-pairing opinion. I think this is because this concept is so foreign to what we have been taught for so long, and that most pro-pairing people have actually not tried pairing as the standard way of working like I propose. To this day I have never met anyone who have actually tried working this way for at least a month but would like to work any other way.</p>
<p>For a great story of someone who did try real pair programming I really recommend Rod Hilton&#8217;s post <a href="http://www.nomachetejuggling.com/2009/02/21/i-love-pair-programming/">I Love Pair Programming</a>. I&#8217;ll end with a quote from that post:</p>
<blockquote><p>I see pairing work so well every day that I consider my career prior to my current job to have consisted mostly of wasting time.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2009/06/11/pairing-should-be-the-norm/feed/</wfw:commentRss>
		<slash:comments>223</slash:comments>
		</item>
		<item>
		<title>My code is better than your code</title>
		<link>http://www.hedgate.net/articles/2009/05/12/my-code-is-better-than-your-code/</link>
		<comments>http://www.hedgate.net/articles/2009/05/12/my-code-is-better-than-your-code/#comments</comments>
		<pubDate>Tue, 12 May 2009 21:20:00 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=273</guid>
		<description><![CDATA[Together with Marcus, I recently designed and led a workshop on refactoring, unit testing and other techniques for producing good code. To start the day off we asked the participants to list some characteristics of good and bad code. After getting most of the usual suspects on the list, one participant shouted out a new [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.hedgate.net/wp-content/uploads/goodbadcode-300x269.png" alt="goodbadcode" title="goodbadcode" width="210" height="188" class="alignright size-medium wp-image-292" />Together with <a href="http://mawi.org/">Marcus</a>, I recently designed and led a workshop on refactoring, unit testing and other techniques for producing good code. To start the day off we asked the participants to list some characteristics of good and bad code. After getting most of the usual suspects on the list, one participant shouted out a new one, which should be pretty obvious. On the good code side is my code, on the bad code side is your code. Everyone had a laugh, but the fact is this is probably true if you ask most people about code.</p>
<p>As I said, it should be quite obvious that most people consider their own code to be better than someone else&#8217;s code, but I think we can make some profound realizations from looking into this more closely. There are two questions that are important to think about here. First, what is the effect of this issue? Second, how do we use this knowledge when working with a development team to help them produce better code?</p>
<p><strong>An escalating mess</strong><br />
If I encounter some bad code, I will try and make it better. Since I believe my code to be good code, I will of course try and change the bad code to become more like my code. So, the code is better and everyone wins, right? Well, what about the other guy? He sees my code, and since from his perspective his code is better than mine, he will of course try and change it so it becomes more like his code. And round and round it goes. Each of us are trying to make things better, but together we are actually producing an ever escalating mess.</p>
<p><img src="http://www.hedgate.net/wp-content/uploads/mycodebetter-300x212.jpg" alt="mycodebetter" title="mycodebetter" width="300" height="212" class="size-medium wp-image-301" /></p>
<p>So, the important question then is how can we help developers realize that their good code might not be the best for the team as a whole? My bet is on communication. Using practices of communication and reflection between the developers in a team, we can create a common understanding of what good code means to us, and break the escalation.</p>
<p><strong>Talk about code</strong><br />
Any time spent away from programming, instead talking about code and coding, is time well spent in a development team. If we want to get a common understanding of what good code is, then we need to have some formal structures in place to insure that this talking about code happens. Do you use pair-programming as the default mode of working? Do you do code reviews, where everyone on the team sits down and talks about some piece of code to learn from each other about how it could be improved? Do you collectively break down user stories (or other requirements) into tasks, using CRC design and similar techniques for exploring what a good design would be? Are you running a study circle?</p>
<p>What techniques and practices does your team use to make sure that you talk about code enough to have a common understanding of what good code means to you?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2009/05/12/my-code-is-better-than-your-code/feed/</wfw:commentRss>
		<slash:comments>239</slash:comments>
		</item>
		<item>
		<title>Team anti-pattern: The Helpful Teacher</title>
		<link>http://www.hedgate.net/articles/2009/05/03/team-anti-pattern-the-helpful-teacher/</link>
		<comments>http://www.hedgate.net/articles/2009/05/03/team-anti-pattern-the-helpful-teacher/#comments</comments>
		<pubDate>Sun, 03 May 2009 15:12:26 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=274</guid>
		<description><![CDATA[Note: This post describes an anti-pattern that I have observed with software development teams. I wrote it as a contribution to Ola Ellnestam&#8217;s under-development book on Software Development Team Anti-Patterns. I recommend taking a look at Ola&#8217;s book for more anti-patterns. I like the short and concise definition of anti-pattern that Ola use in the [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Note:</strong> This post describes an anti-pattern that I have observed with software development teams. I wrote it as a contribution to Ola Ellnestam&#8217;s under-development book on <a href="http://ellnestam.wordpress.com/2009/03/31/software-development-team-anti-patterns/">Software Development Team Anti-Patterns</a>. I recommend taking a look at Ola&#8217;s book for more anti-patterns. I like the short and concise definition of anti-pattern that Ola use in the book, taken from Wikipedia:</p>
<blockquote><p>An anti pattern is a repeated pattern of actions, a process or structure that initially appears to be beneficial</p></blockquote>
<h2>The Helpful Teacher</h2>
<p><strong>Introduction</strong><br />
<em>&#8220;If we would only use test-driven development, our design would be better.&#8221;</em><br />
As the self-designated technical leader of your team, you are constantly trying to help your colleagues understand and use good practices for writing high quality code. Even so, the code base is a mess and it is not getting any better. You have tried everything, from buying them books (with your own pocket money!) to showing them your own great code during a monthly meeting. The best you have managed is to convince some of them to try, but after a short while they always give up while telling you that it does not work. You are back to square one, or worse since now there are people saying that the practices you are promoting does not even work!</p>
<p><strong>Description</strong><br />
Studies in psychology* have shown that if we ask a person about their ability and competence in some skill, most people would estimate themselves as ranking above the average. (For an example, try asking people about their driving skills.) If we ask a group of people to estimate their own competence relative to the rest of the group, again most people consider themselves to be among the &#8220;better part&#8221; of the group. In fact, as the above referenced study shows, even the most unskilled people estimate themselves above average, because coupled to the lack of competence is a lack of awareness and understanding of that skill.</p>
<p>To be able to teach someone to use a new skill, they must at least see some need for it. Otherwise, from their perspective, you are only trying to push something not needed on them. Since they are unaware of the problem you are trying to solve, and therefore cannot distinguish your proposed solution from their defunct practices, all of your teaching goes in through one ear and directly out the other. <em>&#8220;We are practicing test-driven development. We write tests in a Word document and run them manually before release.&#8221;</em></p>
<p><strong>Refactored Solution</strong><br />
Before you can teach someone a new skill they must become aware of the need for the skill and their own deficiencies in that area. In other words, if you want to promote good technical practices for writing quality code in your team, you must first talk about the need for high code quality. The team needs to have a common understanding of what code quality means to them, otherwise everyone will just think that they are writing quality code and they do not need to learn new practices for improving on it.</p>
<p>Here are a couple of things you can try with your team to increase awareness on the value of high code quality, and to create a common understanding of what it means to your team. The thing in common between them is that they all encourage reflection and discussion.</p>
<ul>
<li>Pair-programming<br/><br />
The mother of all knowledge-sharing techniques. If you want to spread an idea to your colleagues you should never sit alone and program. No matter how nice code you write no one is going to notice it, and the practices you follow to achieve it will be completely invisible to the others. Try and spend as much of your time as possible working together with someone else. Do not push for all the practices you would like everyone to use, but use the opportunity to show your partner what you can do and the great results that follow.</li>
<p><br/></p>
<li>Code Reviews<br/><br />
Lots of organizations use code reviews as a way to achieve higher code quality. However, in my experience they are used in a command-and-control way, where you as the developer submit your code for review to the mighty architect, who then returns it with a number of things for you to fix. While some bugs and other problems can be avoided this way (depending on how much time the reviewer has to look into the code), it is not an efficient way of promoting high code quality in a team.</p>
<p>Instead, schedule a regular meeting where the entire team meets to review and discuss some piece of code from your project. As an alternative you can pick some open source project and review code from there. That way no one in the room is criticized, and it is easier to have open discussions about issues in the code sample. Rotate the role of selecting the code to be reviewed, make sure everyone has the code in advance to review ahead of the meeting, and then spend an hour or two discussing it together over coffee and a snack. If you want to you can follow up by actually implementing the improvements discussed in the meeting.</li>
<li>Coding Guidelines<br/><br />
Again, most teams have a coding guideline that prescribes what is good code. They can contain things such as naming guidelines, where to put the curly braces and how many spaces the indentation should use. Sadly though, these are documents written a long time ago, by someone who is not part of the team or sometimes even no longer in the organization. As can be expected, they are not meticulously followed and it is not uncommon for people to be completely unaware of their existence.</p>
<p>Creating a coding guideline for a team should be a collaborative activity for that team. Gather everyone once a month, discuss what people think is important when writing code and find out what everyone will agree to do. Write this down, preferably on large flip-charts posted in the team room. After a month, meet again and continue the discussion. It is not really the results that are the most important, the discussions are where awareness and understanding is spread throughout the team.</li>
</ul>
<p>If you can create awareness on the need for high code quality you will not need to teach your colleagues how to do it. They will already want to learn, and all you have to do is answer their questions. (Not quite, but lets not get into that here.)</p>
<hr/>
* See for instance &#8220;<a href="http://www.apa.org/journals/features/psp7761121.pdf">Unskilled and Unaware of It: How Difficulties in Recognizing One&#8217;s Own Incompetence Lead to Inflated Self Assessments</a> (Kruger &#038; Dunning, 1999)&#8221; for more information.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2009/05/03/team-anti-pattern-the-helpful-teacher/feed/</wfw:commentRss>
		<slash:comments>162</slash:comments>
		</item>
		<item>
		<title>New beginnings</title>
		<link>http://www.hedgate.net/articles/2009/04/22/new-beginnings/</link>
		<comments>http://www.hedgate.net/articles/2009/04/22/new-beginnings/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 11:55:05 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=251</guid>
		<description><![CDATA[Blueplane at the AYE 2008 conference &#160; Things are changing. We are closing down Blueplane after two fun and interesting years. I have had a great time and learned a lot and I am sure my colleagues would say the same (here is what Andrés and Joakim say). Now I am looking forward to a [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.hedgate.net/wp-content/uploads/419891077_img_2614.jpg" alt="blueplane" title="blueplane" width="480" height="320" class="aligncenter size-full wp-image-252" /></p>
<div style="text-align: center"><i>Blueplane at the AYE 2008 conference</i></div>
<p>&nbsp;</p>
<p>Things are changing. We are closing down Blueplane after two fun and interesting years. I have had a great time and learned a lot and I am sure my colleagues would say the same (here is what <a href="http://www.taylor.se/blog/2009/04/22/this-is-it/">Andrés</a> and <a href="http://jkarlsson.com/blog/2009/04/22/new-new-beginnings/">Joakim</a> say). Now I am looking forward to a new beginning, although I do not know where right now. If you have an idea or suggestion, please let me know. I&#8217;d love to talk.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2009/04/22/new-beginnings/feed/</wfw:commentRss>
		<slash:comments>185</slash:comments>
		</item>
		<item>
		<title>Retrospective Exercise: Doodle Checkin</title>
		<link>http://www.hedgate.net/articles/2009/04/16/retrospective-exercise-doodle-checkin/</link>
		<comments>http://www.hedgate.net/articles/2009/04/16/retrospective-exercise-doodle-checkin/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 22:10:46 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[creativity]]></category>
		<category><![CDATA[facilitation]]></category>
		<category><![CDATA[retrospectives]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=234</guid>
		<description><![CDATA[I always start retrospectives, in fact more or less any meeting, by having the participants check in. After introducing the retrospective and describing its purpose, I let each participant in a round-robin fashion answer some question I ask. By having each participant speak in turn, the tone is set to show that during this meeting [...]]]></description>
			<content:encoded><![CDATA[<p>I always start retrospectives, in fact more or less any meeting, by having the participants check in. After introducing the retrospective and describing its purpose, I let each participant in a round-robin fashion answer some question I ask. By having each participant speak in turn, the tone is set to show that during this meeting everyone is allowed and encouraged to be an equal participant. If we instead would just ask if someone wants to say something, those who are unsure, shy or quiet would probably not say anything and would be more keen on staying in that mode for the entire meeting.</p>
<p><img src="http://www.hedgate.net/wp-content/uploads/doodle.jpg" alt="doodle" title="doodle" width="280" height="280" class="alignleft size-full wp-image-239" />The simplest way of doing this is to simply ask each participant to say something, for instance describe the past iteration in just one word. This activity, and some variations of it, is described as the Checkin activity in <a href="http://www.pragprog.com/titles/dlret/agile-retrospectives">Agile Retrospectives</a>, by <a href="http://www.estherderby.com/">Esther Derby</a> and <a href="http://www.futureworksconsulting.com/">Diana Larsen</a>.</p>
<p>However, if the group are becoming more used to participating in retrospectives, this activity can feel a little boring if used every time. This is a perfect time to spice it up with some more creativity from the participants. By having people draw something and then describe why the drew that specific picture, not only do we get a more rich picture (no pun intended) of their mood and feelings, but it also starts the creative process in everyone&#8217;s head.</p>
<p><strong>Purpose</strong><br />
Invite participants to be active participants of the retrospective, and help them to get in a creative thinking state. Share the mood and thoughts people have with the rest of the group, including the retrospective leader.</p>
<p><strong>Description</strong><br />
The retrospective leader asks participants to think about how they would describe the past iteration. Each person then draws a simple picture to symbolize their answer. Finally, in a round-robin fashion, everyone shows their drawing and describes what it shows.</p>
<p><strong>Time needed</strong><br />
Ten to twenty minutes.</p>
<p><strong>Materials needed</strong><br />
I recommend that you supply each participant with a <a href="http://www.amazon.com/Ohio-Pocket-Magna-Doodle-OHA67000/dp/B0007KN7P8/ref=pd_sbs_t_13">magnetic drawing board</a> (or even <a href="http://www.fisher-price.com/us/products/product.asp?id=28861">Doodle Pro</a> for more size). A simple piece of paper and a pen could of course also work, but see the Motivation section below.</p>
<p><strong>Steps</strong></p>
<ul>
<li>Ask the participants a question. You could ask them about their perceptions of the past iteration, or just their current feelings. Depending on the situation, you might want to hear about their feelings of this retrospective or just the work that was done.</li>
<li>Tell everyone to draw a picture that symbolize their answer.</li>
<li>When they are done (or time is up), ask them in turn to describe their picture to the rest of the group. Some will just say what it shows, others might describe why they drew that specific picture.</li>
<li>Listen carefully to signals indicating a safety concern. If necessary, follow up with an activity to create more safety for the retrospective.</li>
</ul>
<p><strong>Motivation</strong><br />
In <a href="http://www.pragprog.com/titles/ahptl/pragmatic-thinking-and-learning">Pragmatic Thinking &#038; Learning</a>, <a href="http://blog.toolshed.com/">Andy Hunt</a> tells us to &#8220;add sensory experience to engage more parts of the brain&#8221; in problem solving and creativity. He goes on to write that &#8220;when you involve an addition input mode, you are activating more areas of the brain &#8211; you&#8217;re bringing more processing power online [...]&#8220;. So by drawing our thoughts and feelings, instead of just speaking them, we are thinking more effectively on this &#8216;problem&#8217;, and also setting our brains up for creative work.</p>
<p>And of course, a picture says more than a thousand words! In my own experience, people who can seem very shy and quiet often draw very descriptive pictures, and are normally quite happy to talk about them.</p>
<p>The question of using simple pen and paper or something like a magnetic drawing board comes down to the purpose of the activity, and the specific situation you are in. The ease with which you can erase a drawing board can create a sense of safety. &#8220;It does not matter if you cannot draw very well, it is just a doodle that will be gone in a minute.&#8221; The playful nature of it, a children&#8217;s toy, also helps in this regard.</p>
<p>On the other hand, you might want to use the drawings later in the retrospective for some other activity, or even bring them back to the team room, in which case paper trumps.</p>
<p><strong>Variants</strong><br />
Two specific variations of this that I know of are the Project Weather activity (I will talk about this in an upcoming post) and my friend <a href="http://sidpiraya.wordpress.com/">Michael</a>&#8216;s Car Instrument Board activity (which I will let him write up a description for himself).</p>
<p><strong>Creativity++</strong><br />
<strong>Alt. 1:</strong> To really get the creative thoughts going, have the participants pair up to create a drawing together two-and-two. Tell each pair to take turns adding something to the drawing. You can start them off by giving them a subject to draw, such as an animal symbolizing the past iteration. The other person then gets to add something to the drawing to change it, for instance another animal trying to eat the first. The first person &#8216;defends&#8217; by adding something more to the drawing, and on it goes. After discussing their thoughts and the drawing, the pair then presents it to the rest of the group.</p>
<p><strong>Alt. 2:</strong> If you only have one drawing board, and preferably a large one, start by letting the first participant draw something (or do it yourself). The board is then passed to the next person who is not allowed to erase it, but must add to the picture. Everyone gets a turn to add to the complete picture!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2009/04/16/retrospective-exercise-doodle-checkin/feed/</wfw:commentRss>
		<slash:comments>213</slash:comments>
		</item>
		<item>
		<title>From Good To Great Developer &#8211; downloads and resources</title>
		<link>http://www.hedgate.net/articles/2009/03/26/from-good-to-great-developer-downloads-and-resources/</link>
		<comments>http://www.hedgate.net/articles/2009/03/26/from-good-to-great-developer-downloads-and-resources/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 11:56:13 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=221</guid>
		<description><![CDATA[I have now finished my little tour of presenting &#8220;From Good To Great Developer&#8221; at various Swedish conferences. I want to say a big &#8220;Thank you!&#8221; to everyone who joined me at any of those occasions. As promised, you can download the presentation and code from my web site on the resource page for the [...]]]></description>
			<content:encoded><![CDATA[<p>I have now finished my little tour of presenting &#8220;From Good To Great Developer&#8221; at various Swedish conferences. I want to say a big &#8220;Thank you!&#8221; to everyone who joined me at any of those occasions. As promised, you can download the presentation and code from my web site on the <a href="http://www.hedgate.net/talks/from-good-to-great-developer-resources/">resource page for the talk</a>, where there are also links to various resources mentioned in the talk. For anyone who missed it or want to spread the word to your colleagues, I would be more than happy to come to your company for a session.</p>
<p>Finally, I also want to thank my friend <a href="http://emmerfors.freehostia.com/">Erik Emmerfors</a> for drawing the great comic strip describing the story of the incompetent bank robber. For more information on what this story has to do with my talk, see the summary flyer on the resources page.</p>
<p><img src="http://www.hedgate.net/wp-content/uploads/fromgoodtogreat-comic.jpg" alt="fromgoodtogreat-comic" title="fromgoodtogreat-comic" width="480" height="270" class="alignnone size-full wp-image-228" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2009/03/26/from-good-to-great-developer-downloads-and-resources/feed/</wfw:commentRss>
		<slash:comments>207</slash:comments>
		</item>
		<item>
		<title>Focus</title>
		<link>http://www.hedgate.net/articles/2009/02/25/focus/</link>
		<comments>http://www.hedgate.net/articles/2009/02/25/focus/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 17:55:19 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=183</guid>
		<description><![CDATA[I use Spaces and Quicksilver to increase my focus on the task that I am currently working on. By hiding focus-stealing applications from view in another desktop, and interacting with them through Quicksilver, I can stay focused on my task. Read on for more details. For a couple of weeks now I have been deliberately [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.hedgate.net/wp-content/uploads/focus1.jpg" alt="focus1" title="focus1" width="176" height="240" class="alignright size-full wp-image-204" />I use <a href="http://www.apple.com/macosx/features/spaces.html">Spaces</a> and <a href="http://docs.blacktree.com/quicksilver/what_is_quicksilver">Quicksilver</a> to increase my focus on the task that I am currently working on. By hiding focus-stealing applications from view in another desktop, and interacting with them through Quicksilver, I can stay focused on my task. Read on for more details.</p>
<p>For a couple of weeks now I have been deliberately trying to become more effective by improving focus during daily work. I have had a lot of inspiration from Staffan Nöteberg, whose book <a href="http://www.pomodoro-book.com/">Pomodoro Technique Illustrated</a> is a great read. I have tried using the Pomodoro Technique a bit, but for various reasons (one being synchronizing with my colleagues) I&#8217;m trying other similar techniques such as <a href="http://davidseah.com/pceo/">PCEO</a> now. Regardless of which technique I have been using I have also tried using some technology to help me focus, and that is what I wanted to write a quick post about here. Specifically there are two applications, <a href="http://www.apple.com/macosx/features/spaces.html">Spaces</a> and <a href="http://docs.blacktree.com/quicksilver/what_is_quicksilver">Quicksilver</a>, that I have been semi-using on my Mac for a long time, but not really been able to see or draw any real benefit from.</p>
<h3>Focus on the task at hand</h3>
<p>When I am working I want to be able to focus on the specific task that I am doing right now. For instance, if I am writing an article I want to have Textmate (or some other application for writing) running, perhaps a couple of browser windows/tabs with some information I need for the article, and perhaps a Finder window. Just things relevant to this task, and for those applications that can have multiple windows or tabs only the relevant windows.</p>
<p>What I do not want to see is iTunes, Mail, an IM application, lots of browser windows/tabs with &#8220;other stuff&#8221; not relevant for this task, a development environment, Finder windows for other things, my note-taking application or anything else that could steal my focus if I would look at them.</p>
<p>A simple solution is of course to simply quit all these other applications. But that means it will take a lot longer to switch context to other tasks, or catch up on mail and other communication during a quick break. And perhaps I do want iTunes running since music helps me focus, I just do not want to see it because I can easily get stuck navigating songs. Minimizing all these applications is not much better than closing them, since it still makes it difficult with context switching.</p>
<p><img src="http://www.hedgate.net/wp-content/uploads/spaces-300x169.jpg" alt="spaces" title="spaces" width="300" height="169" class="alignnone size-medium wp-image-207" /></p>
<p>The solution for me has been <a href="http://www.apple.com/macosx/features/spaces.html">Spaces</a>, the built-in virtual desktop application in Mac OS X Leopard. Using Spaces, I have <a href="http://daringfireball.net/2008/05/spaces">arranged my desktops according to tasks</a>. The basic setup has three desktops that always exist:</p>
<ul>
<li>My first desktop starts out blank. This is where I work.</li>
<li>The second desktop is my communication hub. Mail, IM, Twitter, RSS reader etc, all those kind of applications are normally always running here. I also have my calendar and todo&#8217;s open and showing here all the time.</li>
<li>My third desktop is my reading place. Articles, blog posts etc that I defer reading until later are dumped here.</li>
</ul>
<p>At any given time, I normally have a couple of other desktops created. For instance, since <a href="http://www.flickr.com/photos/chrishedgate/">I am interested in photography</a> I normally have a number of browser windows open specifically for reading about photography, and also for following different communities that I take part in. I want to be able to quickly overview what is going on in that area, so I more or less always have a separate desktop dedicated for that. Other ongoing work such as sales usually have a dedicated desktop as well.</p>
<p>More importantly, when I am working on some task (on desktop #1) and decide to postpone it for later, I usually create a new desktop and dump everything there. That way I am ready to start a new task with an empty desktop, and I can easily get everything back when I decide to switch back to the previous task.</p>
<p>Finally, I really like having a communication and planning desktop. This is where I go when I come back from a quick break, to get an overview of any changes that might affect my planning.</p>
<h3>Recovering gracefully from interruptions</h3>
<p>When I am focused on something, possibly in a nice state of flow, I do not want to lose that focus to an interruption I did not plan for (breaks should be planned often to reflect and re-plan as necessary). However, interruptions cannot simply be ignored. The Pomodoro technique describes some good principles for handling internal and external interruptions. Usually it comes down to making a note of whatever was so important to interrupt you, and scheduling time for taking care of it later.</p>
<p>However, there might be some interruptions that I want to act on immediately. For instance, something as simple as iTunes switching to a song that I do not want to listen to right now. I could switch to iTunes, but that would carry the risk of &#8216;getting stuck&#8217; navigating songs and thereby losing focus. Another example is sending a quick email (such as just a file that someone needs), or adding something to a todo list. The common theme for all of these are that I need to interact with some other program, but to avoid losing focus I do not want to interact with it directly.</p>
<div id="attachment_208" class="wp-caption none" style="width: 278px"><img src="http://www.hedgate.net/wp-content/uploads/quicksilver.gif" alt="Email a file" title="quicksilver" width="268" height="109" class="size-full wp-image-208" /><p class="wp-caption-text">Email a file</p></div>
<p>This is where <a href="http://docs.blacktree.com/quicksilver/what_is_quicksilver">Quicksilver</a> really shines. With just a couple of keystrokes I can email that file to my colleague, without even seeing the mail application. It is still &#8216;hidden&#8217; in another desktop, and there is no risk of me seeing that super interesting but non-urgent email lying in my inbox. Quicksilver has tons of plugins that allow me to do these quick indirect interactions with applications, which means I can recover from an interruption without losing my focus.</p>
<h3>Pen and paper rules!</h3>
<p>With that said however, as a final note I want to warn you not to rely to heavily on technology. Pen and paper are the base components of whatever focus-helping technique I use. Daily planning of what activities I need to do today, simple follow-up on where my time was spent, and taking notes of things to reflect upon later is best done using just pen and paper.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2009/02/25/focus/feed/</wfw:commentRss>
		<slash:comments>185</slash:comments>
		</item>
		<item>
		<title>From Good To Great Developer &#8211; Spring Tour 2009</title>
		<link>http://www.hedgate.net/articles/2009/01/30/from-good-to-great-developer-spring-tour-2009/</link>
		<comments>http://www.hedgate.net/articles/2009/01/30/from-good-to-great-developer-spring-tour-2009/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 08:21:43 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[blueplane]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[jfokus]]></category>
		<category><![CDATA[jfokus09]]></category>
		<category><![CDATA[scandevconf]]></category>
		<category><![CDATA[sdc09]]></category>
		<category><![CDATA[TechDays09]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=156</guid>
		<description><![CDATA[Last year, after a user group meeting, me and Kim Gräsman were talking over a beer about how hard it was to get everyone else to care about code the way we do. For instance, there we where at a user group meeting, while &#8216;they&#8217; were not. This got me thinking about what we usually [...]]]></description>
			<content:encoded><![CDATA[<p>Last year, after a user group meeting, me and <a href="http://grundlig.wordpress.com/">Kim Gräsman</a> were talking over a beer about how hard it was to get everyone else to care about code the way we do. For instance, there we where at a user group meeting, while &#8216;they&#8217; were not. This got me thinking about what we usually do when we try to &#8216;help&#8217; others see things our way. We try to teach them things such as refactoring, design patterns and TDD, with no other result than us becoming frustrated when people do not understand or want to use them.</p>
<p>Further thinking led to a presentation, titled <a href="http://www.hedgate.net/articles/2008/06/17/great-developers/">Great Developers</a>, that I gave at the SweNUG Code Camp last summer. There I talked about what I believe a great developer to be, and how they work with code to produce a great result. I had the opportunity to do this again a couple of times during the autumn, and I also submitted the presentation for a couple of conferences during this spring.</p>
<p><a href="http://www.flickr.com/photos/chrishedgate/sets/72157613055425649/"><img src="http://farm4.static.flickr.com/3488/3235187466_6623a67dde_t_d.jpg" alt="JFokus 2009" align="right" style="padding-left: 10px;" /></a>I did however change the title, and also the abstract, since my main point in the presentation moved from &#8216;what is a great developer&#8217; to &#8216;<strong>why are we having trouble helping good developers become great developers</strong>&#8216;. This week I gave this presentation to 300-350 people at the <a href="http://www.jfokus.se/">JFokus 2009</a> conference in Stockholm, Sweden. I think it went really well, and I hope people liked it. At least one person commented afterwards:</p>
<blockquote><p>Your presentation has been one of the most concrete, clear and to the point presentation I have heard since a long time ago, and I can mention that my motivation regarding what you have said has changed.</p></blockquote>
<p>With the Java-people covered, I move my focus to the <a href="http://www.microsoft.com/sverige/techdays09/">Microsoft TechDays</a> conference in Västerås, Sweden on the 17th to 18th of March 2009. And if you happened to miss me on any of these occasions, there is a final chance at the <a href="http://www.scandevconf.se/">Scandinavian Developers Conference</a> in Göteborg, Sweden, on March 24th.</p>
<p>I hope to see you at some of these events! Take a look at the lineup of speakers for them, they promise to be great sources of inspiration and learning.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2009/01/30/from-good-to-great-developer-spring-tour-2009/feed/</wfw:commentRss>
		<slash:comments>206</slash:comments>
		</item>
		<item>
		<title>Notes on Designing Experiential Meetings</title>
		<link>http://www.hedgate.net/articles/2008/12/05/notes-on-designing-experiential-meetings/</link>
		<comments>http://www.hedgate.net/articles/2008/12/05/notes-on-designing-experiential-meetings/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 14:12:50 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[aye]]></category>
		<category><![CDATA[experiential]]></category>
		<category><![CDATA[notes]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=138</guid>
		<description><![CDATA[About a month ago at the AYE conference I participated in a full-day workshop on Designing Experiential Meetings, led by Jerry Weinberg (with support from Esther Derby). I really enjoyed it and learned a lot. A couple of days ago I was talking to Tobias Fors, telling him about the workshop, and he convinced me [...]]]></description>
			<content:encoded><![CDATA[<p>About a month ago at the <a href="http://www.ayeconference.com/">AYE conference</a> I participated in a full-day workshop on Designing Experiential Meetings, led by Jerry Weinberg (with support from Esther Derby). I really enjoyed it and learned a lot. A couple of days ago I was talking to <a href="http://www.tobiasfors.se/">Tobias Fors</a>, telling him about the workshop, and he convinced me to post my notes in a blog post. So, here are my thoughts and notes from that workshop.</p>
<p><b>I must stress that these are my interpretations and notes of what was said, even when I refer to Jerry or anyone else.</b></p>
<h3>What does experiential mean?</h3>
<p><a href="http://en.wikipedia.org/wiki/Experiential_learning">Wikipedia</a> says:</p>
<blockquote><p>Experiential learning is learning through reflection on doing [...]</p></blockquote>
<p>In my own words, an experiential meeting (or workshop, training session etc) is a meeting that includes activities that allow you to experience something (through discussion, hands-on work, simulations or something similar) and then learn from that experience by reflecting on it. So in a sense it is about participation as opposed to just listening. But I would not describe a training session as experiential just because it includes an exercise. Without the reflection part a lot of potential for learning would be missed.</p>
<p>So, that brings me to the basic structure of an experiential meeting.</p>
<h3>Exploration, Discovery, Application</h3>
<p>Jerry described experiential meetings as having three basic components. First we Explore the topic we want to learn about, next we Discover something about it, and finally we try and find a way to Apply that knowledge. Sometimes these are used in cycles. For instance, while Applying something we learned we might move in to a new Exploration.</p>
<p>A style, or pattern, that I like is a session that starts with the participants exploring some concept, either individually or in small groups. They then get into larger groups (or the one group) to share their thoughts and discover patterns or key points. Next, a simulation is used where they will apply and reinforce these key points. The simulation helps the participants explore the concept further, and in the following debriefing they discover even more knowledge.</p>
<h3>Whatever happens, happens</h3>
<p>A basic principle of an experiential session is what Jerry described as &#8220;whatever happens, happens&#8221;. As the leader of a session, it is not your job to make sure that something specific happens, or to decide what knowledge the participants should get from it.</p>
<p>As a session leader you are not a trainer with knowledge to push to the participants. You are a facilitator for the learning of the group and the individuals in it. If the participants happen to take the session in a direction you had not planned for, do not automatically force them back. Of course this does not mean you should just be a bystander, or come to the session with no plan. That is not facilitating. Instead, use everything that happens to help the participants get maximum value from the session. Have a plan, and modify it as you go.</p>
<h3>Always debrief</h3>
<p>I guess there might be a difference for different people, but for me all the learning happens in the debriefing. Or rather, the debriefing sets my mind up for effective learning. During the debriefing I will learn a lot, but even at a later time I will realize things which I believe would have been much more difficult without the debriefing.</p>
<p>During the debriefing participants get to hear other participants&#8217; perspectives. By sharing your own thoughts with others you will refine and extend your own understanding. An interesting way for the facilitator to reinforce this is to find ways to make the debriefing itself experiential. Instead of just having participants say what they thought, help them activate more parts of the brain by using alternative ways of providing feedback.</p>
<p>The <a href="http://facilitation.aspirationtech.org/index.php/Facilitation:Spectrogram">Spectrogram</a> <a href="http://kaliyasblogs.net/unconference/?p=29">activity</a> is a good example. Ask the participants about how they feel about something. Tell them to stand up and place themselves somewhere along an imaginary line from max/agree to min/disagree. Interview people about the reason why they are standing where they are, what their context is.</p>
<p>As the facilitator, make sure that you ask open-ended questions of the participants. A good way to start is just asking about what they saw or heard. Move on to things that puzzled them, and next ask about insights. Finally, ask them about one thing that they can take back to work and apply. Notice the pattern? This is basically the Exploration, Discovery, Application structure again. :)</p>
<h3>Safety and comfort</h3>
<p>An experiential session can be very different from what many participants are used to. Make sure that everyone understands that participation in any exercise is completely optional. People can have many reasons for feeling that they do not want to be part of an exercise. For instance, Jerry told a story of someone with strong religious beliefs that would not take part in an exercise that involved playing cards. It can of course be much simpler than that, some exercises involve close contact that many people are not ok with. People who do not want to take an active part in an exercise can be given the option of being an observer for the group. They will see things that others do not, so this can benefit both themselves and the rest of the group.</p>
<p>When designing exercises (see more below), have safety and comfort in mind. Are the participants complete strangers to eachother, or have they been working closely together for a long time? Do not use exercises that would need paramedics to be close, or ones that single people out as &#8220;losers&#8221; (survivor-style). Giving someone a role that will make them look stupid can make them checkout of the exercise, either physically (by leaving) or mentally. Either way, it will affect their learning, and possibly the rest of the group as well.</p>
<p>Regarding people checking out (for different reasons), this is a strong reason (there are others as well of course) to be more than one person leading the session. Use lieutenants to help keep an eye on people. This way if a participant needs attention, the exercise can continue with the rest of the group while someone works with that person to make sure they are ok.</p>
<h3>Designing exercises</h3>
<p>To end with, here are a couple of tips on how to design exercises and activities for experiential sessions. To me, the most important advice is to <b>keep the exercise itself simple</b>, and let the learning happen in the debriefing. Think about the objective of the exercise, what do you want people to learn from it. Then think about all the steps of the exercise, all the twists it takes, and consider whether they help achieve that objective or if they distract from it. Note that I am not saying there must always be just one clear objective (the great <a href="http://xp.be/xpgame.html">XP game</a> comes to mind), but that you should consider the elements of an exercise to make sure they do not distract from the objective(s).</p>
<p>This is also a good way to invent new exercises. An advice that was given was to try reversing the objective(s), consider how that affects the elements of the exercise, and design from there. I would recommend going further and try using all parts of a technique such as <a href="http://www.mindtools.com/pages/article/newCT_02.htm">SCAMPER</a> (not just reversal) to design new exercises with different objectives.</p>
<p>Finally, it can be a good idea to have backups for some exercises. Specifically if you are planning on using an exercise that takes some time, it can be necessary to have a shorter backup to use if previous parts of the session ran longer than expected.</p>
<p>To wrap up, in my own experience it helps a lot to include some humor and fun in the session. Try to create a positive energy, and go with that energy throughout the session. And remember, whatever happens, happens!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2008/12/05/notes-on-designing-experiential-meetings/feed/</wfw:commentRss>
		<slash:comments>262</slash:comments>
		</item>
		<item>
		<title>Collectively defining great teamwork at Øredev 2008</title>
		<link>http://www.hedgate.net/articles/2008/11/22/collectively-defining-great-teamwork-at-%c3%b8redev-2008/</link>
		<comments>http://www.hedgate.net/articles/2008/11/22/collectively-defining-great-teamwork-at-%c3%b8redev-2008/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 18:45:48 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[blueplane]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[oredev]]></category>
		<category><![CDATA[oredev08]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=97</guid>
		<description><![CDATA[It is that time of the year again. Øredev, the largest software development conference in Sweden, was this week and we at Blueplane sponsored it again. This year they had a great idea. To encourage people to meet other people and actually go speak with the exhibitors, they had a game for the attendees. Each [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/chrishedgate/3048845402/"><img alt="" src="http://farm4.static.flickr.com/3011/3048845402_9c857fa9c4_m.jpg" title="Help us define great teamwork" class="alignright" width="160" height="240" /></a>
<p>It is that time of the year again. <a href="http://oredev.org/" title="Øredev">Øredev</a>, the largest software development conference in Sweden, was this week and we at <a href="http://www.blueplane.se/">Blueplane</a> sponsored it again. This year they had a great idea. To encourage people to meet other people and actually go speak with the exhibitors, they had a <a href="http://oredev.org/topmenu/activities/unicef.4.9748e5511d79d43d9e8000299.html" title="UNICEF    - Øredev">game for the attendees</a>. Each attendee had to collect a stamp from six different exhibitors to have a chance of winning some nice prizes. Not only that, by collecting those six stamps they also helped contribute money to Unicef for building schools in Africa. A great idea for a great cause!</p>
<p>Each exhibitor who participated in the game (by contributing money to Unicef) got to choose what they wanted attendees to do to get a stamp from them. Some just gave them a stamp when they asked for it. Boring! I wanted to maximize both our opportunity to meet people, but even more so I wanted to encourage people to talk to other attendees. So I came up with a game about collectively defining great teamwork.</p>
<p><a href="http://www.flickr.com/photos/chrishedgate/3047168449/"><img alt="" src="http://farm4.static.flickr.com/3275/3047168449_1e0e02f7e3_m.jpg" title="Game instructions" class="alignleft" width="160" height="240" border="1" /></a>To get a stamp from us at Blueplane, an attendee got one of our great looking business cards, which also doubles as a small index card. On the back side they would write a single word that defines great teamwork, according to that person.</p>
<p>Next, we taped the card with the word to their name badge that everyone wore around their neck, and then they had to walk around the conference looking for someone else with one of our cards with a word written on it. When they found someone (hopefully someone they had not met before) they then had to discuss and decide together which of the two words they had that were more important. Between their two words they had to assign seven points, such that the more important word perhaps got five points and the other got two points. They had to assign the points together and then come back to our booth, together, and share their thoughts and how they divided the seven points. That earned them their stamps, and we had an iPod Touch that they now had a chance of winning.</p>
<p><a href="http://www.flickr.com/photos/chrishedgate/3048012457/"><img alt="" src="http://farm4.static.flickr.com/3039/3048012457_710c499f07_m.jpg" title="Great teamwork according to Øredev delegates" class="alignright" width="160" height="240" /></a>We collected the words and summed up the points they got, and then used this data to write the following definition of what great teamwork is. To everyone who helped us do this, and contributed to building schools in Africa, thank you!</p>
<blockquote><p><b>Great teamwork as defined by attendees at Øredev 2008</b><br/>Great teamwork builds on communication between individuals committed on a common goal. A keen interest in sharing knowledge between one another brings the team members together, creating a fun environment to work in.</p></blockquote>
<hr/>
<p style="text-size: smaller">I want to give credit to <a href="http://agilethinking.net/blog/" title="Agile Thoughts">Tobias Mayer</a>, who&#8217;s thoughts and description of <a href="http://agilethinking.net/blog/2008/08/18/scale-back-small-is-beautiful/" title="Agile Thoughts  &raquo; Blog Archive   &raquo; Scale Back: Small is Beautiful">a session he ran at Agile 2008</a> inspired me when I designed this game.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2008/11/22/collectively-defining-great-teamwork-at-%c3%b8redev-2008/feed/</wfw:commentRss>
		<slash:comments>293</slash:comments>
		</item>
		<item>
		<title>From good developer to great developer</title>
		<link>http://www.hedgate.net/articles/2008/10/30/from-good-developer-to-great-developer/</link>
		<comments>http://www.hedgate.net/articles/2008/10/30/from-good-developer-to-great-developer/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 14:33:51 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=92</guid>
		<description><![CDATA[During this autumn we at Blueplane have started a series of breakfast seminars. Next time, on Tuesday 11 november, it is my turn. My presentation is called &#8220;From good to great developer&#8221; (or as it is presented in Swedish, &#8220;Från duktig till fantastisk utvecklare&#8221;. I will talk about how I characterize great developers, and show [...]]]></description>
			<content:encoded><![CDATA[<p>During this autumn we at <a href="http://www.blueplane.se/">Blueplane</a> have started a series of <a href="http://www.blueplane.se/seminars/">breakfast seminars</a>. Next time, on Tuesday 11 november, it is my turn. My presentation is called &#8220;From good to great developer&#8221; (or as it is presented in Swedish, &#8220;Från duktig till fantastisk utvecklare&#8221;. I will talk about how I characterize great developers, and show an example of how a great developer implements a new feature while at the same time improving existing code, following an attitude I describe as Simplify, Improve, Modify. I will also discuss ways to motivate and support good developers to take that attitude and become great developers.</p>
<p>As I have been preparing the presentation, I have tried to identify the people will attend it. Next, to make sure that my material is relevant to these people, I have written down their reasons for being there, in a user story format. This way I can quite easily decide if an idea I want to talk about is actually relevant for the audience, or just a <a href="http://everything2.com/e2node/Kill%2520your%2520darlings">darling</a>.</p>
<p>Here are the stories I came up with:</p>
<blockquote><p>In order to deliver high-quality software with predictability, as a manager I want to support good developers to become great</p></blockquote>
<blockquote><p>In order to have more enjoyable challenges, work less with frustrating bugs and more with interesting problems, and advance my own skills, as a great developer I want to advance my colleagues into peers</p></blockquote>
<blockquote><p>In order to have more stimulating work and earn the respect of my colleagues, as a good developer I want to have some hands-on advice on what I can do to improve as a developer</p></blockquote>
<p>If you want to attend the seminar on Tuesday 11 november and have a free breakfast (breakfast is served at 07.30), send an email to <a href="mailto:seminarier@blueplane.se">seminarier@blueplane.se</a>. The place is St Gertrud Konferens, Östergatan 7b, in Malmö, Sweden. <a href="http://www.blueplane.se/seminars/great-developers-info.pdf">See this pdf (in Swedish) for more info</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2008/10/30/from-good-developer-to-great-developer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AgileØresund 2008</title>
		<link>http://www.hedgate.net/articles/2008/08/26/agile%c3%b8resund-2008/</link>
		<comments>http://www.hedgate.net/articles/2008/08/26/agile%c3%b8resund-2008/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 14:17:17 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=82</guid>
		<description><![CDATA[As one of the driving forces of AgileØresund, I am involved in organizing a conference in Malmö next month. We are planning the conference to be a participant driven conference, meaning that the content is driven by the participants through lightning talks and open space discussions. It will be a full day free of charge, [...]]]></description>
			<content:encoded><![CDATA[<p>As one of the driving forces of <a href="http://www.agileoresund.org/">AgileØresund</a>, I am involved in organizing a conference in Malmö next month. We are planning the conference to be a participant driven conference, meaning that the content is driven by the participants through lightning talks and open space discussions. It will be a full day free of charge, so I hope a lot of agilistas from the Öresund region show up.</p>
<p>Go check out the <a href="http://www.agileoresund.org/2008/">web site</a> (only in Swedish) and sign up for the conference, and I will see you there!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2008/08/26/agile%c3%b8resund-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The elevator pitch introduction session</title>
		<link>http://www.hedgate.net/articles/2008/07/02/the-elevator-pitch-introduction-session/</link>
		<comments>http://www.hedgate.net/articles/2008/07/02/the-elevator-pitch-introduction-session/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 22:45:46 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.hedgate.net/?p=79</guid>
		<description><![CDATA[Start a conference with a big introduction session where every speaker has to present a 45 second version of his or her session. This would make it easier for the attendees to decide which sessions to go to, and also increase the quality of the sessions. Photo from bogenfreund&#8217;s Flickr photostream I was recently at [...]]]></description>
			<content:encoded><![CDATA[<p>Start a conference with a big introduction session where every speaker has to present a 45 second version of his or her session. This would make it easier for the attendees to decide which sessions to go to, and also increase the quality of the sessions.</p>
<p align="center">
	<img src="http://www.hedgate.net/wp-content/uploads/elevator.jpg" border="1" /><br />
	<em>Photo from <a href="http://www.flickr.com/photos/bogenfreund/" title="Flickr: bogenfreund's Photostream">bogenfreund&#8217;s Flickr photostream</a></em>
</p>
<p>I was recently at the <a href="http://agilasverige.se/2008/" title="Agila Sverige 2008">Agila Sverige 2008 conference</a> (which I guess some would call an <a href="http://en.wikipedia.org/wiki/Unconference" title="Unconference - Wikipedia, the free encyclopedia">unconference</a> since it was made up of <a href="http://en.wikipedia.org/wiki/Lightning_Talk" title="Lightning Talk - Wikipedia, the free encyclopedia">lightning talks</a> and <a href="http://en.wikipedia.org/wiki/Open_Space_Technology" title="Open Space Technology - Wikipedia, the free encyclopedia">open space sessions</a>, instead of normal 45-90 minute breakout sessions and keynotes). I presented a lightning talk version of <a href="http://www.hedgate.net/articles/2008/04/15/real-retrospectives-not-just-talking/" title="Real Retrospectives - Not Just Talk">Real Retrospectives &#8211; Not Just Talk</a> (<a href="http://www.blueplane.se/seminars/realretrospectives-lightningedition.pdf" title="">download pdf</a>).</p>
<p>I really liked the constraint of presenting the same ideas as before, only this time I only had 10 minutes. In fact, since I am a big fan of the <a href="http://en.wikipedia.org/wiki/Elevator_pitch" title="Elevator pitch - Wikipedia, the free encyclopedia">elevator pitch</a>, I started by presenting my content in 45 seconds. After this I told the audience that I had now delivered my core message to them. If they thought the ideas where not that interesting or they already knew the topic, or just did not like me for any reason, they could switch to a parallel session. If not, I would spend the rest of my 10 minutes to build upon that core message and hopefully give them some more value for their time.</p>
<p>This got me thinking, it would be an interesting idea to have a conference start with a general session, where every speaker had to present their session in 45 seconds. This would force speakers to really think through their content and boil it down to the key ideas they want to convey, which in turn I think is a good recipe for improving the quality and consistency of the content. It would also be a lot of help to attendees who are trying to decide which sessions to attend with multiple concurrent tracks. For one thing it would of course be helpful to see what the key ideas are, but also just to see and hear the speakers in action would make the decision easier in some cases.</p>
<p align="center">
	<img src="http://www.hedgate.net/wp-content/uploads/stop.jpg" border="1" /><br />
	<em>Photo from <a href="http://www.flickr.com/photos/mag3737/" title="Flickr: mag3737's Photostream">mag3737&#8242;s Flickr photostream</a></em>
</p>
<p>To take this idea even further, a variation could have the attendees voting for the sessions they think should be included in the schedule after getting the elevator pitches. Attendees could have an Emergency Stop button (for stopping the elevator, giving the speaker more time) to indicate that they liked the idea and would like to hear more about it by attending a full session (however long that is). This would not work for every conference of course, but it would be an interesting idea to try&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2008/07/02/the-elevator-pitch-introduction-session/feed/</wfw:commentRss>
		<slash:comments>217</slash:comments>
		</item>
		<item>
		<title>Sharing</title>
		<link>http://www.hedgate.net/articles/2007/08/24/sharing/</link>
		<comments>http://www.hedgate.net/articles/2007/08/24/sharing/#comments</comments>
		<pubDate>Fri, 24 Aug 2007 15:17:47 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Late friday evening, after some wine, whisky and beer and a movie, I could not think of anything better to do than to catch up a bit on my blog reading (it&#8217;s not just my posting that is more or less dead right now, parental leave has left a lot of unread items in Google [...]]]></description>
			<content:encoded><![CDATA[<p>Late friday evening, after some wine, whisky and beer and a movie, I could not think of anything better to do than to catch up a bit on my blog reading (it&#8217;s not just my posting that is more or less dead right now, parental leave has left a lot of unread items in Google Reader). After reading a couple of hundred posts, in the end it was two that really stuck in my head. Maybe it was just the short and simple format of them that made it easier to read them, but they really spoke to me.</p>
<p>I used to have the latin phrase <em><a href="http://www.m-w.com/dictionary/docendo+discimus">Docendo discimus</a></em> (We learn by teaching) as my personal motto, but I think Jason Yip really nails it with:</p>
<blockquote><p><a href="http://jchyip.blogspot.com/2007/08/always-explain-why.html">There&#8217;s no substitute for sharing knowledge</a></p></blockquote>
<p>Jason says you should always explain why, especially to children and others who really have no idea why something happens the way it does. Never just say it&#8217;s magic or so. I couldn&#8217;t agree more.</p>
<p>On a somewhat similar note, Paul Duvall discuss why you should &#8220;<a href="http://www.testearly.com/2007/08/17/fire-your-best-peoplereward-the-lazy-ones/">fire your best people &#8230; reward the lazy ones</a>&#8220;. Now, the title is of course a bit misleading although there is some truth to it, but the message of the post for me can be boiled down to the following quote from the post:</p>
<blockquote><p>If the knowledge is locked in your head, you are a less valuable, not more valuable, resource.</p></blockquote>
<p>To me, these posts say that it is always important to take the time to share the knowledge instead of just &#8220;making it so&#8221;, whether it is something we implement in software or just something we say to someone.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2007/08/24/sharing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programming with your nose</title>
		<link>http://www.hedgate.net/articles/2007/07/04/programming-with-your-nose/</link>
		<comments>http://www.hedgate.net/articles/2007/07/04/programming-with-your-nose/#comments</comments>
		<pubDate>Wed, 04 Jul 2007 14:45:08 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[While flipping through an old MSDN magazine* today, I was inspired to this thought: Programming is done with the nose! One way of describing programming as using your nose would be to refer to the analogy of code smells. While I have always liked that analogy, that was however not what I had in mind [...]]]></description>
			<content:encoded><![CDATA[<p>While flipping through an old MSDN magazine* today, I was inspired to this thought: Programming is done with the nose! One way of describing programming as using your nose would be to refer to the analogy of <a href="http://en.wikipedia.org/wiki/Code_smell">code smells</a>. While I have always liked that analogy, that was however not what I had in mind here.</p>
<p>The article that inspired my thought was Stan Lippman&#8217;s column entitled <a href="http://msdn.microsoft.com/msdnmag/issues/06/10/EndBracket/">&#8220;Is Programming an Art?&#8221;</a>, where he compares software development to art. I like calling software development an art, in the same way as the process of <a href="http://www.scotchmaltwhisky.co.uk/made-blended.htm">creating a Scotch Blended Whisky</a> is often called an art (as opposed to creating malt whisky which is called a science, since it is mostly about following a protocol). When creating a blended whisky, the Master Blender will use nothing but his nose to select the combination of malt and grain whisky to include in the blend. Sometimes a blend will include up to 50 different sorts of whisky. And every batch of blended whisky that is produced must consistently taste and smell the same way. Anyone interested in Single Malts knows that whisky from different batches, even different barrels in the same batch, will have different characteristics, so being a &#8220;Noser&#8221; (which is a much cooler title than Master Blender) is truly a difficult job with no easy way of simply following a protocol.</p>
<p>This art of &#8220;nosing&#8221; in many ways remind me of creating software. Although many would like it to be, software development is not about following a simple process of pressing a couple of buttons and drawing some lines. Producing software requires coding, and no project is ever the same as another one.</p>
<hr/>
<p>Here&#8217;s another thought: Maybe this means we can finally retire the term Architect? Lets start using Noser instead, at least for <a href="http://codebetter.com/blogs/scott.bellware/archive/2006/09/10/149127.aspx">architects doing real work</a>. :D</p>
<p><small>* Ironically, this was right after I had listened to <a href="http://www.dotnetrocks.com/default.aspx?showNum=249">Don Box and Chris Sells on .NET Rocks!</a>, talking about how no one actually reads magazines anymore and they could not remember when the last time they saw a copy of MSDN magazine was. I think that was the main reason I picked it up and browsed through it. :)</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2007/07/04/programming-with-your-nose/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Testing events with unit tests</title>
		<link>http://www.hedgate.net/articles/2007/03/13/testing-events-with-unit-tests/</link>
		<comments>http://www.hedgate.net/articles/2007/03/13/testing-events-with-unit-tests/#comments</comments>
		<pubDate>Tue, 13 Mar 2007 16:23:00 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[How to test events seem to be a question that sometimes comes up regarding unit testing. There are three different things that we want to test when using events. * Verify that an event subscriber really wires up a listener to an event * Verify that an event subscriber does what it should when that [...]]]></description>
			<content:encoded><![CDATA[<p>How to test events seem to be a question that sometimes comes up regarding unit testing. There are three different things that we want to test when using events.</p>
<p>  * Verify that an event subscriber really wires up a listener to an event<br />
  * Verify that an event subscriber does what it should when that event is fired<br />
  * Verify that an event publisher fires an event when it should</p>
<p>The first two are basically the same. If we can verify that some action that should be taken when an event is fired really does happen then we have of course also verified that the subscriber does listen to the event. But I prefer to start simple with my tests and therefore often end up with a small test like the following one for testing the wiring only:</p>
<pre name="code" class="c-sharp">
using System;
using NUnit.Framework;

namespace TestingEvents
{
  [TestFixtureAttribute]
  public class EventsFiringTests
  {
    [Test]
    public void SubscriberWiresListenerToListenToMeEvent()
    {
      FakePublisher publisher = new FakePublisher();

      new SubscriberUnderTest(publisher);

      Assert.AreEqual(1, publisher.ListenToMeSubscriberCount);
    }
  }

  public interface Publisher
  {
    event EventHandler ListenToMe;
  }

  public class FakePublisher : Publisher
  {
    public event EventHandler ListenToMe;

    public int ListenToMeSubscriberCount
    {
      get { return ListenToMe.GetInvocationList().Length; }
    }

    public void FireListenToMe()
    {
      ListenToMe.Invoke(this, EventArgs.Empty);
    }
  }

  public class SubscriberUnderTest
  {
    private string message;

    public SubscriberUnderTest(Publisher publisher)
    {
      message = null;

      publisher.ListenToMe += IAmListening;
    }

    private void IAmListening(object sender, EventArgs args)
    {
      message = "I heard that!";
    }

    public string Message
    {
      get { return message; }
    }
  }
}
</pre>
<p>This test only tests that the subscriber actually does wire up a listener to the ListenToMe event of the publisher it is instantiated with. The next step is to verify what it does when the event is fired from the publisher. The next test takes care of that.</p>
<pre name="code" class="c-sharp">
  [Test]
  public void MessageIsSetWhenListenToMeIsFired()
  {
    FakePublisher publisher = new FakePublisher();
    SubscriberUnderTest subscriber = new SubscriberUnderTest(publisher);

    publisher.FireListenToMe();

    Assert.AreEqual("I heard that!", subscriber.Message);
  }
</pre>
<p>That takes care of testing that a subscriber does what we expect it to when the event it subscribes to is fired. The final thing that needs to be tested is that a publisher actually fires an event when we expect it to. Lets add a new class, PublisherUnderTest, and another test.</p>
<pre name="code" class="c-sharp">
  [Test]
  public void PublisherFiresListenToMeWhenAngry()
  {
    PublisherUnderTest publisher = new PublisherUnderTest();

    bool listenToMeWasCalled = false;
    publisher.ListenToMe += delegate { listenToMeWasCalled = true; };

    publisher.GetAngry();

    Assert.AreEqual(true, listenToMeWasCalled);
  }

  public class PublisherUnderTest : Publisher
  {
    public event EventHandler ListenToMe;

    public void GetAngry()
    {
      if (ListenToMe != null)
      {
        ListenToMe.Invoke(this, EventArgs.Empty);
      }
    }
  }
</pre>
<p>The test simply assigns an anonymous method to listen to the event from the publisher. In the anonymous method a boolean value is set to true to indicate that the event was fired.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2007/03/13/testing-events-with-unit-tests/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Instantiating a WPF control from an NUnit test</title>
		<link>http://www.hedgate.net/articles/2007/01/08/instantiating-a-wpf-control-from-an-nunit-test/</link>
		<comments>http://www.hedgate.net/articles/2007/01/08/instantiating-a-wpf-control-from-an-nunit-test/#comments</comments>
		<pubDate>Mon, 08 Jan 2007 13:46:46 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[If you try to run a test like the following from NUnit, you will find that it does not work. You get an InvalidOperationException telling you that &#8220;The calling thread must be STA, because many UI components require this&#8221;. [Test] public void CanCreateAndShowWpfWindow() { Console.WriteLine(Thread.CurrentThread.GetApartmentState()); System.Windows.Window window = new System.Windows.Window(); window.Show(); } NUnit (both the [...]]]></description>
			<content:encoded><![CDATA[<p>If you try to run a test like the following from NUnit, you will find that it does not work. You get an <code>InvalidOperationException</code> telling you that &#8220;The calling thread must be STA, because many UI components require this&#8221;.</p>
<pre name="code" class="c-sharp">
[Test]
public void CanCreateAndShowWpfWindow()
{
  Console.WriteLine(Thread.CurrentThread.GetApartmentState());

  System.Windows.Window window = new System.Windows.Window();
  window.Show();
}
</pre>
<p>NUnit (both the GUI and console version) by default runs it&#8217;s threads in a multithreaded apartment (MTA), which can be verified by looking at the Console.Out tab. As the message says, instantiating a WPF Window requires that the calling thread is running in a single-threaded apartment (STA).</p>
<p>The simplest way to make this work is to configure NUnit to run tests in an STA thread. Create a config file for NUnit to use (<a href="http://nunit.org/index.php?p=configFiles">see the docs for info on how to name it</a>) and add the following XML configuration (or just add to your existing one):</p>
<p><code><br />
&lt;configuration&gt;<br />
&nbsp;&nbsp;&lt;configSections&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;sectionGroup&nbsp;name="NUnit"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;section&nbsp;type="System.Configuration.NameValueSectionHandler"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name="TestRunner"&gt;&lt;/section&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/sectionGroup&gt;<br />
&nbsp;&nbsp;&lt;/configSections&gt;</p>
<p>&nbsp;&nbsp;&lt;NUnit&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;TestRunner&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add&nbsp;value="STA"&nbsp;key="ApartmentState"&gt;&lt;/add&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/TestRunner&gt;<br />
&nbsp;&nbsp;&lt;/NUnit&gt;<br />
&lt;/configuration&gt;<br />
</code></p>
<p><em>Config updated with changes proposed in comments by JohnD. Thanks!</em></p>
<p>This tells NUnit to run all tests in STA threads. However, if you just want a single test (or some but not all) to run in STA (or MTA, if you have used the above configuration to set the default to STA) you have to resort to code. You need to start a new thread and set the apartment state you want, and then run your unit test in that thread. I used <a href="http://www.peterprovost.org/archive/2004/11/03/2051.aspx">CrossThreadTestRunner</a> (from <a href="http://www.peterprovost.org/">Peter Provost</a>) and just added support to choose which apartment state to create and run a thread in. The following code example shows how to use it:</p>
<pre name="code" class="c-sharp">
[Test]
public void CanCreateAndShowWpfWindow()
{
  CrossThreadTestRunner runner = new CrossThreadTestRunner();
  runner.RunInSTA(
    delegate
    {
      Console.WriteLine(Thread.CurrentThread.GetApartmentState());

      System.Windows.Window window = new System.Windows.Window();
      window.Show();
    });
}
</pre>
<p>My modified CrossThreadTestRunner class looks like this:</p>
<pre name="code" class="c-sharp">
using System;
using System.Reflection;
using System.Security.Permissions;
using System.Threading;

namespace UnitTestThreadApartmentState
{
  public class CrossThreadTestRunner
  {
    private Exception lastException;

    public void RunInMTA(ThreadStart userDelegate)
    {
      Run(userDelegate, ApartmentState.MTA);
    }

    public void RunInSTA(ThreadStart userDelegate)
    {
      Run(userDelegate, ApartmentState.STA);
    }

    private void Run(ThreadStart userDelegate, ApartmentState apartmentState)
    {
      lastException = null;

      Thread thread = new Thread(
        delegate()
        {
          try
          {
            userDelegate.Invoke();
          }
          catch (Exception e)
          {
            lastException = e;
          }
        });
      thread.SetApartmentState(apartmentState);

      thread.Start();
      thread.Join();

      if (ExceptionWasThrown())
        ThrowExceptionPreservingStack(lastException);
    }

    private bool ExceptionWasThrown()
    {
      return lastException != null;
    }

    [ReflectionPermission(SecurityAction.Demand)]
    private static void ThrowExceptionPreservingStack(Exception exception)
    {
      FieldInfo remoteStackTraceString = typeof(Exception).GetField(
        "_remoteStackTraceString",
        BindingFlags.Instance | BindingFlags.NonPublic);
      remoteStackTraceString.SetValue(exception, exception.StackTrace + Environment.NewLine);
      throw exception;
    }
  }
}
</pre>
<p><strong>A final note</strong>: As opposed to NUnit, both TestDriven.Net and Resharper&#8217;s Unit Test Runner run tests in STA threads. I got bitten by this recently when all the tests where green on my machine, but when I committed the build server went red on me. I was using Resharper to run the tests, while NUnit-Console was used on the server. Hope this might help someone else in the same situation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2007/01/08/instantiating-a-wpf-control-from-an-nunit-test/feed/</wfw:commentRss>
		<slash:comments>196</slash:comments>
		</item>
		<item>
		<title>Plus one on Ayende&#8217;s OSS post</title>
		<link>http://www.hedgate.net/articles/2006/12/11/plus-one-on-ayendes-oss-post/</link>
		<comments>http://www.hedgate.net/articles/2006/12/11/plus-one-on-ayendes-oss-post/#comments</comments>
		<pubDate>Mon, 11 Dec 2006 00:12:30 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ayende Rahien recently wrote a very well thought through post discussing The Problem of Open Source in the Microsoft World. This is a must-read for any .NET developer who has reached the stage of looking for tools outside of Microsoft. As Ayende describes, a big part of the problem is that there is one major [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ayende.com/">Ayende Rahien</a> recently wrote a very well thought through post discussing <a href="http://www.ayende.com/Blog/2006/12/09/TheProblemOfOpenSourceInTheMicrosoftWorld.aspx">The Problem of Open Source in the Microsoft World</a>. This is a must-read for any .NET developer who has reached the stage of looking for tools outside of Microsoft. As Ayende describes, a big part of the problem is that there is one major vendor, Microsoft, who not only gives us the basic framework we use to create applications on but also the tools we use to do so with. This means that we can never expect to see built-in support for creating and running NUnit tests. Microsoft has the strength to respond to a need of .NET developers (unit testing their code in this case) by creating their own framework (MS Test) and promoting that, instead of  using (or at least including support for) existing de-facto standards (NUnit and MbUnit in this case) already being used by .NET developers.</p>
<p>While I can hope that this might change (as said by others, some IDE competition would be great) I am afraid that it will not happen anytime soon. So what can we do in the meantime? I think it is important for those of us who are using OSS tools (or simply tools from other vendors) to promote them in the .NET community. I am not saying that there always exists a better alternative to Microsoft products, often there does not, but it is important that we help the rest of the community see and evaluate the alternatives. I think some good work is being done here. At <a href="http://www.oredev.org/">&ouml;redev</a>, the largest developer conference in Sweden, the .NET track consisted of ten seminars and two half-day workshops. Half of these (one workshop and five seminars) discussed some new technology from Microsoft (Atlas, .NET 3.0, Linq etc), but half of them where mostly about educating the .NET community about professional development using TDD, domain-driven design and AOP. These are competencies that are much more common and standard knowledge in the Java community than what they are in .NET.</p>
<p>At the latest <a href="http://www.snug.se/">SNUG</a> meeting I did my presentation on testable user interface code and <a href="http://joel.fjorden.se/">Joel Fjordén</a> and <a href="http://blog.houltz.se/">Richard Houltz</a> discussed tools for developer productivity (CodeRush/Refactor and Resharper was also mentioned), coding guidelines (from outside of Microsoft, sort of) and how to enforce them using Joel&#8217;s <a href="http://joel.fjorden.se/static.php?page=CodeStyleEnforcer">CodeStyleEnforcer</a> plugin. This is what we need to do, getting the .NET community together at meetings and facilitating discussions about professional development and creating better code, by showing what tools are available. This of course includes Microsoft tools, but we should not be limited to this one major vendor.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2006/12/11/plus-one-on-ayendes-oss-post/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testable UI code presentation at SNUG</title>
		<link>http://www.hedgate.net/articles/2006/12/08/testable-ui-code-presentation-at-snug/</link>
		<comments>http://www.hedgate.net/articles/2006/12/08/testable-ui-code-presentation-at-snug/#comments</comments>
		<pubDate>Fri, 08 Dec 2006 07:14:06 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I did a presentation two days ago at &#8220;SNUG&#8221;:http://www.snug.se/. The topic was *Testable UI Code*. The title of my presentation was actually &#8220;_Cleaning up the mess_&#8221; with the subtitle &#8220;_How to take control over monstrous UI classes_&#8221;. You can download the presentation and code (it was mostly code) in a zipped file. I started out [...]]]></description>
			<content:encoded><![CDATA[<p>I did a presentation two days ago at &#8220;SNUG&#8221;:http://www.snug.se/. The topic was *Testable UI Code*. The title of my presentation was actually &#8220;_Cleaning up the mess_&#8221; with the subtitle &#8220;_How to take control over monstrous UI classes_&#8221;. You can <a href='http://www.hedgate.net/wp-content/uploads/snug-20061206.zip' title='download the presentation and code'>download the presentation and code</a> (it was mostly code) in a zipped file.</p>
<p>I started out by showing a demo application, built in the all too common way of simply having all code in one form. Naturally, this was only an example so a real application would have multiple forms and maybe even reusable code in the form of some custom user controls. The problems with this application is that it is difficult to test the behaviour of it. Automating some sort of user interface driver to test it creates tests that are much too brittle and difficult to maintain (there are even those that take a screenshot of the UI and then compare the screenshots created by a test to the &#8220;correct&#8221; ones!).</p>
<p>I then showed how to take the first step to a better design, by separating the domain logic from the UI class. To my surprise only about half of the audience raised their hands when I asked how many do this in their applications. I guess that it might be that some just did not bother to raise their hands, while others did not really associate with the example I showed (maybe they are using a &#8220;Transaction Script&#8221;:http://www.martinfowler.com/eaaCatalog/transactionScript.html style rather than the &#8220;Domain Model&#8221;:http://www.martinfowler.com/eaaCatalog/domainModel.html I showed). This step is what Martin Fowler describes as &#8220;Separated Presentation&#8221;:http://www.martinfowler.com/eaaDev/SeparatedPresentation.html. My examples are very similar to the ones in Fowler&#8217;s texts, so it should be very easy to read his detailed writings and take a look at the examples I created to get a good understanding of the things I discussed in the presentation.</p>
<p>The next step I discussed is to move presentation logic from the UI class to a separate class, often called a presenter. The UI class will simply delegate user input to the presenter class, so I think a simple name for this pattern would be Delegated Input Handling (or similar), although I have never heard it called something like that. The common name for this is of course Model-View-Presenter, but I tried to avoid discussing Model-View-Presenter and Model-View-Controller until later in the talk. The demo (in my code) is called &#8220;Passive View&#8221;:http://www.martinfowler.com/eaaDev/PassiveScreen.html, since the view (the UI class) contains no logic at all. The view does not do anything else than signalling the presenter when user interaction happens (delegated input handling) and then acts as a getter/setter for the various UI elements that the presenter needs to control.</p>
<p>After this I showed a variation of the step above, where the presenter was simplified by replacing the simple plumbing logic with data binding. To accomplish this the presenter exposes the model (domain objects) to the view so that the view can bind the UI elements to properties of the model. The reasoning for doing this is that data binding is &#8220;automatic&#8221; and included in the framework, so we can safely use it even though we can no longer test this part of the presentation logic. Martin Fowler calls this pattern &#8220;Supervising Controller&#8221;:http://www.martinfowler.com/eaaDev/SupervisingPresenter.html (though I would call it Supervising Presenter as he discusses in the article), since the presenter now only supervise things by reacting to user input and letting the view automatically show the current state of the model. However, as a supervisor the presenter will also take control of those situations where automatic handling such as data binding is too difficult or impossible. In those situations it will work with the view in the same way as in Passive View. My demo has an example of this.</p>
<p>Finally, I showed a demo of &#8220;Presentation Model&#8221;:http://www.martinfowler.com/eaaDev/PresentationModel.html. This pattern is kind of similar in intention to MVP (Passive View and Supervising Controller), but it is differently realized. Here instead of having a presenter we create a separate class, PresentationModel, to hold the current state of the UI. The UI class then does nothing but delegate input handling to the presentation model, and synchronize it&#8217;s UI elements with the current state exposed by the presentation model. One of the good things about this is that unit tests become easier to write, since there is no need to fake out the view and test the interaction between the view and the presentation model. With the presentation model completely unaware of the view it is also easy to create the presentation logic (in the presentation model) without any view at all while testing.</p>
<p>Some other relevant links that where in some way mentioned in my talk are listed below.</p>
<p>* &#8220;Active Record&#8221;:http://castleproject.org/activerecord/index.html is a productive way of setting up a data access layer.<br />
* &#8220;MonoRail&#8221;:http://castleproject.org/monorail/index.html is an MVC-based web framework for the .NET platform.<br />
* Finally, I mentioned the &#8220;Agile &ouml;resund&#8221;:http://mawi.org/agileoresund/ user group that &#8220;Marcus Widerberg&#8221;:http://mawi.org/ and I are starting up with some others. If you are interested in meeting quite informally to discuss agile topics, please take a look at the wiki.<br />
* And if you missed it in the text above, you can download <a href='http://www.hedgate.net/wp-content/uploads/snug-20061206.zip' title='the demos and presentation I gave in a zipped file'>the demos and presentation I gave in a zipped file</a>.</p>
<p>On behalf of myself and &#8220;SNUG&#8221;:http://www.snug.se/, I want to thank those who attended the meeting an hope to see you again at the next meeting which will be in February.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2006/12/08/testable-ui-code-presentation-at-snug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting the contents of a WPF RichTextBox</title>
		<link>http://www.hedgate.net/articles/2006/10/03/setting-the-contents-of-a-wpf-richtextbox/</link>
		<comments>http://www.hedgate.net/articles/2006/10/03/setting-the-contents-of-a-wpf-richtextbox/#comments</comments>
		<pubDate>Tue, 03 Oct 2006 07:46:42 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[In the project I am currently working on we are using Windows Presentation Foundation for building the GUI. This means there are a lot of new things to learn. Even the small things take some time when you do not know which of the new controls to use are what properties and methods to use [...]]]></description>
			<content:encoded><![CDATA[<p>In the project I am currently working on we are using Windows Presentation Foundation for building the GUI. This means there are a lot of new things to learn. Even the small things take some time when you do not know which of the new controls to use are what properties and methods to use on these. (Of course it does not help that Resharper 2.0 does not know anything about XAML).</p>
<p>One such problem that I just had was working with a RichTextBox. The application should contain a text box where the users can enter text, using all the standard functionality such as bold, italics etc, and this information (text and markup) should be stored in the database. This was not as straightforward as it used to be in .Net 2.0 (or earlier). Since I guess other people will likely want to do the same thing I am posting the code I wrote to do this.</p>
<pre name="code" class="c-sharp">
public string InputText
{
  get
  {
    string text = "";

    using(Stream stream = new MemoryStream())
    {
      TextRange contents = new TextRange(
        textBoxInputText.Document.ContentStart,
        textBoxInputText.Document.ContentEnd);

      contents.Save(stream, DataFormats.Xaml);

      stream.Position = 0;

      using(StreamReader reader = new StreamReader(stream))
      {
        text = reader.ReadToEnd();
      }
    }

    return text;
  }
  set
  {
    textBoxInputText.Document.Blocks.Clear();

    if(value != null &#038;&#038; value.Length > 0)
    {
      using(Stream stream = new MemoryStream(
        UTF8Encoding.Default.GetBytes(value)))
      {
        TextRange contents = new TextRange(
              textBoxInputText.Document.ContentStart,
              textBoxInputText.Document.ContentEnd);

        contents.Load(stream, DataFormats.Xaml);
      }
    }
  }
}
</pre>
<p>The property InputText is part of the view interface for this page in our Model-View-Presenter architecture. The presenter uses this property to show/collect the value in the model.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hedgate.net/articles/2006/10/03/setting-the-contents-of-a-wpf-richtextbox/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

