<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Systems Architecture and Design</title>
        <link>http://geekswithblogs.net/AmusinglyMOSS/category/9618.aspx</link>
        <description>Blueprints and wireframes galore!</description>
        <language>en-US</language>
        <copyright>Adam McKee</copyright>
        <managingEditor>adammmckee@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>Migrating SharePoint Content to Oracle UCM #2</title>
            <link>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/10/19/migrating-sharepoint-content-to-oracle-ucm-2.aspx</link>
            <description>&lt;p&gt;So we landed on a solution.  It's not ideal by any stretch, but it does accomplish the purposes we set out to meet, and it does give us a (small) step in the right direction in terms of moving the client to using Oracle UCM as the sole company-wide content repository.&lt;/p&gt;
&lt;p&gt;To recap, here's the skinny on what we're facing:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;There is a mandate in the company to move all "content" to Oracle UCM (a content unification measure) &lt;/li&gt;
    &lt;li&gt;There is a significant amount of content in SharePoint (in the form of lists) that needs to make its way into Oracle UCM &lt;/li&gt;
    &lt;li&gt;Business users do not want to stop using the SharePoint interface for data entry (not to mention get all the "for-free" stuff that comes with SharePoint, such as alerts, content approval mechanisms, permissions, and workflow). &lt;/li&gt;
    &lt;li&gt;It is not feasible to move all of the lists over at once (we have a 3-week scope to move "something" over from SharePoint to UCM) &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We came up with two approaches that had varying payoffs and risks.&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;The Simple Approach&lt;br /&gt;
    &lt;br /&gt;
    &lt;/strong&gt;Seeing how it was very important to keep all of the existing functionality in SharePoint in whatever solution we devised, we first thought of "replicating" list content to the UCM from SharePoint.  This approach involved writing a custom workflow that would fire on list item update, and would intelligently call a checkin function in UCM.&lt;br /&gt;
    &lt;br /&gt;
    This "simple" solution wouldn't come without risks - the first (and most obvious) one being that we'd have duplicated data that needed to stay in sync.  After thinking about the implications, we found that this risk wasn't terribly bad.  Since no content contribution happens on the UCM-side with this implementation, there's no harm if SharePoint goes down - there just wouldn't be any new data.  If the UCM goes down, syncing the data would mean saving the items again (a solution acceptable by the client).&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;The UCM-Heavy Approach&lt;br /&gt;
    &lt;br /&gt;
    &lt;/strong&gt;This approach was quite a bit more aggressive in terms of planning, execution, and support, but yielded a &lt;em&gt;much&lt;/em&gt; bigger step towards migrating the list content from SharePoint to UCM.&lt;br /&gt;
    &lt;br /&gt;
    The plan was to "switch out" standard SharePoint CrUD (and other) functionality for custom functionality that manipulated UCM content directly.  The idea was that all point-foward content would be manipulated directly in Oracle UCM through the SharePoint interface.  We felt that if we could nail this approach that we'd set a good proof-of-concept for migrating other content to UCM from SharePoint.&lt;br /&gt;
    &lt;br /&gt;
    This approach was monstrously invasive.  It involved re-writing a lot of stuff that comes for free with SharePoint, and was therefore expensive and risky.  However, the payoff of making such a big step towards UCM would be a huge win for the client. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;The Accepted Solution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It will probably come as no surprise to many of you that we landed on solution #1.  What killed solution #2 was that UCM doesn't have an OOB way to handle broadcasting alerts based on permissions (on the item level) when content was created or updated.  Sure, we could write a workflow to sorta-kinda handle it in UCM, but we didn't have the time or budget for it.&lt;/p&gt;
&lt;p&gt;Next time, I'll tell you a little about how we're going about implementing solution #1, and what sorts of challenges are cropping up.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=135578"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=135578" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/AmusinglyMOSS/aggbug/135578.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adam McKee</dc:creator>
            <guid>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/10/19/migrating-sharepoint-content-to-oracle-ucm-2.aspx</guid>
            <pubDate>Tue, 20 Oct 2009 00:39:08 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/AmusinglyMOSS/comments/135578.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/10/19/migrating-sharepoint-content-to-oracle-ucm-2.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/AmusinglyMOSS/comments/commentRss/135578.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/AmusinglyMOSS/services/trackbacks/135578.aspx</trackback:ping>
        </item>
        <item>
            <title>wsdl.exe - Unable to import binding from namespace</title>
            <link>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/10/16/wsdl.exe---unable-to-import-binding-from-namespace.aspx</link>
            <description>&lt;p&gt;When trying to generate an ASP.NET proxy class from a physical wsdl on your local file system, you're probably doing something like this:&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;strong&gt;wsdl.exe MySevice.wsdl /o:Proxy.cs /l:CS&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;You'd expect a file named Proxy.cs to get created in C# for you.  You'd be right, except if you're attempting to generate proxy for a service that uses complex types.  If that is the case, you'll get an error that looks a lot like this:&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;&lt;font face="Arial" color="#ff0000"&gt;&lt;em&gt;Error: Unable to import binding 'MyBinding' from namespace 'http://www.example.org/MyNameSpace/'.&lt;br /&gt;
  - Unable to import operation 'MyOperation'.&lt;br /&gt;
  - The element 'http://mydomain.com:MyComplexType' is missing.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" color="#ff0000"&gt;&lt;em&gt;If you would like more help, please type "wsdl /?".&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This error is basically saying that you your service is expecting one or more XSD file containing the definitions for those complex types.  Here's what your command line should look like:&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;strong&gt;wsdl.exe MySevice.wsdl MyServiceDefinitions.xsd /o:Proxy.cs /l:CS&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;If you need to add additional XSD files for other complex type definitions, just add them to the command line like you did for the first one, separated by a space (order doesn't matter).&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=135502"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=135502" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/AmusinglyMOSS/aggbug/135502.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adam McKee</dc:creator>
            <guid>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/10/16/wsdl.exe---unable-to-import-binding-from-namespace.aspx</guid>
            <pubDate>Fri, 16 Oct 2009 17:53:55 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/AmusinglyMOSS/comments/135502.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/10/16/wsdl.exe---unable-to-import-binding-from-namespace.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/AmusinglyMOSS/comments/commentRss/135502.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/AmusinglyMOSS/services/trackbacks/135502.aspx</trackback:ping>
        </item>
        <item>
            <title>Migrating SharePoint Content to Oracle UCM</title>
            <link>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/10/06/migrating-sharepoint-content-to-oracle-ucm.aspx</link>
            <description>&lt;div&gt;
&lt;div&gt;&lt;font face="Verdana" size="2"&gt;I’ve got an interesting challenge a client has asked me help with.  We are attempting to move items from multiple custom SharePoint lists to Oracle UCM and continue to manage/review/approve the data through the SharePoint interface.&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font face="Verdana" size="2"&gt;&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;&lt;font face="Verdana" size="2"&gt;Moving this list content to OUCM is part of a bigger strategy to centralize all of the “business truth” (content) to OUCM, while keeping SharePoint for collaboration.  There are a lot of things to consider, and lots of risks to document.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;font face="Verdana" size="2"&gt;I'm just now getting to documenting the state of the system, so I'll share some challenges and insights we've come across when we've landed on an approach &lt;/font&gt;&lt;font face="Verdana" size="2"&gt;- should be fun :)&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=135341"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=135341" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/AmusinglyMOSS/aggbug/135341.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adam McKee</dc:creator>
            <guid>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/10/06/migrating-sharepoint-content-to-oracle-ucm.aspx</guid>
            <pubDate>Wed, 07 Oct 2009 03:21:56 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/AmusinglyMOSS/comments/135341.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/10/06/migrating-sharepoint-content-to-oracle-ucm.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/AmusinglyMOSS/comments/commentRss/135341.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/AmusinglyMOSS/services/trackbacks/135341.aspx</trackback:ping>
        </item>
        <item>
            <title>Design Patterns That Get Implemented in Real Life</title>
            <link>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/10/05/design-patterns-that-get-implemented-in-real-life.aspx</link>
            <description>&lt;span style="WORD-SPACING: 0px; FONT: medium 'Times New Roman'; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;/span&gt;
&lt;div style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"&gt;
&lt;div style="MARGIN: 0px"&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt;&lt;/font&gt;&lt;/div&gt;
&lt;font face="Verdana"&gt;I think that the Gang of Four should consider my design pattern recommendations for inclusion in their codified list.  And while I have seen ALL of these patterns shipped to production in real life, it doesn't mean that these are by any means the only ones that scream for inclusion.  Anyone got any others?&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana" size="3"&gt;&lt;strong&gt;The Duct Tape Pattern&lt;/strong&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt;Its versatility is unmatched – any two bits of code from any two systems can co-operate with the use of this simple pattern.  Need a piece of data from an XML document to display on your page?  No sweat – the Duct Tape Pattern has an implementation that allows you to take data directly from your XML document and slap it straight on the page.  Need to update meta data on a user profile?  Easy as pie – the Duct Tape Pattern affords you the simplicity of running an in-line SQL update statement right in your button click event handler.  Need I say more?&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt;&lt;em&gt;Arguments for Inclusion&lt;/em&gt;:&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;ul style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px" type="disc"&gt;
    &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"&gt;&lt;font face="Verdana"&gt;When the crap hits the fan, this pattern is used more often (and more consistently) than any other recognized design pattern. &lt;/font&gt;&lt;/li&gt;
    &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"&gt;&lt;font face="Verdana"&gt;If you’re using this pattern, your code isn’t going to be readable, much less maintainable – it’s guaranteed job security. &lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana" size="3"&gt;&lt;strong&gt;The Crayola Pattern&lt;/strong&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt;Many people confuse the Crayola Pattern for the Facade Pattern, yet they are very different.  While the Facade Pattern attempts to provide a simplified interface to a larger body of code, the Crayola Pattern outright ignores complexity by making wide-sweeping assumptions about the intended usage of the system, thereby making programming against it as simple as coloring with crayons (but you only get to do as many things as you have methods).  The Crayola Pattern is especially effective if you reduce the entire system to 8 method calls, but 64 is also an acceptable practice if you include a UseSharpenerOnBack(object) method in your pattern implementation.&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt;&lt;em&gt;Arguments for Inclusion&lt;/em&gt;:&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;ul style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px" type="disc"&gt;
    &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"&gt;&lt;font face="Verdana"&gt;Using this pattern will guarantee those who use it to get code comments such as: &lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt;            /* we don’t know what this does, but the web server dies when we touch it */&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt;            &lt;/font&gt;&lt;/div&gt;
&lt;ul style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"&gt;
    &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"&gt;
    &lt;div style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"&gt;&lt;font face="Verdana"&gt;Who doesn’t want to write code so sophisticated that nobody else can understand it?  It's a badge of honor to be smarter than everyone else.&lt;/font&gt;&lt;/div&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana" size="3"&gt;&lt;strong&gt;The Clipboard Pattern&lt;/strong&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt;This is the pattern by which a programmer takes an existing class, copies it to the clipboard, pastes it to a new code file, renames the class, adds one or more properties/methods, and seals the class.  The intent is to make your classes utterly unusable for anything other than the use you originally intended, and utterly bewilder other developers as to why you did it.  The maniacal laugh value never ends!&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt;&lt;em&gt;Arguments for inclusion&lt;/em&gt;:&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;ul style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px" type="disc"&gt;
    &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"&gt;&lt;font face="Verdana"&gt;Using this pattern adds a LOT of code overhead, and may very well lead to using the Crayola Pattern, which will inevitably lead to using the Duct Tape pattern, which we all know leads to job security. &lt;/font&gt;&lt;/li&gt;
    &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"&gt;&lt;font face="Verdana"&gt;Clipboard Pattern implenters will get to wear out your Ctrl, C, and V keys even faster than your W, S, A, and D keys!&lt;/font&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana" size="3"&gt;&lt;strong&gt;The Shippit Pattern&lt;/strong&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt;This is the pattern whereby a programmer copies a block of code from the Internet, pastes it into his code, tweaks it a little, and ships it out to production in one fell swoop.  This revolutionary design pattern has been taking the programming world by storm, slashing costs and boosting productivity across many industry verticals.&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt;&lt;em&gt;Arguments for Inclusion&lt;/em&gt;:&lt;/font&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0px"&gt;&lt;font face="Verdana"&gt; &lt;/font&gt;&lt;/div&gt;
&lt;ul style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px" type="disc"&gt;
    &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"&gt;&lt;font face="Verdana"&gt;Saves literally thousands of dollars in development and testing time by simply not doing them. &lt;/font&gt;&lt;/li&gt;
    &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"&gt;&lt;font face="Verdana"&gt;Implementers get to blame someone else for the system not working because they didn't write the code - they simply implemented the Shippit Pattern, and thereby save face when the client can't use the system. &lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=135321"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=135321" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/AmusinglyMOSS/aggbug/135321.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adam McKee</dc:creator>
            <guid>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/10/05/design-patterns-that-get-implemented-in-real-life.aspx</guid>
            <pubDate>Tue, 06 Oct 2009 01:40:21 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/AmusinglyMOSS/comments/135321.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/10/05/design-patterns-that-get-implemented-in-real-life.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/AmusinglyMOSS/comments/commentRss/135321.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/AmusinglyMOSS/services/trackbacks/135321.aspx</trackback:ping>
        </item>
        <item>
            <title>Developers and Designers – A House Divided</title>
            <link>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/07/19/developers-and-designers--a-house-divided.aspx</link>
            <description>&lt;p class="MsoNormal" style="MARGIN: 0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;As a web developer, I find myself having the same conversation over and over with HTML designers when it comes to agreeing on how to style common markup elements.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;The development cycle I experience usually ends up looking like this:&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Calibri" size="3"&gt;1.&lt;/font&gt;&lt;span style="FONT: 7pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Requirements are agreed upon, and handed to the project team.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Calibri" size="3"&gt;2.&lt;/font&gt;&lt;span style="FONT: 7pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;The PM tells the HTML designers make wire frames, screen comps, and they get approved.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Calibri" size="3"&gt;3.&lt;/font&gt;&lt;span style="FONT: 7pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Everyone codes frantically – HTML designers are making markup while coders are making functionality.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Calibri" size="3"&gt;4.&lt;/font&gt;&lt;span style="FONT: 7pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Coders finish a chunk of functionality, and match up the HTML they are rendering against the HTML that the designer has mocked up, only to find huge differences.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Calibri" size="3"&gt;5.&lt;/font&gt;&lt;span style="FONT: 7pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Frustration and refactoring on both sides of the fence ensue.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;While the disconnection between steps 4 and 5 may seem pretty obvious (and may even be lessened by careful planning and communication), it happens frequently because of two immutable aspects of developers and designers:&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Calibri" size="3"&gt;1.&lt;/font&gt;&lt;span style="FONT: 7pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Most HTML designers don’t know (or don’t care) about the hoops that developers have to jump through to get HTML to appear on the screen.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Calibri" size="3"&gt;2.&lt;/font&gt;&lt;span style="FONT: 7pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Unless you make styling a requirement for a deliverable, your developer is not going to even think about styling until the code at least performs the functions required.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;I believe that the best way to address this problem is to cross-educate. &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;Developers should spend some time becoming savvy on the practices and principles that their designers employ.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Designers should become aware of how the developer’s programming platform generates common elements (such as how data repeaters will generate tables, how controls are dynamically named based on their containers, etc.).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=133591"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=133591" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/AmusinglyMOSS/aggbug/133591.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adam McKee</dc:creator>
            <guid>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/07/19/developers-and-designers--a-house-divided.aspx</guid>
            <pubDate>Mon, 20 Jul 2009 04:20:34 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/AmusinglyMOSS/comments/133591.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/07/19/developers-and-designers--a-house-divided.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/AmusinglyMOSS/comments/commentRss/133591.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/AmusinglyMOSS/services/trackbacks/133591.aspx</trackback:ping>
        </item>
        <item>
            <title>Service Architecture Using Spring.NET</title>
            <link>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/07/05/service-architecture-using-spring.net.aspx</link>
            <description>&lt;p&gt;&lt;font face="Arial"&gt;If you’ve ever written a standard .NET ASMX web service before, you know the drill.  You make your service, build out your web methods, publish your service, make your consuming web project, point your project to your service via a web reference, and voila!  You get strongly-typed proxy classes auto-generated for your web service consumption pleasure…  But this comes at a great cost.  WSDL is slow, clunky, and bloated.  All that proxy code that is generated results in serializing, packaging, unpacking, and de-serializing data each way (not to mention the ludicrous amount of code generated to perform relatively simple operations).&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;A better approach, I think, is to create a web service architecture that gleans the best aspects of REST, and combine it with Spring.NET on the back-end to allow simple functionality extension.  And that is exactly what I intend to impart to you - a practical case study in doing exactly that.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Before I go any further, I want to talk briefly about the scope of what I'm trying to demonstrate.  This post is not intended to show you how dependency injection works, or even how to roll your own service architecture.  What I want to do is to walk you through a super-lightweight service implementation that we've created based on the dependency injection that comes with Spring.NET.  Yeah, I know, there are a million things that Spring.NET does, but I’m mostly interested in talking about dependency injection and one really practical use for it.&lt;br /&gt;
 &lt;br /&gt;
&lt;strong&gt;&lt;font size="3"&gt;I’m Too RESTY For My Shirt&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;So, what made us choose a REST-ful service implementation?  Well, a few reasons:&lt;/font&gt;&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;We’re interested in REST because of how the service call allows us to very simply extract what action is to be performed or what data is to be returned by the very nature of the call, as opposed to unpacking a SOAP semi truck just to retrieve a toothpick of instruction.&lt;br /&gt;
    &lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;REST service calls can very easily be constructed either from JavaScript or a server-side function, meaning that AJAX (or even server-side) calls can become very simple, and uniform.  &lt;br /&gt;
    &lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;You don't have to re-build a ginormous proxy class every time you change the functionality of your service - just change the query string on the service call, and away you go.&lt;/font&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Before I dive in to how all of this marries up with Spring.NET, I feel that I should mention that I'm not using true REST – I'm only using the parts that make sense for the service implementation that I'm working with.  In particular, I'm only interested in GET (for fetching stuff) and POST (for doing stuff) verbs.  Conceivably, we could write actions for other common verbs, but you’ll see why we chose against it when we bring Spring.NET into the mix.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="3"&gt;&lt;strong&gt;Is That a Spring in Your Code, or Are You Just Happy to See Me?&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;The purpose of using dependency injection in our service implementation serves two main purposes:&lt;/font&gt;&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;To segregate and VERY loosely couple the different functions (verbs, resources, and response types) of our REST-ful service&lt;br /&gt;
    &lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;To make it easy to extend the functionality of the service to accommodate future requirements&lt;/font&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;font face="Arial" size="3"&gt;&lt;strong&gt;Binding the Service Together&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Before we dive into the code, there is a bit of terminology that I need to bring to your attention.  In the code, you'll see frequent reference to an object called a "binder."  This binder object is nothing more than a means of passing relevant data to and from various layers of the service.  It has the following members:&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;string Format - how the output of the service call is to be formatted (JSON, XML, etc.)&lt;br /&gt;
    &lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;string Resource - dictates what resource is to be queried (labor, employees, parts, etc.)&lt;br /&gt;
    &lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;string Action - what is to be done to the resource (getAll, getById, getSomethingMeaningful, etc.)&lt;br /&gt;
    &lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;Dictionary&amp;lt;string, object&amp;gt; LocalData - Holds any single values that need to passed from one layer to the next that &lt;/font&gt;&lt;font face="Arial"&gt;doesn't fall into one of the above properties&lt;br /&gt;
    &lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;DataSet ResultSets - any recordsets to be passed to the response handler to be translated to JSON, XML, or &lt;/font&gt;&lt;font face="Arial"&gt;whatever is dictated by the Format property.  &lt;br /&gt;
    &lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;HttpContext Context - object reference to the current HttpContext other layers of the service can see it without having to trying to fetch the context themselves.&lt;/font&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Now that we've cleared that up, let's explore some code to see what the service is really going to do when it gets a request.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="3"&gt;&lt;strong&gt;The Service, Top-to-Bottom&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Here's what a request to the service might look light:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;em&gt;http://svc.mycomany.com/servicehandler.ashx?resource=labor&amp;amp;action=get&amp;amp;id=1&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;What this does is tell the service everything it needs to know to fetch a results set.  A results set might be a scalar value, or an entire recordset.  In this case, the expected result will be a single labor record whose Id is We'll be following this example throughout the rest of this tutorial.&lt;/font&gt;&lt;/p&gt;
&lt;div style="BACKGROUND: gainsboro"&gt;
&lt;p&gt;&lt;font face="Arial"&gt;   public class ServiceHandler : IHttpHandler&lt;br /&gt;
   {&lt;br /&gt;
        public void ProcessRequest(HttpContext context)&lt;br /&gt;
        {&lt;br /&gt;
            // Create an instance of the Spring.NET application context&lt;br /&gt;
            IApplicationContext ctx = ContextRegistry.GetContext();&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;            // Create a binder object&lt;br /&gt;
            IBinder binder = (IBinder)ctx.GetObject("binder");&lt;br /&gt;
            binder.Context = context;&lt;br /&gt;
            &lt;br /&gt;
            // Default to JSON format (response)&lt;br /&gt;
            string format = "json";&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;            try&lt;br /&gt;
            {&lt;br /&gt;
                string resource = null;&lt;br /&gt;
                string action = null;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;                HttpRequest request = context.Request;&lt;br /&gt;
                format = request["Format"];&lt;br /&gt;
                resource = request["Resource"];&lt;br /&gt;
                action = request["Action"];&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;                // An error should be thrown if no resource is provided in the service call&lt;br /&gt;
                if (Resource == null)&lt;br /&gt;
                {&lt;br /&gt;
                    throw new Exception("Resource was not found");&lt;br /&gt;
                }&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;                // An error should be thrown if no action is provided in the service call&lt;br /&gt;
                if (Action == null)&lt;br /&gt;
                {&lt;br /&gt;
                    throw new Exception("Action was not found");&lt;br /&gt;
                }&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;                binder.Format = format;&lt;br /&gt;
                binder.Resource = resource;&lt;br /&gt;
                binder.Action = action;&lt;br /&gt;
                &lt;br /&gt;
                // Call Spring.NET to get the appropriate request handler, based on the named passed in from the query string&lt;br /&gt;
                IServiceRequestHandler requestHander = (IServiceRequestHandler)ctx.GetObject(resource.ToLower() + "requesthandler");&lt;br /&gt;
                &lt;br /&gt;
                // Call the appropriate IServiceRequestHandler method, based on the RequestType of the call to the service&lt;br /&gt;
                switch (request.RequestType.ToLower())&lt;br /&gt;
                {&lt;br /&gt;
                    case "get":&lt;br /&gt;
                        requestHander.Get(binder);&lt;br /&gt;
                        break;&lt;br /&gt;
                    case "post":&lt;br /&gt;
                        requestHander.Post(binder);&lt;br /&gt;
                        break;&lt;br /&gt;
                }&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;            }&lt;br /&gt;
            catch (Exception e)&lt;br /&gt;
            {&lt;br /&gt;
                binder.SetLocal("error", e.Message);&lt;br /&gt;
            }&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;            IServiceResponseHandler responseHandler = (IServiceResponseHandler)ctx.GetObject(Format.ToLower() + "responsehandler");&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;            responseHandler.binder = binder;&lt;br /&gt;
            responseHandler.write();&lt;br /&gt;
        }&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;        public bool IsReusable&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;font face="Arial"&gt;
&lt;p&gt;&lt;br /&gt;
The service handler is designed to digest any call to servicehandler.ashx, break apart its request parameters, and determine what to do.  After it breaks down the request and creates a binder, it calls Spring.NET to get an IRequestHandler based on the name of the resource.&lt;/p&gt;
&lt;p&gt;Let's take a look at what the LaborRequestHandler class looks like:&lt;/p&gt;
&lt;div style="BACKGROUND: gainsboro"&gt;
&lt;p&gt;    public class LaborRequestHandler : IServiceRequestHandler&lt;br /&gt;
    {&lt;/p&gt;
&lt;p&gt;        public IBinder Get(IBinder binder)&lt;br /&gt;
        {&lt;br /&gt;
            IApplicationContext ctx = ContextRegistry.GetContext();&lt;br /&gt;
            IServiceAction action = (IServiceAction)ctx.GetObject(binder.Action.ToLower() + binder.Resource.ToLower() + "serviceaction");&lt;br /&gt;
            action.execute(binder);&lt;/p&gt;
&lt;p&gt;            return binder;&lt;br /&gt;
        }&lt;/p&gt;
&lt;p&gt;        public IBinder Post(IBinder binder)&lt;br /&gt;
        {&lt;br /&gt;
            IApplicationContext ctx = ContextRegistry.GetContext();&lt;br /&gt;
            IServiceAction action = (IServiceAction)ctx.GetObject(binder.Action.ToLower() + binder.Resource.ToLower() + "serviceaction");&lt;br /&gt;
            action.execute(binder);&lt;/p&gt;
&lt;p&gt;            return binder;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
By the time this class is instanced by the ServiceHandler, the ServiceHandler has determined the RequestType (GET or POST), and has determined that the Labor resource is necessary, and has instanced the proper IServiceRequestHandler (LaborRequestHandler, in this case).  In this class, the action taken will be resolved down to an actual IServiceAction implementation, which then gets passed the binder instance, and executed.&lt;/p&gt;
&lt;p&gt;You'll notice that both the Get and Post methods are identical - this is circumstantial.  In this case, it happens that no further binder processing is necessary at this point, but this may not always be the case.  This is why we've added this layer of abstraction into the mix, to allow for request type-specific processing at this level.&lt;/p&gt;
&lt;p&gt;Note: The execute method returns a Binder - the implementation of the execute method on the IServiceAction will put any results into the binder, and pass it back up to the ServiceHandler for formatting into the output for the original service call from the client.&lt;/p&gt;
&lt;p&gt;Here's what the GetLaborServiceAction looks like:&lt;/p&gt;
&lt;div style="BACKGROUND: gainsboro"&gt;
&lt;p&gt;    internal class GetLaborServiceAction : IServiceAction&lt;br /&gt;
    {&lt;br /&gt;
        public GetLaborServiceAction()&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;/p&gt;
&lt;p&gt;        public bool execute(IBinder binder)&lt;br /&gt;
        {&lt;br /&gt;
            try&lt;br /&gt;
            {&lt;br /&gt;
                DataTable results = null;&lt;/p&gt;
&lt;p&gt;                // Your code here to fetch single labor record into the results DataTable&lt;/p&gt;
&lt;p&gt;                binder.addResultSet("Labor", results);&lt;/p&gt;
&lt;p&gt;                return true;&lt;br /&gt;
            }&lt;br /&gt;
            catch (Exception e)&lt;br /&gt;
            {&lt;br /&gt;
                // Perhaps some logging here&lt;br /&gt;
                throw e;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Once the database code has been executed and put back into the binder, the ServiceHandler will then instance the proper IServiceResponseHandler (JSONResponseHandler in this case), and call the write method.  The write method will take the binder that was populated with data, and convert it into the appropriate format (JSON, in this circumstance).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;The Beauty of It All&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now that you've seen how it all works, let's take a step back and think through some of the implications of using DI in this service.&lt;/p&gt;
&lt;p&gt;Let's say that you have a requirement for a new, specialized get method - one that gets all Labor rates that are only available on Tuesdays.  Here's all you'd have to do:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Write your stored procedure to actually fetch the data &lt;/li&gt;
    &lt;li&gt;Create a GetLaborRatesForTuesdays : IServiceAction class, and flesh out the execute method to call the stored procedure &lt;/li&gt;
    &lt;li&gt;Update your Spring.NET configuration to accommodate the new class &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;POOF!  You're done!  Your service has entirely new functionality, and you didn't have to touch any existing code.  Using this methodology, you could also create IServiceRequestHandler implementations for other verbs, but that's up to you.  We didn't use them here because we would end up with a lot of classes that had identical code, and it would mean more complex code on the client-side to know which verb to call - it was a lot easier just to use GET and POST on all fronts.&lt;/p&gt;
&lt;p&gt;Speaking of client code, here's the best part:  Your client code doesn't have to change one bit to accommodate this new functionality.  In order to call this new method, all you have to do is slightly alter your query string to look like this:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;http://svc.mycomany.com/servicehandler.ashx?resource=labor&amp;amp;action=getLaborForTuesdays&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That's it!  Purty, eh?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;So, Adam, How Do We Wrap This One?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Without a shadow of a doubt, bust...  oh wait, you mean me, not Adam Savage.&lt;/p&gt;
&lt;p&gt;This is just one way to go about doing this.  The implications go way deep and way wide - there are lots of ways to make this even better.  For example, there's an entire DAO layer that I left out of this implementation - I felt it would have added a bit of complexity that would have detracted from the scope I was trying to maintain.&lt;/p&gt;
&lt;p&gt;I'll be posting other thoughts I have on the matter as I come across them - there is so much here to learn.&lt;/p&gt;
&lt;/font&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=133274"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=133274" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/AmusinglyMOSS/aggbug/133274.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adam McKee</dc:creator>
            <guid>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/07/05/service-architecture-using-spring.net.aspx</guid>
            <pubDate>Mon, 06 Jul 2009 03:14:36 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/AmusinglyMOSS/comments/133274.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/07/05/service-architecture-using-spring.net.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/AmusinglyMOSS/comments/commentRss/133274.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/AmusinglyMOSS/services/trackbacks/133274.aspx</trackback:ping>
        </item>
        <item>
            <title>Lessons Learned From Making SharePoint Recommendations</title>
            <link>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/04/21/lessons-learned-from-making-sharepoint-recommendations.aspx</link>
            <description>&lt;p&gt;I was recently asked what lessons I've learned when recommending SharePoint for for meeting a business need.  While books are written on this topic, I've distilled the list down to what I think are the core of the decision-making process.&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;Know what your stakeholders require in objective, actionable terms&lt;br /&gt;
    &lt;br /&gt;
    &lt;/strong&gt;This is known as extracting &lt;em&gt;core business drivers&lt;/em&gt;.  Note that I didn't say &lt;em&gt;requirements&lt;/em&gt;.  &lt;em&gt;Requirements&lt;/em&gt; are what you hand to your developers - &lt;em&gt;core business drivers&lt;/em&gt; are what you use to make your recommendation.&lt;br /&gt;
    &lt;br /&gt;
    Right questions to ask at this time: &lt;br /&gt;
    -  &lt;em&gt;How does process x drive revenue?&lt;br /&gt;
    -  How much productivity loss constitutes a bottleneck in x process?&lt;br /&gt;
    -  How much must efficiency increase for x process to meet your defined goals?&lt;br /&gt;
    &lt;/em&gt;&lt;br /&gt;
    Wrong questions to ask at this time: &lt;br /&gt;
    -  &lt;em&gt;What problems do you have with your current system? &lt;br /&gt;
    -  What do you want your new system to look like? &lt;br /&gt;
    -  How do you want the system to function? &lt;br /&gt;
    &lt;/em&gt;&lt;br /&gt;
    Note that the difference between the right and wrong questions is objectivity vs. subjectivity. If you can't get a quantifyable answer, the question should never be asked.  And in reality, you should be answering those wrong questions yourself once you have digested the business drivers.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Map the core business drivers up to things that SharePoint does well &lt;br /&gt;
    &lt;/strong&gt;&lt;br /&gt;
    Another way to say this is, “Don't try to make SharePoint do something it's not designed to do.”  This concept is simple, but it's very hard to establish effectively because SharePoint does so many blasted different things.  &lt;br /&gt;
    &lt;br /&gt;
    It's at this point where you'd decide whether using WSS or a full-blown MOSS implementation will fit the bill.&lt;br /&gt;
    &lt;br /&gt;
    Be careful not to get into &lt;a href="http://www.codinghorror.com/blog/archives/001230.html"&gt;technical debt&lt;/a&gt; when mapping things up.  If you've never used Form Services before, you'd better be &lt;em&gt;darn sure&lt;/em&gt; it's the right fit for the job.&lt;br /&gt;
    &lt;br /&gt;
    Every SharePoint feature you decide to implement should correlate to a core business driver.  If you stick to this principle, you will avoid a lot of tehnical debt.&lt;br /&gt;
    &lt;br /&gt;
    Just because SharePoint can do something doesn’t mean that you have to use it.  Not every solution has a problem, so don't expect to use the entire of the SharePoint canon of functionality.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Decide whether the benefits outweigh the costs&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;
    Even if all of your quantified core business drivers are covered by your recommendation, there are a lot of unquantifiable things that will crop up.  I'm talking about things like the personalities/predispositions of the stakeholders toward SharePoint, to the adoption propensity of the user base.&lt;br /&gt;
    &lt;br /&gt;
    Rules are FAR more important than tools. Be smart on where governance is required to keep your SharePoint instance humming (even more books have been written on this matter, so I’m not going to get into it now), and build it into your proposal. &lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=131371"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=131371" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/AmusinglyMOSS/aggbug/131371.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adam McKee</dc:creator>
            <guid>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/04/21/lessons-learned-from-making-sharepoint-recommendations.aspx</guid>
            <pubDate>Wed, 22 Apr 2009 10:24:05 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/AmusinglyMOSS/comments/131371.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/04/21/lessons-learned-from-making-sharepoint-recommendations.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/AmusinglyMOSS/comments/commentRss/131371.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/AmusinglyMOSS/services/trackbacks/131371.aspx</trackback:ping>
        </item>
        <item>
            <title>When not to use exception handling, or, "Don't try too hard"</title>
            <link>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/02/27/when-not-to-use-exception-handling-or-dont-try-too.aspx</link>
            <description>&lt;p&gt;Okay, people.  I officially deem it OK to remove someone's geek cred if they put a try block around the entire of a method body.  Furthermore, you get to remove even more geek cred if they just re-throw the error that was caused in the try block.  Here's an example of what I'm talking about:&lt;/p&gt;
&lt;p&gt;private void foo()&lt;br /&gt;
{&lt;br /&gt;
   try&lt;br /&gt;
   {&lt;br /&gt;
      // do the foo.&lt;br /&gt;
      // do more foo.&lt;br /&gt;
      // do the rest of the foo.&lt;br /&gt;
   }&lt;br /&gt;
   catch (Exception ex)&lt;br /&gt;
   {&lt;br /&gt;
      throw ex;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;Contrary to popular perception, try/catch blocks are not for preventing errors - they are for &lt;em&gt;directing logic flow&lt;/em&gt;.  A try/catch block is sometimes treated with special reverence because it revolves around "errors that happen at runtime," and "errors" mean "bugs."  It's an emotional trap everyone falls into - I've even seen project plans that have time allotted for "adding exception handling," as if exception handling were some magic bullet that somehow prevents bugs.&lt;/p&gt;
&lt;p&gt;True, when properly implemented, exception handling does reduce the number of "bugs" in the system, but not due to their perceived inherent nature - they reduce bugs the same way adding an "if" construct or a "switch" construct in the correct place will reduce bugs.&lt;/p&gt;
&lt;p&gt;It is with this understanding that I believe that try/catch should be treated no differently than any other programming/logic construct.  Would you surround the entire body of a method with an if statement?  If you answered yes, you need to re-think your code.&lt;/p&gt;
&lt;p&gt;Here are some rules:&lt;/p&gt;
&lt;p&gt;DO&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Catch only errors for which you plan to take additional action &lt;em&gt;at that point in time&lt;/em&gt;. &lt;/li&gt;
    &lt;li&gt;Use a try block only around the code that will cause a fork in logic were an exception to occur. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DON'T&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Instance the exception object &lt;em&gt;unless you actually need it&lt;/em&gt;.  If catching a type of error is good enough, then don't instance the exception object. &lt;/li&gt;
    &lt;li&gt;Catch errors because you think it will "help out somehow."  Doing so runs the risk of swallowing errors (which make troubleshooting impossible), and adds unnecessary complexity. &lt;/li&gt;
    &lt;li&gt;Re-throw the error that just occurred &lt;em&gt;unless&lt;/em&gt; the up-stream code requires it for logging, or any other specific actions.  Re-throwing is expensive, and should be used sparingly. &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=129725"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=129725" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/AmusinglyMOSS/aggbug/129725.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adam McKee</dc:creator>
            <guid>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/02/27/when-not-to-use-exception-handling-or-dont-try-too.aspx</guid>
            <pubDate>Sat, 28 Feb 2009 02:17:07 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/AmusinglyMOSS/comments/129725.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/02/27/when-not-to-use-exception-handling-or-dont-try-too.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/AmusinglyMOSS/comments/commentRss/129725.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/AmusinglyMOSS/services/trackbacks/129725.aspx</trackback:ping>
        </item>
        <item>
            <title>97 Things Every Software Architect Should Know</title>
            <link>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/02/26/97-things-every-software-architect-should-know.aspx</link>
            <description>&lt;p&gt;&lt;span style="FONT-SIZE: 11pt; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;A co-worker shared this gem with me, and every bit of it is true.  This is a must-read for aspiring architects.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE: 11pt; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;a href="http://97-things.near-time.net/wiki/97-things-every-software-architect-should-know-the-book"&gt;http://97-things.near-time.net/wiki/97-things-every-software-architect-should-know-the-book&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE: 11pt; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;One thing that I really appreciate about the articles on this site is that they draw a clear distinction between an architect and a senior developer who &lt;em&gt;calls&lt;/em&gt; himself an architect.  While many people feel that a certain number of years of programming experience entitle you to architect status, programmers and archtitects speak different languages and use different tools to create their deliverables, and are responsible to different types of people.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE: 11pt; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;There is a lot to be said here that the site says far better than I can.  I highly recommend that you read it, absorb it, live it.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE: 11pt; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;I'll also leave you with some food for thought:  What would you call the key qualities that distinguish a true architect from a senior programmer who calls himself an architect?  Feel free to drop comments if you like - I'd love to hear your thoughts.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=129709"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=129709" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/AmusinglyMOSS/aggbug/129709.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adam McKee</dc:creator>
            <guid>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/02/26/97-things-every-software-architect-should-know.aspx</guid>
            <pubDate>Fri, 27 Feb 2009 06:05:33 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/AmusinglyMOSS/comments/129709.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/02/26/97-things-every-software-architect-should-know.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/AmusinglyMOSS/comments/commentRss/129709.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/AmusinglyMOSS/services/trackbacks/129709.aspx</trackback:ping>
        </item>
        <item>
            <title>Systems Design and Poker Odds</title>
            <link>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/02/07/systems-design-and-poker-odds.aspx</link>
            <description>&lt;p&gt;&lt;font face="Arial" size="2"&gt;Deciding whether to implement a new, unproven widget to save in development costs is a lot like deciding whether to call a player who goes all-in on the first hand of a poker game.  You may land your cards, but is it really worth it?&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="2"&gt;The way to determine whether or not to take the risk with an unproven widget is a lot like how a professional would assess the scenario I just described.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="2"&gt;An accomplished poker player knows what each hand is worth, not only in terms of the potential winnings, but in terms of how his invested chips will sway who has what equity in the game.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="2"&gt;This same accomplished poker player will tell you that a big, early chip lead doesn't amount to anything worthwhile.  In fact, if you were to double up on the first hand of the game (implying that you eliminated another player to do so), you'd end up with far less equity in the game than the face value of chips you have in front of you.  This loss of equity occurs because someone being eliminated this early in the game is far more valuable to all players than the amount of chips you won by eliminating him.  You won his chips, but everyone else won the benefit of having a player eliminated, and they didn't have to risk the farm to do it.  Chip-for-dollar, your chips are now worth far less than everyone else's.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="2"&gt;Now, let's apply this idea to systems design.  When your tech lead promises that a widget will make the development life-cycle easier, it's always at the cost of configuration, maintenance, and/or other no-see-ums that add up very quickly come delivery time (and to top it off, they are never documented adequately, if at all).  In other words, since he can't account for the the total cost of ownership (TCO) of the widget when he proposes it (hence it being unproven), he would accept the widget as a viable solution based solely on its perceived benefits without regard for the no-see-ums he'll have to wrangle.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="2"&gt;"Saving" on development time with an unproven widget is a lot like winning that huge pot up-front.  While you save in development, someone will pay for the ownership of something duct-taped together, and if you're a vendor, it will inevitably be you.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="2"&gt;So if you are going to take a risk with an unproven widget, do yourself a favor and build an inordinate amount of time into your project plan.  I mean on a factor of 4x of how fast you think you'd get it done if you were stoned, and had a mountain of cheesy poofs that demanded to be eaten.&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=129267"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=129267" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/AmusinglyMOSS/aggbug/129267.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adam McKee</dc:creator>
            <guid>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/02/07/systems-design-and-poker-odds.aspx</guid>
            <pubDate>Sun, 08 Feb 2009 09:15:03 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/AmusinglyMOSS/comments/129267.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/AmusinglyMOSS/archive/2009/02/07/systems-design-and-poker-odds.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/AmusinglyMOSS/comments/commentRss/129267.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/AmusinglyMOSS/services/trackbacks/129267.aspx</trackback:ping>
        </item>
    </channel>
</rss>