<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Just Enough Technology &#187; Design</title>
	<atom:link href="http://justenoughtechnology.com/tag/design/feed/" rel="self" type="application/rss+xml" />
	<link>http://justenoughtechnology.com</link>
	<description>The passion to see business leverage technology both powerfully and economically</description>
	<lastBuildDate>Thu, 20 May 2010 00:18:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Create Singleton in C#</title>
		<link>http://justenoughtechnology.com/create-singleton-in-csharp/</link>
		<comments>http://justenoughtechnology.com/create-singleton-in-csharp/#comments</comments>
		<pubDate>Tue, 11 May 2010 04:02:57 +0000</pubDate>
		<dc:creator>Dave Ranck</dc:creator>
				<category><![CDATA[Architecture and Design]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Code Sample]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://justenoughtechnology.com/?p=309</guid>
		<description><![CDATA[One of the most basic and most useful object patterns is the Singleton design pattern. A Singleton is a class of which there will only be one instance created at any time. All users of the Singleton class will all use the same instance. This is great for a wide range of applications such as [...]


Related posts:<ol><li><a href='http://justenoughtechnology.com/find-a-string-between-2-strings/' rel='bookmark' title='Permanent Link: Find a String Between 2 Strings'>Find a String Between 2 Strings</a></li>
<li><a href='http://justenoughtechnology.com/restore-sql-database/' rel='bookmark' title='Permanent Link: Restore SQL Database'>Restore SQL Database</a></li>
<li><a href='http://justenoughtechnology.com/title-case-csharp/' rel='bookmark' title='Permanent Link: Title Case in C#'>Title Case in C#</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>One of the most basic and most useful object patterns is the Singleton design pattern. A Singleton is a class of which there will only be one instance created at any time. All users of the Singleton class will all use the same instance. This is great for a wide range of applications such as cached values and lookups or utilities that execute quickly. The Design Patterns book by Gamma et al . describes the structure of a basic Singleton. We&#8217;ll describe how to create one in C#. </p>
<p> <span id="more-309"></span>
<p>The classic approach to creating a Singleton looks like this:    </p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> SingletonGamma
 {
      <span class="kwrd">private</span> <span class="kwrd">static</span> SingletonGamma instance;
      <span class="kwrd">private</span> SingletonGamma()  { }

      <span class="kwrd">public</span> <span class="kwrd">static</span> SingletonGamma Instance
     {
         get </pre>
<pre class="csharpcode">         {
            <span class="kwrd">if</span> (instance == <span class="kwrd">null</span>) { instance = <span class="kwrd">new</span> SingletonGamma(); }
            <span class="kwrd">return</span> instance;
         }
     }
 } </pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>
  </p>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>The basic approach is&#160; to create a private constructor and an Instance method that returns the current instance if available, or returns a new instance if there is no current instance. We call that &quot;lazy instantiation&quot;. The problem with this approach in C# is that it is not strictly thread-safe. That is, it is possible for 2 threads to create separate instances is some circumstances. This is not what we are looking to do. This approach does have an advantage in that there is a hook-point to do post-instantiation processing if required. In .Net though, this is not the approach usually recommended</p>
<p>The following example takes advantage of the better handling of variable ambiguity in .Net (vs. C++) to create a thread-safe Singleton:</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">sealed</span> <span class="kwrd">class</span> SingletonCSharp
    {
        <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">readonly</span> Singleton instance = <span class="kwrd">new</span> SingletonCSharp();

        <span class="kwrd">private</span> SingletonCSharp() { }

        <span class="kwrd">public</span> <span class="kwrd">static</span> SingletonCSharp Instance
        {
            get
            {
                <span class="kwrd">return</span> instance;
            }
        }
    }</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>
  <br />This is the preferred approach in C# and is adequate for most programs. There are other approaches that allow for more flexibility and still maintain thread safety, but they introduce unnecessary complexity for most programs. Note the read only instance property that can only be set during instantiation and the sealed keyword that prevents inheritance of the class which could introduce unwanted side effects, such as secondary instances. This is a simple and straightforward approach to the design pattern. The only downside is the lack of flexibility to have non-standard constructors. For most applications, that will not be an issue.</p>


<p>Related posts:<ol><li><a href='http://justenoughtechnology.com/find-a-string-between-2-strings/' rel='bookmark' title='Permanent Link: Find a String Between 2 Strings'>Find a String Between 2 Strings</a></li>
<li><a href='http://justenoughtechnology.com/restore-sql-database/' rel='bookmark' title='Permanent Link: Restore SQL Database'>Restore SQL Database</a></li>
<li><a href='http://justenoughtechnology.com/title-case-csharp/' rel='bookmark' title='Permanent Link: Title Case in C#'>Title Case in C#</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://justenoughtechnology.com/create-singleton-in-csharp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Good Azure Video from PDC09</title>
		<link>http://justenoughtechnology.com/good-azure-video-from-pdc09/</link>
		<comments>http://justenoughtechnology.com/good-azure-video-from-pdc09/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 03:04:30 +0000</pubDate>
		<dc:creator>Dave Ranck</dc:creator>
				<category><![CDATA[Architecture and Design]]></category>
		<category><![CDATA[Business and Technology]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Cost Benefit Analysis]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[ROI]]></category>
		<category><![CDATA[TCO]]></category>

		<guid isPermaLink="false">http://justenoughtechnology.com/?p=247</guid>
		<description><![CDATA[Here&#8217;s a great intro to Azure from PDC 09. If you have not looked at Azure or Cloud computing in general, take a look at this video for an introduction. Cloud Computing is here and in use. It will only grow in the near future.
PDC Video on Cloud Computing with Azure
J9SYRP3G9ZUC


Related posts:Windows Azure Now Available
Windows [...]


Related posts:<ol><li><a href='http://justenoughtechnology.com/windows-azure-now-available/' rel='bookmark' title='Permanent Link: Windows Azure Now Available'>Windows Azure Now Available</a></li>
<li><a href='http://justenoughtechnology.com/146/' rel='bookmark' title='Permanent Link: Windows Azure Videos'>Windows Azure Videos</a></li>
<li><a href='http://justenoughtechnology.com/java-vs-net-another-blast-from-the-past/' rel='bookmark' title='Permanent Link: Java vs. .Net &ndash; Another Blast From the Past'>Java vs. .Net &ndash; Another Blast From the Past</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a great intro to Azure from PDC 09. If you have not looked at Azure or Cloud computing in general, take a look at this video for an introduction. Cloud Computing is here and in use. It will only grow in the near future.</p>
<p><a title="Cloud Computing with Azure Video" href="http://gallery.live.com/liveItemDetail.aspx?li=195af345-360c-4411-aa24-f1bd90dd5655&amp;bt=1&amp;pl=1" target="_blank">PDC Video on Cloud Computing with Azure</a></p>
<p>J9SYRP3G9ZUC</p>


<p>Related posts:<ol><li><a href='http://justenoughtechnology.com/windows-azure-now-available/' rel='bookmark' title='Permanent Link: Windows Azure Now Available'>Windows Azure Now Available</a></li>
<li><a href='http://justenoughtechnology.com/146/' rel='bookmark' title='Permanent Link: Windows Azure Videos'>Windows Azure Videos</a></li>
<li><a href='http://justenoughtechnology.com/java-vs-net-another-blast-from-the-past/' rel='bookmark' title='Permanent Link: Java vs. .Net &ndash; Another Blast From the Past'>Java vs. .Net &ndash; Another Blast From the Past</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://justenoughtechnology.com/good-azure-video-from-pdc09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java vs. .Net &#8211; Another Blast From the Past</title>
		<link>http://justenoughtechnology.com/java-vs-net-another-blast-from-the-past/</link>
		<comments>http://justenoughtechnology.com/java-vs-net-another-blast-from-the-past/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 19:28:10 +0000</pubDate>
		<dc:creator>Dave Ranck</dc:creator>
				<category><![CDATA[Architecture and Design]]></category>
		<category><![CDATA[Business and Technology]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Cost Benefit Analysis]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ROI]]></category>
		<category><![CDATA[TCO]]></category>

		<guid isPermaLink="false">http://justenoughtechnology.com/java-vs-net-another-blast-from-the-past/</guid>
		<description><![CDATA[Here’s another ancient article I wrote that I recently reread. It is interesting to see what has changed since this was first published on SearchSOA almost 8 years ago (see link at end of article). There are also many things that have not changed in those years. Companies continue to be faced with the question [...]


Related posts:<ol><li><a href='http://justenoughtechnology.com/choosing-between-java-and-net/' rel='bookmark' title='Permanent Link: Choosing Between Java and .Net'>Choosing Between Java and .Net</a></li>
<li><a href='http://justenoughtechnology.com/craftsmanship-and-software-development/' rel='bookmark' title='Permanent Link: Craftsmanship and Software Development'>Craftsmanship and Software Development</a></li>
<li><a href='http://justenoughtechnology.com/windows-azure-now-available/' rel='bookmark' title='Permanent Link: Windows Azure Now Available'>Windows Azure Now Available</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Here’s another ancient article I wrote that I recently reread. It is interesting to see what has changed since this was first published on <a href="http://searchsoa.techtarget.com/" target="_blank">SearchSOA</a> almost 8 years ago (see link at end of article). There are also many things that have not changed in those years. Companies continue to be faced with the question of what technology platform to choose for their Line of Business (<a href="http://en.wikipedia.org/wiki/Line_of_Business" target="_blank">LOB</a>) applications. Often decisions are made based on criteria that have not been properly matched to business objectives. Sometimes the result is that the new technology platform is abandoned in the not so distant future, with a corresponding loss of investment dollars.</p>
<p>With a <strong>Just Enough Technology</strong> approach, a company evaluates technology against its core problem or objectives. I work with business and technology leaders within a company to define their true objectives and then weigh the technology decisions with their business objectives as the main criteria. Read through this article on choosing between the Java and Microsoft platforms. Both technologies have evolved quite a bit since this was first published, but some of the core arguments remain to this day.</p>
<p><span id="more-241"></span></p>
<p><strong>The article:<br />
A user asks Dave, &#8220;Assume that we have a new mission critical Web application that we need to develop over the next six months. How would you recommend we compare &amp; contrast the pros/cons of J2EE vs. .NET as the platform (assuming we have the proper skills)?&#8221; </strong></p>
<p>There are many, many factors that come into play when deciding between J2EE and .NET. As a foundational statement, let me state that I personally believe you can build (and I have built) mission critical Web applications on both platforms. Sun Microsystems commissioned a white paper (see links at the end of this post) that states the theoretical scalability of each platform is unlimited. I say this because your decision should not based on whether or not you *can* build a more robust application in one or the other. It can be done.</p>
<p>As far as developing Web services, either platform offers a great foundation. Of course there are intrinsic advantages to each platform which I&#8217;ll list later. Web services and .NET are tightly integrated. It is *very* easy to create a basic Web service in .NET. It is simply a matter of placing a directive on each method you want exposed as a Web method. The compiler does the rest for you. Deployment is also a breeze. For the most part, you simply copy your files to the server and you&#8217;re done. Visual Studio .NET is also a development environment that has no peers, in my opinion. I still believe Microsoft has the edge in getting a project out the door as fast as possible.</p>
<p>J2EE on the other hand also has some good tools for creating Web services. IBM&#8217;s WebSphere Studio Application Developer 4 offers some great work-saving features for creating Web services. Basically you choose a Java bean or other object to &#8220;WebServicefy&#8221; and step through the wizard. When you are done, WebSphere Studio has created a wrapper for your object and all the SOAP, WSDL, etc. code needed. It also has created a JSP application to test your new Web service. It works and it is straightforward. I was able to create a simple Web service within 30 minutes of opening the environment for the first time. Pretty impressive for a Java IDE.</p>
<p>If you have developers skilled in one or the other platforms, then lean strongly toward that platform. The cost of training is high. Leveraging existing skills should be a priority.</p>
<p>That said then, what are the decision points one would consider when choosing between J2EE and .NET? Here are a few considerations and who I think has the advantage in each:</p>
<p><strong>Multi-Platform: J2EE</strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Currently if you need to create applications that run on more than one platform, Java is your only choice. This may change in future as .NET is ported to other platforms &#8211; we&#8217;ll see.</p>
<p><strong>Legacy Integration: J2EE?</strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
If you need to integrate legacy systems you may have an easier time in J2EE. IBM for example, provided the iron for many of these systems and has very workable solutions to connect to mainframes through WebSphere. On the other hand, you *could* create a Web service on the legacy platform, making this point moot.</p>
<p><strong>Multi-Language: .NET</strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
If you have developers in VB, C++, Java and want a unified environment for them to work in, .NET is your choice. All languages are created equal and work together, including cross-language inheritance.</p>
<p><strong>Choice of Vendors: J2EE</strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Is a choice of vendors important to you? There are advantages to a multi-vendor solution &#8211; you can choose the best-of-breed for each component of your system. There are also advantages to a single vendor solution, which include better interoperability between components. For example, .NET and SQL Server 2000 working together are a powerful, easy to use (relatively) combination.</p>
<p><strong>Vertical Scalability: J2EE</strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
If scaling up by buying bigger iron is your organizations preferred method, than lean toward J2EE.</p>
<p><strong>Horizontal Scalability: .NET</strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
If your organization likes the idea of a greater number of cheaper servers than there is probably an edge with .NET.</p>
<p>Finally, after all is said and done, many decisions are in reality based on shall we say, non-scientific criteria such as:</p>
<p>Like Microsoft: .NET<br />
Don&#8217;t: J2EE</p>
<p>I say this only partly tongue-in-cheek. Prejudice against Microsoft and the underlying technology goes deep with many technical folks and some business folks. It is a real factor in making this decision. There is also a prejudice in the Microsoft community against Java that is also based on less than scientific findings.</p>
<p><strong>LINKS</strong>:</p>
<p>Original Article:<br />
( <a title="http://searchsoa.techtarget.com/news/article/0,289142,sid26_gci819020,00.html" href="http://searchsoa.techtarget.com/news/article/0,289142,sid26_gci819020,00.html">http://searchsoa.techtarget.com/news/article/0,289142,sid26_gci819020,00.html</a> )</p>
<p><a href="http://www.theserverside.com/resources/article.jsp?l=J2EE-vs-DOTNET">J2EE vs. Microsoft .NET:</a> (Copyright2001 The Middleware Company Prepared for Sun Microsystems, Inc.<br />
<a href="http://www.tpc.org/">Transaction Processing Performance Council</a><br />
<a href="http://www.objectwatch.com/FinalJ2EEandDotNet.doc">Roger Sessions&#8217; comparison of .NET to J2EE</a><br />
<a href="http://www.sdmagazine.com/articles/2001/0103/0103a/0103a.htm">Software Dev Magazine article</a><br />
<a href="http://java.oreilly.com/news/farley_0800.html">O&#8217;Reilly article comparing J2EE and .NET</a></p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2164beb6-222a-4558-9129-4b0d931cf8d0" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/SOA">SOA</a>,<a rel="tag" href="http://technorati.com/tags/Java">Java</a>,<a rel="tag" href="http://technorati.com/tags/.Net">.Net</a>,<a rel="tag" href="http://technorati.com/tags/Web+Services">Web Services</a>,<a rel="tag" href="http://technorati.com/tags/Scalability">Scalability</a>,<a rel="tag" href="http://technorati.com/tags/ROI">ROI</a>,<a rel="tag" href="http://technorati.com/tags/TCO">TCO</a></div>


<p>Related posts:<ol><li><a href='http://justenoughtechnology.com/choosing-between-java-and-net/' rel='bookmark' title='Permanent Link: Choosing Between Java and .Net'>Choosing Between Java and .Net</a></li>
<li><a href='http://justenoughtechnology.com/craftsmanship-and-software-development/' rel='bookmark' title='Permanent Link: Craftsmanship and Software Development'>Craftsmanship and Software Development</a></li>
<li><a href='http://justenoughtechnology.com/windows-azure-now-available/' rel='bookmark' title='Permanent Link: Windows Azure Now Available'>Windows Azure Now Available</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://justenoughtechnology.com/java-vs-net-another-blast-from-the-past/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows Azure Now Available</title>
		<link>http://justenoughtechnology.com/windows-azure-now-available/</link>
		<comments>http://justenoughtechnology.com/windows-azure-now-available/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 02:07:55 +0000</pubDate>
		<dc:creator>Dave Ranck</dc:creator>
				<category><![CDATA[Business and Technology]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://justenoughtechnology.com/?p=183</guid>
		<description><![CDATA[Microsoft&#8217;s Windows Azure and SQL Azure cloud services are now generally available with full SLAs. This ends the free test period for those who signed up last month. This is a key release milestone for Microsoft. Azure has been in development for several years and in beta since late 2008. From the Azure team blog:
Starting [...]


Related posts:<ol><li><a href='http://justenoughtechnology.com/146/' rel='bookmark' title='Permanent Link: Windows Azure Videos'>Windows Azure Videos</a></li>
<li><a href='http://justenoughtechnology.com/good-azure-video-from-pdc09/' rel='bookmark' title='Permanent Link: Good Azure Video from PDC09'>Good Azure Video from PDC09</a></li>
<li><a href='http://justenoughtechnology.com/java-vs-net-another-blast-from-the-past/' rel='bookmark' title='Permanent Link: Java vs. .Net &ndash; Another Blast From the Past'>Java vs. .Net &ndash; Another Blast From the Past</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Microsoft&#8217;s Windows <a title="Azure Services Platform - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/Azure_Services_Platform" rel=nofollow target=_blank>Azure </a>and SQL Azure cloud services are now generally available with full <acronym style="border-bottom: 1px dotted; cursor: help" title="Service Level Agreement">SLA</acronym>s. This ends the free test period for those who signed up last month. This is a key release milestone for Microsoft. Azure has been in development for several years and in beta since late 2008. From the Azure team blog:</p>
<blockquote><p>Starting today, customers and partners in countries across the globe will be able to launch their Windows Azure and SQL Azure production applications and services with the support of the full <a href="http://www.microsoft.com/windowsazure/sla/" target=_blank>Service Level Agreements</a> (SLAs).Â The Windows Azure platform AppFabric Service Bus and Access Control will continue to be free until April 2010 for those that sign up for a commercial subscription. Additionally Microsoft codename &#8220;Dallas&#8221; will continue to be in a free CTP.</p></blockquote>
<p><a title="Azure Team Blog" href="http://blogs.msdn.com/windowsazure/archive/2010/02/01/windows-azure-platform-now-generally-available-in-21-countries.aspx" target=_blank>Read more on the Azure team blog.</a></p>


<p>Related posts:<ol><li><a href='http://justenoughtechnology.com/146/' rel='bookmark' title='Permanent Link: Windows Azure Videos'>Windows Azure Videos</a></li>
<li><a href='http://justenoughtechnology.com/good-azure-video-from-pdc09/' rel='bookmark' title='Permanent Link: Good Azure Video from PDC09'>Good Azure Video from PDC09</a></li>
<li><a href='http://justenoughtechnology.com/java-vs-net-another-blast-from-the-past/' rel='bookmark' title='Permanent Link: Java vs. .Net &ndash; Another Blast From the Past'>Java vs. .Net &ndash; Another Blast From the Past</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://justenoughtechnology.com/windows-azure-now-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Craftsmanship and Software Development</title>
		<link>http://justenoughtechnology.com/craftsmanship-and-software-development/</link>
		<comments>http://justenoughtechnology.com/craftsmanship-and-software-development/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 22:31:56 +0000</pubDate>
		<dc:creator>Dave Ranck</dc:creator>
				<category><![CDATA[Architecture and Design]]></category>
		<category><![CDATA[Business and Technology]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://justenoughtechnology.com/craftsmanship-and-software-development/197/</guid>
		<description><![CDATA[In a previous post I quoted a colleague who stated :
I like how they use the term “Craftsman” to describe what we do….[the craftsmen are] the ones who have taken the time to master the tools that have been made available to them to assist in their craft.
Craftsmanship in the manner used above,  refers to [...]


Related posts:<ol><li><a href='http://justenoughtechnology.com/test-dev/' rel='bookmark' title='Permanent Link: Is Software Engineering Dead?'>Is Software Engineering Dead?</a></li>
<li><a href='http://justenoughtechnology.com/why-do-we-need-software-architects/' rel='bookmark' title='Permanent Link: Why Do We Need Software Architects?'>Why Do We Need Software Architects?</a></li>
<li><a href='http://justenoughtechnology.com/choosing-between-java-and-net/' rel='bookmark' title='Permanent Link: Choosing Between Java and .Net'>Choosing Between Java and .Net</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>In a previous post I quoted a colleague who stated :</p>
<blockquote><p>I like how they use the term “Craftsman” to describe what we do….[the craftsmen are] the ones who have taken the time to master the tools that have been made available to them to assist in their craft.</p></blockquote>
<p>Craftsmanship in the manner used above,  refers to an attention to detail and a pride in one’s work product. A craftsman is more than a worker – he or she truly cares that they do things right and to the best of their ability. I agree with this thought in principle, but I want to expand on it a bit and speak to one difficulty with software craftsmanship as a methodology.<span id="more-197"></span></p>
<p>In today’s technological world we need craftsmen, but we also need more than craftsmen. As an allegory, look at home building. We care about the quality of construction in homes that we buy. We certainly want to make sure everything is up to code and if we live in an area subject hurricanes, we want to know the proper standards and materials have been used in construction. We want to be sure that the workers who raise the frame, do the plumbing and electrical work and do the interior finish work are adequately skilled in their craft. That said, we would not hire a cabinet maker to do the framing, an electrical engineer to run the wiring or a rocket scientist to handle the plumbing. We choose the right skills and tools for the job at hand.</p>
<p>Software development is still in large part a craft, an art. We are not yet at the stage where every aspect of software development is reduced to a kind of binary assembly line, where unskilled workers assemble programs from software “parts”. True, there are some benefits we can receive from using prebuilt libraries or components, saving development, testing and maintenance costs as we will discuss below. But we still need good, skilled developers to do the heavy lifting. Software is not like machinery. For the most part, you design and build a machine to do one thing. Software on the other hand is much more multi-faceted and when starting a software design, there really are almost unlimited options available. A problem can be solved in many, many ways. A craftsman is needed to help choose an appropriate solution.</p>
<p>But we are also beyond the time when every piece of software must be built from the ground up. There are many commercial and <a title="Open source - Wikipedia, the free encyclopedia" rel="nofollow" href="http://en.wikipedia.org/wiki/Open_source" target="_blank">open source</a> solutions available that can jumpstart projects or that can provide the backbone for common application functionality. These solutions include things like <a title="NHibernate - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/NHibernate" target="_blank">nHibernate</a>, Spring, and other persistence libraries that handle common operations in a manner that has been well-tested and which meets the needs of many projects. The Java community has made very good use of open source projects and libraries, some of which are now included in core Java. Why then aren’t these types of libraries used more frequently in Line of Business (LOB) applications? I believe business is often missing out on long and short term cost savings by not leveraging these open source or 3rd party solutions. One reason these solutions are sometimes not adopted (certainly not the only reason) is the inherent craftsman mentality of developers and architects. I call it the “<em>But we can do better</em>” syndrome.</p>
<p>You are probably familiar with the <a href="http://en.wikipedia.org/wiki/Pareto_principle" target="_blank">Pareto principle</a>, also know as the 80-20 rule. In  the cost-benefit analysis of software projects this rule can be stated as “80% of the benefit comes from 20% of the development effort”. What this means in practice: IT needs to concentrate on that 20% of the time and effort which provides the most benefit and spend a lot less time and effort on the remaining 80%. In reality, it is often difficult for technical people to do this. Why? The 20% tends to be more mundane from a technical perspective and there is a lot of interesting design and coding to be done in the 80%. There’s an old story programmers tell about the a programmer who said “I can write that function in 10 lines of code”. Another programmer said, “I can do it in 5 lines of code”. Finally, a third said “Well, I can do it only one line of code” and he proceeded to spend hours upon hours writing and rewriting the function until it worked with only one line of code. What is the problem with this story? The first programmer could have written the function in minutes, the second in an hour or two but it took the third programmer many hours to complete the task. On top of that, the third programmer’s code was so complicated and used so many programming “tricks&#8217;” that very few other programmers could understand how it worked.</p>
<p>The “We can do better” syndrome is difficult for business to fight. Better after all is well, better. If we can reduce the time it takes to execute a function by 500%, it should be worth the effort because of the performance savings. Right? What if it only took .5 milliseconds for the function to run before it was optimized? End users would see zero benefit from the added effort to increase performance.* But from the third programmer’s perspective, he did the right thing. He made the application more efficient according to his definition.</p>
<p>Programmers also tend to distrust code that came from an unknown source (or even from one of their colleagues). In the early days of distributed computing we had the grand notion of creating object libraries full of reusable code. The greatest obstacle we faced to reaching this goal was the unwillingness of developers to use another programmer’s code. They would rather create it themselves. There was always something that the library didn’t do or didn’t do “well enough” in their opinion.</p>
<p>The moral of the story is this: we must apply the same logic for selecting software solutions that we would in other areas of business. Good enough is good enough. If there is an open source library or 3rd party library available that meets the 80-20 rule and which will truly deliver on the project’s requirements, it should be strongly considered as an alternative to developing everything from scratch. In order to know when to use an existing library and when to build a new library, business and IT must work together, and IT must keep the business objectives as the first priority. On the other hand business must be clear about their objectives with IT. Those objectives are the measuring stick for evaluating software design alternatives.</p>
<p style="padding-left: 30px;"><em>* I am aware that in some instances such as recursive calls, .5 milliseconds can be a performance bottleneck. That isn’t the scenario I am using here.</em></p>


<p>Related posts:<ol><li><a href='http://justenoughtechnology.com/test-dev/' rel='bookmark' title='Permanent Link: Is Software Engineering Dead?'>Is Software Engineering Dead?</a></li>
<li><a href='http://justenoughtechnology.com/why-do-we-need-software-architects/' rel='bookmark' title='Permanent Link: Why Do We Need Software Architects?'>Why Do We Need Software Architects?</a></li>
<li><a href='http://justenoughtechnology.com/choosing-between-java-and-net/' rel='bookmark' title='Permanent Link: Choosing Between Java and .Net'>Choosing Between Java and .Net</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://justenoughtechnology.com/craftsmanship-and-software-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
