<?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:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Mendelt Siebenga</title>
    <description>converting caffeine to code since 1976</description>
    <link>http://mendeltsiebenga.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.5.0.7</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://mendeltsiebenga.com/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Mendelt Siebenga</dc:creator>
    <dc:title>Mendelt Siebenga</dc:title>
    <geo:lat>5,201,496.000000</geo:lat>
    <geo:long>435,062.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/MendeltSiebenga" type="application/rss+xml" /><item>
      <title>Agile architecture part II, SOLID or YAGNI?</title>
      <description>&lt;p&gt;In a previous post about agile architecture I reasoned why big design up front isn’t a good solution to the problem of handling complexity in software. The best solution is architecting your application to avoid complexity as much as possible. At the end of the post I suggested reducing complexity by not implementing anything you don’t need right now. This principle is well known as YAGNI, short for You Aint Gonna Need It. Don’t implement anything you don’t need now. This will keep complexity down making it simpler to extend when you do need it. There’s another solutions to handling complexity though. You can reduce complexity by modularization. In software engineering we’ve got the SOLID principles for this. Unfortunately the SOLID principles seem to go against what YAGNI tells us. They tell us to add interfaces, separate out our dependencies and add all kinds of structures to our code that we don’t need just yet. So what’s it going to be SOLID or YAGNI?&lt;/p&gt;  &lt;p&gt;The idea is actually quite simple. Lets look at a purely theoretical piece of software consisting of one component that can have ten states. Now we want to implement a new feature that will cause our piece of software to double in size. You’d think it would double in complexity too but you’d be wrong. When we add a similar component with ten states the total amount of states isn’t 10 + 10 = 20 but 10 * 10 = 100. So instead of doubling the complexity we’ve squared it. This is why spaghetti software will get unmaintainable really fast when size increases.&lt;/p&gt;  &lt;p&gt;What we can do to contain this complexity is by separating our software into components or modules. If we construct our software so that we can reason about it’s parts instead of the whole thing we can still fit it in our heads. We don’t need to look at all the 100 states in the previous example when we can the software as separate modules or components. Then we only need to reason about the separate parts and the thin interfaces where they touch each other.&lt;/p&gt;  &lt;p&gt;This is where SOLID comes in. I won’t get into the details of the SOLID principles here. Just &lt;a href="http://www.bing.com/search?q=Solid+principles&amp;amp;go=&amp;amp;form=QBLH&amp;amp;filt=all"&gt;bing&lt;/a&gt; them and you’ll find enough hits to explain them. But they give us guidelines on how to partition our software, hiding complexity behind well-defined interfaces and separating components so we can handle them by themselves giving us the ability to handle each part of our code as if it was alone in the world.&lt;/p&gt;  &lt;p&gt;So I think we can use them both YAGNI does not tell us to refrain from adding lines of code we’re not going to need. YAGNI tells us not to add complexity we don’t need. SOLID is about removing complexity by separating out components.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BycRXsGtB0VdGJdeeTEe9CwoXG8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BycRXsGtB0VdGJdeeTEe9CwoXG8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BycRXsGtB0VdGJdeeTEe9CwoXG8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BycRXsGtB0VdGJdeeTEe9CwoXG8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MendeltSiebenga/~4/sfEN5rqipog" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/MendeltSiebenga/~3/sfEN5rqipog/post.aspx</link>
      <author>Mendelt</author>
      <comments>http://mendeltsiebenga.com/post/Agile-architecture-part-II-SOLID-or-YAGNI.aspx#comment</comments>
      <guid isPermaLink="false">http://mendeltsiebenga.com/post.aspx?id=e88523b8-af86-46ea-b62f-48348cdaef59</guid>
      <pubDate>Wed, 15 Jul 2009 21:07:58 +0200</pubDate>
      <dc:publisher>Mendelt</dc:publisher>
      <pingback:server>http://mendeltsiebenga.com/pingback.axd</pingback:server>
      <pingback:target>http://mendeltsiebenga.com/post.aspx?id=e88523b8-af86-46ea-b62f-48348cdaef59</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://mendeltsiebenga.com/trackback.axd?id=e88523b8-af86-46ea-b62f-48348cdaef59</trackback:ping>
      <wfw:comment>http://mendeltsiebenga.com/post/Agile-architecture-part-II-SOLID-or-YAGNI.aspx#comment</wfw:comment>
      <wfw:commentRss>http://mendeltsiebenga.com/syndication.axd?post=e88523b8-af86-46ea-b62f-48348cdaef59</wfw:commentRss>
    <feedburner:origLink>http://mendeltsiebenga.com/post.aspx?id=e88523b8-af86-46ea-b62f-48348cdaef59</feedburner:origLink></item>
    <item>
      <title>Using .Net 3.5 features in BlogEngine.Net widgets</title>
      <description>&lt;p&gt;I’m getting quite used to C# 3.0 and .Net 3.5 features. So it took some getting used to not being able to use ‘var’ and linq-to-objects when writing the ‘My book-pick’ widget for BlogEngine.Net you see on the right. Eventually I just gave up and hacked the Web.Config. It turned out to be really easy to switch BlogEngine.Net to C# 3.0.&lt;/p&gt;  &lt;p&gt;First you have to set the compiler for the code-behind to .Net 3.5 (somehow the version numbers for .Net 3.5 and C# 3.0 are a bit mixed up, just ignore this and use the code I’m using here) You do this by adding this section to your web.config.&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;system.codedom&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;compilers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;compiler&lt;/span&gt; &lt;span style="color: #ff0000"&gt;language&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;c#;cs;csharp&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;extension&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;.cs&amp;quot;&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;             &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Microsoft.CSharp.CSharpCodeProvider,System, &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;             Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&amp;quot;&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;             &lt;span style="color: #ff0000"&gt;warningLevel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;4&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;providerOption&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;CompilerVersion&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;v3.5&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;providerOption&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;WarnAsError&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;compiler&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;compilers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;system.codedom&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;You need to add this just inside the &amp;lt;configuration&amp;gt; tag.&lt;/p&gt;

&lt;p&gt;Now you’ll be allowed to use ‘var’ keywords and auto-properties. But of course we won’t stop until we have extension methods and linq.&lt;/p&gt;

&lt;p&gt;Actually this is quite easy. Just add a reference to System.Code by adding this key to the &amp;lt;assemblies&amp;gt; section in &amp;lt;system.web&amp;gt;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;assembly&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Have fun coding your widget!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VYK2q4RyMgDv3n0YvJ2X0w34A18/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VYK2q4RyMgDv3n0YvJ2X0w34A18/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VYK2q4RyMgDv3n0YvJ2X0w34A18/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VYK2q4RyMgDv3n0YvJ2X0w34A18/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MendeltSiebenga/~4/78S6M_pOMk4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/MendeltSiebenga/~3/78S6M_pOMk4/post.aspx</link>
      <author>Mendelt</author>
      <comments>http://mendeltsiebenga.com/post/Using-Net-35-features-in-BlogEngineNet-widgets.aspx#comment</comments>
      <guid isPermaLink="false">http://mendeltsiebenga.com/post.aspx?id=4d91af41-8c7f-473d-985a-e7cf15676a1f</guid>
      <pubDate>Tue, 30 Jun 2009 21:12:30 +0200</pubDate>
      <dc:publisher>Mendelt</dc:publisher>
      <pingback:server>http://mendeltsiebenga.com/pingback.axd</pingback:server>
      <pingback:target>http://mendeltsiebenga.com/post.aspx?id=4d91af41-8c7f-473d-985a-e7cf15676a1f</pingback:target>
      <slash:comments>8</slash:comments>
      <trackback:ping>http://mendeltsiebenga.com/trackback.axd?id=4d91af41-8c7f-473d-985a-e7cf15676a1f</trackback:ping>
      <wfw:comment>http://mendeltsiebenga.com/post/Using-Net-35-features-in-BlogEngineNet-widgets.aspx#comment</wfw:comment>
      <wfw:commentRss>http://mendeltsiebenga.com/syndication.axd?post=4d91af41-8c7f-473d-985a-e7cf15676a1f</wfw:commentRss>
    <feedburner:origLink>http://mendeltsiebenga.com/post.aspx?id=4d91af41-8c7f-473d-985a-e7cf15676a1f</feedburner:origLink></item>
    <item>
      <title>Agile architecture, embrace change through reduced complexity</title>
      <description>&lt;p&gt;Software development can sometimes be very counterintuitive. For example, when people started building larger software systems halfway through the last century one of the things they discovered was that changing existing software is often far more difficult and error prone than building new software. Most developers rediscover this somewhere in their first year of being a professional developer. They start out with a new project and as time goes by changes start taking more and more time, this can be very hard to explain to a client and usually we don’t until we get completely stuck and tell the client we need to start from scratch. I think this practice has been responsible for most of the bad reputation software development has.&lt;/p&gt;  &lt;p&gt;So if changing software is such a hard thing to do we just have to do things right from the beginning. Analyze all requirements the client could ever have, make a design that incorporates all those requirements and then build that, this way we should never have to change anything. Sounds like a great plan but there are three things that make this quite impossible. Clients, stupid programmers and the rest of the world.&lt;/p&gt;  &lt;p&gt;First of all clients don’t know what they want. It seems like I’m just trying to shift blame away from developers like me but I’m not. This is just a fact we have to deal with in our profession. Clients are not omniscient. They learn during a project and learning makes them change their mind. Of course there are ways to make sure clients don’t do silly things like this. You can spend more time doing requirements studies so they have a chance to change their mind before we start building or we can write everything down in big contracts so clients aren't allowed to change their mind anymore.&lt;/p&gt;  &lt;p&gt;But then we encounter our next hurdle, stupid programmers. See, now I’m laying blame directly at our own feet. Programmers aren’t omniscient either. When you ask them to design a system they will make mistakes. The bigger the system the more mistakes. And most of these mistakes will only show up once you’ve built the system, meaning you have to change the system and we didn’t want to do that. Of course there’s an easy solution for this. You don’t let developers design the system anymore. You’ve got architects for that, they’re easy to find, they live in ivory towers.&lt;/p&gt;  &lt;p&gt;So now you’ve spent a year creating the best requirements. Your architects have created a bulletproof design, you can now safely build your system right? Well no. Now you’ve got the real world to contend with. And it changes too.&lt;/p&gt;  &lt;p&gt;I think we can safely conclude that resisting change isn’t a solution for our problems. Agile methodologies acknowledge that fact. Agile tells us to embrace change. But how do we make sure our software doesn’t make us regret this? We need to architect our software to embrace change too. Instead of going to around the problem like we used to do we need to get to the bottom of it and eliminate it from our software.&lt;/p&gt;  &lt;p&gt;But how do you architect software to be changeable? Well this is another counterintuitive aspect of software engineering. In other engineering practices we have to contend with natural laws that constrain what we do. In structural engineering gravity is a big constraint. When you want to be flexible you build bigger foundations. In electrical engineering Ohm’s law is a constraint, so when you want to be flexible there you build in bigger cooling fins and more powerful power supplies. Software engineering is different in this aspect. Our main concern is complexity so preparing for change by over dimensioning your foundations will only work against you, you’re only making your software more complex, that will not help you fight complexity.&lt;/p&gt;  &lt;p&gt;An agile architect will always go for simplicity. Do the simplest thing that will actually work, don't build things you’re not sure you’ll need. Keep responsibilities separated and abstract away everything.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zfc6uJkF_hmKS24oPGBGuafxEvg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zfc6uJkF_hmKS24oPGBGuafxEvg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zfc6uJkF_hmKS24oPGBGuafxEvg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zfc6uJkF_hmKS24oPGBGuafxEvg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MendeltSiebenga/~4/r57lKFR_NJA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/MendeltSiebenga/~3/r57lKFR_NJA/post.aspx</link>
      <author>Mendelt</author>
      <comments>http://mendeltsiebenga.com/post/Agile-architecture-embrace-change-through-reduced-complexity.aspx#comment</comments>
      <guid isPermaLink="false">http://mendeltsiebenga.com/post.aspx?id=42c1602a-2053-4cbb-b02d-074f0ffcb6fd</guid>
      <pubDate>Sat, 27 Jun 2009 16:33:06 +0200</pubDate>
      <dc:publisher>Mendelt</dc:publisher>
      <pingback:server>http://mendeltsiebenga.com/pingback.axd</pingback:server>
      <pingback:target>http://mendeltsiebenga.com/post.aspx?id=42c1602a-2053-4cbb-b02d-074f0ffcb6fd</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://mendeltsiebenga.com/trackback.axd?id=42c1602a-2053-4cbb-b02d-074f0ffcb6fd</trackback:ping>
      <wfw:comment>http://mendeltsiebenga.com/post/Agile-architecture-embrace-change-through-reduced-complexity.aspx#comment</wfw:comment>
      <wfw:commentRss>http://mendeltsiebenga.com/syndication.axd?post=42c1602a-2053-4cbb-b02d-074f0ffcb6fd</wfw:commentRss>
    <feedburner:origLink>http://mendeltsiebenga.com/post.aspx?id=42c1602a-2053-4cbb-b02d-074f0ffcb6fd</feedburner:origLink></item>
    <item>
      <title>A good old fashioned flame war</title>
      <description>&lt;p&gt;In the good old days of dial up connections and Usenet I used to enjoy a&lt;a href="http://mendeltsiebenga.com/image.axd?picture=flamewar.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="flamewar" src="http://mendeltsiebenga.com/image.axd?picture=flamewar_thumb.jpg" border="0" alt="flamewar" width="259" height="208" align="right" /&gt;&lt;/a&gt; good flame war now and then. I&amp;rsquo;m not really a flame war kind of guy. I get distracted far too&amp;nbsp; easy to really commit myself to consistently flaming my enemies. And I&amp;rsquo;m bad at remembering names so in an online-world where you don&amp;rsquo;t see faces I usually forget who I&amp;rsquo;m supposed to flame anyway. But other people&amp;rsquo;s flame wars can be really entertaining.&lt;/p&gt;
&lt;p&gt;But it seems people are slowly adapting to the way they interact online. Modern media are great for flaming but somehow I see less and less of that. You still see occasional blogosphere drama and occasionally fanboy X bashes platform Y. But that&amp;rsquo;s about it. Most people have found out that the best way to deal with trolls is to ignore them. And so people seem to find middle ground far easier. Like they should &amp;hellip; in most cases.&lt;/p&gt;
&lt;p&gt;People seem more and more inclined to compromise. And usually this is a good thing. Most discussions end when people agree that both points of view have their merit. Apple vs. Microsoft? Both have their sweet spot. Scrum vs. Kanban? Same there, althoug both sides seem to think their sweet spot is bigger. I&amp;rsquo;ve seen people discuss Agile vs. Waterfall and come to the conclusion that both have their place&amp;hellip; what? wait a minute? &amp;hellip;Waterfall? &amp;hellip;Really?&lt;/p&gt;
&lt;p&gt;I want to take stand right here. I never saw waterfall work! ever!&lt;/p&gt;
&lt;p&gt;What I did see were teams that claimed to do waterfall but where actually iterating and changing requirements on the spot. Not because they didn&amp;rsquo;t want to do waterfall but because it didn&amp;rsquo;t fit their way of working. Usually this meant that after every &amp;lsquo;phase&amp;rsquo; most of the documentation created was filed away and when people actually got to implementation the developers did whatever had to be done to get the job done, instead of following the outdated design.&lt;/p&gt;
&lt;p&gt;Sometimes teams of exceptionally good developers did succeed. Not because of waterfall but in spite of it. The reason they got work done was usually because they did something resembling agile when they finally got to writing code. But without the practices to support evolving and changing requirements like TDD and fixed iteration lengths this is very hard to do.&lt;/p&gt;
&lt;p&gt;Most of the time developers weren&amp;rsquo;t that good, quality went downhill as they tried to evolve the code and eventually the project was cancelled.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m prepared to seek a middle ground on many subjects but when I hear something I know is wrong expect to see flames.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HiC9nJ0HIwdHwpcqaETDLui_C4c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HiC9nJ0HIwdHwpcqaETDLui_C4c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HiC9nJ0HIwdHwpcqaETDLui_C4c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HiC9nJ0HIwdHwpcqaETDLui_C4c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MendeltSiebenga/~4/gUkf-nFuouI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/MendeltSiebenga/~3/gUkf-nFuouI/post.aspx</link>
      <author>Mendelt</author>
      <comments>http://mendeltsiebenga.com/post/A-good-old-fashioned-flame-war.aspx#comment</comments>
      <guid isPermaLink="false">http://mendeltsiebenga.com/post.aspx?id=ae7ebb01-7a48-40a8-a9a6-6bd040e2851d</guid>
      <pubDate>Wed, 17 Jun 2009 20:50:00 +0200</pubDate>
      <dc:publisher>Mendelt</dc:publisher>
      <pingback:server>http://mendeltsiebenga.com/pingback.axd</pingback:server>
      <pingback:target>http://mendeltsiebenga.com/post.aspx?id=ae7ebb01-7a48-40a8-a9a6-6bd040e2851d</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://mendeltsiebenga.com/trackback.axd?id=ae7ebb01-7a48-40a8-a9a6-6bd040e2851d</trackback:ping>
      <wfw:comment>http://mendeltsiebenga.com/post/A-good-old-fashioned-flame-war.aspx#comment</wfw:comment>
      <wfw:commentRss>http://mendeltsiebenga.com/syndication.axd?post=ae7ebb01-7a48-40a8-a9a6-6bd040e2851d</wfw:commentRss>
    <feedburner:origLink>http://mendeltsiebenga.com/post.aspx?id=ae7ebb01-7a48-40a8-a9a6-6bd040e2851d</feedburner:origLink></item>
    <item>
      <title>Where’s my MVC nested Master Page?</title>
      <description>&lt;p&gt;The first thing I actually missed from Webforms are nested masterpages. Fortunately they’re not missing at all, they just figured out those MVC guys (and galls) like code so much, they don’t need no stinkin’ templates for something as trivial as this. And of course we don’t. Here’s how to roll your own.&lt;/p&gt;  &lt;p&gt;Masterpages are a great way to keep your webpages DRY. Repeating layout/markup/header stuff goes into the masterpage. This is great until you create a bigger site with more than one masterpage. Suddenly you’re repeating code between masterpages. So we go up one more level. We make a masterpage for the masterpages. Yes it’s tortoises all the way down.&lt;/p&gt;  &lt;p&gt;We start with two normal masterpages. Master.Master and Child.Master. I’ve always been good in coming up with original names. They’ll both look a bit like this:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="background-color: #ffff00"&gt;&amp;lt;%@ Master Language=&amp;quot;C#&amp;quot; Inherits=&amp;quot;System.Web.Mvc.ViewMasterPage&amp;quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #800000"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color: #ff0000"&gt;html&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PUBLIC&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:ContentPlaceHolder&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;TitleContent&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:ContentPlaceHolder&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;MainContent&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div&gt;Now we want Master.Master to look exactly like this. And we want Child.Master to look exactly like this but add “Child – “ before the title and we want the content of the child in VERY BIG LETTERS, so we’ll put a &amp;lt;h1&amp;gt; &amp;lt;/h1&amp;gt; tag pair around the ‘MainContent’ contentplaceholder. I wanted to use &amp;lt;blink&amp;gt;, my favorite tag but it’s not supported anymore.&lt;/div&gt;

&lt;p&gt;Of course we can just add all this to Child.Master and be done with it but we want to re-use the Master.Master code. So lets use Master.Master as a masterpage. This works just the way you’d expect. You just add a ‘MasterPageFile’ attribute to the Master tag and use ‘asp:Content’ tags to fill in the contentplaceholders. The big difference with content-pages is that you nest asp:ContentPlaceHolder tags inside the content. These can be filled in later by your pages. This is how your Child.Master will look.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="background-color: #ffff00"&gt;&amp;lt;%@ Master MasterPageFile=&amp;quot;~/Views/Shared/Master.Master&amp;quot; Language=&amp;quot;C#&amp;quot; Inherits=&amp;quot;System.Web.Mvc.ViewMasterPage&amp;quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Content&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;TitleContent&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;MainContent&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     Child - &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:ContentPlaceHolder&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;ContentPlaceHolder1&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Content&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;MainContent&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;MainContent&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;h1&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:ContentPlaceHolder&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;MainContent&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;h1&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Have fun!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/koriNXK_sCxAMtXXpdUzlpVXFqc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/koriNXK_sCxAMtXXpdUzlpVXFqc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/koriNXK_sCxAMtXXpdUzlpVXFqc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/koriNXK_sCxAMtXXpdUzlpVXFqc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MendeltSiebenga/~4/uPP6ZVM--M8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/MendeltSiebenga/~3/uPP6ZVM--M8/post.aspx</link>
      <author>Mendelt</author>
      <comments>http://mendeltsiebenga.com/post/Wheree28099s-my-MVC-nested-Master-Page.aspx#comment</comments>
      <guid isPermaLink="false">http://mendeltsiebenga.com/post.aspx?id=b1e29086-396b-4f18-8267-b0d815c9c1b8</guid>
      <pubDate>Wed, 17 Jun 2009 19:50:02 +0200</pubDate>
      <dc:publisher>Mendelt</dc:publisher>
      <pingback:server>http://mendeltsiebenga.com/pingback.axd</pingback:server>
      <pingback:target>http://mendeltsiebenga.com/post.aspx?id=b1e29086-396b-4f18-8267-b0d815c9c1b8</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://mendeltsiebenga.com/trackback.axd?id=b1e29086-396b-4f18-8267-b0d815c9c1b8</trackback:ping>
      <wfw:comment>http://mendeltsiebenga.com/post/Wheree28099s-my-MVC-nested-Master-Page.aspx#comment</wfw:comment>
      <wfw:commentRss>http://mendeltsiebenga.com/syndication.axd?post=b1e29086-396b-4f18-8267-b0d815c9c1b8</wfw:commentRss>
    <feedburner:origLink>http://mendeltsiebenga.com/post.aspx?id=b1e29086-396b-4f18-8267-b0d815c9c1b8</feedburner:origLink></item>
    <item>
      <title>ASP.Net MVC … Wow!</title>
      <description>&lt;p&gt;I’ve been very happy on the windows programming side. I used to do web-programming but frankly ASP.Net webforms spoiled that for me. Agreed… it’s very good for quickly setting up administrative websites that run inside the firewall. It has all the right abstractions for that allowing you to quickly piece together CRUD stuff without worrying about state, postbacks, javascript or even HTML. But when you want to build fun websites that look good and are designed to run on the big bad web these abstractions start to work against you.&lt;/p&gt;  &lt;p&gt;Lately I’ve been getting a bit restless though. I needed to learn some new stuff. Frankly my job is boring, they’ve got me maintaining and supporting some C++ MFC application *yawn* so time to get back into web programming. Enter MVC!&lt;/p&gt;  &lt;p&gt;Agreed, this is nothing new. Every other platform has had it’s web MVC framework for ages, even .Net has had monorail. But for me it’s new. And completely cool!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The architecture&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I’ve been working with all kinds of UI patterns on the windows side. MVP, MVC, MVVM and so on hold no secrets for me but the web variant of MVC is a bit different for me. The whole routing thing took some getting used to, the controllers/view interaction is very simple compared to the windows world and I had to do some reading to get an IoC container working. But other than that the programming model is beautiful. No complicated page lifecycles but still every bit as extendable as we’re used to.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Testability&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In webforms I had a whole bag of tricks to make things testable. Eventually I got some sort of MVP model working where I abstracted away all the page logic to a presenter object that was running behind the page. But the way pages behaved with controls throwing events all over the place this wasn’t as easy as it should have been. You had to be very keen on testing to go this route. In MVC things are the other way around. You have to try very hard to put logic in your views, although I have seen people manage this. Controllers are testable by default and everything is mockable. Great stuff for a TDD junkie like me.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Control&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In webforms I had all but given up on javascript. The controls you put on the page had their own idea about what javascript should run and you had to fight with these to ajaxify your pages. In MVC you have much more control over how your pages look in HTML. This also makes it very easy to add javascript. I’ve even ordered my first jQuery book.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What am I building?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Wouldn’t you like to know? Right now the project I’m working on is still in the proof of concept phase. I’m trying to get some basic functionality working. If I’m more sure about the possibilities I’ll put a first version online. But that probably won’t be until the end of this year. But you can expect a lot of MVC posts from me in the future.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/l3bl67V6isHbm7pl_3SDWwfAAa8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l3bl67V6isHbm7pl_3SDWwfAAa8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/l3bl67V6isHbm7pl_3SDWwfAAa8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l3bl67V6isHbm7pl_3SDWwfAAa8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MendeltSiebenga/~4/j61-1CaY8S0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/MendeltSiebenga/~3/j61-1CaY8S0/post.aspx</link>
      <author>Mendelt</author>
      <comments>http://mendeltsiebenga.com/post/ASPNet-MVC-e280a6-Wow!.aspx#comment</comments>
      <guid isPermaLink="false">http://mendeltsiebenga.com/post.aspx?id=7c12cd87-3b10-46ff-bd4f-09e7762c4d49</guid>
      <pubDate>Mon, 15 Jun 2009 22:39:41 +0200</pubDate>
      <dc:publisher>Mendelt</dc:publisher>
      <pingback:server>http://mendeltsiebenga.com/pingback.axd</pingback:server>
      <pingback:target>http://mendeltsiebenga.com/post.aspx?id=7c12cd87-3b10-46ff-bd4f-09e7762c4d49</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://mendeltsiebenga.com/trackback.axd?id=7c12cd87-3b10-46ff-bd4f-09e7762c4d49</trackback:ping>
      <wfw:comment>http://mendeltsiebenga.com/post/ASPNet-MVC-e280a6-Wow!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://mendeltsiebenga.com/syndication.axd?post=7c12cd87-3b10-46ff-bd4f-09e7762c4d49</wfw:commentRss>
    <feedburner:origLink>http://mendeltsiebenga.com/post.aspx?id=7c12cd87-3b10-46ff-bd4f-09e7762c4d49</feedburner:origLink></item>
    <item>
      <title>Looking back at Open Space</title>
      <description>&lt;p&gt;Last weekend I helped organize the &lt;a href="http://openspacecode.nl/"&gt;Dutch Open Space Code Day&lt;/a&gt;. This wasn’t the first open space event I’ve been to but it was the first one where I was involved in the organization. Kees Dijk and me got the idea from the &lt;a href="http://openspacecode.com"&gt;UK Open Space Code&lt;/a&gt; days that are organized by Alan Dean. And with some help from &lt;a href="http://www.imtech.eu/nl/ict"&gt;Imtech ICT&lt;/a&gt;, who kindly provided space, coffee and lunch, we got going.&lt;/p&gt;  &lt;p&gt;So what did we do all day?&lt;/p&gt;  &lt;p&gt;After a short introduction we started the planning phase. This is typical of open space, there are no scheduled speakers, all the scheduling &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="IMG_1761" border="0" alt="IMG_1761" align="right" src="http://mendeltsiebenga.com/image.axd?picture=IMG_1761.jpg" width="244" height="164" /&gt;is done at the start of the first day. Attendees propose sessions themselves, everyone votes to see what sessions are most popular. Then sessions are shuffled around to fit the available time and space. The schedule stays fluid for the rest of the event but most of the planning is done right at the start.&lt;/p&gt;  &lt;p&gt;I can imagine this is a nervous moment for most open space organizers. What if no-one wants to propose a session? We had nothing to worry about in this respect. Many of the attendees were accomplished speakers on other conferences and I was confident they would also step up here. I wasn’t disappointed. On the right is what the schedule looked like after a couple of minutes proposing sessions.&lt;/p&gt;  &lt;p&gt;After the sessions were voted on, combined and thinned out a bit we got going. Subjects ranged from Silverlight to DDD and design by contract, all interesting stuff. The first round of sessions started a bit late. So after only an hour it was already lunch time.&lt;/p&gt;  &lt;p&gt;Most people just ate lunch while continuing the morning sessions. We had plenty of time planned for lunch so after about an hour people started coming back to the main room to get some coffee and get ready for another round of sessions. The afternoon round of sessions went by just as fast as the morning sessions.&lt;/p&gt;  &lt;p&gt;On the whole I can say the day was a success. I had some worries that there were too many high-profile speakers attending and that this would kill the interactive nature of open-space but this just didn’t seem to be a problem. A couple of things could go better. People didn’t really seem inclined to move from session to session. Normally this is a mechanism in open space that ensures attendees get the most out of the sessions and sessions that are less interesting die out. In this case the quality of content in all the sessions was very high so there wasn’t much need for people to move between sessions.&lt;/p&gt;  &lt;p&gt;The focus of Open Space Code is supposed to be on coding. This never got off the ground. Most people had laptops and some code examples were shown but at the end of the day no code was checked in to the Google Code repository that was provided for this day. This probably had to do with the fact that people had to specifically ask to get access to the repository. Next time we’ll try to streamline this process by providing access to a version control system beforehand. This way people can prepare code samples before the event.&lt;/p&gt;  &lt;p&gt;I also got some suggestions to make the sessions a bit shorter next year. This time we had two sessions of two hours each to give people enough time to actually do some coding. Next time we’ll probably do three 1,5 sessions instead. This might fit in better with lunch too.&lt;/p&gt;  &lt;p&gt;All in all the day was a big success. I’m really looking forward to my next open space event.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eZUOEeogUpLT1yy9WprOyWvyjuI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eZUOEeogUpLT1yy9WprOyWvyjuI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eZUOEeogUpLT1yy9WprOyWvyjuI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eZUOEeogUpLT1yy9WprOyWvyjuI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MendeltSiebenga/~4/1nVjvMYdKUk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/MendeltSiebenga/~3/1nVjvMYdKUk/post.aspx</link>
      <author>Mendelt</author>
      <comments>http://mendeltsiebenga.com/post/Looking-back-at-Open-Space.aspx#comment</comments>
      <guid isPermaLink="false">http://mendeltsiebenga.com/post.aspx?id=ac0c635b-7291-40a5-8d54-ff89dcee6422</guid>
      <pubDate>Sun, 14 Jun 2009 12:45:07 +0200</pubDate>
      <dc:publisher>Mendelt</dc:publisher>
      <pingback:server>http://mendeltsiebenga.com/pingback.axd</pingback:server>
      <pingback:target>http://mendeltsiebenga.com/post.aspx?id=ac0c635b-7291-40a5-8d54-ff89dcee6422</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://mendeltsiebenga.com/trackback.axd?id=ac0c635b-7291-40a5-8d54-ff89dcee6422</trackback:ping>
      <wfw:comment>http://mendeltsiebenga.com/post/Looking-back-at-Open-Space.aspx#comment</wfw:comment>
      <wfw:commentRss>http://mendeltsiebenga.com/syndication.axd?post=ac0c635b-7291-40a5-8d54-ff89dcee6422</wfw:commentRss>
    <feedburner:origLink>http://mendeltsiebenga.com/post.aspx?id=ac0c635b-7291-40a5-8d54-ff89dcee6422</feedburner:origLink></item>
    <item>
      <title>Pomodoro</title>
      <description>&lt;p&gt;
I finally gave up and went with the hype. I admit it, I bought my first piece of Apple hardware. It wasn&amp;rsquo;t even as expensive as I thought it would be and its shiny. I always had a soft spot for brushed stainless steel. 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="width: 164px; display: inline; height: 177px; margin-left: 0px; margin-right: 0px; border-width: 0px" src="http://mendeltsiebenga.com/image.axd?picture=WindowsLiveWriter/Newhardware/1767156C/IMG_1746_thumb.jpg" border="0" alt="IMG_1746" title="IMG_1746" width="164" height="177" align="right" /&gt;Here it is, my first piece of Apple hardware. 
&lt;/p&gt;
&lt;p&gt;
So why am I blogging about a kitchen utensil you might ask? Well, actually this fruity piece of stainless steel is a productivity enhancer. Let me explain. 
&lt;/p&gt;
&lt;p&gt;
Focusing your work is often hard. And many tasks, like programming, need focus. Lots has been written about how interruptions from telephones, coworkers or managers will ruin productivity. But there&amp;rsquo;s a dirty little secret here. Even when you leave them alone most programmers are perfectly capable of interrupting their own work. They read blogs, have a chat at the coffee machine or read email. Having some time to wind down between work is of course good but but only when you&amp;rsquo;re able to do focused work in between those distractions. 
&lt;/p&gt;
&lt;p&gt;
Part of the problem is that our expectations about ourselves are too high. We expect ourselves to be able to do hours and hours of work. In exceptional circumstances this is possible, when you get into the mythical state of &amp;lsquo;flow&amp;rsquo; time just flies by and todo-lists shrink at an alarming rate. But in most circumstances you need short periods to rest your mind in between work. The trick is to keep those rest-periods short and to really focus during work. 
&lt;/p&gt;
&lt;p&gt;
Enter the pomodoro. Or in my case a stainless steel apple-timer. 
&lt;/p&gt;
&lt;p&gt;
The idea comes from &lt;a href="http://cirillosscrapbook.wordpress.com/"&gt;Francesco Cirillo&lt;/a&gt; who had the same problem us programmers have when studying. Days of study would fly by but when he looked back at what he accomplished during those study he was usually underwhelmed. In order to improve matters he used a tomato shaped kitchen-timer to keep an eye on time. He lives in Italy where a tomato is called a pomodoro and so the pomodoro technique was born. 
&lt;/p&gt;
&lt;p&gt;
Francesco realized he needed to do things to be able to focus, time his work-periods and rest-periods and write them down to be able to see if he improved. The technique is actually really simple, just simple enough to work. 
&lt;/p&gt;
&lt;p&gt;
The first thing is to achieve focus. You can do this by splitting up your time into periods of focussed work with rest-periods in between. The pomodoro technique uses 25 minute work-periods with 5 minute rest-stops in between. After 4 of these you get a longer rest-period. 
&lt;/p&gt;
&lt;p&gt;
To make sure you know what you need to do in these periods you need to keep a couple of simple lists. First you need to make a to-do list of the tasks you plan to do during the day. Just write down several tasks on a piece of paper. Set your timer to 25 minutes and start working. When the timer rings you mark a successful pomodoro and take a 5 minute break, you can talk to a colleague go to the bathroom. 
&lt;/p&gt;
&lt;p&gt;
The real trick is dealing with interruptions. Normally this is the hard part. Most interruptions can&amp;rsquo;t be delayed indefinitely. But because your pomodoro is only 25 minutes long you &lt;em&gt;can&lt;/em&gt; often delay interruptions till the next break. Write it down, mark an interruption and continue the pomodoro. 
&lt;/p&gt;
&lt;p&gt;
If you want to know more about this check out these resources 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://cirillosscrapbook.wordpress.com/"&gt;Francesco Cirillo&amp;rsquo;s site&lt;/a&gt; &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.pomodorotechnique.com/"&gt;His book about the technique&lt;/a&gt; &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.staffannoteberg.com/"&gt;Staffan Noteberg&amp;rsquo;s blog&lt;/a&gt; &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.pomodoro-book.com/"&gt;Staffan Noteberg&amp;rsquo;s book&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/k5F7fV_Yb5hkmy59WvEyjdedy4M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k5F7fV_Yb5hkmy59WvEyjdedy4M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/k5F7fV_Yb5hkmy59WvEyjdedy4M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k5F7fV_Yb5hkmy59WvEyjdedy4M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MendeltSiebenga/~4/ZwyBw691hHw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/MendeltSiebenga/~3/ZwyBw691hHw/post.aspx</link>
      <author>Mendelt</author>
      <comments>http://mendeltsiebenga.com/post/Pomodoro.aspx#comment</comments>
      <guid isPermaLink="false">http://mendeltsiebenga.com/post.aspx?id=5dafb828-bc36-4624-8992-3763c5923518</guid>
      <pubDate>Sat, 30 May 2009 19:04:00 +0200</pubDate>
      <dc:publisher>Mendelt</dc:publisher>
      <pingback:server>http://mendeltsiebenga.com/pingback.axd</pingback:server>
      <pingback:target>http://mendeltsiebenga.com/post.aspx?id=5dafb828-bc36-4624-8992-3763c5923518</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://mendeltsiebenga.com/trackback.axd?id=5dafb828-bc36-4624-8992-3763c5923518</trackback:ping>
      <wfw:comment>http://mendeltsiebenga.com/post/Pomodoro.aspx#comment</wfw:comment>
      <wfw:commentRss>http://mendeltsiebenga.com/syndication.axd?post=5dafb828-bc36-4624-8992-3763c5923518</wfw:commentRss>
    <feedburner:origLink>http://mendeltsiebenga.com/post.aspx?id=5dafb828-bc36-4624-8992-3763c5923518</feedburner:origLink></item>
    <item>
      <title>Also available on …</title>
      <description>&lt;p&gt;Last week while I was on vacation and out of reach of any internet-connection my &lt;a href="http://agilesoftwaredevelopment.com/blog/mendelt/value-big-design-front" target="_blank"&gt;first article&lt;/a&gt; on &lt;a href="http://www.agilesoftwaredevelopment.com"&gt;www.agilesoftwaredevelopment.com&lt;/a&gt; was published. I’m pretty proud Artem, the owner of the site, asked me to contribute. It’s a great opportunity to learn from and give back to the great community Artem gathered around this site. &lt;/p&gt;  &lt;p&gt;I’ll be posting an article there every two weeks, of course that doesn’t mean I won’t still be posting here. My blog-posts here will be mainly focussed on tech and .Net programming while my articles on &lt;a href="http://www.agilesoftwaredevelopment.com"&gt;www.agilesoftwaredevelopment.com&lt;/a&gt; will be focussed on .. well .. agile software development. I’m writing agile with a lower-case ‘a’ here on purpose. I’m not a manager but a software engineer, I’ll be writing about agile from an engineering perspective, and of course occasionally about the management aspects of agile when I think managers get it wrong. I like to think engineers are more down to earth than managers and don’t need upper-case buzzwords.&lt;/p&gt;  &lt;p&gt;So everyone please come visit me on &lt;a href="http://www.agilesoftwaredevelopment.com"&gt;www.agilesoftwaredevelopment.com&lt;/a&gt; when you’re interested in my agile ramblings and visit me here for the down to earth tech stuff!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TR2NMTcoX7_0R2VNX4uBDUACm1I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TR2NMTcoX7_0R2VNX4uBDUACm1I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TR2NMTcoX7_0R2VNX4uBDUACm1I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TR2NMTcoX7_0R2VNX4uBDUACm1I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MendeltSiebenga/~4/SMAdHaq4bdA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/MendeltSiebenga/~3/SMAdHaq4bdA/post.aspx</link>
      <author>Mendelt</author>
      <comments>http://mendeltsiebenga.com/post/Also-available-on-e280a6.aspx#comment</comments>
      <guid isPermaLink="false">http://mendeltsiebenga.com/post.aspx?id=5a754d53-507e-460e-abd2-a0ca73db21ec</guid>
      <pubDate>Sat, 02 May 2009 22:51:44 +0200</pubDate>
      <dc:publisher>Mendelt</dc:publisher>
      <pingback:server>http://mendeltsiebenga.com/pingback.axd</pingback:server>
      <pingback:target>http://mendeltsiebenga.com/post.aspx?id=5a754d53-507e-460e-abd2-a0ca73db21ec</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://mendeltsiebenga.com/trackback.axd?id=5a754d53-507e-460e-abd2-a0ca73db21ec</trackback:ping>
      <wfw:comment>http://mendeltsiebenga.com/post/Also-available-on-e280a6.aspx#comment</wfw:comment>
      <wfw:commentRss>http://mendeltsiebenga.com/syndication.axd?post=5a754d53-507e-460e-abd2-a0ca73db21ec</wfw:commentRss>
    <feedburner:origLink>http://mendeltsiebenga.com/post.aspx?id=5a754d53-507e-460e-abd2-a0ca73db21ec</feedburner:origLink></item>
    <item>
      <title>Looking for an IoC container in several wrong places</title>
      <description>&lt;p&gt;I’ve been using Castle Windsor for some time now. The way I use it is probably non-standard and that’s why its proving quite hard to find an alternative for it. So I decided to download a a nice selection from &lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselmans&lt;/a&gt; &lt;a href="http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx"&gt;list&lt;/a&gt;of IoC containers and give them a go.&lt;/p&gt;  &lt;p&gt;First let me explain why I’m looking for an alternative when Castle Windsor is clearly one of the most used and most capable IoC containers out there. Its actually quite simple. The last official Castle release was in 2007 and that was only a release candidate for version 1.0. An official version 1 has never been released. For me personally that’s no problem. The project is still being worked on, new features are being added and its easy to pick up the latest version from the SVN trunk, build it and use it. There are even &lt;a href="http://www.castleproject.org/castle/projects.html"&gt;new releases&lt;/a&gt; planned. But its a hard sell to use it in commercial projects. I need something that’s mature and visibly supported. Shouldn’t be too hard right?&lt;/p&gt;  &lt;p&gt;There is one feature I would like to have in my new IoC container and that’s the IInitializable or something that can take it’s place. Let me explain.&lt;/p&gt;  &lt;p&gt;Most getting-started guides on dependency injection and IoC the first thing they show you is how to do constructor injection. Constructor injection is very powerful because your component is never half-initialized. It always has all its dependencies set. But I like property injection better, for the simple reason that property injection gives me more flexible code. Changing around dependencies is easier because I don’t have to rewrite all the tests where I still call constructors explicitly. In order to still be able to do some initialization after all dependencies are set in my component I made extensive use of Castle’s IInitializable. This is an interface that specifies one method: Initialize() and Castle guaranteed it to be called after the components dependencies were set.&lt;/p&gt;  &lt;p&gt;So the search begins:&lt;/p&gt;  &lt;p&gt;But first a disclaimer. I’m not claiming one IoC container is better than another, I’m just looking for an IoC container to support one non-standard usage scenario.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Unity&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is where I started looking. Unity is a Microsoft product. Its supported by the Patterns and Practices team so support is more or less guaranteed (unless they pull a “Linq to SQL” and drop it in favor of its bigger brother, MEF) It should be an easy sell. Unfortunately its not really mature yet and for instance doesn’t support my initialization scenario.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Spring.Net&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Spring.Net actually gave me the biggest surprise. It works quite differently from what I’ve come to expect of IoC containers. Instead of mapping Interface-types to classes it maps string-keys to classes. Auto-wiring is harder this way. In most cases you have to explicitly specify dependencies between components. No go there. And that’s unfortunate because it seems Spring.Net has the best support for my initialization scenario I’ve seen yet. No need for interfaces. Spring.Net just calls Start() on any component that has that method. This is a nice example of convention over configuration.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Autofac&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Ah, thats more like it. Autofac supports my initialization scenario. Not in one but in two ways. You can specify an OnActivating eventhandler when registering a component or you can use the Autofac.Contrib.Startable module. Neither way is as clean as Spring.Net’s Start() method or even Castle’s IInitializable. But they will do. Autofac.Contrib.Startable is not ideal because it forces you to start all components at registration time, normally components are initialized lazilly when they are needed. The eventhandler scenario forces you to write eventhandlers to call the startup-routines.&lt;/p&gt;  &lt;p&gt;Other than that Autofac seems to be just what I need. It has a nice and simple ‘DSL’ for configuring the contianer. It doesn’t have all the bells and whistles Castle has but it has bells and whistles I might actually use like ASP.Net MVC integration.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Structuremap&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Last but not least is StructureMap. StructureMap and Autofac are on par when it comes to features. StructureMaps DSL for configuring the container is a bit more extensive. For me this is a good thing. Configuring setup of components can be done with a lambda expression, this is a bit easier than the event-handlers used with Autofac. But other than that the DSL seems a bit contrived in places.&lt;/p&gt;  &lt;p&gt;I’ll probably try both Structuremap and Autofac for a while. All IoC containers have similar features and differences are quite subtle. Right now I lean towards Autofac for it’s simpler configuration although Structuremap seems to support the one usage-scenario I thought up a bit better.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Y_A5Lb1Y9P2tw5HmTo6SUR3OMjA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Y_A5Lb1Y9P2tw5HmTo6SUR3OMjA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Y_A5Lb1Y9P2tw5HmTo6SUR3OMjA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Y_A5Lb1Y9P2tw5HmTo6SUR3OMjA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MendeltSiebenga/~4/YIPhWwiIB6g" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/MendeltSiebenga/~3/YIPhWwiIB6g/post.aspx</link>
      <author>Mendelt</author>
      <comments>http://mendeltsiebenga.com/post/Looking-for-an-IoC-container-in-several-wrong-places.aspx#comment</comments>
      <guid isPermaLink="false">http://mendeltsiebenga.com/post.aspx?id=bb9c0939-eb51-4f8c-9f81-c2fc829962d5</guid>
      <pubDate>Tue, 21 Apr 2009 00:02:56 +0200</pubDate>
      <dc:publisher>Mendelt</dc:publisher>
      <pingback:server>http://mendeltsiebenga.com/pingback.axd</pingback:server>
      <pingback:target>http://mendeltsiebenga.com/post.aspx?id=bb9c0939-eb51-4f8c-9f81-c2fc829962d5</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://mendeltsiebenga.com/trackback.axd?id=bb9c0939-eb51-4f8c-9f81-c2fc829962d5</trackback:ping>
      <wfw:comment>http://mendeltsiebenga.com/post/Looking-for-an-IoC-container-in-several-wrong-places.aspx#comment</wfw:comment>
      <wfw:commentRss>http://mendeltsiebenga.com/syndication.axd?post=bb9c0939-eb51-4f8c-9f81-c2fc829962d5</wfw:commentRss>
    <feedburner:origLink>http://mendeltsiebenga.com/post.aspx?id=bb9c0939-eb51-4f8c-9f81-c2fc829962d5</feedburner:origLink></item>
  </channel>
</rss>
