<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Haugerns Development Escapades</title>
	
	<link>http://www.haugern.net/blog</link>
	<description>Morten Haug on development and other curiosities</description>
	<lastBuildDate>Sun, 31 May 2009 21:56:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/DevelopmentEscapades" /><feedburner:info uri="developmentescapades" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>My preliminary NDC 2009 agenda</title>
		<link>http://feedproxy.google.com/~r/DevelopmentEscapades/~3/4VcyWn4Q7BQ/</link>
		<comments>http://www.haugern.net/blog/my-preliminary-ndc-2009-agenda/#comments</comments>
		<pubDate>Sun, 31 May 2009 21:54:00 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[learning]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/my-preliminary-ndc-2009-agenda/</guid>
		<description><![CDATA[Torbjørn Marø over at kjempekjekt.no has posted his personal agenda for NDC 2009, and thought it was a great idea. And like all great ideas, they are copied relentlessly.
Day 1
I have some favorites here, but some sessions have stronger competition than others.



10:15
Michael Feathers
Seven Blind Alleys in Software Design


11:30
Michael Feathers
Working Effectively with the Legacy Code: Taming [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.kjempekjekt.com/2009/05/26/min-ndc-2009-agenda/" target="_blank">Torbjørn Marø over at kjempekjekt.no has posted his personal agenda for NDC 2009</a>, and thought it was a great idea. And like all great ideas, they are copied relentlessly.</p>
<h3>Day 1</h3>
<p>I have some favorites here, but some sessions have stronger competition than others.</p>
<table cellspacing="0" cellpadding="2" width="568" border="0">
<tbody>
<tr>
<td valign="top" width="57">10:15</td>
<td valign="top" width="141">Michael Feathers</td>
<td valign="top" width="368">Seven Blind Alleys in Software Design</td>
</tr>
<tr>
<td valign="top" width="57">11:30</td>
<td valign="top" width="141">Michael Feathers</td>
<td valign="top" width="368">Working Effectively with the Legacy Code: Taming the Wild Code Base</td>
</tr>
<tr>
<td valign="top" width="57">13:30</td>
<td valign="top" width="141">Jeremy D. Miller</td>
<td valign="top" width="368">Lessons Learned from a Long Lived Codebase</td>
</tr>
<tr>
<td valign="top" width="57">14:45</td>
<td valign="top" width="141">Udi Dahan</td>
<td valign="top" width="368">Designing High Performance, Persistent Domain Models</td>
</tr>
<tr>
<td valign="top" width="57">16:00</td>
<td valign="top" width="141">Udi Dahan</td>
<td valign="top" width="368">Intentions and Interfaces – Making Patterns Complete</td>
</tr>
<tr>
<td valign="top" width="57">17:15</td>
<td valign="top" width="141">Michael Feathers</td>
<td valign="top" width="368">Design Sense Deep Lessons in Software Design</td>
</tr>
</tbody>
</table>
<h3>Day 2</h3>
<p>I have intentionally left a couple of spots blank, ‘cause I can’t make up my mind. And unfortunately it has more to do with lack of topics in those particular slots than the opposite.</p>
<table cellspacing="0" cellpadding="2" width="568" border="0">
<tbody>
<tr>
<td valign="top" width="57">09:10</td>
<td valign="top" width="142">Peter Provost</td>
<td valign="top" width="367">The Butterfly Effect</td>
</tr>
<tr>
<td valign="top" width="57">10:15</td>
<td valign="top" width="142">&#160;</td>
<td valign="top" width="367">&#160;</td>
</tr>
<tr>
<td valign="top" width="57">11:30</td>
<td valign="top" width="142">Ted Neward</td>
<td valign="top" width="367">Extend the Customization Possibilities of your .NET App with Script</td>
</tr>
<tr>
<td valign="top" width="57">13:30</td>
<td valign="top" width="142">Robert C. Martin</td>
<td valign="top" width="367">Clean Code: Functions</td>
</tr>
<tr>
<td valign="top" width="57">14:45</td>
<td valign="top" width="142">Ayende Rahien</td>
<td valign="top" width="367">Object Relational Mapping +=2: More than just Data &lt;-&gt; Object</td>
</tr>
<tr>
<td valign="top" width="57">16:00</td>
<td valign="top" width="142">&#160;</td>
<td valign="top" width="367">&#160;</td>
</tr>
<tr>
<td valign="top" width="57">17:15</td>
<td valign="top" width="142">Robert C. Martin</td>
<td valign="top" width="367">Clean Practice: Agility and Craftsmanship</td>
</tr>
</tbody>
</table>
<h3>Day 3</h3>
<p>Even though this has some of the most interesting talks, I can live with seeing them later on video. I just don’t want to miss an opportunity to sharpen my saw with Scott Bellware.</p>
<h3>Concluding thoughts</h3>
<p><a href="http://en.wikipedia.org/wiki/Helmuth_von_Moltke_the_Elder" target="_blank">Moltke</a> said “No battle plan survives contact with the enemy”. If I rephrase it just a little to “No plan survives contact with reality”, it will properly relay my feelings about my plan on this occasion.</p>
<p>There will probably changes in the official agenda, and I might be infatuated with a speaker or two during the conference. Looking at my list, I sway in the direction of technology-agnostic topics. That sounds about right.</p>
<p>But more important: I’ll see YOU there, won’t I?</p>
<img src="http://feeds.feedburner.com/~r/DevelopmentEscapades/~4/4VcyWn4Q7BQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/my-preliminary-ndc-2009-agenda/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.haugern.net/blog/my-preliminary-ndc-2009-agenda/</feedburner:origLink></item>
		<item>
		<title>I Have a Dream</title>
		<link>http://feedproxy.google.com/~r/DevelopmentEscapades/~3/0jz7mc-Yo9Y/</link>
		<comments>http://www.haugern.net/blog/i-have-a-dream/#comments</comments>
		<pubDate>Sun, 01 Feb 2009 19:52:35 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[best practice]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[learning]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/i-have-a-dream/</guid>
		<description><![CDATA[The usual suspects
Whenever I’m presenting anything, I try to start off showing the “Top 20 replies from a programmer when their programs doesn’t work”. In case you’ve never seen it, here it is:

It works on my machine. 
Where were you when the program blew up? 
Why do you want to do it that way? 
You [...]]]></description>
			<content:encoded><![CDATA[<h3>The usual suspects</h3>
<p>Whenever I’m presenting anything, I try to start off showing the “Top 20 replies from a programmer when their programs doesn’t work”. In case you’ve never seen it, here it is:</p>
<ol>
<li>It works on my machine. </li>
<li>Where were you when the program blew up? </li>
<li>Why do you want to do it that way? </li>
<li>You can’t use that version on your system. </li>
<li>Even though it doesn’t work, how does it feel? </li>
<li>Did you check for a virus on your system? </li>
<li>Somebody must have changed my code. </li>
<li>It works, but it hasn’t been tested. </li>
<li>THIS can’t be the source of THAT. </li>
<li>I can’t test everything! </li>
<li>It’s just some unlucky coincidence. </li>
<li>You must have the wrong version. </li>
<li>I haven’t touched that module in weeks! </li>
<li>There is something funky in your data. </li>
<li>What did you type in wrong to get it to crash? </li>
<li>It must be a hardware problem. </li>
<li>How is that possible? </li>
<li>It worked yesterday. </li>
<li>It’s never done that before. </li>
<li>That’s weird… </li>
</ol>
<p>I’m not quite sure who wrote it originally, but I was given a paper copy several years ago. I must admit I had a good laugh at the time, as I could relate to most of the replies.</p>
<p>So whenever I’m presenting this list, there’s a giggle and a great deal of nodding and smiling going on in the audience. Then I go on to present something that will alleviate one or more items in this list.</p>
<p><strong>But it’s not a laughing matter! It’s the sad state of our beloved profession we’re laughing at. It’s not supposed to be like this.</strong></p>
<h3>The Dream</h3>
<p>When I’m presenting the list in 10 years from now, there’s not a giggle. Not a smile. <strong>Just silent shame of times past or loud laughter at good ol’ days.</strong> Hopefully no one doesn’t even recognize the items on the list.</p>
<p>I might have a different kind of list. But not this one. We have made progress.</p>
<h3>What to do next</h3>
<p>So I propose this list as the metric for how mature your development organization is. Same rules apply as in <a href="http://naraku.net/2008/02/07/code-reviews-ala-wtf-metric/" target="_blank">the wtf code review metric</a>. Less is better. Drop the <a href="http://www.joelonsoftware.com/articles/fog0000000043.html" target="_blank">Joel test</a>. Drop the <a href="http://jeffsutherland.com/scrum/2008/08/nokia-test-where-did-it-come-from.html" target="_blank">Nokia test</a>. Drop test X. Use this. <strong>Now!</strong></p>
<p>The worst part of this is that most of these are solved problems. Test Driven Development, Continuous Integration, and Pair Programming have existed a decade. Their poorer, but still useful cousins, Unit Testing, Automatic Builds, and Code Reviews have been around the block even longer. Iterative and Incremental development, Miniature Milestones, and Review and Adapt has been grown ups for a while as well.</p>
<p><strong>So there is no excuse. The answers are at your doorstep. But it takes discipline. And time. </strong></p>
<p>But you’re not alone. I’m off trying to do my part. Our mission is clear. Will you do yours?</p>
<img src="http://feeds.feedburner.com/~r/DevelopmentEscapades/~4/0jz7mc-Yo9Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/i-have-a-dream/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.haugern.net/blog/i-have-a-dream/</feedburner:origLink></item>
		<item>
		<title>Happy New Year &amp; 2008 in the Rear-view Mirror</title>
		<link>http://feedproxy.google.com/~r/DevelopmentEscapades/~3/wZUjo4Lu9pA/</link>
		<comments>http://www.haugern.net/blog/happy-new-year-2008-in-the-rear-view-mirror/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 21:07:08 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[personal]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/happy-new-year-2008-in-the-rear-view-mirror/</guid>
		<description><![CDATA[A bit late but hopefully still good, a Happy New Year to you all! Resetting the DayOfYear-count always makes for a good time to look at what happened throughout the previous year. Here’s how 2007 went, and here is my 2008 timeline:
January
We encounter our first huge slowdown in the project as one person quits and [...]]]></description>
			<content:encoded><![CDATA[<p>A bit late but hopefully still good, a Happy New Year to you all! Resetting the DayOfYear-count always makes for a good time to look at what happened throughout the previous year. <a href="http://www.haugern.net/blog/what-happened-in-2007/" target="_blank">Here’s how 2007 went</a>, and here is my 2008 timeline:</p>
<h3>January</h3>
<p>We encounter our first huge slowdown in the project as one person quits and another is coming aboard. We’re still as a collective fumbling with regards to TDD and unit testing in general, especially when it comes to non-domain code aspects.</p>
<p>I’m getting more involved in company wide issues by the day, and I’m contributing to a couple of offers.</p>
<p>I turn 30 with no real fuzz. Just the way I wanted. I’m getting old, and I can spot a grey hair occasionally!</p>
<h3>February</h3>
<p>We’ve just ramped up a fourth developer when he slips away for other duties, and another one is coming on board on the project. Good thing we have a zero-friction developer install for our solution. We present the project for the whole division at our yearly kick-off.</p>
<p>We’re moving offices at work, moving across the street. At the same time we’re rearranging how we’re situated, and are now grouped by roles and projects rather than section.</p>
<p>I attend Software 2008, and <a href="http://www.haugern.net/blog/my-take-on-software-2008-the-agile-methods-in-practice-seminar/" target="_blank">I think it’s good</a>!</p>
<h3>March</h3>
<p>The project at work marches on, nothing spectacular happens.</p>
<p>Enjoying a nice week off during Easter.</p>
<h3>April</h3>
<p>Starting coordination work with another application vendor we’re integrating with our application. Integrations always seems to be a pain point, and it’s good to start early.</p>
<p>I’m summoned as a witness in a trial between an ex-colleague and ex-employer, and I’m clear and concise in my statements on the stand. It was certainly not a nice experience. The ex-colleague wins the case, which later has been anonymously cited nation-wide for it’s precedence in overtime payment.</p>
<p>My oldest son turns 4, how time flies…</p>
<h3>May</h3>
<p>A really quiet month, I guess I was incredibly productive <img src='http://www.haugern.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Oh, and I start this years outside maintenance and upgrading of the house.</p>
<h3>June</h3>
<p>The biggest thing this month was definitively <a href="http://www.haugern.net/blog/norwegian-developer-conference-2008-review/" target="_blank">Norwegian Developer Conference</a>. Two full days of great content, and it really catapulted me into the .NET community at another level.</p>
<h3>July</h3>
<p>I’m taking a 4 weeks back-to-back vacation for the first time ever. It was great, and I got to read a <a href="http://www.haugern.net/blog/bookshelf/" target="_blank">lot of great development books</a> on the beach.</p>
<h3>August</h3>
<p>Getting into the nitty-gritty details on the integration in our project. Reality is messy by nature. </p>
<p>Reflector is now in the hands of Red Gate. I great addition to their already awesome portfolio.</p>
<p>My youngest son celebrates his 2nd birthday.</p>
<h3>September</h3>
<p>The whole division at work travels to Rome for an extended weekend. I’ve never been there before, so it’s a great experience. Must return some day.</p>
<p>I’m kicking off internal presentations of techniques, practices, technology, and anything really developer related at work. We’ve arranged 7 meetings to date and have touched topics from Silverlight via F# to Design Patterns and Continuous Integration. A definitive success.</p>
<p>I’m attending an <a href="http://www.haugern.net/blog/msdn-live-with-steve-ballmer-keynote/" target="_blank">MSDN Live event in Oslo with Steve Ballmer</a>.</p>
<h3>October</h3>
<p><a href="http://www.smidig.no/smidig2008" target="_blank">Smidig 2008</a> is arranged, and I’m there. I sometimes wonder how far fetched my thoughts are about the <a href="http://en.wikipedia.org/wiki/Empty_set" target="_blank">intersection between the agile and the .NET community being Ø</a>… Come on, it’s enough agile to go around for everyone. Great lightning talks and even better open spaces. I especially enjoyed one on clean code, and another with technical debt. Thanks to the participants!</p>
<h3>November</h3>
<p>More people are starting to touch our fully integrated test installation of our new product, and <a href="http://www.haugern.net/blog/mystery-code-i-demystified/" target="_blank">we find</a> <a href="http://www.haugern.net/blog/mystery-code-i/" target="_blank">some strange bugs</a>.</p>
<p>Our team has been using <a href="http://www.jetbrains.com/resharper/index.html" target="_blank">ReSharper</a> a long time, and after a presentation of its capabilities to the division we’re overwhelmed with the interest. The end result is that we invest in another 20 licenses of this great product.</p>
<p>I’m attending a breakfast seminar with Bob Martin on FitNesse. I’m not completely sold on the idea though.</p>
<p>My better half turns 31. She’s still in the lead.</p>
<h3>December</h3>
<p>I’m attending a CSM course with Jeff Sutherland and become a Certified Scrum Master. It’s supposed to be a Next Step course, but I think there was a flawed filtering process as most did not have any experience doing Scrum. Some value was extracted however, in particular in the Q&amp;A sections.</p>
<p>We have an all around crappy Christmas, being ill most of the time.</p>
<img src="http://feeds.feedburner.com/~r/DevelopmentEscapades/~4/wZUjo4Lu9pA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/happy-new-year-2008-in-the-rear-view-mirror/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.haugern.net/blog/happy-new-year-2008-in-the-rear-view-mirror/</feedburner:origLink></item>
		<item>
		<title>Mystery Code I – Demystified</title>
		<link>http://feedproxy.google.com/~r/DevelopmentEscapades/~3/JtMU9cpDG9w/</link>
		<comments>http://www.haugern.net/blog/mystery-code-i-demystified/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 23:10:51 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[mystery code]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/mystery-code-i-demystified/</guid>
		<description><![CDATA[Either no one reads my blog or I didn’t present the problem good enough. The first is probably the safest bet. But here’s the answer anyway.
I made a small hint about it was run on a terminal (meaning I’m logged in as a user on a Windows Server with Terminal Services running (just to be [...]]]></description>
			<content:encoded><![CDATA[<p>Either no one reads my blog or I didn’t present the problem good enough. The first is probably the safest bet. But here’s the answer anyway.</p>
<p>I made a small hint about it was run on a terminal (meaning I’m logged in as a user on a Windows Server with Terminal Services running (just to be clear)). </p>
<h3>The Smells</h3>
<p>So lets look at what possible smells we can find in the code:</p>
<p><a href="http://www.haugern.net/blog/wp-content/image2.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="104" alt="image" src="http://www.haugern.net/blog/wp-content/image-thumb2.png" width="473" border="0" /></a> </p>
<p>That application specific GUID sure seems like it can be trouble.</p>
<p><a href="http://www.haugern.net/blog/wp-content/image3.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="104" alt="image" src="http://www.haugern.net/blog/wp-content/image-thumb3.png" width="456" border="0" /></a> </p>
</p>
<p>Hmm, the GUID is now used as the name for this Mutex. And now the last piece of the puzzle:</p>
<p><a href="http://www.haugern.net/blog/wp-content/image4.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="90" alt="image" src="http://www.haugern.net/blog/wp-content/image-thumb4.png" width="623" border="0" /></a> </p>
<p>Ok, this sure works when I’m sitting alone on my computer with my application, but what happens when multiple users on a terminal server tries to start the same application? </p>
<h3>The Problem</h3>
<p>Multiple <a href="http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeserverstream.aspx" target="_blank">NamedPipeServerStreams</a> with the same identifier will be tried made, and then you will get: <em>“IOException:&#160; All pipe instances are busy.”</em> But shouldn’t it stop at the Mutex before it tries to make the server? After all, the named Mutex is using the same GUID as identifier as well.</p>
<p><a href="http://www.haugern.net/blog/wp-content/image5.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="191" alt="image" src="http://www.haugern.net/blog/wp-content/image-thumb5.png" width="604" border="0" /></a> </p>
<p>It seems that the assumption that the Mutex and the named pipe operated on the same system level are flat out wrong. They don’t!<strong> </strong></p>
<p><strong><a href="http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx" target="_blank">Mutexes defaults to session locality when run on terminal services and named pipes does not!</a></strong></p>
<p>You can prefix your mutex identifier with Global\ to ensure a system wide lock even on a terminal services system, but this isn’t really what we want in this situation. We would really like all users to get a single instance each.</p>
<h3>The Solution</h3>
<p>With the problem identified, the solution was easy. We just incorporated the logged in username into the identifier, and everything was humming along.</p>
<p><em>Until next mystery, go solve some yourselves.</em></p>
<img src="http://feeds.feedburner.com/~r/DevelopmentEscapades/~4/JtMU9cpDG9w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/mystery-code-i-demystified/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.haugern.net/blog/mystery-code-i-demystified/</feedburner:origLink></item>
		<item>
		<title>Mystery Code I</title>
		<link>http://feedproxy.google.com/~r/DevelopmentEscapades/~3/YsSOHNLf9UM/</link>
		<comments>http://www.haugern.net/blog/mystery-code-i/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 20:50:23 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[mystery code]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/mystery-code-i/</guid>
		<description><![CDATA[There are a lot of ways to make sure your .NET Windows application just has one instance running, and we picked the one described here. It was working flawlessly until someone tried running it on a terminal where it crashed mysteriously.
What happened? Can you spot the error?
]]></description>
			<content:encoded><![CDATA[<p>There are a lot of ways to make sure your .NET Windows application just has one instance running, and we picked the <a href="http://www.flawlesscode.com/post/2008/02/Enforcing-single-instance-with-argument-passing.aspx" target="_blank">one described here</a>. It was working flawlessly until someone tried running it on a terminal where it crashed mysteriously.</p>
<p>What happened? Can you spot the error?</p>
<img src="http://feeds.feedburner.com/~r/DevelopmentEscapades/~4/YsSOHNLf9UM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/mystery-code-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.haugern.net/blog/mystery-code-i/</feedburner:origLink></item>
		<item>
		<title>ReSharper messes up your Visual Studio shortcuts</title>
		<link>http://feedproxy.google.com/~r/DevelopmentEscapades/~3/T6E9iDlLco0/</link>
		<comments>http://www.haugern.net/blog/resharper-messes-up-your-visual-studio-shortcuts/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 12:17:26 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[resharper]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/resharper-messes-up-your-visual-studio-shortcuts/</guid>
		<description><![CDATA[I must start stating I’m a huge fan of JetBrains’ ReSharper for Visual Studio, it certainly makes me more productive in my day-to-day coding tasks.
None the less, today I was just a little bit frustrated when upgrading from 4.0 to 4.1. I have a couple of custom shortcuts which I don’t mind retaining. But ReSharper [...]]]></description>
			<content:encoded><![CDATA[<p>I must start stating I’m a huge fan of <a href="http://www.jetbrains.com/resharper/index.html" target="_blank">JetBrains’ ReSharper for Visual Studio</a>, it certainly makes me more productive in my day-to-day coding tasks.</p>
<p>None the less, today I was just a little bit frustrated when upgrading from 4.0 to 4.1. I have a couple of custom shortcuts which I don’t mind retaining. But ReSharper happily overwrites it all with default settings, which was quite annoying. The least I’d expect would be a message telling me it would (or didn’t I read the setup correctly?) do it, and I’d happily save my settings and restore them after the upgrade.</p>
<p>I see that others have complained as well, and you will find <a href="http://intellij.net/forums/message.jspa?messageID=5221710" target="_blank">JetBrains official statement here</a>. MS &amp; JetBrains should really figure this out.</p>
<p>So if you’re upgrading ReSharper these days, please back up your VS-settings first!</p>
<img src="http://feeds.feedburner.com/~r/DevelopmentEscapades/~4/T6E9iDlLco0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/resharper-messes-up-your-visual-studio-shortcuts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.haugern.net/blog/resharper-messes-up-your-visual-studio-shortcuts/</feedburner:origLink></item>
		<item>
		<title>Beware of the IEnumerables</title>
		<link>http://feedproxy.google.com/~r/DevelopmentEscapades/~3/7yzMKlqFHOs/</link>
		<comments>http://www.haugern.net/blog/beware-of-the-ienumerables/#comments</comments>
		<pubDate>Fri, 17 Oct 2008 08:58:00 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[dotnet]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/beware-of-the-ienumerables/</guid>
		<description><![CDATA[Some time ago I wrote about the difference between List and Collection, and how you should use them. Usually you want to keep the details away from the users of your class, and an even tighter way to encapsulate a list of something is to expose IEnumerable&#60;T&#62;. Note that both IList&#60;T&#62; and ICollection&#60;T&#62; inherits this [...]]]></description>
			<content:encoded><![CDATA[<p>Some time ago I wrote about <a href="http://www.haugern.net/blog/net-collectiont-vs-listt/">the difference between List and Collection</a>, and how you should use them. Usually you want to keep the details away from the users of your class, and an even tighter way to encapsulate a list of something is to expose <a href="http://msdn.microsoft.com/en-us/library/9eekhta0.aspx" target="_blank">IEnumerable&lt;T&gt;</a>. Note that both IList&lt;T&gt; and ICollection&lt;T&gt; inherits this interface, so IEnumerable&lt;T&gt; exposes even less details to the user. Another benefit is now you can use <a href="http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx" target="_blank">yield</a> behind the scenes to create your “list” on the fly.</p>
<p>But this also its pitfall. What do you think will be the output of this code?</p>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red255\green255\blue255;\red0\green0\blue0;\red255\green128\blue0;\red128\green128\blue64;\red43\green145\blue175;\red0\green255\blue0;}??\fs24 \cf1\cb2\highlight2   \cf3 static\cf1  \cf3 void\cf1  \cf4 Main\cf1 (\cf3 string\cf1 [] \cf4 args\cf1 )\par ??  \{\par ??      \cf3 var\cf1  \cf4 ola\cf1  = \cf3 new\cf1  \cf5 Pupil\cf1 ()\{\cf4 Name\cf1 =\cf6 "Ola"\cf1 , \cf4 IsMate\cf1  = \cf3 false\cf1 \};\par ??      \cf3 var\cf1  \cf4 trond\cf1  = \cf3 new\cf1  \cf5 Pupil\cf1 () \{\cf4 Name\cf1  = \cf6 "Trond"\cf1 , \cf4 IsMate\cf1  = \cf3 true\cf1 \};\par ??      \cf3 var\cf1  \cf4 pupils\cf1  = \cf3 new\cf1  \cf5 List\cf1 &lt;\cf5 Pupil\cf1 &gt;()\{\cf4 ola\cf1 ,\cf4 trond\cf1 \};\par ??\par ??      \cf5 IEnumerable\cf1 &lt;\cf3 string\cf1 &gt; \cf4 names\cf1  = \cf4 ClassMateNames\cf1 (\cf4 pupils\cf1 );\par ??\par ??      \cf3 foreach\cf1  (\cf3 string\cf1  \cf4 name\cf1  \cf3 in\cf1  \cf4 names\cf1 )\par ??      \{\par ??          \cf5 Console\cf1 .\cf4 WriteLine\cf1 (\cf4 name\cf1 );\par ??      \}\par ??  \}\par ??\par ??  \cf3 private\cf1  \cf3 static\cf1  \cf5 IEnumerable\cf1 &lt;\cf3 string\cf1 &gt; \cf4 ClassMateNames\cf1 (\cf5 IEnumerable\cf1 &lt;\cf5 Pupil\cf1 &gt; \cf4 pupils\cf1 )\par ??  \{\par ??      \cf3 foreach\cf1  (\cf5 Pupil\cf1  \cf4 pupil\cf1  \cf3 in\cf1  \cf4 pupils\cf1 )\par ??      \{\par ??          \cf3 if\cf1  (\cf4 pupil\cf1 .\cf4 IsMate\cf1 )\par ??              \cf3 yield\cf1  \cf3 return\cf1  \cf4 pupil\cf1 .\cf4 Name\cf1 ;\par ??      \}\par ??  \}\par ??}<br />
--></p>
<div style="font-size: 8pt; background: black; color: white; font-family: consolas">
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 10</span>&#160;&#160; <span style="color: #ff8000">static</span> <span style="color: #ff8000">void</span> <span style="color: #808040">Main</span>(<span style="color: #ff8000">string</span>[] <span style="color: #808040">args</span>)</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 11</span>&#160;&#160; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 12</span>&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ff8000">var</span> <span style="color: #808040">ola</span> = <span style="color: #ff8000">new</span> <span style="color: #2b91af">Pupil</span>(){<span style="color: #808040">Name</span>=<span style="color: lime">&quot;Ola&quot;</span>, <span style="color: #808040">IsMate</span> = <span style="color: #ff8000">false</span>};</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 13</span>&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ff8000">var</span> <span style="color: #808040">trond</span> = <span style="color: #ff8000">new</span> <span style="color: #2b91af">Pupil</span>() {<span style="color: #808040">Name</span> = <span style="color: lime">&quot;Trond&quot;</span>, <span style="color: #808040">IsMate</span> = <span style="color: #ff8000">true</span>};</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 14</span>&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ff8000">var</span> <span style="color: #808040">pupils</span> = <span style="color: #ff8000">new</span> <span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">Pupil</span>&gt;(){<span style="color: #808040">ola</span>,<span style="color: #808040">trond</span>};</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 15</span>&#160;</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 16</span>&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #2b91af">IEnumerable</span>&lt;<span style="color: #ff8000">string</span>&gt; <span style="color: #808040">names</span> = <span style="color: #808040">ClassMateNames</span>(<span style="color: #808040">pupils</span>);</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 17</span>&#160;</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 18</span>&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ff8000">foreach</span> (<span style="color: #ff8000">string</span> <span style="color: #808040">name</span> <span style="color: #ff8000">in</span> <span style="color: #808040">names</span>)</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 19</span>&#160;&#160;&#160;&#160;&#160;&#160; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 20</span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #2b91af">Console</span>.<span style="color: #808040">WriteLine</span>(<span style="color: #808040">name</span>);</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 21</span>&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 22</span>&#160;&#160; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 23</span>&#160;</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 24</span>&#160;&#160; <span style="color: #ff8000">private</span> <span style="color: #ff8000">static</span> <span style="color: #2b91af">IEnumerable</span>&lt;<span style="color: #ff8000">string</span>&gt; <span style="color: #808040">ClassMateNames</span>(<span style="color: #2b91af">IEnumerable</span>&lt;<span style="color: #2b91af">Pupil</span>&gt; <span style="color: #808040">pupils</span>)</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 25</span>&#160;&#160; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 26</span>&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ff8000">foreach</span> (<span style="color: #2b91af">Pupil</span> <span style="color: #808040">pupil</span> <span style="color: #ff8000">in</span> <span style="color: #808040">pupils</span>)</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 27</span>&#160;&#160;&#160;&#160;&#160;&#160; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 28</span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ff8000">if</span> (<span style="color: #808040">pupil</span>.<span style="color: #808040">IsMate</span>)</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 29</span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ff8000">yield</span> <span style="color: #ff8000">return</span> <span style="color: #808040">pupil</span>.<span style="color: #808040">Name</span>;</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 30</span>&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 31</span>&#160;&#160; }</p>
</p></div>
<p>&#160;</p>
<p>Yes, you’re right, the output is my only friend “Trond”:</p>
<p><a href="http://www.haugern.net/blog/wp-content/image.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="118" alt="image" src="http://www.haugern.net/blog/wp-content/image-thumb.png" width="244" border="0" /></a> </p>
</p>
<p>But when are we really finding out who my friends are? The most natural thing is that I find them when I call <font face="Consolas">ClassMateNames</font>, as it is called first. That’s what I’d think anyway. But what if got in a fight with “Trond” between when I sort out my friends and list them to the console? </p>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red255\green255\blue255;\red0\green0\blue0;\red255\green128\blue0;\red128\green128\blue64;\red43\green145\blue175;}??\fs24 \cf1\cb2\highlight2   \cf3 private\cf1  \cf3 static\cf1  \cf3 void\cf1  \cf4 FightWith\cf1 (\cf5 Pupil\cf1  \cf4 pupil\cf1 )\par ??  \{\par ??      \cf4 pupil\cf1 .\cf4 IsMate\cf1  = \cf3 false\cf1 ;\par ??  \}\par ??}<br />
--></p>
<div style="font-size: 8pt; background: black; color: white; font-family: consolas">
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 35</span>&#160;&#160; <span style="color: #ff8000">private</span> <span style="color: #ff8000">static</span> <span style="color: #ff8000">void</span> <span style="color: #808040">FightWith</span>(<span style="color: #2b91af">Pupil</span> <span style="color: #808040">pupil</span>)</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 36</span>&#160;&#160; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 37</span>&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #808040">pupil</span>.<span style="color: #808040">IsMate</span> = <span style="color: #ff8000">false</span>;</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 38</span>&#160;&#160; }</p>
</p></div>
</p>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;\red255\green128\blue0;\red128\green128\blue64;}??\fs24 \cf1\cb2\highlight2   \cf3 IEnumerable\cf1 &lt;\cf4 string\cf1 &gt; \cf5 names\cf1  = \cf5 ClassMateNames\cf1 (\cf5 pupils\cf1 );\par ??\par ??  \cf5 FightWith\cf1 (\cf5 trond\cf1 );\par ??\par ??  \cf4 foreach\cf1  (\cf4 string\cf1  \cf5 name\cf1  \cf4 in\cf1  \cf5 names\cf1 )\par ??  \{\par ??      \cf3 Console\cf1 .\cf5 WriteLine\cf1 (\cf5 name\cf1 );\par ??  \}\par ??}<br />
--></p>
<div style="font-size: 8pt; background: black; color: white; font-family: consolas">
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 16</span>&#160;&#160; <span style="color: #2b91af">IEnumerable</span>&lt;<span style="color: #ff8000">string</span>&gt; <span style="color: #808040">names</span> = <span style="color: #808040">ClassMateNames</span>(<span style="color: #808040">pupils</span>);</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 17</span>&#160;</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 18</span>&#160;&#160; <span style="color: #808040">FightWith</span>(<span style="color: #808040">trond</span>);</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 19</span>&#160;</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 20</span>&#160;&#160; <span style="color: #ff8000">foreach</span> (<span style="color: #ff8000">string</span> <span style="color: #808040">name</span> <span style="color: #ff8000">in</span> <span style="color: #808040">names</span>)</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 21</span>&#160;&#160; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 22</span>&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #2b91af">Console</span>.<span style="color: #808040">WriteLine</span>(<span style="color: #808040">name</span>);</p>
<p style="margin: 0px"><span style="color: #2b91af">&#160;&#160; 23</span>&#160;&#160; }</p>
</p></div>
</p>
<p>This gives me these friends:</p>
<p><a href="http://www.haugern.net/blog/wp-content/image1.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="126" alt="image" src="http://www.haugern.net/blog/wp-content/image-thumb1.png" width="244" border="0" /></a> </p>
</p>
<p>How about that! The information that I no longer is friends with “Trond” has changed the list I thought I retrieved with the call to <font face="Consolas">ClassMateNames</font>. What is happening is called <a href="http://www.google.no/search?hl=no&amp;q=deferred+execution&amp;meta=" target="_blank">deferred execution</a>, which delays the actual execution of the <a href="http://blogs.msdn.com/oldnewthing/archive/2008/08/12/8849519.aspx" target="_blank">internals</a> in the <font face="Consolas">ClassMateNames</font> to when I iterate it. This is exactly how LINQ to [insert TLA here] operate as well, so nothing is actually fetched until you need it.</p>
<p>In my case this was an advantage, because at the time I was listing my friends, I didn’t actually have any!</p>
<h3>And the problem is?</h3>
<p>The problem starts when you before and/or after the call to <font face="Consolas">ClassMateNames</font> set up and tear down a session, connection, or anything that the inside of the iterator rely on. Any fetching of IEnumerables <a href="http://www.haugern.net/blog/using-the-using-statement-and-pattern-in-c/" target="_blank">inside using-blocks</a> should also be considered smells in this regard. If you should clear the list of pupils right after you have sent it to <font face="Consolas">ClassMateNames</font> (you don’t need it anymore right?), you have introduced a very subtle bug as the list is empty at execution.</p>
<p>The advice are thus: IEnumerables and yield is definitively great tools, but be aware of the inherent difficulties and quirks of deferred execution and use them with caution both as producer and consumer!</p>
<img src="http://feeds.feedburner.com/~r/DevelopmentEscapades/~4/7yzMKlqFHOs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/beware-of-the-ienumerables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.haugern.net/blog/beware-of-the-ienumerables/</feedburner:origLink></item>
		<item>
		<title>MSDN Live with Steve Ballmer keynote</title>
		<link>http://feedproxy.google.com/~r/DevelopmentEscapades/~3/3qLG9tANYxY/</link>
		<comments>http://www.haugern.net/blog/msdn-live-with-steve-ballmer-keynote/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 19:05:04 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[oo principles]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/msdn-live-with-steve-ballmer-keynote/</guid>
		<description><![CDATA[MSDN Live has toured Norway this fall, with a handful of presentations for .NET developers. I attended the last one in Oslo on Tuesday, where Steve Ballmer made the keynote!
Most developers have seen the developers, developers, developers talk, and we had high expectations for this keynote. He was quite enthusiastic in Oslo as well, telling [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.haugern.net/blog/wp-content/windowslivewritermsdnlivewithsteveballmerkeynote-115e2ballmer-2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="254" alt="ballmer" src="http://www.haugern.net/blog/wp-content/windowslivewritermsdnlivewithsteveballmerkeynote-115e2ballmer-thumb.jpg" width="263" align="left" border="0" /></a>MSDN Live has toured Norway this fall, with a handful of presentations for .NET developers. I attended the last one in Oslo on Tuesday, where Steve Ballmer made the keynote!</p>
<p>Most developers have seen the <a href="http://www.youtube.com/watch?v=KMU0tzLwhbE">developers, developers, developers</a> talk, and we had high expectations for this keynote. He was quite enthusiastic in Oslo as well, telling us about things he thinks will influence our industry in the foreseeable future. <a href="http://www.youtube.com/results?search_query=ballmer+oslo&amp;search_type=&amp;aq=f">This search at Youtube seems to find the whole show</a>.</p>
<p>The rest of the day I attended the main track, starting out with a Silverlight 2 presentation from <a href="http://blog.goeran.no/">G&#248;ran Hansen</a>. While Silverlight 1 was mostly about animations and media, I didn&#8217;t give much attention. But the second version looks promising, with the CLR and a subset of the .NET libraries present. What I miss though, is maybe some background about the fact that running .NET WinForms applications in IE in object-tags has been possible a long time (without the automatic deployment of the framework). Props however to MS for finally supporting more than Windows &amp; IE only! G&#248;ran did a great job presenting, I really enjoyed his presence on stage.</p>
<p>Next up was another presentation from G&#248;ran, which gave the audience an introduction to <a href="http://msdn.microsoft.com/en-us/library/cc488545.aspx">ASP.NET Dynamic Data</a>. For those of us who attended <a href="http://www.haugern.net/blog/norwegian-developer-conference-2008-review/">NDC2008</a> and <a href="http://www.hanselman.com/blog/">Scott Hanselmans</a> keynote there, it was plain repetition. The only difference might be that this was showing the final bits released with SP1 of the framework, and Scott showing us some earlier version. It seems like a great technology to get you up and running very quick, but I wonder how many pages you end up with in the CustomPage directory after a while. Even though the topic didn&#8217;t tickle my fancy, G&#248;ran did a great job on this one as well.</p>
<p>Then it was time for lunch, rather late according to my stomach. But it tasted good, and there seemed to be enough to fill up all us starving geeks. As always during the breaks, old colleagues and friends sneak up on you and says hello. Which I really do appreciate!</p>
<p>After the break, <a href="http://andersnoras.com/blogs/anoras/default.aspx">Anders Nor&#229;s</a> gave a talk about SOA. More specifically about how we should start thinking along the lines of <a href="http://en.wikipedia.org/wiki/Enterprise_Service_Bus">enterprise service buses</a> and leave our old crusty webservices in the dust. I really do concur with a lot his ideas, and I&#8217;m always happy to see code with binsor-love. I also liked his onion-architecture, which resembles my standard layered architecture (no, not the &quot;standard standard&quot;). Hmmm, looks like another blog post (again).</p>
<p>&quot;Debugging your debugging habits&quot; was up next with Rune Zakariassen from Microsoft. He showed us some tips &amp; tricks for your debugging needs in Visual Studio, and presented a step-by-step recipe on how you best can find bugs in your code. I thought it was a nice presentation, even though my only real takeaway was the tracepoint functionality in VS. I&#8217;ve been a sucker for Debug.Writeline when I don&#8217;t want to impact the run of things stepping through, but this gives me an even less intrusive way keeping track of how the program executes.</p>
<p>Finally, G&#248;ran entered the stage for the last time this day. He showed us how WPF databinding can be used with a variant of Model-View-Presenter called Presentation Model. The emphasis was really on this pattern, and how it helps attain <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">SoC</a>. He also mentioned <a href="http://en.wikipedia.org/wiki/Dependency_inversion_principle">DIP</a> with the short version &quot;Program to an interface, not an implementation&quot;. A good thing can&#8217;t be said enough so here is the original:</p>
<blockquote><p>High level modules should not depend upon low level modules. Both should depend upon abstractions.</p>
<p>Abstractions should not depend upon details. Details should depend upon abstractions.</p>
</blockquote>
<p>All things considered, yet another great talk from G&#248;ran, keep up the good work and preach on about those design patterns and OO principles!</p>
<p>Yet again, great work by <a href="http://blogs.msdn.com/grothaug/default.aspx">Rune @ Microsoft</a> arranging this event. Until next time, I&#8217;m on twitter at <a href="http://twitter.com/haugern">http://twitter.com/haugern</a>.</p>
<img src="http://feeds.feedburner.com/~r/DevelopmentEscapades/~4/3qLG9tANYxY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/msdn-live-with-steve-ballmer-keynote/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.haugern.net/blog/msdn-live-with-steve-ballmer-keynote/</feedburner:origLink></item>
		<item>
		<title>Late to the Twitter-game</title>
		<link>http://feedproxy.google.com/~r/DevelopmentEscapades/~3/DTQnc2BT9Kg/</link>
		<comments>http://www.haugern.net/blog/late-to-the-twitter-game/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 18:47:37 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[internet]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/late-to-the-twitter-game/</guid>
		<description><![CDATA[I&#8217;ve finally caved in and created a Twitter-account today, you can follow me at http://twitter.com/haugern!

]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve finally caved in and created a Twitter-account today, you can follow me at <a href="http://twitter.com/haugern">http://twitter.com/haugern</a>!</p>
<p><a href="http://twitter.com"><img src="https://assets1.twitter.com/images/twitter_logo_s.png" /></a></p>
<img src="http://feeds.feedburner.com/~r/DevelopmentEscapades/~4/DTQnc2BT9Kg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/late-to-the-twitter-game/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.haugern.net/blog/late-to-the-twitter-game/</feedburner:origLink></item>
		<item>
		<title>Introducing my Bookshelf</title>
		<link>http://feedproxy.google.com/~r/DevelopmentEscapades/~3/OXH6AhATRBo/</link>
		<comments>http://www.haugern.net/blog/introducing-my-bookshelf/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 22:12:51 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[books]]></category>
		<category><![CDATA[learning]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/introducing-my-bookshelf/</guid>
		<description><![CDATA[I have for a long time been very up front with everything I was aware of I didn&#8217;t know much about. As a countermeasure and a late follow up to Sources of Software Development learning (About Me), I&#8217;ve listed some books I&#8217;ve got in my bookshelf in my home office.
Let it be your starting point [...]]]></description>
			<content:encoded><![CDATA[<p>I have for a long time been very up front with everything I was aware of <a href="http://www.haugern.net/blog/list-of-my-known-unknowns/">I didn&#8217;t know much about</a>. As a countermeasure and a late follow up to <a href="http://www.haugern.net/blog/sources-for-software-development-resources-about-me/">Sources of Software Development learning (About Me)</a>, I&#8217;ve listed some books I&#8217;ve got in my <a href="http://www.haugern.net/blog/bookshelf/">bookshelf</a> in my home office.</p>
<p>Let it be your starting point into the great resource of reading books. Blogs are great, but books really are in a different league when it comes to polish, hard facts, and references. I really find it a lot easier to get immersed in a topic when reading from a book than from my screen, and of course you have the added bonus of being offline while reading.</p>
<p>Amazon is your allied (especially now when the $ is really cheap for us Norwegians); go make your book order today!</p>
<img src="http://feeds.feedburner.com/~r/DevelopmentEscapades/~4/OXH6AhATRBo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/introducing-my-bookshelf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.haugern.net/blog/introducing-my-bookshelf/</feedburner:origLink></item>
	</channel>
</rss>
