<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" 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:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Opinion</title>
        <link>http://blog.colinmackay.net/category/4.aspx</link>
        <description>Opinionated posts</description>
        <language>en-GB</language>
        <copyright>Colin Angus Mackay</copyright>
        <managingEditor>colin.mackay@gmail.com</managingEditor>
        <generator>Subtext Version 1.9.0.27</generator>
        <item>
            <title>Crazy Extension Methods Redux (with Oxygene)</title>
            <link>http://blog.colinmackay.net/archive/2008/08/07/3260.aspx</link>
            <description>&lt;p&gt;Back in April I blogged about a &lt;a href="http://blog.colinmackay.net/archive/2008/04/16/2253.aspx" target="_blank"&gt;crazy thing you can do with extension methods in C#3.0&lt;/a&gt;. At the time I was adamant that it was a bad idea. I still think it is a bad idea, however, my thoughts have evolved a little since then and I have, possibly a solution to my hesitance to use said crazy feature.&lt;/p&gt;  &lt;p&gt;So, if you can't be bothered to click the link, here is a quick recap. You can create an extension method and call it on a null reference and it will NOT throw a &lt;strong&gt;NullReferenceException&lt;/strong&gt; like a real method call would. At the time I was saying it was not best practice because it breaks the semantics of the &lt;a href="http://msdn.microsoft.com/en-gb/library/6zhxzbds.aspx" target="_blank"&gt;dot operator&lt;/a&gt; which is used for member access.&lt;/p&gt;  &lt;p&gt;Last night, I attended an excellent talk by Barry Carr on &lt;a href="http://www.remobjects.com/product/?id={DC0A9947-5FED-4D34-8CC8-F2DCFA87A1FE}" target="_blank"&gt;Oxygene&lt;/a&gt;, an Object Pascal based language that targets the .NET Framework. Oxygene has a very interesting feature, it has a special operator for dealing with calls on a reference that might be null. If that language can do it, what's so wrong with the functionality that Extension methods potentially give? Semantics. Notice that I said that Oxygene has "a special operator". It doesn't use the dot operator. The dot operator still breaks if the reference is null. It has a &lt;a href="http://wiki.remobjects.com/wiki/Colon_Operator" target="_blank"&gt;colon operator&lt;/a&gt;. In this case if the reference is null (or nil as it is called in Oxygene) then the call to the method doesn't happen. No exception is thrown.&lt;/p&gt;  &lt;p&gt;For example. Here is the code with the regular dot operator:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;strong&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;A&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;b&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;W&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="str"&gt;'The string length is {0}'&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g.L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;And the result is that the &lt;strong&gt;NullReferenceException&lt;/strong&gt; is thrown:&lt;/p&gt;

&lt;p&gt;&lt;a title="NullReferenceException by Colin  Angus Mackay, on Flickr" href="http://www.flickr.com/photos/colinangusmackay/2741458987/"&gt;&lt;img height="333" alt="NullReferenceException" src="http://farm3.static.flickr.com/2233/2741458987_8e2a47474a_o.png" width="894" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the code with the colon operator:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;strong&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;A&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;b&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;W&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="str"&gt;'The string length is {0}'&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;And the result is that the program works, it just didn't call the property Length as there was nothing to call it on:&lt;/p&gt;

&lt;p&gt;&lt;a title="Result by Colin  Angus Mackay, on Flickr" href="http://www.flickr.com/photos/colinangusmackay/2742296104/"&gt;&lt;img height="363" alt="Result" src="http://farm4.static.flickr.com/3019/2742296104_c42882aee0_o.png" width="702" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point I really would like to show you what this looks like in Reflector to show you what is going on under the hood, however, I get a message that says "This item is obfuscated and can not be translated" and the code afterwards isn't quite right. However, the crux of it is like this in C#:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;int? length;
    &lt;br /&gt;if (myString != null)

    &lt;br /&gt;    length = myString.Length;

    &lt;br /&gt;Console.WriteLine("The string length is {0}", length);&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, back to these extension methods. After seeing this I was thinking that perhaps my total unacceptablity of allowing a null reference to be used with an extension method was perhaps incorrect. In a normal situation with an accidental null reference exception being used the &lt;strong&gt;NullReferenceException&lt;/strong&gt; wouldn't be thrown at the point of the method call (after all, the null reference is actually being passed in as the first parameter in an extension method), but somewhere in the method itself. Normal good practice would place a guard block at the start of the method so that it would be caught immediately.&lt;/p&gt;

&lt;p&gt;However, what if you wanted to create similar functionality to the colon operator in Oxygene and have it ignore the null reference and do nothing? Well, my advice would be to create a naming convention for your extension methods to show that null references will be ignored. That way you can get the functionality with a slight semantic fudge of the dot operator. Of course, you still have to do the work and set up guard blocks to handle the null situation yourself in the extension method.&lt;/p&gt;

&lt;p&gt;Here's an example:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;P&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;[&lt;span class="kwrd"&gt;&lt;/span&gt;]&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;W&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="str"&gt;"The string length is {0}"&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;N&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;b&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;E&lt;span class="kwrd"&gt;&lt;/span&gt;x&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;?&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;N&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;b&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f636dd39-cbf7-49f5-acba-d8eae1c060a7" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/extension%20methods" rel="tag"&gt;extension methods&lt;/a&gt;,&lt;a href="http://technorati.com/tags/dot%20operator" rel="tag"&gt;dot operator&lt;/a&gt;,&lt;a href="http://technorati.com/tags/colon%20operator" rel="tag"&gt;colon operator&lt;/a&gt;,&lt;a href="http://technorati.com/tags/c#" rel="tag"&gt;c#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/oxygene" rel="tag"&gt;oxygene&lt;/a&gt;,&lt;a href="http://technorati.com/tags/semantics" rel="tag"&gt;semantics&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3260.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/08/07/3260.aspx</guid>
            <pubDate>Thu, 07 Aug 2008 20:45:07 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3260.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/08/07/3260.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3260.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Oxygene talk in Dundee</title>
            <link>http://blog.colinmackay.net/archive/2008/08/07/3257.aspx</link>
            <description>&lt;p&gt;Last night's talk in Dundee on &lt;a href="http://www.remobjects.com/product/?id={DC0A9947-5FED-4D34-8CC8-F2DCFA87A1FE}" target="_blank"&gt;Oxygene&lt;/a&gt; was excellent.&lt;/p&gt;  &lt;p&gt;My journey up was a little fraught as an accident on the A80 meant that it took me 1h15m to travel the 20 miles from Glasgow to Stirling. By that point was running late and had 45 minutes to cover the last 55 miles. In the end I arrive 15 minutes late, but that was okay because they hadn't actually started yet.&lt;/p&gt;  &lt;p&gt;The journey back afterwards was a bit hellish too because the rain was coming down hard and the M80 between Cumbernauld and Stirling doesn't seem to be able to drain water quickly enough. Even reducing my speed I was aquaplaning every few hundred metres.&lt;/p&gt;  &lt;p&gt;Anyway, &lt;a href="http://www.remobjects.com/product/?id={DC0A9947-5FED-4D34-8CC8-F2DCFA87A1FE}" target="_blank"&gt;Oxygene&lt;/a&gt;, if you don't know, is a Object Pascal based language that targets the .NET Framework. In terms of features it contains a lot of things that would be beneficial to C# such as interface delegates, parallel coding constructs and null handling.&lt;/p&gt;  &lt;p&gt;I will be blogging in more detail about some of these features as I plan to look further in to this language. &lt;/p&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3257.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/08/07/3257.aspx</guid>
            <pubDate>Thu, 07 Aug 2008 13:28:13 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3257.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/08/07/3257.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3257.aspx</wfw:commentRss>
        </item>
        <item>
            <title>How I got started in Software Development?</title>
            <link>http://blog.colinmackay.net/archive/2008/07/26/3102.aspx</link>
            <description>&lt;p&gt;There is a meme going around at the moment and I thought I'd join in even although I've not been specifically tagged by it, it looks good fun. I spotted it on &lt;a href="http://haacked.com/" target="_blank"&gt;Phil Haak's blog&lt;/a&gt; &lt;a href="http://haacked.com/archive/2008/07/25/how-i-got-started-in-software-development.aspx" target="_blank"&gt;with his response&lt;/a&gt;.&lt;/p&gt;  &lt;h1&gt;How old were you when you started programming?&lt;/h1&gt;  &lt;p&gt;I was 8 years old.&lt;/p&gt;  &lt;h1&gt;How did you get started in programming?&lt;/h1&gt;  &lt;p&gt;When my dad bought a ZX Spectrum in 1983 (It was a Mark II, 48K RAM). I started by typing in programs from the manuals, then by creating my own programs. One of the first I remember creating was to stop my sister using the computer. She was younger than me and the program was something like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="con" size="2"&gt;10 PRINT "How old are you?"       &lt;br /&gt;20 INPUT a        &lt;br /&gt;30 IF a &amp;lt; 8 THEN PRINT "You are too young to use this computer."; GO TO 10&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h1&gt;What was your first language?&lt;/h1&gt;  &lt;p&gt;ZX Spectrum Basic&lt;/p&gt;  &lt;h1&gt;What was the first real program that you wrote?&lt;/h1&gt;  &lt;p&gt;The first real program that I wrote as part of a job was a tool to summarise and format certain data in a database. What today would be handled by a few drag &amp;amp; drop operations and some mouse clicks in SQL Server Reporting Services took me about a week or so back then. It was written in a language called Magik (yes, with a K)&lt;/p&gt;  &lt;h1&gt;What languages have you used since you started programming?&lt;/h1&gt;  &lt;p&gt;Well various flavours of BASIC (ZX Spectrum, BBC, Visual Basic, VBA, etc.), COMAL (used by my high school), PASCAL, C/C++, COBOL, Magik, javascript, C#. There are probably a whole slew of other languages that I've touched over the years but not spent any significant time with that I've missed out here.&lt;/p&gt;  &lt;h1&gt;If you knew then what you know now, would you have started programming?&lt;/h1&gt;  &lt;p&gt;Yes, I would still have started programming. I probably would have done it a lot better though. There are a lot of things I've learned along the way that I wish I knew earlier. But, then again, if I never made those mistakes what lessons would I be learning? I guess I would be answering this questions pretty much the same way, but thinking of a different set of mistakes. Or would I? Maybe, since I didn't make those mistakes in the first place I would end up being an incredibly arrogant insufferable arsehole.&lt;/p&gt;  &lt;h1&gt;If there is one thing you learned along the way that you would tell new developers, what would it be?&lt;/h1&gt;  &lt;p&gt;Last year, I interviewed for 3 months to hire a developer. From that, the one major thing I think people need to understand is that in software development you must continue to learn constantly. I was interviewing candidates with 10+ years experience that had pretty much never learned anything since leaving university. Sure, they were using new languages since leaving, but they never learned about how to really use this fancy new object oriented language, or how to defend against SQL Injection Attacks. Most of them couldn't even write a &lt;a href="http://www.codinghorror.com/blog/archives/000781.html" target="_blank"&gt;fizz-buzz program&lt;/a&gt; &lt;a href="http://www.hanselman.com/blog/YouCantTeachHeightMeasuringProgrammerCompetenceViaFizzBuzz.aspx" target="_blank"&gt;for goodness sakes&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So, my answer would be &lt;strong&gt;&lt;em&gt;life long learning&lt;/em&gt;&lt;/strong&gt;. If you don't want to do it then do something else.&lt;/p&gt;  &lt;h1&gt;&lt;/h1&gt;  &lt;h1&gt;Who do I tag?&lt;/h1&gt;  &lt;p&gt;It is an interesting set of questions, and I'd like to know the answer from the following people:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.craigmurphy.com/blog/" target="_blank"&gt;Craig Murphy&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://garyshortblog.wordpress.com/" target="_blank"&gt;Gary Short&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://weblogs.asp.net/plip/" target="_blank"&gt;Phil Winstanley&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sturmnet.org/blog/" target="_blank"&gt;Oliver Sturm&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://idunno.org/" target="_blank"&gt;Barry Dorrans&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d3b0982d-a718-481f-aa89-b85505d2213d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/meme" rel="tag"&gt;meme&lt;/a&gt;,&lt;a href="http://technorati.com/tags/software%20development" rel="tag"&gt;software development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/programming" rel="tag"&gt;programming&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3102.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/07/26/3102.aspx</guid>
            <pubDate>Sat, 26 Jul 2008 13:14:02 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3102.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/07/26/3102.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3102.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Data Protection Muppets</title>
            <link>http://blog.colinmackay.net/archive/2008/04/05/2177.aspx</link>
            <description>&lt;p&gt;I've &lt;a href="http://blog.colinmackay.net/archive/2007/06/23/61.aspx" target="_blank"&gt;mentioned this topic on my blog before&lt;/a&gt; with regard to the &lt;a href="http://blog.colinmackay.net/archive/2007/06/22/52.aspx" target="_blank"&gt;Royal Bank of Scotland and Intelligent Finance&lt;/a&gt; but this time it was related to an insurance claim. The insurance company put me in contact with a company that would do the repairs and all they had to do was arrange a time and date. However, it wasn't that simple.&lt;/p&gt;  &lt;p&gt;Initially things seemed to be going well until the company in question phoned me to change the date because they wouldn't have the materials in time. However, first they wanted to go through security screening.&lt;/p&gt;  &lt;p&gt;Now, the conversation to this point had gone something like this:&lt;/p&gt;  &lt;p&gt;Me: Hello   &lt;br /&gt;Them: Hello, is that Colin Mackay [pronounced kae - I HATE that!]    &lt;br /&gt;Me: Mackay [pronounced correctly - its a diphthong, a sliding or gliding vowel that goes from 'ah' to 'ee'] Yes.    &lt;br /&gt;Them: This is Martindales. We just need to ask you some security questions before we proceed.    &lt;br /&gt;Me: How do I know you are who you say you are?    &lt;br /&gt;Them: We are Martindales, your insurance company has appointed us...&lt;/p&gt;  &lt;p&gt;The conversation went from bad to worse as I tried to explain that what they are doing is socially conditioning people to hand out sensitive information and was then told that they "had to" ask these questions because of the data protection act. The act makes no such requirement. What they have to do is ensure that they are speaking to the correct person so they don't divulge potentially sensitive information to the wrong person. However, the way they are going about it, while technically in line with the act, is most certainly not within the spirit of the act.&lt;/p&gt;  &lt;p&gt;What made it worst was that when I was asked how they could continue the conversation and I gave the solution they had to ask me no fewer than 3 times how they were going to continue the conversation even although I had given them a solution. After that incident they decided they must not have like my simple solution and refused to communicate with me at all for a while.&lt;/p&gt;  &lt;p&gt;My solution, incidentally, was this. They would phone me and indicate that they need to speak to me. I would then get the phone number from existing documentation (i.e. a trusted source) and phone their switchboard and ask to be put through to the person that needed to talk to me. They can then go through the security questions as I will then know I am talking to the correct party. When they phone me I have no way of knowing who I am talking to. They could be making it up. If they give me a phone number to use I won't use it. I will only use trusted sources like documentation from my insurance company, or from the booklet that the insurance assessor left me.&lt;/p&gt;  &lt;p&gt;Anyway, Martindales eventually decided that they did need to communicate with me about yet another change in date and sent me a letter. Pity it didn't arrive until two days after the guy was supposed to show up. In fact he did almost arrive, and I only knew about it because they phoned me just to say that he was running a little late. Muppets!&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b9d02c4d-c652-44c2-b971-dcb2d8b4855d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/identity%20theft" rel="tag"&gt;identity theft&lt;/a&gt;,&lt;a href="http://technorati.com/tags/fraud" rel="tag"&gt;fraud&lt;/a&gt;,&lt;a href="http://technorati.com/tags/data%20protection%20act" rel="tag"&gt;data protection act&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2177.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/04/05/2177.aspx</guid>
            <pubDate>Sat, 05 Apr 2008 22:43:32 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2177.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/04/05/2177.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2177.aspx</wfw:commentRss>
        </item>
        <item>
            <title>DDD6 Feedback</title>
            <link>http://blog.colinmackay.net/archive/2008/01/10/1691.aspx</link>
            <description>&lt;p&gt;Well, I've received the feedback from my session at DDD6 and here it is:&lt;/p&gt;
&lt;div align="center"&gt;
&lt;table cellspacing="5" cellpadding="5" width="400" align="center" border="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="200"&gt;Overall: 3.73 &lt;br /&gt;
            &lt;a href="http://blog.colinmackay.net/images/blog_colinmackay_net/WindowsLiveWriter/DDD6Feedback_129BE/image_8.png"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="158" alt="image" width="158" border="0" src="http://blog.colinmackay.net/images/blog_colinmackay_net/WindowsLiveWriter/DDD6Feedback_129BE/image_thumb_3.png" /&gt;&lt;/a&gt; &lt;/td&gt;
            &lt;td valign="top" width="200"&gt;Knowledge: 4.13 &lt;br /&gt;
            &lt;a href="http://blog.colinmackay.net/images/blog_colinmackay_net/WindowsLiveWriter/DDD6Feedback_129BE/image_6.png"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="158" alt="image" width="158" border="0" src="http://blog.colinmackay.net/images/blog_colinmackay_net/WindowsLiveWriter/DDD6Feedback_129BE/image_thumb_2.png" /&gt;&lt;/a&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="200"&gt;Presentation: 3.93 &lt;br /&gt;
            &lt;a href="http://blog.colinmackay.net/images/blog_colinmackay_net/WindowsLiveWriter/DDD6Feedback_129BE/image_4.png"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="158" alt="image" width="158" border="0" src="http://blog.colinmackay.net/images/blog_colinmackay_net/WindowsLiveWriter/DDD6Feedback_129BE/image_thumb_1.png" /&gt;&lt;/a&gt; &lt;/td&gt;
            &lt;td valign="top" width="200"&gt;Content: 3.4 &lt;br /&gt;
            &lt;a href="http://blog.colinmackay.net/images/blog_colinmackay_net/WindowsLiveWriter/DDD6Feedback_129BE/image_2.png"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="158" alt="image" width="158" border="0" src="http://blog.colinmackay.net/images/blog_colinmackay_net/WindowsLiveWriter/DDD6Feedback_129BE/image_thumb.png" /&gt;&lt;/a&gt; &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;By the looks of it, the session was quite well received by most people. As you can see from the Histograms there are a small number of people who obviously really didn't like it, but you can't please everyone I suppose.&lt;/p&gt;
&lt;p&gt;I also received some text comments to which I'd like to respond.&lt;/p&gt;
&lt;p&gt;One person indicated that the panel re-enforced what he already thought about recruitment agents. I wonder if that Included Karl. I suppose he did spend some time apologising for the rotten apples in his industry. It is unfortunate that a few rotten apples can spoil the whole barrel. I've had my (un)fair share of dealings with rotten agents, but I've also dealt with some really good professional ones. &lt;/p&gt;
&lt;p&gt;One person wanted more questions that were relevant to contractors. I actually did try to get a contractor on to the panel, but unfortunately it wasn't to be. Also, only 2 questions directly mentioned contracting or freelance employment, which actually represents 40% of the questions (There were only 5 questions in total). I'm sure that had there been 3 questions that dealt with contractors, there would have been a comment from others that it was too one sided in the other direction. Finally, remember the audience were given an opportunity to direct the questions by submitting questions. I did my best to choose a fair representation. &lt;/p&gt;
&lt;p&gt;One person regarded Barry Dorrans as "the bastard boss (and proud of it)".  However, as I recall, Barry did say that this was just his interview technique to ensure that the candidates could stand up to difficult clients. I know some people may not like that, but if that's the way the business operates then it is important to know if a person is likely to fold under pressure from a client. This also reminds me of a story I heard a while ago about interviewing potential police officers. One of the questions upset of of the candidates. The question was "What would you do if someone vomited on you?" However, it is a valid question. Police Officers are regularly vomited on and so the question helps the interviewer understand how the candidate will react in that situation.&lt;/p&gt;
&lt;p&gt;One person thought the topics were too narrowly focused. From my point of view it was a difficult call. The subject area is quite large and I wanted to cover a variety of topics. If I had been too broad with each topic I'm sure I would have received complaints too as we would have had to spend more time on each topic. As Bart Simpson so succinctly put it "You're damned if you do! You're damned if you don't." &lt;/p&gt;
&lt;p&gt;Finally, although someone did say they thought the session was "very good" they didn't find it interesting. I'm wondering if they submited any questions for the panelists? If they did, did we go off topic with it? (We actually asked every question that we received - although we did have some in reserve in case we ran out.) This session was highly geared to running in the direction that the audience (hopefully) wanted it to go in. So, I am obviously disappointed if someone attended and found it not to be interesting.&lt;/p&gt;
&lt;p&gt;I also received some compliments, but I wanted to respond to some specific points that were raised.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:840a1b17-4eb8-4c4e-8d83-8a7b076ddfb6" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/ddd6"&gt;ddd6&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/recruitment"&gt;recruitment&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/panel"&gt;panel&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/panelist"&gt;panelist&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/feedback"&gt;feedback&lt;/a&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://developerdayscotland.com/main/Default.aspx"&gt;&lt;img alt="" src="http://developerdayscotland.com/images/badges/banner3.png" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blog.colinmackay.net/aggbug/1691.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/01/10/1691.aspx</guid>
            <pubDate>Thu, 10 Jan 2008 21:10:26 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/1691.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/01/10/1691.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/1691.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Follow up on hiring a software developer</title>
            <link>http://blog.colinmackay.net/archive/2007/12/19/1573.aspx</link>
            <description>&lt;p&gt;A while ago I wrote about finding it &lt;a href="http://blog.colinmackay.net/archive/2007/08/19/268.aspx" target="_blank"&gt;difficult to hire good software developers&lt;/a&gt;. We have now hired someone and it took us 3 months from the first interview to the last. We changed our strategy a couple of times throughout the process.&lt;/p&gt;  &lt;p&gt;First we were told we had to go through the internal HR system which puts adverts out in job centres* across the UK. I don't know why as we don't do relocation so why not just stick to the local job centres. We also went to a recruitment agent after persuading HR that we really needed their services. For all the flak that recruitment agents get all I can say is that at the very least they gave us CVs that were of high enough quality to warrant an interview. All the CVs from the job centre were useless. Half of them didn't even have any IT experience on them at all, let alone any evidence of software development work.&lt;/p&gt;  &lt;p&gt;As we started to interview it seems obvious to us that the vast majority of senior software developers have stagnated. I did that once and it cost me 3 months unemployment - I am never doing that again.&lt;/p&gt;  &lt;p&gt;We would ask these "senior" guys basic questions about OO (such as "What is encapsulation?") and we'd get back blank stares from most of them. Okay, they've done work with SQL Server so some basic questions about indexes and joins (and I mean very basic like "What is the advantage of having an index?" or "Can you name any of the types of join SQL Server supports?"). &lt;/p&gt;  &lt;p&gt;After a while we realised that the people we interviewed always perked up a bit and became more enthusiastic when we started talking about SQL Server. We got more right answers, more confidence and more enthusiasm in that area. So we changed the order of the questions around putting the SQL Server questions up front to give people a bit more confidence in themselves rather that just ask questions on skills in the order in which they were listed on their CV.&lt;/p&gt;  &lt;p&gt;We also gave them a little programming problem. It was based on the Fizz-Buzz (or Buzz-Fizz) game that Scott Hanselman mentioned in one of his &lt;a href="http://www.hanselminutes.com" target="_blank"&gt;Hanselminutes&lt;/a&gt; on &lt;a href="http://www.hanselminutes.com/default.aspx?showID=69" target="_blank"&gt;Hiring and Interviewing Engineers&lt;/a&gt;. I wrote the program, then I introduced a bug. We would give the candidate the paper with the program on it and the output that the program made with the error in the output highlighted. We would then ask the candidate to first of all tell us where the bug was and secondly to suggest a solution. I was shocked at the number of people that could not even point out the bug.&lt;/p&gt;  &lt;p&gt;What was interesting was the the guy we eventually hired only looked at the code for about 5 seconds and pointed out the exact line and why it wasn't working. When we asked for a possible solution we got an answer straight away. Given the speed of the answer we asked a third question (never before asked).&lt;/p&gt;  &lt;p&gt;Before I get to that third question here's a little background. When I developed the question I put it round the development team for comments and just to see how fast our existing developers could solve the problem to get some kind of bench mark on the time needed for the question. I got a number of different correct responses for the way to solve the problem (even from our DBA who hadn't programmed in C# before). &lt;/p&gt;  &lt;p&gt;So, the third question asked was "Can you think of any other ways in which to fix the bug?" and very quickly our candidate came up with two further solutions.&lt;/p&gt;  &lt;p&gt;I've skipped ahead slightly in the story, so I'll go back a bit. We were still having problems with senior developers not being able to answer basic questions. And when they did get as far as the practical test, they failed that shockingly badly too. Although, most of them failed because they did not read the specification and therefore did not do what was asked of them.&lt;/p&gt;  &lt;p&gt;So, we changed out tactics slightly. We decided that as we had a fixed budget in which to hire someone, we would look for a graduate and use the extra money for training. We started getting in CVs for recent graduates. These were more difficult because a graduate doesn't have so much experience. So we looked for things that showed commitment and an interest in technology. It didn't matter to us that the only language they might have used was Java as we could train them.&lt;/p&gt;  &lt;p&gt;But when it came to the interviews these guys really shone out more that the supposedly senior guys. They could answer all the basic questions. They were willing to admit when we'd reached the limit of their knowledge. (Either that, or they hadn't learned to BS their way through answers)&lt;/p&gt;  &lt;p&gt;When it came to the practical test, they showed some real promise, even if they did get the occasional thing wrong. Compare that with our earlier experiences where one "senior" guy had spent two hours in front of the PC and had written two lines of code in that time.&lt;/p&gt;  &lt;p&gt;In the end we interviewed about 4 guys who had recently graduated and this was going to be their first or second software development job. And we hired one of them. If we'd gone for that strategy to start with I think we would have taken a lot less time and we wouldn't have been so frustrated with the whole process.&lt;/p&gt;  &lt;p&gt;The one thing we did not consider during the whole process was dropping our standards. I think we would have regretted it if we had. What we discovered was shocking. That is something I'll cover in another post.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Some advice&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;As I mentioned, a lot of the senior developers we interviewed had somehow stagnated. They weren't interested in software development other than as a 9-5 job. One even said in answer to a question "I've not been on a training course about that yet"! We only ask questions about stuff they've put on their CV. If they don't have ASP.NET, for instance, but they've spent time doing windows applications we'll ask them about Windows applications and we'll skip ASP.NET. If we then need them to do an ASP.NET application we are confident that any developer worth their salt can pick it up in a short time. But, if they don't have the fundamentals then I can't see how they would cope.&lt;/p&gt;  &lt;p&gt;So, if you are happy to go with the flow and just learn what your company needs you to learn rather than keep your marketable skill set up then feel free. Just don't expect me to consider paying you the big bucks only to send you on lots of training courses for basic things like OO, C# and SQL Server.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:506ce110-c6dc-47c7-90ab-9b3091d9587f" style="padding-right: 0px; display: inline; padding-left: 10px; float: right; padding-bottom: 10px; margin: 0px; padding-top: 0px"&gt;&lt;div id="d62fecb9-d2ef-43bb-8bd1-70d2207897e7" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://video.msn.com/video.aspx?vid=e1291874-84ee-4d9f-bc14-7d2d04c009ea&amp;amp;ifs=true&amp;amp;fr=shared&amp;amp;from=writer" target="_new"&gt;&lt;img src="http://blog.colinmackay.net/images/blog_colinmackay_net/WindowsLiveWriter/f6374be75ef8_13149/videoef198a6b6cf0.jpg" galleryimg="no" onload="var downlevelDiv = document.getElementById('d62fecb9-d2ef-43bb-8bd1-70d2207897e7'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;embed src=\&amp;quot;http://images.video.msn.com/flash/soapbox1_1.swf\&amp;quot; quality=\&amp;quot;high\&amp;quot; width=\&amp;quot;432\&amp;quot; height=\&amp;quot;364\&amp;quot; wmode=\&amp;quot;transparent\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; pluginspage=\&amp;quot;http://macromedia.com/go/getflashplayer\&amp;quot; flashvars=\&amp;quot;c=v&amp;amp;v=e1291874-84ee-4d9f-bc14-7d2d04c009ea&amp;amp;ifs=true&amp;amp;fr=shared&amp;amp;from=writer\&amp;quot; &amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; But, if you do want to get out of that rut then here is some advice to you:   &lt;p&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Find a local user group and attend their meetings. You get to meet experts. You can talk to them and increase your understanding. If you are in Scotland there are a number of user groups already:      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.scottishdevelopers.com/" target="_blank"&gt;Scottish Developers&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.northeastscotland.net/DNN4/" target="_blank"&gt;North East Scotland .NET User Group&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://agilescotland.blogspot.com/" target="_blank"&gt;Agile Scotland&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.sqlserverfaq.com/" target="_blank"&gt;SQL Server User Group&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.bcs.org/" target="_blank"&gt;British Computer Society&lt;/a&gt;, with branches in &lt;a href="http://www.edinburgh.bcs.org/" target="_blank"&gt;Edinburgh&lt;/a&gt;, &lt;a href="http://www.glasgow.bcs.org/index.htm" target="_blank"&gt;Glasgow&lt;/a&gt;, &lt;a href="http://www.tayside.bcs.org/" target="_blank"&gt;Tayside&lt;/a&gt;, &lt;a href="http://aberdeen.bcs.org/" target="_blank"&gt;Aberdeen&lt;/a&gt; and &lt;a href="http://www.bcs.org/server.php?show=conWebDoc.1282" target="_blank"&gt;Inverness&lt;/a&gt;. &lt;/li&gt;        &lt;li&gt;&lt;a href="http://ukjugs.org/display/main/Home" target="_blank"&gt;Java User Group Scotland&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;And probably more that I don't know about (If you know of any please let me know and I'll add it to the list) The video to the right was created to show how active user groups are in the UK as a whole. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Read stuff - And not just when you discover that you need it. Subscribe to a relevant software development magazine. Many companies will pay for that for you as they see it as an inexpensive form of training. Just read articles about software development to broaden your horizons. If you take a train or a bus to and from work this is an excellent time to do this. &lt;/li&gt;    &lt;li&gt;Listen to stuff - There are some excellent podcasts out there that you can listen to while driving. &lt;a href="http://www.dotnetrocks.com/" target="_blank"&gt;DotNetRocks&lt;/a&gt; and &lt;a href="http://www.hanselminutes.com" target="_blank"&gt;Hanselminutes&lt;/a&gt; are two of my favourites. Scott Hanselman even has a show on how to &lt;a href="http://www.hanselminutes.com/default.aspx?showID=90" target="_blank"&gt;be a better developer in 6 months&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You don't have to spend a lot of time or money picking new stuff up. A user group meeting or two per month. That really doesn't cost a lot. Some user groups charge, some don't. If they do it is a modest amount to cover the cost of the venue and maybe some food and drink. In terms of time it is about 5 hours per month. It might be a wee bit more if you socialise after but that brings additional benefits. If you socialise people get to know you and if there is a job going it is great to have some contacts already.&lt;/p&gt;  &lt;p&gt;Listening to podcasts in the car is practically free. You can get MP3 players hooked up to in-car stereos now and if not many will have CD players that can play MP3 or WMA files (The Toyota Yaris certainly does) so that only costs you the price of a blank CD for every 15 hours (roughly) of podcasts. In terms of time it only takes a few minutes to download and burn the files to a disk or transfer them to your MP3 player. In terms of time listening to them it is also free because it was dead time anyway. So that's an additional bonus - you've turned some dead time into something useful.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Other posts on a similar theme:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blog.colinmackay.net/archive/2007/08/19/268.aspx"&gt;Why is it so hard to hire good software developers?&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.colinmackay.net/archive/2007/08/20/293.aspx"&gt;More on hiring developers&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.colinmackay.net/archive/2007/09/06/406.aspx"&gt;What are developer forums for?&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;* If you are from outside the UK, the job centre is part of the government's department for work and pensions (DWP) and it is tasked with dealing with out of work people and helping them back into work.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4e128d5e-7a08-4302-b1d6-614494e338d1" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/recruitment" rel="tag"&gt;recruitment&lt;/a&gt;,&lt;a href="http://technorati.com/tags/r%c3%a9sum%c3%a9" rel="tag"&gt;résumé&lt;/a&gt;,&lt;a href="http://technorati.com/tags/CV" rel="tag"&gt;CV&lt;/a&gt;,&lt;a href="http://technorati.com/tags/software%20development" rel="tag"&gt;software development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/interview" rel="tag"&gt;interview&lt;/a&gt;,&lt;a href="http://technorati.com/tags/jobs" rel="tag"&gt;jobs&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="center"&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://developerdayscotland.com/main/Default.aspx" target="_blank"&gt;&lt;img src="http://developerdayscotland.com/images/badges/banner3.png" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;/p&gt;&lt;img src="http://blog.colinmackay.net/aggbug/1573.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2007/12/19/1573.aspx</guid>
            <pubDate>Wed, 19 Dec 2007 18:41:20 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/1573.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2007/12/19/1573.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/1573.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Always show the solution, Dammit!!!</title>
            <link>http://blog.colinmackay.net/archive/2007/12/08/1335.aspx</link>
            <description>&lt;p&gt;This has got to be the most pointless setting in Visual Studio. I can't imagine why any reasonable person would want to hide the solution. Maybe it is for those "Morts" I keep hearing about who bundle everything into one &lt;strike&gt;giant ball of mud&lt;/strike&gt; project so have no need to know about mundane things such as solutions.&lt;/p&gt;  &lt;p&gt;&lt;a title="Always Show Solution by Colin  Angus Mackay, on Flickr" href="http://www.flickr.com/photos/colinangusmackay/2096142506/"&gt;&lt;img height="375" alt="Always Show Solution" src="http://farm3.static.flickr.com/2060/2096142506_95c1caf4a8_o.png" width="644" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I suppose what gets me most is that I like my right-click. I like to right-click on things and get context sensitive menus. I also normally create a new blank solution then add projects to it. The solution disappear when the number of projects equals one. When there are zero projects the solution shows, but as soon as I add one it disappears so I can't right-click and add another until I sort this setting out. It was the same in Visual Studio 2005, I was hopping they might have changed the default for VS2008, but no - the mob rule of the Morts wins.&lt;/p&gt;  &lt;p&gt;Yes, I realise that I can go to the file menu to add a new project from there, but if I'm already focused in the solution explorer, I want to stay there. I don't want to make giant leaps across the screen to do these things. I want everything I need within easy reach.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9b6c2da6-80db-4fe1-b67c-523195c2e122" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/visual%20studio%202008" rel="tag"&gt;visual studio 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/visual%20studio%202005" rel="tag"&gt;visual studio 2005&lt;/a&gt;,&lt;a href="http://technorati.com/tags/solution%20explorer" rel="tag"&gt;solution explorer&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/1335.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2007/12/08/1335.aspx</guid>
            <pubDate>Sat, 08 Dec 2007 20:01:21 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/1335.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2007/12/08/1335.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/1335.aspx</wfw:commentRss>
        </item>
        <item>
            <title>GIS and Me</title>
            <link>http://blog.colinmackay.net/archive/2007/12/01/1249.aspx</link>
            <description>&lt;p&gt;Years ago, when I left university I, along with some friends, set up a company to develop a GIS product. We then went after some venture capital and just around that time rumours filtered through that Microsoft were hiring some of the best minds in GIS and we thought "Oh, bugger!" our newly formed business would not be able to compete with Microsoft. We were left in a state of shock when Microsoft release &lt;a href="http://www.microsoft.com/mappoint/default.mspx" target="_blank"&gt;MapPoint&lt;/a&gt;. It was rubbish! (At least it was rubbish as a competitor to our product.) You couldn't do even half of what our product could do or our customers were asking for in terms of new features. &lt;a href="http://www.microsoft.com/mappoint/default.mspx" target="_blank"&gt;MapPoint&lt;/a&gt; was strong on route planning, but that was the only competitive edge over our own product. We didn't do route planning at all. &lt;a href="http://www.microsoft.com/mappoint/default.mspx" target="_blank"&gt;MapPoint&lt;/a&gt; offered very little in the way of spatial processing and, as far as we could see, was just a very limited way to display data on a map.&lt;/p&gt;  &lt;p&gt;However, it looks like things are changing. Spatial data support was finally released in the November CTP of SQL Server 2008. There is no graphical front end, but the processing ability is there and that is the more important part. It is easy to put a new front end on to the data. Microsoft have some solutions in that area already such as Virtual Earth and &lt;a href="http://www.microsoft.com/mappoint/default.mspx" target="_blank"&gt;MapPoint&lt;/a&gt;. There are also other vendors out there who have their own, more powerful, front end solution.&lt;/p&gt;  &lt;p&gt;My only reservation about these new abilities, at least in the UK, is that spatial data sets are very expensive. Unlike the USA the UK government holds the copyright on the data it produces and it then charges a king's ransom for access to it. This stifles business's ability to use spatial data effectively and it will have to resort to poorer quality datasets or being restricted in the ways that it can use the data.A business could, for example, use map data generated by &lt;a href="http://www.openstreetmap.org/" target="_blank"&gt;OpenStreetMap&lt;/a&gt;. Doing that stifles the way the business can use the data as &lt;a href="http://www.openstreetmap.org/" target="_blank"&gt;OpenStreetMap&lt;/a&gt; is released under a &lt;a href="http://creativecommons.org/licenses/by-sa/2.0/" target="_blank"&gt;Creative Commons BY-SA (Attribution Share-Alike) license&lt;/a&gt;. This means that anything a company does with &lt;a href="http://www.openstreetmap.org/" target="_blank"&gt;OpenStreetMap&lt;/a&gt; data must be attributed to &lt;a href="http://www.openstreetmap.org/" target="_blank"&gt;OpenStreetMap&lt;/a&gt; (not an onerous condition, if they use &lt;a href="http://www.ordnancesurvey.co.uk" target="_blank"&gt;OS&lt;/a&gt; data they must include a Crown Copyright notice) and the derivative works it creates must be covered under the same license - How many companies are going to be willing to do that?&lt;/p&gt;  &lt;p&gt;According to the OSM website "&lt;a href="http://creativecommons.org/licenses/by-sa/2.0/" target="_blank"&gt;CC-By-Sa&lt;/a&gt; do not force you to make any source data available. You are only restricted in the license you choose for distributed data". On the face of it that sounds like companies can use the license so long as the map is kept internally. Well, I can't really see how that is possible. If one employee creates a derivative work, say a sales chart, and passes it out at a meeting then it has been distributed and must therefore be under the &lt;a href="http://creativecommons.org/licenses/by-sa/2.0/" target="_blank"&gt;CC-By-Sa&lt;/a&gt; license and once in that state the company cannot stop its distribution. Obviously I am not a lawyer, but that is my interpretation of the license. &lt;/p&gt;  &lt;p&gt;Currently, I'm looking at ways to put together demos and articles on using the Spatial data types in SQL Server 2008, however I cannot us &lt;a href="http://www.ordnancesurvey.co.uk" target="_blank"&gt;OS&lt;/a&gt; data because it is too expensive and I cannot use &lt;a href="http://www.openstreetmap.org/" target="_blank"&gt;OpenStreetMap&lt;/a&gt; because I'm not willing to release my articles, presentations and demos (my derivative works) under that license. I'd also like to use UK data because that is where I'll be doing my presentations/demos.&lt;/p&gt;  &lt;p&gt;If anyone has links to vector data that I can use then I'd love to know about it.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1676c612-9620-438a-91b2-0738f117a005" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/gis" rel="tag"&gt;gis&lt;/a&gt;,&lt;a href="http://technorati.com/tags/openstreetmap" rel="tag"&gt;openstreetmap&lt;/a&gt;,&lt;a href="http://technorati.com/tags/katmai" rel="tag"&gt;katmai&lt;/a&gt;,&lt;a href="http://technorati.com/tags/sql%20server%202008" rel="tag"&gt;sql server 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/mappoint" rel="tag"&gt;mappoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/spatial%20data" rel="tag"&gt;spatial data&lt;/a&gt;,&lt;a href="http://technorati.com/tags/geographic%20data" rel="tag"&gt;geographic data&lt;/a&gt;,&lt;a href="http://technorati.com/tags/crown%20copyright" rel="tag"&gt;crown copyright&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Creative%20Commons" rel="tag"&gt;Creative Commons&lt;/a&gt;,&lt;a href="http://technorati.com/tags/CC%20By-Sa" rel="tag"&gt;CC By-Sa&lt;/a&gt;,&lt;a href="http://technorati.com/tags/OS" rel="tag"&gt;OS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Ordnance%20Survey" rel="tag"&gt;Ordnance Survey&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/1249.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2007/12/01/1249.aspx</guid>
            <pubDate>Sat, 01 Dec 2007 17:46:16 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/1249.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2007/12/01/1249.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/1249.aspx</wfw:commentRss>
        </item>
        <item>
            <title>DALs and the DAAB</title>
            <link>http://blog.colinmackay.net/archive/2007/11/03/941.aspx</link>
            <description>&lt;p&gt;I've been pondering something that was raised in passing earlier this week and that is the relationship between a DAL (Data Abstraction Layer) and the DAAB (&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480458.aspx" target="_blank"&gt;Data Access Application Block&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;It was briefly mentioned in a conversation that I had that the DAAB provides the functionality of a DAL because the developer doesn't need to worry about the back end database that is being used. I suppose to some extent that is true. However, I don't believe that it fully functions as a DAL.&lt;/p&gt;  &lt;p&gt;To my mind a DAL abstracts the access of data away from the rest of the application. Most people seem to restrict this view to data being held in a database.  But databases are not the only repository of data. Data can be held in plain text files, CSV files, XML files and many other formats. It doesn't need to arrive by file, it could be data from a service or other mechanism.&lt;/p&gt;  &lt;p&gt;If you treat sources of data as being more than a database then the DAAB is not a suitable substitute for building a DAL.&lt;/p&gt;  &lt;p&gt;Also the DAAB has some limitations in that it cannot translate the SQL itself. For example the flavour of SQL in Oracle has differences to the flavour of SQL in SQL Server. This means that any SQL code will have to be translated. One possible solution is to ensure that everything is done through stored procedures. Then all that the DAAB needs is the stored procedure's name and the values for the parameters.&lt;/p&gt;  &lt;p&gt;But what of passing stored procedure names and parameters to the DAAB? Wouldn't they need to be known in the business layer? Surely the business layer should know absolutely nothing about the database? Absolutely, the business layer should not be concerning itself at all with the database. It shouldn't know about stored procedure names, parameters or anything else, even if the DAAB takes care of figuring out the details under the hood from information picked up from the config file. The Business Layer should just need to know there is a DAL and a method on the DAL can be called and some results come back. How the DAL does anything is of no concern to the business layer. &lt;/p&gt;  &lt;p&gt;A quick and dirty test, in my opinion, is to look out for any classes from the System.Data namespace in the business or presentation layer to determine if the DAL is well designed. &lt;/p&gt;  &lt;p&gt;In my mind the DAAB is just a tool that can be used to make the creation and maintenance of a DAL easier when dealing with databases. It makes it easy to change the location of databases as the development process moves along from the developers' machines, to continuous integration, test, pre-live and finally live (or what ever your process calls for). The argument that the DAAB makes it easy to swap out one type of database for another isn't something that is actually going to be done all that often. From what I've seen, companies generally run two systems concurrently until the old one is discontinued. Rarely do they ever actually update the old system to use the new database and when they do it is usually via some form of orchestration system so the old system doesn't need to be changed in any great way. If it isn't broke don't fix it.&lt;/p&gt;  &lt;p&gt;Tags: &lt;a href="http://technorati.com/tag/dal" rel="tag"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0.4em; vertical-align: middle; border-right-width: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=dal" /&gt;dal&lt;/a&gt; &lt;a href="http://technorati.com/tag/daab" rel="tag"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0.4em; vertical-align: middle; border-right-width: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=daab" /&gt;daab&lt;/a&gt; &lt;a href="http://technorati.com/tag/data+abstraction+layer" rel="tag"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0.4em; vertical-align: middle; border-right-width: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=data+abstraction+layer" /&gt;data abstraction layer&lt;/a&gt; &lt;a href="http://technorati.com/tag/data+access+application+block" rel="tag"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0.4em; vertical-align: middle; border-right-width: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=data+access+application+block" /&gt;data access application block&lt;/a&gt; &lt;a href="http://technorati.com/tag/sql" rel="tag"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0.4em; vertical-align: middle; border-right-width: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=sql" /&gt;sql&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blog.colinmackay.net/aggbug/941.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2007/11/03/941.aspx</guid>
            <pubDate>Sat, 03 Nov 2007 23:29:43 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/941.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2007/11/03/941.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/941.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Web Client Software Factory</title>
            <link>http://blog.colinmackay.net/archive/2007/11/02/923.aspx</link>
            <description>&lt;p&gt;Yesterday evening myself and a colleague drove up to &lt;a target="_blank" href="http://www.dundee.ac.uk/"&gt;Dundee University&lt;/a&gt; to see a presentation by the &lt;a target="_blank" href="http://www.northeastscotland.net/dnn4"&gt;North East Scotland .NET User Group&lt;/a&gt; on the &lt;a target="_blank" href="http://www.codeplex.com/websf"&gt;Web Client Software Factory&lt;/a&gt; by &lt;a target="_blank" href="http://www.garyshort.org/"&gt;Gary Short&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have to admit that I wasn't sure what to expect. The WCSF was one of those things that I'd vaguely heard of but hadn't paid much attention to because I don't do much web development. What I saw surprised and delighted me.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://xkcd.com/303/"&gt;&lt;img id="id" style="MARGIN: 0px 10px 10px" alt="From xkcd.com" align="right" src="http://imgs.xkcd.com/comics/compiling.png" /&gt;&lt;/a&gt;Gary has a slide deck for his presentation but we only saw one slide because he told us we weren't really interested in the slides and he jumped straight into coding for the rest of the session.  Now, I have to say that watching someone code for 90 minutes is generally not my idea of fun, but Gary's presentation skills are such that he keeps you entertained during the slow parts (such as when the code was compiling and so on) and his explanations are pitched at just the right level so that you understand what's going on without over explaining anything and ensuring that everyone is keeping up.&lt;/p&gt;
&lt;p&gt;However, there were parts where some improvement could be made. For example the first few minutes were spent watching Gary write some SQL Code. Since there was nothing new there for us it could easily have been a pre-existing file that was opened and executed with a cursory description about the table, data and stored procedures. (I hope you don't mind me saying that, Gary, because it was other wise very interesting).&lt;/p&gt;
&lt;p&gt;Now about the WCSF itself. It comes with some plug ins for Visual Studio which help you quite a bit by generating the project and organising, the code stubs and other bits and pieces. There is even the ability of creating complex workflow through your website by integrating with Windows Workflow.&lt;/p&gt;
&lt;p&gt;I cannot do justice to the description and detail that Gary gave so I've invited him to present to Scottish Developers sometime early next year. We just have to get a date sorted out, so watch out for the event going up on the Scottish Developers website. In the meantime I'm going to be trying it out for myself.&lt;/p&gt;
&lt;p&gt;Gary is also presenting at DDD6 (24-Nov-2007) on &lt;a target="_blank" href="http://www.developerday.co.uk/ddd/agendaddd6lineup.asp"&gt;his favourite patterns&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/wcsf"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 0.4em; VERTICAL-ALIGN: middle; BORDER-RIGHT-WIDTH: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=wcsf" /&gt;wcsf&lt;/a&gt; &lt;a rel="tag" href="http://technorati.com/tag/gary+short"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 0.4em; VERTICAL-ALIGN: middle; BORDER-RIGHT-WIDTH: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=gary+short" /&gt;gary short&lt;/a&gt; &lt;a rel="tag" href="http://technorati.com/tag/dundee+university"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 0.4em; VERTICAL-ALIGN: middle; BORDER-RIGHT-WIDTH: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=dundee+university" /&gt;dundee university&lt;/a&gt; &lt;a rel="tag" href="http://technorati.com/tag/north+east+scotland+.net+user+group"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 0.4em; VERTICAL-ALIGN: middle; BORDER-RIGHT-WIDTH: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=north+east+scotland+.net+user+group" /&gt;north east scotland .net user group&lt;/a&gt; &lt;a rel="tag" href="http://technorati.com/tag/web+client+software+factory"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 0.4em; VERTICAL-ALIGN: middle; BORDER-RIGHT-WIDTH: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=web+client+software+factory" /&gt;web client software factory&lt;/a&gt; &lt;a rel="tag" href="http://technorati.com/tag/scottish+developers"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 0.4em; VERTICAL-ALIGN: middle; BORDER-RIGHT-WIDTH: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=scottish+developers" /&gt;scottish developers&lt;/a&gt; &lt;a rel="tag" href="http://technorati.com/tag/ddd6"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 0.4em; VERTICAL-ALIGN: middle; BORDER-RIGHT-WIDTH: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=ddd6" /&gt;ddd6&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blog.colinmackay.net/aggbug/923.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2007/11/02/923.aspx</guid>
            <pubDate>Fri, 02 Nov 2007 21:37:53 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/923.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2007/11/02/923.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/923.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>