<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.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:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Jonathan Crossland's Talkware</title>
    <description>talking, people, software</description>
    <link>http://www.jonathancrossland.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.0</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://www.jonathancrossland.com/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.jonathancrossland.com/syndication.axd</blogChannel:blink>
    <dc:creator>Jonathan Crossland</dc:creator>
    <dc:title>Jonathan Crossland's Talkware</dc:title>
    <media:copyright>Copyright, Jonathan Crossland</media:copyright><media:thumbnail url="http://www.jonathancrossland.com/itunes-talkware.jpg" /><media:keywords>software,development,engineering,architecture,design,NET,c,Java,Eclipse,Visual,Studio</media:keywords><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">Technology/Software How-To</media:category><itunes:owner><itunes:email>jonathan@lucidocean.com</itunes:email><itunes:name>Jonathan Crossland</itunes:name></itunes:owner><itunes:author>Jonathan Crossland</itunes:author><itunes:explicit>no</itunes:explicit><itunes:image href="http://www.jonathancrossland.com/itunes-talkware.jpg" /><itunes:keywords>software,development,engineering,architecture,design,NET,c,Java,Eclipse,Visual,Studio</itunes:keywords><itunes:subtitle>talking, people, software</itunes:subtitle><itunes:summary>Jonathan speaks with names, big and small, regarding software design, methodologies  and development issues.</itunes:summary><itunes:category text="Technology"><itunes:category text="Software How-To" /></itunes:category><image><link>http://www.jonathancrossland.com/image.axd?picture=2009%2f2%2fitunes-talkware.jpg</link><url>http://www.jonathancrossland.com/image.axd?picture=2009%2f2%2fitunes-talkware.jpg</url><title>TalkWare</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/talkware" type="application/rss+xml" /><feedburner:emailServiceId>talkware</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>First Look at VS.NET 2010 (for me)</title>
      <description>&lt;br/&gt;
I don't have time for a large introduction to this post, rather I'll jump straight in and tell you about the things that I picked up on.
&lt;br/&gt;&lt;br/&gt;
- The start page, with its now big button, lots of &lt;b&gt;padding&lt;/b&gt; approach, seem wasted space, especially on any wide screen monitors. the start page for VS.NET 2008 wasn't anything great, but you had the recent projects, some news and other bits all accessible with one click. A minor thing, but its not a better start page.
&lt;br/&gt;&lt;br/&gt;
- The skinned look. This was a complete waste of time, in my opinion and in fact makes the experience in visual studio worse. With the extra padding, now around all the toolbars (the same width as the splitters), it makes everything seem smaller, and it is. The dragging of the toolbars are much cleaner, &lt;b&gt;smoother&lt;/b&gt; than 2008.&lt;br/&gt;&lt;br/&gt;I don't like the way the treeview lines and arrows &lt;b&gt;disappear&lt;/b&gt; when it has no focus. If it is a setting, I could not find it, but now I cannot at a glance see if a folder has something in it vs one that does. A small point, but means you have to move the mouse and wait for the lines to fade in.
&lt;br/&gt;&lt;br/&gt;
- The code editor now has filtering on what you type in the intelli-sense. Before it simply took you to the correct item in the &lt;b&gt;intelli-sense&lt;/b&gt; window, now it removes entries that do not match. This is a massive negative point, as I use the intelli-sense as a browser as well. 
&lt;br/&gt;&lt;br/&gt;
- The code editor, firstly which is a &lt;b&gt;major plus&lt;/b&gt;, is the &lt;b&gt;selection highlight&lt;/b&gt;. Now it is not an inversion of text colour, with blue selection background, it is a translucent colour, which keeps the text colour as it is, untouched. This simple thing is a massive improvement.
&lt;br/&gt;&lt;br/&gt;
- Unfortunately there is a &lt;b&gt;microsecond delay&lt;/b&gt; now over 2008 when typing. Each character you type appears that little more slowly, which actually took me a while to get over. It was actually annoying to me. I know I am quite sensitive about it, but I think others will also have picked up on it. 
&lt;br/&gt;&lt;br/&gt;
- The skin colour of dark blue with white text on the tabs, now distract me. I always have a black windowed code editor, not the usual white. But now, the toolbar tabs for each file is more visible in my peripheral vision as I type in the editor. This is also &lt;b&gt;distracting&lt;/b&gt;.
&lt;br/&gt;&lt;br/&gt;
- The round break point icons in the margin is now that fraction smaller, which I don't like, but can live with.
&lt;br/&gt;&lt;br/&gt;
- Overall, the skin has introduced &lt;b&gt;too much contrast&lt;/b&gt;. It is much more stand out as an interface, which is better to look at, but worse to code in.
&lt;br/&gt;&lt;br/&gt;
Why does Visual Basic appear on the root, and c# in 'Other Languages' - on new Project Dialog? Is this a VB editor, then if we are lucky some other languages? I thought .NET was about multi-language.&lt;br/&gt;
1. Visual Basic&lt;br/&gt;
2. Other Languages&lt;br/&gt;
3. Other project Types&lt;br/&gt;
4. Test projects&lt;br/&gt;
&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=zqyM1WWHOtU:juXldh9gaQw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=zqyM1WWHOtU:juXldh9gaQw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=zqyM1WWHOtU:juXldh9gaQw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=zqyM1WWHOtU:juXldh9gaQw:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=zqyM1WWHOtU:juXldh9gaQw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=zqyM1WWHOtU:juXldh9gaQw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=zqyM1WWHOtU:juXldh9gaQw:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=zqyM1WWHOtU:juXldh9gaQw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=zqyM1WWHOtU:juXldh9gaQw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=zqyM1WWHOtU:juXldh9gaQw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=zqyM1WWHOtU:juXldh9gaQw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/zqyM1WWHOtU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/zqyM1WWHOtU/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/First-Look-at-VSNET-2010-(for-me).aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=182ac8d4-f030-424d-ab2e-918a27af6135</guid>
      <pubDate>Fri, 06 Nov 2009 02:09:00 -0800</pubDate>
      <category>Visual Studio</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=182ac8d4-f030-424d-ab2e-918a27af6135</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=182ac8d4-f030-424d-ab2e-918a27af6135</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/First-Look-at-VSNET-2010-(for-me).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=182ac8d4-f030-424d-ab2e-918a27af6135</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=182ac8d4-f030-424d-ab2e-918a27af6135</feedburner:origLink></item>
    <item>
      <title>The Agile pendulum has swayed too far</title>
      <description>&lt;br/&gt;
Being an agile developer has meant a lot to me. Over the years, I have tried to get those around me, more agile, more iteratively focused, more quality, result driven and so on, but I fear it is growing askew. 
&lt;br/&gt;&lt;br/&gt;
Agile is on the cusp of becoming so customer, service and result focused that quality, reuse, robustness and many other facets are getting less emphasis.
&lt;br/&gt;&lt;br/&gt;
Agility can be a weakness too.
&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=E071Q74iKMM:ho7Tm_JsRUg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=E071Q74iKMM:ho7Tm_JsRUg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=E071Q74iKMM:ho7Tm_JsRUg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=E071Q74iKMM:ho7Tm_JsRUg:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=E071Q74iKMM:ho7Tm_JsRUg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=E071Q74iKMM:ho7Tm_JsRUg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=E071Q74iKMM:ho7Tm_JsRUg:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=E071Q74iKMM:ho7Tm_JsRUg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=E071Q74iKMM:ho7Tm_JsRUg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=E071Q74iKMM:ho7Tm_JsRUg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=E071Q74iKMM:ho7Tm_JsRUg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/E071Q74iKMM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/E071Q74iKMM/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/The-Agile-pendulum-has-swayed-too-far.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=b90c38f6-5056-49e2-bd74-a368dbfa3318</guid>
      <pubDate>Mon, 19 Oct 2009 09:12:00 -0800</pubDate>
      <category>Frameworks</category>
      <category>Methodology</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=b90c38f6-5056-49e2-bd74-a368dbfa3318</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=b90c38f6-5056-49e2-bd74-a368dbfa3318</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/The-Agile-pendulum-has-swayed-too-far.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=b90c38f6-5056-49e2-bd74-a368dbfa3318</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=b90c38f6-5056-49e2-bd74-a368dbfa3318</feedburner:origLink></item>
    <item>
      <title>What is Production Code and how do</title>
      <description>&lt;br/&gt;
&lt;b&gt;... you know when you have it, or not?&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;
You see it written in code samples: No warranty, please take care if you use in production environment. This is not production code, but what does production code really mean?
&lt;br/&gt;&lt;br/&gt;
Firstly production code can be any code that is in use. But that does not refer anything about quality. Just because software is on the shelf, does not mean its good quality.&lt;br/&gt;
Production code must have some sort of quality level. &lt;br/&gt;&lt;br/&gt;Amusingly the DSDM pocket book, (Atern) says that "it must be good enough" - which makes me laugh, then cry.
&lt;br/&gt;&lt;br/&gt;
Quality is subjective yes, and quality costs money. So what should production code be?
&lt;br/&gt;&lt;br/&gt;

The following is a list of heuristics for referring to code as production code.
&lt;ul&gt;
&lt;li&gt;More than 40% of your application has Unit Tests
&lt;/li&gt;
&lt;li&gt;At least 3 or more people have spent time actively seeking bugs, for longer than 30% of the time it took to originally write.&lt;/li&gt;
&lt;li&gt;At least 3 or more people have been actively seeking bugs, in at least 5 different configurations/environments.You have mixed the environment (different server, different database name, altered culture/region, etc).&lt;/li&gt;
&lt;li&gt;Bugs have been solved with &lt;a href="http://www.jonathancrossland.com/page/SolvingDesign.aspx"&gt;SolvingDesign&lt;/a&gt; (A lasting solve)&lt;/li&gt;
&lt;li&gt;Code Regression is reduced, practically to a stand-still. A ratio of 50 bugs solved per 1 reintroduced is a good ratio. 5 bugs solved for 1 reintroduced is a terrible ratio.&lt;/li&gt;
&lt;li&gt;Users have used the code for at least 40% of the development time taken, reporting bugs, and the system recompiled and redeployed at 5 times during this period. (preferably at intervals, so input can be recalculated)&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;&lt;br/&gt;
Influence that will present itself, and cause you into thinking its production code, before its not.
&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;Deadline and other pressures&lt;/li&gt;
&lt;li&gt;Reactionary mindset, rather than pre-emptive&lt;/li&gt;
&lt;li&gt;Bad company software creation intelligence (what else can you call it?)&lt;/li&gt;
&lt;li&gt;Human traits, inexperience, carelessness etc&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-SQH4pPT1YY:cDDwGdX_ze0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-SQH4pPT1YY:cDDwGdX_ze0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=-SQH4pPT1YY:cDDwGdX_ze0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-SQH4pPT1YY:cDDwGdX_ze0:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-SQH4pPT1YY:cDDwGdX_ze0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=-SQH4pPT1YY:cDDwGdX_ze0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-SQH4pPT1YY:cDDwGdX_ze0:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-SQH4pPT1YY:cDDwGdX_ze0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-SQH4pPT1YY:cDDwGdX_ze0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-SQH4pPT1YY:cDDwGdX_ze0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=-SQH4pPT1YY:cDDwGdX_ze0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/-SQH4pPT1YY" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/-SQH4pPT1YY/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/What-is-Production-Code-.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=254ef3ac-5839-4526-a9c8-e348711cd144</guid>
      <pubDate>Fri, 11 Sep 2009 08:36:00 -0800</pubDate>
      <category>.NET</category>
      <category>Design</category>
      <category>Design Patterns</category>
      <category>Methodology</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=254ef3ac-5839-4526-a9c8-e348711cd144</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=254ef3ac-5839-4526-a9c8-e348711cd144</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/What-is-Production-Code-.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=254ef3ac-5839-4526-a9c8-e348711cd144</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=254ef3ac-5839-4526-a9c8-e348711cd144</feedburner:origLink></item>
    <item>
      <title>An ASP.NET web root link handler</title>
      <description>In order to get a useful, all purpose, all use client-side href link back to root, from anywhere down the web folder structure, and paying attention to IIS6, IIS7, Cassini and other Visual Studio internal web hosting scenarious and of course the odd bug within ASP.NET and your own web site code, I created a handler for ~/. 
&lt;br/&gt;&lt;br/.

The ~ is supposed to work on server side, but then I believe (have not looked into it properly), it does not work when you have html, your own PageBuilderProvider, or custom compilation and/or some oddities we have had on various servers. It may be bad coding, bug or something, however the point is, this was easy enough to add, but wondering why it was needed in the first place.
&lt;br/&gt;&lt;br/&gt;
Here is the html I wanted.
&lt;br/&gt;&lt;br/&gt;
&lt;pre name="code" class="html"&gt;

&amp;lt;a href=&amp;quot;~/&amp;quot;&amp;gt;Some link to root of site&amp;lt;/a&amp;gt;

&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;

&lt;pre name="code" class="c-sharp"&gt;
public class RootHandler : IHttpHandler
    {
        #region IHttpHandler Members

        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Clear();
            string toUrl = context.Request.ApplicationPath;
            context.Response.Redirect(toUrl);
            context.Response.End();
        }

        #endregion
    }
&lt;/pre&gt;

&lt;br/&gt;&lt;br/&gt;

&lt;pre name="code" class="xml"&gt;
    &amp;lt;handlers&amp;gt;
      &amp;lt;remove name=&amp;quot;root&amp;quot;/&amp;gt;
      &amp;lt;add name=&amp;quot;root&amp;quot; verb=&amp;quot;*&amp;quot; path=&amp;quot;~/&amp;quot; type=&amp;quot;Namespace.RootHandler, Assembly&amp;quot;/&amp;gt;   
    &amp;lt;/handlers&amp;gt;
&lt;/pre&gt;

&lt;br/&gt;&lt;br/&gt;

Then with a little more code in the ProcessRequest method, you could find the ~/ part of the url, strip it down and modify the url. 
&lt;br/&gt;&lt;br/&gt;
&lt;pre name="code" class="xml"&gt;

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Clear();
            
            string toUrl = context.Request.ApplicationPath + "/";
            string url = context.Request.RawUrl;

            int idx = url.LastIndexOf("~/");

            url = url.Substring(idx + 2);
            
            url = VirtualPathUtility.Combine(toUrl, url);

            context.Response.Redirect(url);
            context.Response.End();
        }
&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
It is only with .NET Framework 3.5, where HttpHandlers have gotten to an acceptable bug free level for use.&lt;br/&gt;&lt;br/&gt;
Warning: this is a simplistic example for purpose of this post, please be careful in production scenarios. 
&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Slqc-9SyJd0:ttI4_yCa_Lc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Slqc-9SyJd0:ttI4_yCa_Lc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=Slqc-9SyJd0:ttI4_yCa_Lc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Slqc-9SyJd0:ttI4_yCa_Lc:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Slqc-9SyJd0:ttI4_yCa_Lc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=Slqc-9SyJd0:ttI4_yCa_Lc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Slqc-9SyJd0:ttI4_yCa_Lc:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Slqc-9SyJd0:ttI4_yCa_Lc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Slqc-9SyJd0:ttI4_yCa_Lc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Slqc-9SyJd0:ttI4_yCa_Lc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=Slqc-9SyJd0:ttI4_yCa_Lc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/Slqc-9SyJd0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/Slqc-9SyJd0/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/An-ASPNET-web-root-link-handler.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=50436a43-7c84-4d17-9f5b-6ccccc759950</guid>
      <pubDate>Thu, 20 Aug 2009 02:56:00 -0800</pubDate>
      <category>.NET</category>
      <category>asp.net</category>
      <category>c#</category>
      <category>Visual Studio</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=50436a43-7c84-4d17-9f5b-6ccccc759950</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=50436a43-7c84-4d17-9f5b-6ccccc759950</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/An-ASPNET-web-root-link-handler.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=50436a43-7c84-4d17-9f5b-6ccccc759950</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=50436a43-7c84-4d17-9f5b-6ccccc759950</feedburner:origLink></item>
    <item>
      <title>ASP.NET Framework Should Haves</title>
      <description>&lt;br/&gt;
ASP.NET should have been a plug-in from the start.
The IIS Handler, should have been split into (.NET with ASP.NET) and (.NET without ASP.NET). The idea of a config file and a WebConfigurationManager is not and should not have been specific to ASP.NET.
&lt;br/&gt;&lt;br/&gt;
One cannot help but feel that ASP.NET was designed with Web Server Controls as the flagship feature. "Create that 3rd party market for web". No real thought paid into how people actually use the web on simple terms.&lt;br/&gt;&lt;br/&gt;
What I am writing here, probably resembled the paper David Heinemeier Hansson scribbled on when thinking and designing Ruby on Rails, but I have no intention of mapping features, just stating the obvious.
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Get&lt;/b&gt; Server returns html&lt;br/&gt;
&lt;b&gt;Post&lt;/b&gt; Server *saves data and returns html&lt;br/&gt;
&lt;b&gt;Querystring&lt;/b&gt; may change what code is executed, and change the "context"&lt;br/&gt;
&lt;b&gt;Url&lt;/b&gt; may require changing, remapping, extension changes etc

&lt;br/&gt;&lt;br/&gt;
Now, to do this in ASP.NET is relatively straight forward? &lt;br/&gt; Yes it is, simple enough to do each thing, but it gets more complicated when you want all these ideas together.&lt;br/&gt;&lt;br/&gt;
There is also a grey area as to what we should call easy. Yes it's easy to do x, but is it simple and will it remain simple as time goes by.
&lt;br/&gt;The minute you start asking some questions, ASP.NET starts to give varying levels of success. What if it was posted from a different server? What if the html had to be static and not dynamic? what if you need to create your own physical files and return those to the browser? What if you did not want an aspx page at all? What if your new Module wants to create the Page (HttpHandler) &lt;br/&gt;&lt;br/&gt; 
Asp.NET is far too cluttered, and muddled. The design from, Web Server to a response, should have been completely extensible and pluggable.
&lt;br/&gt;&lt;br/&gt;
The problems that I have come across, over the last few months (again), have all been relating to ASP.NET not being able to let go. ASP.NET has so many tenuous links to what you write, its everything but impossible to break away. 
&lt;br/&gt;&lt;br/&gt;
A framework should always be designed in layers. A framework should not be a large foundational block, written to sit at the bottom only.
&lt;br/&gt;&lt;br/&gt;
if I am not entirely clear, perhaps a few links into oddities will help.&lt;br/&gt;
&lt;a href="http://www.developerfusion.com/article/4643/implementing-http-handlers-in-aspnet/3/"&gt;Actionless Form&lt;/a&gt;&lt;br/&gt;
Scenarios where switching viewstate off &lt;a href="http://stackoverflow.com/questions/647453/how-do-i-turn-off-viewstate-for-good"&gt; like this &lt;/a&gt; does not actually work.&lt;br/&gt;
and why &lt;A href="http://www.google.co.uk/search?hl=en&amp;q=caching+problem+asp.net&amp;btnG=Search&amp;meta="&gt;caching problems&lt;/a&gt; like &lt;a href="http://aspnet.4guysfromrolla.com/articles/022802-1.aspx#postadlink"&gt;this&lt;/a&gt; does not work properly all the time.&lt;br/&gt;
&lt;a href="http://www.google.co.uk/search?hl=en&amp;q=double+postbacks+asp.net&amp;btnG=Search&amp;meta="&gt;Double postback scenarios&lt;/a&gt;&lt;br/&gt;
The ridiculous &lt;a href="http://www.google.co.uk/search?hl=en&amp;q=isPostback&amp;meta="&gt; IsPostBack &lt;/a&gt; code and scenarios&lt;br/&gt; 
and it does not end. Friendly adaptors, bad html to asp.net naming, lack of rudimentary support for url manipulation, deflected posts and more, makes ASP.NET a framework look like &lt;a href="http://uncyclopedia.wikia.com/wiki/Leaning_Tower_of_Pizza"&gt;this&lt;/a&gt;. 
&lt;br/&gt;&lt;br/&gt;

In my humble opinion, on design/framework notions here are some ASP.NET should haves.
&lt;ul&gt;
&lt;li&gt;The HttpRuntime and associated server objects should have been better formulated and allow for better involvement. Allow extensibility. &lt;/li&gt;
&lt;li&gt;The runtime should have made Pages (HttpHandler) an optional unit of packaging and code, not the complete target. &lt;/li&gt;
&lt;li&gt;Better fine grained Page type. Split it into more pieces, separating cache, viewstate and more from the design. So we can use at any of the levels of interest.&lt;/li&gt;
&lt;li&gt;HttpHandlers should have been designed as a clear open and extensible list of handlers. The pattern should be more workflow like.&lt;/li&gt;
&lt;li&gt;The compilation process of asp.net syntax and html should have been an exposed set of objects, also extensible. (build providers)&lt;/li&gt;
&lt;li&gt;Expressions should have been designed much better, and give us control of more of the syntax.&lt;/li&gt;
&lt;li&gt;It should have been easy to create an aspx file and not have code behind, and include your own syntactical sugar.&lt;/li&gt;
&lt;li&gt;Asp.NET should have been a plug-in to the .net engine for the web, and not soo tightly coupled.&lt;/li&gt;
&lt;li&gt;Classic ASP should have been a continued 'available' and compatible unit within the framework.&lt;/li&gt;
&lt;li&gt;Should have reduced the gap between Server and Client side code. not server controls writing client code out, but rather a whole new better solution&lt;/li&gt;
&lt;li&gt;All that time it took to develop usercontrols and pages and server controls, could have been better spent on using existing syntax and an html object model for controls. It would have been compliant, less error prone and significantly better. &lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;&lt;br/&gt;
Personally, I cannot wait for the rewrite of ASP.NET. Unfortunately with all the man hours, money and face they have put into ASP.NET - they wont be brave to throw it away. Yes folks you will be stuck with it, and its even going to &lt;a href="http://forums.asp.net/1207.aspx"&gt;version 4&lt;/a&gt;. &lt;br/&gt;&lt;br/&gt;
I like the .NET framework as a whole, I love the c# language, but ASP.NET is a beast. Why on earth they built MVC on top, I'll never know. If it was not for Visual Studio supporting ASP.NET, it would be a disaster.
&lt;br/&gt;&lt;br/&gt;
ASP.NET just should not have!
&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=O8yMZFyQf6o:cOLbb22bbck:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=O8yMZFyQf6o:cOLbb22bbck:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=O8yMZFyQf6o:cOLbb22bbck:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=O8yMZFyQf6o:cOLbb22bbck:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=O8yMZFyQf6o:cOLbb22bbck:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=O8yMZFyQf6o:cOLbb22bbck:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=O8yMZFyQf6o:cOLbb22bbck:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=O8yMZFyQf6o:cOLbb22bbck:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=O8yMZFyQf6o:cOLbb22bbck:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=O8yMZFyQf6o:cOLbb22bbck:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=O8yMZFyQf6o:cOLbb22bbck:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/O8yMZFyQf6o" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/O8yMZFyQf6o/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/ASPNET-Framework-Should-Haves.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=646aca2a-6c21-4497-9b7f-dc40e90a6b28</guid>
      <pubDate>Thu, 23 Jul 2009 05:53:00 -0800</pubDate>
      <category>.NET</category>
      <category>c#</category>
      <category>Design</category>
      <category>Development Tools</category>
      <category>Visual Studio</category>
      <category>asp.net</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=646aca2a-6c21-4497-9b7f-dc40e90a6b28</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=646aca2a-6c21-4497-9b7f-dc40e90a6b28</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/ASPNET-Framework-Should-Haves.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=646aca2a-6c21-4497-9b7f-dc40e90a6b28</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=646aca2a-6c21-4497-9b7f-dc40e90a6b28</feedburner:origLink></item>
    <item>
      <title>How I fight with ASP.NET as a Framework</title>
      <description>&lt;br/&gt;
Bad, bad, Bad..
&lt;br/&gt;&lt;br/&gt;
I have soo much to write about this topic, I think I will leave it there....

&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ne9zQCbfMI4:NsKqhQFbgD0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ne9zQCbfMI4:NsKqhQFbgD0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=ne9zQCbfMI4:NsKqhQFbgD0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ne9zQCbfMI4:NsKqhQFbgD0:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ne9zQCbfMI4:NsKqhQFbgD0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=ne9zQCbfMI4:NsKqhQFbgD0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ne9zQCbfMI4:NsKqhQFbgD0:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ne9zQCbfMI4:NsKqhQFbgD0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ne9zQCbfMI4:NsKqhQFbgD0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ne9zQCbfMI4:NsKqhQFbgD0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=ne9zQCbfMI4:NsKqhQFbgD0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/ne9zQCbfMI4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/ne9zQCbfMI4/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/How-I-fight-with-ASPNET-as-a-Framework.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=89758458-89ef-40e7-8553-b3fa1e45560d</guid>
      <pubDate>Wed, 08 Jul 2009 07:57:00 -0800</pubDate>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=89758458-89ef-40e7-8553-b3fa1e45560d</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=89758458-89ef-40e7-8553-b3fa1e45560d</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/How-I-fight-with-ASPNET-as-a-Framework.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=89758458-89ef-40e7-8553-b3fa1e45560d</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=89758458-89ef-40e7-8553-b3fa1e45560d</feedburner:origLink></item>
    <item>
      <title>What I am building now</title>
      <description>&lt;br/&gt;
I have to build Forms. Web Forms, digital versions of paper forms. You know the kind. You get probably hate filling them in.&lt;br/&gt;
Currently there are a few forms, but expectations are, that many, many more forms are to follow. Forms for Edit, Forms with Permissions (part of forms visible to some, editable by others), forms saved as pdf, as html. Each form can expect largely varying workflows. Data from forms to varying database schemas. A complete nightmare to implement generically, but there is a need for a lot of it to sit on top of something familiar and useful across domains and clients.
&lt;br/&gt;
Some of the goals include: &lt;br/&gt;&lt;br/&gt;
&lt;br/&gt; - easier to maintain, add forms etc, than previous implementations. 
&lt;br/&gt; - easier to edit and deploy to different sites.
&lt;br/&gt; - customizable workflow
&lt;br/&gt; - customizable processing.
&lt;br/&gt; - Notifications, manual override of process, some manual flow points.
&lt;br/&gt;&lt;br/&gt;
This is kind of like ruby on rails meets Windows Workflow foundation. But alas that wont work out very well, as a combined technology and WCF is overkill in some areas, and might be worth doing on another level. However this is a .NET team, with no WCF experience. Would a quick Activity based object model not suffice?
&lt;br/&gt;
&lt;br/&gt;
I have been sitting with this for a few weeks now, and I have 90% of my plan of attack. However, I have started developing already. You guessed it, I have already built a small Framework of my own that will suit this development.
&lt;br/&gt;
If you have bright ideas, let me know.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=N8GSw4AcDRQ:8-d4LNi2M4g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=N8GSw4AcDRQ:8-d4LNi2M4g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=N8GSw4AcDRQ:8-d4LNi2M4g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=N8GSw4AcDRQ:8-d4LNi2M4g:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=N8GSw4AcDRQ:8-d4LNi2M4g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=N8GSw4AcDRQ:8-d4LNi2M4g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=N8GSw4AcDRQ:8-d4LNi2M4g:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=N8GSw4AcDRQ:8-d4LNi2M4g:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=N8GSw4AcDRQ:8-d4LNi2M4g:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=N8GSw4AcDRQ:8-d4LNi2M4g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=N8GSw4AcDRQ:8-d4LNi2M4g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/N8GSw4AcDRQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/N8GSw4AcDRQ/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/What-I-am-building-now.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=b4ede145-6d5f-4186-8c23-ee1e809e2d82</guid>
      <pubDate>Tue, 23 Jun 2009 06:33:00 -0800</pubDate>
      <category>.NET</category>
      <category>c#</category>
      <category>Frameworks</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=b4ede145-6d5f-4186-8c23-ee1e809e2d82</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=b4ede145-6d5f-4186-8c23-ee1e809e2d82</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/What-I-am-building-now.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=b4ede145-6d5f-4186-8c23-ee1e809e2d82</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=b4ede145-6d5f-4186-8c23-ee1e809e2d82</feedburner:origLink></item>
    <item>
      <title>Lack of MetaData on code and .NET Framework libraries</title>
      <description>&lt;br/&gt;
Although .NET Reflecton offers a decent look at the Types you build, it is pretty generic in its offering.
For example, it does not yet provide us with capabilities to control and secure how Reflection can inspect our Types. If you do not want a Type to be Instantiated via Reflection, or if you would like to restrict certain Types from being visible at all. Further there is no idea for extension or change. One cannot simply plug into Reflection and override behaviour. &lt;br/&gt;&lt;br/&gt;


&lt;h3&gt;High abstractions and higher flexibility&lt;/h3&gt;
Many more wrappers are needed, at a higher level, which would sit on top of .NET Reflection. For example, architectural dependencies. Agile mechanisms, if code had enough metadata attached, one could alter the code via reflection/refactoring in a much more dynamic way. Consider the following two web service methods in two different companies.
&lt;pre name="code" class="c-sharp"&gt;
  public class PersonService
    {
        public void AddPerson(string lastname, string firstname, 
            string birthdate)
        {
        }
    }

    public class PersonWebService
    {
        public void AddNew(string firstname, string surname)
        {
        }
    }
&lt;/pre&gt;
&lt;br/&gt;
You can see that they are completely different contracts. Interface and contract speaking they are like apples and sand. However, to your mapping, calculating, schema, metadata, tagging and understanding brain, its the same thing.&lt;br/&gt;&lt;br/&gt;
What we need, is to remove ourselves from Contracts to something more like guidelines.
&lt;br/&gt;&lt;br/&gt;
&lt;pre name="code" class="c-sharp"&gt;
  public class PersonService
    {
        [Operation(Schema:Person, "Add")]
        public void AddPerson([schema(LastName)]string lastname, 
             [schema(FirstName)]string firstname, 
             [schema(DateOfBirth)] string birthdate)
        {
        }
    }

    public class PersonWebService
    {
        [Operation(Schema:Person, "Add")]
        public void AddNew([schema(FirstName)]string firstname, 
             [schema(LastName)]string surname)
        {
        }
    }
&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HYA9oezyB-U:MMfo1qA3iYU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HYA9oezyB-U:MMfo1qA3iYU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=HYA9oezyB-U:MMfo1qA3iYU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HYA9oezyB-U:MMfo1qA3iYU:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HYA9oezyB-U:MMfo1qA3iYU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=HYA9oezyB-U:MMfo1qA3iYU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HYA9oezyB-U:MMfo1qA3iYU:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HYA9oezyB-U:MMfo1qA3iYU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HYA9oezyB-U:MMfo1qA3iYU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HYA9oezyB-U:MMfo1qA3iYU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=HYA9oezyB-U:MMfo1qA3iYU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/HYA9oezyB-U" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/HYA9oezyB-U/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Lack-of-MetaData-on-code-and-NET-Framework-librarie.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=c0ef3de5-e648-4ab3-b130-c3f51719b418</guid>
      <pubDate>Fri, 22 May 2009 04:59:00 -0800</pubDate>
      <category>.NET</category>
      <category>c#</category>
      <category>Code Generation</category>
      <category>Design</category>
      <category>Design Patterns</category>
      <category>Development Tools</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=c0ef3de5-e648-4ab3-b130-c3f51719b418</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=c0ef3de5-e648-4ab3-b130-c3f51719b418</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Lack-of-MetaData-on-code-and-NET-Framework-librarie.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=c0ef3de5-e648-4ab3-b130-c3f51719b418</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=c0ef3de5-e648-4ab3-b130-c3f51719b418</feedburner:origLink></item>
    <item>
      <title>Reverse Composite</title>
      <description>Not sure if there is a Design Pattern relating to this kind of need in another pattern catalogue, but it seemed simple enough to reverse the GOF composite. A class with a collection of leaves, that iterate, recurse its way up to the root. This needs work in terms of combining or actually making a variation on the composite. I think that this is perhaps only a .1 degree of separation. &lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Problem&lt;/h2&gt;
You have a list of Items, that may or may not be related. There may be 1 or more trees. You have a bag of unsorted or related objects as a signle array. You need to maintain a complete list of leaves, but also need the relationship/heirarchy to become apparent. You want to express the heirarchy in a Composite Pattern, but it would exclude certain leaves has it has no part in the particular root that the composite gets built on.
&lt;h2&gt;Context&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;
You need a collection of leaves, from across the composite tree. You need to have access to the parent and/or recurse to the root.&lt;/p&gt;
Types are stripped from its branches.
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Structure&lt;/h2&gt;
&lt;p&gt;A class that works with a collection of leaf classes, that each point to it's parent. In effect a composite in reverse. Keep all the leaf objects in a collection and build the heirarchy from the bottom up.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://www.jonathancrossland.com/image.axd?picture=2009%2f5%2freversecomposite.jpg" alt="" /&gt;&lt;br /&gt;
&lt;br /&gt;
One of the main reasons behind this is multiple paths to a set endpoint. The root becomes the set endpoint where by we can plot a course from a leaf. The Leaf though is where we start from and full knowledge of all leaves should be known at the outset.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
By adding a Parent on the Composite (GoF), you can achieve a similar result, but you will not have a flat list of leaves.&lt;br /&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=PS0u8FS58fo:bWKz6V5RWi8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=PS0u8FS58fo:bWKz6V5RWi8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=PS0u8FS58fo:bWKz6V5RWi8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=PS0u8FS58fo:bWKz6V5RWi8:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=PS0u8FS58fo:bWKz6V5RWi8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=PS0u8FS58fo:bWKz6V5RWi8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=PS0u8FS58fo:bWKz6V5RWi8:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=PS0u8FS58fo:bWKz6V5RWi8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=PS0u8FS58fo:bWKz6V5RWi8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=PS0u8FS58fo:bWKz6V5RWi8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=PS0u8FS58fo:bWKz6V5RWi8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/PS0u8FS58fo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/PS0u8FS58fo/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Reverse-Composite.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=fa5c962f-30fb-462e-919c-c591aa9ea731</guid>
      <pubDate>Fri, 22 May 2009 04:19:00 -0800</pubDate>
      <category>.NET</category>
      <category>c#</category>
      <category>Design</category>
      <category>Design Patterns</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=fa5c962f-30fb-462e-919c-c591aa9ea731</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=fa5c962f-30fb-462e-919c-c591aa9ea731</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Reverse-Composite.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=fa5c962f-30fb-462e-919c-c591aa9ea731</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=fa5c962f-30fb-462e-919c-c591aa9ea731</feedburner:origLink></item>
    <item>
      <title>VS.NET Add-ins worth looking at</title>
      <description>&lt;br/&gt;
Run VS.NET as Administrator on Vista.
&lt;br/&gt;&lt;br/&gt;
Export your settings using Tools | Import and Export Settings, don't let another windows reinstall take it all away from you.
&lt;br/&gt;&lt;br/&gt;
Get &lt;a href="http://www.rauchy.net/regionerate/"&gt;Regionerate &lt;/a&gt;&lt;br/&gt; - but make sure you use the "Remove All regions" command, before trying to apply others. It wont replace your existing regions.
&lt;br/&gt;&lt;br/&gt;
Get &lt;a href="http://www.exactmagic.com/downloads/"&gt;Studio Tools&lt;/a&gt;, for File manager and the tear off editor.
&lt;br/&gt;
&lt;br/&gt;
Download &lt;a href="http://www.devefor.com/download/"&gt;Dev /efor&lt;/a&gt; - not sure about the name, but it works nicely.
&lt;br/&gt;
&lt;br/&gt;
&lt;a href="http://www.codeplex.com/SnippetEditor/"&gt;Snippet Editor&lt;/a&gt;, useful, for changing the way the existing snippets work, as well as new ones.
&lt;br/&gt;
&lt;br/&gt;
&lt;a href="http://www.carlj.ca/2007/09/25/15-free-visual-studio-add-ins/"&gt;Carl J&lt;/a&gt; has a large list of add-ins.
&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=xLPEiXcUdh4:fg6eSq8r_aU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=xLPEiXcUdh4:fg6eSq8r_aU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=xLPEiXcUdh4:fg6eSq8r_aU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=xLPEiXcUdh4:fg6eSq8r_aU:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=xLPEiXcUdh4:fg6eSq8r_aU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=xLPEiXcUdh4:fg6eSq8r_aU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=xLPEiXcUdh4:fg6eSq8r_aU:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=xLPEiXcUdh4:fg6eSq8r_aU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=xLPEiXcUdh4:fg6eSq8r_aU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=xLPEiXcUdh4:fg6eSq8r_aU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=xLPEiXcUdh4:fg6eSq8r_aU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/xLPEiXcUdh4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/xLPEiXcUdh4/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/VSNET-Add-ins-worth-looking-at.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=007feb27-e053-46c3-9b16-8df97b7cb084</guid>
      <pubDate>Wed, 13 May 2009 04:53:00 -0800</pubDate>
      <category>.NET</category>
      <category>Development Tools</category>
      <category>DOTNET</category>
      <category>Visual Studio</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=007feb27-e053-46c3-9b16-8df97b7cb084</pingback:target>
      <slash:comments>9</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=007feb27-e053-46c3-9b16-8df97b7cb084</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/VSNET-Add-ins-worth-looking-at.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=007feb27-e053-46c3-9b16-8df97b7cb084</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=007feb27-e053-46c3-9b16-8df97b7cb084</feedburner:origLink></item>
    <item>
      <title>Why I use Twitter</title>
      <description>&lt;br/&gt;
It is amazing how these sorts of tools divide opinion.&lt;br/&gt; I usually blog about technology, especially framework oriented things, but I have been thinking a lot about business again. How can it work for business.
&lt;br/&gt;&lt;br/&gt;
For example, a company I have here in my midst, &lt;a href="http://www.oxford-creative.co.uk/"&gt; Oxford Creative&lt;/a&gt;, arose from building sites for the car manufacturer Seat. (They are searching for clients, so get on board quickly, as they are a small but effective team.)&lt;br/&gt;&lt;br/&gt; 
I have been talking about twitter and many of my friends do not see the point.&lt;br/&gt;&lt;br/&gt;
But twitter, is less evasive, more rapid, more dynamic than any other social media tool.&lt;br/&gt;I do not get hounded by it. I switch it off, its off. I switch it on, I have access to some great minds.
&lt;br/&gt;&lt;br/&gt;
I found this &lt;a href="http://www.slideshare.net/chrisabraham/how-to-use-twitter-effectively-for-business-and-advocacy?type=powerpoint"&gt;How To Use Twitter Effectively for Business and Advocacy&lt;/a&gt;, which says a lot about its power, amongst many other posts, which have been floating around twittersphere.
&lt;br/&gt;&lt;br/&gt;

I use it, because I can meet some interesting people, like @unclebobmartin, and @kentbeck, @bigballofmudd (Brian Foote). I like twitter because its less intrusive than phones, emails and facebook, but its powerful enough to communicate.
&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=dOVrKdie_IE:r8fx9_QS9Ik:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=dOVrKdie_IE:r8fx9_QS9Ik:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=dOVrKdie_IE:r8fx9_QS9Ik:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=dOVrKdie_IE:r8fx9_QS9Ik:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=dOVrKdie_IE:r8fx9_QS9Ik:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=dOVrKdie_IE:r8fx9_QS9Ik:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=dOVrKdie_IE:r8fx9_QS9Ik:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=dOVrKdie_IE:r8fx9_QS9Ik:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=dOVrKdie_IE:r8fx9_QS9Ik:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=dOVrKdie_IE:r8fx9_QS9Ik:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=dOVrKdie_IE:r8fx9_QS9Ik:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/dOVrKdie_IE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/dOVrKdie_IE/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Why-I-use-Twitter.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=bfd184da-0ed7-46c8-9c26-8788a4f596d9</guid>
      <pubDate>Mon, 11 May 2009 04:51:00 -0800</pubDate>
      <category>Other</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=bfd184da-0ed7-46c8-9c26-8788a4f596d9</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=bfd184da-0ed7-46c8-9c26-8788a4f596d9</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Why-I-use-Twitter.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=bfd184da-0ed7-46c8-9c26-8788a4f596d9</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=bfd184da-0ed7-46c8-9c26-8788a4f596d9</feedburner:origLink></item>
    <item>
      <title>From Software Interfaces to</title>
      <description>&lt;br/&gt;
Eventually Interfaces will be replaced with magnets!
&lt;/br/&gt;&lt;/br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=M779UJ_0gbU:B3OSD-wO7dg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=M779UJ_0gbU:B3OSD-wO7dg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=M779UJ_0gbU:B3OSD-wO7dg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=M779UJ_0gbU:B3OSD-wO7dg:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=M779UJ_0gbU:B3OSD-wO7dg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=M779UJ_0gbU:B3OSD-wO7dg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=M779UJ_0gbU:B3OSD-wO7dg:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=M779UJ_0gbU:B3OSD-wO7dg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=M779UJ_0gbU:B3OSD-wO7dg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=M779UJ_0gbU:B3OSD-wO7dg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=M779UJ_0gbU:B3OSD-wO7dg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/M779UJ_0gbU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/M779UJ_0gbU/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/From-Software-Interfaces-to.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=c3c5f51e-6ba7-41d2-94ff-e502c0351d14</guid>
      <pubDate>Fri, 08 May 2009 08:59:00 -0800</pubDate>
      <category>Design Patterns</category>
      <category>Frameworks</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=c3c5f51e-6ba7-41d2-94ff-e502c0351d14</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=c3c5f51e-6ba7-41d2-94ff-e502c0351d14</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/From-Software-Interfaces-to.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=c3c5f51e-6ba7-41d2-94ff-e502c0351d14</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=c3c5f51e-6ba7-41d2-94ff-e502c0351d14</feedburner:origLink></item>
    <item>
      <title>The Every Project Framework - Part 2</title>
      <description>&lt;br/&gt;
In &lt;a href="http://www.jonathancrossland.com/post/The-Every-Project-Framework-Part-1.aspx"&gt;The Every Project Framework - Part 1&lt;/a&gt;, I spoke of partitioning, and abstracting structure and infrastructure. Now Let's talk about how we do that.&lt;br/&gt;&lt;br/&gt;
Over the last decade, the most prolific and available Architectural Pattern introduced and adopted by business developers is the Layers pattern. Call it by another name, but the concept is around everywhere. Most enterprise systems have open or closed Layers. They have many names, but Data Access Layer, Business Layer and so on, are often used. This a good thing towards raising the level of abstraction, increasing the infrastructure and providing more structure. However, having layers, does not automatically mean your application is on a good footing. &lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Raising the bar&lt;/h3&gt;
&lt;i&gt;If you are very skeptical, read the 'Why' section below first.&lt;/i&gt;&lt;br/&gt;&lt;br/&gt;
What do you think of your objects? How do you think of them? Are they transportation, containers, db table wrappers or other? Majority of business applications I see, have objects as a 1 to 1 mapping to a database table and it effectively is a container for a row of data. Some then wrap it into a collection of these rows and you have a table. Is that really what you need? is that efficient and good practice? Does it raise the bar high enough?
&lt;br/&gt;&lt;br/&gt;
The first thing to say is that wrapping your table into an object is not entirely bad, as &lt;i&gt;it is&lt;/i&gt; a level of abstraction away from the table. &lt;br/&gt; However, if its at the highest level of abstraction you go to, then you will still have miles of code that you need to place elsewhere. Code such as Context, Security, Permissions, work flow and so on. If you manage all of your Types as a 1 to 1 mapping to the database tables, are you not merely writing code against the database?&lt;br/&gt;&lt;br/&gt;If its UI (form) accessing and using -&gt; the DataType Person, then your level of abstraction to the data is almost zero. You have abstracted the concept of a database table and replaced it with a more crude version, which you are populating.&lt;br/&gt;&lt;br/&gt;
Then the relationships and structure between all these singular Types will slowly come together within your UI, behind your button, in some method of some obscure class. Instead, the singular classes should be a little more structured and the bar should be raised higher, providing your UI with more closer, ready and easier to use objects. &lt;br/&gt;&lt;br/&gt; 

To repeat in more a programmatic way, consider a table named Person. &lt;br/&gt; &lt;br/&gt; 

If you have your &lt;b&gt;UI --&gt; Types --&gt; Table&lt;/b&gt; &lt;br/&gt;&lt;br/&gt;
effectively you have abstracted a Row and Column concept away from the UI and replaced it with a PersonType and a PersonTypeCollection.&lt;br/&gt; That means the UI, must understand how to deal with these Types.
&lt;br/&gt;&lt;br/&gt;
To raise the bar, you would have more abstractions between UI and database&lt;br/&gt; perhaps more like so&lt;br/&gt;&lt;br/&gt;

&lt;b&gt;UI --&gt; PersonCompositeType --&gt; transaction(PersonDataType1/PersonDataType2) --&gt; Table1/Table2 &lt;/b&gt;&lt;br/&gt;&lt;br/&gt;
So PersonCompositeType is at much high level. &lt;br/&gt;&lt;br/&gt;
&lt;i&gt;Please note:&lt;/i&gt;I am not saying that your architecture must look exactly like this, what I am suggesting is that more levels of abstraction can be achieved between the UI and your 1 to 1 mapped Type, that is so commonly found.
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Why?&lt;/h3&gt;
Have you ever had the following in your last or current project?
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;The UI is a lot more work than writing the "engine" or "business layers"! &lt;/b&gt;&lt;br/&gt;
&lt;i&gt;Well of course it is, because the level of abstraction for the business layer is so low.&lt;/i&gt;&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Your project starts quickly, progress seems to be made at speed, and then it slows right, right down....&lt;/b&gt;&lt;br/&gt;
It would, because, laying out database tables, getting your SQL and business objects in a 1 to 1 mapping is easy. Tying these low level abstraction together into a working application is harder. 
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Are you using a workflow engine? Are you using a business rules engine? Do you have isolated, stateless services? Do you have wrappers, commands, actions? &lt;/b&gt;&lt;br/&gt;
If not, then all the workflow, business rules, services are tucked away, most likely in your user interface. If you don't think you need these things, your large projects are most likely failing, running late and/or getting harder and harder to maintain. &lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Closing thoughts&lt;/h3&gt;
If you think in "the ways of frameworks". Not as a framework that will be released to the world. Not as a time consuming lets focus on the framework, but rather build it, partition it and expand it within the project, your application will benefit from having more structure and more infrastructure.&lt;br/&gt;&lt;br/&gt;
Even having one of those is vastly beneficial. That is why a company with their own libraries (infrastructure), can get an application up quicker, even if its not a framework. One or both infrastructure and structure is vital for reuse and time to market. Yet, there is very little training going on at university, or courses in this area.&lt;br/&gt;&lt;br/&gt; We should be training developers from their earliest years in software to think about reuse, to understand patterns, and putting rudimentary frameworks together. &lt;br/&gt;&lt;br/&gt;
Don't let the fact, that there are no perfect frameworks out there, lure you into thinking frameworks are bad. They are just diamonds in the rough. Most importantly, the "good" aspects of frameworks can be used within your application to high rewards. But how do you do it? -- stay tuned...
&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=tj46f4xHkQY:xbPlSyl8B0c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=tj46f4xHkQY:xbPlSyl8B0c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=tj46f4xHkQY:xbPlSyl8B0c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=tj46f4xHkQY:xbPlSyl8B0c:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=tj46f4xHkQY:xbPlSyl8B0c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=tj46f4xHkQY:xbPlSyl8B0c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=tj46f4xHkQY:xbPlSyl8B0c:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=tj46f4xHkQY:xbPlSyl8B0c:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=tj46f4xHkQY:xbPlSyl8B0c:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=tj46f4xHkQY:xbPlSyl8B0c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=tj46f4xHkQY:xbPlSyl8B0c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/tj46f4xHkQY" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/tj46f4xHkQY/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/The-Every-Project-Framework-Part-2.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=c381b861-748d-4e02-8a52-7e1e29e08e06</guid>
      <pubDate>Wed, 06 May 2009 05:25:00 -0800</pubDate>
      <category>Design</category>
      <category>Design Patterns</category>
      <category>Frameworks</category>
      <category>Methodology</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=c381b861-748d-4e02-8a52-7e1e29e08e06</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=c381b861-748d-4e02-8a52-7e1e29e08e06</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/The-Every-Project-Framework-Part-2.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=c381b861-748d-4e02-8a52-7e1e29e08e06</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=c381b861-748d-4e02-8a52-7e1e29e08e06</feedburner:origLink></item>
    <item>
      <title>The Every Project Framework - Part 1</title>
      <description>&lt;br/&gt;
In &lt;a href="http://www.jonathancrossland.com/post/The-Every-Project-Framework.aspx"&gt;The Every Project Framework - Introduction&lt;/a&gt;, I spoke of structure and infrastructure, lets now move a little deeper.
&lt;br/&gt;
[more]
&lt;br/&gt;
&lt;h3&gt;Structure is just like &lt;a href="http://www.sanza.co.uk/apps/shop/product.asp?pid=8095"&gt;Pronutro&lt;/a&gt;&lt;/h3&gt;
When you create an Application, you are immediately adding complexity and dependencies. How well you manage these is how long your application stays 'clean' or 'partitioned', but nevertheless your Application is getting structure with each method calling another, with each class depending on another. &lt;br/&gt;&lt;br/&gt;
If you don't think about a class, its name, where it should reside, or if you choose incorrectly it affects everything to come. You may not be aware of it entirely, but every decision has a consequence. Perhaps in the future we will have tools to help us deal with 10 or more steps of future planning, so we can verify our decisions a little better, but for now, we only rely on experience and intuition. (Like the movie Next with Nicholas Cage) &lt;br/&gt;&lt;br/&gt;
btw. Pronutro is a black hole for milk!
&lt;br/&gt;&lt;br/&gt;
We have all heard of 'spaghetti code', but code does not need to be that bad, before it can start becoming a strain to continue with. Just one configuration file setting in 1 tiny config file, can cause masses of damage if its not there or if its incorrect. Yet for the majority of the time, developers put things into configs and rely on the fact that its there.&lt;br/&gt;&lt;br/&gt; &lt;a href="http://www.jonathancrossland.com/page/Guide-for-Building-Frameworks.aspx"&gt;Convention over Configuration &lt;/a&gt; should be adhered to first as a rule.
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Partitions&lt;/b&gt;
&lt;br/&gt;
One of the most important aspects for agility within any structure is partitioning. Dividing lines between x and y. Effectively its all about low coupling. Read Grasp patterns regarding Cohesion and Coupling. But also how clean are the partitions? A clean break is when indirectly what you rely on works even if its not available. For example, I used TidyHtml to neaten some html before parsing it. If the TidyATL.dll is not registered in the registry, do I die a painful death or do i simply use the html and proceed to the next step without tidy? How you design and implement code with that sort of thought is what makes it a clean partition. Unfortunately at the extreme ends of things, our tools make this tremendously time consuming to get right for all scenarios. It is easy for example using Tidy, but a lot harder for most critical aspects of an application.
&lt;br/&gt;&lt;br/&gt;
Giving &lt;b&gt;Structure&lt;/b&gt; is a fundamental part, but below it on the "layers diagram", is the infrastructure. 
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Raising the Infrastructure&lt;/h3&gt;
Today it is pretty simple to use your current modern language to create a simple calculator. the level of abstraction is almost perfectly aligned to the requirements of the small Application. For example, the textbox in .NET is perfectly sufficient, and the Types float, decimal, double, int etc are all at the 'right level' for a calculator.&lt;br/&gt;However its not at the right level for a Stock Management Application or other more complex business software. This is where we need to raise our infrastructure to a more suitable level.&lt;br/&gt;And most of us do, we create Loggers, Data layers and so on, to aid us in reaching the Application from a higher vantage point. But are you properly aware of what is structure and what is infrastructure? And are you raising the level of abstraction high enough?
&lt;br/&gt;
&lt;br/&gt;
Next post, I will discuss these levels of abstraction, Architectural Design Patterns such as Layer, from the strict vantage point of structure and infrastructure. 
&lt;br/&gt;&lt;br/&gt;
&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=GzpyU3EnHZ0:ov6SKipMW_s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=GzpyU3EnHZ0:ov6SKipMW_s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=GzpyU3EnHZ0:ov6SKipMW_s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=GzpyU3EnHZ0:ov6SKipMW_s:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=GzpyU3EnHZ0:ov6SKipMW_s:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=GzpyU3EnHZ0:ov6SKipMW_s:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=GzpyU3EnHZ0:ov6SKipMW_s:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=GzpyU3EnHZ0:ov6SKipMW_s:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=GzpyU3EnHZ0:ov6SKipMW_s:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=GzpyU3EnHZ0:ov6SKipMW_s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=GzpyU3EnHZ0:ov6SKipMW_s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/GzpyU3EnHZ0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/GzpyU3EnHZ0/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/The-Every-Project-Framework-Part-1.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=d0cef720-3fad-4159-bb87-b1829504683b</guid>
      <pubDate>Fri, 01 May 2009 07:11:00 -0800</pubDate>
      <category>.NET</category>
      <category>Design</category>
      <category>Design Patterns</category>
      <category>Frameworks</category>
      <category>Methodology</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=d0cef720-3fad-4159-bb87-b1829504683b</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=d0cef720-3fad-4159-bb87-b1829504683b</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/The-Every-Project-Framework-Part-1.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=d0cef720-3fad-4159-bb87-b1829504683b</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=d0cef720-3fad-4159-bb87-b1829504683b</feedburner:origLink></item>
    <item>
      <title>Generic Object Suffixes for Naming your Classes</title>
      <description>&lt;br/&gt;
When creating a large project, it is sometimes extremely hard to find names for certain things. So I have a small list. I mix and match ActivityItem, PropertyItem, ElementFactory and so on. Helps with those generic classes you cant find names for!
&lt;br/&gt;
you probably already using most of them, if not all ..... (got more for me?)
&lt;br/&gt;
[more]

&lt;br/&gt;
&lt;br/&gt;
&lt;table width="100%"&gt;
    &lt;tr&gt;
        &lt;td valign=top&gt;
            &lt;b&gt;Single Item&lt;/b&gt;&lt;br/&gt;
            Activity&lt;br/&gt;
            Action&lt;br/&gt;
            Command&lt;br/&gt;
            Item&lt;br/&gt;
            Element&lt;br/&gt;
            Base&lt;br/&gt;
            Unit&lt;br/&gt;
            Node&lt;br/&gt;
            Property&lt;br/&gt;
            Column&lt;br/&gt;
            Row&lt;br/&gt;
            Value&lt;br/&gt;
        &lt;/td&gt;
        &lt;td valign=top&gt;
            &lt;b&gt;Arrays of Items&lt;/b&gt;&lt;br/&gt;
            Array&lt;br/&gt;
            Composite&lt;br/&gt;
            Collection&lt;br/&gt;
            List&lt;br/&gt;
            Set&lt;br/&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td valign=top&gt;
            &lt;b&gt;Contextual&lt;/b&gt;&lt;br/&gt;
            Info&lt;br/&gt;
            Context&lt;br/&gt;
            State&lt;br/&gt;
            Status&lt;br/&gt;
            Format&lt;br/&gt;
            Mode&lt;br/&gt;
            Level&lt;br/&gt;
            Type&lt;br/&gt;
            Scope&lt;br/&gt;
        &lt;/td&gt;
        &lt;td valign=top&gt;
            &lt;b&gt;Controllers/Managers/Services&lt;/b&gt;&lt;br/&gt;
            Runtime&lt;br/&gt;
            Environment&lt;br/&gt;
            Executor&lt;br/&gt;
            Handler&lt;br/&gt;
            Engine&lt;br/&gt;
            System&lt;br/&gt;
            Controller&lt;br/&gt;
            Provider&lt;br/&gt;
            Publisher&lt;br/&gt;
            Designer&lt;br/&gt;
            Manager&lt;br/&gt;
            Factory&lt;br/&gt;
            Builder&lt;br/&gt;
            Converter &lt;br/&gt;
            Inspector&lt;br/&gt;
            Service&lt;br/&gt;
            Utility&lt;br/&gt;
            Helper&lt;br/&gt;
            Message&lt;br/&gt;
            Process&lt;br/&gt;
            Thread&lt;br/&gt; 
            Reader&lt;br/&gt;
            Writer&lt;br/&gt;
            Serializer&lt;br/&gt;
            Action&lt;br/&gt;
            Command&lt;br/&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td valign=top&gt;
            &lt;b&gt;Extension&lt;/b&gt;&lt;br/&gt;
            Adaptor&lt;br/&gt;
            Extension&lt;br/&gt;
            Facade&lt;br/&gt;
            Proxy&lt;br/&gt;
            Wrapper&lt;br/&gt;
            Dynamic&lt;br/&gt;
            Static&lt;br/&gt;
        &lt;/td&gt;
        &lt;td valign=top&gt;
           

        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td valign=top&gt;
            &lt;b&gt;Configuration&lt;/b&gt;&lt;br/&gt;
            Attribute&lt;br/&gt;
            Configuration&lt;br/&gt;
            Setting&lt;br/&gt;
            &lt;br/&gt;
        &lt;/td&gt;
         &lt;td valign=top&gt;
            &lt;b&gt;User Interface&lt;/b&gt;&lt;br/&gt;
            Style&lt;br/&gt;
            View&lt;br/&gt;
            Component&lt;br/&gt;
            Control&lt;br/&gt;
            Editor&lt;br/&gt;
            Widget&lt;br/&gt;
            &lt;br/&gt;
        &lt;/td&gt;
    &lt;/tr&gt;   
&lt;/table&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ih0vGJpd4fM:cXLD5_Z7zTo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ih0vGJpd4fM:cXLD5_Z7zTo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=ih0vGJpd4fM:cXLD5_Z7zTo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ih0vGJpd4fM:cXLD5_Z7zTo:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ih0vGJpd4fM:cXLD5_Z7zTo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=ih0vGJpd4fM:cXLD5_Z7zTo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ih0vGJpd4fM:cXLD5_Z7zTo:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ih0vGJpd4fM:cXLD5_Z7zTo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ih0vGJpd4fM:cXLD5_Z7zTo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=ih0vGJpd4fM:cXLD5_Z7zTo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=ih0vGJpd4fM:cXLD5_Z7zTo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/ih0vGJpd4fM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/ih0vGJpd4fM/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Generic-Object-Suffixes-for-Naming-your-Classes.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=0943eebf-6912-460d-8979-c5f425b269e3</guid>
      <pubDate>Thu, 30 Apr 2009 05:03:00 -0800</pubDate>
      <category>Design</category>
      <category>Design Patterns</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=0943eebf-6912-460d-8979-c5f425b269e3</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=0943eebf-6912-460d-8979-c5f425b269e3</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Generic-Object-Suffixes-for-Naming-your-Classes.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=0943eebf-6912-460d-8979-c5f425b269e3</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=0943eebf-6912-460d-8979-c5f425b269e3</feedburner:origLink></item>
    <item>
      <title>The Every Project Framework - Introduction</title>
      <description>&lt;br/&gt;
Do you think of a Framework as a large 'hole, to be avoided'? Are they too complicated to develop within your project, for everyday development? &lt;br/&gt; 
I take the view, that a Framework can very easily be part of every project you build, and with great benefit. You just have to understand how.&lt;br/&gt;&lt;br/&gt;
A Framework has two very important characteristics to give to Applications. A Framework provides &lt;b&gt;structure&lt;/b&gt; and &lt;b&gt;infrastructure&lt;/b&gt;.&lt;br/&gt;&lt;br/&gt;
[more]
&lt;br/&gt;
&lt;h3&gt;Structure&lt;/h3&gt;
An application without structure is just text. An Application without structure contains no discernible patterns. If your Application contains no patterns, it becomes complicated. If you have structure and patterns, you have organization, categorization and commonality. An Application must have structure and I know that every single Application ever written has a structure. Every system ever built has patterns. Even the smallest console driven application will have a set way of dealing with arguments, and other code structure. 
&lt;br/&gt;&lt;br/&gt;
As developers we are inclined to think in patterns, that is why Design Patterns are familiar and majority of developers can agree that whether they use a Pattern from a book or their very own Design Patterns, a Pattern is a valid helpful tool. 
&lt;br/&gt;
&lt;h3&gt;Infrastructure&lt;/h3&gt;
An Application that does not have infrastructure, is voltage. All Applications sit on levels of abstraction, whether its the assembly language, a runtime, programming libraries and/API, all Applications rely on infrastructure.
The infrastructure of a given Application differs between projects, because as developers we can develop our own levels of abstraction, or rely only on those that are provided, or mostly somewhere in between. Even the smallest application will have some sort of API, or common shared library. We rely on the infrastructure provided at the bottom and the layers of abstraction all the way to our user interface.
&lt;br/&gt;&lt;br/&gt;
Structure and Infrastructure are at the heart of Frameworks. Yes, a Framework can be other things as well, but at its core, a Framework offers structure and infrastructure to an Application.&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Within all Applications...&lt;/h3&gt;
there lies a Framework. &lt;br/&gt;&lt;br/&gt;

The developers may not have consciously created it, nor was it perhaps designed, but its there. It may be difficult to see, dirty, mixed up within all your code, &lt;i&gt;but it is there!&lt;/i&gt;. The trick is to identify it and evolve it as you develop your Application. When you can separate the Application from the Framework (even if the framework is small), means you have separated along the two large dividing lines of change that will occur in your Application. Even if your Framework is not perfect and cannot be used outside of the current project, having it separate aids in the agility and life-time of the Application.&lt;br/&gt;&lt;br/&gt;
It is a craft, do not expect to build reusable complete Frameworks the first time, but as you build and think in the language of Frameworks, your skills will improve and it will become easier and easier.
&lt;br/&gt;&lt;br/&gt;
"a class is to object, as a Framework is to Application"
&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=rPZBYaGc7Pg:BANrXKHYO7Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=rPZBYaGc7Pg:BANrXKHYO7Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=rPZBYaGc7Pg:BANrXKHYO7Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=rPZBYaGc7Pg:BANrXKHYO7Q:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=rPZBYaGc7Pg:BANrXKHYO7Q:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=rPZBYaGc7Pg:BANrXKHYO7Q:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=rPZBYaGc7Pg:BANrXKHYO7Q:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=rPZBYaGc7Pg:BANrXKHYO7Q:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=rPZBYaGc7Pg:BANrXKHYO7Q:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=rPZBYaGc7Pg:BANrXKHYO7Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=rPZBYaGc7Pg:BANrXKHYO7Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/rPZBYaGc7Pg" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/rPZBYaGc7Pg/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/The-Every-Project-Framework.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=52ecc633-9345-4b01-9373-3def7e52dd75</guid>
      <pubDate>Mon, 27 Apr 2009 03:55:00 -0800</pubDate>
      <category>Design</category>
      <category>Design Patterns</category>
      <category>Frameworks</category>
      <category>Methodology</category>
      <category>Refactoring</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=52ecc633-9345-4b01-9373-3def7e52dd75</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=52ecc633-9345-4b01-9373-3def7e52dd75</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/The-Every-Project-Framework.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=52ecc633-9345-4b01-9373-3def7e52dd75</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=52ecc633-9345-4b01-9373-3def7e52dd75</feedburner:origLink></item>
    <item>
      <title>Refactoring complex classes using Composition Part 3</title>
      <description>&lt;br/&gt;
To conclude the previous two posts on using composition for refactoring complex classes
&lt;br/&gt;&lt;br/&gt;
&lt;a href="http://www.jonathancrossland.com/post/Refactoring-complex-classes-using-Composition-Part-1.aspx"&gt;Refactoring complex classes using Composition Part 1&lt;/a&gt;
&lt;br/&gt;and 
&lt;a href="http://www.jonathancrossland.com/post/Refactoring-complex-classes-using-Composition-Part-2.aspx"&gt;Refactoring complex classes using Composition Part 2&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;i&gt;Why should complex classes be refactored?&lt;/i&gt; To make code smaller and more manageable. To separate code that changes at different rates, and which are not concerned with the same things. 
&lt;br/&gt;&lt;br/&gt;
&lt;i&gt;Composition vs Inheritance?&lt;/i&gt; Composition = "has a" relationship, Inheritance "is a" relationship.
Inheritance quickly makes you feel like you create Object-Oriented code, but its one of those devices that should  be used for a real reason, not just off the cuff.

&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Reading&lt;/b&gt;
&lt;br/&gt;
- Some background from &lt;a href="http://c2.com/cgi/wiki?CompositionInsteadOfInheritance"&gt;C2 Wiki - Composition Instead Of Inheritance&lt;/a&gt;
&lt;br/&gt;
- A good principle from &lt;a href="http://www.laputan.org/lifecycle/lifecycle.html#Aggregations"&gt;Evolve aggregations from inheritance heirarchies &lt;/a&gt; - Brian Foote and William F. Opdyke
&lt;br/&gt;
- Look at Adaptor, Facade, Proxy from Design Patterns (GoF) and also the Stategy, which is mentioned here by Erich Gamma &lt;a href="http://www.artima.com/lejava/articles/designprinciples4.html"&gt;A Conversation with Erich Gamma, Part III&lt;/a&gt;
&lt;br/&gt;
- &lt;a href="http://www.refactoring.com/catalog/"&gt;Refactoring Catalog&lt;/a&gt; - Martin Fowler 
&lt;br/&gt;
- &lt;A href="http://www.martinfowler.com/bliki/refactoring.html"&gt;Refactoring posts&lt;/a&gt; - Martin Fowler
&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=X10rrNaTxy8:kYBrjgRe2P8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=X10rrNaTxy8:kYBrjgRe2P8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=X10rrNaTxy8:kYBrjgRe2P8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=X10rrNaTxy8:kYBrjgRe2P8:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=X10rrNaTxy8:kYBrjgRe2P8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=X10rrNaTxy8:kYBrjgRe2P8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=X10rrNaTxy8:kYBrjgRe2P8:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=X10rrNaTxy8:kYBrjgRe2P8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=X10rrNaTxy8:kYBrjgRe2P8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=X10rrNaTxy8:kYBrjgRe2P8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=X10rrNaTxy8:kYBrjgRe2P8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/X10rrNaTxy8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/X10rrNaTxy8/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Refactoring-complex-classes-using-Composition-Part-3.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=9358b234-3836-46a5-a8fb-a52d8b15ec73</guid>
      <pubDate>Mon, 20 Apr 2009 02:55:00 -0800</pubDate>
      <category>.NET</category>
      <category>c#</category>
      <category>Design</category>
      <category>Design Patterns</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=9358b234-3836-46a5-a8fb-a52d8b15ec73</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=9358b234-3836-46a5-a8fb-a52d8b15ec73</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Refactoring-complex-classes-using-Composition-Part-3.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=9358b234-3836-46a5-a8fb-a52d8b15ec73</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=9358b234-3836-46a5-a8fb-a52d8b15ec73</feedburner:origLink></item>
    <item>
      <title>Refactoring complex classes using Composition Part 2</title>
      <description>&lt;br/&gt;
Please Note: Please make sure you have proper unit test coverage on your classes, as you refactor.
&lt;br/&gt;&lt;br/&gt;
From Part 1, I showed you how I initially split a large class into a few more, splitting the complexity of having the code in one place. However, you will still find that for a really complex class, there will still be quite a lot to do. Here are a few more composition based things to consider for continuing the refactoring process.
&lt;br/&gt;&lt;br/&gt;
[more]
&lt;br/&gt;
&lt;h3&gt;Extract surrounding Exceptions&lt;/h3&gt;
You will have to decide where you do this carefully, according to your own code, but I try to pull out the larger surrounding Try/Catch blocks into the wrapper, like Start method below. I now can remove the code from RuntimeExecutor for exceptions on as many methods as possible. 
&lt;br/&gt;&lt;br/&gt;
There may well be places you do not want to do this, but if your RuntimeExecutor class is private and only used by this wrapper, you should be able to remove most Exception handling in the wrapped class.
&lt;br/&gt;
However, if the class is complex in this area, you may need an Exception Handling strategy instead. If your wrapped class, throws a complex amount of Exceptions in weird and wonderful areas within the code, you will have to think about it harder, but for most classes you can get away with extracting it.
&lt;br/&gt;&lt;br/&gt;
&lt;pre name="code" class="c-sharp"&gt;
//abbreviated version of the class.
    public class Runtime : IActionExecutor
    {
        public void Start()
        {
            try
            {
                _Executor.Start();
            }
            catch (Exception ex)
            {
                LastException = new RuntimeException("Execute Failed. See inner exception for details.", ex);
                Status = RuntimeStatus.Errored;
            }
        }

        public RuntimeException LastException
        {
            get
            {
                return _Exception;
            }
            protected set
            {
                _Exception = value;
            }
        }
    }
&lt;/pre&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h3&gt;Splitting by lifespan and age&lt;/h3&gt;
Think of your class in three main stages, Constructing, Running, Deconstructing and refactor based on it.
For example, move Initialization code from RuntimeExecutor to Runtime. My class has an Initialize method and some code in its constructor. I now refactor this into the wrapper Runtime. I also move initilization checks to the wrapper.
&lt;br/&gt;&lt;br/&gt;
&lt;pre name="code" class="c-sharp"&gt;
    //abbreviated version of the class.
    public class Runtime : IActionExecutor
    {
        public void Start()
        {
            try
            {
                if (_IsInitialized)
                    _Executor.Start();
            }
            catch (Exception ex)
            {
                LastException = new RuntimeException("Execute Failed. See inner exception for details.", ex);
                Status = RuntimeStatus.Errored;
            }
        }

        private void Initialize()
        {
            try
            {
                //Initialization code, sets RuntimeState (see Part 1)
                _IsInitialized = true;
            }
            catch (Exception ex)
            {
                LastException = new RuntimeException("Execute Failed. See inner exception for details.", ex);
                Status = RuntimeStatus.Errored;
            }
        }
      
    }
&lt;/pre&gt;
&lt;br/&gt;
I then do the same with any deconstruction code, so that they too exist in the Runtime class, and extracted from the RuntimeExecutor
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
The Utility class we created to move those more stateless methods into, can be expanded a little more, by moving even more methods from the main class into it. If you need to, you can even pass the RuntimeState instance via the constructor through to the class, so it can now have state. This will allow you to move even more methods into the Utility class. Remember this class is private and owned by the RuntimeExecutor. If some of these methods are more generic than that, you need to move it out into other classes.
&lt;br/&gt;&lt;br/&gt;
We created four classes from one bulky one. Here is an example in code, of what we did. 
&lt;br/&gt;&lt;br/&gt;
&lt;pre name="code" class="c-sharp"&gt;
 /// &lt;summary&gt;
    /// We refactored UP, and created a Wrapper
    /// We moved wrapper methods, exceptions to this class
    /// &lt;/summary&gt;
    public class MyTypeWrapper
    {
        MyType _MyType;
        MyTypeState _MyState;

        public MyTypeWrapper()
        {
            _MyState = new MyTypeState();
            _MyType = new MyType(_MyState);
        }
    }

    /// &lt;summary&gt;
    /// This is the original Bulky Class
    /// Some of its members moved UP (Wrapper)
    /// &lt;/summary&gt;
    internal class MyType
    {
        MyTypeState _MyState; //all fields now wrapped in MyTypeState
        MyTypeUtility _MyUtility;

        public MyType(MyTypeState myState)
        {
            _MyState = myState;
            _MyUtility = new MyTypeUtility();

        }
    }

    /// &lt;summary&gt;
    /// All the fields moved from MyType to here
    /// &lt;/summary&gt;
    internal class MyTypeState
    {
        public MyTypeState()
        {
        }
    }

    /// &lt;summary&gt;
    /// Methods moved here are stateless
    /// and/or if you add MyState, it can also be stateful.
    /// &lt;/summary&gt;
    internal class MyTypeUtility
    {
        public MyTypeUtility()
        {
        }
    }
&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Cleaning up&lt;/h3&gt;
You now need to make sure that all is tidy. I usually do a mixture of the following.
&lt;ol&gt;
&lt;li&gt;Rename methods to suit the new classes&lt;/li&gt;
&lt;li&gt;Split large methods at least into two&lt;/li&gt;
&lt;li&gt;Rename classes, to make sure they make sense&lt;/li&gt;
&lt;li&gt;Make RuntimeState, RuntimeExecutor classes private and check every method is private if its not called outside of its surroundings. If it is, I attempt to move the method to the utility class.&lt;/li&gt;
&lt;li&gt;See if the Interface we made in Part 1, is still required (most of the time it wont be, only useful for refactoring)&lt;/li&gt;
&lt;li&gt;If there are still large classes, I attempt it all from the start (Part 1)&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=mPQ4Dk2O1Qs:wwhcK_H3MAU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=mPQ4Dk2O1Qs:wwhcK_H3MAU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=mPQ4Dk2O1Qs:wwhcK_H3MAU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=mPQ4Dk2O1Qs:wwhcK_H3MAU:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=mPQ4Dk2O1Qs:wwhcK_H3MAU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=mPQ4Dk2O1Qs:wwhcK_H3MAU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=mPQ4Dk2O1Qs:wwhcK_H3MAU:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=mPQ4Dk2O1Qs:wwhcK_H3MAU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=mPQ4Dk2O1Qs:wwhcK_H3MAU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=mPQ4Dk2O1Qs:wwhcK_H3MAU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=mPQ4Dk2O1Qs:wwhcK_H3MAU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/mPQ4Dk2O1Qs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/mPQ4Dk2O1Qs/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Refactoring-complex-classes-using-Composition-Part-2.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=628721bf-8c47-4db8-8330-5bf3a7191883</guid>
      <pubDate>Thu, 09 Apr 2009 04:07:00 -0800</pubDate>
      <category>.NET</category>
      <category>c#</category>
      <category>Methodology</category>
      <category>Refactoring</category>
      <category>Visual Studio</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=628721bf-8c47-4db8-8330-5bf3a7191883</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=628721bf-8c47-4db8-8330-5bf3a7191883</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Refactoring-complex-classes-using-Composition-Part-2.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=628721bf-8c47-4db8-8330-5bf3a7191883</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=628721bf-8c47-4db8-8330-5bf3a7191883</feedburner:origLink></item>
    <item>
      <title>Refactoring complex classes using Composition Part 1</title>
      <description>&lt;br/&gt;
Please Note: Please make sure you have proper unit test coverage on your classes, as you refactor.
&lt;br/&gt;&lt;br/&gt;
Using Design Patterns which deal with compositional power, such as Wrapper, Facade, Adaptor, Bridge, Proxy and others are extremely useful for breaking large classes down. Rather have 10 smaller classes than 1 large one.&lt;br/&gt;&lt;br/&gt;
Well here is a very simple start to how to get your refactoring of that large class under way. Please be sure to compile your project after each step, to fix any errors, before moving to the next step.
&lt;br/&gt;&lt;br/&gt;
[more]
&lt;br/&gt;
&lt;h3&gt;Step 1&lt;/h3&gt;
Split the class into two and create a wrapper.
&lt;br/&gt;
&lt;ol&gt;
&lt;li&gt;Pick a very large, complex class. Mine is called "Runtime"&lt;/li&gt;
&lt;li&gt;Refactor the name of the class. I will call mine "RuntimeExecutor". Add any suffix for the moment, you can always come back to it. (Naming classes becomes harder and harder as you divide classes.) &lt;/li&gt;
&lt;li&gt;Add a new class with the "old name". Runtime. &lt;/li&gt;
&lt;li&gt;Extract the Interface of ActionExecutor. In VS.NET you simply right-click on the RuntimeExecutor class, and select Refactor | Extract Interface&lt;br/&gt; For this exercise, simply select all the members.&lt;/li&gt;
&lt;li&gt;A new class file with IRuntimeExecutor interface is created.&lt;/li&gt;
&lt;li&gt;Now implement the interface on the Runtime class.&lt;/li&gt;
&lt;li&gt;And create an Instance of the RuntimeExecutor from within the constructor of Runtime&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
It will look something like the code below

&lt;br/&gt;&lt;br/&gt;
&lt;pre name="code" class="c-sharp"&gt;
//abbreviated version of the class.
    public class Runtime : IActionExecutor
    {
        RuntimeExecutor _Executor; // this is the original class, renamed and now included as variable

        public Runtime()
        {
            _Executor = new RuntimeExecutor(); // we create the instance
        }

        #region IRuntimeExecutor Members

        public void Start()
        {
            _Executor.Start(); //we call the executor
        }

        public void Stop()
        {
            _Executor.Stop(); //we call the executor
        }

        #endregion
    }
&lt;/pre&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h3&gt;Step 2&lt;/h3&gt;
In the code above, you can see that I have added _Executor.Start() to the Start method. So in effect, Runtime is simple wrapping the Start of RuntimeExecutor. Now the next few steps are harder, but will increase the rewards.
&lt;br/&gt;
&lt;ol&gt;
&lt;li&gt;Create a new class suffixed with State. I called mine RuntimeState&lt;/li&gt;
&lt;li&gt;Take all the fields and properties for those fields from RuntimeExecutor, and cut/paste into State.&lt;/li&gt;
&lt;li&gt;If you only have Fields, refactor them so that you now have Proeprties for those fields&lt;/li&gt;
&lt;li&gt;Add a private field for the RuntimeState in RuntimeExecutor and &lt;/li&gt;
&lt;li&gt;Modify the contructor of RuntimeExecutor by adding "RuntimeState state" as a new parameter, mapping the parameter to the field.&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;pre name="code" class="c-sharp"&gt;
    //new state class
    internal class RuntimeState
    {
        private string _Field;
       
        public string Field
        {
            get { return _Field; }
            set { _Field = value; }
        }

    }

    internal class RuntimeExecutor : IRuntimeExecutor
    {
        
        private RuntimeState _State; //new field, replaces all the other fields that were here

        public RuntimeExecutor(RuntimeState state) //new param
        {
            _State = state; //set it and use it

            //now wherever it used the old fields, map it to the _State.NewField
           _State.Field = "some value";

        }
     }
&lt;/pre&gt;
&lt;br/&gt;
&lt;br/&gt;
So at this point, instead of 1 class, you have three. We refactored the class into two, the original and the State version. And we wrapped it higher up, by renaming it and substituting it for the new wrapper.
&lt;br/&gt;
&lt;ol&gt;
&lt;li&gt;RuntimeExecutor (renamed original)&lt;/li&gt;
&lt;li&gt;Runtime (new, a wrapper for RuntimeExecutor)&lt;/li&gt;
&lt;li&gt;RuntimeState, (new split all properties and fields from RuntimeExecutor)&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;h3&gt;Step 3&lt;/h3&gt;
We now need to split the original class further. This time instead of wrapping it, or refactoring UP, we now need to refactor down. Inspect the original class, and locate any methods that can be isolated and split from the class with minimal fuss.
&lt;ol&gt;
&lt;li&gt;Locate methods that are only looking at RuntimeState only, and move them, cut/paste into the RuntimeState class.&lt;/li&gt;
&lt;li&gt;Make these methods internal, and point RuntimeExecutor to _State.MethodName&lt;/li&gt;
&lt;li&gt;Locate methods that are utility functions to the class, such as getConfiguration, or IsRunning, and that can be moved to another class. If you have such functions, create a new class for it, and move it to the new location&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
So now you should have 4 classes from the original 1. 
&lt;ol&gt;
&lt;li&gt;RuntimeExecutor (renamed original)&lt;/li&gt;
&lt;li&gt;Runtime (new, a wrapper for RuntimeExecutor)&lt;/li&gt;
&lt;li&gt;RuntimeState (now contains state related functions)&lt;/li&gt;
&lt;li&gt;Utility class containing helpful functions&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;/br&gt;&lt;/br&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
I follow this pattern for refactoring large classes that does not present itself clearly as refactorable. It gives me a set way of doing things, which then offers up more refactoring choices as I go along. &lt;br/&gt;
For example. When I find a lot of state, perhaps I refactor that too, into even smaller state classes. &lt;br/&gt;Importantly though as you go along, you should be on the lookout for common classes. Perhaps another large classes State was extremely similar. &lt;br/&gt;I then follow a pattern using inheritance for refactoring, and perhaps break things down even smaller.&lt;br/&gt;&lt;br/&gt; 
&lt;br/&gt;
In Part 2, I will show you how to utilize the wrapper for even more refactoring loveliness.
&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=6OyTz_qGwPQ:XVGh03XV_60:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=6OyTz_qGwPQ:XVGh03XV_60:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=6OyTz_qGwPQ:XVGh03XV_60:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=6OyTz_qGwPQ:XVGh03XV_60:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=6OyTz_qGwPQ:XVGh03XV_60:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=6OyTz_qGwPQ:XVGh03XV_60:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=6OyTz_qGwPQ:XVGh03XV_60:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=6OyTz_qGwPQ:XVGh03XV_60:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=6OyTz_qGwPQ:XVGh03XV_60:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=6OyTz_qGwPQ:XVGh03XV_60:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=6OyTz_qGwPQ:XVGh03XV_60:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/6OyTz_qGwPQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/6OyTz_qGwPQ/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Refactoring-complex-classes-using-Composition-Part-1.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=5e78c9d1-b285-4dd6-abb9-598c99071025</guid>
      <pubDate>Wed, 08 Apr 2009 04:09:00 -0800</pubDate>
      <category>.NET</category>
      <category>c#</category>
      <category>Methodology</category>
      <category>Refactoring</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=5e78c9d1-b285-4dd6-abb9-598c99071025</pingback:target>
      <slash:comments>11</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=5e78c9d1-b285-4dd6-abb9-598c99071025</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Refactoring-complex-classes-using-Composition-Part-1.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=5e78c9d1-b285-4dd6-abb9-598c99071025</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=5e78c9d1-b285-4dd6-abb9-598c99071025</feedburner:origLink></item>
    <item>
      <title>Smegging Code Metrics</title>
      <description>&lt;br/&gt;
Traditional Code Metrics such as LOC an CC is absolutely rubbish. It is pretty much as useful as Flesch-Kincaid is for reading. &lt;a href="http://www.standards-schmandards.com/exhibits/rix/"&gt;A C# code file &lt;/a&gt; measures quite readable.
&lt;br/&gt;&lt;br/&gt;
[more]
&lt;br/&gt;&lt;br/&gt;
Also, how strange that doing a search on &lt;a href="http://en.wikipedia.org/wiki/Code_Metrics"&gt;Wikipedia for Code Metrics&lt;/a&gt; takes you to what can only be described as a Microsoft Advert. Its dying... It's dead... Only three or four add-ins for visual studio? Not much competition.
&lt;br/&gt;&lt;br/&gt; 
Does anyone think that Code metrics in the traditional form is helpful at all?
&lt;br/&gt;&lt;br/&gt;
The problem is we can't measure code yet. We cannot make judgements on quality. or can we?
&lt;br/&gt;&lt;br/&gt;
Perhaps we can look at code, from architecture. A Service Oriented Architecture has a different quality belief system than Object-Oriented. We know what formulae to create on either. We know that less state in a SOA application is more quality? &lt;br/&gt;&lt;br/&gt;or what about patterns. If well known Design Patterns can be found within code, is it better than non well known Patterns, or no discernible pattern?&lt;br/&gt;&lt;br/&gt;
I think these sorts of questions can begin to get answered properly now. Someone will create that new system/formulae soon. We need a system, and it will be provided, eventually.
&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Ur_S6SrdDj8:8QZTt4pya3o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Ur_S6SrdDj8:8QZTt4pya3o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=Ur_S6SrdDj8:8QZTt4pya3o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Ur_S6SrdDj8:8QZTt4pya3o:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Ur_S6SrdDj8:8QZTt4pya3o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=Ur_S6SrdDj8:8QZTt4pya3o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Ur_S6SrdDj8:8QZTt4pya3o:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Ur_S6SrdDj8:8QZTt4pya3o:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Ur_S6SrdDj8:8QZTt4pya3o:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=Ur_S6SrdDj8:8QZTt4pya3o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=Ur_S6SrdDj8:8QZTt4pya3o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/Ur_S6SrdDj8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/Ur_S6SrdDj8/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Smegging-Code-Metrics.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=510903f5-2349-48b6-a4ca-c46765e298eb</guid>
      <pubDate>Fri, 03 Apr 2009 07:05:00 -0800</pubDate>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=510903f5-2349-48b6-a4ca-c46765e298eb</pingback:target>
      <slash:comments>9</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=510903f5-2349-48b6-a4ca-c46765e298eb</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Smegging-Code-Metrics.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=510903f5-2349-48b6-a4ca-c46765e298eb</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=510903f5-2349-48b6-a4ca-c46765e298eb</feedburner:origLink></item>
    <item>
      <title>How much should you design Upfront?</title>
      <description>&lt;br/&gt;
&lt;h2&gt;FeelGoodFactor&lt;/h2&gt;
I follow the FeelGoodFactor principle. Requirements at first glance can be cloudy and messy. It can ambiguous and abstract, or it could just be plain daunting. However, you need to list what you can, and the attempt 'solves'. By solves, I mean a logical route to a solve, a prototypical solution to that problem, or at least common consensus by a few good men (cough). You need to get most of the areas in your head sorted, and then commit a bit of that solution in your head to paper and a review by your peers. &lt;br/&gt;&lt;br/&gt;
[more]
&lt;br/&gt;
Here are some example of how I have conducted the last few projects, in the context of FeelGoodFactor.
&lt;h2&gt;Case Studies&lt;/h2&gt;
&lt;h3&gt;Document Generator&lt;/h3&gt;
Client wanted PDF and or possibly html versions of contracts and documents, downloadable from their website. They wanted the documents to be dynamic, so that it included data, their development team would inject into it.&lt;br/&gt;&lt;br/&gt;
There should be an editor for the mail merge like features, manage data templates (data fields) via XML, manage documents and map documents to data templates. A programmatic object model for adding data to the documents and rendering it out to pdf or html.
&lt;br/&gt;&lt;br/&gt;
The &lt;b&gt;FeelGoodFactor&lt;/b&gt; came once, I had established which PDF library, I was to use, and the approach I was to take. 
The approach was to create a parser, mapping expressions to data, and rendering to pdf, html or whatever the DocumentWriter was required. The extensible parts where DataFields (They would constantly change, or be added to), and the format the document would be required in, PDFDocumentWriter, HTMLDocumentWriter.&lt;br/&gt;&lt;br/&gt;I was not concerned with the website, the document management side, as I knew I would quickly create a set of tables and UI of it, there was nothing to design for the early upfront stage of design.&lt;br/&gt;&lt;br/&gt;
I first wrote the XML Schema for the DataFields, and an ObjectModel to read/write the XML, and then moved to create a parser for html, to find my custom schema expressions. 
&lt;br/&gt;&lt;br/&gt;
So after 2 days, of writing code, aiding my design thoughts, and prototyping 3rd party technology, I quickly decided on a few Design Patterns that would coalesce into the base design, which I sketched in UML on paper and then started coding. Within 12 days, I finished the system, complete with +-70% test coverage, and example code in the form of recipes and Reference Help file for the small Framework. I then spent two days creating a few tables, and an API for Document Management on the server, using the Framework, ready for our website team, to use and integrate within the various sites and feature points. &lt;br/&gt;They created a web service to wrap some of the functions and call it offsite, and it was done. 
&lt;br/&gt;&lt;br/&gt;
So the project had 2 days of thought, design, and prototyping, and 10 days developing. I developed in iterations of 2 days, and therefore had 5 iterations. iteration 1 and 2 was development and Unit Tests, 3 and 4 was refactoring and developing. Iteration 5 was testing and documenting.
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Publishing Framework&lt;/h3&gt;
For internal movement of files, website images, document management, it was required to move files of certain types configurable to different servers, folders, ftp and other locations. It also had to work work and accept ONIX request for books and publishable content, with managing files, such as TOCS, covers etc&lt;br/&gt;&lt;br/&gt;After deciding on the architecture, Windows Services and Windows Communication Foundation, I created a small design prototype. I set to work creating  the Web Service and Windows Service. Once that was communicating, sending any size files to the server, and not corrupting it or losing data, or anything else, I was in the &lt;b&gt;FeelGoodFactor&lt;/b&gt;. I could then happily design each section within iterations as the project went on. The project also contained Onix publishing schema, and Onix Product publishing, with adaptors for DotnetNuke and many other facets.
&lt;br/&gt;&lt;br/&gt;
This was developed over 7 iterations of 12 days each. I lead the design for 3 developers including myself. I spent the first 3 days, by myself, outlining some ideas, investigating Onix and other aspects. We had 2 meetings discussion ideas for the project. I spent 2 days creating an initial project, with hooks and areas for the team to continue on with, and gave them each a separate area to develop, with isolated objectives and isolated functionality. We integrated our work in iteration 2, and continued to code together in team system for iteration 2. We had regular scrums, not always in the morning and probably more every 2 days, than everyday. &lt;br/&gt;I then did iteration 3 myself, as they worked on other projects. This gave me an opportunity to delete projects in team system (they get so messy), recreate projects, split and refactor projects, drag and drop classes aroundm change Namespaces, and create a more fine grained beast. With a more fine grained set of projects and solutions, it looks a lot better, and I got that FeelGoodFactor. At this stage with had 3 separate Visual Studio Solutions with around 6 projects in each.&lt;br/&gt;&lt;br/&gt;
In Iteration 4, I was rejoined by the two developers and we set to work creating unit tests, refactoring, and adding extra rounding features. Iteration 5, we started with a day or so of design meetings and requirements gathering, and set to work expanding the solution. I continued to design a new area, while the team continued developing new functionality.&lt;br/&gt;
Iteration 6 and 7, I was alone again, developing the last functions, refactoring, testing and making the design stick. I also documented various bits and pieces of the 'framework' portion of the project.
&lt;br/&gt;&lt;br/&gt;
Iteration 8, which is the very next iteration, has been postponed, until our client, can meet and review. We shall not continue further, as specialization, further business rules and so on are required.
&lt;br/&gt;&lt;br/&gt;
So the project has totalled 84 days, of which 10 days has been spent on design, thought and prototyping. However, I probably spend about 1 hour per day, refactoring and moulding the design, while adding new features.
&lt;br/&gt;&lt;br/&gt;
The database, may get built slowly as we develop, but the focus is never on the database. I treat it as a throw away resource for these smaller projects. Both projects use reusable company Data Utilities, and can relatively easily be implemented in another database platform (depending on features, but we avoid platform specifics)
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Design is not dead&lt;/h3&gt;
Design is needed, you need to sit down and evaluate things. But the key is quiet time. Design must solve the problems it set out to solve. It must be a reachable design, within the time frame. You can reach a deadline easier, if your design is within iterations and gradually getting bigger, with the project. When you design upfront, one tends to add more things that are required. Designing for problems, evaluating solutions to problems, should be done upfront. Identify the problems within the system, and solve those, by careful thought, prototyping and any tool, such as UML, if it suits your needs, but don't design every object within your object model. &lt;br/&gt;&lt;br/&gt; It would be a wasted of time, outlining the complete UML drawn object model, instead draw packages and the very important classes. Then create a set of rules/standards for the developers to follow, when creating the rest of the model. Also set a rule, that if you have to 'think twice', communicate with the team lead, to verify your thoughts. The same goes for when you cannot concentrate, perhaps never had breakfast. Get your team leader to pair program with you for a little bit. I call it The 'PushStart'. All of us need it from time to time. &lt;br/&gt;&lt;br/&gt;
So design until you feel that FeelGoodFator, and then develop an iteration, until it gets 'cloudy', then design until you get that FeelGoodFactor again. Now that is being Agile!
&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1TAvCdpWpkc:kb9FqdTMxRE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1TAvCdpWpkc:kb9FqdTMxRE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=1TAvCdpWpkc:kb9FqdTMxRE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1TAvCdpWpkc:kb9FqdTMxRE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1TAvCdpWpkc:kb9FqdTMxRE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=1TAvCdpWpkc:kb9FqdTMxRE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1TAvCdpWpkc:kb9FqdTMxRE:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1TAvCdpWpkc:kb9FqdTMxRE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1TAvCdpWpkc:kb9FqdTMxRE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1TAvCdpWpkc:kb9FqdTMxRE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=1TAvCdpWpkc:kb9FqdTMxRE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/1TAvCdpWpkc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/1TAvCdpWpkc/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/How-much-should-you-design-Upfront.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=fa9f588c-0ddb-4f89-a48d-cb25946c6e04</guid>
      <pubDate>Mon, 30 Mar 2009 07:22:00 -0800</pubDate>
      <category>.NET</category>
      <category>c#</category>
      <category>Design</category>
      <category>Design Patterns</category>
      <category>Methodology</category>
      <category>Visual Studio</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=fa9f588c-0ddb-4f89-a48d-cb25946c6e04</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=fa9f588c-0ddb-4f89-a48d-cb25946c6e04</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/How-much-should-you-design-Upfront.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=fa9f588c-0ddb-4f89-a48d-cb25946c6e04</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=fa9f588c-0ddb-4f89-a48d-cb25946c6e04</feedburner:origLink></item>
    <item>
      <title>A Simple Software Design Methodology</title>
      <description>&lt;br/&gt;
&lt;div style="padding:15px;border:1px solid #ccc;"&gt;
&lt;br/&gt;Hi, after you read this post, don't miss my podcast Interview with  &lt;a href="http://www.jonathancrossland.com/page/Talkware.aspx"&gt; Robert C. Martin&lt;/a&gt; and &lt;a href="http://www.jonathancrossland.com/page/Talkware.aspx"&gt; Kent Beck&lt;/a&gt;.
&lt;/div&gt;
&lt;br/&gt;
No matter what software development methodology you adopt, you will always be faced with 'design' that is between good and bad, between necessary and unnecessary, between complicated and over-complicated. Design, even if it is technically good, can have disastrous effects on the project, if implemented incorrectly, or creates discord within a team, misunderstanding. In fact there are so many reasons, it would be better just to tell you what good design &lt;i&gt;is&lt;/i&gt;. That's if I could, but I can't!.&lt;br/&gt;
However, I can say that Design is one of the most important factors for a project, it influences time lines more than anything else. Underdesigning, or overdesigning, neglecting to think ahead far enough, not including certain implicit requirements can all add days and weeks to a project. 
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Most of the time, its in your hands&lt;/h3&gt;
A project requires thought and understanding. It takes a wide range of thinking outside of the box, thinking realistically, but yet being extremely open to ways of improvement. Here are three activities that will definitely aid your methodologies, &lt;b&gt;skydiving&lt;/b&gt; and &lt;b&gt;chess&lt;/b&gt; and &lt;b&gt;music&lt;/b&gt;.  &lt;br/&gt;&lt;br/&gt;

[more]
&lt;br/&gt;
&lt;h2&gt;Skydiving&lt;/h2&gt;
Skydiving, you jump out the plane, the ground is the deadline, and you simply ride the wind, and try to get finished before you hit the ground. &lt;br/&gt;&lt;br/&gt;
Often we are creating the projects, setting up a design, and coding it, within minutes or hours. &lt;br/&gt; The &lt;i&gt;first&lt;/i&gt; 'design' that sounds plausible, remains relatively unchallenged. We build some classes, think a little and then start coding. Most of the actual design is fleshed out as we go.&lt;br/&gt; &lt;i&gt;Unless&lt;/i&gt; you have a team, where design does get challenged, a lot. You get teams of developers debating direction and throwing pros and cons, which would be good, if there was a result. However, I have seen too many meetings end in stalemate, because it gets tiring. Not everyone thinks on the same wave length at the same time. &lt;br/&gt;&lt;br/&gt;
You cannot solve all the problems in one meeting. You cannot solve a design, or build some UML for the whole system on the whiteboard, using everyone's ideas, and thoughts. You will be there for days, weeks and many will get irritated and tired. It sounds obvious to let someone lead the design, but many projects, in todays flatten work environments want to get teamwork functioning and get the team to debate and meeting the designs. This will never work, unless it is very small, focused and within a time-frame, knowing that it may not be solved there and then. &lt;br/&gt;&lt;br/&gt;
&lt;b&gt; software methodology principle number 1. &lt;/b&gt; &lt;i&gt;Stop Skydiving&lt;/i&gt;.
&lt;br/&gt;&lt;br/&gt;

&lt;h2&gt;Chess&lt;/h2&gt;
Although we have refactoring tools, it takes real skill refactoring complex code, without breaking it, and still making it better. A large system can take weeks to refactor. In fact, most of the time, it doesn't get fixed properly. Maybe a little, but not completely.&lt;br/&gt;&lt;br/&gt; So between "designing everything upfront" and  "afterthough and refactoring", we need to consider more, and learn to read ahead.
Like chess we should actually be stretching ourselves, practising to think ahead. In chess, its relatively easy to think of a few possibilities, but to really take advantage of the board, you have to be thinking ahead, further than your opponent.&lt;br/&gt; In development, we need to get our read/think ahead skills better honed.
&lt;br/&gt;&lt;br/&gt;In chess, players think about the pieces, where each piece can move to, where it conflicts with moves of other possibilities. They construct a sort of tree, an algorithm, that each player might tailor to their own abilities and skills. They build this 'possibility tree', and then asses the tree for 'patterns', set moves, known strategies, and then further they inflate and deflate nodes in their minds eye, as to each nodes are more important, are more risky, or more possible to give them maximum rewards. &lt;br/&gt;&lt;br/&gt;
&lt;b&gt; software methodology principle number 2. &lt;/b&gt; &lt;i&gt;Play Chess&lt;/i&gt;.
&lt;br/&gt;&lt;br/&gt;
&lt;h2&gt;Music&lt;/h2&gt;
Rhythm, timing, tuning and arrangement, are the pinnacles of a good band. Without it, the best songs are rendered as noise.
&lt;br/&gt;&lt;br/&gt;The first thing is to find the rhythm section. Most importantly this will be your drummer and bass player. They have to be tight. They are providing the timing and the overall rhythmic feel. Then you need the rhythm guitar, who follows the drummer and bass, he has to add a little more flare at times, but overall, he is simply giving the treble feel. The Vocalists, and backup singers are providing the stage presence, the user interface and the meaning. &lt;br/&gt;Developers who understand their position and work within their area, listening to the other band members and adjusting themselves to eachother.
&lt;br/&gt;&lt;br/&gt;
Playing as a band, takes a little planning. Sometimes jamming is good, but most of the time, jamming will result in a rough product, perhaps with some awesome sections, and amazing solos, but as a record, it should be well rehearsed, tight and arranged with care. Then you get quality. &lt;br/&gt;&lt;br/&gt;
By the way, you also need someone to help you get into time, practice and coordinate things. There is always a band leader. There are also many many egos in a band, and the good ones learn how to do with that, so that the focus becomes the music, not the people.
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt; software methodology principle number 3. &lt;/b&gt; &lt;i&gt;Play as a Band&lt;/i&gt;.
&lt;br/&gt;&lt;br/&gt;

&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1_PdB1LnmAY:f05YKDpSokM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1_PdB1LnmAY:f05YKDpSokM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=1_PdB1LnmAY:f05YKDpSokM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1_PdB1LnmAY:f05YKDpSokM:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1_PdB1LnmAY:f05YKDpSokM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=1_PdB1LnmAY:f05YKDpSokM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1_PdB1LnmAY:f05YKDpSokM:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1_PdB1LnmAY:f05YKDpSokM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1_PdB1LnmAY:f05YKDpSokM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=1_PdB1LnmAY:f05YKDpSokM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=1_PdB1LnmAY:f05YKDpSokM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/1_PdB1LnmAY" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/1_PdB1LnmAY/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/A-Simple-Software-Development-Methodology.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=7c137ab7-ba25-4a4c-84a1-d3ab0a5ee6a6</guid>
      <pubDate>Fri, 27 Mar 2009 04:35:00 -0800</pubDate>
      <category>.NET</category>
      <category>Design</category>
      <category>Design Patterns</category>
      <category>Frameworks</category>
      <category>Methodology</category>
      <category>MethodologyWeek</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=7c137ab7-ba25-4a4c-84a1-d3ab0a5ee6a6</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=7c137ab7-ba25-4a4c-84a1-d3ab0a5ee6a6</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/A-Simple-Software-Development-Methodology.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=7c137ab7-ba25-4a4c-84a1-d3ab0a5ee6a6</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=7c137ab7-ba25-4a4c-84a1-d3ab0a5ee6a6</feedburner:origLink></item>
    <item>
      <title>ExtensionMethods repository</title>
      <description>&lt;br/&gt;
Oh what joy. Fons Sonnemans and Loek van den Ouweland have created a repository for ExtensionMethods. Go on, you know you want to. The site &lt;a href="http://www.extensionmethod.net"&gt;ExtensionMethod&lt;/a&gt;, allows you to submit your own creations to the community. 
&lt;br/&gt;&lt;br/&gt;
Now I had this idea, just around 10 minutes before I found the site, so they beat me fair and square. (By a mile).
So therefore here is my top three ideas for the site, which I had, and hope they think about.
&lt;br/&gt;
&lt;br/&gt;
&lt;b&gt;1. Grade it&lt;/b&gt;&lt;br/&gt;
Allow us to vote for it. However more than that, flag it with Compiled, Tested. Little icons that the site show next to each method. 
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;2. Open Source the ExtensionMethod &lt;/b&gt;&lt;br/&gt;
Allow the community to edit the code, which will improve it over time. If I use it, and it fails because of something small, allow me to edit it, and solve the problem for everyone. Add original author, and contributor names to the list. Perhaps allow an 'Editor' per Type, to look after it and make sure its tested and complete.
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;2. Give us an Assembly&lt;/b&gt;&lt;br/&gt;
Run a build, once a month, compile all the snippets, which could be done automatically, if you get the correct data from the submitted snippet.&lt;br/&gt;
As part of the grading, is whether your automated compilation worked, when including the snippet. (snippet compiler like, compile on the fly and validate the method).
&lt;br/&gt;&lt;br/&gt;Now we can all download an Assembly for all these community driven ExtensionMethods.

Updated: I found this nice, yet strangely odd set of &lt;A href="http://codechunk.blogspot.com/"&gt;ExtensionMethods for boolean&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=G2OyFOTsKOQ:pGIPSVdJ5LI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=G2OyFOTsKOQ:pGIPSVdJ5LI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=G2OyFOTsKOQ:pGIPSVdJ5LI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=G2OyFOTsKOQ:pGIPSVdJ5LI:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=G2OyFOTsKOQ:pGIPSVdJ5LI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=G2OyFOTsKOQ:pGIPSVdJ5LI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=G2OyFOTsKOQ:pGIPSVdJ5LI:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=G2OyFOTsKOQ:pGIPSVdJ5LI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=G2OyFOTsKOQ:pGIPSVdJ5LI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=G2OyFOTsKOQ:pGIPSVdJ5LI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=G2OyFOTsKOQ:pGIPSVdJ5LI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/G2OyFOTsKOQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/G2OyFOTsKOQ/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/ExtensionMethods-repository.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=66818c8d-d11b-4323-8cc2-536b8fd0de79</guid>
      <pubDate>Wed, 25 Mar 2009 07:15:00 -0800</pubDate>
      <category>.NET</category>
      <category>c#</category>
      <category>Design Patterns</category>
      <category>Visual Studio</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=66818c8d-d11b-4323-8cc2-536b8fd0de79</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=66818c8d-d11b-4323-8cc2-536b8fd0de79</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/ExtensionMethods-repository.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=66818c8d-d11b-4323-8cc2-536b8fd0de79</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=66818c8d-d11b-4323-8cc2-536b8fd0de79</feedburner:origLink></item>
    <item>
      <title>Future Proofing your Application</title>
      <description>&lt;br/&gt;
Software lifespan types
&lt;br/&gt;&lt;br/&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;StaggeredRelease&lt;/b&gt; &lt;br/&gt; 
We develop versions and patches and roll them out periodically. 
&lt;/li&gt;

&lt;li&gt;&lt;b&gt;ContinuousLeak&lt;/b&gt;&lt;br/&gt;
We fix and create mini patches, live alteration, component replacement, &lt;i&gt;live&lt;/i&gt; into the environment. Typically its developed by in-house staff, developers and/or support.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OneHitWonder&lt;/b&gt;&lt;br/&gt;
An App created and used, more or less with no problems or errors. Seems to be around for a while, and then fades away. Typically a utility, which has very little value, and soon gets replaced or irrelevant. Typically a quick utility written by someone on inspiration, but with little time to spend on its up keep.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RewriteEvolution&lt;/b&gt;&lt;br/&gt;
An App released again and again, but always with the knowledge that it &lt;i&gt;will&lt;/i&gt; be rewritten and/or always seems to get rewritten. Typically where there seems to be little justification on spending a lot of time on it.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ConcreteBeast&lt;/b&gt;&lt;br/&gt;
An App, that is not liked or really wanted at all, but seems to be impossible to get rid off as too many things are dependent on it. Typically a piece of software installed before you got there.&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;&lt;br/&gt;
[more]
&lt;br/&gt;&lt;br/&gt;
Future proofing can be expensive, but there are some easy things to do, to increase your odds by a few percentage points. So in order to future-proof it, what should you do?
First of all realize what kind of application its going to be, what characteristics will it have. You can use the quick list above, or some better scale.
&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Depending on less, not more&lt;/h3&gt;
Loose coupling is an important factor in our making of agile software. Separating interface from implementation and other Patterns that promote loose coupling are very important for &lt;b&gt;everyday&lt;/b&gt; development.
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Use generalizations if you are not sure&lt;/h3&gt;
Use a generalized, abstracted wrapper. Talk to your own Document object, and snap in with a Pattern of some sort, the actual real MS Word Document. This extensible model is vital, for allowing your Application to continue on through changes that happen around it. Actually this should be called use good Design Principles.
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Control of Source and Components&lt;/h3&gt;
Even though one tries to depend on less, we may still use many components, user interface controls and so on, which is good for reuse, but bad for dependencies. But try to avoid using reusable components, especially those you do not own, which is in direct conflict with increasing reuse and everything I stand for, but nevertheless.
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Choose the right platform&lt;/h3&gt;
Sometimes the platform or framework may dissipate. Choose your platform wisely. Think of Linq2SQL. Sometimes you need to go with something, like DAO, because, well, what else is there, that you could trust more? Now its ADO.NET which us currently 7? years old.
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Know your RoadMaps &lt;/h3&gt;
Get all the roadmaps of technologies that you depend on. Understand the manufacturer, their product cycles, and history.
Learn a lot, read a lot and get your intuition firing. 
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Ask your manufacturer&lt;/h3&gt;
How long do you expect to support this component? How long? Its ok if its only 3 years, if it coincides with your application lifespan. Sometimes they can be very helpful, and sometimes you will find subtle aspects that will help your choice, so just ask.
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Avoid the Latest thing&lt;/h3&gt;
Unless, your intuition says otherwise. Its sometimes great being one of the bleeding edge, but its very risky.

&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-L3VL6TRyrI:Rm0_l4oFO50:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-L3VL6TRyrI:Rm0_l4oFO50:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=-L3VL6TRyrI:Rm0_l4oFO50:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-L3VL6TRyrI:Rm0_l4oFO50:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-L3VL6TRyrI:Rm0_l4oFO50:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=-L3VL6TRyrI:Rm0_l4oFO50:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-L3VL6TRyrI:Rm0_l4oFO50:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-L3VL6TRyrI:Rm0_l4oFO50:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-L3VL6TRyrI:Rm0_l4oFO50:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=-L3VL6TRyrI:Rm0_l4oFO50:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=-L3VL6TRyrI:Rm0_l4oFO50:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/-L3VL6TRyrI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/-L3VL6TRyrI/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Future-Proofing-your-Application.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=3920809a-6bc1-4555-ace8-cc73e69c747b</guid>
      <pubDate>Tue, 24 Mar 2009 09:06:00 -0800</pubDate>
      <category>Design</category>
      <category>Methodology</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=3920809a-6bc1-4555-ace8-cc73e69c747b</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=3920809a-6bc1-4555-ace8-cc73e69c747b</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Future-Proofing-your-Application.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=3920809a-6bc1-4555-ace8-cc73e69c747b</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=3920809a-6bc1-4555-ace8-cc73e69c747b</feedburner:origLink></item>
    <item>
      <title>Frameworks and the MSDN Library</title>
      <description>&lt;br/&gt;
We all know that the learning curve for Frameworks are quite high. We all know that Frameworks demand commitment, and learning time. We know this because we struggle with it everyday, whether its Java or .NET, Swing, or MFC. 
&lt;br/&gt;&lt;br/&gt;
1991-1993, Ralph Johnson and others wrote about Recipes and Cookbooks. There have been papers on documenting frameworks for more than 15 years. MSDN has some of the flavours but none of it is actually polished, nor tailored to the audience and the way in which people seek information.&lt;br/&gt;
&lt;br/&gt;&lt;br/&gt;
My &lt;A href="http://www.jonathancrossland.com/page/D4-Software-Frameworks.aspx"&gt;D4 Software Frameworks Pattern Language&lt;/a&gt; points you to some Patterns for documenting Frameworks:&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;WritingReference&lt;/b&gt;&lt;br/&gt;
 You must provide a reference of interfaces.&lt;br/&gt;
&lt;b&gt;WritingRecipe&lt;/b&gt;&lt;br/&gt;
 You need to provide examples of isolated features of the framework that a pure reference cannot show.&lt;br/&gt;
&lt;b&gt;WritingCookbook&lt;/b&gt;&lt;br/&gt;
 You need to combine a large amount of recipes.&lt;br/&gt;
&lt;b&gt;SelfDescribing&lt;/b&gt;&lt;br/&gt;
 Using tools and generators, you can generate documentation.&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
All of them are self explanatory, except let me add, amazing that blogs seem to be the number 1 source for this kind of information, as well as google tends to find things on MSDN better than MSDN finds on their own material?.
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;The Solution to the MSDN Dilemna&lt;/h3&gt;
The last one (SelfDescribing) is where I am particularly keen. Not GeneratingReference but SelfDescribing Imagine if a method on a class called MethodA() had been marked with an attribute called TemplateMethod()&lt;br/&gt;&lt;br/&gt;
Well a Tool, would be able to highlight it for you. If you had a tree of all Types, TemplateMethods and Hooks, you would now better understand the way in which the types where constructed. You would now know that MethodA() called Method(B) then  MethodC(). The internals of MethodA() ois not known, shown or cared for. But from a documentation point of view it is crucual for certain designs. &lt;br/&gt;&lt;br/&gt;
It is this, that is missing from MSDN, because it is missing from all frameworks. Documentation needs to be better, but cannot, until the compiled code, can be examined in a much more thorough way. Developers of Frameworks, must declare their intentions of methods, class and patterns by attributing metadata onto it.
&lt;br/&gt;&lt;br/&gt;
So the solution, is to mark the .NET Framework Types with documenting metadata. Allow all Framework developers to utilize this metadata descriptions for their frameworks, and provide a tool to inspect it.
&lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=lPE3bcPiwBQ:-8TmY0jnly4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=lPE3bcPiwBQ:-8TmY0jnly4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=lPE3bcPiwBQ:-8TmY0jnly4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=lPE3bcPiwBQ:-8TmY0jnly4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=lPE3bcPiwBQ:-8TmY0jnly4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=lPE3bcPiwBQ:-8TmY0jnly4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=lPE3bcPiwBQ:-8TmY0jnly4:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=lPE3bcPiwBQ:-8TmY0jnly4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=lPE3bcPiwBQ:-8TmY0jnly4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=lPE3bcPiwBQ:-8TmY0jnly4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=lPE3bcPiwBQ:-8TmY0jnly4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/lPE3bcPiwBQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/lPE3bcPiwBQ/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Frameworks-and-the-MSDN-Library.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=f076101d-1a38-43c7-8ef8-fe862179be4a</guid>
      <pubDate>Mon, 23 Mar 2009 08:02:00 -0800</pubDate>
      <category>.NET</category>
      <category>Design</category>
      <category>Design Patterns</category>
      <category>Frameworks</category>
      <category>Visual Studio</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=f076101d-1a38-43c7-8ef8-fe862179be4a</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=f076101d-1a38-43c7-8ef8-fe862179be4a</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Frameworks-and-the-MSDN-Library.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=f076101d-1a38-43c7-8ef8-fe862179be4a</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=f076101d-1a38-43c7-8ef8-fe862179be4a</feedburner:origLink></item>
    <item>
      <title>D4 Software Frameworks</title>
      <description>&lt;br/&gt;Effectively, here is an Index to the pattern language in draft.&lt;br/&gt;&lt;br/&gt;

&lt;h2&gt;A Pattern Language for Designing, Developing, Documenting and Deploying Object-Oriented Software Frameworks&lt;/h2&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt; &lt;img src="http://www.jonathancrossland.com/image.axd?picture=2009%2f3%2fd4.png" alt="D4 Software Frameworks" /&gt;
&lt;/div&gt;
[more]
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin: 10px;"&gt;
&lt;h3&gt;D1: Designing Patterns&lt;/h3&gt;
&lt;img align="right" alt="" src="http://www.jonathancrossland.com/weblog/images/designingpatterns.png" /&gt;
&lt;div style="margin: 20px;"&gt; &lt;strong&gt;Designing Patterns&lt;/strong&gt; are concerned with the Designing process and compliment Developing Patterns for implementations. They can be utilized as standalone patterns but usually combined for best effect. They can also be combined with design methodologies and design principles. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Designing Patterns discussed here (not Design Patterns [GOF]), are a category of Patterns that relate to the design of a Software Framework.  		Designing Patterns compliment and point to Design Patterns [GOF] but are different in nature.&lt;/em&gt;&lt;/div&gt;
&lt;ul&gt; &lt;em&gt;					&lt;/em&gt;
    &lt;li&gt;&lt;em&gt;DesignGeneralized&lt;br /&gt;
    &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;Find what is inherently or adherently common&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
    &lt;em&gt;					&lt;/em&gt;
    &lt;li&gt;&lt;em&gt;DesignAbstraction&lt;br /&gt;
    &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;Find what is common via abstraction.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
    &lt;em&gt;					&lt;/em&gt;
    &lt;li&gt;&lt;em&gt;DesignRefinement&lt;br /&gt;
    &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;Refine abstract and generalized concepts.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
    &lt;em&gt;					&lt;/em&gt;
    &lt;li&gt;&lt;em&gt;CoalescentPatterns&lt;br /&gt;
    &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;Use one or more Design Patterns (GOF) to achieve goal.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
    &lt;em&gt;					&lt;/em&gt;
    &lt;li&gt;&lt;em&gt;ApplyAmmersePrinciples&lt;br /&gt;
    &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;Apply good design principles such as &lt;a href="http://www.jonathancrossland.com/page/AMMERSE-Principle-methods-for-Software-Design.aspx"&gt;AMMERSE&lt;/a&gt;&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
    &lt;em&gt;					&lt;/em&gt;
    &lt;li&gt;&lt;em&gt;UseIterativeDesign&lt;br /&gt;
    &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;Start with DesignGeneralized, then DesignAbstraction and lastly DesignRefinement&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
    &lt;em&gt;				&lt;/em&gt;&lt;/ul&gt;
    &lt;em&gt;				&lt;br /&gt;
    &lt;br /&gt;
    &lt;/em&gt;
    &lt;h3&gt;&lt;em&gt;D2: Developing Patterns&lt;/em&gt;&lt;/h3&gt;
    &lt;em&gt;				&lt;img src="http://www.jonathancrossland.com/image.axd?picture=2009%2f3%2fdevelopingpatterns.png" align="right"  alt="" /&gt;				&lt;/em&gt;
    &lt;div style="margin: 20px;"&gt; &lt;em&gt;				&lt;strong&gt;Developing Patterns&lt;/strong&gt; are used to provide Patterns for implementing Software Frameworks. Developing patterns are architecturally minded, and they serve to &lt;em&gt;realize&lt;/em&gt; Designing Patterns by their implementation techniques. 				&lt;/em&gt;&lt;/div&gt;
    &lt;em&gt;				&lt;/em&gt;
    &lt;ul&gt; &lt;em&gt;					&lt;/em&gt;
        &lt;li&gt;&lt;em&gt;DevelopHotspot&lt;br /&gt;
        &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;Discover where your hotspots should be. Choose DevelopWhitebox or DevelopBlackbox&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
        &lt;em&gt;					&lt;/em&gt;
        &lt;li&gt;&lt;em&gt;DevelopWhitebox&lt;br /&gt;
        &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;You want less DesignRefinement or require some form of DesignAbstraction or DesignGeneralized to remain.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
        &lt;em&gt;					&lt;/em&gt;
        &lt;li&gt;&lt;em&gt;DevelopBlackbox&lt;br /&gt;
        &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;You want less DesignAbstration or DesignGeneralized and want complete DesignRefinement.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
        &lt;em&gt;					&lt;/em&gt;
        &lt;li&gt;&lt;em&gt;ConfigurationTool&lt;br /&gt;
        &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;You have used DesignBlackbox and require more flexibility and customization.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
        &lt;em&gt;					&lt;/em&gt;
        &lt;li&gt;&lt;em&gt;CodeGeneration&lt;br /&gt;
        &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;You have used DevelopWhitebox and want to allow for easier and quicker DesignRefinement.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
        &lt;em&gt;					&lt;/em&gt;
        &lt;li&gt;&lt;em&gt;SoftwareFactory&lt;br /&gt;
        &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;You have ConfigurationTool and CodeGeneration but want more power and flexibility.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
        &lt;em&gt;				&lt;/em&gt;&lt;/ul&gt;
        &lt;em&gt;				&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;

        &lt;/em&gt;
        &lt;h3&gt;&lt;em&gt;D3: Documenting Patterns&lt;/em&gt;&lt;/h3&gt;
        &lt;em&gt;				&lt;img src="http://www.jonathancrossland.com/image.axd?picture=2009%2f3%2fdocumentingpatterns.png" align="right" alt="" /&gt;				&lt;/em&gt;
        &lt;div style="margin: 20px;"&gt; &lt;em&gt;					&lt;strong&gt;Documenting Patterns&lt;/strong&gt; are used to describe the Software Framework and aid the Deploying Patterns.&lt;br /&gt;
        They facilitate and maximize understanding and therefore protential reuse. 				&lt;/em&gt;&lt;/div&gt;
        &lt;em&gt;				&lt;/em&gt;
        &lt;ul&gt; &lt;em&gt;					&lt;/em&gt;
            &lt;li&gt;&lt;em&gt;WritingReference&lt;br /&gt;
            &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;You must provide a reference of interfaces.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
            &lt;em&gt;					&lt;/em&gt;
            &lt;li&gt;&lt;em&gt;WritingRecipe&lt;br /&gt;
            &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;You need to provide examples of isolated features of the framework that a pure reference cannot show.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
            &lt;em&gt;					&lt;/em&gt;
            &lt;li&gt;&lt;em&gt;WritingCookbook&lt;br /&gt;
            &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;You need to combine a large amount of recipes.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
            &lt;em&gt;					&lt;/em&gt;
            &lt;li&gt;&lt;em&gt;Self-Describing&lt;br /&gt;
            &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;Using tools and generators, you can generate documentation.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
            &lt;em&gt;				&lt;/em&gt;&lt;/ul&gt;
            &lt;em&gt;				&lt;br /&gt;
            &lt;br /&gt;
            &lt;br /&gt;
            &lt;br /&gt;
            &lt;/em&gt;
            &lt;h3&gt;&lt;em&gt;D4: Deploying Patterns&lt;/em&gt;&lt;/h3&gt;
            &lt;em&gt;				&lt;img src="http://www.jonathancrossland.com/image.axd?picture=2009%2f3%2fdeployingpatterns.png" align="right" alt="" /&gt; 				&lt;/em&gt;
            &lt;div style="margin: 20px;"&gt; &lt;em&gt;					&lt;strong&gt;Deploying Patterns &lt;/strong&gt; &lt;em&gt;realizes&lt;/em&gt; the Software Framework itself, and looks at ways that maximize the Frameworks reuse potential.  				&lt;/em&gt;&lt;/div&gt;
            &lt;em&gt;				&lt;/em&gt;
            &lt;ul&gt; &lt;em&gt;					&lt;/em&gt;
 &lt;li&gt;&lt;em&gt;DeployWithSupport&lt;br /&gt;
                &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;You need maximum facilitation of the framework.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;                
                &lt;em&gt;					&lt;/em&gt;
                &lt;li&gt;&lt;em&gt;DeployWithSampleApplication&lt;br /&gt;
                &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;You need to show off and demonstrate complex capabilities that WritingRecipe and WritingCookbooks do not show.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
                &lt;em&gt;					&lt;/em&gt;
                &lt;li&gt;&lt;em&gt;DeployWithTraining&lt;br /&gt;
                &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;Although Documenting Patterns are applied you need to further adoption.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;DeployAsIntegration&lt;br /&gt;
                &amp;nbsp;&lt;font face="tahoma" color="#909090"&gt;Although Documenting Patterns are applied, Your framework requires easy and quicker implementation and adoption.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
               &lt;/ul&gt;
                &lt;em&gt;				&lt;br /&gt;
                &lt;br /&gt;
                &lt;/em&gt;
                &lt;h5&gt;&lt;em&gt;Bibliography&lt;/em&gt;&lt;/h5&gt;
                &lt;em&gt;				&lt;font size="-1" face="tahoma"&gt; 				Design Patterns: Elements of Reusable Object-Oriented Software&lt;br /&gt;
                - Gamma, Helm, Johnson, Vlissides (Addison Wesley)&lt;br /&gt;
                &lt;br /&gt;
                &lt;br /&gt;
                Implementing Application Frameworks&lt;br /&gt;
                - Fayad, Schmidt, Johnson (Wiley)&lt;br /&gt;
                &lt;br /&gt;
                &lt;br /&gt;
                Pattern-Oriented Software Architecture: A System of Patterns [Vol 1]&lt;br /&gt;
                -  Buschmann, Meunier, Rohnert, Sommerlad, Stal (Wiley)&lt;br /&gt;
                &lt;br /&gt;
                &lt;br /&gt;
                Pattern-Oriented Software Architecture [Vol 2]&lt;br /&gt;
                -  Schmidt, Stal, Rohnert, Buschmann (Wiley)&lt;br /&gt;
                &lt;br /&gt;
                &lt;br /&gt;
                Designing Reusable Classes&lt;br /&gt;
                - Johnson, Foote&lt;br /&gt;
                &lt;br /&gt;
                &lt;br /&gt;
                Business Component Factory&lt;br /&gt;
                - Herzum, Sims (Wiley)&lt;br /&gt;
                &lt;br /&gt;
                &lt;br /&gt;
                Software Factories: Assembling Applications with Patterns, Models, Frameworks and Tools&lt;br /&gt;
                - Jack Greenfield, Keith Short, Steve Cook, Stuart Kent&lt;br /&gt;
                &lt;br /&gt;
                &lt;br /&gt;
                Evolving Frameworks: A Pattern Language for Developing Object-Oriented Frameworks &lt;br /&gt;
                Don Roberts, Ralph Johnson&lt;br /&gt;
                Available at: &lt;a href="http://st-www.cs.uiuc.edu/users/droberts/evolve.html"&gt;st-www.cs.uiuc.edu/users/droberts/evolve.html&lt;/a&gt; &lt;br /&gt;
                &lt;br /&gt;
                &lt;br /&gt;
                A &amp;quot;Framework&amp;quot; for Object Oriented Frameworks Design&lt;br /&gt;
                - Parsons, Rashid, Speck, Telea&lt;br /&gt;
                Available at:  &lt;a href="http://portal.acm.org/citation.cfm?id=832937"&gt;portal.acm.org/citation.cfm?id=832937&lt;/a&gt;&lt;br /&gt;
                &lt;br /&gt;
                &lt;br /&gt;
                Design, implementation and evolution of object oriented frameworks: concepts and guidelines&lt;br /&gt;
                - J. van Gurp, J. Bosch&lt;br /&gt;
                Available at: &lt;a href="http://publications.jillesvangurp.com/spejvg.pdf"&gt;publications.jillesvangurp.com/spejvg.pdf&lt;/a&gt;&lt;br /&gt;
                &lt;/font&gt; 				&lt;br /&gt;
                &lt;br /&gt;
                &lt;/em&gt;&lt;/div&gt;
                &lt;em&gt;				&lt;br /&gt;
                &lt;br /&gt;
                &lt;br /&gt;
                &lt;/em&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=XHJXZ7vHA_g:n9ht2QlOhDo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=XHJXZ7vHA_g:n9ht2QlOhDo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=XHJXZ7vHA_g:n9ht2QlOhDo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=XHJXZ7vHA_g:n9ht2QlOhDo:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=XHJXZ7vHA_g:n9ht2QlOhDo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=XHJXZ7vHA_g:n9ht2QlOhDo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=XHJXZ7vHA_g:n9ht2QlOhDo:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=XHJXZ7vHA_g:n9ht2QlOhDo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=XHJXZ7vHA_g:n9ht2QlOhDo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=XHJXZ7vHA_g:n9ht2QlOhDo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=XHJXZ7vHA_g:n9ht2QlOhDo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/XHJXZ7vHA_g" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/XHJXZ7vHA_g/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/D4-Software-Frameworks.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=3c34a9b6-b5d5-4ff0-a42d-5e3a6fcb37f4</guid>
      <pubDate>Fri, 20 Mar 2009 09:03:00 -0800</pubDate>
      <category>Design</category>
      <category>Design Patterns</category>
      <category>Frameworks</category>
      <category>Methodology</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=3c34a9b6-b5d5-4ff0-a42d-5e3a6fcb37f4</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=3c34a9b6-b5d5-4ff0-a42d-5e3a6fcb37f4</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/D4-Software-Frameworks.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=3c34a9b6-b5d5-4ff0-a42d-5e3a6fcb37f4</wfw:commentRss>
    <media:content url="http://feedproxy.google.com/~r/talkware/~5/jGErHr3uKv0/spejvg.pdf" fileSize="499043" type="application/pdf" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Effectively, here is an Index to the pattern language in draft. A Pattern Language for Designing, Developing, Documenting and Deploying Object-Oriented Software Frameworks [more] D1: Designing Patterns Designing Patterns are concerned with the Designing </itunes:subtitle><itunes:author>Jonathan Crossland</itunes:author><itunes:summary> Effectively, here is an Index to the pattern language in draft. A Pattern Language for Designing, Developing, Documenting and Deploying Object-Oriented Software Frameworks [more] D1: Designing Patterns Designing Patterns are concerned with the Designing process and compliment Developing Patterns for implementations. They can be utilized as standalone patterns but usually combined for best effect. They can also be combined with design methodologies and design principles. Designing Patterns discussed here (not Design Patterns [GOF]), are a category of Patterns that relate to the design of a Software Framework. Designing Patterns compliment and point to Design Patterns [GOF] but are different in nature. DesignGeneralized &amp;nbsp;Find what is inherently or adherently common DesignAbstraction &amp;nbsp;Find what is common via abstraction. DesignRefinement &amp;nbsp;Refine abstract and generalized concepts. CoalescentPatterns &amp;nbsp;Use one or more Design Patterns (GOF) to achieve goal. ApplyAmmersePrinciples &amp;nbsp;Apply good design principles such as AMMERSE UseIterativeDesign &amp;nbsp;Start with DesignGeneralized, then DesignAbstraction and lastly DesignRefinement D2: Developing Patterns Developing Patterns are used to provide Patterns for implementing Software Frameworks. Developing patterns are architecturally minded, and they serve to realize Designing Patterns by their implementation techniques. DevelopHotspot &amp;nbsp;Discover where your hotspots should be. Choose DevelopWhitebox or DevelopBlackbox DevelopWhitebox &amp;nbsp;You want less DesignRefinement or require some form of DesignAbstraction or DesignGeneralized to remain. DevelopBlackbox &amp;nbsp;You want less DesignAbstration or DesignGeneralized and want complete DesignRefinement. ConfigurationTool &amp;nbsp;You have used DesignBlackbox and require more flexibility and customization. CodeGeneration &amp;nbsp;You have used DevelopWhitebox and want to allow for easier and quicker DesignRefinement. SoftwareFactory &amp;nbsp;You have ConfigurationTool and CodeGeneration but want more power and flexibility. D3: Documenting Patterns Documenting Patterns are used to describe the Software Framework and aid the Deploying Patterns. They facilitate and maximize understanding and therefore protential reuse. WritingReference &amp;nbsp;You must provide a reference of interfaces. WritingRecipe &amp;nbsp;You need to provide examples of isolated features of the framework that a pure reference cannot show. WritingCookbook &amp;nbsp;You need to combine a large amount of recipes. Self-Describing &amp;nbsp;Using tools and generators, you can generate documentation. D4: Deploying Patterns Deploying Patterns realizes the Software Framework itself, and looks at ways that maximize the Frameworks reuse potential. DeployWithSupport &amp;nbsp;You need maximum facilitation of the framework. DeployWithSampleApplication &amp;nbsp;You need to show off and demonstrate complex capabilities that WritingRecipe and WritingCookbooks do not show. DeployWithTraining &amp;nbsp;Although Documenting Patterns are applied you need to further adoption. DeployAsIntegration &amp;nbsp;Although Documenting Patterns are applied, Your framework requires easy and quicker implementation and adoption. Bibliography Design Patterns: Elements of Reusable Object-Oriented Software - Gamma, Helm, Johnson, Vlissides (Addison Wesley) Implementing Application Frameworks - Fayad, Schmidt, Johnson (Wiley) Pattern-Oriented Software Architecture: A System of Patterns [Vol 1] - Buschmann, Meunier, Rohnert, Sommerlad, Stal (Wiley) Pattern-Oriented Software Architecture [Vol 2] - Schmidt, Stal, Rohnert, Buschmann (Wiley) Designing Reusable Classes - Johnson, Foote Business Component Factory - Herzum, Sims (Wiley) Software Factories: Assembling Applications with Patterns, Models, Frameworks and Tools - Jack Greenfield, Keith Short, Steve Cook, Stuart Kent Evolving Frameworks: A Pattern Language for Developing Object-Oriented Frameworks Don Roberts, Ralph Johnson Available at: st-www.cs.uiuc.edu/users/drob</itunes:summary><itunes:keywords>software,development,engineering,architecture,design,NET,c,Java,Eclipse,Visual,Studio</itunes:keywords><feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=3c34a9b6-b5d5-4ff0-a42d-5e3a6fcb37f4</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/talkware/~5/jGErHr3uKv0/spejvg.pdf" length="499043" type="application/pdf" /><feedburner:origEnclosureLink>http://publications.jillesvangurp.com/spejvg.pdf</feedburner:origEnclosureLink></item>
    <item>
      <title>A point about AgileDesign</title>
      <description>&lt;br/&gt;
Two comments came through to me regarding AgileDesign. It was pointed out that Agile is a loaded term, and perhaps I should look to rename it. Another aspect mentioned to me in an email, was that Extensible and Agile are probably the same or too similar to be different principles. The thing though, is that my AgileDesign, is exactly "Agile" Design, and although Extensible and Agile are both concerned with change, there is a very important difference between them.&lt;br/&gt;
[more]
&lt;br/&gt;&lt;br/&gt;
&lt;i&gt;Agile&lt;/i&gt; has a few definitions.&lt;br/&gt;&lt;br/&gt;
&lt;i&gt;Moving lightly, briskly and nimbly&lt;/i&gt;&lt;br/&gt;
&lt;i&gt;Speed of operations as a result of a request&lt;/i&gt;&lt;br/&gt;
&lt;i&gt;Dealing with change&lt;/i&gt;&lt;br/&gt;
&lt;i&gt;Ready to move&lt;/i&gt;&lt;br/&gt;
&lt;br/&gt;
You are agile, when you can change quickly and efficiently.
&lt;br/&gt;&lt;br/&gt;
&lt;A href="http://www.jonathancrossland.com/page/AgileDesign.aspx"&gt;AgileDesign&lt;/a&gt; is a principle which highlights the approach design from an agile perspective. This is what comes from using Design Patterns, following good heuristics, and having an agile mind to cope with change better.&lt;br/&gt;&lt;br/&gt;
In the AgileDesign approach it contains a list of patterns, from TemplateMethod (GoF) to Pair Programming (XP), which are both aids to accomplishing the goal of an AgileDesign.&lt;br/&gt;&lt;br/&gt;
When you Design a software solution, it is not just about 'how good you are', or how elegant a solution is. It is not about how 'awesome' or not the code is. What is very important is the amount of agility, and where the agility lies.&lt;br/&gt;&lt;br/&gt;
In Framework texts, you find mention of FrozenSpots and HotSpots (Pree). AgileDesign covers both areas. AgileDesign covers mutable, sometimes even seemingly immutable portions. However, ExtensibleDesign is the adding of something new, and extending. Therefore ExtensibleDesign and AgileDesign are concerned with change, but offer a different set of solutions. &lt;br/&gt;&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HbjldXvBAn8:5O5tHL-bycc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HbjldXvBAn8:5O5tHL-bycc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=HbjldXvBAn8:5O5tHL-bycc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HbjldXvBAn8:5O5tHL-bycc:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HbjldXvBAn8:5O5tHL-bycc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=HbjldXvBAn8:5O5tHL-bycc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HbjldXvBAn8:5O5tHL-bycc:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HbjldXvBAn8:5O5tHL-bycc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HbjldXvBAn8:5O5tHL-bycc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=HbjldXvBAn8:5O5tHL-bycc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=HbjldXvBAn8:5O5tHL-bycc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/HbjldXvBAn8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/HbjldXvBAn8/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/A-point-about-AgileDesign.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=b7187847-9ef6-4e0a-90a5-06b8b0e26d98</guid>
      <pubDate>Thu, 19 Mar 2009 07:00:00 -0800</pubDate>
      <category>.NET</category>
      <category>Design Patterns</category>
      <category>Frameworks</category>
      <category>Methodology</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=b7187847-9ef6-4e0a-90a5-06b8b0e26d98</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=b7187847-9ef6-4e0a-90a5-06b8b0e26d98</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/A-point-about-AgileDesign.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=b7187847-9ef6-4e0a-90a5-06b8b0e26d98</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=b7187847-9ef6-4e0a-90a5-06b8b0e26d98</feedburner:origLink></item>
    <item>
      <title>Software: LackOfEvolution</title>
      <description>&lt;br/&gt;
The majority of Software is quite multicellular. This sounds quite good, but in fact, its not even a small insect yet. or one could argue they are at the bug stage. Software tends to be rude, uncultivated, and unevolved, mainly due to LackOfEvolution.&lt;br/&gt;&lt;br/&gt;
One of the significant aspects of this, is that focus is granted to the development of the initial project, and then a handful of people (or if you are unlucky, just you), who are burdened with supporting it afterwards. This basically means "bug fixes until death" and lots of phone calls and emails later, you lose the lack of thought and action, but the software does not evolve. Software suffers from LackOfEvolution&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Why do I say this&lt;/b&gt;
&lt;br/&gt;
I say this because the vast majority of software only undergoes one full life-cycle. It may then get a smaller cycle of a patch or update, but most do not go to version 2 with the same code base. Version 2 tends to have very little of the original team members, and the code may very likely have completely rewritten areas. Version 3 even less of anything original. It may even have a new technology or language that it uses. Developers also enjoy writing their own code, rather than using other code, so this makes it easier to rewrite.&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;solution?&lt;/b&gt;&lt;br/&gt;
The problem is that the software does not get time to age, mature and be cultivated.&lt;br/&gt;We need that extra time. An extra cultivation iteration is needed in all software teams, on any project. Create a planned version 1.1. Get your full team to conduct a special maturing cycle, where they add a few features, refactor code, shuffle things around. Plan it properly just as you would the first life-cycle.&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;LackOfEvolution for Teams&lt;/h3&gt;
Software Teams can suffer from LackOfEvolution also. Developers can sometimes get caught in a project and not learn new things while they are busy on a project. You get to the end of a two year development and realize a few things have passed you by. 
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;solution?&lt;/b&gt;&lt;br/&gt;
It is vital to stimulate debate about code, to have a trainer in for a day, to get show and tell sessions by members of the team, and other useful activities to counter act the stagnant waters. If you don't do SCRUM, have a SCRUM week, where you follow SCRUM for the week and evaluate it. Have a CompetencyFramework fro all developers with a plan on their evolution within a project and technology. We all need evolution, of character, skills and understanding, it is how we get better.

&lt;br/&gt;
&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=estdGW-tfbg:Wi7iF3a3hhI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=estdGW-tfbg:Wi7iF3a3hhI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=estdGW-tfbg:Wi7iF3a3hhI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=estdGW-tfbg:Wi7iF3a3hhI:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=estdGW-tfbg:Wi7iF3a3hhI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=estdGW-tfbg:Wi7iF3a3hhI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=estdGW-tfbg:Wi7iF3a3hhI:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=estdGW-tfbg:Wi7iF3a3hhI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=estdGW-tfbg:Wi7iF3a3hhI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=estdGW-tfbg:Wi7iF3a3hhI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=estdGW-tfbg:Wi7iF3a3hhI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/estdGW-tfbg" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/estdGW-tfbg/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Software-LackOfEvolution.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=54d2f111-093e-4fda-b96a-9957ae5cd75a</guid>
      <pubDate>Wed, 18 Mar 2009 05:11:00 -0800</pubDate>
      <category>.NET</category>
      <category>Code Generation</category>
      <category>Design</category>
      <category>Design Patterns</category>
      <category>Frameworks</category>
      <category>Methodology</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=54d2f111-093e-4fda-b96a-9957ae5cd75a</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=54d2f111-093e-4fda-b96a-9957ae5cd75a</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Software-LackOfEvolution.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=54d2f111-093e-4fda-b96a-9957ae5cd75a</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=54d2f111-093e-4fda-b96a-9957ae5cd75a</feedburner:origLink></item>
    <item>
      <title>Understanding Framework Types</title>
      <description>&lt;br/&gt;

Traditionally, you read about the following two types.
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Vertical Frameworks&lt;/b&gt;&lt;br/&gt;
or an Application Framework that covers all the elements top to bottom. It may be narrow, or relatively wide. However, it is most likely to be specific to a type of Application and not concerned with cross application reuse. For example: Employee Benefits, Batch Manufacture, Ledger and things of that nature. It would contain its own logging, errorhandling, data access, auditing. It would allow extensibility, configuration, but from a vertical perspective.

&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Horizontal Frameworks&lt;/b&gt;
&lt;br/&gt;
or Infrastructure Framework is concerned with the wider services, and does not dictate the higher layers of an Application. So it would contain a wider range of services, but offer less vertical specializations.
&lt;br/&gt;&lt;br/&gt;
[more]
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;A Vertical Framework is an Application&lt;/h3&gt;
Ultimately, both types would be striving for the shape of the other. A tall narrow vertical framework, would be striving for more 'width', and likewise a Horizontal Framework would be striving for 'height'.
&lt;br/&gt;&lt;br/&gt;
Both these kinds of Frameworks can be implemented with the same tools and concepts, but with a different focus.
&lt;br/&gt;&lt;br/&gt;
If you focus on delivering an Application, you are concentrating on application requirements, usability, and not a framework's requirements. Therefore, I believe that a Vertical Framework is just an Application that has a 'built-in' framework, which is being worked on while developing the application. 
That does not exclude it from the term framework, instead, I believe that all Applications should be built in this way. &lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Everyday Framework Development&lt;/h3&gt;
So what does it take? I don't recommend that without experience you go ahead and develop Frameworks within your current project, but do learn about it and try small Framework like things in your applications.
&lt;br/&gt;&lt;br/&gt;
If we understood, exactly what a Framework looked like, we could tell exactly what to build in our applications that would make it more Framework like and thus more reusable. 
&lt;br/&gt;
&lt;br/&gt;
In my previous post, I requested 140 characters of a framework definition, which although only a few replied, it is still somewhat revealing.&lt;br/&gt;&lt;br/&gt;It is interesting because, most have the correct concept, but when you analyse descriptions, not all terminology is used with the same definition. For example. API is now used almost synonymous with anything you call that has a method, but a Framework is not an API (Application Programming Interface). A Framework is not an Application, nor is it just an Interface. A Framework is more than stateless calls. A Web Service is kind of like an API. Most of the time these are stateless. At least its best practice to have it stateless. Contrary, a Framework should contain state, and is much more than an interface. An API is often referred to as a Library, which is a collection of API. On the state-full side, you are looking at an Object Model, but just a Model is not necessarily pluggable or extensible. 
&lt;br/&gt;&lt;br/&gt;
So Object Model, API, Library and software assets of that sort are only 'one portion' of a Framework, and you can use them without it ever being part of one.
&lt;br/&gt;
So if you are building an Application that contains an API, or library, then you have a useful reusable set of methods or objects. You do not have a framework.
&lt;br/&gt;&lt;br/&gt;
Is it a part solution to a problem? Indeed a Framework can have solutions, and in fact the more the better. But you can create code that solves problems within an Application, not just a Framework. So it cannot be the only answer.
&lt;br/&gt;&lt;br/&gt;
Is it an Independent System of cohesive software. This is true, because the Framework must remain independent from the Application, to maximize reuse. But so too, is a component. Uncle Bob mentions one extra thing in his description, which is absolutely vital, and that is "performs a general function that controls user specified functions". This is vital, as did Paul Tiseo eluded to it also when he mentioned application-specific code. The correlation there is generalization and specialization controlled by the Framework. The Generalized provided by it, and the Specialization executed by it. This polymorphic activity is a vital aspect of a Frameworks definition. 
&lt;br/&gt;
&lt;br/&gt;However, both definitions and my first definition also, do not mention MetaData. MetaData is also vital, as it is the very thing that declares the changes, specializations and completes the picture.
&lt;br/&gt;&lt;br/&gt;

So in fact, we can easily conclude that if we build an Application and keep a "subset of cohesive software, library + application-specific code, with generalization and specialization, configurable, extended by means of Framework code using MetaData", we are in fact building an Application Framework within the Application itself. It must be able to be separated out though, to finalize the categorization requirement.
&lt;br/&gt;&lt;br/&gt;
If you are still interested, have a read on &lt;a href="http://www.jonathancrossland.com/page/What-is-a-Framework.aspx"&gt; "The Quest to Define a Framework"&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=A7ESVhyhkO4:gGeT8ypzncM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=A7ESVhyhkO4:gGeT8ypzncM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=A7ESVhyhkO4:gGeT8ypzncM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=A7ESVhyhkO4:gGeT8ypzncM:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=A7ESVhyhkO4:gGeT8ypzncM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=A7ESVhyhkO4:gGeT8ypzncM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=A7ESVhyhkO4:gGeT8ypzncM:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=A7ESVhyhkO4:gGeT8ypzncM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=A7ESVhyhkO4:gGeT8ypzncM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=A7ESVhyhkO4:gGeT8ypzncM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=A7ESVhyhkO4:gGeT8ypzncM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/A7ESVhyhkO4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/A7ESVhyhkO4/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Understanding-Framework-Types.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=5c4a9d1d-59d4-4a94-8af0-adbf600c0280</guid>
      <pubDate>Tue, 17 Mar 2009 07:03:00 -0800</pubDate>
      <category>Design</category>
      <category>Design Patterns</category>
      <category>Frameworks</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=5c4a9d1d-59d4-4a94-8af0-adbf600c0280</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=5c4a9d1d-59d4-4a94-8af0-adbf600c0280</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Understanding-Framework-Types.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=5c4a9d1d-59d4-4a94-8af0-adbf600c0280</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=5c4a9d1d-59d4-4a94-8af0-adbf600c0280</feedburner:origLink></item>
    <item>
      <title>Framework Definition in less than 140 characters</title>
      <description>&lt;br/&gt;
What is a Framework? Its a difficult one, since most of the time, we all have terminology that differs in meaning for us. &lt;br/&gt;&lt;br/&gt;
My usual line is this "a class is to object" as "framework is to application", but it doesn't speak of the relationships between classes, or the architecture or structure.
&lt;br/&gt;&lt;br/&gt;
I am trying to compile a list of definitions from you, so we can look at how we think of Frameworks today, right now. Over time, I wish to discuss each definition, break it apart. Look at what is good and bad, misleading, wrong, or right. Debate the definitions and then hopefully we can all understand it better. &lt;a href="http://twitter.com/jcrossland"&gt;So please add me to your twitter and send me your definition.&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;

&lt;b&gt;A Framework is: &lt;/b&gt; [more] &lt;br/&gt;&lt;br/&gt;
CoalescentPatterns and AggregatedPatterns which exposes mutable and extensible areas, for specialization and change. - &lt;a href="http://twitter.com/jcrossland"&gt;@jcrossland&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;

"An independent system of cohesive software that performs a general function that controls user specified functions." -  &lt;a href="http://twitter.com/unclebobmartin"&gt;@unclebobmartin&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
"dumb soundbite: a framework is a program you don't mind finishing." - &lt;a href="http://twitter.com/KentBeck"&gt;@KentBeck &lt;/a&gt; 
&lt;br/&gt;&lt;br/&gt;
"Code that attempts to solve a problem that hasn't been shown to exist yet" - &lt;a href="http://twitter.com/benfulton"&gt;@benfulton&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
"Framework is designed to support dynamic websites, apps, and services, while alleviating overhead assoc with common activities" - &lt;a href="http://twitter.com/JRewald2000"&gt;@JRewald2000&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
"A framework is an API that sits above a language in order to aid developers usually in a specific area of expertise, e.g. web" - &lt;a href="http://twitter.com/arumbrindy"&gt;@arumbrindy&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;

"Not a solution. But the concept how to create one." -  &lt;a href="http://twitter.com/BanDoga"&gt;@BanDoga&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
"Framework is a painkiller in the way it lets you focus on what really matters. Good for production, not learning purposes." -&lt;a href="http://twitter.com/josemotanet"&gt;@josemotanet &lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
"Framework = application - (language + libraries + application-specific code)" - Paul Tiseo (see comments)
&lt;br/&gt;&lt;br/&gt;
"An abstract scaffolding of a solution for a certain problem, and yet hard to implement on it's concrete form." - &lt;a href="http://twitter.com/nobodybutca"&gt;@nobodybutca&lt;/a&gt;

&lt;br/&gt;&lt;br/&gt;
"A framework is a collection of solved problems that, when used, allows for increased focus on unique features and functionality." - &lt;a href="http://twitter.com/irobinson"&gt;@irobinson&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;

Please send me your definition! never too late, I will post it up here.
&lt;br/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/talkware?a=UKu74sTEICE:3kLe8T5ja-w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=UKu74sTEICE:3kLe8T5ja-w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=UKu74sTEICE:3kLe8T5ja-w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=UKu74sTEICE:3kLe8T5ja-w:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=UKu74sTEICE:3kLe8T5ja-w:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=UKu74sTEICE:3kLe8T5ja-w:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=UKu74sTEICE:3kLe8T5ja-w:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=UKu74sTEICE:3kLe8T5ja-w:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=UKu74sTEICE:3kLe8T5ja-w:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/talkware?a=UKu74sTEICE:3kLe8T5ja-w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/talkware?i=UKu74sTEICE:3kLe8T5ja-w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/talkware/~4/UKu74sTEICE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/talkware/~3/UKu74sTEICE/post.aspx</link>
      <author>jonathan@lucidocean.com (Jonathan Crossland)</author>
      <comments>http://www.jonathancrossland.com/post/Framework-Definition-in-less-than-140-characters.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jonathancrossland.com/post.aspx?id=3f8160d0-13a1-4d1a-b1b3-371120ca5c4e</guid>
      <pubDate>Fri, 13 Mar 2009 04:24:00 -0800</pubDate>
      <category>Design</category>
      <category>Frameworks</category>
      <dc:publisher>Jonathan</dc:publisher>
      <pingback:server>http://www.jonathancrossland.com/pingback.axd</pingback:server>
      <pingback:target>http://www.jonathancrossland.com/post.aspx?id=3f8160d0-13a1-4d1a-b1b3-371120ca5c4e</pingback:target>
      <slash:comments>51</slash:comments>
      <trackback:ping>http://www.jonathancrossland.com/trackback.axd?id=3f8160d0-13a1-4d1a-b1b3-371120ca5c4e</trackback:ping>
      <wfw:comment>http://www.jonathancrossland.com/post/Framework-Definition-in-less-than-140-characters.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jonathancrossland.com/syndication.axd?post=3f8160d0-13a1-4d1a-b1b3-371120ca5c4e</wfw:commentRss>
    <feedburner:origLink>http://www.jonathancrossland.com/post.aspx?id=3f8160d0-13a1-4d1a-b1b3-371120ca5c4e</feedburner:origLink></item>
  <copyright>Copyright, Jonathan Crossland</copyright><media:credit role="author">Jonathan Crossland</media:credit><media:rating>nonadult</media:rating><media:description type="plain">talking, people, software</media:description></channel>
</rss>
