<?xml version="1.0" encoding="utf-8"?>
<feed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom">
  <title>The Efficient Coder</title>
  <link rel="alternate" type="text/html" href="http://www.efficientcoder.net/" />
  <link rel="self" href="http://www.efficientcoder.net/SyndicationService.asmx/GetAtom" />
  <icon>favicon.ico</icon>
  <updated>2009-04-20T18:19:38.00825-04:00</updated>
  <author>
    <name>Kevin D. Wolf</name>
  </author>
  <subtitle>There has got to be a better way of communicating with our computers!</subtitle>
  <id>http://www.efficientcoder.net/</id>
  <generator uri="http://www.dasblog.net" version="1.8.5223.2">DasBlog</generator>
  <entry>
    <title>EFFICIENTCODER IS MOVING!!!!!</title>
    <link rel="alternate" type="text/html" href="http://www.efficientcoder.net/PermaLink,guid,25fa4072-9556-4fbd-b828-9b3b5cca0235.aspx" />
    <id>http://www.efficientcoder.net/PermaLink,guid,25fa4072-9556-4fbd-b828-9b3b5cca0235.aspx</id>
    <published>2009-04-20T18:19:19.008-04:00</published>
    <updated>2009-04-20T18:19:38.00825-04:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Well not me, but my site is.  The new address is <a href="http://new.efficientcoder.net">http://new.efficientcoder.net</a>,
      please adjust your RSS feed.
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=25fa4072-9556-4fbd-b828-9b3b5cca0235" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Announcing V4.1.2009 of Cloud-2-Relational Query Engine </title>
    <link rel="alternate" type="text/html" href="http://www.efficientcoder.net/PermaLink,guid,40f9a930-bf75-4581-a997-b7c6c8b4896a.aspx" />
    <id>http://www.efficientcoder.net/PermaLink,guid,40f9a930-bf75-4581-a997-b7c6c8b4896a.aspx</id>
    <published>2009-04-01T14:20:44.711-04:00</published>
    <updated>2009-04-14T14:25:27.258-04:00</updated>
    <category term="ASP.NET" label="ASP.NET" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p class="post-title entry-title">
          <font size="4" face="Times New Roman">We are pleased to announce the release of V4.1.2009
      of the Cloud-2-Relational Query Engine.</font>
        </p>
        <div class="post-body entry-content">
          <h3>What is it?
      </h3>
          <p>
            <font size="4" face="Times New Roman">Our Query Engine will allow you to write SQL
         that will be executed against both a cloud table storage provider as well as most
         relational database engines.</font>
          </p>
          <p>
            <font size="4" face="Times New Roman">We all know the benefit of an RDBMS is the ability
         to write sophisticated DML to extract data.  Although these scale fairly well,
         to store hundreds of millions of records requires special attention or your performance
         will suffer.  Most cloud storage solutions have the ability to store zillions
         of records (well at least in theory) but don’t really support joins, this is a real
         problem if you want to normalize your database.</font>
          </p>
          <p>
            <font size="4" face="Times New Roman">This is where our product comes in.  The
         best of both worlds, the ability of a cloud table provider to store zillions of orders
         and the ability to join those orders with a much smaller lookup table such as OrderStatus</font>
          </p>
          <p>
            <font size="4" face="Times New Roman">You simply write a query such as:</font>
          </p>
          <blockquote>
            <p>
              <font face="Courier New">select rdbms.Status, cloud.OrderNumber, cloud.OrderAmount 
         <br />
           from status rdbms, 
         <br />
            join (Select  OrderNumber, OrderAmount  
         <br />
                    from  myCloud.orders  
         <br />
                    </font>
              <font face="Courier New">where
         UserId = @userId) as cloud on cloud.OrderStatusId = rdbms.OrderStatusId</font>
            </p>
            <p>
              <font face="Courier New">
              </font>
            </p>
          </blockquote>
          <p>
            <font size="4" face="Times New Roman">We are still working on enforcing referential
         integrity however once we do that we will have the best of both worlds.  Performance
         and Scalability of large scale cloud storage and flexibility of a RDBMS.</font>
          </p>
          <p>
            <font size="4" face="Times New Roman">-ec</font>
          </p>
        </div>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=40f9a930-bf75-4581-a997-b7c6c8b4896a" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Tweet My Run</title>
    <link rel="alternate" type="text/html" href="http://www.efficientcoder.net/PermaLink,guid,7b391762-a511-409a-9685-6886762503e4.aspx" />
    <id>http://www.efficientcoder.net/PermaLink,guid,7b391762-a511-409a-9685-6886762503e4.aspx</id>
    <published>2009-03-16T14:23:16.523-04:00</published>
    <updated>2009-04-14T14:24:33.398625-04:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="4" face="Times New Roman">With the introduction of Windows Azure I was
      looking for something I could write where I could kick the tires and see what’s involved
      with this new technology.  For a quick overview what I came up with, please see
      the video video I created for my Mix09 “</font>
          <a href="http://2009.visitmix.com/MIXtify/ShowOff.aspx">
            <font color="#6699cc" size="4" face="Times New Roman">Show
      Off</font>
          </a>
          <font size="4" face="Times New Roman">” entry hosted on </font>
          <a href="http://video.msn.com/video.aspx?vid=17462749-2fcf-4bff-bc49-fdf72b32ba16">
            <font color="#6699cc" size="4" face="Times New Roman">SoapBox</font>
          </a>
          <font size="4" face="Times New Roman">. 
      My first (of hopefully many) Azure applications I created is online at </font>
          <a href="http://www.tweetmyrun.net/">
            <font color="#666699" size="4" face="Times New Roman">http://www.tweetmyrun.net</font>
          </a>
          <font size="4" face="Times New Roman">. 
      The user experience needs a little tweaking but it seems to be working great!</font>
        </p>
        <p align="center">
          <img border="0" src="http://www.efficientcoder.net/content/binary/TweetMyRun.png" />
        </p>
        <p>
          <font size="4" face="Times New Roman">This application uses the following technologies:</font>
        </p>
        <ul>
          <li>
            <font size="4" face="Times New Roman">Windows Live Authentication </font>
          </li>
          <li>
            <font size="4" face="Times New Roman">Windows Azure Hosting Services </font>
          </li>
          <li>
            <font size="4" face="Times New Roman">Windows Azure Table Storage </font>
          </li>
          <li>
            <font size="4" face="Times New Roman">Silverlight 2.0 “talking” to Azure via WCF </font>
          </li>
        </ul>
        <p>
          <font size="4" face="Times New Roman">Here’s are some high-level bullet points you
      need to get started:</font>
        </p>
        <ol>
          <li>
            <font size="4" face="Times New Roman">Download the Windows Azure </font>
            <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=80e3eabf-0507-4560-aeb6-d31e9a70a0a6&amp;displaylang=en">
              <font color="#6699cc" size="4" face="Times New Roman">SDK</font>
            </a>
            <font size="4" face="Times New Roman">
            </font>
          </li>
          <li>
            <font size="4" face="Times New Roman">Download the Windows </font>
            <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=8e90b639-1ef0-4e21-bb73-fc22662911bc&amp;displaylang=en">
              <font color="#6699cc" size="4" face="Times New Roman">Visual
         Studio Tools</font>
            </a>
            <font size="4" face="Times New Roman"> for Azure </font>
          </li>
          <li>
            <font size="4" face="Times New Roman">Apply to participate in the </font>
            <a href="http://go.microsoft.com/fwlink/?LinkID=129453">
              <font color="#6699cc" size="4" face="Times New Roman">beta</font>
            </a>
            <font size="4" face="Times New Roman">. </font>
          </li>
          <li>
            <font size="4" face="Times New Roman">Create a library project to contain your DAL,
         I found this </font>
            <a href="http://blogs.msdn.com/jnak/archive/2008/10/28/walkthrough-simple-table-storage.aspx">
              <font color="#6699cc" size="4" face="Times New Roman">post</font>
            </a>
            <font size="4" face="Times New Roman"> as
         a great starting point. </font>
          </li>
          <li>
            <font size="4" face="Times New Roman">Start your development storage from the start
         menu after configuring the your table storage settings with the following settings: </font>
            <ol>
              <li>
                <font size="4" face="Times New Roman">AccountName = devstoreaccount1 </font>
              </li>
              <li>
                <font size="4" face="Times New Roman">Shared Key = Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw== </font>
              </li>
              <li>
                <font size="4" face="Times New Roman">Storage Endpoint = 127.0.0.1:&lt;StoragePort&gt; </font>
              </li>
            </ol>
          </li>
          <li>
            <font size="4" face="Times New Roman">Create BAT file to extract the settings from
         your DAL assembly to create tables to simulate you Azure Table Storage with something
         similar to: 
         <br /></font>
            <font size="4" face="Times New Roman">"Program Files\Windows Azure SDK\v1.0\bin\DevtableGen.exe"
         /forceCreate "/server:localhost\SQLExpress" "/database:MyDatabase" obj\Debug\MyDAL.dll 
         <br />
         pause </font>
          </li>
          <li>
            <font size="4" face="Times New Roman">For more information on configuring IIS 7.0
         click </font>
            <a href="http://msdn.microsoft.com/en-us/library/dd179419.aspx">
              <font color="#6699cc" size="4" face="Times New Roman">here</font>
            </a>
            <font size="4" face="Times New Roman">. </font>
          </li>
          <li>
            <font size="4" face="Times New Roman">Although you can certainly test your application
         on the local development fabric, as long as you create your site as a web role, you
         can test most of the features as just a standard IIS web site. </font>
          </li>
          <li>
            <font size="4" face="Times New Roman">When working with Live Authentication redirection
         back to your server, I found creating an entry in your HOSTS file works good. </font>
          </li>
        </ol>
        <p>
          <font size="4" face="Times New Roman">If you have any questions, please free to message
      me on Twitter via @bytemaster</font>
        </p>
        <p>
          <font size="4" face="Times New Roman">-ec</font>
        </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=7b391762-a511-409a-9685-6886762503e4" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Creating Project Item Templates in Visual Studio</title>
    <link rel="alternate" type="text/html" href="http://www.efficientcoder.net/PermaLink,guid,64336e85-5741-4650-801e-78eddb7cfb48.aspx" />
    <id>http://www.efficientcoder.net/PermaLink,guid,64336e85-5741-4650-801e-78eddb7cfb48.aspx</id>
    <published>2009-02-27T12:06:05.935-05:00</published>
    <updated>2009-02-27T12:07:33.3734328-05:00</updated>
    <category term="Software Engineering" label="Software Engineering" scheme="dasBlog" />
    <category term="Code Generation" label="Code Generation" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <font size="4" face="Times New Roman">I'm
   building a multi-tier application in JavaScript.  This is implementing the <a href="http://blogs.msdn.com/johngossman/archive/2005/10/08/478683.aspx">Model
   View ViewModel</a> pattern to keep as much of the code generic as possible, while
   allowing for customizations in both the UI and data layers for specific browsers and
   data access methods such as a local SQLLite database or calls to the server. 
   I'm using code-generation </font>
        <font size="4" face="Times New Roman">to create my
   models, but need a good way to create the Controllers, Views, and ViewModels. </font>
        <font size="4" face="Times New Roman">
        </font>
        <font size="4" face="Times New Roman">I
   had been using a simple template, but cutting, pasting and replacing text seemed a
   little inefficient, so I decided to create some Visual Studio Templates to accomplish
   this goal.<br /></font>
        <br />
        <font size="4" face="Times New Roman">It's fairly simple to create a <a href="http://msdn.microsoft.com/en-us/library/tsyyf0yh.aspx">trivial
   template</a>, but I needed to add just bit more complexity, I need to build up a custom
   namespace for my classes, so just a simple ZIP file containing my template didn't
   cut it.  The answer was to implement <a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.templatewizard.iwizard.aspx">IWizard</a> in
   the Microsoft.VisualStudio.TemplateWizard namespace<br /><br />
   We need to create two components for our new templates, a ZipFile containing, *.vstemplate
   and a .NET Assembly containing the IWizard implementation.<br /><br /><font size="5"><b><font face="Arial">Create your IWizard Implementation</font></b></font><br />
   1) Create a Windows Class Library<br />
   2) Add the following References<br /></font>
        <ul>
          <li>
            <font size="4" face="Times New Roman">EnvDTE</font>
          </li>
          <li>
            <font size="4" face="Times New Roman">Microsoft.VisualStudio.TemplateWizardInterface</font>
          </li>
        </ul>
        <font size="4" face="Times New Roman">3) Create an empty class, and implement the
   interface <a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.templatewizard.iwizard.aspx">Microsoft.VisualStudio.TemplateWizard.IWizard</a><br />
   4) The method you care most about is:</font>
        <br />
        <font face="Courier New">      public void RunStarted(<font color="#0000ff">object</font> automationObject, <font color="#0000ff">Dictionary</font>&lt;<font color="#000080">string</font>, <font color="#000080">string</font>&gt;
   replacementsDictionary, Microsoft.VisualStudio.TemplateWizard.<font color="#0000ff">WizardRunKind</font> runKind, <font color="#0000ff">object</font>[]
   customParams)</font>
        <br />
        <br />
        <font size="4" face="Times New Roman">5) In this method you can add additional tokens
   to be used in your template by adding name value pairs to the replacementDictionary<br /></font>          <font face="Courier New">replacementsDictionary.Add("<font color="#ff0000">$modulename$</font>",
   "<font color="#ff0000">MyName</font>");</font><br /><br /><font size="4" face="Times New Roman">6) In addition you can add a standard windows
   form to your wizard to collect information<br /></font><font face="Courier New">      _inputForm = new <font color="#008000">ModuleInputForm</font>();</font><br /><font face="Courier New">      _inputForm.ShowDialog();</font><br /><br /><font face="Courier New">      replacementsDictionary.Add("<font color="#ff0000">$modulename$</font>",
   _inputForm.ModuleName);</font><br /><br /><font size="4" face="Times New Roman">7) Within the Project Properties and the Signing
   Tab, you need <a href="http://msdn.microsoft.com/en-us/library/ms247123%28VS.80%29.aspx">sign</a> your
   assembly.  You will be installing within the GAC, so it needs a strong name.<br />
   8) <a href="http://support.microsoft.com/kb/815808">Install</a> your Assembly in the
   GAC.  The easiest way to do this is to just copy the file from your build output
   directory to %WINDIR%\assemblies between two explorer windows.<br /></font><font size="4" face="Times New Roman">9) After you install your Assembly note
   the <b>Assembly Name</b> and <b>Public Key Token</b>, you will need these to create
   your vstemplate.</font><br /><br /><div align="center"><img src="http://www.efficientcoder.net/content/binary/StrongName.jpg" border="0" /><br /></div><font size="4" face="Times New Roman"><br />
   10) If you make updates to your wizard, you have to make sure you close all instances
   of Visual Studio .NET so your wizard is reloaded.<br /><br /><b><font size="5" face="Arial">Create your vstemplate:</font></b><br />
   We will need to create a ZIP file that contains at least three components (more if
   you want to generate multiple files):<br />
   1) SomeTemplate.ext - This will contain the template used to create the Visual Studio
   Project Item<br />
   2) Specification.vstemplate - An XML file that contains the configuration for your
   template<br />
   3) Image.ico - An image that will be displayed in the new project item dialog for
   your custom project template.<br /><br />
   What I did was just create a temp directory where I created these files.  Once
   complete I'll zip them up and show you where to put them so Visual Studio will recognize
   them.<br /><br /><font face="Arial"><b> SomeTemplate.ext</b></font>, or in my case Controller.js<br />
   This is your custom template.  It can contain anything, but what makes this work
   is the ability to replace tokens within the template.  I wanted to use a custom
   module name and class name within my JavaScript files, this is only a fragment from
   the file, but you get the idea.<br /><br /></font><font face="Courier New">MyCompany.Controllers.$modulename$.$safeitemname$.registerClass('</font><font face="Courier New">MyCompany</font><font face="Courier New">.Controllers.$modulename$.$safeitemname$',
   null, Sys.IDisposable, </font><font face="Courier New">MyCompany</font><font face="Courier New">.Controllers.IController);</font><br /><br /><font size="4" face="Times New Roman"><b><font size="4" face="Arial">Specification.vstemplate</font></b> or
   in my case </font>Controller.vstemplate<br /><font size="4" face="Times New Roman">Next we need to create our .vstemplate file. 
   This is a small XML file that tells Visual Studio how to build your populated instance
   of the template, it's format is as follows: </font><br /><br /><font face="Courier New">&lt;VSTemplate Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005"
   Type="Item"&gt;<br />
     &lt;TemplateData&gt;<br />
       &lt;DefaultName&gt;Controller.js&lt;/DefaultName&gt;<br />
       &lt;Name&gt;M-V-VM Controller&lt;/Name&gt;<br />
       &lt;Description&gt;Model View ViewModel Controller&lt;/Description&gt;<br />
       &lt;ProjectType&gt;CSharp&lt;/ProjectType&gt;<br />
       &lt;SortOrder&gt;10&lt;/SortOrder&gt;<br />
       &lt;Icon&gt;__TemplateIcon.ico&lt;/Icon&gt;<br />
     &lt;/TemplateData&gt;<br />
     &lt;TemplateContent&gt;<br />
       &lt;References /&gt;<br />
       &lt;ProjectItem SubType="" TargetFileName="$fileinputname$.js"
   ReplaceParameters="true"&gt;Controller.js&lt;/ProjectItem&gt;<br />
     &lt;/TemplateContent&gt;<br />
     &lt;WizardExtension&gt;<br />
       &lt;Assembly&gt;MyCompany.</font><font face="Courier New">Templates.</font><font face="Courier New">WizardTemplateInstance,
   Version=1.0.0.0, Culture=Neutral, PublicKeyToken=a2c453bf57a7f5d7&lt;/Assembly&gt;<br />
       &lt;FullClassName&gt;</font><font face="Courier New">MyCompany.Templates.WizardTemplateInstance</font><font face="Courier New">&lt;/FullClassName&gt;<br />
     &lt;/WizardExtension&gt;<br />
   &lt;/VSTemplate&gt;</font><br /><br /><font size="4" face="Times New Roman">Pretty straight forward. but <a href="http://msdn.microsoft.com/en-us/library/xwkxbww4.aspx">here's
   a little more information</a> about the file format, one important note, make sure
   in your ProjectItem node, you have ReplaceParameters="true" to update your tokens. 
   In addition to the custom tokens we added in the wizard we created above, here is
   a <a href="http://msdn.microsoft.com/en-us/library/eehb4faa.aspx">list</a> of built
   in tokens.<br /><br />
   You need to find yourself an icon for your template.  Make sure it's in the same
   directory and is specified by the &lt;Icon&gt; node.<br /><br />
   Once you have this completed, zip all three files and place them in the directory
   on your machine similar to:<br />
        <font face="Courier New">[USERNAME]\Documents\Visual Studio
   2008\Templates\ItemTemplates</font><br /><br /><b><font size="5" face="Arial">Generate your Template</font></b><br />
   Start Visual Studio, within your solution tree, click on Add New Item and in the bottom
   section on MyTemplates you should see the following:</font><br /><div align="center"><img src="content/binary/NewItem.jpg" border="0" /><br /></div><font size="4" face="Times New Roman">Change the name and if the Software God's are
   shining on you you should see:</font><br /><br /><div align="center"><img src="content/binary/ModuleName.jpg" border="0" /><br /></div><font size="4" face="Times New Roman"><br />
   where you can enter the name of your module.<br /><br />
   Once you hit Save, your new file should get generated any tokens you specified be
   replaced.  In my case here is a portion of the generated file with the module
   name of "Sync" and file name of "History" is as follows:<br /></font><br /><font face="Courier New">MyCompany.Controllers.$modulename$.$safeitemname$.registerClass('</font><font face="Courier New">MyCompany</font><font face="Courier New">.Controllers.$modulename$.$safeitemname$',
   null, Sys.IDisposable, </font><font face="Courier New">MyCompany</font><font face="Courier New">.Controllers.IController);</font><br /><font face="Courier New">MyCompany.Controllers.Sync.History.registerClass('<font color="#ff0000">MyCompany.Controllers.Sync.History</font>',
   MyCompany.Controllers.ControllerBase, Sys.IDisposable, MyCompany.Controllers.IController);</font><br /><br /><div align="center"><i>Yes that is Javascript, if you are doing client side programming,
      why aren't you taking advantage of the <a href="http://msdn.microsoft.com/en-us/library/bb397536.aspx">Microsoft
      Ajax Client Library</a>?</i><br /></div><br /><br />
   -ec<br /><img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=64336e85-5741-4650-801e-78eddb7cfb48" /></div>
    </content>
  </entry>
  <entry>
    <title>From Copy-and-Paste to Ninja, Learning New Technologies</title>
    <link rel="alternate" type="text/html" href="http://www.efficientcoder.net/PermaLink,guid,9e6780bb-52a6-47de-aa0f-4e6428204bc6.aspx" />
    <id>http://www.efficientcoder.net/PermaLink,guid,9e6780bb-52a6-47de-aa0f-4e6428204bc6.aspx</id>
    <published>2009-02-17T08:25:31.046-05:00</published>
    <updated>2009-02-17T08:32:08.765625-05:00</updated>
    <category term="Software Engineering" label="Software Engineering" scheme="dasBlog" />
    <category term="XNA" label="XNA" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <font face="Times New Roman">
          <font size="4">I've
   always had a drive to take apart anything electronic and figure out how it worked. 
   Even better if the thing had a microprocessor since then I would try to start up a
   conversation with it.  I think my first experience with this was hooking up an
   old <a href="http://www.columbia.edu/acis/history/teletype.html">teletype machine</a> given
   to me by my junior high school to a <a href="http://en.wikipedia.org/wiki/Commodore_VIC-20">VIC-20</a> computer
   to use a printer.  Then came the first XBox.  I enjoyed playing games on
   it, but I wasn't really a gamer.  Then I found out about <a href="http://www.llamma.com/xbox/Mods/DUO_X3_Installation.htm">modding</a> the
   darn thing...I think the main reason for this was to be able to make *back-ups* of
   your games.  I really didn't so much care about that, I wanted to find a version
   of the XBox SDK and get my own Hello World programming running.<br /></font>
        </font>
        <p>
        </p>
        <img src="http://www.efficientcoder.net/content/binary/x3.jpg" border="0" />
        <br />
        <br />
        <font face="Times New Roman" size="4">That brings us to current day, Microsoft did
   something really cool and made game development main-stream for the XBox 360 in the
   form of the <a href="http://creators.xna.com/en-US/">XNA Game Studio</a>.  Last
   summer I downloaded Version 2.0 of the SDK and started my journey on learning this
   new technology.  Other than playing around with the <a href="http://en.wikipedia.org/wiki/HYDRA_Game_Development_Kit">Hydra
   Game Development Kit</a>, I knew next to nothing about game programming, this was
   a chance to learn a brand new technology.  
   <br /><br />
   I'm still in the process of learning but I thought it was interesting on how I'm building
   my first game.  Most of the time when I write an application, I <i>really</i> want
   to have an in depth knowledge of what's happening with the code.  I don't like
   calling methods, even if they are in a library or frameworks unless I at least have
   a general knowledge of how that software will be ran by the processor.  In January
   I started a project that I will be publishing in March as a Community Game on the
   XBox 360.  To make this work, I needed to do a bunch of stuff I really had no
   clue how to program.  These were things like explosions, smoke from a missle
   trail etc...  I found some great tutorials and started cutting and pasting my
   way to an application that pretty much did what I needed to, although the program
   was a mess.  I did feel dirty doing this, but just reading about code isn't enough,
   implementing it into something that actually runs is a much better way to learn things.  
   <br /><br />
   So I figured out how to create 3D models with the <a href="http://www.softimage.com/products/modtool/">XSI
   Mod Tool</a>, that was no small chore, but kind of fun and something I did on the
   couch while watching TV.  Next I found some code to render the model in my game,
   I cut-and-pasted that into my application and be-hold the model was spinning in 3D,
   although I didn't know how it worked it was rewarding.  Then I added a few more
   models and decided that the code just didn't "smell right" anymore.  It was a
   good time to create a class that knew how to render models in <b>my game</b>, this
   was important since <b>my game</b> had some specific needs and I couldn't just cut-and-paste
   anymore I needed to know how the code worked.  This is when the lights started
   coming on.  Next was implementing the flight of a missile.  I found some
   algorithms for acceleration and gravity as well as a smoke plume and cut-and-pasted
   the code.  This got me about 75% of the way there and was a mess, but at least
   it sort-of worked and was rewarding.  I refactored the code, learned how it worked
   and the light bulbs came on again.  I repeated this process for other things
   such as rendering water and implementing a generic controller that works with either
   a keyboard or game controller.  So the basic pattern here was add the features,
   you may need a dependency that you don't know how to implement, that's OK, instead
   of just banging your head against the wall for 3 days, find some code the sort-of
   does what you want, get it working.  Then the real critical part, refactor the
   hell out of it and make that code your own!<br /><br /></font>
        <img src="http://www.efficientcoder.net/content/binary/Game.png" border="0" />
        <br />
        <br />
        <font face="Times New Roman" size="4">This was a project I wrote for myself, most
   of the time people pay me to write software so I can't recommend this process for
   any client work.  However now if a client contracted with me build an XNA game
   (fat chance, but you never know), I can point to some real world experience and feel
   good that I'll be delivering a solution and not learning on the job.<br /></font>
        <br />
        <img src="http://www.efficientcoder.net/content/binary/Game2.png" border="0" />
        <br />
        <br />
        <font face="Times New Roman" size="4">I think to a certain extent, this is probably
   how we learn to implement technologies most of the time, but in smaller steps. 
   This was just very obvious since I had to start from scratch with many core concepts
   and the process of turning the cut-and-paste code into my own code was very clear
   and effective.  So don't feel bad about cutting and pasting code, just make sure
   you don't leave it like that once you get it working.  Apply your style, refactor,
   rinse and repeat and make the code your own!<br /><br />
   -ec</font>
        <br />
        <br />
        <br />
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=9e6780bb-52a6-47de-aa0f-4e6428204bc6" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Sitting out the Great Quality Wars of '09</title>
    <link rel="alternate" type="text/html" href="http://www.efficientcoder.net/PermaLink,guid,feed9006-dca9-4fb2-b282-779c38339dc3.aspx" />
    <id>http://www.efficientcoder.net/PermaLink,guid,feed9006-dca9-4fb2-b282-779c38339dc3.aspx</id>
    <published>2009-02-12T12:44:54.634-05:00</published>
    <updated>2009-02-12T13:06:59.306625-05:00</updated>
    <category term="Business of Software" label="Business of Software" scheme="dasBlog" />
    <category term="Project Delivery" label="Project Delivery" scheme="dasBlog" />
    <category term="Software Engineering" label="Software Engineering" scheme="dasBlog" />
    <category term="Software Metrics" label="Software Metrics" scheme="dasBlog" />
    <content type="html">&lt;p class=MsoNormal style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;Lines are
   starting to get drawn for the Great Quality Wars of '09.&amp;nbsp; On one side you have
   camp led by &lt;a href="http://www.joelonsoftware.com/"&gt;&lt;span style="COLOR: blue"&gt;Joel
   Spolsky&lt;/span&gt;&lt;/a&gt; and the now infamous &lt;a href="http://www.joelonsoftware.com/items/2009/01/31.html"&gt;&lt;span style="COLOR: blue"&gt;Stack
   Overflow Podcast #38&lt;/span&gt;&lt;/a&gt;, and the other camp led by &lt;a href="http://blog.objectmentor.com/articles/2009/01/31/quality-doesnt-matter-that-much-jeff-and-joel"&gt;&lt;span style="COLOR: blue"&gt;Uncle
   Bob&lt;/span&gt;&lt;/a&gt;.&amp;nbsp; I'm sitting this one out, from what I can see so far, both sides
   are going to get bloodied up where the discussion turns from a reasonable and positive
   debate to personal attacks.&lt;span&gt;&amp;nbsp; &lt;/span&gt;We have a lot of problems in our industry
   and dividing it into factions won't help anyone.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Especially when
   I see this religious war based on &lt;b&gt;&lt;i&gt;how do I get there&lt;/i&gt;&lt;/b&gt;, not &lt;b&gt;&lt;i&gt;where
   do we want to go&lt;/i&gt;&lt;/b&gt;&lt;?xml:namespace prefix = o /&gt;.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;This, being
   on a much greater scale, reminds me of the Great Coding Convention Battles I participated
   in within a company in the early 90's.&amp;nbsp; One of the stupidest things we discussed
   over the course of a month of meetings was whether to use the following syntax for
   one line after an if statement. &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;if(true)&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp; DoSomething();&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;or &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;if(true)&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;{&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp; DoSomething();&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;}&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;Looking
   back this was a tremendous waste of time, albeit a relatively fun discussion in our
   meetings where both sides decided the other side was a bunch of hacks.&amp;nbsp; 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;I was in the &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;if(true)&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp; DoSomething()&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Verdana','sans-serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;camp
   unless I wasn't.&amp;nbsp; 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;For the case
   of: &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;if(true)&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
   while(someCondition)&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
   DoSomethingElse();&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Verdana','sans-serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;I would
   use the convention:&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;if(true)&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;{&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
   while(someCondition)&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
   DoSomethingElse();&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'"&gt;}&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Verdana','sans-serif'"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;where
   I would be in both camps.&amp;nbsp; What does this mean?&amp;nbsp; Does this mean I'm a moderate?&amp;nbsp;
   Well no, I do have very strong views on both coding (and politics but I'll spare you
   the pain on discussing my political views here).&amp;nbsp; I think the main reason I had
   strong feelings on my approach was that the other camp wasn't using C/C++ in their
   day to day work and kept bringing up examples and what *experts* said about the topic
   and under no circumstance should we have a block of code not enclosed in curly brackets.&lt;span&gt;&amp;nbsp; &lt;/span&gt;My
   camp lived in a C/C++ editor for most of our work.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;Do I agree
   with the statement that Quality doesn't matter?&amp;nbsp; No.&amp;nbsp; Do I agree with the
   statement that Quality is the most important thing?&amp;nbsp; No.&amp;nbsp; For any system
   there is really only one true measurement of success: 
   &lt;br&gt;
   &lt;br&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;blockquote&gt;&lt;font size=5&gt;&lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;&lt;i&gt;In
the &lt;b&gt;long term&lt;/b&gt; is your user community satisfied and will they continue to use
your software to enhance their business or personal lives&lt;/i&gt;.&amp;nbsp; &lt;/span&gt;&lt;/font&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;&lt;/span&gt;&lt;/blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   Anything else is pure rubbish.&amp;nbsp; You may have a very high quality system that
   is just a joy to maintain, but unless people use your software, you probably won't
   (and shouldn't) get past V1.0.&amp;nbsp; You also could have a system that you deploy
   within a month or two that people just love, but it has tons of bugs in the core architecture
   and can't be maintained, you probably won't get beyond V1.0 either.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   Quality is an important attribute of your system, however &lt;b&gt;quality is not free&lt;/b&gt;.&amp;nbsp;
   Building a quality systems is not ensured by a set of tools, techniques or processes.&amp;nbsp;
   Quality is a result of an &lt;b&gt;individual's commitment&lt;/b&gt; and a &lt;b&gt;culture within your
   organization&lt;/b&gt;. &amp;nbsp; 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;There is a
   danger on both ends of the spectrum.&amp;nbsp; On one end of the spectrum there is "we
   don't need these new fangled tools and techniques, our Cobol and Assembly Language
   application runs just fine", yeah right, there's a real competitive edge.&lt;span&gt;&amp;nbsp; &lt;/span&gt;I'm &lt;i&gt;probably &lt;/i&gt;not
   going to buy or use your software, and if I do, I'm probably not going to apply any
   updates unless absolutely necessary.&amp;nbsp; On the other end of the spectrum, we try
   to rigorously follow the latest fads something like not writing a single line of code
   without a test, attempting to achieve 100% code coverage, or program exclusively against
   interfaces.&amp;nbsp; While this does sound good in reality are you putting too much &lt;a href="http://www.efficientcoder.net/PermaLink,guid,21e6516c-079f-457d-a959-c1b2fa5cc832.aspx"&gt;&lt;span style="COLOR: blue"&gt;trust
   in your metrics&lt;/span&gt;&lt;/a&gt;?&amp;nbsp; Code coverage of 100% (or even 90%) means your code
   was run, that's it.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;I may be different, but
   I know most of my bugs are edge conditions I don't account for even if I do have a
   test suite covering that chunk of code.&amp;nbsp; The code coverage metric does little
   to protect me against these problems.&lt;span&gt;&amp;nbsp; &lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   What is the middle ground here?&amp;nbsp; It's actually pretty simple, &lt;b&gt;think for yourself&lt;/b&gt;,
   make sure you &lt;b&gt;write lots code&lt;/b&gt; that &lt;b&gt;makes it into production, &lt;/b&gt;it doesn't
   do much good to get your code to a certain point and gloss over all the little details&lt;b&gt;.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;Also &lt;b&gt;read
   as much as possible&lt;/b&gt;.&amp;nbsp; 
   &lt;br&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;br&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
&lt;link href="file:///C:%5CUsers%5Ckevinw%5CAppData%5CLocal%5CTemp%5C1%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel=File-List&gt;
&lt;link href="file:///C:%5CUsers%5Ckevinw%5CAppData%5CLocal%5CTemp%5C1%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel=themeData&gt;
&lt;link href="file:///C:%5CUsers%5Ckevinw%5CAppData%5CLocal%5CTemp%5C1%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel=colorSchemeMapping&gt;
&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073750139 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;
	text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-noshow:yes;
	mso-style-priority:99;
	color:purple;
	mso-themecolor:followedhyperlink;
	text-decoration:underline;
	text-underline:single;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;
	line-height:115%;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;
&lt;/style&gt;
&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;Although I
   think the &lt;a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"&gt;SOLID
   Principles&lt;/a&gt; offer a number of good concepts, &lt;span&gt;&amp;nbsp;&lt;/span&gt;I personally don't
   agree with all those concepts.&amp;nbsp; You may agree with all those concepts.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;i&gt;That's
   OK&lt;/i&gt;.&lt;span&gt;&amp;nbsp; &lt;/span&gt;One area I disagree with is the Single Responsibility Principle
   or &lt;a href="http://www.objectmentor.com/resources/articles/srp.pdf"&gt;SRP&lt;/a&gt;.&lt;span&gt;&amp;nbsp; &lt;/span&gt;I've
   seen implementations of this in code a code base I needed to extend, and it's just
   not my cup-of-tea, too much noise, classes are not free.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The developer
   swore by this technique.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;i&gt;That's OK.&lt;/i&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;I wish I could
   find the transcript, but let me paraphrase a discussion of SRP from Uncle Bob's &lt;a href="http://www.hanselminutes.com/default.aspx?showID=163"&gt;Hanselminutes&lt;/a&gt; interview
   (right around&amp;nbsp;3 inutes into the podcast)&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;Uncle Bob:
   This is somewhat out of the norm for object oriented design.&amp;nbsp; Early Object Oriented
   Design Principals had us grouping together functions of that operated on the same
   data structures so that the methods of the class manipulate the same variables.&amp;nbsp; 
   &lt;br&gt;
   &lt;br&gt;
   Scott: That definitely flips things on its head&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;
      &lt;br&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;&lt;font size=3&gt;E&lt;font size=4&gt;arly
   on I learned one of the core principals of Object Oriented Analysis and Design is
   it's all about the &lt;a href="http://www.amazon.com/Object-Oriented-Systems-Analysis-Computing/dp/013629023X"&gt;data&lt;/a&gt; and
   methods acting upon that data via &lt;a href="http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29"&gt;encapsulation&lt;/a&gt;.&amp;nbsp;
   Over time your business rules will probably change, however the structure of your
   data will remain fairly static.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The way I design LOB type apps
   is ruthlessly focus on my physical data model.&lt;span&gt;&amp;nbsp; &lt;/span&gt;If you don't get
   that right, you will be fighting with an impedance mismatch all through your development
   cycle.&amp;nbsp; Although I could certainly see the value of a different approach, I keep
   my business objects 1:1 in sync with the database tables.&amp;nbsp; The primary reason
   for this is simplicity, once you break that relationship you introduce a mapping layer
   that is sometime necessary but comes at a cost of additional code.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The
   only code you know has zero bugs is code you don't write.&lt;/font&gt;&lt;/font&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;M&lt;font size=4&gt;aybe
   I'm "old-school" but my process has allowed me to pay the bills for the past 20 years
   now.&lt;span&gt;&amp;nbsp; &lt;/span&gt;In some cases the developers picking up my code said, this
   is so incredibly easy to maintain and the hand off went smoothly with very few support
   calls.&lt;span&gt;&amp;nbsp; &lt;/span&gt;In other cases, people just said it was a mess.&lt;span&gt;&amp;nbsp; &lt;/span&gt;It
   seemed like people that liked my code have been in the industry 10+ years and have
   handed over legacy code themselves.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The people that thought I was
   a &lt;i&gt;hack&lt;/i&gt; usually had less than 5 years and already knew everything there was
   about writing software.&lt;span&gt;&amp;nbsp; &lt;/span&gt;They were just waiting for their first
   chance to start from scratch, build a product and show us old-timers how it's done.&lt;span&gt;&amp;nbsp; &lt;/span&gt;I
   suspect, at one time I thought I knew everything about writing code.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Maybe
   this is a right-of-passage?&lt;/font&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;&lt;font size=4&gt;Using
   classes to group together functions just doesn't smell right to &lt;i&gt;me,&lt;/i&gt; it may
   to &lt;i&gt;you. That is ok&lt;/i&gt;.&lt;span&gt;&amp;nbsp; &lt;/span&gt;I have the right to express my opinion
   just as Joel and Uncle Bob did, neither of these two people are hacks and I don't
   think I am either.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;b&gt;&lt;i&gt;&lt;font size=4&gt;We as an industry
   need to do a better job of leaving out the religion and personal attacks, software
   is hard.&amp;nbsp; Period.&amp;nbsp; What works for one person on one project would cause
   a different person to fail&lt;/font&gt;.&lt;/i&gt;&lt;/b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;br&gt;
   &lt;font size=4&gt;Another thing to think about in adopting and evaluating new techniques
   and technologies is one of the concepts of the &lt;a href="http://en.wikipedia.org/wiki/Capability_Maturity_Model"&gt;Software
   Capability Maturity Model&lt;/a&gt; or CMM.&amp;nbsp; If you are a Level 1 organization, you
   cannot skip directly to a Level 3 or 4 organization.&amp;nbsp; You must go through Level
   2.&amp;nbsp; If you attempt to implement processes found at Level 3 or 4 you will fail.&amp;nbsp; 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;&lt;font size=4&gt;At
   any point in your career your toolbox contains a finite number of tools, over time
   you should be continually adding tools to your tool box or you won't advance in your
   career.&amp;nbsp; If you attempt to implement something like the SOLID principals before
   having in place effective requirements gathering, defect tracking, or a continuous
   integration process your time would be much better spent focusing on blocking and
   tackling exercises rather than more advanced techniques.&lt;span&gt;&amp;nbsp; &lt;/span&gt;It's surprising
   how many organizations I've worked with that try to adopt the latest advanced technique,
   but their bug tracking is emails, source control is sorely lacking and requirements
   gathering consists of meetings where the main goal is for people to hear themselves
   talk and sound important! I've seen many more projects fail because of the lack of
   effective leadership, poor requirements or project management than I have because
   the programmers used the wrong technique or pattern.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Before we
   put stealth on our airplane, let's make sure our airplanes fly&lt;/font&gt;.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;&lt;font size=4&gt;Over
   time there have a been considerable advances in our field of software engineering,
   some stick around some don't.&amp;nbsp; Are we still using those old Rational Rose Puffy
   Clouds.&amp;nbsp; I liked my Puffy Clouds!&amp;nbsp; I want my Puffy Clouds back!&amp;nbsp; None
   of these should be considered 100% bad and ignored, learn something from these, but
   don't just jump in and blindly implement without thinking.&amp;nbsp; Put what works for
   you in your tool box, have a full tool box and select the &lt;b&gt;exact right tool&lt;/b&gt; to
   solve your problem and more importantly, &lt;b&gt;know why you picked that tool&lt;/b&gt;.&lt;/font&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;&lt;font size=4&gt;I'm
   looking forward to the "smack-down" between Joel and Uncle Bob in an upcoming Stack
   Overflow episode!&lt;span&gt;&amp;nbsp; &lt;/span&gt;Would be very interesting to see them on &lt;a href="http://www.ufc.com/"&gt;UFC&lt;/a&gt; as
   well.&lt;span&gt;&amp;nbsp; &lt;/span&gt;In the mean time, I'm going to keep writing software, reading
   blogs and keep adding more tools to my tool box. &lt;/font&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal"&gt;
   &lt;font face="Times New Roman" size=4&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;font size=4&gt;&lt;span style="FONT-SIZE: 12pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Times New Roman','serif'"&gt;&lt;font face="Times New Roman"&gt;-ec&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=feed9006-dca9-4fb2-b282-779c38339dc3" /&gt;</content>
  </entry>
  <entry>
    <title>It's a Great Time to be a Developer</title>
    <link rel="alternate" type="text/html" href="http://www.efficientcoder.net/PermaLink,guid,0928cae8-2bb3-410a-9fcb-e798a7a12bd1.aspx" />
    <id>http://www.efficientcoder.net/PermaLink,guid,0928cae8-2bb3-410a-9fcb-e798a7a12bd1.aspx</id>
    <published>2009-02-06T10:39:35.631-05:00</published>
    <updated>2009-02-06T10:40:53.8968773-05:00</updated>
    <category term="Business of Software" label="Business of Software" scheme="dasBlog" />
    <category term="Project Delivery" label="Project Delivery" scheme="dasBlog" />
    <category term="Software Engineering" label="Software Engineering" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <font size="3">With all the grim economic
   news, there has never been a better time to be a developer (well maybe during the
   internet bubble, but that wasn't sustainable).  As an independent consultant,
   I'm always just a little worried about what the next six months will bring. 
   I've been doing this for about 8 years now and so far there has been no shortage of
   work, but you never know what the future will hold.  I think 2009 may provide
   a different way of thinking about how I perform my craft to pay the bills, let me
   explain.  When doing client work there is really no long term guarantee. 
   It's a process of identifying a need for their organization, doing an excellent job
   filling that need, get a check, rinse and repeat.  You are really establishing
   a "dependency" on your client, their needs and cash flow have a big influence on your
   future.  As a developer we know that in most cases dependencies are not a good
   thing.<br /><br />
   That's where I think there are some great opportunities these days for us developers
   to break these dependencies and really take control of our future.  As much as
   I enjoying developing systems to make my clients succeed, I would rather develop systems
   to make <b>myself</b> succeed!  How is this possible?  
   <br />
   Well I'm pursuing two opportunities right now that you can too!  The costs and
   barriers for entry are negligible.<br /><br /></font>
        <p>
        </p>
        <img src="http://www.efficientcoder.net/content/binary/XNA_Banner_Club_final.jpg" border="0" />
        <br />
        <br />
        <font size="3">The first one is really sort of fun, I'm building a game for <a href="http://creators.xna.com/en-US/">XBox
   Community Games</a>.  The idea is I build software, publish it, and it becomes
   available to millions of XBox users to download and play for a very small fee where
   a large portion of that goes into my account.  This means if I can make the game
   interesting enough to tap into an extremely small percentage of the millions of users,
   the income may not be all that trivial.  I'm not buying that 54 foot yacht yet,
   but who knows.  The point here is that I have a high level of control over the
   success and outcome of this effort, the advertising and sales are taken care of via
   the Community Games site.  I can focus on cuttin' code and not have to build
   a business with dozens of employees and all the headaches that come with that.<br /></font>
        <br />
        <img src="http://www.efficientcoder.net/content/binary/servicesPlatform.jpg" border="0" />
        <br />
        <br />
        <font size="3">I think the next opportunity is even more exciting and beginning the
   second half of this year will merit a considerable investment in my time.  I'm
   already getting my feet wet with this technology and I'm excited for the RTM date. 
   This approach and techonology changes things, period.  Over the past eight years,
   I've been working on a product I call The Chaos Filter.  I've spun off a few
   little products that generate some revenue, but really haven't cranked up the marketing
   engine yet.  My thought is once I do this, my primary role will shift from building
   and extending the product to building and extending the business to support that product. 
   The challenge has always been, how can I focus on what I enjoy and outsource 95% of
   everything else yet remain in enough control to be successful.  My product is
   really a set of highly configurable services that work together well.  My goal
   is to allow subject matter experts; non programmers but technical folks; to very quickly
   customize and assemble those services into things I'm calling MicroApps.  These
   will be built for highly specialized niche markets.  My thought is not to sell
   these for hundreds or thousands of dollars, but a monthly subscription fee that will
   usually be less than $20.  Basically a high value, low cost solution that will
   be very easy for people to sign up for and keep coming back.  To make any money
   at this effort, I'm going to need a ton of people signing up.  </font>
        <font size="3">That's
   where I see the <a href="http://www.microsoft.com/azure/whatisazure.mspx">Azure Services
   Platform</a> come in.  Without building a large company, I can partner with subject
   matter experts to build these MicroApps.  Then make these products available
   to the Windows Live user base.  This also offers a highly scalable platform that
   as my product grows and I need more capacity, I'll just need to adjust the number
   of server instances in a configuration file and wha-la I'm more scalable.  Again,
   as with the XBox game, I can focus on my core competency, cuttin' code.<br /><br /><br /></font>
        <img src="http://www.efficientcoder.net/content/binary/image20080609.png" border="0" />
        <br />
        <font size="3">Another awesome opportunity would be to start writing applications
   for the iPhone and iPod Touch.  Although being a .NET developer, I'll probably
   focus on the two opportunities I've outlined above, however this once can't be ignored. 
   Apple did a great job of making it super simple for people to trade you their money
   for your apps.  I purchased a MacBook and have started to learn Objective C. 
   Even though this seems very appealing, I just don't see spending my valuable time
   on this anytime soon.  I guess the XBox and Azure Live Services just turn out
   to be a fad *cough* there are other opportunities out there.<br /><br />
   I'm spending about two thirds of my time doing client work and the other third trying
   to figure out what type of killer app I'm going to develop that will allow me to spend
   all my time programming for fun, not necessarily to pay the bills.  This approach
   isn't for everyone, if you enjoy the security of working for a company and thrill
   of being part of a high performance team you may have found your niche, if not, maybe
   it's time to start looking at what you can do on your own.<br /><br />
   -ec<br /></font>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=0928cae8-2bb3-410a-9fcb-e798a7a12bd1" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Upgrading my Laptop to Windows Standard 2008 64Bit</title>
    <link rel="alternate" type="text/html" href="http://www.efficientcoder.net/PermaLink,guid,a7530e89-42b9-4872-a91d-329f70b54db8.aspx" />
    <id>http://www.efficientcoder.net/PermaLink,guid,a7530e89-42b9-4872-a91d-329f70b54db8.aspx</id>
    <published>2009-02-04T09:32:57.077-05:00</published>
    <updated>2009-02-04T22:22:58.59325-05:00</updated>
    <category term="Hardware" label="Hardware" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="3">Yesterday I had a dog-and-pony show to discuss a product I've been
      contracted to build for a client of mine.  The demo was in three parts, a technical
      design review by their lead developer, then a status review with their CTO and finally
      a recap with the CEO.  The first two parts went just fine, then when the CEO
      came into the room my Gateway Vista 64 bit laptop froze up.  My mouse would move,
      but wouldn't respond to any clicks or keyboard input.  To be fair, I had a VM
      running and I think this may contributed to the failure.  Since this product
      needed to run on all sorts of OS's &amp; devices, I had my MacBook, iPod Touch and
      Google phone so I was able to give a few quick demos, just nothing on the projector...I
      hate it when those types of things happen.</font>
        </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/GateWayLaptop.jpg" border="0" />
        </p>
        <p>
          <font size="3">Overall my experience with Vista hasn't been that bad, but also can't
      say it was all that great, this was the final straw.  I upgraded my main
      custom built Quad Core machine last December to Windows Server 2008 64 Bit Standard
      Edition and that machine has just been rock solid.  I decided until Windows 7
      goes RTM, I'm done with Vista and will be putting Server 2008 on all my dev boxes. 
      In a small way I miss the nice Aero Glass interface in Vista and I know I can configure
      it by turning on "Desktop Experience" in the Add Features configuration section, however
      right now my system is running so good, I just don't want to make any changes.</font>
        </p>
        <p>
          <font size="3">On my way home from the client meeting yesterday afternoon, I stopped
      off at Best Buy and picked up a 2.5" 7200 RPM drive for my laptop and have decided
      to upgrade.  I picked up the drive for about $109 plus tax.  With the price
      of hard drives these days, going forward when I need to repave or upgrade a machine,
      my plan is going to be to just go ahead and pickup a new hard drive then keep the
      old one around for a bit.  For this upgrade, my computer has two drive bays,
      so now my laptop will have 640GB of storage (well less than that since a 320GB drive
      really isn't a 320GB drive, but that's off topic).  That should be plenty of
      room for a bunch of VM's so I don't have to bring my external HD with me when I travel. 
      One of the many nice things about this laptop is that that it has a eSATA port that
      makes copying the 20-30GB VMs quick work.  Once I get my laptop upgraded, I'll
      report back.  If the drivers just aren't there, I'll just use the second SATA
      drive as extra storage and put my original one back in and be ready for business! 
      The moral of the story is with drive prices these days it's just as easy and considering
      time involved just as a cheap to pickup a second drive and keep the old one around.</font>
        </p>
        <p>
          <font size="3">-ec</font>
        </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=a7530e89-42b9-4872-a91d-329f70b54db8" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Ramblings from a Software Developer Half Way through their Career</title>
    <link rel="alternate" type="text/html" href="http://www.efficientcoder.net/PermaLink,guid,37e0fc35-9aa9-4e10-80f7-a1d348440121.aspx" />
    <id>http://www.efficientcoder.net/PermaLink,guid,37e0fc35-9aa9-4e10-80f7-a1d348440121.aspx</id>
    <published>2009-02-01T17:30:45.608875-05:00</published>
    <updated>2009-02-01T17:30:45.608875-05:00</updated>
    <category term="Software Engineering" label="Software Engineering" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="3">As I reach the 1/2 point in my career developing software, I started
      thinking about where we are at in the industry of Software Development and how much
      progress (or lack thereof) as well as some observations and things I’ve learned. 
      If you would have asked me 10 years ago if I would be at the half way point in 2009,
      I would say, heck no, I’ll be retired and doing this for fun…so much for the internet
      bubble and stock options.</font>
        </p>
        <p>
          <font size="3">
          </font>
        </p>
        <p>
          <a href="file:///C:/Users/kevinw/AppData/Local/Temp/1/WindowsLiveWriter1286139640/supfiles50C34A0/Career[3].png">
          </a>
          <img src="http://www.efficientcoder.net/content/binary/Career.png" border="0" />
        </p>
        <p>
          <a href="file:///C:/Users/kevinw/AppData/Local/Temp/1/WindowsLiveWriter1286139640/supfiles50C34A0/Career[3].png">
          </a> <font size="3">The
      following are some observations and thoughts on some things I've learned at
      the different positions and work I’ve done with the last 19 years.  If
      you make it to the end of my "ramblings" drop me a note and let me know what you think.</font></p>
        <p>
          <font size="3">
          </font>
        </p>
        <p>
        </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/dill6.gif" border="0" />
        </p>
        <p>
          <font size="3">After graduating from <a href="http://www.mnsu.edu/"><font color="#003399">Minnesota
      State University</font></a> in 1990 with a degree in Computer Science and Electrical
      Engineering Technology, my first job was as a Software Engineer responsible for designing
      and programming embedded systems for weight and force measurement devices.  We
      had about 5-6 Software Engineers on staff, each week we had meetings to discuss ways
      we could improve the process of developing software.  This was a long and painful
      process where our primary objective was to build consensus on development standards. 
      We started with coding conventions for FORTH, C &amp; C++.  What made this extremely
      painful is that as we all had opinions (although only a couple of us actually programmed
      in C/C++ at the time) and at one point we spent weeks discussing putting curly
      brackets around single lines after an if statement.  Anyway, my point is that
      although it was important to build consensus this approach wasted way too much time,
      and although I think we did make some modest gains, these meetings were probably better
      held in an academic setting.  I had an excellent mentor and the company probably
      still doesn’t want to know the number of hours the two of us spent shooting the sh*t
      discussing software engineering and software architectures instead of programming
      devices.  Luckily the two of use seemed to be the only ones to ship on time so
      I guess they didn’t mind too much.  I considered those years as almost a “Masters”
      level education.  Some of the observations/lessons from this position:</font>
        </p>
        <ul>
          <li>
            <font size="3">Designing the hardware, writing the low-level drivers and then the
         software that made the microcontroller do something meaningful is truly an enlightening
         experience.  It still influences how I program in high level languages such as
         C# today.</font>
          </li>
          <li>
            <font size="3">Another invaluable lesson learned at this job was the difference between
         sales and marketing.  And the good, the bad and the ugly of working with other
         areas within a company.</font>
          </li>
          <li>
            <font size="3">Get your developers in front of the customer and in the real world
         as much as reasonably possible.  It puts a different perspective on things when
         you see your software run a huge rock smasher or rail-road train scale instead of
         turning on $0.05 LEDs in the right sequence that simulates the actual hardware. 
         This is also true if your developers experience is limited to only seeing a 1 with
         a bunch of zero’s that represents a decimal data type on a sales order instead
         of a real order for a gazillion dollars that represents real money.  It's an
         eye opener to see how <b>real</b> users actually use your software.</font>
          </li>
          <li>
            <font size="3">Keep your developers coding, and then have them code some more and
         when they are done doing that, have them code a little more.  As with any craft
         you get better with experience.</font>
          </li>
          <li>
            <font size="3">If you don't know where you are going a map is no help, developers
         shouldn't be the ones making up the requirements, if they are get them in front of
         the customer as much as possible (note the conflict with the previous item)</font>
          </li>
          <li>
            <font size="3">Software estimating even on small projects is very difficult. 
         Estimates from developers should be doubled.</font>
          </li>
          <li>
            <font size="3">When marketing drives certification efforts such as ISO9000, the results
         are very shallow.</font>
          </li>
        </ul>
        <p>
          <font size="3">
            <a href="file:///C:/Users/kevinw/AppData/Local/Temp/1/WindowsLiveWriter1286139640/supfiles50C34A0/CRM[3].png">
            </a>
          </font>
        </p>
        <p>
          <font size="3">
          </font>
        </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/CRM.png" border="0" />
        </p>
        <p>
          <font size="3">Next I went to work for a Sales Force Automation company, starting
      out as a software engineer and ending up with the title of “Director of Tools and
      Technology”.  I had two primary roles as a director, first was to dispatch fire
      fighting teams get projects out of the ditch and the second was to put in a set of
      processes and tools to help keep those projects out of the ditch in the first place. 
      I had the luxury of hiring my own senior staff.  I’m a firm believer that
      right people are single most influential factor in the success for failure of a software
      project.  I actually found that people with engineering degrees in some respect
      were better suited for this type of work than ones with a pure comp-sci degree. 
      In my previous job I was introduced to the classic <a href="http://www.sei.cmu.edu/publications/books/process/managing-sw-process.html"><font color="#003399">Managing
      the Software Process</font></a> by </font>
          <a href="http://en.wikipedia.org/wiki/Watts_Humphrey">
            <font color="#003399" size="3">Watts
      Humphrey</font>
          </a>
          <font size="3"> this is a classic must read book.  A
      number of concepts seemed to make considerable sense when working with large projects
      with a duration of 1+ years and teams of 6-12 developers.  Much more so than
      the single person 3-4 month projects at my previous position.  One of the lessons
      learned here is that different types of software require different set of processes
      and talent.  Some other observations from this position:</font>
        </p>
        <ul>
          <li>
            <font size="3">Developing large systems is just plain hard, there is <a href="http://en.wikipedia.org/wiki/No_Silver_Bullet"><font color="#003399">no
         silver bullet</font></a>, but with the right <a href="http://en.wikipedia.org/wiki/Peopleware"><font color="#003399">people</font></a> it
         is possible and can even be fun.</font>
          </li>
          <li>
            <font size="3">Team building is important to the success of your project.  Finding
         the right chemistry is worth the effort, bad apples or “negative producers” must be
         swiftly removed from the team.</font>
          </li>
          <li>
            <font size="3">It’s really all about data, for the type of systems we were building
         (and even the ones I build today) getting the data model right will make or break
         your project.</font>
          </li>
          <li>
            <font size="3">While the business analysts are figuring out what to build, it's a
         good time to have your senior and lead developers plan out your architecture and figure
         out what common functionality needs to be organized into the application frameworks.</font>
          </li>
          <li>
            <font size="3">It's worth the investment to build scaffolding to test your application. 
         At the time we weren’t doing any formal unit testing, but had all sorts of little
         tools and utilities to help make our life easier.  Really a necessity when the
         MFC compiler took 45 minutes to do a full build.</font>
          </li>
          <li>
            <font size="3">I was formally introduced to “<a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)"><font color="#003399">Design
         Patterns</font></a>” and the <a href="http://en.wikipedia.org/wiki/Design_Patterns"><font color="#003399">GoF</font></a>. 
         Coming from an engineering background, I had always thought Software Development needed
         to mature and “Design Patterns” were going to be our building blocks.</font>
          </li>
          <li>
            <font size="3">Platform Independence sounds good when on the marketing cut-sheet’s
         but in reality…well…you know the story here.</font>
          </li>
          <li>
            <font size="3">Senior, top level management buy-in and participation is absolutely
         critical to the success of any software process improvement effort.  The primary
         reason for this is there are more departments in your organization other than development
         and everyone needs to play together nicely to ensure successful projects.</font>
          </li>
          <li>
            <font size="3">When spec’ing and selling multi-million dollar projects, make sure
         you have representatives from the dev staff involved with pre-sales.  Without
         that I’ve found there is usually an expectation mismatch, this is true in smaller
         projects but critical in larger ones.</font>
          </li>
          <li>
            <font size="3">Our company was organized into Product and Professional Services divisions,
         using real world requirements from Professional Services goes a long way to help
         product development planning.</font>
          </li>
          <li>
            <font size="3">There should be an inverse proportion of the amount of code you write
         with respect to your level within the management food chain.  When I started
         as a software engineer, I spent 90% of my time coding.  As a director, I spent
         about 5% coding if I was lucky.  The challenge here is to keep your skill
         sharp, you need to code, period.  To be a good manager you need to manage period,
         if you are coding you are doing your employees a disservice.</font>
          </li>
          <li>
            <font size="3">In our industry, a manager works for their employees.  That is
         to say a managers first and foremost responsibility is to equip her coders with everything
         they need to succeed and aggressively remove road blocks.</font>
          </li>
          <li>
            <font size="3">Although difficult, setting and managing expectations is critical to
         the success of delivering software.</font>
          </li>
          <li>
            <font size="3">Although I’m sure the agile folk’s won’t agree, I’ve found the longer
         I can stay out of the “problem domain” and keep working on my application frameworks
         (factoring out common/abstract functionality) the sooner I’ll ship my software. 
         This deserves another post to explain in more detail.</font>
          </li>
          <li>
            <font size="3">Technical solutions generally don’t work to fix process problems </font>
          </li>
          <li>
            <font size="3">Towards the end of my time there I had a keen understanding of why
         executives “don’t like surprises”.</font>
          </li>
          <li>
            <font size="3">If you get a stock option grant (especially one big enough to retire
         with) it's a good idea to get a lawyer involved early on so you don't end up with
         Toilet Paper.</font>
          </li>
          <li>
            <font size="3">It’s all really about People, Process and Technology</font>
          </li>
        </ul>
        <p>
          <font size="3">
          </font> 
   </p>
        <p>
          <font color="#800000" size="6">
            <strong>
              <em>PPT Solutions, LLC</em>
            </strong>
          </font>
        </p>
        <p>
        </p>
        <p>
          <font size="3">Three of us left the Sales Force Automation company and started our
      own venture it was called PPT Solutions (People Process &amp; Technology, in that
      order as we liked to say).  We put together our business plans, cash flow projections
      and since this was in the internet bubble we were convinced there is no way we could
      fail.  Although I wouldn’t consider this business a success, we did manage to
      ship a product, and I did learn a lot about going into business for yourself.</font>
        </p>
        <ul>
          <li>
            <font size="3">We were told going into a business partnership with friends was a bad
         idea, we thought we were different.  We weren’t.  The reality is that someone
         needs to be in charge and equity needs to be based upon contribution to the company. 
         Friendships complicate this, especially in our industry where we think we are all
         “rock-stars”.  Eight years later the wounds from this are finally healed.</font>
          </li>
          <li>
            <font size="3">Sales is critical, sales is not easy, sales requires a different skill
         set than developers, we sold our product into Imation (3M Spin off and electronic
         media company) I think we landed the sale because I was sleeping with the global sales
         training manager (who I've been married to for the last nine years and still madly
         in love with).</font>
          </li>
          <li>
            <font size="3">Although it sounds good to get a sale and then use that money to develop
         a product and then market it that way, in reality the product will contain all sorts
         of very specialized features for the company paying for the majority of the effort. 
         Care should be taken so that specialized requirements don't contaminate the core product.</font>
          </li>
          <li>
            <font size="3">Make your estimate than double it, both time and dollars</font>
          </li>
          <li>
            <font size="3">It’s a double edged sword working out of your house.  It's nice,
         but it requires discipline to stay focused.  Having weekly goals is a good idea. 
         You will probably also be working on weekends to a certain extent.  Do whatever
         possible to separate your work week from your weekend, this helps burn-out.</font>
          </li>
          <li>
            <font size="3">If you partner with other people to start a business, clearly define
         expectations and responsibility up front.</font>
          </li>
        </ul>
        <p>
          <font size="3">
          </font> 
   </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/People.gif" border="0" />
        </p>
        <p>
          <font size="3">Next up was a small startup, let's just say I don't have a lot of good
      memories from that place.  This wasn't really a technology learning experience,
      however I did learn how to successfully get what I needed in a difficult environment
      to ship software.  The company came in at the tail end of the internet bubble
      and had visions of making a pile of cash with very little effort and a lot of 0's
      and 1's in the right order.  Enough said…moving On….</font>
        </p>
        <p>
          <font size="3">
          </font>  <img style="WIDTH: 175px; HEIGHT: 55px" height="55" src="http://www.efficientcoder.net/content/binary/Software%20Logistics.png" width="145" border="0" /></p>
        <p>
          <font size="3">That takes me up to what I'm doing today, Software Logistics, LLC. 
      My company.  I don't have any employees, but use contractors as necessary. 
      I seemed to have found a nice niche.  I spend about 90% of my week coding. 
      Although I do miss the thrill of leading a team into battle, I guess the pure joy
      of carving out excellent software makes up for it.  I've worked with very small
      companies and very large companies during the past eight years.  Each has their
      strengths and weaknesses and enjoy working with both.  This has been a great
      learning experience and I’ve shipped a number of projects in the process.</font>
        </p>
        <ul>
          <li>
            <font size="3">To get started, networking and word of mouth is very important. 
         Even more so is networking with the <b>right</b> people.  There is time for friends
         and time for business.  As with my previous venture, these don't often mix very
         well.  That doesn't mean you can't have fun with the people you work with, however
         since this is going to be your primary source of income it's important to stay objective.</font>
          </li>
          <li>
            <font size="3">Even though you are out on your own, that doesn't give you an excuse
         to cut corners or skip basic SCM principles such as source control, issue tracking, build
         environments etc…  What's nice about being on your own is you don't have to reach
         consensus and you can experiment with different processes and technologies. 
         Although still in evolution, my CI and deployment environment rivals if not exceeds
         most of companies I work with.</font>
          </li>
          <li>
            <font size="3">Invest in yourself.  I attend at a minimum two conferences a year. 
         Even those these are on my own nickel this is a must.  Going to conferences allows
         you the time to focus on what's new and get a quick overview of a wide variety of
         technologies.  Don't expect to become a master at any of these, but you should
         get an idea of what's real and what's worth investing more time in.  Even more
         important is getting a sense of that latest flavor of the month so you don't waste
         your time or sabotage your project.</font>
          </li>
          <li>
            <font size="3">If done right, it's generally important to come off strong in the first
         15% of the project and finish strong in the last 25%.  This doesn't mean you
         go "dark" but during the development phase it's a balance between keeping your
         client comfortable with the progress and staying out of the details enough to
         keep on your schedule.</font>
          </li>
          <li>
            <font size="3">Communications is critical, if I had to say there is one common denominator
         across all the clients I've worked with is that they all need to improve their communications. 
         There needs to be a balance between using tools such as a defect tracking and verbal
         communications.  SCM work tracking tools are good for capturing and managing
         a large amount of details, however even with a "priority" ranking, they just don't
         convey the sense of urgency and importance that verbal communications can provide.</font>
          </li>
          <li>
            <font size="3">When in a meeting (even in sunny Tampa) no-one likes to see your arms,
         wear a nice button down dress shirt and khaki's.  Remember you are a professional,
         impressions matter, especially when negotiating the yearly rate increase.  I
         don't think it's important to drive a BMW, but you should project a feeling of success.</font>
          </li>
          <li>
            <font size="3">You can't generally rely on the QA of your clients.  If you can't
         do it yourself (which is very difficult if not impossible) hire someone and get a
         good issue tracking system.  I really like Visual Studio Team System, if you
         have a premium subscription, you should be able to leverage the workgroup license.</font>
          </li>
          <li>
            <font size="3">Hold frequent status meetings, you should run these meetings, always
         have an agenda.  Set the expectations as to what you will cover in your agenda
         and ask for feedback if they have any concerns.</font>
          </li>
          <li>
            <font size="3">Respect your clients time, most people have more work than time. 
         At the start of the meeting ask for how much time you have and adjust your schedule
         accordingly.</font>
          </li>
          <li>
            <font size="3">You are viewed to be the expert, and to be successful, you should be
         a jack of all trades and a masters of a lot of them.  However it’s impossible
         to know everything.  If you don't know something don't BS your client. 
         Most of the time the people you are working with can tell, you need to keep your credibility
         and trust.  If you don't know something, find out and make sure you follow up
         promptly.</font>
          </li>
          <li>
            <font size="3">Your demos will almost never go as planned.  I remember one demo
         that I practiced a number of times and it worked flawlessly, I got to the client
         site and they had custom DNS settings on their internal network.  It broke my
         demo.  Think quick, think on your feet, and adapt, in my case a simple tweak
         of the HOSTS file was all that was necessary.</font>
          </li>
          <li>
            <font size="3">At all costs do not get involved in company politics.  All companies
         have them.</font>
          </li>
          <li>
            <font size="3">Don't expect the same level of support/services from other people at
         your client as you did when you worked as an employee within a company.  People
         are generally overworked and requests from the consultant come after requests from
         their internal managers.</font>
          </li>
          <li>
            <font size="3">If you are billing hourly, make sure you have a good system for capturing
         and tracking your time, even if your client doesn't ask for it.  Never over bill
         your client, if your client isn't paying you enough to live on, ask for more money
         find an additional or a different client.  Remember it's your name on the line.</font>
          </li>
          <li>
            <font size="3">If a client pays you to build software, they own the source code (unless
         you work out a different arrangement).  Don't use that source code in a different
         project or for a different client without their written approval.  That isn't
         however saying that you can't re-implement the same algorithm, they own the source,
         not the concept with certain obvious exceptions such as industry or trade secrets.</font>
          </li>
          <li>
            <font size="3">I've found that there is no right answer to the right amount of documentation
         you should provide.  I had one client that complained about the level of documentation
         I produced.  When it came down to detail and specific documents with senior management,
         I could always produce the documents in their repository and the response was "I didn't
         know we had that".  I don't think the documents were even looked at.  I
         guess my point is for a developer, documentation is no fun.  If no
         one is going to read it it's your call on how much to deliver.  It's good for
         CYA.  Another client I have uses a WIKI for documentation, nice and simple, yet
         effective.  If your client doesn't have one, set one up for them on your server. 
         If it gets traction install on their server.</font>
          </li>
          <li>
            <font size="3">Don't skimp on your computer setup and hardware.  Time is money,
         would you rather spend your time installing and configure software, or would you rather
         cut code and get paid.</font>
          </li>
          <li>
            <font size="3">I've found that using a tool like VMware Workstation works great for
         doing client work.  I have a base setup that has all generic development tools. 
         I can than copy that base VM and configure it with the specific tools and source to
         work on client projects.  An added benefit here is that at the end of the project,
         you can always just give them the VM and they can pick up where you left off. 
         My main dev boxes generally are multi-core and very fast, when I'm working in a VM,
         I just can't tell a difference.</font>
          </li>
          <li>
            <font size="3">If the environment is right, offer more than you ask for, I really
         enjoy mentoring young developers, and showing them new tools, technologies and
         techniques, be careful here though not to step on other internal developers toes.</font>
          </li>
        </ul>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/Thoughts.png" border="0" />
        </p>
        <p>
          <font size="3">If I haven't bored you too much and you made it this far (I'm a coder
      not a writer), I can offer some general thoughts of where we are as an industry:</font>
        </p>
        <ul>
          <li>
            <font size="3">Every project is different, yet there are many similarities amongst
         different projects.  If anyone says they have the one true way to develop software,
         you can tell them, ok, whatever, let me buy you beer and let’s poke holes in the process
         for what I’m working on.  There are also differences in techniques
         required when working on the same project.  An example is a non-trivial
         LOB application, there is the application frameworks, data layer, business
         objects, UI library, each of these is different and requires a different approach
         and the investment in time and design.  My point here is that there seems to
         be a lot of great work done developing tools, technologies and processes, we just
         need to start doing a better job of discussing where they should be used.  And
         general sweeping statements such as any code with out tests is considered
         “legacy” (read crap) don’t do much for helping us bring the right tool to the right
         problem.</font>
          </li>
          <li>
            <font size="3">I'm not sure there are any metrics out there, but I would suspect the
         majority of developers out there work on what I would consider Line of Business (LOB)
         type of applications.  Generally the most difficult part of this development
         is the ability to track and manage changes to the business rules and requirements. 
         I've seem a few implementations, that probably were much more complicated than need
         be.  Sometimes it's fun to pick up the latest technology or pattern when all
         you really needs is some simple OO principles and a nice Forms over Data application. 
         Some of us need to build Jaguar's and some of us need to build F-150's.</font>
          </li>
          <li>
            <font size="3">I mentioned it above, but one of the core problems I see in our industry
         today is the lack of effective communications, this was true back in 1990 and is still
         true today.  This may not be true of all companies, but I would suspect it is
         for the majorities of the companies out there.  I think Software Development
         can be described as managing thousands of little details, understanding how they act
         together and how to effectively communicate those details with others.  We do
         this by a series of translations; users translate their needs to a user advocate,
         the user advocate translates those needs to a business analyst, the business analysts
         turns those into requirements and prioritizes, the developer picks up those requirements,
         the develop translates the requirements to a design, then the design into code and
         finally the compiler turns the code into something that can run on a computer. 
         Even if you effectively implement agile techniques (which I suspect most companies
         that say they are agile really aren't) this is just plain difficult.  Take into
         account Fredrick's Brooks law of <a href="http://en.wikipedia.org/wiki/Brooks'_law"><font color="#003399">adding
         man power to a late software project makes it later</font></a> and you get an idea
         of the scope of the challenge.  So, you say, what's the answer?  I'm not
         sure there really is one.  What I do know is some people are better at this than
         others, I think this is probably an important attribute that is overlooked when hiring. 
         Sure you may be a rock star coder, but if you don't code the right thing, oops…what's
         the point?</font>
          </li>
          <li>
            <font size="3">Everyone in our industry thinks they are a "Rock Star" in reality very
         few people are.  Another theory from the class Mythical Man Month is that there
         is an order of magnitude between an average developer and ones that are truly "Rock
         Stars".  I’ve found this to be the case.  On some big projects I’ve worked
         on I’ve found that 20% of the team completes about 80% of the work.  The trick
         that I've learned is accepting that I'm probably not one of the “Rock Stars” and as
         the Verizon quote goes try to "<i>Make Progress Every Day</i>" into becoming a better
         developer.  This includes reading all the classics, writing tons of code that
         gets into production.  Coding for fun generally glazes over the details, details
         are what makes software hard.  I've also found it to be beneficial to work with
         really smart people, they push you, you push them.</font>
          </li>
          <li>
            <font size="3">I still keep in contact with the ninja's that worked for me to setup
         what we had thought was a decent development organization.  Since then, we went
         down two different roads, they went to work at a huge enterprise, where the basic
         idea is to manage change and make sure the gazillion lines of code compile and bugs
         don't cost too many millions of dollars per year.  I'm cuttin' code pretty much
         every day.  I don't know which path is better, I'm not sure there is a better
         path, I know I love what I'm doing now.  When we get together a couple times
         a year, it sounds like progress is being made in managing change, however the systems
         are getting more and more complex.  The net result is that things are just as
         screwed up as ever and the same fires we put out back then are still flaring up however
         they are handled much better.  Kudos to them, I have a lot of respect for
         what they do.</font>
          </li>
          <li>
            <font size="3">It appears that more and more companies tend to rely on libraries
         and third party and open source technologies.  I think this is both good
         and bad, if you are working on a small 1-2 month project go ahead and use the 3rd
         party building blocks.  If you are working on a large system, it may be better
         to re-invent the wheel.  I think a good example of this is your Data Access Layer,
         if you are doing a small one off type of project absolutely use something like Linq
         2 SQL or NHibernate.  If you are working on a fairly large project with a number
         of developers, it may be worth it to carve out your own DAL.  This is a non-trivial
         process, but 6-8 months into the project, you should recoup the investment by having
         exactly the feature set you need and understanding the inner workings of the critical
         piece of technology.  Spend the time up front, think through your architecture
         and requirements.  Realize that those 1/2 hour demos you saw where someone created
         a CRM site with just 5 lines of code, probably leaves out a considerable number of
         details.  Sometimes just dropping in a library introduces problems as noted by
         Joel Spolsky's <a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"><font color="#003399">Law
         of leaky abstractions</font></a>.  </font>
          </li>
        </ul>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/Sunset.png" border="0" />
        </p>
        <p>
          <font size="3">Well I guess I should probably clo</font>
          <font size="3">se as I could
      ramble on for another few pages, I think in summary I would have to say that our industry
      is maturing with new processes, technologies and techniques but at the same time the
      systems are developing are getting much more complex so I would say our overall progress
      as an industry is probably flat.  At one time I had thought we would mature to
      a more engineering approach to delivering software but I think with the dynamic nature
      of the problem space and technologies, I'm not convinced that will happen anytime
      soon.  As to being at the 1/2 way point in my career, I’m still trying to build
      the “<a href="http://en.wikipedia.org/wiki/Killer_application"><font color="#003399">Killer
      App</font></a>” who knows….</font>
        </p>
        <p>
          <font size="3">-ec   </font>
        </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=37e0fc35-9aa9-4e10-80f7-a1d348440121" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Custom String to Resource Refactoring with DXCore</title>
    <link rel="alternate" type="text/html" href="http://www.efficientcoder.net/PermaLink,guid,559c2673-0a20-4525-b013-42173554b876.aspx" />
    <id>http://www.efficientcoder.net/PermaLink,guid,559c2673-0a20-4525-b013-42173554b876.aspx</id>
    <published>2008-11-26T15:36:25.327-05:00</published>
    <updated>2008-11-27T06:53:52.85553-05:00</updated>
    <category term="ASP.NET" label="ASP.NET" scheme="dasBlog" />
    <category term="DXCore" label="DXCore" scheme="dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="3">In my ChaosFilter project, I'm factoring all the text and strings into
      a resource class.  The intent is to allow for customization by the end user for
      different installations and possibly translation at some point.  My solution
      is to place all my text into a class with properties that figure out how to get the
      text based based upon a unique key and context (which company/application they are
      running in).  Currently these are stored in the database and then loaded into
      a cached dictionary object.  This appears to work very fast, however with my
      architecture and a bit of code gen this could easily be replaced by more traditional
      resources.  </font>
        </p>
        <p>
          <font size="3">In the past it's been a pain the a** since I needed to create the label,
      put the marker into my class file then insert the field into the database.  A
      better solution certainly exists.  My solution is to build a DXCore custom refactoring. 
      The idea would be if I'm in a C# class within a string literal or an ASP.NET
      page within some static HTML, I could hit the refacting key and and take that text
      and convert it into a message or a simple label.  The difference being a
      label is only a few words where the message could be sentance or two.  For larger
      blocks of text I have a different approach.</font>
        </p>
        <h4>My Solution
   </h4>
        <p>
          <font size="3">For a ASP.NET page:<br /></font>
          <img src="http://www.efficientcoder.com/content/binary/ASPNETRefactoring.gif" border="0" />
        </p>
        <p>
          <font size="3">For a C# code file (in a library assembly or code behind):</font>
          <br />
          <img src="http://www.efficientcoder.com/content/binary/CSRefactorings.gif" border="0" />
        </p>
        <p>
          <font size="3">Then to enter the text:</font>
          <br />
          <img src="http://www.efficientcoder.com/content/binary/FieldEditor.gif" border="0" />
        </p>
        <p>
       
   </p>
        <p>
          <font size="3">So how was this done?  Actually it was fairly trivial, I built
      part of it early this week in a couple hours, the rest this morning.  Probably
      &lt; 4 hours for the whole thing and I haven't built a plugin for a couple years.</font>
        </p>
        <p>
          <font size="3">
          </font> 
   </p>
        <h4>Getting Started
   </h4>
        <p>
          <font size="3">This link does a much better job than I could to show the basics of
      creating a DXCore plugin, but unless I missed it, it didn't cover too much about creating
      custom refactorings.</font>
        </p>
        <p>
          <a href="http://community.devexpress.com/forums/t/68994.aspx">http://community.devexpress.com/forums/t/68994.aspx</a>
        </p>
        <p>
          <font size="3">
          </font> 
   </p>
        <p>
          <font size="3">So assuming that you have the frameworks setup for your plugin (I'm
      going to skip a few steps not relevant and found elsewhere), here's what you need
      to do:</font>
        </p>
        <p>
          <font size="3">1) Create a new DXCore Plug for your refactoring:</font>
        </p>
        <p>
          <font size="3">
            <img src="http://www.efficientcoder.com/content/binary/CreatePlugin.gif" border="0" />
          </font>
        </p>
        <p>
          <font size="3">
          </font> 
   </p>
        <p>
          <font size="3">2) By default the Refactoring Provider that you need to create a custom
      Refactoring is not in the toolbox, it can be added by "Choose Items" and selecting
      the RefactoringProvider</font>
          <br />
          <img src="http://www.efficientcoder.com/content/binary/RefactoringProvider.gif" border="0" />
        </p>
        <p>
          <font size="3">3) Once you add that, drop that onto your custom design surface for
      your Refactoring plugin, it should look something boring like:</font>
        </p>
        <p>
          <img src="http://www.efficientcoder.com/content/binary/RefactorDesigner.gif" border="0" />
        </p>
        <p>
          <font size="3">4) The click on Properties for your component and add appropriate values:</font>
        </p>
        <p>
          <img src="http://www.efficientcoder.com/content/binary/RefactorProperties.gif" border="0" />
        </p>
        <p>
          <font size="3">5) Now go in and click on the highlighed events to build up your stubs:</font>
        </p>
        <p>
          <img src="http://www.efficientcoder.com/content/binary/RefactorEvents.gif" border="0" />
        </p>
        <p>
          <font size="3">6) Finally go in and add your code (painting code from: <a href="http://tinyurl.com/5a3pe2">http://tinyurl.com/5a3pe2</a>):</font>
        </p>
        <font size="1">
          <p>
          </p>
        </font>
        <font face="Courier New">
          <font size="3">
            <font color="#0000ff">
              <font color="#0000ff">private</font>
            </font>
            <font color="#0000ff">
              <font color="#0000ff">bool</font>
            </font> _handlingEditorForegroundPaint
   = <font color="#0000ff"><font color="#0000ff">false</font></font></font>
        </font>
        <font face="Courier New">
          <font size="3">;<br /><font color="#0000ff"><font color="#0000ff">private</font></font><font color="#2b91af"><font color="#2b91af">SourceRange</font></font></font>
        </font>
        <font face="Courier New">
          <font size="3"> _previewRange;<br /><font color="#0000ff"><font color="#0000ff">private</font></font> DevExpress.CodeRush.UserControls.<font color="#2b91af"><font color="#2b91af">CodePreviewWindow</font></font> _previewWindow
   = <font color="#0000ff"><font color="#0000ff">null</font></font></font>
        </font>
        <font face="Courier New" size="3">;<br /></font>
        <p>
          <font color="#008000">
            <font color="#008000">
              <font face="Courier New" size="3">// DXCore-generated
      code...</font>
            </font>
          </font>
        </p>
        <font color="#0000ff">
          <font color="#0000ff">
            <p>
              <font face="Courier New" size="3">#region</font>
            </p>
          </font>
        </font>
        <font face="Courier New">
          <font size="3">
            <font color="#000000"> InitializePlugIn<br /></font>
            <font color="#0000ff">
              <font color="#0000ff">#region</font>
            </font>
            <font color="#000000"> FinalizePlugIn</font>
          </font>
        </font>
        <p>
          <font face="Courier New">
            <font size="3">
              <font color="#0000ff">
                <font color="#0000ff">private</font>
              </font>
              <font color="#0000ff">
                <font color="#0000ff">void</font>
              </font> ConvertToCustomCaption_Apply(<font color="#0000ff"><font color="#0000ff">object</font></font> sender, <font color="#2b91af"><font color="#2b91af">ApplyContentEventArgs</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3"> ea)<br />
      {<br />
         <font color="#0000ff"><font color="#0000ff">var</font></font> customLabel
      = <font color="#0000ff"><font color="#0000ff">new</font></font> ui.<font color="#2b91af"><font color="#2b91af">CustomCaption</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3">();<br />
         ea.Element.SelectFullBlock();<br />
         customLabel.ShowWithString(<font color="#2b91af"><font color="#2b91af">CodeRush</font></font>.Selection.Text, <font color="#2b91af"><font color="#2b91af">CodeRush</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3">.Caret.ScreenPosition);<br />
         <font color="#0000ff"><font color="#0000ff">if</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3"> (!customLabel.Cancelled)<br />
            ea.Selection.Text = <font color="#0000ff"><font color="#0000ff">string</font></font>.Format(<font color="#a31515"><font color="#a31515">"Customization.Captions.{0}"</font></font></font>
          </font>
          <font face="Courier New" size="3">,
      customLabel.LabelKey);<br />
      }</font>
        </p>
        <p>
          <font face="Courier New">
            <font size="3">
              <font color="#0000ff">
                <font color="#0000ff">private</font>
              </font>
              <font color="#0000ff">
                <font color="#0000ff">void</font>
              </font> ConvertToCustomCaption_CheckAvailability(<font color="#0000ff"><font color="#0000ff">object</font></font> sender, <font color="#2b91af"><font color="#2b91af">CheckContentAvailabilityEventArgs</font></font></font>
          </font>
          <font face="Courier New" size="3"> ea)<br /></font>
          <font face="Courier New">
            <font size="3">{<br />
         ea.Available = <font color="#2b91af"><font color="#2b91af">CodeRush</font></font></font>
          </font>
          <font face="Courier New" size="3">.Caret.InsideString
      &amp;&amp; ea.Element.InsideClass;<br />
      }</font>
        </p>
        <p>
          <font face="Courier New">
            <font size="3">
              <font color="#0000ff">
                <font color="#0000ff">private</font>
              </font>
              <font color="#0000ff">
                <font color="#0000ff">void</font>
              </font> ConvertToCustomCaption_HidePreview(<font color="#0000ff"><font color="#0000ff">object</font></font> sender, <font color="#2b91af"><font color="#2b91af">HideContentPreviewEventArgs</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3"> ea)<br />
      {<br />
         <font color="#0000ff"><font color="#0000ff">if</font></font> (_previewWindow
      != <font color="#0000ff"><font color="#0000ff">null</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3">)<br />
         {<br />
            _previewWindow.HidePreview();<br />
            _previewWindow = <font color="#0000ff"><font color="#0000ff">null</font></font></font>
          </font>
          <font size="3">
            <font face="Courier New">;<br />
         }<br /></font>
            <br />
            <font face="Courier New">   _previewRange = </font>
            <font color="#2b91af">
              <font face="Courier New" color="#2b91af">SourceRange</font>
            </font>
          </font>
          <font face="Courier New">
            <font size="3">.Empty;<br />
         <font color="#0000ff"><font color="#0000ff">if</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3"> (_handlingEditorForegroundPaint)<br />
         {<br />
            _handlingEditorForegroundPaint = <font color="#0000ff"><font color="#0000ff">false</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3">;<br />
            <font color="#2b91af"><font color="#2b91af">EventNexus</font></font>.EditorPaintForeground
      += <font color="#0000ff"><font color="#0000ff">new</font></font><font color="#2b91af"><font color="#2b91af">EditorPaintEventHandler</font></font></font>
          </font>
          <font face="Courier New" size="3">(EventNexus_EditorPaintForeground);<br />
         }<br />
      }</font>
        </p>
        <p>
          <font face="Courier New">
            <font size="3">
              <font color="#0000ff">
                <font color="#0000ff">private</font>
              </font>
              <font color="#0000ff">
                <font color="#0000ff">void</font>
              </font> ConvertToCustomCaption_PreparePreview(<font color="#0000ff"><font color="#0000ff">object</font></font> sender, <font color="#2b91af"><font color="#2b91af">PrepareContentPreviewEventArgs</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3"> ea)<br />
      {<br />
         <font color="#2b91af"><font color="#2b91af">PrimitiveExpression</font></font> ele
      = ea.Element <font color="#0000ff"><font color="#0000ff">as</font></font><font color="#2b91af"><font color="#2b91af">PrimitiveExpression</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3">;<br />
         <font color="#0000ff"><font color="#0000ff">if</font></font> (ele
      != <font color="#0000ff"><font color="#0000ff">null</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3">)<br />
         {<br />
            _previewRange = ele.Range.Clone();<br />
            <font color="#2b91af"><font color="#2b91af">EventNexus</font></font>.EditorPaintForeground
      += <font color="#0000ff"><font color="#0000ff">new</font></font><font color="#2b91af"><font color="#2b91af">EditorPaintEventHandler</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3">(EventNexus_EditorPaintForeground);<br />
            CreatePreviewWindow(ea, <font color="#a31515"><font color="#a31515">"Customization.Captions.[New]"</font></font></font>
          </font>
          <font face="Courier New" size="3">);<br />
         }<br />
      }</font>
        </p>
        <p>
          <font face="Courier New">
            <font size="3">
              <font color="#0000ff">
                <font color="#0000ff">private</font>
              </font>
              <font color="#0000ff">
                <font color="#0000ff">void</font>
              </font> CreatePreviewWindow(<font color="#2b91af"><font color="#2b91af">PrepareRefactoringPreviewEventArgs</font></font> ea, <font color="#0000ff"><font color="#0000ff">string</font></font></font>
          </font>
          <font face="Courier New" size="3"> codeToPreview)<br /></font>
          <font face="Courier New">
            <font size="3">{<br />
         _previewWindow = <font color="#0000ff"><font color="#0000ff">new</font></font><font color="#2b91af"><font color="#2b91af">CodePreviewWindow</font></font></font>
          </font>
          <font face="Courier New" size="3">(ea.TextView,
      _previewRange.Top);<br />
         _previewWindow.AddCode(codeToPreview);<br />
         _previewWindow.ShowPreview();<br />
      }</font>
        </p>
        <p>
          <font face="Courier New">
            <font size="3">
              <font color="#0000ff">
                <font color="#0000ff">private</font>
              </font>
              <font color="#0000ff">
                <font color="#0000ff">void</font>
              </font> InvalidatePreviews(<font color="#2b91af"><font color="#2b91af">RefactoringPreviewEventArgs</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3"> ea)<br />
      {<br />
         <font color="#0000ff"><font color="#0000ff">if</font></font></font>
          </font>
          <font size="3">
            <font face="Courier New"> (_previewRange.IsEmpty)<br />
            <font color="#0000ff"><font color="#0000ff">return</font></font></font>
            <font face="Courier New">;</font>
          </font>
        </p>
        <p>
          <font color="#0000ff">
            <font face="Courier New" color="#0000ff" size="3">   int</font>
          </font>
          <font face="Courier New">
            <font size="3"> doubleSpaceWidth
      = ea.TextView.SpaceWidth * 2;<br />
         <font color="#0000ff"><font color="#0000ff">int</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3"> textViewLineHeight
      = ea.TextView.LineHeight;<br />
         <font color="#2b91af"><font color="#2b91af">Rectangle</font></font></font>
          </font>
          <font face="Courier New" size="3"> previewRect
      = ea.TextView.GetRectangleFromRange(_previewRange);<br />
         previewRect.Inflate(doubleSpaceWidth, textViewLineHeight);<br />
         </font>
          <font size="3">
            <font face="Courier New">ea.TextView.Invalidate(previewRect);<br /></font>
            <font face="Courier New">}</font>
          </font>
        </p>
        <p>
          <font face="Courier New">
            <font size="3">
              <font color="#0000ff">
                <font color="#0000ff">void</font>
              </font> EventNexus_EditorPaintForeground(<font color="#2b91af"><font color="#2b91af">EditorPaintEventArgs</font></font></font>
          </font>
          <font face="Courier New">
            <font size="3"> ea)<br />
      {<br />
         <font color="#0000ff"><font color="#0000ff">if</font></font></font>
          </font>
          <font size="3">
            <font face="Courier New"> (_previewRange.IsEmpty)<br />
            <font color="#0000ff"><font color="#0000ff">return</font></font></font>
            <font face="Courier New">;</font>
          </font>
        </p>
        <p>
          <font face="Courier New">
            <font size="3">
              <font color="#0000ff">
                <font color="#0000ff">   using</font>
              </font> (<font color="#2b91af"><font color="#2b91af">StrikeThrough</font></font> strikeThrough
      = <font color="#0000ff"><font color="#0000ff">new</font></font><font color="#2b91af"><font color="#2b91af">StrikeThrough</font></font></font>
          </font>
          <font size="3">
            <font face="Courier New">())<br />
         {<br />
            strikeThrough.TextView = ea.TextView;<br />
            strikeThrough.FillColor = <font color="#2b91af"><font color="#2b91af">Color</font></font></font>
          </font>
          <font face="Courier New" size="3">.Red;<br />
            strikeThrough.Range = _previewRange;<br />
            strikeThrough.Paint(ea.Graphics);<br />
         }<br />
      }</font>
          <font size="1">
          </font>
        </p>
        <p>
          <font size="3">The "thingy" that let's me enter the text is just a simple WinForm
      represented by ui.CustomCaption, I won't bore you with that implemetentation since
      it is fairly <strike>tightly coupled</strike> intergrated into my architecture.</font>
        </p>
        <p>
          <font size="3">Enjoy!</font>
        </p>
        <p>
          <font size="3">-ec</font>
        </p>
        <font size="1">
        </font>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=559c2673-0a20-4525-b013-42173554b876" />
      </div>
    </content>
  </entry>
</feed>