<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>The Efficient Coder</title>
    <link>http://www.efficientcoder.net/</link>
    <description>There has got to be a better way of communicating with our computers!</description>
    <language>en-us</language>
    <copyright>Kevin D. Wolf</copyright>
    <lastBuildDate>Fri, 27 Feb 2009 17:06:05 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.8.5223.2</generator>
    <managingEditor>kevinw@software-logistics.com</managingEditor>
    <webMaster>kevinw@software-logistics.com</webMaster>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=64336e85-5741-4650-801e-78eddb7cfb48</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,64336e85-5741-4650-801e-78eddb7cfb48.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,64336e85-5741-4650-801e-78eddb7cfb48.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=64336e85-5741-4650-801e-78eddb7cfb48</wfw:commentRss>
      <body 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" /></body>
      <title>Creating Project Item Templates in Visual Studio</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,64336e85-5741-4650-801e-78eddb7cfb48.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,64336e85-5741-4650-801e-78eddb7cfb48.aspx</link>
      <pubDate>Fri, 27 Feb 2009 17:06:05 GMT</pubDate>
      <description>&lt;font size="4" face="Times New Roman"&gt;I'm building a multi-tier application in JavaScript.&amp;nbsp;
This is implementing the &lt;a href="http://blogs.msdn.com/johngossman/archive/2005/10/08/478683.aspx"&gt;Model
View ViewModel&lt;/a&gt; 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.&amp;nbsp;
I'm using code-generation &lt;/font&gt;&lt;font size="4" face="Times New Roman"&gt;to create my
models, but need a good way to create the Controllers, Views, and ViewModels.&amp;nbsp;&lt;/font&gt;&lt;font size="4" face="Times New Roman"&gt; &lt;/font&gt;&lt;font size="4" face="Times New Roman"&gt;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.&lt;br&gt;
&lt;/font&gt;
&lt;br&gt;
&lt;font size="4" face="Times New Roman"&gt;It's fairly simple to create a &lt;a href="http://msdn.microsoft.com/en-us/library/tsyyf0yh.aspx"&gt;trivial
template&lt;/a&gt;, 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.&amp;nbsp; The answer was to implement &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.templatewizard.iwizard.aspx"&gt;IWizard&lt;/a&gt; in
the Microsoft.VisualStudio.TemplateWizard namespace&lt;br&gt;
&lt;br&gt;
We need to create two components for our new templates, a ZipFile containing, *.vstemplate
and a .NET Assembly containing the IWizard implementation.&lt;br&gt;
&lt;br&gt;
&lt;font size="5"&gt;&lt;b&gt;&lt;font face="Arial"&gt;Create your IWizard Implementation&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;
&lt;br&gt;
1) Create a Windows Class Library&lt;br&gt;
2) Add the following References&lt;br&gt;
&lt;/font&gt;
&lt;ul&gt;
   &lt;li&gt;
      &lt;font size="4" face="Times New Roman"&gt;EnvDTE&lt;/font&gt;
   &lt;/li&gt;
   &lt;li&gt;
      &lt;font size="4" face="Times New Roman"&gt;Microsoft.VisualStudio.TemplateWizardInterface&lt;/font&gt;
   &lt;/li&gt;
&lt;/ul&gt;
&lt;font size="4" face="Times New Roman"&gt;3) Create an empty class, and implement the
interface &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.templatewizard.iwizard.aspx"&gt;Microsoft.VisualStudio.TemplateWizard.IWizard&lt;/a&gt;
&lt;br&gt;
4) The method you care most about is:&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void RunStarted(&lt;font color="#0000ff"&gt;object&lt;/font&gt; automationObject, &lt;font color="#0000ff"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#000080"&gt;string&lt;/font&gt;, &lt;font color="#000080"&gt;string&lt;/font&gt;&amp;gt;
replacementsDictionary, Microsoft.VisualStudio.TemplateWizard.&lt;font color="#0000ff"&gt;WizardRunKind&lt;/font&gt; runKind, &lt;font color="#0000ff"&gt;object&lt;/font&gt;[]
customParams)&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font size="4" face="Times New Roman"&gt;5) In this method you can add additional tokens
to be used in your template by adding name value pairs to the replacementDictionary&lt;br&gt;
&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="Courier New"&gt;replacementsDictionary.Add("&lt;font color="#ff0000"&gt;$modulename$&lt;/font&gt;",
"&lt;font color="#ff0000"&gt;MyName&lt;/font&gt;");&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font size="4" face="Times New Roman"&gt;6) In addition you can add a standard windows
form to your wizard to collect information&lt;br&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _inputForm = new &lt;font color="#008000"&gt;ModuleInputForm&lt;/font&gt;();&lt;/font&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _inputForm.ShowDialog();&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; replacementsDictionary.Add("&lt;font color="#ff0000"&gt;$modulename$&lt;/font&gt;",
_inputForm.ModuleName);&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font size="4" face="Times New Roman"&gt;7) Within the Project Properties and the Signing
Tab, you need &lt;a href="http://msdn.microsoft.com/en-us/library/ms247123%28VS.80%29.aspx"&gt;sign&lt;/a&gt; your
assembly.&amp;nbsp; You will be installing within the GAC, so it needs a strong name.&lt;br&gt;
8) &lt;a href="http://support.microsoft.com/kb/815808"&gt;Install&lt;/a&gt; your Assembly in the
GAC.&amp;nbsp; The easiest way to do this is to just copy the file from your build output
directory to %WINDIR%\assemblies between two explorer windows.&lt;br&gt;
&lt;/font&gt;&lt;font size="4" face="Times New Roman"&gt;9) After you install your Assembly note
the &lt;b&gt;Assembly Name&lt;/b&gt; and &lt;b&gt;Public Key Token&lt;/b&gt;, you will need these to create
your vstemplate.&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;div align="center"&gt;&lt;img src="http://www.efficientcoder.net/content/binary/StrongName.jpg" border="0"&gt;
   &lt;br&gt;
&lt;/div&gt;
&lt;font size="4" face="Times New Roman"&gt;
&lt;br&gt;
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.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;&lt;font size="5" face="Arial"&gt;Create your vstemplate:&lt;/font&gt;&lt;/b&gt;
&lt;br&gt;
We will need to create a ZIP file that contains at least three components (more if
you want to generate multiple files):&lt;br&gt;
1) SomeTemplate.ext - This will contain the template used to create the Visual Studio
Project Item&lt;br&gt;
2) Specification.vstemplate - An XML file that contains the configuration for your
template&lt;br&gt;
3) Image.ico - An image that will be displayed in the new project item dialog for
your custom project template.&lt;br&gt;
&lt;br&gt;
What I did was just create a temp directory where I created these files.&amp;nbsp; Once
complete I'll zip them up and show you where to put them so Visual Studio will recognize
them.&lt;br&gt;
&lt;br&gt;
&lt;font face="Arial"&gt;&lt;b&gt; SomeTemplate.ext&lt;/b&gt;&lt;/font&gt;, or in my case Controller.js&lt;br&gt;
This is your custom template.&amp;nbsp; It can contain anything, but what makes this work
is the ability to replace tokens within the template.&amp;nbsp; 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.&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;MyCompany.Controllers.$modulename$.$safeitemname$.registerClass('&lt;/font&gt;&lt;font face="Courier New"&gt;MyCompany&lt;/font&gt;&lt;font face="Courier New"&gt;.Controllers.$modulename$.$safeitemname$',
null, Sys.IDisposable, &lt;/font&gt;&lt;font face="Courier New"&gt;MyCompany&lt;/font&gt;&lt;font face="Courier New"&gt;.Controllers.IController);&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font size="4" face="Times New Roman"&gt;&lt;b&gt;&lt;font size="4" face="Arial"&gt;Specification.vstemplate&lt;/font&gt;&lt;/b&gt; or
in my case &lt;/font&gt;Controller.vstemplate&lt;br&gt;
&lt;font size="4" face="Times New Roman"&gt;Next we need to create our .vstemplate file.&amp;nbsp;
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: &lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;&amp;lt;VSTemplate Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005"
Type="Item"&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;TemplateData&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DefaultName&amp;gt;Controller.js&amp;lt;/DefaultName&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;M-V-VM Controller&amp;lt;/Name&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Description&amp;gt;Model View ViewModel Controller&amp;lt;/Description&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ProjectType&amp;gt;CSharp&amp;lt;/ProjectType&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;SortOrder&amp;gt;10&amp;lt;/SortOrder&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Icon&amp;gt;__TemplateIcon.ico&amp;lt;/Icon&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;/TemplateData&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;TemplateContent&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;References /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ProjectItem SubType="" TargetFileName="$fileinputname$.js"
ReplaceParameters="true"&amp;gt;Controller.js&amp;lt;/ProjectItem&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;/TemplateContent&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;WizardExtension&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Assembly&amp;gt;MyCompany.&lt;/font&gt;&lt;font face="Courier New"&gt;Templates.&lt;/font&gt;&lt;font face="Courier New"&gt;WizardTemplateInstance,
Version=1.0.0.0, Culture=Neutral, PublicKeyToken=a2c453bf57a7f5d7&amp;lt;/Assembly&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;FullClassName&amp;gt;&lt;/font&gt;&lt;font face="Courier New"&gt;MyCompany.Templates.WizardTemplateInstance&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;lt;/FullClassName&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;/WizardExtension&amp;gt;&lt;br&gt;
&amp;lt;/VSTemplate&amp;gt;&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font size="4" face="Times New Roman"&gt;Pretty straight forward. but &lt;a href="http://msdn.microsoft.com/en-us/library/xwkxbww4.aspx"&gt;here's
a little more information&lt;/a&gt; about the file format, one important note, make sure
in your ProjectItem node, you have ReplaceParameters="true" to update your tokens.&amp;nbsp;
In addition to the custom tokens we added in the wizard we created above, here is
a &lt;a href="http://msdn.microsoft.com/en-us/library/eehb4faa.aspx"&gt;list&lt;/a&gt; of built
in tokens.&lt;br&gt;
&lt;br&gt;
You need to find yourself an icon for your template.&amp;nbsp; Make sure it's in the same
directory and is specified by the &amp;lt;Icon&amp;gt; node.&lt;br&gt;
&lt;br&gt;
Once you have this completed, zip all three files and place them in the directory
on your machine similar to:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="Courier New"&gt;[USERNAME]\Documents\Visual Studio
2008\Templates\ItemTemplates&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;b&gt;&lt;font size="5" face="Arial"&gt;Generate your Template&lt;/font&gt;&lt;/b&gt;
&lt;br&gt;
Start Visual Studio, within your solution tree, click on Add New Item and in the bottom
section on MyTemplates you should see the following:&lt;/font&gt;
&lt;br&gt;
&lt;div align="center"&gt;&lt;img src="content/binary/NewItem.jpg" border="0"&gt;
   &lt;br&gt;
&lt;/div&gt;
&lt;font size="4" face="Times New Roman"&gt;Change the name and if the Software God's are
shining on you you should see:&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;div align="center"&gt;&lt;img src="content/binary/ModuleName.jpg" border="0"&gt;
   &lt;br&gt;
&lt;/div&gt;
&lt;font size="4" face="Times New Roman"&gt;
&lt;br&gt;
where you can enter the name of your module.&lt;br&gt;
&lt;br&gt;
Once you hit Save, your new file should get generated any tokens you specified be
replaced.&amp;nbsp; 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:&lt;br&gt;
&lt;/font&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;MyCompany.Controllers.$modulename$.$safeitemname$.registerClass('&lt;/font&gt;&lt;font face="Courier New"&gt;MyCompany&lt;/font&gt;&lt;font face="Courier New"&gt;.Controllers.$modulename$.$safeitemname$',
null, Sys.IDisposable, &lt;/font&gt;&lt;font face="Courier New"&gt;MyCompany&lt;/font&gt;&lt;font face="Courier New"&gt;.Controllers.IController);&lt;/font&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;MyCompany.Controllers.Sync.History.registerClass('&lt;font color="#ff0000"&gt;MyCompany.Controllers.Sync.History&lt;/font&gt;',
MyCompany.Controllers.ControllerBase, Sys.IDisposable, MyCompany.Controllers.IController);&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;div align="center"&gt;&lt;i&gt;Yes that is Javascript, if you are doing client side programming,
   why aren't you taking advantage of the &lt;a href="http://msdn.microsoft.com/en-us/library/bb397536.aspx"&gt;Microsoft
   Ajax Client Library&lt;/a&gt;?&lt;/i&gt;
   &lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
-ec&lt;br&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=64336e85-5741-4650-801e-78eddb7cfb48" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,64336e85-5741-4650-801e-78eddb7cfb48.aspx</comments>
      <category>Software Engineering;Code Generation</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=9e6780bb-52a6-47de-aa0f-4e6428204bc6</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,9e6780bb-52a6-47de-aa0f-4e6428204bc6.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,9e6780bb-52a6-47de-aa0f-4e6428204bc6.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=9e6780bb-52a6-47de-aa0f-4e6428204bc6</wfw:commentRss>
      <body 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" />
      </body>
      <title>From Copy-and-Paste to Ninja, Learning New Technologies</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,9e6780bb-52a6-47de-aa0f-4e6428204bc6.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,9e6780bb-52a6-47de-aa0f-4e6428204bc6.aspx</link>
      <pubDate>Tue, 17 Feb 2009 13:25:31 GMT</pubDate>
      <description>&lt;font face="Times New Roman"&gt;&lt;font size="4"&gt;I've always had a drive to take apart
anything electronic and figure out how it worked.&amp;nbsp; Even better if the thing had
a microprocessor since then I would try to start up a conversation with it.&amp;nbsp;
I think my first experience with this was hooking up an old &lt;a href="http://www.columbia.edu/acis/history/teletype.html"&gt;teletype
machine&lt;/a&gt; given to me by my junior high school to a &lt;a href="http://en.wikipedia.org/wiki/Commodore_VIC-20"&gt;VIC-20&lt;/a&gt; computer
to use a printer.&amp;nbsp; Then came the first XBox.&amp;nbsp; I enjoyed playing games on
it, but I wasn't really a gamer.&amp;nbsp; Then I found out about &lt;a href="http://www.llamma.com/xbox/Mods/DUO_X3_Installation.htm"&gt;modding&lt;/a&gt; the
darn thing...I think the main reason for this was to be able to make *back-ups* of
your games.&amp;nbsp; 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.&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img src="http://www.efficientcoder.net/content/binary/x3.jpg" border="0"&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font face="Times New Roman" size="4"&gt;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 &lt;a href="http://creators.xna.com/en-US/"&gt;XNA Game Studio&lt;/a&gt;.&amp;nbsp; Last
summer I downloaded Version 2.0 of the SDK and started my journey on learning this
new technology.&amp;nbsp; Other than playing around with the &lt;a href="http://en.wikipedia.org/wiki/HYDRA_Game_Development_Kit"&gt;Hydra
Game Development Kit&lt;/a&gt;, I knew next to nothing about game programming, this was
a chance to learn a brand new technology.&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
I'm still in the process of learning but I thought it was interesting on how I'm building
my first game.&amp;nbsp; Most of the time when I write an application, I &lt;i&gt;really&lt;/i&gt; want
to have an in depth knowledge of what's happening with the code.&amp;nbsp; 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.&amp;nbsp; In January
I started a project that I will be publishing in March as a Community Game on the
XBox 360.&amp;nbsp; To make this work, I needed to do a bunch of stuff I really had no
clue how to program.&amp;nbsp; These were things like explosions, smoke from a missle
trail etc...&amp;nbsp; 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.&amp;nbsp; 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.&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
So I figured out how to create 3D models with the &lt;a href="http://www.softimage.com/products/modtool/"&gt;XSI
Mod Tool&lt;/a&gt;, that was no small chore, but kind of fun and something I did on the
couch while watching TV.&amp;nbsp; 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.&amp;nbsp; Then I added a few more
models and decided that the code just didn't "smell right" anymore.&amp;nbsp; It was a
good time to create a class that knew how to render models in &lt;b&gt;my game&lt;/b&gt;, this
was important since &lt;b&gt;my game&lt;/b&gt; had some specific needs and I couldn't just cut-and-paste
anymore I needed to know how the code worked.&amp;nbsp; This is when the lights started
coming on.&amp;nbsp; Next was implementing the flight of a missile.&amp;nbsp; I found some
algorithms for acceleration and gravity as well as a smoke plume and cut-and-pasted
the code.&amp;nbsp; This got me about 75% of the way there and was a mess, but at least
it sort-of worked and was rewarding.&amp;nbsp; I refactored the code, learned how it worked
and the light bulbs came on again.&amp;nbsp; 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.&amp;nbsp; 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.&amp;nbsp; Then the real critical part, refactor the
hell out of it and make that code your own!&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;&lt;img src="http://www.efficientcoder.net/content/binary/Game.png" border="0"&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font face="Times New Roman" size="4"&gt;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.&amp;nbsp; 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.&lt;br&gt;
&lt;/font&gt;
&lt;br&gt;
&lt;img src="http://www.efficientcoder.net/content/binary/Game2.png" border="0"&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font face="Times New Roman" size="4"&gt;I think to a certain extent, this is probably
how we learn to implement technologies most of the time, but in smaller steps.&amp;nbsp;
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.&amp;nbsp; 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.&amp;nbsp; Apply your style, refactor,
rinse and repeat and make the code your own!&lt;br&gt;
&lt;br&gt;
-ec&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=9e6780bb-52a6-47de-aa0f-4e6428204bc6" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,9e6780bb-52a6-47de-aa0f-4e6428204bc6.aspx</comments>
      <category>Software Engineering;XNA</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=feed9006-dca9-4fb2-b282-779c38339dc3</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,feed9006-dca9-4fb2-b282-779c38339dc3.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,feed9006-dca9-4fb2-b282-779c38339dc3.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=feed9006-dca9-4fb2-b282-779c38339dc3</wfw:commentRss>
      <title>Sitting out the Great Quality Wars of '09</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,feed9006-dca9-4fb2-b282-779c38339dc3.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,feed9006-dca9-4fb2-b282-779c38339dc3.aspx</link>
      <pubDate>Thu, 12 Feb 2009 17:44:54 GMT</pubDate>
      <description>&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;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,feed9006-dca9-4fb2-b282-779c38339dc3.aspx</comments>
      <category>Business of Software;Project Delivery;Software Engineering;Software Metrics</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=0928cae8-2bb3-410a-9fcb-e798a7a12bd1</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,0928cae8-2bb3-410a-9fcb-e798a7a12bd1.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,0928cae8-2bb3-410a-9fcb-e798a7a12bd1.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0928cae8-2bb3-410a-9fcb-e798a7a12bd1</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body 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" />
      </body>
      <title>It's a Great Time to be a Developer</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,0928cae8-2bb3-410a-9fcb-e798a7a12bd1.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,0928cae8-2bb3-410a-9fcb-e798a7a12bd1.aspx</link>
      <pubDate>Fri, 06 Feb 2009 15:39:35 GMT</pubDate>
      <description>&lt;font size="3"&gt;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).&amp;nbsp;
As an independent consultant, I'm always just a little worried about what the next
six months will bring.&amp;nbsp; 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.&amp;nbsp;
I think 2009 may provide a different way of thinking about how I perform my craft
to pay the bills, let me explain.&amp;nbsp; When doing client work there is really no
long term guarantee.&amp;nbsp; It's a process of identifying a need for their organization,
doing an excellent job filling that need, get a check, rinse and repeat.&amp;nbsp; You
are really establishing a "dependency" on your client, their needs and cash flow have
a big influence on your future.&amp;nbsp; As a developer we know that in most cases dependencies
are not a good thing.&lt;br&gt;
&lt;br&gt;
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.&amp;nbsp; As much as
I enjoying developing systems to make my clients succeed, I would rather develop systems
to make &lt;b&gt;myself&lt;/b&gt; succeed!&amp;nbsp; How is this possible?&amp;nbsp; 
&lt;br&gt;
Well I'm pursuing two opportunities right now that you can too!&amp;nbsp; The costs and
barriers for entry are negligible.&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img src="http://www.efficientcoder.net/content/binary/XNA_Banner_Club_final.jpg" border="0"&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font size="3"&gt;The first one is really sort of fun, I'm building a game for &lt;a href="http://creators.xna.com/en-US/"&gt;XBox
Community Games&lt;/a&gt;.&amp;nbsp; 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.&amp;nbsp; 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.&amp;nbsp; I'm not buying that 54 foot yacht yet,
but who knows.&amp;nbsp; 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.&amp;nbsp; 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.&lt;br&gt;
&lt;/font&gt;
&lt;br&gt;
&lt;img src="http://www.efficientcoder.net/content/binary/servicesPlatform.jpg" border="0"&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font size="3"&gt;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.&amp;nbsp; I'm
already getting my feet wet with this technology and I'm excited for the RTM date.&amp;nbsp;
This approach and techonology changes things, period.&amp;nbsp; Over the past eight years,
I've been working on a product I call The Chaos Filter.&amp;nbsp; I've spun off a few
little products that generate some revenue, but really haven't cranked up the marketing
engine yet.&amp;nbsp; 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.&amp;nbsp;
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.&amp;nbsp; My product is
really a set of highly configurable services that work together well.&amp;nbsp; 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.&amp;nbsp; These
will be built for highly specialized niche markets.&amp;nbsp; 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.&amp;nbsp; Basically a high value, low cost solution that will
be very easy for people to sign up for and keep coming back.&amp;nbsp; To make any money
at this effort, I'm going to need a ton of people signing up.&amp;nbsp; &lt;/font&gt;&lt;font size="3"&gt;That's
where I see the &lt;a href="http://www.microsoft.com/azure/whatisazure.mspx"&gt;Azure Services
Platform&lt;/a&gt; come in.&amp;nbsp; Without building a large company, I can partner with subject
matter experts to build these MicroApps.&amp;nbsp; Then make these products available
to the Windows Live user base.&amp;nbsp; 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.&amp;nbsp; Again,
as with the XBox game, I can focus on my core competency, cuttin' code.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;&lt;img src="http://www.efficientcoder.net/content/binary/image20080609.png" border="0"&gt;
&lt;br&gt;
&lt;font size="3"&gt;Another awesome opportunity would be to start writing applications
for the iPhone and iPod Touch.&amp;nbsp; Although being a .NET developer, I'll probably
focus on the two opportunities I've outlined above, however this once can't be ignored.&amp;nbsp;
Apple did a great job of making it super simple for people to trade you their money
for your apps.&amp;nbsp; I purchased a MacBook and have started to learn Objective C.&amp;nbsp;
Even though this seems very appealing, I just don't see spending my valuable time
on this anytime soon.&amp;nbsp; I guess the XBox and Azure Live Services just turn out
to be a fad *cough* there are other opportunities out there.&lt;br&gt;
&lt;br&gt;
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.&amp;nbsp; 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.&lt;br&gt;
&lt;br&gt;
-ec&lt;br&gt;
&lt;/font&gt;&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=0928cae8-2bb3-410a-9fcb-e798a7a12bd1" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,0928cae8-2bb3-410a-9fcb-e798a7a12bd1.aspx</comments>
      <category>Business of Software;Project Delivery;Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=37e0fc35-9aa9-4e10-80f7-a1d348440121</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,37e0fc35-9aa9-4e10-80f7-a1d348440121.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,37e0fc35-9aa9-4e10-80f7-a1d348440121.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=37e0fc35-9aa9-4e10-80f7-a1d348440121</wfw:commentRss>
      <body 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" />
      </body>
      <title>Ramblings from a Software Developer Half Way through their Career</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,37e0fc35-9aa9-4e10-80f7-a1d348440121.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,37e0fc35-9aa9-4e10-80f7-a1d348440121.aspx</link>
      <pubDate>Sun, 01 Feb 2009 22:30:45 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font size=3&gt;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.&amp;nbsp;
   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.&lt;/font&gt; 
&lt;p&gt;
   &lt;font size=3&gt;&lt;/font&gt; 
&lt;p&gt;
   &lt;a href="file:///C:/Users/kevinw/AppData/Local/Temp/1/WindowsLiveWriter1286139640/supfiles50C34A0/Career[3].png"&gt;&lt;/a&gt;&lt;img src="http://www.efficientcoder.net/content/binary/Career.png" border=0&gt; 
&lt;p&gt;
   &lt;a href="file:///C:/Users/kevinw/AppData/Local/Temp/1/WindowsLiveWriter1286139640/supfiles50C34A0/Career[3].png"&gt;&lt;/a&gt;&amp;nbsp;&lt;font size=3&gt;The
   following&amp;nbsp;are some observations and&amp;nbsp;thoughts on&amp;nbsp;some things I've learned&amp;nbsp;at
   the different positions and work I’ve done with the last&amp;nbsp;19 years.&amp;nbsp;&amp;nbsp;If
   you make it to the end of my "ramblings" drop me a note and let me know what you think.&lt;/font&gt; 
&lt;p&gt;
   &lt;font size=3&gt;&lt;/font&gt; 
&lt;p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/dill6.gif" border=0&gt; 
&lt;p&gt;
   &lt;font size=3&gt;After graduating from &lt;a href="http://www.mnsu.edu/"&gt;&lt;font color=#003399&gt;Minnesota
   State University&lt;/font&gt;&lt;/a&gt; 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.&amp;nbsp; 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.&amp;nbsp; This was a long and painful
   process where our primary objective was to build consensus on development standards.&amp;nbsp;
   We started with coding conventions for FORTH, C &amp;amp; C++.&amp;nbsp; 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&amp;nbsp;we spent weeks discussing putting curly
   brackets around single lines after an if statement.&amp;nbsp; 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.&amp;nbsp; 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.&amp;nbsp; Luckily the two of use seemed to be the only ones to ship on time so
   I guess they didn’t mind too much.&amp;nbsp; I considered those years as almost a “Masters”
   level education.&amp;nbsp; Some of the observations/lessons from this position:&lt;/font&gt; 
&lt;ul&gt;
   &lt;li&gt;
      &lt;font size=3&gt;Designing the hardware, writing the low-level drivers and then the software
      that made the microcontroller do something meaningful is truly an enlightening experience.&amp;nbsp;
      It still influences how I program in high level languages such as C# today.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Another invaluable lesson learned at this job was the difference between
      sales and marketing.&amp;nbsp; And the good, the bad and the ugly of working with other
      areas within a company.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Get your developers in front of the customer and in the real world as
      much as reasonably possible.&amp;nbsp; 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.&amp;nbsp;
      This is also true if your developers experience is limited to only seeing a 1 with
      a&amp;nbsp;bunch of zero’s that represents a decimal data type&amp;nbsp;on a sales order instead
      of a real order for a gazillion dollars that represents real money.&amp;nbsp; It's an
      eye opener to see how &lt;b&gt;real&lt;/b&gt; users actually use your software.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Keep your developers coding, and then have them code some more and when
      they are done doing that, have them code a little more.&amp;nbsp; As with any craft you
      get better with experience.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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)&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Software estimating even on small projects is very difficult.&amp;nbsp; Estimates
      from developers should be doubled.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;When marketing drives certification efforts such as ISO9000, the results
      are very shallow.&lt;/font&gt;
   &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   &lt;font size=3&gt;&lt;a href="file:///C:/Users/kevinw/AppData/Local/Temp/1/WindowsLiveWriter1286139640/supfiles50C34A0/CRM[3].png"&gt;&lt;/a&gt;&lt;/font&gt; 
&lt;p&gt;
   &lt;font size=3&gt;&lt;/font&gt; 
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/CRM.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;font size=3&gt;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”.&amp;nbsp;
   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.&amp;nbsp; I had the luxury
   of hiring my own&amp;nbsp;senior staff.&amp;nbsp; I’m a firm believer that right people are
   single most influential factor in the success for failure of a software project.&amp;nbsp;
   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.&amp;nbsp; In my previous
   job I was introduced to the classic &lt;a href="http://www.sei.cmu.edu/publications/books/process/managing-sw-process.html"&gt;&lt;font color=#003399&gt;Managing
   the Software Process&lt;/font&gt;&lt;/a&gt; by &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Watts_Humphrey"&gt;&lt;font color=#003399 size=3&gt;Watts
   Humphrey&lt;/font&gt;&lt;/a&gt;&lt;font size=3&gt;&amp;nbsp;this is a classic must read book.&amp;nbsp; 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.&amp;nbsp; Much more so than the single
   person 3-4 month projects at my previous position.&amp;nbsp; One of the lessons learned
   here is that different types of software require different set of processes and talent.&amp;nbsp;
   Some other observations from this position:&lt;/font&gt; 
&lt;ul&gt;
   &lt;li&gt;
      &lt;font size=3&gt;Developing large systems is just plain hard, there is &lt;a href="http://en.wikipedia.org/wiki/No_Silver_Bullet"&gt;&lt;font color=#003399&gt;no
      silver bullet&lt;/font&gt;&lt;/a&gt;, but with the right &lt;a href="http://en.wikipedia.org/wiki/Peopleware"&gt;&lt;font color=#003399&gt;people&lt;/font&gt;&lt;/a&gt; it
      is possible and can even be fun.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Team building is important to the success of your project.&amp;nbsp; Finding
      the right chemistry is worth the effort, bad apples or “negative producers” must be
      swiftly removed from the team.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;It's worth the investment to build scaffolding to test your application.&amp;nbsp;
      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.&amp;nbsp; Really a necessity when the
      MFC compiler took 45 minutes to do a full build.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;I was formally introduced to “&lt;a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)"&gt;&lt;font color=#003399&gt;Design
      Patterns&lt;/font&gt;&lt;/a&gt;” and the &lt;a href="http://en.wikipedia.org/wiki/Design_Patterns"&gt;&lt;font color=#003399&gt;GoF&lt;/font&gt;&lt;/a&gt;.&amp;nbsp;
      Coming from an engineering background, I had always thought Software Development needed
      to mature and “Design Patterns” were going to be our building blocks.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Platform Independence sounds good when on the marketing cut-sheet’s but
      in reality…well…you know the story here.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Senior, top level management buy-in and participation is absolutely critical
      to the success of any software process improvement effort.&amp;nbsp; 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.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;When spec’ing and selling multi-million dollar projects, make sure you
      have representatives from the dev staff involved with pre-sales.&amp;nbsp; Without that
      I’ve found there is usually an expectation mismatch, this is true in smaller projects
      but critical in larger ones.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Our company was organized into Product and Professional Services divisions,
      using real world requirements from Professional Services&amp;nbsp;goes a long way to help
      product development planning.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;There should be an inverse proportion of the amount of code you write
      with respect to your level within the management food chain.&amp;nbsp; When I started
      as a software engineer, I spent 90% of my time coding.&amp;nbsp; As a director, I spent
      about 5% coding&amp;nbsp;if I was lucky.&amp;nbsp; The challenge here is to keep your skill
      sharp, you need to code, period.&amp;nbsp; To be a good manager you need to manage period,
      if you are coding you are doing your employees a disservice.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;In our industry, a manager works for their employees.&amp;nbsp; 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.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Although difficult, setting and managing expectations is critical to
      the success of delivering software.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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.&amp;nbsp;
      This deserves another post to explain in more detail.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Technical solutions generally don’t work to fix process problems &lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Towards the end of my time there I had a keen understanding of why executives
      “don’t like surprises”.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;It’s all really about People, Process and Technology&lt;/font&gt;
   &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   &lt;font size=3&gt;&lt;/font&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;font color=#800000 size=6&gt;&lt;strong&gt;&lt;em&gt;PPT Solutions, LLC&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt; 
&lt;p&gt;
&lt;p&gt;
   &lt;font size=3&gt;Three of us left the Sales Force Automation company and started our own
   venture it was called PPT Solutions (People Process &amp;amp; Technology, in that order
   as we liked to say).&amp;nbsp; 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.&amp;nbsp; 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.&lt;/font&gt; 
&lt;ul&gt;
   &lt;li&gt;
      &lt;font size=3&gt;We were told going into a business partnership with friends was a bad
      idea, we thought we were different.&amp;nbsp; We weren’t.&amp;nbsp; The reality is that someone
      needs to be in charge and equity needs to be based upon contribution to the company.&amp;nbsp;
      Friendships complicate this, especially in our industry where we think we are all
      “rock-stars”.&amp;nbsp; Eight years later the wounds from this are finally healed.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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).&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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.&amp;nbsp;
      Care should be taken so that specialized requirements don't contaminate the core product.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Make your estimate than double it, both time and dollars&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;It’s a double edged sword working out of your house.&amp;nbsp; It's nice,
      but it requires discipline to stay focused.&amp;nbsp; Having weekly goals is a good idea.&amp;nbsp;
      You will probably also be working on weekends to a certain extent.&amp;nbsp; Do whatever
      possible to separate your work week from your weekend, this helps burn-out.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;If you partner with other people to start a business, clearly define
      expectations and responsibility up front.&lt;/font&gt;
   &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   &lt;font size=3&gt;&lt;/font&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/People.gif" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;font size=3&gt;Next up was a small startup, let's just say I don't have a lot of good
   memories from that place.&amp;nbsp; 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.&amp;nbsp; 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.&amp;nbsp; Enough said…moving On….&lt;/font&gt; 
&lt;p&gt;
   &lt;font size=3&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;img style="WIDTH: 175px; HEIGHT: 55px" height=55 src="http://www.efficientcoder.net/content/binary/Software%20Logistics.png" width=145 border=0&gt; 
&lt;p&gt;
   &lt;font size=3&gt;That takes me up to what I'm doing today, Software Logistics, LLC.&amp;nbsp;
   My company.&amp;nbsp; I don't have any employees, but use contractors as necessary.&amp;nbsp;
   I seemed to have found a nice niche.&amp;nbsp; I spend about 90% of my week coding.&amp;nbsp;
   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.&amp;nbsp; I've worked with very small
   companies and very large companies during the past eight years.&amp;nbsp; Each has their
   strengths and weaknesses and enjoy working with both.&amp;nbsp; This has been a great
   learning experience and I’ve shipped a number of projects in the process.&lt;/font&gt; 
&lt;ul&gt;
   &lt;li&gt;
      &lt;font size=3&gt;To get started, networking and word of mouth is very important.&amp;nbsp;
      Even more so is networking with the &lt;b&gt;right&lt;/b&gt; people.&amp;nbsp; There is time for friends
      and time for business.&amp;nbsp; As with my previous venture, these don't often mix very
      well.&amp;nbsp; 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.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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,&amp;nbsp;build
      environments etc…&amp;nbsp; 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.&amp;nbsp;
      Although still in evolution, my CI and deployment environment rivals if not exceeds
      most of companies I work with.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Invest in yourself.&amp;nbsp; I attend at a minimum two conferences a year.&amp;nbsp;
      Even those these are on my own nickel this is a must.&amp;nbsp; Going to conferences allows
      you the time to focus on what's new and get a quick overview of a wide variety of
      technologies.&amp;nbsp; 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.&amp;nbsp; 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.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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%.&amp;nbsp; This doesn't mean you
      go "dark" but during the development phase it's a balance between keeping&amp;nbsp;your
      client comfortable with the progress&amp;nbsp;and staying out of the details enough to
      keep on your schedule.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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.&amp;nbsp;
      There needs to be a balance between using tools such as a defect tracking and verbal
      communications.&amp;nbsp; 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.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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.&amp;nbsp; Remember you are a professional,
      impressions matter, especially when negotiating the yearly rate increase.&amp;nbsp; I
      don't think it's important to drive a BMW, but you should project a feeling of success.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;You can't generally rely on the QA of your clients.&amp;nbsp; If you can't
      do it yourself (which is very difficult if not impossible) hire someone and get a
      good issue tracking system.&amp;nbsp; I really like Visual Studio Team System, if you
      have a premium subscription, you should be able to leverage the workgroup license.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Hold frequent status meetings, you should run these meetings, always
      have an agenda.&amp;nbsp; Set the expectations as to what you will cover in your agenda
      and ask for feedback if they have any concerns.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Respect your clients time,&amp;nbsp;most people have more work than time.&amp;nbsp;
      At the start of the meeting ask for how much time you have and adjust your schedule
      accordingly.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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.&amp;nbsp; However it’s impossible
      to know everything.&amp;nbsp; If you don't know something don't BS your client.&amp;nbsp;
      Most of the time the people you are working with can tell, you need to keep your credibility
      and trust.&amp;nbsp; If you don't know something, find out and make sure you follow up
      promptly.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Your demos will almost never go as planned.&amp;nbsp; I remember one demo
      that I practiced a number of times&amp;nbsp;and it worked flawlessly, I got to the client
      site and they had custom DNS settings on their internal network.&amp;nbsp; It broke my
      demo.&amp;nbsp; Think quick, think on your feet, and adapt, in my case a simple tweak
      of the HOSTS file was all that was necessary.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;At all costs do not get involved in company politics.&amp;nbsp; All companies
      have them.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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.&amp;nbsp; People
      are generally overworked and requests from the consultant come after requests from
      their internal managers.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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.&amp;nbsp; 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.&amp;nbsp; Remember it's your name on the line.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;If a client pays you to build software, they own the source code (unless
      you work out a different arrangement).&amp;nbsp; Don't use that source code in a different
      project or for a different client without their written approval.&amp;nbsp; 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.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;I've found that there is no right answer to the right amount of documentation
      you should provide.&amp;nbsp; I had one client that complained about the level of documentation
      I produced.&amp;nbsp; 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".&amp;nbsp; I don't think the documents were even looked at.&amp;nbsp; I
      guess my point is for a developer,&amp;nbsp;documentation is&amp;nbsp;no fun.&amp;nbsp; If no
      one is going to read it it's your call on how much to deliver.&amp;nbsp; It's good for
      CYA.&amp;nbsp; Another client I have uses a WIKI for documentation, nice and simple, yet
      effective.&amp;nbsp; If your client doesn't have one, set one up for them on your server.&amp;nbsp;
      If it gets traction install on their server.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Don't skimp on your computer setup and hardware.&amp;nbsp; Time is money,
      would you rather spend your time installing and configure software, or would you rather
      cut code and get paid.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;I've found that using a tool like VMware Workstation works great for
      doing client work.&amp;nbsp; I have a base setup that has all generic development tools.&amp;nbsp;
      I can than copy that base&amp;nbsp;VM and configure it with the specific tools and source&amp;nbsp;to
      work on client projects.&amp;nbsp; 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.&amp;nbsp;
      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.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;If the environment is right, offer more than you ask for, I really enjoy
      mentoring young developers, and showing them&amp;nbsp;new tools, technologies and techniques,
      be careful here though not to step on other internal developers toes.&lt;/font&gt;
   &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/Thoughts.png" border=0&gt; 
&lt;p&gt;
   &lt;font size=3&gt;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:&lt;/font&gt; 
&lt;ul&gt;
   &lt;li&gt;
      &lt;font size=3&gt;Every project is different, yet there are many similarities amongst different
      projects.&amp;nbsp; 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.&amp;nbsp; There are also&amp;nbsp;differences&amp;nbsp;in techniques
      required&amp;nbsp;when working on the same project.&amp;nbsp; An example is a non-trivial
      LOB application, there is&amp;nbsp;the application&amp;nbsp;frameworks, data layer, business
      objects, UI library, each of these is different and requires a different approach
      and the investment in time and design.&amp;nbsp; 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.&amp;nbsp; And
      general&amp;nbsp;sweeping&amp;nbsp;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.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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.&amp;nbsp; Generally the most difficult part of this development
      is the ability to track and manage changes to the business rules and requirements.&amp;nbsp;
      I've seem a few implementations, that probably were much more complicated than need
      be.&amp;nbsp; 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.&amp;nbsp;
      Some of us need to build Jaguar's and some of us need to build F-150's.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;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.&amp;nbsp; This may not be true of all companies, but I would suspect it is
      for the majorities of the companies out there.&amp;nbsp; 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.&amp;nbsp; 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.&amp;nbsp;
      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.&amp;nbsp; Take into
      account Fredrick's Brooks law of &lt;a href="http://en.wikipedia.org/wiki/Brooks'_law"&gt;&lt;font color=#003399&gt;adding
      man power to a late software project makes it later&lt;/font&gt;&lt;/a&gt; and you get an idea
      of the scope of the challenge.&amp;nbsp; So, you say, what's the answer?&amp;nbsp; I'm not
      sure there really is one.&amp;nbsp; 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.&amp;nbsp;
      Sure you may be a rock star coder, but if you don't code the right thing, oops…what's
      the point?&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;Everyone in our industry thinks they are a "Rock Star" in reality very
      few people are.&amp;nbsp; 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".&amp;nbsp; I’ve found this to be the case.&amp;nbsp; On some big projects I’ve worked
      on I’ve found that 20% of the team completes about 80% of the work.&amp;nbsp; 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 "&lt;i&gt;Make Progress Every Day&lt;/i&gt;" into becoming a better
      developer.&amp;nbsp; This includes reading all the classics, writing tons of code that
      gets into production.&amp;nbsp; Coding for fun generally glazes over the details, details
      are what makes software hard.&amp;nbsp; I've also found it to be beneficial to work with
      really smart people, they push you, you push them.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;I still keep in contact with the ninja's that worked for me to setup
      what we had thought was a decent development organization.&amp;nbsp; 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.&amp;nbsp; I'm cuttin' code pretty much
      every day.&amp;nbsp; 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.&amp;nbsp; 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.&amp;nbsp; 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.&amp;nbsp;&amp;nbsp;Kudos to them, I have a lot of respect for
      what they do.&lt;/font&gt; 
   &lt;li&gt;
      &lt;font size=3&gt;It appears that more and more&amp;nbsp;companies tend to rely on libraries
      and third party and open source&amp;nbsp;technologies.&amp;nbsp; 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.&amp;nbsp; If you are working on a large system, it may be better
      to re-invent the wheel.&amp;nbsp; 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.&amp;nbsp; 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.&amp;nbsp; 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.&amp;nbsp; Spend the time up front, think through your architecture
      and requirements.&amp;nbsp; 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.&amp;nbsp; Sometimes just dropping in a library introduces problems as noted by
      Joel Spolsky's &lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;&lt;font color=#003399&gt;Law
      of leaky abstractions&lt;/font&gt;&lt;/a&gt;.&amp;nbsp; &lt;/font&gt;
   &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/Sunset.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;font size=3&gt;Well I guess I should probably clo&lt;/font&gt;&lt;font size=3&gt;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.&amp;nbsp; 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.&amp;nbsp; As to being at the 1/2 way point in my career, I’m still trying to build
   the “&lt;a href="http://en.wikipedia.org/wiki/Killer_application"&gt;&lt;font color=#003399&gt;Killer
   App&lt;/font&gt;&lt;/a&gt;” who knows….&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;font size=3&gt;-ec&amp;nbsp;&amp;nbsp; &lt;/font&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=37e0fc35-9aa9-4e10-80f7-a1d348440121" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,37e0fc35-9aa9-4e10-80f7-a1d348440121.aspx</comments>
      <category>Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=a7197142-1656-490b-b003-8cccb13e2f7a</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,a7197142-1656-490b-b003-8cccb13e2f7a.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,a7197142-1656-490b-b003-8cccb13e2f7a.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a7197142-1656-490b-b003-8cccb13e2f7a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="3">I belive the following is accurate for developing 95% of business applications:</font>
        </p>
        <ol>
          <li>
            <div class="MsoNormal" style="MARGIN: 0in 0in 0pt">
              <font color="#000000">
                <font size="3">
                  <font face="Calibri">People
            buy software to solve problems, that can be making their life easier, making money
            or providing pleasure (don’t read too much in to that </font>
                  <span style="FONT-FAMILY: Wingdings; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-char-type: symbol; mso-symbol-font-family: Wingdings">
                    <span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">J</span>
                  </span>
                  <font face="Calibri">)</font>
                </font>
              </font>
            </div>
          </li>
          <li>
            <div class="MsoNormal" style="MARGIN: 0in 0in 0pt">
              <font color="#000000">
                <font face="Calibri" size="3">Features
            enable solutions to problems.</font>
              </font>
            </div>
          </li>
          <li>
            <div class="MsoNormal" style="MARGIN: 0in 0in 0pt">
              <font color="#000000">
                <font face="Calibri" size="3">When
            we write software, we build features.</font>
              </font>
            </div>
          </li>
          <li>
            <div class="MsoNormal" style="MARGIN: 0in 0in 0pt">
              <font color="#000000">
                <font face="Calibri" size="3">With
            the right level of abstraction there is a common and finite set of features to be
            implemented in code.</font>
              </font>
            </div>
          </li>
          <li>
            <div class="MsoNormal" style="MARGIN: 0in 0in 0pt">
              <font color="#000000">
                <font face="Calibri">
                  <font size="3">Applications
            should be built by tailoring features to solve a user problem.<span style="mso-spacerun: yes">  </span></font>
                </font>
              </font>
            </div>
          </li>
          <li>
            <div class="MsoNormal" style="MARGIN: 0in 0in 0pt">
              <font color="#000000">
                <font face="Calibri" size="3">If
            tailoring features has to be done by writing code, so be it, but this is very costly
            in terms of time and money.</font>
              </font>
            </div>
          </li>
          <li>
            <div class="MsoNormal" style="MARGIN: 0in 0in 0pt">
              <font color="#000000">
                <font face="Calibri">
                  <font size="3">It’s
            preferable to have this done via configuration.</font>
                </font>
              </font>
            </div>
          </li>
        </ol>
        <p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
          <font face="Calibri" color="#000000" size="3">-ec</font>
        </p>
        <p>
       
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=a7197142-1656-490b-b003-8cccb13e2f7a" />
      </body>
      <title>Software Development Moment of Clarity</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,a7197142-1656-490b-b003-8cccb13e2f7a.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,a7197142-1656-490b-b003-8cccb13e2f7a.aspx</link>
      <pubDate>Tue, 21 Oct 2008 21:38:03 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font size=3&gt;I belive the following is accurate for developing 95% of business applications:&lt;/font&gt;
&lt;/p&gt;
&lt;ol&gt;
   &lt;li&gt;
      &lt;div class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;font color=#000000&gt;&lt;font size=3&gt;&lt;font face=Calibri&gt;People
         buy software to solve problems, that can be making their life easier, making money
         or providing pleasure (don’t read too much in to that &lt;/font&gt;&lt;span style="FONT-FAMILY: Wingdings; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;&lt;span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;J&lt;/span&gt;&lt;/span&gt;&lt;font face=Calibri&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
      &lt;/div&gt;
   &lt;li&gt;
      &lt;div class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;font color=#000000&gt;&lt;font face=Calibri size=3&gt;Features
         enable solutions to problems.&lt;/font&gt;&lt;/font&gt;
      &lt;/div&gt;
   &lt;li&gt;
      &lt;div class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;font color=#000000&gt;&lt;font face=Calibri size=3&gt;When
         we write software, we build features.&lt;/font&gt;&lt;/font&gt;
      &lt;/div&gt;
   &lt;li&gt;
      &lt;div class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;font color=#000000&gt;&lt;font face=Calibri size=3&gt;With
         the right level of abstraction there is a common and finite set of features to be
         implemented in code.&lt;/font&gt;&lt;/font&gt;
      &lt;/div&gt;
   &lt;li&gt;
      &lt;div class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;font color=#000000&gt;&lt;font face=Calibri&gt;&lt;font size=3&gt;Applications
         should be built by tailoring features to solve a user problem.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
      &lt;/div&gt;
   &lt;li&gt;
      &lt;div class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;font color=#000000&gt;&lt;font face=Calibri size=3&gt;If
         tailoring features has to be done by writing code, so be it, but this is very costly
         in terms of time and money.&lt;/font&gt;&lt;/font&gt;
      &lt;/div&gt;
   &lt;li&gt;
      &lt;div class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;font color=#000000&gt;&lt;font face=Calibri&gt;&lt;font size=3&gt;It’s
         preferable to have this done via configuration.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
      &lt;/div&gt;
   &lt;/li&gt;
&lt;/ol&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;font face=Calibri color=#000000 size=3&gt;-ec&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=a7197142-1656-490b-b003-8cccb13e2f7a" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,a7197142-1656-490b-b003-8cccb13e2f7a.aspx</comments>
      <category>Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=808a4bef-f5c6-4e28-a50a-2d21edcd642c</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,808a4bef-f5c6-4e28-a50a-2d21edcd642c.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,808a4bef-f5c6-4e28-a50a-2d21edcd642c.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=808a4bef-f5c6-4e28-a50a-2d21edcd642c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <img style="FLOAT: right; MARGIN-LEFT: 5px" src="http://www.efficientcoder.com/content/binary/WinRevolution.jpg" border="0" />
        <p>
      Got a great tip from listening to the pod cast at <a href="http://www.stackoverflow.com/">http://www.stackoverflow.com/</a> (if
      you don't subscribe you should!).  <a href="http://www.codinghorror.com/">Jeff
      Atwood</a> in passing mentioned a program I've been looking for, for a long time. 
      It's called <a href="http://www.winsplit-revolution.com/">WinSplit Revolution</a>. 
      I'm big time into multiple monitors, here's a <a href="http://www.efficientcoder.com/PermaLink,guid,4e6081dc-2afd-4b61-bf69-ebb08b99f3d6.aspx">picture</a> of
      my previous setup, my current one is similar, but have a 24" as my main monitor, then
      two 21" on each side and finally a 900x1440 off to the left.
   </p>
        <ul>
          <li>
         My center monitor is used for editing source code editing, my primary source
         of revenue.  
      </li>
          <li>
         Left 21" monitor has all the extra VS.NET windows such as solution explorer, output,
         error windows etc... 
      </li>
          <li>
         Right 21" monitor has the output of the project I'm working, usually have IE
         and Firefox open. 
      </li>
          <li>
         I <span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA">recently </span>added
         back in the far left monitor, a 900x1440 in portrait mode.  On this monitor,
         I've got my email and Debug View.</li>
        </ul>
        <p>
      Anyway back to the WinSplit Revolution, this program uses a CTRL-ALT-NUMPAD KEY to
      position the current quadrants on the screen.
   </p>
        <p align="center">
        </p>
        <p>
      Check this one out, you won't be sorry!
   </p>
        <p>
      -ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=808a4bef-f5c6-4e28-a50a-2d21edcd642c" />
      </body>
      <title>WinSpit Revolution</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,808a4bef-f5c6-4e28-a50a-2d21edcd642c.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,808a4bef-f5c6-4e28-a50a-2d21edcd642c.aspx</link>
      <pubDate>Fri, 13 Jun 2008 17:11:50 GMT</pubDate>
      <description>&lt;img style="FLOAT: right; MARGIN-LEFT: 5px" src="http://www.efficientcoder.com/content/binary/WinRevolution.jpg" border=0&gt; 
&lt;p&gt;
   Got a great tip from listening to the pod cast at &lt;a href="http://www.stackoverflow.com/"&gt;http://www.stackoverflow.com/&lt;/a&gt;&amp;nbsp;(if
   you don't subscribe you should!).&amp;nbsp; &lt;a href="http://www.codinghorror.com/"&gt;Jeff
   Atwood&lt;/a&gt;&amp;nbsp;in passing mentioned a program I've been looking for, for a long time.&amp;nbsp;
   It's called &lt;a href="http://www.winsplit-revolution.com/"&gt;WinSplit Revolution&lt;/a&gt;.&amp;nbsp;
   I'm big time into multiple monitors, here's a &lt;a href="http://www.efficientcoder.com/PermaLink,guid,4e6081dc-2afd-4b61-bf69-ebb08b99f3d6.aspx"&gt;picture&lt;/a&gt; of
   my previous setup, my current one is similar, but have a 24" as my main monitor, then
   two 21" on each side and finally a 900x1440 off to the left.
&lt;/p&gt;
&lt;ul&gt;
   &lt;li&gt;
      My center monitor is used for editing&amp;nbsp;source code editing, my primary source
      of revenue.&amp;nbsp; 
   &lt;li&gt;
      Left 21" monitor has all the extra VS.NET windows such as solution explorer, output,
      error windows etc... 
   &lt;li&gt;
      Right 21" monitor has the output of the project&amp;nbsp;I'm working, usually have IE
      and Firefox open. 
   &lt;li&gt;
      I &lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;recently &lt;/span&gt;added
      back in the far left monitor, a 900x1440 in portrait mode.&amp;nbsp; On this monitor,
      I've got my email and Debug View.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   Anyway back to the WinSplit Revolution, this program uses a CTRL-ALT-NUMPAD KEY to
   position the current quadrants on the screen.
&lt;/p&gt;
&lt;p align=center&gt;
&lt;/p&gt;
&lt;p&gt;
   Check this one out, you won't be sorry!
&lt;/p&gt;
&lt;p&gt;
   -ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=808a4bef-f5c6-4e28-a50a-2d21edcd642c" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,808a4bef-f5c6-4e28-a50a-2d21edcd642c.aspx</comments>
      <category>Hardware;Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=fd969e75-2583-4d61-aff6-0fef98c64615</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,fd969e75-2583-4d61-aff6-0fef98c64615.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,fd969e75-2583-4d61-aff6-0fef98c64615.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=fd969e75-2583-4d61-aff6-0fef98c64615</wfw:commentRss>
      <title>Are you doing Development or Discovery</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,fd969e75-2583-4d61-aff6-0fef98c64615.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,fd969e75-2583-4d61-aff6-0fef98c64615.aspx</link>
      <pubDate>Sat, 03 May 2008 17:43:26 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;font color=#000000 size=4&gt;&lt;strong&gt;Development
   or Discovery&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;The
   biggest cost in any software development effort is always a factor of time.&amp;nbsp;
   It became pretty obvious to me while working on a new reporting project.&amp;nbsp; I've
   worked on&amp;nbsp;a "ton" of systems over the past few years and&amp;nbsp;with very few exceptions
   I can sit down and start making tangible progress very quickly (this may not be&amp;nbsp;evident
   to my clients while I'm working on the plumbing, but that's a topic for another post)
   but with this project I've got about 4-6 hours into it and although I'm making headway
   on a couple of fronts I'm starting to sense the "churn" where it's more of&amp;nbsp;a
   discovery process than a development effort.&amp;nbsp; How much of your time is spent
   in discovery and how much in pure development?&amp;nbsp; I think the ratio of discovery
   to development is major factor in developer efficiency and thus the time/cost in a
   software development effort.&amp;nbsp; Although some external factors such as training,
   pair programming, documentation&amp;nbsp;and mature processes may help with this ratio,
   the biggest impact on the ratio will be the person doing the development.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi"&gt;&lt;font color=#000000&gt;Discovery
   does not provide any real business value.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Discovery
   is a critical investment that needs to be made.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Just
   as you invest in your financial future, you should invest in your professional one
   as well.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Once you’ve made this investment
   you start building capital, the capital can then be used to increase your Development
   time, this is where your investments should pay off.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;As
   Frederick Brooks states in his timeless classic “The difference between an exceptional
   developer and a Mediocre one is generally an order of magnitude”.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Why
   is this the case?&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;One reason is &lt;/font&gt;&lt;a href="http://www.efficientcoder.net/PermaLink,guid,cd3be132-4fc1-4acd-b42d-c85f32b62df1.aspx"&gt;&lt;span style="COLOR: windowtext"&gt;Developer
   Efficiency&lt;/span&gt;&lt;/a&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;but
   the other is the capital the developer brings to the effort.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Effective
   program manager realize this.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;When we
   talk about capital/experience/knowledge this can really be in three categories, general
   technology, domain specific, implementation specific. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi"&gt;&lt;font color=#000000&gt;&lt;strong&gt;Technology
   Capital&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi"&gt;&lt;font color=#000000&gt;You,
   my dear reader are 100% responsible for this.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;If
   you work for a corporation that’s nice in that they may pay you to learn this knowledge,
   but in the end, this is how to program an Http Handler in ASP.NET or write a SQL Query,
   create a clustered index and so on.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;These
   skills are not implementation specific.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;The
   wider background of skill sets you have the more capital you will have and the more
   value you bring.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;As a consultant, if
   I am stuck doing “discovery” on a new technology I very rarely bill the client for
   this time.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;My clients pay me to “develop”
   they assume I know they technology.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi"&gt;&lt;font color=#000000&gt;&lt;strong&gt;Domain
   Specific&lt;/strong&gt; 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi"&gt;&lt;font color=#000000&gt;This
   is where you can start developing additional capital.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Unless
   you pick on specific vertical, there will always be a portion of the time working
   on development efforts where you will be doing discovery within that domain.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;An
   example of this is my experience working in a Sales Force Automation company for 3
   years on a number of different efforts.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Although
   there was an initial learning curve in this vertical, over time the value I brought
   to the table during the system design meetings increased, the more knowledge I brought
   to the table, the quicker we could talk about what made their problems unique and
   in most cases these so-called “unique” problems were actually solved in other efforts
   and that experience could be capitalized on.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;My
   goal going forward is to pick a new domain every other year and start gaining that
   knowledge.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Have you worked in one industry
   all your life?&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;How many jobs are there
   in that industry?&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;How well are you compensated
   in your industry with respect to others?&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi"&gt;&lt;font color=#000000&gt;&lt;strong&gt;Client/Implementation
   Specific&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi"&gt;&lt;font color=#000000&gt;Now
   is where it get’s interesting, each client does indeed have certain technologies,
   systems, database schemas that are unique to their organization.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;I
   would suspect that a considerable number of developers are “experts” in this area.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;As
   a consultant I worked at one client for about 3 or 4 years.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;They
   made a considerable investment in me in their specific data, not only just the structure,
   tables but also the subject matter.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;I
   made a significant investment in time in their data.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;At
   the point I started scaling back my work on their efforts, I had a much better understanding
   of the data within their systems then anyone did internally.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;This
   was a great engagement for both parties (Client &amp;amp; Software Logistics) however
   when I look back over those 3 or 4 years, what can I take away from that client specific
   data knowledge?&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Not very much as it turns
   out.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;From a billing perspective, I don’t
   have any problem doing “discovery” of a clients systems on their “nickel” especially
   if in the long run that knowledge won’t be useful anywhere but their systems.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi"&gt;&lt;font color=#000000&gt;The
   bottom line is in software development, the more capital you bring to the table, the
   less time you are doing discovery and the more time you do performing development.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;You
   are paid by your organization as an employee or a consultant to do development and
   not discovery.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   -ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=fd969e75-2583-4d61-aff6-0fef98c64615" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,fd969e75-2583-4d61-aff6-0fef98c64615.aspx</comments>
      <category>Software Engineering;Software Metrics</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=21e6516c-079f-457d-a959-c1b2fa5cc832</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,21e6516c-079f-457d-a959-c1b2fa5cc832.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,21e6516c-079f-457d-a959-c1b2fa5cc832.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=21e6516c-079f-457d-a959-c1b2fa5cc832</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="4">Putting your Trust in Metrics</font>
        </p>
        <p>
      I'm a big fan of automating as much as you can, but blindly automating processes controlled
      by metrics may cause more problems than they solve.  The idea behind capturing
      metrics or in the case I'm currently working on, writing a suite of unit tests is
      to automate the testing so I can make changes at-will, run my unit test and know everything
      is still working good.  If I come to rely on these unit tests (or really any
      sort of metrics) to help me make business decisions as to when I am code
      complete and ready to ship;unless I'm 100% sure that the unit tests take into account
      99.99% of all the edge cases; I'm doing the recipients of the software a disservice. 
      As an efficient coder, I want to take what the customer tells me they need and turn
      it into the compiled bits that successfully solve their problem in a straight of a
      line as possible.  Unit testing and other software related automated processes
      go a long ways to helping ensure an efficient path, but as these automated processes
      are developed we need to pay special attention to make sure these are complete. 
      In a large sense, if you are capturing KPI or Key Performance Indicators about your
      organizations performance, are you sure that the core measures you capture are indeed
      complete and accurate?  Remember the purpose of capturing these metrics is to
      influence business decisions.  If your metrics are not accurate or your measures
      just can't be trusted, there are three core problems that this causes.  First
      it clouds the judgment of the people directing the efforts, they may think they need
      to do A, but the metrics tell them B really needs to happen, A is clearly the right
      thing to do, but since B is out there as a potential solution it may dilute the affect
      of implementing A.  Second it puts in place a false sense that you are indeed
      doing something to solve your problems and all you are really doing is delaying the
      true solution costing the most valuable asset in software development, time. 
      Finally it takes time to capture metrics and if done properly it is a great tool. 
      If your metrics are worthless you waste the peoples time building the infrastructure
      to capture the metrics, you waste the peoples time to capture the metrics and you
      may even unintentionally sabotage future metrics capturing initiatives.
   </p>
        <p>
      In a previous post I discussed the race car analogy, where the drivers have a significant
      amount of safety gear in their cars.  They need to be 99.99% sure that if they get
      in an accident the gear will do it's job and protect them.  If they can
      rely on their gear, they can take more risks to give themselves a competitive
      edge.  Are your sure the test cases, scenarios and metrics your are employing
      would help you prevent or survive a crash and give you a competitive edge?
   </p>
        <p>
      -ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=21e6516c-079f-457d-a959-c1b2fa5cc832" />
      </body>
      <title>Putting your Trust in Metrics</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,21e6516c-079f-457d-a959-c1b2fa5cc832.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,21e6516c-079f-457d-a959-c1b2fa5cc832.aspx</link>
      <pubDate>Mon, 10 Mar 2008 14:17:28 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font size=4&gt;Putting your Trust in Metrics&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   I'm a big fan of automating as much as you can, but blindly automating processes controlled
   by metrics may cause more problems than they solve.&amp;nbsp; The idea behind capturing
   metrics or in the case I'm currently working on, writing a suite of unit tests is
   to automate the testing so I can make changes at-will, run my unit test and know everything
   is still working good.&amp;nbsp; If I come to rely on these unit tests (or really any
   sort of metrics) to help&amp;nbsp;me make&amp;nbsp;business decisions as to when I am code
   complete and ready to ship;unless I'm 100% sure that the unit tests take into account
   99.99% of all the edge cases; I'm doing&amp;nbsp;the recipients of the software a disservice.&amp;nbsp;
   As an efficient coder, I want to take what the customer tells me they need and turn
   it into the compiled bits that successfully solve their problem in a straight of a
   line as possible.&amp;nbsp; Unit testing and other software related automated processes
   go a long ways to helping ensure an efficient path, but as these automated processes
   are developed we need to pay special attention to make sure these are complete.&amp;nbsp;
   In a large sense, if you are capturing KPI or Key Performance Indicators about your
   organizations performance, are you sure that the core measures you capture are indeed
   complete and accurate?&amp;nbsp; Remember the purpose of capturing these metrics is to
   influence business decisions.&amp;nbsp; If your metrics are not accurate or your measures
   just can't be trusted, there are three core problems that this causes.&amp;nbsp; First
   it clouds the judgment of the people directing the efforts, they may think they need
   to do A, but the metrics tell them B really needs to happen, A is clearly the right
   thing to do, but since B is out there as a potential solution it may dilute the affect
   of implementing A.&amp;nbsp; Second it puts in place a false sense that you are indeed
   doing something to solve your problems and all you are really doing is delaying the
   true solution costing the most valuable asset in software development, time.&amp;nbsp;
   Finally it takes time to capture metrics and if done properly it is a great tool.&amp;nbsp;
   If your metrics are worthless you waste the peoples time building the infrastructure
   to capture the metrics, you waste the peoples time to capture the metrics and you
   may even unintentionally sabotage future metrics capturing initiatives.
&lt;/p&gt;
&lt;p&gt;
   In a previous post I discussed the race car analogy, where the drivers have a&amp;nbsp;significant
   amount of safety gear in their cars.&amp;nbsp; They need to be 99.99% sure that if they&amp;nbsp;get
   in an accident&amp;nbsp;the gear will do it's job and protect them.&amp;nbsp; If they can
   rely on their gear,&amp;nbsp;they can take more risks to give themselves a competitive
   edge.&amp;nbsp; Are your sure the test cases, scenarios and metrics your are employing
   would help you prevent or survive a crash and give you a competitive edge?
&lt;/p&gt;
&lt;p&gt;
   -ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=21e6516c-079f-457d-a959-c1b2fa5cc832" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,21e6516c-079f-457d-a959-c1b2fa5cc832.aspx</comments>
      <category>Software Engineering;Software Metrics</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=2ea3c8bd-d594-4bfe-ab75-d0d23448d938</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,2ea3c8bd-d594-4bfe-ab75-d0d23448d938.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,2ea3c8bd-d594-4bfe-ab75-d0d23448d938.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=2ea3c8bd-d594-4bfe-ab75-d0d23448d938</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h4>DevConn 2007
   </h4>
        <img style="FLOAT: right" src="http://www.efficientcoder.com/content/binary/LVFALL07DEVCELL05.jpg" border="0" />
        <p>
      I had a hard time convincing my self to go to Fall DevConnections 2007 in Las Vegas. 
      I was really glad I went, I think I'm finally feeling that I'm on the tail end of
      the learning curve with the new technology releases from Microsoft.  I can't
      by any stretch of my imagination an expert in any of the new technologies but at least
      with some recent development experiences and attending numerous sessions over the
      past few days at think I've got a good lay of the land, at least to a point where
      I have a good sense of the capabilities of the new technologies and should be able
      to match up a problem to the right solution.  
   </p>
        <p>
          <strong>Here are some of my findings from this conference:</strong>
          <br />
      1) I'm anxious to start using VS.NET 2008 (to be released later November), specifically
      I'm interested in the better support for developing AJAX sites with intellisense and
      script debugging.  I'm also interested to see the performance enhancements in
      the new product.  I'm starting to get a little frustrated with some performance
      issues in VS.NET 2005.
   </p>
        <p>
      2) I'm starting to "feel-the-love" with Silverlight 1.0.  Although it's extremely
      exciting to think that Silverlight 1.1 can be programmed with any .NET languages
      instead of just JavaScript as in 1.0, I'm just not there yet for 1.1.  I
      like it that there is a nice and small 1-2MB file that can be loaded and
      installed with little to no friction is great for 1.0, but although I appreciate the
      ambition of moving .NET into all the different worlds with Silverlight 1.1 I think
      there might be too many moving parts.  I think the XAML Browsers applications are
      probably a better alternative...we will see, I sincerely hope to be proved wrong :).
   </p>
        <p>
      3) I think I'm starting to feel a little better about LINQ as well.  In the past LINQ
      seems to have been presented as a completely different way of working with data, well
      yes it is, but in demos I've seen this was going to start leaking into the UI layer. 
      It seems like there are two really different uses for LINQ, the first working with
      pure objects via collections of different sorts, and the second is LINQ to SQL. 
      As with my previous <a href="http://www.efficientcoder.com/PermaLink,guid,c280da8b-4d5d-4d98-bdc4-29ea9e418bd4.aspx">post</a>,
      it seems like for the most part we should let the Database handle the getting/filtering
      of data and that is what LINQ to SQL does (saw some awesome demos of seeing the SQL
      that LINQ generates and the execute it).  I'm still not sold on the other approach
      (at least in the 90% apps that sit on top of a database) where we use LINQ to work
      with collections of objects.  I can see some edge cases where this might be kind
      of nice, but I just can't see this in the vast majority.  I need to get my hands
      dirty with LINQ to SQL, it might be a nice alternative to CodeGen which I'm still
      a big fan of...stay tuned.
   </p>
        <p>
      4) I attended a session on the Microsoft Sync Platform, very cool...kind of packages
      up a lot of nice features I built into a client application.  It was good verification
      that I got the architecture right!
   </p>
        <p>
      5) There are some new additions to WF in 2008, specifically the ability to create
      WCF end points for sending and receiving messages.  I can't say I completely
      understand this yet, but there most certainly appears to be some interesting capabilities
      here.  There is also a project to embed a WF designer into client applications. 
      This could get very interesting.
   </p>
        <p>
      6) It seemed like in a number of sessions I went to the presenters had one problem
      or another with their technologies, I guess this is probably a case of being on the
      tail end of the betas for Microsoft's latest releases.  I also give a few presentations
      on some of the latest cutting edge stuff and it makes me feel just a bit better that
      I'm not the only one that runs into some "technical challenges" doing demos.
   </p>
        <p>
      In summary...another good conference, the next one will be in <a href="http://www.devconnections.com/">April
      in Orlando</a> 
   </p>
        <p>
      -ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=2ea3c8bd-d594-4bfe-ab75-d0d23448d938" />
      </body>
      <title>Fall DevConnections 2007</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,2ea3c8bd-d594-4bfe-ab75-d0d23448d938.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,2ea3c8bd-d594-4bfe-ab75-d0d23448d938.aspx</link>
      <pubDate>Fri, 09 Nov 2007 13:51:23 GMT</pubDate>
      <description>&lt;h4&gt;DevConn 2007
&lt;/h4&gt;
&lt;img style="FLOAT: right" src="http://www.efficientcoder.com/content/binary/LVFALL07DEVCELL05.jpg" border=0&gt; 
&lt;p&gt;
   I had a hard time convincing my self to go to Fall DevConnections 2007 in Las Vegas.&amp;nbsp;
   I was really glad I went, I think I'm finally feeling that I'm on the tail end of
   the learning curve with the new technology releases from Microsoft.&amp;nbsp; I can't
   by any stretch of my imagination an expert in any of the new technologies but at least
   with some recent development experiences and attending numerous sessions over the
   past few days at think I've got a good lay of the land, at least to a point where
   I have a good sense of the capabilities of the new technologies and should be able
   to match up a problem to the right solution.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Here are some of my findings from this conference:&lt;/strong&gt;
   &lt;br&gt;
   1) I'm anxious to start using VS.NET 2008 (to be released later November), specifically
   I'm interested in the better support for developing AJAX sites with intellisense and
   script debugging.&amp;nbsp; I'm also interested to see the performance enhancements in
   the new product.&amp;nbsp; I'm starting to get a little frustrated with some performance
   issues in VS.NET 2005.
&lt;/p&gt;
&lt;p&gt;
   2) I'm starting to "feel-the-love" with Silverlight 1.0.&amp;nbsp; Although it's&amp;nbsp;extremely
   exciting to&amp;nbsp;think that Silverlight 1.1 can be programmed with any .NET languages
   instead of just JavaScript as in 1.0, I'm just not there yet for 1.1.&amp;nbsp;&amp;nbsp;I
   like&amp;nbsp;it that there is a nice and small&amp;nbsp;1-2MB file that can be loaded and
   installed with little to no friction is great for 1.0, but although I appreciate the
   ambition of moving .NET into all the different worlds with Silverlight 1.1 I think
   there might be too many moving parts.&amp;nbsp; I think the XAML Browsers applications&amp;nbsp;are
   probably a better alternative...we will see, I sincerely hope to be proved wrong :).
&lt;/p&gt;
&lt;p&gt;
   3) I think I'm starting to feel a little better about LINQ as well.&amp;nbsp; In the past&amp;nbsp;LINQ
   seems to have been presented as a completely different way of working with data, well
   yes it is, but in demos I've seen this was going to start leaking into the UI layer.&amp;nbsp;
   It seems like there are two really different uses for LINQ, the first working with
   pure objects via collections of different sorts, and the second is LINQ to SQL.&amp;nbsp;
   As with my previous &lt;a href="http://www.efficientcoder.com/PermaLink,guid,c280da8b-4d5d-4d98-bdc4-29ea9e418bd4.aspx"&gt;post&lt;/a&gt;,
   it seems like for the most part we should let the Database handle the getting/filtering
   of data and that is what LINQ to SQL does (saw some awesome demos of seeing the SQL
   that LINQ generates and the execute it).&amp;nbsp; I'm still not sold on the other approach
   (at least in the 90% apps that sit on top of a database) where we use LINQ to work
   with collections of objects.&amp;nbsp; I can see some edge cases where this might be kind
   of nice, but I just can't see this in the vast majority.&amp;nbsp; I need to get my hands
   dirty with LINQ to SQL, it might be a nice alternative to CodeGen which I'm still
   a big fan of...stay tuned.
&lt;/p&gt;
&lt;p&gt;
   4) I attended a session on the Microsoft Sync Platform, very cool...kind of packages
   up a lot of nice features I built into a client application.&amp;nbsp; It was good verification
   that I got the architecture right!
&lt;/p&gt;
&lt;p&gt;
   5) There are some new additions to WF in 2008, specifically the ability to create
   WCF end points for sending and receiving messages.&amp;nbsp; I can't say I completely
   understand this yet, but there most certainly appears to be some interesting capabilities
   here.&amp;nbsp; There is also a project to embed a WF designer into client applications.&amp;nbsp;
   This could get very interesting.
&lt;/p&gt;
&lt;p&gt;
   6) It seemed like in a number of sessions I went to the presenters had one problem
   or another with their technologies, I guess this is probably a case of being on the
   tail end of the betas for Microsoft's latest releases.&amp;nbsp; I also give a few presentations
   on some of the latest cutting edge stuff and it makes me feel just a bit better that
   I'm not the only one that&amp;nbsp;runs into some "technical challenges" doing demos.
&lt;/p&gt;
&lt;p&gt;
   In summary...another good conference, the next one will be in &lt;a href="http://www.devconnections.com/"&gt;April
   in Orlando&lt;/a&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   -ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=2ea3c8bd-d594-4bfe-ab75-d0d23448d938" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,2ea3c8bd-d594-4bfe-ab75-d0d23448d938.aspx</comments>
      <category>Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=c280da8b-4d5d-4d98-bdc4-29ea9e418bd4</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,c280da8b-4d5d-4d98-bdc4-29ea9e418bd4.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,c280da8b-4d5d-4d98-bdc4-29ea9e418bd4.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c280da8b-4d5d-4d98-bdc4-29ea9e418bd4</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h3>LINQ Thoughts
   </h3>
        <p>
      We'll it's been a long time since my last post, I've been extremely busy over the
      past few months, both working on The Chaos Filter as well as client work.  I
      have spent a bit of time on some new technologies that hopefully I'll get a little
      time to do some additional posts.  These include <a href="http://www.silverlight.net">Silverlight</a>, <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=BB183640-4B8F-4828-80C9-E83C3B2E7A2C&amp;displaylang=en">Microsoft
      Office Communications Server Speech Server</a>, and learned a lot from Marshall Harrison
      of <a href="http://www.gotspeech.net">GotSpeech.NET</a> fame.  I've also
      built a nifty little WCF service that does call backs to .NET clients, this could
      be very interesting.
   </p>
        <p>
      Any way, I should probably get back on topic...it seems like everyone is going ga-ga
      for LINQ, yes, I agree this is a very cool technology, but I'm just not feeling the
      love from the perspective of providing a new set of capabilities we just didn't
      have before.  Maybe it's the type of systems I build that is prompting my skepticism. 
      Most of the systems I would consider are "transactional" or maybe stateless would
      be a better description.  This includes ASP.NET web page processing and other
      services oriented programming, basically take a bit of information do something with
      it (talk to the database, store a file transform it, cook it up in a pan) and send
      something back to the user.  That's not to say however that I'm not implementing
      an object oriented approach.  It's just there is a distinct start point, interaction
      with a whole bunch of objects to do "stuff" and a distinct end point and other than
      some very simple state and context information (usually stored in some sort of persistence
      storage such as a DB) I just don't keep state in memory between transactions.
   </p>
        <p>
      Saying that, let's discuss a different class of application.  I'm currently re-inventing
      an IM server (OK, I got a good reason to do that, but that's not the point). 
      With this IM server, I'm using the WCF service as I mentioned above to make call backs
      to clients out in the cloud that have initiated a session (still need to understand
      the plumbing and underlying mechanism here, but again that's not the point). 
      So basically I have a service running in the background, clients connect and open
      a session, interact with that session and I can send call backs when invitations come
      in or send out a message to a conversation.  What this means is I'm creating
      almost an In Memory Data Store that contains relevant information to manage these
      sessions.  Basically right now, I've got everything working off of System.Collections.Generics.Dictionary
      objects where it's fairly simple to do a lookup to get basic state information for
      what I need.  Alright we are three paragraphs into this, I guess I should finally
      get back to LINQ and how it relates.  My in-memory database of state information
      is starting to get a bit more complicated and I would love a better way to do lookups
      against this database, I can see the value of LINQ in a BIG-WAY for this type of application,
      hopefully if you made it this far, you do to.  Unfortunately for this application
      it's a .NET 3.0 app, and I'm not ready to jump to .NET 3.5 to leverage this new technology. 
      So setting aside the using LINQ for relational DB access and the political debate
      that it brings, is this a valid use for LINQ in things that we just couldn't do before? 
      If so how many of us are writing these types of stateful applications of those of
      us that are writing these how many of these should actually be stateless and thus
      minimizing the impact that the new LINQ .NET 3.5 features provide?  I'm not proposing
      I have the answer here, but I'm posing the question...
   </p>
        <p>
      -ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=c280da8b-4d5d-4d98-bdc4-29ea9e418bd4" />
      </body>
      <title>LINQ Thoughts</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,c280da8b-4d5d-4d98-bdc4-29ea9e418bd4.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,c280da8b-4d5d-4d98-bdc4-29ea9e418bd4.aspx</link>
      <pubDate>Wed, 10 Oct 2007 13:35:17 GMT</pubDate>
      <description>&lt;h3&gt;LINQ Thoughts
&lt;/h3&gt;
&lt;p&gt;
   We'll it's been a long time since my last post, I've been extremely busy over the
   past few months, both working on The Chaos Filter as well as client work.&amp;nbsp; I
   have spent a bit of time on some new technologies that hopefully I'll get a little
   time to do some additional posts.&amp;nbsp; These include &lt;a href="http://www.silverlight.net"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=BB183640-4B8F-4828-80C9-E83C3B2E7A2C&amp;amp;displaylang=en"&gt;Microsoft
   Office Communications Server Speech Server&lt;/a&gt;, and learned a lot from Marshall Harrison
   of &lt;a href="http://www.gotspeech.net"&gt;GotSpeech.NET&lt;/a&gt;&amp;nbsp;fame.&amp;nbsp; I've also
   built a nifty little WCF service that does call backs to .NET clients, this could
   be very interesting.
&lt;/p&gt;
&lt;p&gt;
   Any way, I should probably get back on topic...it seems like everyone is going ga-ga
   for LINQ, yes, I agree this is a very cool technology, but I'm just not feeling the
   love from the perspective of providing&amp;nbsp;a new set of capabilities we just didn't
   have before.&amp;nbsp; Maybe it's the type of systems I build that is prompting my skepticism.&amp;nbsp;
   Most of the systems I would consider are "transactional" or maybe stateless would
   be a better description.&amp;nbsp; This includes ASP.NET web page processing and other
   services oriented programming, basically take a bit of information do something with
   it (talk to the database, store a file transform it, cook it up in a pan) and send
   something back to the user.&amp;nbsp; That's not to say however that I'm not implementing
   an object oriented approach.&amp;nbsp; It's just there is a distinct start point, interaction
   with a whole bunch of objects to do "stuff" and a distinct end point and other than
   some very simple state and context information (usually stored in some sort of persistence
   storage such as a DB) I just don't keep state in memory between transactions.
&lt;/p&gt;
&lt;p&gt;
   Saying that, let's discuss a different class of application.&amp;nbsp; I'm currently re-inventing
   an IM server (OK, I got a good reason to do that, but that's not the point).&amp;nbsp;
   With this IM server, I'm using the WCF service as I mentioned above to make call backs
   to clients out in the cloud that have initiated a session (still need to understand
   the plumbing and underlying mechanism here, but again that's not the point).&amp;nbsp;
   So basically I have a service running in the background, clients connect and open
   a session, interact with that session and I can send call backs when invitations come
   in or send out a message to a conversation.&amp;nbsp; What this means is I'm creating
   almost an In Memory Data Store that contains relevant information to manage these
   sessions.&amp;nbsp; Basically right now, I've got everything working off of System.Collections.Generics.Dictionary
   objects where it's fairly simple to do a lookup to get basic state information for
   what I need.&amp;nbsp; Alright we are three paragraphs into this, I guess I should finally
   get back to LINQ and how it relates.&amp;nbsp; My in-memory database of state information
   is starting to get a bit more complicated and I would love a better way to do lookups
   against this database, I can see the value of LINQ in a BIG-WAY for this type of application,
   hopefully if you made it this far, you do to.&amp;nbsp; Unfortunately for this application
   it's a .NET 3.0 app, and I'm not ready to jump to .NET 3.5 to leverage this new technology.&amp;nbsp;
   So setting aside the using LINQ for relational DB access and&amp;nbsp;the political debate
   that it brings, is this a valid use for LINQ in things that we just couldn't do before?&amp;nbsp;
   If so how many of us are writing these types of stateful applications of those of
   us that are writing these how many of these should actually be stateless and thus
   minimizing the impact that the new LINQ .NET 3.5 features provide?&amp;nbsp; I'm not proposing
   I have the answer here, but I'm posing the question...
&lt;/p&gt;
&lt;p&gt;
   -ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=c280da8b-4d5d-4d98-bdc4-29ea9e418bd4" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,c280da8b-4d5d-4d98-bdc4-29ea9e418bd4.aspx</comments>
      <category>Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=28b409b2-af73-45d8-b05f-5290504fcd34</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,28b409b2-af73-45d8-b05f-5290504fcd34.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,28b409b2-af73-45d8-b05f-5290504fcd34.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=28b409b2-af73-45d8-b05f-5290504fcd34</wfw:commentRss>
      <title>Hi, My name is Kevin and I'm a VS.NET Addict</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,28b409b2-af73-45d8-b05f-5290504fcd34.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,28b409b2-af73-45d8-b05f-5290504fcd34.aspx</link>
      <pubDate>Wed, 08 Aug 2007 02:37:22 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;span style="FONT-SIZE: 13.5pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Hi,
   My name is Kevin and I'm a VS.NET Junky&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;o:p&gt;
   &lt;font face=Calibri color=#000000 size=3&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Now
   what do I mean by that?&amp;nbsp; Well, I'm addicted to the Visual Studio .NET product
   line, I can't live without it, but it's starting to bring me down and I'm still looking
   for the high I got from using Visual Studio .NET 2003.&amp;nbsp; As with any humor what
   makes it funny is a small grain of truth.&amp;nbsp; I don't mean this to be negative,
   but sometimes you just need to rant.&amp;nbsp; Before I start with the negative, my mom
   always taught me to never say anything negative without positive comments first.&amp;nbsp;
   Boy is there a lot positive to say, this latest round of products from Microsoft fundamentally
   changed the way we developed web application, in such a positive way it's hard to
   put in to words.&amp;nbsp; I could go on for a long time on all the software I have in
   production right now that was written using Microsoft .NET technology.&amp;nbsp; When
   it comes down to it, us as developers aren't really here place judgment on our development
   tools, we are here to use the best tools out there to satisfy our customers’ needs
   and frankly there aren't any tools that compare.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/VS.NET.gif" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Now
   to the rant, well for the most part I have two main problems that are really starting
   to drive me nuts, first is performance and the second is VS.NET crashing.&amp;nbsp; Another
   side bar please, I've been in this industry since the early ninety’s and developing
   programs since the early eighties we've come a very long ways.&amp;nbsp; I remember a
   couple of multiyear long&amp;nbsp;projects I worked on in the mid to late nineties.&amp;nbsp;
   These were VC++ apps that literally to 30 to 45 minutes to compile each code-build-link-test
   cycle, some of us built some test harnesses to cut this down, but still it took 3
   to 5 minutes.&amp;nbsp;&amp;nbsp;As I continue my rant looking back at those projects really
   puts things in perspective.&amp;nbsp; 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;So
   what do I mean by performance issues, I have what I think is a fairy high-end developer
   machine, not like this &lt;a href="http://www.hanselman.com/blog/TheCodingHorrorUltimateDeveloperRigThrowdownPart2.aspx"&gt;monster
   machine&lt;/a&gt; that &lt;a href="http://www.hanselman.com/"&gt;&lt;font color=#0000ff&gt;Scott Hanselman&lt;/font&gt;&lt;/a&gt; put
   together (oh yes - I will have a quad core box sitting under my desk by the end of
   the summer) but a decent machine none the less, I have a Core 2 Duo running at 2.13GHz
   with 4GB ram and a decent SATA hard drive, I've also got a USB drive I'm using to
   leverage &lt;a href="http://www.microsoft.com/windows/products/windowsvista/features/details/readyboost.mspx"&gt;ReadyBoost&lt;/a&gt; on
   my Vista machine.&amp;nbsp; Here is a &lt;a href="http://www.efficientcoder.net/PermaLink,guid,4e6081dc-2afd-4b61-bf69-ebb08b99f3d6.aspx"&gt;link&lt;/a&gt; to
   a better description of my setup.&amp;nbsp; I'm currently working on a fairly large C#&amp;nbsp;solution
   with about 25&amp;nbsp;projects and 4 web applications.&amp;nbsp; The application was written
   so that the user interface is a collection of Custom Controls or more specifically
   WebParts so each time I&amp;nbsp;make updates I need to compile my control libraries or
   business objects libraries.&amp;nbsp; If my system has recently been rebooted I can usually
   do the edit-compile-test cycle in about 15-20 seconds, that includes the ASP.NET page
   recompiling with the new control library.&amp;nbsp; I have to admit, when you think about
   all the work it's doing, that is really incredible.&amp;nbsp; With this type of edit-compile-test
   cycle you can really achieve the state of flow as describe in the wonderful book &lt;a href="http://astore.amazon.com/betasoft08/detail/0932633439"&gt;PeopleWare&lt;/a&gt; productive
   projects and teams, a classic must read.&amp;nbsp; I have a terrible habit of working
   on too many things at once, I'm lucky, in that I can very quickly context switch however
   this generally results in a number of applications being open at one time on my computer.&amp;nbsp;
   After about 3-5 days of working on my Vista machine (for some crazy reason I installed
   Vista Ultimate, might that be part of the problem?) my compile times slowly start
   creeping up to where they are starting to approach 45-60 seconds.&amp;nbsp; In reality
   this just doesn't seem that long however it's just long enough to interrupt the "flow".&amp;nbsp;
   I think the thing that really makes my blood boil is when I'm watching the output
   pane in VS.NET and it says the compile completes, its 100% complete with zero errors,
   then, as I usually run my computer with task manager open, that little green bar sits
   at about 50%-75% VS.NET is non-responsive and I usually say something to my computer
   like..."That's OK, I'll just sit here and wait, no problem I don't have anything better
   to do...are you finished?...are you finished?"&amp;nbsp; (I get some strange looks from
   my better half, but I think she is getting used to it) then about 15-20 seconds later
   I can see if what I did actually worked.&amp;nbsp; Alright again only about 15-20 seconds
   but it certainly blows-the-flow.&amp;nbsp; That closes out the first part of my rant...in
   all reality, what VS.NET does is incredible, but the extra 30 seconds is just enough
   to let my mind wonder, check my emails, IM etc... (ding...maybe that's the real problem
   I have &lt;a href="http://en.wikipedia.org/wiki/Adult_attention-deficit_disorder"&gt;AADD&lt;/a&gt; and
   should look to fix my compile time issue with medications, trade one addition for
   another).&amp;nbsp; One thing that I try to do&amp;nbsp;to "keep-the-flow" going is with an
   excellent tool called &lt;a href="http://www.testdriven.net/"&gt;TestDriven.NET&lt;/a&gt; this
   get's my edit-compile-test time down to a matter of a few seconds when I'm working
   on my business logic, if you aren't using this why not?&amp;nbsp; In full disclaimer,
   I have &lt;a href="http://www.devexpress.com/Products/NET/IDETools/CodeRush"&gt;CodeRush&lt;/a&gt; and
   TestDriven.NET plug-ins installed, I don’t think they are the problem.&amp;nbsp; My prior
   machine was a 3.0GHz Pentium D&amp;nbsp;and 3GB RAM, I installed Vista Business and the
   VS2008 Beta 2 (not in a Virtual PC).&amp;nbsp; I don't plan on installing any other software
   on that machine and will see how it performs.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Rant
   number two...this one won't be nearly as long, about every 30-50th compile, as soon
   as I see that "Build Successful" message in my status bar, within a blink of eye Visual
   Studio disappears from my screen.&amp;nbsp; No error message no log entry...nothing, it's
   just gone.&amp;nbsp; I start it up and load my project (which takes between 2-3 minutes)
   and have never lost any work, but my solution settings (such as which files are open
   etc...) get lost.&amp;nbsp; Really a little annoying.&amp;nbsp; Whenever I get a free 4-5
   hours I'm going to repave the machine and only install VS.NET and the key tools necessary
   for doing development, this time I mean it for sure, really only my development apps.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;There,
   I got that off my chest after looking at the good the bad and the ugly, the reality
   of it for the size of our solutions and all the competing junk I have on my machine,
   I should be happy these compile in 5 minutes and I'm probably being greedy, but as
   with most developers I like to rant and complain.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Bottom
   line, thank you Microsoft for feeding my habit and providing me with a great (but
   not perfect) set of tools to write software to keep my clients happy and thus pay
   my bills, let’s see if we can do it a tad better in &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa700830.aspx"&gt;Orcas&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;-ec&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=28b409b2-af73-45d8-b05f-5290504fcd34" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,28b409b2-af73-45d8-b05f-5290504fcd34.aspx</comments>
      <category>ASP.NET;Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=f631d591-5738-4986-8152-14c5a7c0a6fa</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,f631d591-5738-4986-8152-14c5a7c0a6fa.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,f631d591-5738-4986-8152-14c5a7c0a6fa.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=f631d591-5738-4986-8152-14c5a7c0a6fa</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="4">Test Driven Development In the Real World</font>
        </p>
        <p>
      Well its been a couple years now and I've got enough experience doing TDD to feel
      that I can speak intelligent about what works (at least for me) using this development
      methodology.  I've seen some people say that they should never write a line of
      code before writing the tests, well that might be all-and-good for if your primary
      goal is to get an A on your test this semester, but in the real world, I'm not sure
      this is the best use of time.  Again, this is speaking from my past experience
      and the way I develop systems so your mileage may vary.<br /><br /><img src="http://www.efficientcoder.net/content/binary/logo.gif" border="0" /></p>
        <p>
      In my experience, as software developers we have to assume a certain level of stability
      in the building blocks we create.  Should we create test cases around our business
      objects that ensure when we execute a SQL Command against the database the SQL Connection
      object opens the connections and successfully executes the command?  
   </p>
        <p>
      Let's look at the Red-Green refactor cycle.  At any one time when you are developing
      software you are attempting to solve a specific problem.  If you aren't sure
      of the problem you are trying to solve you might not be ready to start coding, it
      might be time to drop back to the white-board and draw some boxes/puffy clouds,
      or you may need to revisit your data model.  Either way just getting that little
      green light to come on within your screen may prove your current API is valid, but
      I'm guessing that, the API may change a little bit once you continue on in your efforts.
   </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/StopLight.jpg" border="0" />
        </p>
        <p>
      So if you made it this far, you have an open mind and we can continue our discussion...so
      let me say this, is there a place for TDD?  Abso-fricky-lutely I just did a little
      effort that was really built as more of a test concurrent type of development effort,
      but it's almost the same thing.  This was a very complex process where we had
      a disconnected database on a remote device that synchronized with a server. 
      We had to create some new "stuff' on the device that all needed to work locally before
      we could talk to the server.  No problem you say right?  Well where it gets
      interesting is the fact that the server uses integers to establish the relationships
      between the tables, that means if I create a new record on the device, I can't use
      an integer as the primary key, because that will only be available once we look at
      the identity column on the server database.  We need to build up all our referential
      integrity on the device database using Guido's then replicate those changes back to
      the server, create the "real records" send those "real records" back down to the device
      and make sure all our relationships are still happy.  For about the past year,
      I've been very happy using NUnit, however the client I'm building this for uses VSTFS
      so built the testing using this technology...really about the same thing, just slightly
      different syntax.  My new favorite little utility <a href="http://www.testdriven.net/">TestDriven.NET</a> works
      like a charm with both.  So anyway, I was able to create some really nice scenarios
      that create the item on the device, add this to it, add that to it, change this, change
      that, then synchronize with the server and make sure the data I had on the device
      was the same as after I synchronize.
   </p>
        <p>
      Another awesome experience I had with TDD was the development of a binary serialization
      algorithm for DataSets.  This I did as a pure TDD experience, I built my tests
      for the different data types I needed to serialize, then I created the methods and
      work on this until each of the unit tests passed.
   </p>
        <p>
      My other experience wasn't so much with TDD but more of a formalized Unit Testing
      via NUnit.  I created a VB.NET ASP.NET 2.0 application, with about 150 unit tests,
      I'm not sure I gained a ton in development efficiency, however it did same my rear-end
      a couple times with my build cycle.  As part of the continuous integration environment
      that was in place for this project, we ran the unit tests, if they didn't succeed,
      we knew we shouldn't deploy.  Worked out slick and once the test were built
      it worked for "free" so that was kind of nice.
   </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/ToolChest.jpg" border="0" />
        </p>
        <p>
      So what's my final opinion on TDD?   Well just as in anything moderation...and
      finding the right tool to solve the right problem.  I'm not convinced you
      need to write a test case to make sure the set and get properties work on your business
      objects, however if you have a complicated workflow, it is certainly worth the investment
      in time.
   </p>
        <p>
      -ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=f631d591-5738-4986-8152-14c5a7c0a6fa" />
      </body>
      <title>Test Driven Development In the Real World</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,f631d591-5738-4986-8152-14c5a7c0a6fa.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,f631d591-5738-4986-8152-14c5a7c0a6fa.aspx</link>
      <pubDate>Tue, 10 Apr 2007 03:03:22 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font size=4&gt;Test Driven Development In the Real World&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   Well its been a couple years now and I've got enough experience doing TDD to feel
   that I can speak intelligent about what works (at least for me) using this development
   methodology.&amp;nbsp; I've seen some people say that they should never write a line of
   code before writing the tests, well that might be all-and-good for if your primary
   goal is to get an A on your test this semester, but in the real world, I'm not sure
   this is the best use of time.&amp;nbsp; Again, this is speaking from my past experience
   and the way I develop systems so your mileage may vary.&lt;br&gt;
   &lt;br&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/logo.gif" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   In my experience, as software developers we have to assume a certain level of stability
   in the building blocks we create.&amp;nbsp; Should we create test cases around our business
   objects that ensure when we execute a SQL Command against the database the SQL Connection
   object opens the connections and successfully executes the command?&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
   Let's look at the Red-Green refactor cycle.&amp;nbsp; At any one time when you are developing
   software you are attempting to solve a specific problem.&amp;nbsp; If you aren't sure
   of the problem you are trying to solve you might not be ready to start coding, it
   might be time to drop back to the white-board and draw some boxes/puffy&amp;nbsp;clouds,
   or you may need to revisit your data model.&amp;nbsp; Either way just getting that little
   green light to come on within your screen may prove your current API is valid, but
   I'm guessing that, the API may change a little bit once you continue on in your efforts.
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/StopLight.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   So if you made it this far, you have an open mind and we can continue our discussion...so
   let me say this, is there a place for TDD?&amp;nbsp; Abso-fricky-lutely I just did a little
   effort that was really built as more of a test concurrent type of development effort,
   but it's almost the same thing.&amp;nbsp; This was a very complex process where we had
   a disconnected database on a remote device that synchronized with a server.&amp;nbsp;
   We had to create some new "stuff' on the device that all needed to work locally before
   we could talk to the server.&amp;nbsp; No problem you say right?&amp;nbsp; Well where it gets
   interesting is the fact that the server uses integers to establish the relationships
   between the tables, that means if I create a new record on the device, I can't use
   an integer as the primary key, because that will only be available once we look at
   the identity column on the server database.&amp;nbsp; We need to build up all our referential
   integrity on the device database using Guido's then replicate those changes back to
   the server, create the "real records" send those "real records" back down to the device
   and make sure all our relationships are still happy.&amp;nbsp; For about the past year,
   I've been very happy using NUnit, however the client I'm building this for uses VSTFS
   so built the testing using this technology...really about the same thing, just slightly
   different syntax.&amp;nbsp; My new favorite little utility &lt;a href="http://www.testdriven.net/"&gt;TestDriven.NET&lt;/a&gt; works
   like a charm with both.&amp;nbsp; So anyway, I was able to create some really nice scenarios
   that create the item on the device, add this to it, add that to it, change this, change
   that, then synchronize with the server and make sure the data I had on the device
   was the same as after I synchronize.
&lt;/p&gt;
&lt;p&gt;
   Another awesome experience I had with TDD was the development of a binary serialization
   algorithm for DataSets.&amp;nbsp; This I did as a pure TDD experience, I built my tests
   for the different data types I needed to serialize, then I created the methods and
   work on this until each of the unit tests passed.
&lt;/p&gt;
&lt;p&gt;
   My other experience wasn't so much with TDD but more of a formalized Unit Testing
   via NUnit.&amp;nbsp; I created a VB.NET ASP.NET 2.0 application, with about 150 unit tests,
   I'm not sure I gained a ton in development efficiency, however it did same my rear-end
   a couple times with my build cycle.&amp;nbsp; As part of the continuous integration environment
   that was in place for this project, we ran the unit tests, if they didn't succeed,
   we knew we shouldn't deploy.&amp;nbsp; Worked out slick and once the test&amp;nbsp;were built
   it worked for "free" so that was kind of nice.
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/ToolChest.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   So what's my final opinion on TDD?&amp;nbsp;&amp;nbsp; Well just as in anything moderation...and
   finding the right&amp;nbsp;tool to solve the right problem.&amp;nbsp; I'm not convinced you
   need to write a test case to make sure the set and get properties work on your business
   objects, however if you have a complicated workflow, it is certainly worth the investment
   in time.
&lt;/p&gt;
&lt;p&gt;
   -ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=f631d591-5738-4986-8152-14c5a7c0a6fa" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,f631d591-5738-4986-8152-14c5a7c0a6fa.aspx</comments>
      <category>Software Engineering;Test Driven Development</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=0bb8af6c-4e41-4112-b4c2-ded689c19382</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,0bb8af6c-4e41-4112-b4c2-ded689c19382.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,0bb8af6c-4e41-4112-b4c2-ded689c19382.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0bb8af6c-4e41-4112-b4c2-ded689c19382</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="4">The Deadly Cycle or Keeping up with the Latest Technologies</font>
        </p>
        <p>
      As we progress through another year as Software Engineers, I'm starting to sense an
      alarming trend.  Please indulge me as I explain, if you are a software architect
      you are responsible for picking the right technologies to construct your system, to
      do this effectively you really need a fairly in-depth knowledge about the existing
      technologies or building blocks that are not only available today, but what is also
      available as either a CTP or beta release.  Now you pick the right technology
      and start constructing your system, let's say it's not a huge system, but it isn't
      trivial either, let's say you have a cycle time of 6 months.  As you build your
      system (and you picked the right technology) you will gain the experience necessary
      to master the technology, and if you planned it right and with a little luck, by the
      time you are ready to ship, they beta release you were working with go golden so you
      are set!
   </p>
        <p>
      Now you are off to your next effort and design and build a project using your newly
      acquired expertise.  Another 6 month effort, great solution and everyone is happy. 
      What's happened in the past year?  Well, another new cycle of technology came
      out requiring even more detailed understanding.  This new technology may be so
      fundamentally different that your previous experience may now be obsolete.
   </p>
        <p>
      Let's look at this another way, you know that about 1 year from now a fundamentally
      new technology is coming out, you need to build something, but you don't want build
      it off of a technology that will be obsolete when that technology so you hold off
      for the new technology.  Well your not shipping or even working on your product
      until you can get a stable CTP, even with that you run the risk of the API's changing
      by the time your technology goes live.  So you find the right time start constructing
      your system get a few months into it and -whammo- you see another technology
      that would be just perfect for your implementation that is really mutually exclusive
      to the technology you selected.  What do you do?  Just wait another 6 months
      for that technology to ship?  Probably not...
   </p>
        <p>
      What are some things we can do to minimize the impact of new technologies?
   </p>
        <p>
      Keep up with the absolute bleeding edge of technology.  There are many ways to
      do this.  In the past I only attended one professional conference a year. 
      Starting last year I attended two conferences <a href="http://www.medc2006.com">www.medc2006.com</a> and <a href="http://www.devconnections.com">www.devconnections.com</a> this
      year I'll be attending Dev Connections both in the spring and the fall, also MEDC
      2007 and MIXX so this year it will be four conferences, with the incredible number
      of new technologies being release it really only seems like the best way.  With
      the new technologies coming out there are usually a number of important subjects within
      that technology.  These conferences aren't really a good way to get a mastery
      of the technology however it does give a good overview that will let you know the
      key parts.  These are also good for determining what is real and what isn't. 
      As to this point, there really isn't a substitute for experience.  How many times
      have you been to some sort of session or demo where they say "Build an enterprise
      site within 10 minutes with no lines of code"?  Well I've got news, as Frederick
      Brooks says in the Mythical Man Month, there's no silver bullet.
   </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/MythicalManMonth1.jpg" border="0" />
        </p>
        <p>
      Another way that I think we can attempt to isolate ourselves from the rapid change
      in technology is to focus on the data.  Even if you choose to implement an SOA
      architecture (what ever you define that to be) when it comes down to it, at some
      point the rubber is going to meet the road, your going to need some objects
      with properties and method that actually does the work.  The way you factor these
      objects may be the biggest factor as to how well you can adopt the latest
      technology and put the latest and greatest user interface or offer the functionality
      provided in your objects as services.
   </p>
        <p>
      Something that may be an option, but I haven't been able to practice is move away
      from coding.  Even though some people make it look easy building non-trivial
      software is hard and complex.  Things that look good at 50,000ft start to fall
      apart if you can't also understand how they work at the 1ft level.  How many
      times have you worked with the architects in the ivory towers that haven't coded in
      years and establish the all encompassing architecture that looks good on paper, but
      when you have to start building those objects with the properties and methods just
      falls apart or you create way too many lines of code.
   </p>
        <p>
      On a final note, we need to start thinking about the software develop as business
      assets, not just lines of codes and assemblies.  What we develop should try to
      be at the right level of granularity for the task at hand.  If we build our projects
      where the majority of the business logic is in the UI, well we may have something
      we can sell and ship (which is by no means a bad thing) but we really don't have something
      that we can glue together using the latest technologies.
   </p>
        <p>
      I'm sorry I just can offer any "silver-bullets" here but sometimes recognizing the
      problem is half the battle.  I think that we as software engineers need do the
      best we can to keep up with the latest technologies, invest a significant amount of
      time reading and researching new technologies and last an probably most important
      keep our customers and end users in mind.  If we do this things will just fall
      into place, our products will ship and we will start developing the goal of not just
      developing software assets, but business assets.
   </p>
        <p>
      -ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=0bb8af6c-4e41-4112-b4c2-ded689c19382" />
      </body>
      <title>The Deadly Cycle or Keeping up with the Latest Technologies</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,0bb8af6c-4e41-4112-b4c2-ded689c19382.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,0bb8af6c-4e41-4112-b4c2-ded689c19382.aspx</link>
      <pubDate>Sun, 08 Apr 2007 20:02:20 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font size=4&gt;The Deadly Cycle or Keeping up with the Latest Technologies&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   As we progress through another year as Software Engineers, I'm starting to sense an
   alarming trend.&amp;nbsp; Please indulge me as I explain, if you are a software architect
   you are responsible for picking the right technologies to construct your system, to
   do this effectively you really need a fairly in-depth knowledge about the existing
   technologies or building blocks that are not only available today, but what is also
   available as either a CTP or beta release.&amp;nbsp; Now you pick the right technology
   and start constructing your system, let's say it's not a huge system, but it isn't
   trivial either, let's say you have a cycle time of 6 months.&amp;nbsp; As you build your
   system (and you picked the right technology) you will gain the experience necessary
   to master the technology, and if you planned it right and with a little luck, by the
   time you are ready to ship, they beta release you were working with go golden so you
   are set!
&lt;/p&gt;
&lt;p&gt;
   Now you are off to your next effort and design and build a project using your newly
   acquired expertise.&amp;nbsp; Another 6 month effort, great solution and everyone is happy.&amp;nbsp;
   What's happened in the past year?&amp;nbsp; Well, another new cycle of technology came
   out requiring even more detailed understanding.&amp;nbsp; This new technology may be so
   fundamentally different that your previous experience may now be obsolete.
&lt;/p&gt;
&lt;p&gt;
   Let's look at this another way, you know that about 1 year from now a fundamentally
   new technology is coming out, you need to build something, but you don't want build
   it off of a technology that will be obsolete when that technology so you hold off
   for the new technology.&amp;nbsp; Well your not shipping or even working on your product
   until you can get a stable CTP, even with that you run the risk of the API's changing
   by the time your technology goes live.&amp;nbsp; So you find the right time start constructing
   your system get a&amp;nbsp;few months into it and -whammo- you see another technology
   that would be just perfect for your implementation that is really mutually exclusive
   to the technology you selected.&amp;nbsp; What do you do?&amp;nbsp; Just wait another 6 months
   for that technology to ship?&amp;nbsp; Probably not...
&lt;/p&gt;
&lt;p&gt;
   What are some things we can do to minimize the impact of new technologies?
&lt;/p&gt;
&lt;p&gt;
   Keep up with the absolute bleeding edge of technology.&amp;nbsp; There are many ways to
   do this.&amp;nbsp; In the past I only attended one professional conference a year.&amp;nbsp;
   Starting last year I attended two conferences &lt;a href="http://www.medc2006.com"&gt;www.medc2006.com&lt;/a&gt; and &lt;a href="http://www.devconnections.com"&gt;www.devconnections.com&lt;/a&gt; this
   year I'll be attending Dev Connections both in the spring and the fall, also MEDC
   2007 and MIXX so this year it will be four conferences, with the incredible number
   of new technologies being release it really only seems like the best way.&amp;nbsp; With
   the new technologies coming out there are usually a number of important subjects within
   that technology.&amp;nbsp; These conferences aren't really a good way to get a mastery
   of the technology however it does give a good overview that will let you know the
   key parts.&amp;nbsp; These are also good for determining what is real and what isn't.&amp;nbsp;
   As to this point, there really isn't a substitute for experience.&amp;nbsp; How many times
   have you been to some sort of session or demo where they say "Build an enterprise
   site within 10 minutes with no lines of code"?&amp;nbsp; Well I've got news, as Frederick
   Brooks says in the Mythical Man Month, there's no silver bullet.
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/MythicalManMonth1.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   Another way that I think we can attempt to isolate ourselves from the rapid change
   in technology is to focus on the data.&amp;nbsp; Even if you choose to implement an SOA
   architecture (what ever you define that to be) when it comes down to&amp;nbsp;it, at some
   point&amp;nbsp;the rubber is going to meet the road, your going to need&amp;nbsp;some objects
   with properties and method that actually does the work.&amp;nbsp; The way you factor these
   objects&amp;nbsp;may be&amp;nbsp;the biggest factor as to how well you can adopt the latest
   technology and put the latest and greatest user interface or offer the functionality
   provided in your objects as services.
&lt;/p&gt;
&lt;p&gt;
   Something that may be an option, but I haven't been able to practice is move away
   from coding.&amp;nbsp; Even though some people make it look easy building non-trivial
   software is hard and complex.&amp;nbsp; Things that look good at 50,000ft start to fall
   apart if you can't also understand how they work at the 1ft level.&amp;nbsp; How many
   times have you worked with the architects in the ivory towers that haven't coded in
   years and establish the all encompassing architecture that looks good on paper, but
   when you have to start building those objects with the properties and methods just
   falls apart or you create way too many lines of code.
&lt;/p&gt;
&lt;p&gt;
   On a final note, we need to start thinking about the software develop as business
   assets, not just lines of codes and assemblies.&amp;nbsp; What we develop should try to
   be at the right level of granularity for the task at hand.&amp;nbsp; If we build our projects
   where the majority of the business logic is in the UI, well we may have something
   we can sell and ship (which is by no means a bad thing) but we really don't have something
   that we can glue together using the latest technologies.
&lt;/p&gt;
&lt;p&gt;
   I'm sorry I just can offer any "silver-bullets" here but sometimes recognizing the
   problem is half the battle.&amp;nbsp; I think that we as software engineers need do the
   best we can to keep up with the latest technologies, invest a significant amount of
   time reading and researching new technologies and last an probably most important
   keep our customers and end users in mind.&amp;nbsp; If we do this things will just fall
   into place, our products will ship and we will start developing the goal of not just
   developing software assets, but business assets.
&lt;/p&gt;
&lt;p&gt;
   -ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=0bb8af6c-4e41-4112-b4c2-ded689c19382" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,0bb8af6c-4e41-4112-b4c2-ded689c19382.aspx</comments>
      <category>Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=38404778-b164-4d4a-9ae7-2ff6cd9867fa</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,38404778-b164-4d4a-9ae7-2ff6cd9867fa.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,38404778-b164-4d4a-9ae7-2ff6cd9867fa.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=38404778-b164-4d4a-9ae7-2ff6cd9867fa</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
          <font face="Calibri">
            <font color="#000000" size="4">
              <strong>Another Strategy/Tactics
      Post</strong>
            </font>
          </font>
        </p>
        <p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
          <strong>
            <font face="Calibri" color="#000000" size="4">
            </font>
          </strong> 
   </p>
        <p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
          <font face="Calibri">
            <font color="#000000" size="3">As I look over the last 6 years
      as a consultant, one thing becomes very clear, technical solutions by themselves will
      only get you so far.<span style="mso-spacerun: yes">  </span>As a great leader
      once said </font>
            <b style="mso-bidi-font-weight: normal">
              <span style="FONT-SIZE: 14pt; COLOR: #00b050">“</span>
            </b>
            <b style="mso-bidi-font-weight: normal">
              <span style="FONT-SIZE: 14pt; COLOR: #00b050; mso-bidi-font-family: Arial">Good <span style="mso-bidi-font-weight: bold">tactics
      can save</span> even the worst <span style="mso-bidi-font-weight: bold">strategy</span>.
      Bad <span style="mso-bidi-font-weight: bold">tactics</span> will destroy even the
      best <span style="mso-bidi-font-weight: bold">strategy”</span></span>
            </b>
            <span style="COLOR: black; mso-bidi-font-weight: bold; mso-bidi-font-family: Arial">
              <font size="3"> (George
      S. Patton) this is very true for software development, but with a slight twist. 
      As long as you continue an effective tactical operation, the problems with the strategy
      may remain hidden.</font>
            </span>
          </font>
        </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/gsp.jpg" border="0" />
        </p>
        <p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
          <span style="COLOR: black; mso-bidi-font-weight: bold; mso-bidi-font-family: Arial">
            <font size="3">
              <font face="Calibri">From
      2001-2005 I developed a mission critical system for a very large company, over the
      course of these years, I did what it took (including searching out Internet café’s
      in Key West) to keep this system operating as efficiently as possible.<span style="mso-spacerun: yes">  </span>As
      an outside technical development asset, my primary mission was make sure I kept the
      business constituents happy, the scope of the change I could affect on the organization
      was limited, for long term, this change would be required to embrace and
      support system.<span style="mso-spacerun: yes">  </span>As I left this engagement
      in early 2006, it was clear that this system was not going to be properly supported.<span style="mso-spacerun: yes">  </span>In
      March of 2007 for better or worse, Software Logistics was re-engaged on this effort
      and will make a significant positive impact.</font>
            </font>
          </span>
        </p>
        <p>
        </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/SunSet.jpg" border="0" />
        </p>
        <p>
          <span style="COLOR: black; mso-bidi-font-weight: bold; mso-bidi-font-family: Arial">
            <font face="Calibri" size="3">So
      how does this come back to my original quote from GSP?<span style="mso-spacerun: yes">  </span>In
      this effort I worked on the <a href="http://www.e-myth.com/"><font face="Calibri" color="#0000ff" size="3">“Product”
      and very little on the “Process”</font></a><font size="3"><font face="Calibri">.<span style="mso-spacerun: yes">  </span>The
      product succeeded at the tactical level with assistance of Internet cafés in Key West,
      however at the strategic level the proper systems and protocols where not being put
      in place.  It was clear the technical/tactical part of the solution was sound
      however the strategic part needed some help.   W</font></font>hat was required
      for long term success on this project was a complementary skill set.<span style="mso-spacerun: yes">  </span>Enter
      my business partner </font>
            <a href="http://www.davidemccracken.com/">
              <font face="Calibri" size="3">David
      E. McCracken</font>
            </a>
            <font face="Calibri" size="3">, I’m extremely excited to work
      with Dave on this project going forward.<span style="mso-spacerun: yes">   </span>There
      is a considerable amount of power and flexibility within the system that was developed
      however this power and flexibility came at a cost of an investment in understanding
      two domains, the first being a non-trivial understanding of the subject matter data
      and the second being an understanding of the architecture.  The adoption beyond
      the immediate team required considerable effort that in some way is mutually
      exclusive to the day-to-day activities.  <span style="mso-spacerun: yes"> 
      This effort is not in creating the code, stored procedures or even the documentation
      around these software artifacts.  This effort is in making sure that our tactical
      efforts that we perform as software engineers today not only satisfy the immediate
      and pressing needs of the business, but also are done is such a way that they can
      be repeated on a consistent and predictable fashion in to support strategic
      goals.  In the short term tactics can make up for poor strategics, however
      in the long run this is not a sustainable model.  Some great gems of knowledge
      can be found on <a href="http://www.davidemccracken.com">David's blog</a> on
      some ideas on how these efforts can take place.</span></font>
          </span>
        </p>
        <p>
          <span style="COLOR: black; mso-bidi-font-weight: bold; mso-bidi-font-family: Arial">
            <font face="Calibri" size="3">
              <span style="mso-spacerun: yes">Bottom
      line is how much are you working to satisfy your business constituent's tactical and
      immediate needs and how many fail-safes do you have in place to ensure the long term
      strategic organizational goals?  Do you have the right infrastructure in place
      for both these equally important journeys?</span>
            </font>
          </span>
        </p>
        <p>
          <span style="COLOR: black; mso-bidi-font-weight: bold; mso-bidi-font-family: Arial">
            <font face="Calibri" size="3">
              <span style="mso-spacerun: yes">-ec</span>
            </font>
          </span>
        </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=38404778-b164-4d4a-9ae7-2ff6cd9867fa" />
      </body>
      <title>Another Strategy/Tactics Post</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,38404778-b164-4d4a-9ae7-2ff6cd9867fa.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,38404778-b164-4d4a-9ae7-2ff6cd9867fa.aspx</link>
      <pubDate>Sat, 31 Mar 2007 03:21:34 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;font face=Calibri&gt;&lt;font color=#000000 size=4&gt;&lt;strong&gt;Another Strategy/Tactics Post&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;strong&gt;&lt;font face=Calibri color=#000000 size=4&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;font face=Calibri&gt;&lt;font color=#000000 size=3&gt;As I look over the last 6 years as a
   consultant, one thing becomes very clear, technical solutions by themselves will only
   get you so far.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;As a great leader once
   said &lt;/font&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="FONT-SIZE: 14pt; COLOR: #00b050"&gt;“&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="FONT-SIZE: 14pt; COLOR: #00b050; mso-bidi-font-family: Arial"&gt;Good &lt;span style="mso-bidi-font-weight: bold"&gt;tactics
   can save&lt;/span&gt; even the worst &lt;span style="mso-bidi-font-weight: bold"&gt;strategy&lt;/span&gt;.
   Bad &lt;span style="mso-bidi-font-weight: bold"&gt;tactics&lt;/span&gt; will destroy even the
   best &lt;span style="mso-bidi-font-weight: bold"&gt;strategy”&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: black; mso-bidi-font-weight: bold; mso-bidi-font-family: Arial"&gt;&lt;font size=3&gt; (George
   S. Patton) this is very true for software development, but with a slight twist.&amp;nbsp;
   As long as you continue an effective tactical operation, the problems with the strategy
   may remain hidden.&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/gsp.jpg" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="COLOR: black; mso-bidi-font-weight: bold; mso-bidi-font-family: Arial"&gt;&lt;font size=3&gt;&lt;font face=Calibri&gt;From
   2001-2005 I developed a mission critical system for a very large company, over the
   course of these years, I did what it took (including searching out Internet café’s
   in Key West) to keep this system operating as efficiently as possible.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;As
   an outside technical development asset, my primary mission was make sure I kept the
   business constituents happy, the scope of the change I could affect on the organization
   was limited, for long term, this&amp;nbsp;change would be required to embrace&amp;nbsp;and
   support&amp;nbsp;system.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;As I left this engagement
   in early 2006, it was clear that this system was not going to be properly supported.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;In
   March of 2007 for better or worse, Software Logistics was re-engaged on this effort
   and will make a significant positive impact.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/SunSet.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="COLOR: black; mso-bidi-font-weight: bold; mso-bidi-font-family: Arial"&gt;&lt;font face=Calibri size=3&gt;So
   how does this come back to my original quote from GSP?&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;In
   this effort I worked on the &lt;a href="http://www.e-myth.com/"&gt;&lt;font face=Calibri color=#0000ff size=3&gt;“Product”
   and very little on the “Process”&lt;/font&gt;&lt;/a&gt;&lt;font size=3&gt;&lt;font face=Calibri&gt;.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;The
   product succeeded at the tactical level with assistance of Internet cafés in Key West,
   however at the strategic level the proper systems and protocols where not being put
   in place.&amp;nbsp; It was clear the technical/tactical part of the solution was sound
   however the strategic part needed some help.&amp;nbsp;&amp;nbsp; W&lt;/font&gt;&lt;/font&gt;hat was required
   for long term success on this project was a complementary skill set.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Enter
   my&amp;nbsp;business partner &lt;/font&gt;&lt;a href="http://www.davidemccracken.com/"&gt;&lt;font face=Calibri size=3&gt;David
   E. McCracken&lt;/font&gt;&lt;/a&gt;&lt;font face=Calibri size=3&gt;, I’m extremely excited to work with
   Dave on this project going forward.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;There
   is a considerable amount of power and flexibility within the system that was developed
   however this power and flexibility came at a cost of an investment in understanding
   two domains, the first being a non-trivial understanding of the subject matter data
   and the second being an understanding of the architecture.&amp;nbsp; The adoption beyond
   the immediate team required considerable effort that in some way&amp;nbsp;is mutually
   exclusive to the day-to-day activities.&amp;nbsp; &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;
   This effort is not in creating the code, stored procedures or even the documentation
   around these software artifacts.&amp;nbsp; This effort is in making sure that our tactical
   efforts that we perform as software engineers&amp;nbsp;today not only satisfy the immediate
   and pressing needs of the business, but also are done is such a way that they can
   be repeated on a consistent and predictable fashion in&amp;nbsp;to&amp;nbsp;support strategic
   goals.&amp;nbsp;&amp;nbsp;In the short term tactics can make up for poor strategics, however
   in the long run this is not a sustainable model.&amp;nbsp; Some great gems of knowledge
   can be found on &lt;a href="http://www.davidemccracken.com"&gt;David's blog&lt;/a&gt;&amp;nbsp;on
   some ideas on how these efforts can take place.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="COLOR: black; mso-bidi-font-weight: bold; mso-bidi-font-family: Arial"&gt;&lt;font face=Calibri size=3&gt;&lt;span style="mso-spacerun: yes"&gt;Bottom
   line is how much are you working to satisfy your business constituent's tactical and
   immediate needs and how many fail-safes do you have in place to ensure the long term
   strategic organizational goals?&amp;nbsp; Do you have the right infrastructure in place
   for both these equally important journeys?&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="COLOR: black; mso-bidi-font-weight: bold; mso-bidi-font-family: Arial"&gt;&lt;font face=Calibri size=3&gt;&lt;span style="mso-spacerun: yes"&gt;-ec&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=38404778-b164-4d4a-9ae7-2ff6cd9867fa" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,38404778-b164-4d4a-9ae7-2ff6cd9867fa.aspx</comments>
      <category>Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=7e520102-569c-4754-bf35-89f76ae38ef1</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,7e520102-569c-4754-bf35-89f76ae38ef1.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,7e520102-569c-4754-bf35-89f76ae38ef1.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=7e520102-569c-4754-bf35-89f76ae38ef1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="4">
            <strong>DevConnection Orlando 2007 - Day 1</strong>
          </font>
        </p>
        <p>
       
   </p>
        <p>
      I was up in the air as to going to DevConnections earlier this March, but after making
      the decision and attending Day 1, I'm extremely glad I showed up.
   </p>
        <img src="http://www.efficientcoder.net/content/binary/Sp07DevCell6.jpg" border="0" />
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=7e520102-569c-4754-bf35-89f76ae38ef1" />
      </body>
      <title>DevConnection Orlando 2007 - Day 1</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,7e520102-569c-4754-bf35-89f76ae38ef1.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,7e520102-569c-4754-bf35-89f76ae38ef1.aspx</link>
      <pubDate>Tue, 27 Mar 2007 02:06:26 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font size=4&gt;&lt;strong&gt;DevConnection Orlando 2007 - Day 1&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   I was up in the air as to going to DevConnections earlier this March, but after making
   the decision and attending Day 1, I'm extremely glad I showed up.
&lt;/p&gt;
&lt;img src="http://www.efficientcoder.net/content/binary/Sp07DevCell6.jpg" border=0&gt;&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=7e520102-569c-4754-bf35-89f76ae38ef1" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,7e520102-569c-4754-bf35-89f76ae38ef1.aspx</comments>
      <category>Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=06c3c822-8da7-42c5-9719-f698a1714bbd</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,06c3c822-8da7-42c5-9719-f698a1714bbd.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,06c3c822-8da7-42c5-9719-f698a1714bbd.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=06c3c822-8da7-42c5-9719-f698a1714bbd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h4>It's not a destination, it's the journey
   </h4>
        <p>
      While trying to implement a Project Delivery Optimization initiative, it's not the
      destination it's the journey.  Where you want to get to has a lot to do with
      where you are.  As you set off on the road to "make-things-better" when delivering
      software you need to look for the right steps to make increment improvements today
      without limiting your options in the future.  The processes and tool you
      need to take you to the next level will serve as a set of building blocks for the
      level after that.  There is nothing wrong with incremental gains, however as
      you decide on a process, tool or technology, you should have an understanding of what
      their limits are what can be done when you hit those limits.  For any non-trivial
      development organization as you achieve your goals, one of the biggest changes you
      will make will be to the culture of the organization.  As you make these changes,
      you will establish momentum.  If a certain process you start has limits that
      will only take you so far, you don't want to lose all that momentum.
   </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/Destination.jpg" border="0" />
        </p>
        <p>
      Let's say you establish a project specific initiative, you see progress beyond what
      you expect.  The tools and processes you come up with  work like clockwork
      on that initiative.  You want to repeat that on another project so you implement
      that initiative on the next project.  Now you have a couple/few projects working
      like a well oiled machine.  You decide to implement that for the other 12 projects
      in your area.  You do this, however you see that things are starting to slip
      and you aren't seeing the improvements in efficiencies you expect.  What happened? 
      Maybe the initiative you implemented works well at the tactical project level but
      not at the strategic organizational level.  The way this initiative/tools work
      doesn't take into account any additional commitments beyond the project level and
      there is no way to change that.  You've made gains but now you are at a dead
      end and changing course could mean starting from scratch.  If you start out with
      the strategic end in mind and keep that in mind while making tactical maneuvers your
      journey toward the utopia of project delivery execution will be much smoother!
   </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/Goal.jpg" border="0" />
        </p>
        <p>
      Have you ever made any decisions that where absolutely the right decision at the time,
      however as time went on you find that the investment you made in that decision limited
      any possibility for future growth without significant pain?
   </p>
        <p>
      -ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=06c3c822-8da7-42c5-9719-f698a1714bbd" />
      </body>
      <title>It's not a destination, It's the Journey</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,06c3c822-8da7-42c5-9719-f698a1714bbd.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,06c3c822-8da7-42c5-9719-f698a1714bbd.aspx</link>
      <pubDate>Sun, 11 Feb 2007 21:38:30 GMT</pubDate>
      <description>&lt;h4&gt;It's not a destination, it's the journey
&lt;/h4&gt;
&lt;p&gt;
   While trying to implement a Project Delivery Optimization initiative, it's not the
   destination it's the journey.&amp;nbsp; Where you want to get to has a lot to do with
   where you are.&amp;nbsp; As you set off on the road to "make-things-better" when delivering
   software you need to look for the right steps to make increment improvements today
   without limiting your options in the future.&amp;nbsp;&amp;nbsp;The processes and tool you
   need to take you to the next level will serve as a set of building blocks for the
   level after that.&amp;nbsp; There is nothing wrong with incremental gains, however as
   you decide on a process, tool or technology, you should have an understanding of what
   their limits are what can be done when you hit those limits.&amp;nbsp; For any non-trivial
   development organization as you achieve your goals, one of the biggest changes you
   will make will be to the culture of the organization.&amp;nbsp; As you make these changes,
   you will establish momentum.&amp;nbsp; If a certain process you start has limits that
   will only take you so far, you don't want to lose all that momentum.
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/Destination.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   Let's say you establish a project specific initiative, you see progress beyond what
   you expect.&amp;nbsp; The tools and processes you come up with&amp;nbsp; work like clockwork
   on that initiative.&amp;nbsp; You want to repeat that on another project so you implement
   that initiative on the next project.&amp;nbsp; Now you have a couple/few projects working
   like a well oiled machine.&amp;nbsp; You decide to implement that for the other 12 projects
   in your area.&amp;nbsp; You do this, however you see that things are starting to slip
   and you aren't seeing the improvements in efficiencies you expect.&amp;nbsp; What happened?&amp;nbsp;
   Maybe the initiative you implemented works well at the tactical project level but
   not at the strategic organizational level.&amp;nbsp; The way this initiative/tools work
   doesn't take into account any additional commitments beyond the project level and
   there is no way to change that.&amp;nbsp; You've made gains but now you are at a dead
   end and changing course could mean starting from scratch.&amp;nbsp; If you start out with
   the strategic end in mind and keep that in mind while making tactical maneuvers your
   journey toward the utopia of project delivery execution will be much smoother!
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/Goal.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   Have you ever made any decisions that where absolutely the right decision at the time,
   however as time went on you find that the investment you made in that decision limited
   any possibility for future growth without significant pain?
&lt;/p&gt;
&lt;p&gt;
   -ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=06c3c822-8da7-42c5-9719-f698a1714bbd" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,06c3c822-8da7-42c5-9719-f698a1714bbd.aspx</comments>
      <category>Project Delivery;Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=45135d0b-033e-4c84-878d-8bef9049ab9e</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,45135d0b-033e-4c84-878d-8bef9049ab9e.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,45135d0b-033e-4c84-878d-8bef9049ab9e.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=45135d0b-033e-4c84-878d-8bef9049ab9e</wfw:commentRss>
      <title>Microsoft Robotics Studio Communications Protocol</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,45135d0b-033e-4c84-878d-8bef9049ab9e.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,45135d0b-033e-4c84-878d-8bef9049ab9e.aspx</link>
      <pubDate>Sun, 11 Feb 2007 00:02:44 GMT</pubDate>
      <description>&lt;h4 class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="FONT-SIZE: 16pt; FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;Microsoft
   Robotics Studio Communications Protocol&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/h4&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Arial','sans-serif'"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font face=Verdana color=#000000&gt;Ah
   – the weekend, time to do a little coding for fun!&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;One
   of my on-going projects it to build out the functionality of my latest robot &lt;/font&gt;&lt;a href="http://www.efficientcoder.net/PermaLink,guid,a0e74f09-a914-4d7a-97b2-22c54821de4a.aspx"&gt;&lt;font face=Verdana&gt;NiVek
   I&lt;/font&gt;&lt;/a&gt;&lt;font face=Verdana color=#000000&gt;.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Although
   the robot itself has a little computer it doesn’t have much of a user interface, that
   is provided via a PC.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Therefore for the
   PC to configure and display the telemetry from the robot a communications channel
   needs to be established.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt; 
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/Eb.gif" border=0&gt;
&lt;/p&gt;
&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt; 
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font face=Verdana color=#000000&gt;There
   is a cool little card that you can get at &lt;/font&gt;&lt;a href="http://www.parallax.com/"&gt;&lt;font face=Verdana&gt;Parallax&lt;/font&gt;&lt;/a&gt;&lt;font face=Verdana color=#000000&gt; called
   the &lt;/font&gt;&lt;a href="http://www.parallax.com/detail.asp?product_id=30068"&gt;&lt;font face=Verdana&gt;Embedded
   Blue&lt;/font&gt;&lt;/a&gt;&lt;font face=Verdana color=#000000&gt; transceiver, this little devices
   takes TTL (+5v) level signals from a microcontroller and allows for serial communications
   with another BlueTooth device (such as a computer).&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;So
   I can hookup a couple lines on my &lt;/font&gt;&lt;a href="http://www.parallax.com/detail.asp?product_id=JS1-IC"&gt;&lt;font face=Verdana&gt;Javelin
   Stamp chip&lt;/font&gt;&lt;/a&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt; to the Embedded Blue
   device, then establish a BlueTooth connection and it’s just like having a two way
   serial cable between my computer and the robot, very nice!&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;img src="http://www.efficientcoder.net/content/binary/js1-ic.gif" border=0&gt;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;Now
   that we have our serial link we need a nice general purpose (and simple) protocol
   to exchange data.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;In a past life I worked
   on a lot of embedded systems that needed to talk to the outside world.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;This
   is very similar to what I wanted to do with my robot.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Here’s
   what I came up with.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;
   &lt;o:p&gt;
      &lt;font face=Verdana color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;&amp;lt;STX&amp;gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;-
   Start of Transmission Character (0x03)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;&amp;lt;LEN_MSB&amp;gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;-
   Most Significant Byte of the size of the data packet. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;&amp;lt;LEN_LSB&amp;gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;-
   Least Significant Byte of the size of the data packet&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;&amp;lt;DEVICE_TYPE&amp;gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;-
   Single byte that identifies the device (Enum type in C#)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;&amp;lt;DEVICE_ID&amp;gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;-
   Since there may be many of these devices, we have a simple numeric id&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;&amp;lt;DEVICE_ACTION&amp;gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;-
   An additional byte that describes the action (Also an Enum type in C#)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;&amp;lt;PAYLOAD&amp;gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;-
   An additional set of bytes that represent any data to be passed.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;&amp;lt;CHECK_SUM&amp;gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;-
   A single byte check sum to validation the message&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;&amp;lt;ETX&amp;gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;-
   End of Transmission character (0x04)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;
   &lt;o:p&gt;
      &lt;font face=Verdana color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;Once
   we’ve defined this protocol, two chunks of code need to be written on each device
   that will be “talking”.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;We need some
   simple methods to build up the packets.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;We
   also need a simple state machine that will look at the bytes coming in on the serial
   port and build up these packets.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;
   &lt;o:p&gt;
      &lt;font face=Verdana color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;On
   the PC side, a simple state machine was built that progresses through each of the
   bytes from the serial port, once the ETX is received, an event is fired to pass the
   message to host that decides how to handle the message.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Creating
   the new packets to send is even easier, it’s just simply a static method that takes
   the DeviceType Enum, DeviceId, DeviceAction Enum and Payload and constructs a byte
   array.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Once complete that byte array
   is then dropped into a queue to be sent out on the serial port.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;
   &lt;o:p&gt;
      &lt;font face=Verdana color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font color=#000000&gt;&lt;font face=Verdana&gt;For
   my Java robot, our options are fairly limited, the Javelin is a cool little chip however
   the Java Interpreter is not very complete, no Garbage Collection and no real multi-tasking.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;
   So here I did kind-of a round-robin type of thing where I have a main program loop,
   then I established the different services such as checking the sensors, checking the
   in buffer, performing actions etc..&amp;nbsp; One of those tasks was to check the serial
   port in buffer for new characters, if new characters are available, they are parsed
   via a state machine, once a message is complete it's dropped into a queue.&amp;nbsp; Then
   when the main loop checks the queue it pulls out the message, and based upon the DeviceType,
   it just hands the message off to the Java class that handle that device in a nice
   clean Handle Method.&amp;nbsp; Sending out a message isn't all that clean but since the
   Serial UART built into the Javelin chip works in the background it may not be that
   bad.&amp;nbsp; Basically each device calls a method on the Communications interface within
   the program to just dump the bytes into the output buffer that follows the protocol
   defined above.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font face=Verdana color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font face=Verdana color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;If
   anyone is interested in getting a copy of this code, just drop me an email.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font face=Verdana color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
   &lt;span style="FONT-FAMILY: 'Arial','sans-serif'"&gt;&lt;font face=Verdana color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;-ec&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;/span&gt;&amp;nbsp;&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=45135d0b-033e-4c84-878d-8bef9049ab9e" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,45135d0b-033e-4c84-878d-8bef9049ab9e.aspx</comments>
      <category>Robotics;Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=cd3be132-4fc1-4acd-b42d-c85f32b62df1</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,cd3be132-4fc1-4acd-b42d-c85f32b62df1.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,cd3be132-4fc1-4acd-b42d-c85f32b62df1.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=cd3be132-4fc1-4acd-b42d-c85f32b62df1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h4>Developer Efficiency
   </h4>
        <p>
      At the very essence of what we do as technical developer folk is take the needs of
      our business stake holders and turn those into 1's and 0's (and maybe in our lifetime we
      might figure out how to get 2 ;-) ) that business stake holder can run as software
      on our computers.  Any thing else is pure rubbish!  
   </p>
        <p>
      So what are the attributes of an efficient coder?
   </p>
        <h5>Technical Aptitude
   </h5>
        <p>
      This is a baseline of becoming an efficient coder, when it's all said and done you
      must have a certain level of Technical Aptitude, that's not to say you need to be
      a "Rocket Scientist" however you should have certain skill such as problem solving,
      a general nature to ask "hmmm...I wonder how that actually works?" or "boy that sure
      is some cool technology, I wonder if I could build that?".  I think this is something
      you either have or you don't.  Not having it is not a bad thing it just means
      this type of work may not be a good fit.  I know any time I try to do something
      creative with any sort of graphics problem, I can spend 3-4 hours on trying new things
      and in the end it probably looks worse that when I started.  This isn't a bad
      thing, but the sooner you can recognize your weaknesses, the sooner you can find other
      people around that complement your strengths that make up for those weaknesses.
   </p>
        <h5>Memory
   </h5>
        <p>
      As a developer there are just too many different technologies that could be implemented
      to solve a problem, too many Languages and API's to learn, too many object models,
      too many command prompt arguments and keywords, you get the idea.  The more of
      these you can stash away and bring to the fore-front when necessary the quicker you
      can continue developing and not doing discovery.
   </p>
        <h5>Perceptiveness
   </h5>
        <p>
      Being able to read between the lines and think to a long term strategy is important
      when developing your solutions.  I see Software Development as chess match. 
      At any given time you are presented with a certain set of facts or knowledge, each
      time you sit down to design/code the moves you make have a major impact in how the
      pieces get moved and sets you up for your next designing/coding session.  I've
      just seen too many software efforts take the fundamentally wrong approach early on,
      and those projects never really recover.  Although an extreme example, let's
      say you wanted to write a simple contact manager, do you think you would start writing
      this in Assembler?  How about some sort of auditing function where a copy of
      all items was made into a database every 15 minutes, then a process was run to detect
      and report on changes, this was a real world scenario where a developer worked
      on getting this process working for about four weeks, and never did...the efficient
      coder made the correct chess moves and had implemented in an afternoon.  I see
      this is a very common problem in software development.  Do you start coding before
      you have a true understanding of the problem you are trying to solve?
   </p>
        <h5>Attention to Detail
   </h5>
        <p>
      This is a really hard one for me, coming up with creative solutions and looking at
      the big picture sometimes blurs some of the details.  What's interesting is that
      when I'm doing low-level programming such as embedded systems development, my eye
      for detail is very sharp...go figure...to be a efficient coder means developing system
      with little or no bugs.  The challenge here is that if you pay too much attention
      to the details, you may loose site of the big picture.  Coding something that
      implements the fundamentally wrong solution even if perfect and bug free is worth
      little to no value.  I think this is one of the bigger areas where we can use
      technologies, tool and processes to improve our efficiency.  After all computers
      aren't very good at creativity however they are extremely good at the details.
   </p>
        <h5>Experience Level
   </h5>
        <p>
      I think by far the biggest impact on this ratio is the experience of the person doing
      the development.  This experience is not just in the actual programming languages
      such as Java, C, C++, or the Software Development Life Cycle/methodologies, but
      to an even greater extent programming a wide variety of business processes. 
      Just as with software, certain things can be "abstracted" the same is true with business
      processes.  This experience also helps facilitate the conversations with the
      business stake holders, the more you understand about business in general, the more
      time you can more quickly get to the specifics of what makes this problem unique.  
   </p>
        <p>
      Experience only comes with time.  You can do certain things that may not
      seem that important, but really are.  <strong>There is no substitute for spending
      time with the business stake holders</strong> even is you just sit in the room and
      not contribute anything.  That is not to say they should have a direct line or
      to influence your day-to-day scheduling.  But as a manager early on, I used
      any possible opportunity to get the developers in a room with the stake holder. 
      When doing embedded systems work it was always a good reminder going to the field
      and realizing that in the real world when my software is working it's not just a little
      LED that comes on at the right time but it's actually a 20 ton rock crusher that would
      be very bad if it came on at the wrong time.  It puts everything you do in a
      different perspective.  How often do you have actual conversations with your
      business stake holders?
   </p>
        <h5>Passion
   </h5>
        <p>
      What really differentiates you as an "efficient coder"?  Do you really just
      plain and simple love what you do?  Or are you just coding to pick up a
      paycheck?  Life is just too short to spend the majority of it working in a job
      just to pickup a paycheck.  If at a certain extent you have qualities mentioned
      above and your are passionate about taking the needs of the business stake holders
      and turning them into the 1's and 0's in exactly the right order as efficiently as
      possible (what ever that means on your particular effort) the chances of you being
      an "efficient coder" are pretty good!
   </p>
        <p>
      Are you an "efficient coder"?
   </p>
        <p>
      - ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=cd3be132-4fc1-4acd-b42d-c85f32b62df1" />
      </body>
      <title>Developer Efficiency</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,cd3be132-4fc1-4acd-b42d-c85f32b62df1.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,cd3be132-4fc1-4acd-b42d-c85f32b62df1.aspx</link>
      <pubDate>Thu, 08 Feb 2007 15:25:32 GMT</pubDate>
      <description>&lt;h4&gt;Developer Efficiency
&lt;/h4&gt;
&lt;p&gt;
   At the very essence of what we do as technical developer folk is take the needs of
   our business stake holders and turn those into 1's and 0's (and maybe in our lifetime&amp;nbsp;we
   might figure out how to get&amp;nbsp;2 ;-) ) that business stake holder can run as software
   on our computers.&amp;nbsp; Any thing else is pure rubbish!&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
   So what are the attributes of an efficient coder?
&lt;/p&gt;
&lt;h5&gt;Technical Aptitude
&lt;/h5&gt;
&lt;p&gt;
   This is a baseline of becoming an efficient coder, when it's all said and done you
   must have a certain level of Technical Aptitude, that's not to say you need to be
   a "Rocket Scientist" however you should have certain skill such as problem solving,
   a general nature to ask "hmmm...I wonder how that actually works?" or "boy that sure
   is some cool technology, I wonder if I could build that?".&amp;nbsp; I think this is something
   you either have or you don't.&amp;nbsp; Not having it is not a bad thing it just means
   this type of work may not be a good fit.&amp;nbsp; I know any time I try to do something
   creative with any sort of graphics problem, I can spend 3-4 hours on trying new things
   and in the end it probably looks worse that when I started.&amp;nbsp; This isn't a bad
   thing, but the sooner you can recognize your weaknesses, the sooner you can find other
   people around that complement your strengths that make up for those weaknesses.
&lt;/p&gt;
&lt;h5&gt;Memory
&lt;/h5&gt;
&lt;p&gt;
   As a developer there are just too many different technologies that could be implemented
   to solve a problem, too many Languages and API's to learn, too many object models,
   too many command prompt arguments and keywords, you get the idea.&amp;nbsp; The more of
   these you can stash away and bring to the fore-front when necessary the quicker you
   can continue developing and not doing discovery.
&lt;/p&gt;
&lt;h5&gt;Perceptiveness
&lt;/h5&gt;
&lt;p&gt;
   Being able to read between the lines and think to a long term strategy is important
   when developing your solutions.&amp;nbsp; I see Software Development as chess match.&amp;nbsp;
   At any given time you are presented with a certain set of facts or knowledge, each
   time you sit down to design/code the moves you make have a major impact in how the
   pieces get moved and sets you up for your next designing/coding session.&amp;nbsp; I've
   just seen too many software efforts take the fundamentally wrong approach early on,
   and those projects never really recover.&amp;nbsp; Although an extreme example, let's
   say you wanted to write a simple contact manager, do you think you would start writing
   this in Assembler?&amp;nbsp; How about some sort of auditing function where a copy of
   all items was made into a database every 15 minutes, then a process was run to detect
   and report on changes, this was a real world scenario where&amp;nbsp;a developer worked
   on getting this process working for about four weeks, and never did...the efficient
   coder made the correct chess moves and had implemented in an afternoon.&amp;nbsp; I see
   this is a very common problem in software development.&amp;nbsp; Do you start coding before
   you have a true understanding of the problem you are trying to solve?
&lt;/p&gt;
&lt;h5&gt;Attention to Detail
&lt;/h5&gt;
&lt;p&gt;
   This is a really hard one for me, coming up with creative solutions and looking at
   the big picture sometimes blurs some of the details.&amp;nbsp; What's interesting is that
   when I'm doing low-level programming such as embedded systems development, my eye
   for detail is very sharp...go figure...to be a efficient coder means developing system
   with little or no bugs.&amp;nbsp; The challenge here is that if you pay too much attention
   to the details, you may loose site of the big picture.&amp;nbsp; Coding something that
   implements the fundamentally wrong solution even if perfect and bug free is worth
   little to no value.&amp;nbsp; I think this is one of the bigger areas where we can use
   technologies, tool&amp;nbsp;and processes to improve our efficiency.&amp;nbsp; After all computers
   aren't very good at creativity however they are extremely good at the details.
&lt;/p&gt;
&lt;h5&gt;Experience Level
&lt;/h5&gt;
&lt;p&gt;
   I think by far the biggest impact on this ratio is the experience of the person doing
   the development.&amp;nbsp; This experience is not just in the actual programming languages
   such as Java, C, C++,&amp;nbsp;or the Software Development Life Cycle/methodologies, but
   to an even greater extent&amp;nbsp;programming a wide variety of business processes.&amp;nbsp;
   Just as with software, certain things can be "abstracted" the same is true with business
   processes.&amp;nbsp; This experience also helps facilitate the conversations with the
   business stake holders, the more you understand about business in general, the more
   time you can more quickly get to the specifics of what makes this problem unique.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
   Experience only comes with time.&amp;nbsp;&amp;nbsp;You can do certain things that may not
   seem that important, but really are.&amp;nbsp; &lt;strong&gt;There is no substitute for spending
   time with the business stake holders&lt;/strong&gt; even is you just sit in the room and
   not contribute anything.&amp;nbsp; That is not to say they should have a direct line or
   to influence your day-to-day scheduling.&amp;nbsp; But as a manager early on,&amp;nbsp;I used
   any possible opportunity&amp;nbsp;to get the developers in a room with the stake holder.&amp;nbsp;
   When doing embedded systems work it was always a good reminder going to the field
   and realizing that in the real world when my software is working it's not just a little
   LED that comes on at the right time but it's actually a 20 ton rock crusher that would
   be very bad if it came on at the wrong time.&amp;nbsp; It puts everything you do in a
   different perspective.&amp;nbsp; How often do you have actual conversations with your
   business stake holders?
&lt;/p&gt;
&lt;h5&gt;Passion
&lt;/h5&gt;
&lt;p&gt;
   What really differentiates you as an "efficient coder"?&amp;nbsp; Do you&amp;nbsp;really just
   plain and simple love&amp;nbsp;what you do?&amp;nbsp; Or are you just coding to pick up a
   paycheck?&amp;nbsp; Life is just too short to spend the majority of it working in a job
   just to pickup a paycheck.&amp;nbsp; If at a certain extent you have&amp;nbsp;qualities mentioned
   above and your&amp;nbsp;are passionate about taking the needs of the business stake holders
   and turning them into the 1's and 0's in exactly the right order as efficiently as
   possible (what ever that means on your particular effort) the chances of you being
   an "efficient coder" are pretty good!
&lt;/p&gt;
&lt;p&gt;
   Are you an "efficient coder"?
&lt;/p&gt;
&lt;p&gt;
   - ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=cd3be132-4fc1-4acd-b42d-c85f32b62df1" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,cd3be132-4fc1-4acd-b42d-c85f32b62df1.aspx</comments>
      <category>Software Engineering;Software Metrics</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=17d566aa-8dd5-4743-a54d-e66dff060dd8</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,17d566aa-8dd5-4743-a54d-e66dff060dd8.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,17d566aa-8dd5-4743-a54d-e66dff060dd8.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=17d566aa-8dd5-4743-a54d-e66dff060dd8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h4>Custom WebParts in SharePoint 2007
   </h4>
        <p>
      Creating a custom WebPart in SharePoint 2007 isn't all that terribly difficult, just
      a few basic steps that may not be completely obvious...in addition if you want to
      deploy your WebPart on SP 2007 it may contain some additional resources such as gif's
      or java scripts.  Wouldn't it be nice if you could just deploy one assembly with
      everything you need?  Well that's possible so let's do that as well...
   </p>
        <ol>
          <li>
         To start out, just create a new VS.NET 2005 class library project and add a reference
         to "System.Web". 
      </li>
          <li>
         Go ahead and setup a reasonable sounding Assembly Name and Default NameSpace,
         these will be important when registering your component with Share Point 2007. 
      </li>
          <li>
         While your are changing your project settings, find the Signing Tab and make sure
         "Sign the assembly" is checked.  You will then need to go ahead and create a
         new KeyFile.  So far straight forward right? 
      </li>
          <li>
         Now let's add our web part, to do this simply add an class to your project. 
      </li>
          <li>
         The code in your web part should look something like <em>Not a example of good coding
         but that isn't the point </em>;-):</li>
        </ol>
        <font color="#0000ff" size="1">
          <p>
      using
   </p>
        </font>
        <font size="1">
          <font color="#000000"> System;<br /></font>
        </font>
        <font color="#0000ff" size="1">using</font>
        <font size="1">
          <font color="#000000"> System.Runtime.InteropServices;<br /></font>
        </font>
        <font color="#0000ff" size="1">using</font>
        <font size="1">
          <font color="#000000"> System.Web.UI;<br /></font>
        </font>
        <font color="#0000ff" size="1">using</font>
        <font size="1">
          <font color="#000000"> System.Web.UI.WebControls;<br /></font>
        </font>
        <font color="#0000ff" size="1">using</font>
        <font size="1">
          <font color="#000000"> System.Web.UI.WebControls.WebParts;<br /></font>
        </font>
        <font color="#0000ff" size="1">using</font>
        <font size="1">
          <font color="#000000"> System.Xml.Serialization;<br /></font>
        </font>
        <font color="#0000ff" size="1">using</font>
        <font size="1">
          <font color="#000000"> System.Reflection;<br /></font>
        </font>
        <font color="#0000ff" size="1">using</font>
        <font size="1">
          <font color="#000000"> System.Data;<br /></font>
        </font>
        <font color="#0000ff" size="1">using</font>
        <font size="1">
          <font color="#000000"> System.Data.SqlClient;<br /></font>
        </font>
        <font color="#0000ff" size="1">using</font>
        <font size="1">
          <font color="#000000"> System.ComponentModel;</font>
        </font>
        <font color="#0000ff" size="1">
          <p>
      namespace
   </p>
        </font>
        <font size="1">
          <font color="#000000"> SoftwareLogistics.SharePointTest<br /></font>{
   <p>
         [
   </p></font>
        <font color="#2b91af" size="1">Guid</font>
        <font size="1">(</font>
        <font color="#a31515" size="1">"72a24b71-f3a9-4fee-9272-4f3c27c87559"</font>
        <font size="1">)] <br />
      </font>
        <font color="#0000ff" size="1">public</font>
        <font size="1">
        </font>
        <font color="#0000ff" size="1">class</font>
        <font size="1">
        </font>
        <font color="#2b91af" size="1">SampleSP2007Part</font>
        <font size="1"> :
   System.Web.UI.WebControls.WebParts.</font>
        <font color="#2b91af" size="1">WebPart<br />
      </font>
        <font size="1">{<br />
         </font>
        <font size="1">System.Web.UI.WebControls.</font>
        <font color="#2b91af" size="1">DataGrid</font>
        <font size="1"> grdTime;<br /></font>
        <font color="#0000ff" size="1">
          <br />
         protected</font>
        <font size="1">
        </font>
        <font color="#0000ff" size="1">override</font>
        <font size="1">
        </font>
        <font color="#0000ff" size="1">void</font>
        <font size="1"> CreateChildControls()<br />
         {<br />
            </font>
        <font color="#2b91af" size="1">Image</font>
        <font size="1"> img
   = </font>
        <font color="#0000ff" size="1">new</font>
        <font size="1">
        </font>
        <font color="#2b91af" size="1">Image</font>
        <font size="1">();<br />
            </font>
        <font size="1">img.ImageUrl
   = Page.ClientScript.GetWebResourceUrl(</font>
        <font color="#0000ff" size="1">this</font>
        <font size="1">.GetType(), </font>
        <font color="#a31515" size="1">"SoftwareLogistics.SharePointTest.Images.Target.gif"</font>
        <font size="1">);
   <p>
               grdTime = 
   </p></font>
        <font color="#0000ff" size="1">new</font>
        <font size="1"> System.Web.UI.WebControls.</font>
        <font color="#2b91af" size="1">DataGrid</font>
        <font size="1">();<br />
            </font>
        <font color="#0000ff" size="1">string</font>
        <font size="1"> dsn
   = </font>
        <font color="#a31515" size="1">"server=??????;database=??????;user id=????;password=?????"</font>
        <font size="1">;<br /></font>
        <font size="1">
          <br />
            </font>
        <font color="#2b91af" size="1">SqlDataAdapter</font>
        <font size="1"> da
   = </font>
        <font color="#0000ff" size="1">new</font>
        <font size="1">
        </font>
        <font color="#2b91af" size="1">SqlDataAdapter</font>
        <font size="1">(</font>
        <font color="#a31515" size="1">"select
   top 5 * from usv_time_tracking order by start_date desc"</font>
        <font size="1">, </font>
        <font color="#0000ff" size="1">new</font>
        <font size="1">
        </font>
        <font color="#2b91af" size="1">SqlConnection</font>
        <font size="1">(dsn));<br />
            </font>
        <font color="#2b91af" size="1">DataTable</font>
        <font size="1"> tblTime
   = </font>
        <font color="#0000ff" size="1">new</font>
        <font size="1">
        </font>
        <font color="#2b91af" size="1">DataTable</font>
        <font size="1">(</font>
        <font color="#a31515" size="1">"My
   Time"</font>
        <font size="1">);</font>
        <p>
          <font size="1">         da.Fill(tblTime);<br />
               grdTime.DataSource = tblTime;<br />
               grdTime.DataBind();<br /></font>
          <font size="1">
            <br />
               Controls.Add(img);<br />
               Controls.Add(</font>
          <font color="#0000ff" size="1">new</font>
          <font size="1">
          </font>
          <font color="#2b91af" size="1">LiteralControl</font>
          <font size="1">(</font>
          <font color="#a31515" size="1">"&lt;br/&gt;"</font>
          <font size="1">));<br />
               Controls.Add(grdTime);
      </font>
        </p>
        <p>
          <font color="#0000ff" size="1">         base</font>
          <font size="1">.CreateChildControls();<br /></font>
          <font size="1">      }
      </font>
        </p>
        <p>
          <font color="#0000ff" size="1">      protected</font>
          <font size="1">
          </font>
          <font color="#0000ff" size="1">override</font>
          <font size="1">
          </font>
          <font color="#0000ff" size="1">void</font>
          <font size="1"> Render(</font>
          <font color="#2b91af" size="1">HtmlTextWriter</font>
          <font size="1"> writer)<br />
            {<br />
               writer.Write(</font>
          <font color="#a31515" size="1">"&lt;h4&gt;Hello
      World!&lt;/h4&gt;"</font>
          <font size="1">);<br />
               </font>
          <font color="#0000ff" size="1">base</font>
          <font size="1">.Render(writer);<br />
            }<br />
         }<br />
      }
      </font>
        </p>
        <p>
      Before installing this to SharePoint 2007, let's complete this section by talking
      about what we need to do to embed the resources with the assembly.
   </p>
        <ol>
          <li>
         Create an Image directory within your project and copy the Image there:<br /><img src="http://www.efficientcoder.net/content/binary/SLWebPartImageTree.bmp" border="0" /></li>
          <li>
         You can see that the name including the NameSpace is "SoftwareLogistics.SharePointTest.Images.Target.gif"
         (Case is important here) 
      </li>
          <li>
         Once you copied the image there you need to make sure you click on "Properties" and
         then set the Build Action to "Embedded Resource" for Target.gif, very important to
         do this... 
      </li>
          <li>
         Now open up your "AssemblyInfo.cs" file that is in the Properties folder of your project. 
         Add a line to it similar to 
         <br /><font size="1">[assembly: </font><font color="#2b91af" size="1">WebResource</font><font size="1">(</font><font color="#a31515" size="1">"SoftwareLogistics.SharePointTest.Images.Target.gif"</font><font size="1">,</font><font color="#a31515" size="1">"image/gif"</font><font size="1">)</font></li>
          <li>
            <p>
              <font size="1">
                <font size="2">You will also need to add <font color="#0000ff" size="1">using</font><font size="1"><font color="#000000"> System.Web.UI;</font></font> to
            the top of your AssemblyInfo.cs.</font>
              </font>
            </p>
          </li>
          <li>
            <p>
              <font size="1">
                <font size="2">Finally in the code you can set the url of the image
            as:<br /><font size="1">img.ImageUrl = Page.ClientScript.GetWebResourceUrl(<font color="#0000ff">this</font>.GetType(), <font color="#a31515">"SoftwareLogistics.SharePointTest.Images.Target.gif"</font>);</font></font>
              </font>
            </p>
          </li>
        </ol>
        <p>
          <font size="1">
            <font size="2">Now your assembly is ready to go all you need to do
      is turn that into and assembly and your are ready to incorporate it into your SharePoint
      2007 site, you can even us this as a WebPart or even a standard Server Control on
      any ASP.NET 2.0 site.</font>
          </font>
        </p>
        <p>
      To install the the component on the SharePoint2007 server you need to do the next
      couple of steps...
   </p>
        <ol>
          <li>
         First we need to get our component into the GAC so just drag it into the file pane
         for Windows\Assembly, you can see the my file here:<br /><img src="http://www.efficientcoder.net/content/binary/SLWebPartGAC.png" border="0" /></li>
          <li>
         Make a note of the Public Key Token, you will need that to register your part with
         SharePoint, you can also right mouse click on the assembly click on Properties
         and copy the Pulbic Key Token from there. 
      </li>
          <li>
         The final step to make it appear as a "potential" web part within SharePoint is to
         register the component in the Web.Config file.  So find Web.Config for the SharePoint
         instance you want this work with and open it in your favorite XML editor. 
      </li>
          <li>
         Find the section labeled "SafeControls" and add the following line (you can always
         just copy one of the existing lines and fill in your information.<br /><font face="Courier New"> &lt;SafeControl Assembly="SoftwareLogistics.SharePointTest,
         Version=1.1.0.0, Culture=neutral, PublicKeyToken=8220d66cd77f3b8d" Namespace="SoftwareLogistics.SharePointTest"
         TypeName="*" Safe="True" /&gt;</font></li>
        </ol>
        <p>
      At this point SharePoint knows about your WebPart, but you'll need to make it part
      of the Gallery so open up your SharePoint site and do these final steps
   </p>
        <ol>
          <li>
         Click on "Site Actions" and then "Site Settings" 
      </li>
          <li>
         Within the "Galleries" section click on "Web Parts" 
      </li>
          <li>
         Click on New, if all went well you should see the part you created within the list,
         if you don't see it there, go ahead and reset IIS. 
      </li>
          <li>
         Put a check mark next to your new web part and then click the "Populate Gallery" button.</li>
        </ol>
        <p>
      At this point your web part is ready to be included just like any other WebPart.
   </p>
        <p>
      Happy Coding!
   </p>
        <p>
      - ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=17d566aa-8dd5-4743-a54d-e66dff060dd8" />
      </body>
      <title>Custom WebParts in SharePoint 2007</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,17d566aa-8dd5-4743-a54d-e66dff060dd8.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,17d566aa-8dd5-4743-a54d-e66dff060dd8.aspx</link>
      <pubDate>Sun, 04 Feb 2007 18:32:43 GMT</pubDate>
      <description>&lt;h4&gt;Custom WebParts in SharePoint 2007
&lt;/h4&gt;
&lt;p&gt;
   Creating a custom WebPart in SharePoint 2007 isn't all that terribly difficult, just
   a few basic steps that may not be completely obvious...in addition if you want to
   deploy your WebPart on SP 2007 it may contain some additional resources such as gif's
   or java scripts.&amp;nbsp; Wouldn't it be nice if you could just deploy one assembly with
   everything you need?&amp;nbsp; Well that's possible so let's do that as well...
&lt;/p&gt;
&lt;ol&gt;
   &lt;li&gt;
      To start out, just create a new VS.NET 2005 class library project and add a reference
      to&amp;nbsp;"System.Web". 
   &lt;li&gt;
      Go ahead and setup a reasonable sounding Assembly Name and&amp;nbsp;Default NameSpace,
      these will be important when registering your component with Share Point 2007. 
   &lt;li&gt;
      While your are changing your project settings, find the Signing Tab and make sure
      "Sign the assembly" is checked.&amp;nbsp; You will then need to go ahead and create a
      new KeyFile.&amp;nbsp; So far straight forward right? 
   &lt;li&gt;
      Now let's add our web part, to do this simply add an class to your project. 
   &lt;li&gt;
      The code in your web part should look something like &lt;em&gt;Not a example of good coding
      but that isn't the point &lt;/em&gt;;-):&lt;/li&gt;
&lt;/ol&gt;
&lt;font color=#0000ff size=1&gt; 
&lt;p&gt;
   using
&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; System;&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;using&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; System.Runtime.InteropServices;&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;using&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; System.Web.UI;&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;using&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; System.Web.UI.WebControls;&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;using&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; System.Web.UI.WebControls.WebParts;&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;using&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; System.Xml.Serialization;&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;using&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; System.Reflection;&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;using&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; System.Data;&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;using&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; System.Data.SqlClient;&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;using&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; System.ComponentModel;&lt;/font&gt;&gt;
&lt;/font&gt;&lt;font color=#0000ff size=1&gt; 
&lt;p&gt;
   namespace
&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; SoftwareLogistics.SharePointTest&lt;br&gt;
&lt;/font&gt;{&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;[
&lt;/font&gt;&lt;font color=#2b91af size=1&gt;Guid&lt;/font&gt;&lt;font size=1&gt;(&lt;/font&gt;&lt;font color=#a31515 size=1&gt;"72a24b71-f3a9-4fee-9272-4f3c27c87559"&lt;/font&gt;&lt;font size=1&gt;)]&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;public&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#0000ff size=1&gt;class&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#2b91af size=1&gt;SampleSP2007Part&lt;/font&gt;&lt;font size=1&gt; :
System.Web.UI.WebControls.WebParts.&lt;/font&gt;&lt;font color=#2b91af size=1&gt;WebPart&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font size=1&gt;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font size=1&gt;System.Web.UI.WebControls.&lt;/font&gt;&lt;font color=#2b91af size=1&gt;DataGrid&lt;/font&gt;&lt;font size=1&gt; grdTime;&lt;br&gt;
&lt;/font&gt;&lt;font color=#0000ff size=1&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#0000ff size=1&gt;override&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#0000ff size=1&gt;void&lt;/font&gt;&lt;font size=1&gt; CreateChildControls()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=#2b91af size=1&gt;Image&lt;/font&gt;&lt;font size=1&gt; img
= &lt;/font&gt;&lt;font color=#0000ff size=1&gt;new&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#2b91af size=1&gt;Image&lt;/font&gt;&lt;font size=1&gt;();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font size=1&gt;img.ImageUrl
= Page.ClientScript.GetWebResourceUrl(&lt;/font&gt;&lt;font color=#0000ff size=1&gt;this&lt;/font&gt;&lt;font size=1&gt;.GetType(), &lt;/font&gt;&lt;font color=#a31515 size=1&gt;"SoftwareLogistics.SharePointTest.Images.Target.gif"&lt;/font&gt;&lt;font size=1&gt;);&gt;
&lt;p&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grdTime = 
&lt;/font&gt;&lt;font color=#0000ff size=1&gt;new&lt;/font&gt;&lt;font size=1&gt; System.Web.UI.WebControls.&lt;/font&gt;&lt;font color=#2b91af size=1&gt;DataGrid&lt;/font&gt;&lt;font size=1&gt;();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;string&lt;/font&gt;&lt;font size=1&gt; dsn
= &lt;/font&gt;&lt;font color=#a31515 size=1&gt;"server=??????;database=??????;user id=????;password=?????"&lt;/font&gt;&lt;font size=1&gt;;&lt;br&gt;
&lt;/font&gt;&lt;font size=1&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=#2b91af size=1&gt;SqlDataAdapter&lt;/font&gt;&lt;font size=1&gt; da
= &lt;/font&gt;&lt;font color=#0000ff size=1&gt;new&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#2b91af size=1&gt;SqlDataAdapter&lt;/font&gt;&lt;font size=1&gt;(&lt;/font&gt;&lt;font color=#a31515 size=1&gt;"select
top 5 * from usv_time_tracking order by start_date desc"&lt;/font&gt;&lt;font size=1&gt;, &lt;/font&gt;&lt;font color=#0000ff size=1&gt;new&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#2b91af size=1&gt;SqlConnection&lt;/font&gt;&lt;font size=1&gt;(dsn));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=#2b91af size=1&gt;DataTable&lt;/font&gt;&lt;font size=1&gt; tblTime
= &lt;/font&gt;&lt;font color=#0000ff size=1&gt;new&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#2b91af size=1&gt;DataTable&lt;/font&gt;&lt;font size=1&gt;(&lt;/font&gt;&lt;font color=#a31515 size=1&gt;"My
Time"&lt;/font&gt;&lt;font size=1&gt;);&lt;/font&gt;&gt;
&lt;p&gt;
   &lt;font size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;da.Fill(tblTime);&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grdTime.DataSource = tblTime;&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grdTime.DataBind();&lt;br&gt;
   &lt;/font&gt;&lt;font size=1&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Controls.Add(img);&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Controls.Add(&lt;/font&gt;&lt;font color=#0000ff size=1&gt;new&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#2b91af size=1&gt;LiteralControl&lt;/font&gt;&lt;font size=1&gt;(&lt;/font&gt;&lt;font color=#a31515 size=1&gt;"&amp;lt;br/&amp;gt;"&lt;/font&gt;&lt;font size=1&gt;));&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Controls.Add(grdTime);
&lt;/p&gt;
&lt;p&gt;
   &gt;&lt;font color=#0000ff size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base&lt;/font&gt;&lt;font size=1&gt;.CreateChildControls();&lt;br&gt;
   &lt;/font&gt;&lt;font size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/p&gt;
&lt;p&gt;
   &gt;&lt;font color=#0000ff size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#0000ff size=1&gt;override&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#0000ff size=1&gt;void&lt;/font&gt;&lt;font size=1&gt; Render(&lt;/font&gt;&lt;font color=#2b91af size=1&gt;HtmlTextWriter&lt;/font&gt;&lt;font size=1&gt; writer)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.Write(&lt;/font&gt;&lt;font color=#a31515 size=1&gt;"&amp;lt;h4&amp;gt;Hello
   World!&amp;lt;/h4&amp;gt;"&lt;/font&gt;&lt;font size=1&gt;);&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;base&lt;/font&gt;&lt;font size=1&gt;.Render(writer);&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
   }
&lt;/p&gt;
&gt; 
&lt;p&gt;
   Before installing this to SharePoint 2007, let's complete this section by talking
   about what we need to do to embed the resources with the assembly.
&lt;/p&gt;
&lt;ol&gt;
   &lt;li&gt;
      Create an&amp;nbsp;Image directory within your project and copy the Image there:&lt;br&gt;
      &lt;img src="http://www.efficientcoder.net/content/binary/SLWebPartImageTree.bmp" border=0&gt; 
   &lt;li&gt;
      You can see that the name including the NameSpace is "SoftwareLogistics.SharePointTest.Images.Target.gif"
      (Case is important here) 
   &lt;li&gt;
      Once you copied the image there you need to make sure you click on "Properties" and
      then set the Build Action to "Embedded Resource" for Target.gif, very important to
      do this... 
   &lt;li&gt;
      Now open up your "AssemblyInfo.cs" file that is in the Properties folder of your project.&amp;nbsp;
      Add a line to it similar to 
      &lt;br&gt;
      &lt;font size=1&gt;[assembly: &lt;/font&gt;&lt;font color=#2b91af size=1&gt;WebResource&lt;/font&gt;&lt;font size=1&gt;(&lt;/font&gt;&lt;font color=#a31515 size=1&gt;"SoftwareLogistics.SharePointTest.Images.Target.gif"&lt;/font&gt;&lt;font size=1&gt;,&lt;/font&gt;&lt;font color=#a31515 size=1&gt;"image/gif"&lt;/font&gt;&lt;font size=1&gt;)&lt;/font&gt; 
   &lt;li&gt;
      &lt;p&gt;
         &lt;font size=1&gt;&lt;font size=2&gt;You will also need to add &lt;font color=#0000ff size=1&gt;using&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; System.Web.UI;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;to
         the top of your AssemblyInfo.cs.&lt;/font&gt;&lt;/font&gt;
      &lt;/p&gt;
   &lt;li&gt;
      &lt;p&gt;
         &lt;font size=1&gt;&lt;font size=2&gt;Finally in the code you can set the url of the image as:&lt;br&gt;
         &lt;font size=1&gt;img.ImageUrl = Page.ClientScript.GetWebResourceUrl(&lt;font color=#0000ff&gt;this&lt;/font&gt;.GetType(), &lt;font color=#a31515&gt;"SoftwareLogistics.SharePointTest.Images.Target.gif"&lt;/font&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
      &lt;/p&gt;
   &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
   &lt;font size=1&gt;&lt;font size=2&gt;Now your assembly is ready to go all you need to do is turn
   that into and assembly and your are ready to incorporate it into your SharePoint 2007
   site, you can even us this as a WebPart or even a standard Server Control on any ASP.NET
   2.0 site.&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   To install the the component on the SharePoint2007 server you need to do the next
   couple of steps...
&lt;/p&gt;
&lt;ol&gt;
   &lt;li&gt;
      First we need to get our component into the GAC so just drag it into the file pane
      for Windows\Assembly, you can see the my file here:&lt;br&gt;
      &lt;img src="http://www.efficientcoder.net/content/binary/SLWebPartGAC.png" border=0&gt; 
   &lt;li&gt;
      Make a note of the Public Key Token, you will need that to register your part with
      SharePoint, you can also right mouse click&amp;nbsp;on the assembly click on Properties
      and copy the Pulbic Key Token from there. 
   &lt;li&gt;
      The final step to make it appear as a "potential" web part within SharePoint is to
      register the component in the Web.Config file.&amp;nbsp; So find Web.Config for the SharePoint
      instance you want this work with and open it in your favorite XML editor. 
   &lt;li&gt;
      Find the section labeled "SafeControls" and add the following line (you can always
      just copy one of the existing lines and&amp;nbsp;fill in your information.&lt;br&gt;
      &lt;font face="Courier New"&gt;&amp;nbsp;&amp;lt;SafeControl Assembly="SoftwareLogistics.SharePointTest,
      Version=1.1.0.0, Culture=neutral, PublicKeyToken=8220d66cd77f3b8d" Namespace="SoftwareLogistics.SharePointTest"
      TypeName="*" Safe="True" /&amp;gt;&lt;/font&gt;
   &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
   At this point SharePoint knows about your WebPart, but you'll need to make it part
   of the Gallery so open up your SharePoint site and do these final steps
&lt;/p&gt;
&lt;ol&gt;
   &lt;li&gt;
      Click on "Site Actions" and then "Site Settings" 
   &lt;li&gt;
      Within the "Galleries" section click on "Web Parts" 
   &lt;li&gt;
      Click on New, if all went well you should see the part you created within the list,
      if you don't see it there, go ahead and reset IIS. 
   &lt;li&gt;
      Put a check mark next to your new web part and then click the "Populate Gallery" button.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
   At this point your web part is ready to be included just like any other WebPart.
&lt;/p&gt;
&lt;p&gt;
   Happy Coding!
&lt;/p&gt;
&lt;p&gt;
   - ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=17d566aa-8dd5-4743-a54d-e66dff060dd8" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,17d566aa-8dd5-4743-a54d-e66dff060dd8.aspx</comments>
      <category>ASP.NET;SharePoint 2007;Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=1a7e824e-d599-45da-854b-909ce99a5bdf</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,1a7e824e-d599-45da-854b-909ce99a5bdf.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,1a7e824e-d599-45da-854b-909ce99a5bdf.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=1a7e824e-d599-45da-854b-909ce99a5bdf</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h4>SharePoint 2007 - It's finally all coming together!
   </h4>
        <p>
      I remember in the very early days of .NET they had a cool demo of how to build
      a portal in ASP.NET, this was called "I Buy Spy" from what I understood
      went on to be <a href="http://www.dotnetnuke.com">DOTNETNUKE</a>, I was excited
      about the concept of configurable content within the portal, it had all the right
      concepts, adding tabs, little widgets you could configure etc... These were really
      just Web Controls (ASCX) or Server Controls (compiled DLL's).  My third version
      of "The Chaos Filter" used this concept extensively. 
   </p>
        <p>
      Then with ASP.NET 2.0, they introduced the concept of WebParts, this was nice however
      you had to build up a set of scaffolding and use the provider model to use these
      within your site (at least as pure web parts).  Not terribly difficult but it
      limited your deployed options.  At the time SharePoint 2003 had something called
      "WebParts" as well, extremely similar in both appearance and function, however these
      "WebParts" were not the same thing as those created with ASP.NET 2.0.  Very disappointing
      (and confusing), SharePoint 2003 web parts actually came out first, and I assume that
      Microsoft kept the name since it seems to fit this concept so well and the intent
      with ASP.NET 2.0 web parts was that they would work with SharePoint 2007.
   </p>
        <p>
      Version 3.0 of the product really defined and flushed out the data model and workflow
      engine however, I just wasn't very happy with the presentation layer in ASP.NET 1.1
      using the ASCX's and custom controls.  With the introduction of the ASP.NET 2.0
      I started on version 4.0 of "The Chaos Filter", this time I focused on an architecture
      that was built from the ground-up to use web parts and leverage the existing data
      model and workflow concepts that make the Chaos Filter unique.  This architecture
      relied heavily on code generation from a product called CodeSmith, templates where
      created to not only create a simple DAL that mapped to tables in the database, but
      it also created two web parts (master/detail) for each tables.  This obviously
      doesn't mean that you can generate 100% of the application, however it does mean that
      it can very rapidly give you web parts that work out-of-the box that you can customize. 
      Anytime I hear "You can build your hole site in just three lines of code" my spider
      senses tell me to watch out!  This solution is really intended to put in place
      the framework and plumbing that you can open up in your development environment and
      make it do something useful.
   </p>
        <p>
      So here we are, SharePoint 2007 was released last November, what does this give us
      that we really didn't have before?  We now have the ability to easily create
      little "chunks" of functionality in the form of "WebParts" that can be wired up to
      create applications.  So with the data model defined in V3.0 of my product, the
      architecture to include code generation defined in V4.0 of my product, and a mature
      framework in SharePoint 2007, it's time to start figuring out how to package these
      concepts into something that will provide value.
   </p>
        <p>
      -ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=1a7e824e-d599-45da-854b-909ce99a5bdf" />
      </body>
      <title>SharePoint 2007 &amp; The Chaos Filter</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,1a7e824e-d599-45da-854b-909ce99a5bdf.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,1a7e824e-d599-45da-854b-909ce99a5bdf.aspx</link>
      <pubDate>Sun, 04 Feb 2007 15:05:56 GMT</pubDate>
      <description>&lt;h4&gt;SharePoint 2007 - It's finally all coming together!
&lt;/h4&gt;
&lt;p&gt;
   I remember in the very&amp;nbsp;early days of .NET they had a cool demo of how to build
   a portal in&amp;nbsp;ASP.NET, this was&amp;nbsp;called "I Buy Spy" from what I understood
   went on to be &lt;a href="http://www.dotnetnuke.com"&gt;DOTNETNUKE&lt;/a&gt;,&amp;nbsp;I was&amp;nbsp;excited
   about the concept of configurable content within the portal, it had all the right
   concepts, adding tabs, little widgets you could configure etc...&amp;nbsp;These were really
   just Web Controls (ASCX) or Server Controls (compiled DLL's).&amp;nbsp; My third version
   of "The Chaos Filter" used this concept extensively.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   Then with ASP.NET 2.0, they introduced the concept of WebParts, this was nice however
   you had to build up a set of scaffolding and use the provider model to&amp;nbsp;use these
   within your site (at least as pure web parts).&amp;nbsp; Not terribly difficult but it
   limited your deployed options.&amp;nbsp; At the time SharePoint 2003 had something called
   "WebParts" as well, extremely similar in both appearance and function, however these
   "WebParts" were not the same thing as those created with ASP.NET 2.0.&amp;nbsp; Very disappointing
   (and confusing), SharePoint 2003 web parts actually came out first, and I assume that
   Microsoft kept the name since it seems to fit this concept so well and the intent
   with ASP.NET 2.0 web parts was that they would work with SharePoint 2007.
&lt;/p&gt;
&lt;p&gt;
   Version 3.0 of the product really defined and flushed out the data model and workflow
   engine however, I just wasn't very happy with the presentation layer in ASP.NET 1.1
   using the ASCX's and custom controls.&amp;nbsp; With the introduction of the ASP.NET 2.0
   I started on version 4.0 of "The Chaos Filter", this time I focused on&amp;nbsp;an architecture
   that was built from the ground-up to use web parts and leverage the existing data
   model and workflow concepts that make the Chaos Filter unique.&amp;nbsp; This architecture
   relied heavily on code generation from a product called CodeSmith, templates where
   created to not only create a simple DAL that mapped to tables in the database, but
   it also created two web parts (master/detail)&amp;nbsp;for each tables.&amp;nbsp; This obviously
   doesn't mean that you can generate 100% of the application, however it does mean that
   it can very rapidly give you web parts that work out-of-the box that you can customize.&amp;nbsp;
   Anytime I hear "You can build your hole site in just three lines of code" my spider
   senses tell me to watch out!&amp;nbsp; This solution is really intended to put in place
   the framework and plumbing that you can open up in your development environment and
   make it do something useful.
&lt;/p&gt;
&lt;p&gt;
   So here we are, SharePoint 2007 was released last November, what does this give us
   that we really didn't have before?&amp;nbsp; We now have the ability to easily create
   little "chunks" of functionality in the form of "WebParts" that can be wired up to
   create applications.&amp;nbsp; So with the data model defined in V3.0 of my product, the
   architecture to include code generation defined in V4.0 of my product, and a mature
   framework in SharePoint 2007, it's time to start figuring out how to package these
   concepts into something that will provide value.
&lt;/p&gt;
&lt;p&gt;
   -ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=1a7e824e-d599-45da-854b-909ce99a5bdf" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,1a7e824e-d599-45da-854b-909ce99a5bdf.aspx</comments>
      <category>ASP.NET;Chaos Filter;SharePoint 2007;Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=a2b12065-f127-4d9f-81e1-cc71cc79a924</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,a2b12065-f127-4d9f-81e1-cc71cc79a924.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,a2b12065-f127-4d9f-81e1-cc71cc79a924.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a2b12065-f127-4d9f-81e1-cc71cc79a924</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="4">
            <strong>Does this only happen to me?</strong>
          </font>
        </p>
        <p>
      I've been cruising along on all eight cylinders, making sure and steady progress on
      a chunk of code.  I get to the point where I think I've got all the problems solved
      and want to integrate a bunch of things together and whammo - I get a flat tire...something
      stupid like my VPN drops, a real slooooowww connection speed where it's painful to do
      anything or maybe a reference to some library "just" disappears, or my favorite
      something like "Internal Compiler Error please start Visual Studio".  Just
      as I was ready to pull all the "stuff" together on a project I'm working on today
      that "flat tire" was all of a sudden my clip board in Vista stopped working...very
      odd...very frustrating...real momentum killer...
   </p>
        <p>
      -ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=a2b12065-f127-4d9f-81e1-cc71cc79a924" />
      </body>
      <title>Funky computer behavior...</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,a2b12065-f127-4d9f-81e1-cc71cc79a924.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,a2b12065-f127-4d9f-81e1-cc71cc79a924.aspx</link>
      <pubDate>Fri, 26 Jan 2007 16:36:02 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font size=4&gt;&lt;strong&gt;Does this only happen to me?&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   I've been cruising along on all eight cylinders, making sure and steady progress on
   a chunk of code.&amp;nbsp; I get to the point where I think I've got all&amp;nbsp;the problems&amp;nbsp;solved
   and want to integrate a bunch of things together and whammo - I get a&amp;nbsp;flat tire...something
   stupid like my VPN drops, a real slooooowww connection speed where it's painful to&amp;nbsp;do
   anything or maybe&amp;nbsp;a reference to some library "just"&amp;nbsp;disappears, or my favorite
   something like&amp;nbsp;"Internal Compiler Error please start Visual Studio".&amp;nbsp; Just
   as I was ready to pull all the "stuff" together on a project I'm working on today
   that&amp;nbsp;"flat tire" was all of a sudden my clip board in Vista stopped working...very
   odd...very frustrating...real momentum killer...
&lt;/p&gt;
&lt;p&gt;
   -ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=a2b12065-f127-4d9f-81e1-cc71cc79a924" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,a2b12065-f127-4d9f-81e1-cc71cc79a924.aspx</comments>
      <category>Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=27c34fde-439d-47a3-bd1c-b7498acf0701</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,27c34fde-439d-47a3-bd1c-b7498acf0701.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,27c34fde-439d-47a3-bd1c-b7498acf0701.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=27c34fde-439d-47a3-bd1c-b7498acf0701</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="4">
            <strong>Filtering a SQL Server Table by content of XML</strong>
          </font>
        </p>
        <p>
      One of my applications parses custom forms from a web site that are defined by
      an end user, it then stores the actual content of the form as an XML document in a
      SQL 2005 database.  I recently had the need to write some queries to identify
      specific records in this table based upon content entered on the form.  To do
      this I needed a "where" clause that would filter the the records based upon the content
      of the XML.  The following solution seems to do the trick:
   </p>
        <p>
          <font color="#0000ff" size="2">select</font>
          <font color="#000000" size="2"> FormId</font>
          <font size="2">
            <font color="#000000">
              <br />
            </font>
          </font>
          <font color="#0000ff" size="2">  from</font>
          <font size="2"> MyForms<br /></font>
          <font color="#0000ff" size="2">where</font>
          <font size="2"> FormType = </font>
          <font color="#ff0000" size="2">'MyNewForm'<br /></font>
          <font color="#808080" size="2">   and</font>
          <font size="2"> FormXml</font>
          <font color="#808080" size="2">.</font>
          <font color="#0000ff" size="2">value</font>
          <font color="#808080" size="2">(</font>
          <font color="#ff0000" size="2">'if(
      /root/Field1=200 eq true() ) then 1 else 0 '</font>
          <font color="#808080" size="2">,</font>
          <font size="2">
          </font>
          <font color="#ff0000" size="2">'bit'</font>
          <font color="#808080" size="2">)</font>
          <font size="2">
          </font>
          <font color="#808080" size="2">=</font>
          <font size="2"> 1<br /></font>
          <font color="#808080" size="2">   and</font>
          <font size="2"> FormXml</font>
          <font color="#808080" size="2">.</font>
          <font color="#0000ff" size="2">value</font>
          <font color="#808080" size="2">(</font>
          <font color="#ff0000" size="2">'if(
      /root/Field2=300 eq true() ) then 1 else 0 '</font>
          <font color="#808080" size="2">,</font>
          <font size="2">
          </font>
          <font color="#ff0000" size="2">'bit'</font>
          <font color="#808080" size="2">)</font>
          <font size="2">
          </font>
          <font color="#808080" size="2">=</font>
          <font size="2"> 1 
      <br /></font>
          <font color="#808080" size="2">   and</font>
          <font size="2"> FormXml</font>
          <font color="#808080" size="2">.</font>
          <font color="#0000ff" size="2">value</font>
          <font color="#808080" size="2">(</font>
          <font color="#ff0000" size="2">'if(
      /root/Field3=500 eq true() ) then 1 else 0 '</font>
          <font color="#808080" size="2">,</font>
          <font size="2">
          </font>
          <font color="#ff0000" size="2">'bit'</font>
          <font color="#808080" size="2">)</font>
          <font size="2">
          </font>
          <font color="#808080" size="2">=</font>
          <font size="2"> 1<br /></font>
        </p>
        <p>
      Since our filter arguments (200,300,500) are really passed into and built
      as part of the string we really can't use a parameterized query, but I think that
      is probably OK.  Since the initial output of the XQuery is XML, we need to convert
      that to a "bit" field that we can then use to complete our Where Clause
   </p>
        <p>
       -ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=27c34fde-439d-47a3-bd1c-b7498acf0701" />
      </body>
      <title>Filtering a SQL Server Table by content of XML</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,27c34fde-439d-47a3-bd1c-b7498acf0701.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,27c34fde-439d-47a3-bd1c-b7498acf0701.aspx</link>
      <pubDate>Fri, 26 Jan 2007 14:42:26 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font size=4&gt;&lt;strong&gt;Filtering a SQL Server Table by content of XML&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   One of my applications parses&amp;nbsp;custom forms from a web site that are&amp;nbsp;defined&amp;nbsp;by
   an end user, it then stores the actual content of the form as an XML document in a
   SQL 2005 database.&amp;nbsp; I recently had the need to write some queries to identify
   specific records in this table based upon content entered on the form.&amp;nbsp; To do
   this I needed a "where" clause that would filter the the records based upon the content
   of the XML.&amp;nbsp; The following solution seems to do the trick:
&lt;/p&gt;
&lt;p&gt;
   &lt;font color=#0000ff size=2&gt;select&lt;/font&gt;&lt;font color=#000000 size=2&gt; FormId&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;
   &lt;br&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2&gt;&amp;nbsp; from&lt;/font&gt;&lt;font size=2&gt; MyForms&lt;br&gt;
   &lt;/font&gt;&lt;font color=#0000ff size=2&gt;where&lt;/font&gt;&lt;font size=2&gt; FormType =&amp;nbsp;&lt;/font&gt;&lt;font color=#ff0000 size=2&gt;'MyNewForm'&lt;br&gt;
   &lt;/font&gt;&lt;font color=#808080 size=2&gt;&amp;nbsp;&amp;nbsp; and&lt;/font&gt;&lt;font size=2&gt; FormXml&lt;/font&gt;&lt;font color=#808080 size=2&gt;.&lt;/font&gt;&lt;font color=#0000ff size=2&gt;value&lt;/font&gt;&lt;font color=#808080 size=2&gt;(&lt;/font&gt;&lt;font color=#ff0000 size=2&gt;'if(
   /root/Field1=200 eq true() ) then 1 else 0 '&lt;/font&gt;&lt;font color=#808080 size=2&gt;,&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;'bit'&lt;/font&gt;&lt;font color=#808080 size=2&gt;)&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#808080 size=2&gt;=&lt;/font&gt;&lt;font size=2&gt; 1&lt;br&gt;
   &lt;/font&gt;&lt;font color=#808080 size=2&gt;&amp;nbsp;&amp;nbsp; and&lt;/font&gt;&lt;font size=2&gt; FormXml&lt;/font&gt;&lt;font color=#808080 size=2&gt;.&lt;/font&gt;&lt;font color=#0000ff size=2&gt;value&lt;/font&gt;&lt;font color=#808080 size=2&gt;(&lt;/font&gt;&lt;font color=#ff0000 size=2&gt;'if(
   /root/Field2=300 eq true() ) then 1 else 0 '&lt;/font&gt;&lt;font color=#808080 size=2&gt;,&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;'bit'&lt;/font&gt;&lt;font color=#808080 size=2&gt;)&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#808080 size=2&gt;=&lt;/font&gt;&lt;font size=2&gt; 1 
   &lt;br&gt;
   &lt;/font&gt;&lt;font color=#808080 size=2&gt;&amp;nbsp;&amp;nbsp; and&lt;/font&gt;&lt;font size=2&gt; FormXml&lt;/font&gt;&lt;font color=#808080 size=2&gt;.&lt;/font&gt;&lt;font color=#0000ff size=2&gt;value&lt;/font&gt;&lt;font color=#808080 size=2&gt;(&lt;/font&gt;&lt;font color=#ff0000 size=2&gt;'if(
   /root/Field3=500 eq true() ) then 1 else 0 '&lt;/font&gt;&lt;font color=#808080 size=2&gt;,&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#ff0000 size=2&gt;'bit'&lt;/font&gt;&lt;font color=#808080 size=2&gt;)&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#808080 size=2&gt;=&lt;/font&gt;&lt;font size=2&gt; 1&lt;br&gt;
&lt;/p&gt;
&gt; 
&lt;p&gt;
   Since our filter arguments&amp;nbsp;(200,300,500)&amp;nbsp;are really passed into and built
   as part of the string we really can't use a parameterized query, but I think that
   is probably OK.&amp;nbsp; Since the initial output of the XQuery is XML, we need to convert
   that to a "bit" field that we can then use to complete our Where Clause
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;-ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=27c34fde-439d-47a3-bd1c-b7498acf0701" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,27c34fde-439d-47a3-bd1c-b7498acf0701.aspx</comments>
      <category>Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=4e6081dc-2afd-4b61-bf69-ebb08b99f3d6</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,4e6081dc-2afd-4b61-bf69-ebb08b99f3d6.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,4e6081dc-2afd-4b61-bf69-ebb08b99f3d6.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=4e6081dc-2afd-4b61-bf69-ebb08b99f3d6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="4">
            <strong>Back in Business Again (4 monitor configuration on Vista)</strong>
          </font>
        </p>
        <p>
      Over the past year, I've really been addicted to using my four monitor configuration
      within Windows XP.  In October, I made the switch to Vista for my main desktop
      system and have had a difficulty running in this configuration.  First with
      a couple of ATI X1300 cards, where when I go into 4 monitor mode, one of the screens
      was half black half green (with RC2, but not fixed in RTM Vista) Then I purchased
      a couple of NVidia cards, a 7900GS PCI Express card, and an FX 5200 PCI card, I was
      able to get these working, however I wasn't able to rotate the screen into portrait
      mode, which is really almost a requirement unless you want to constantly be tweaking
      your neck to view all the monitors.  The native drivers for NVidia (at least
      version 9.6.8.5 dated 10/9/2006) did not support any mechanism for doing rotation
      so I found this very kewl program called iRotate from an excellent company <a href="http://entechtaiwan.net">EnTech
      Taiwan</a>. The following <a href="http://entechtaiwan.net/forums/viewtopic.php?t=4451&amp;sid=5174007cc5a2b568b7b11edbbc176dc4">post</a> describes
      how to tweak your registry to allow for <a href="http://entechtaiwan.net/util/irotate.shtm">iRotate</a> to
      work with the NVidia driver.  They have another very cool program called <a href="http://entechtaiwan.net/util/ps.shtm">PowerStrip</a> that
      allows you to do some pretty amazing things with your video card.
   </p>
        <p>
      Here's a picture of my development workstation...
   </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/100_1113.JPG" border="0" />
        </p>
        <p>
      The most important part of this setup is just to the left of my keyboard (coffee mug).
   </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/100_1115.JPG" border="0" />
        </p>
        <p>
      I think that 4 monitors is actually an excellent environment for doing development,
      let me explain my setup
   </p>
        <p>
      From left to right:<br />
      1) 900x1440 Monitor - This is really my system dash board, I run Outlook, keep my
      IM window open, SysInternals (or I guess Microsoft's) <a href="http://www.microsoft.com/technet/sysinternals/utilities/ProcessExplorer.mspx">Process
      Explorer </a>and while really "getting into it" I may start an instance of <a href="http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx">DebugView</a> or <a href="http://www.docquir.net/desktopdefault.aspx?doc=cedbgview_us&amp;tabindex=1&amp;tabid=8">CEDebug
      view </a>on top of those windows.
   </p>
        <p>
      2) 900x1440 Monitor - Tool windows for VS.NET, I usually have the following configuration,
      the screen divided from left to right in about 2/3 on the left and 1/3 on the right,
      the left side is divided just about in 1/2 with the top having the Output and Error
      List window, the bottom has properties and a couple of cool VS.NET addins I created
      using the <a href="http://www.devexpress.com/">DevExpress</a> <a href="http://www.devexpress.com/Downloads/NET/IDETools/DXCore/Index.xml">DXCore</a> product
      (if you have any interest in building add-ins for VS.NET you MUST look at this Free,
      yes I said Free product, it takes care of all the plumbing so you can focus on your
      task at hand), one addin allows me to bill time and the other has a bunch of metrics
      like how much time I've spent on classes, methods, billed against clients as well
      as the number of builds I've performed.  The right side of the screen has my
      solution explorer from the top to bottom so I can quickly open files.  In my
      attempt to free myself from using the mouse, I've started to use hot keys to open
      files, but the jury is still out on if this is more efficient than just using the
      mouse.  In addition there is a tab on the right side that allows for access to
      the Team Foundation Server explorer.
   </p>
        <p>
      3) 1200x1600 Monitor - This is where the "magic" happens, this is my current port
      between me and the computer for translating the designs I got from my brain into what
      ever language I'm using (mostly C#)...still think there is a better way to do this,
      but that's another post for another day...
   </p>
        <p>
      4) 1200x1600 Monitor - Work space, this is where I test the application I'm working
      on, open up IE windows, open up file explorer etc..
   </p>
        <p>
      The idea with this configuration is really to allow for very efficient context switching,
      it's much easier to turn my head, then open a window, check it out and get back to
      my main task
   </p>
        <h5>Other "stuff" in the pictures:
   </h5>
        <p>
      I just love my <a href="http://www.microsoft.com/hardware/mouseandkeyboard/productdetails.aspx?pid=043">Microsoft
      Natural Ergonomic Keyboard 4000</a>, it took a little while to get used to but I started
      without the detachable support on the front that raises the front up about 2" and
      moved to that after about a week.  I wish it was wireless and had a finger print
      reader built it, but I've got two of these and feel that I'm at a disadvantage when
      I can use it.  This is really a good tool to increase the "TX Baud Rate" between
      the brain and the computer.<br /><img src="http://www.efficientcoder.net/content/binary/dsc00274.jpg" border="0" /></p>
        <p>
      I'm impressed with the Logitech mouse line, I had one of the rechargeable ones, but
      many a time I've been feverously working on a project, the low battery light came
      on and I didn't have time to recharge before it went dead.  I'm currently using
      the <a href="http://www.logitech.com/index.cfm/products/details/US/EN,CRID=2135,CONTENTID=10917">Logitech
      MX610 Laser Cordless mouse </a>and like it.  It has a number of feature I don't
      use, but I like the way if fits in my palm and the battery life is excellent (besides
      when the battery gets low I just need to grab a couple AA's from my battery drawer
      and I can continue on with life (instead of get my old corded mouse out while my other
      one recharges).<br /></p>
        <p>
       
   </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/12341.jpg" border="0" />
        </p>
        <h5>PDA Collection
   </h5>
        <p>
      My old workhorse (very powerful processor &amp; lots or memory) the HP iPAQ hx2750
   </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/iPaqPix.jpg" border="0" />
          <br />
        </p>
        <p>
      My current phone (jury is still out on this one) the Motorola Q (Smart phone not Pocket
      PC phone)<br /></p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/13964_MotImage.jpg" border="0" />
        </p>
        <p>
      And finally my i-mate JasJar, I like this device, in my line of work (not a mobile
      user) it just isn't a good fit.  I use this for testing VGA resolution applications
      on mobile devices.<br /><br /></p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/m_jasjarfront.jpg" border="0" />
        </p>
        <p>
      And finally you can see my tablet PC hp TC1100 to the right of the monitors in
      the first pix, I love this tablet, it's a pure tablet, not a laptop wannabee/tablet
      wannabee, when I want a laptop, I'm usually using it for something completely different
      than when I want my tablet.  To my wifes joy, I think I'm going to be upgrading
      to a <a href="http://www.microsoft.com/windowsxp/umpc/default.mspx">UMPC</a> as soon
      as the right one comes out and she get's the coveted tablet.
   </p>
        <p>
       
   </p>
        <p>
          <img src="http://www.efficientcoder.net/content/binary/tc1100.jpg" border="0" />
        </p>
        <p>
      - ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=4e6081dc-2afd-4b61-bf69-ebb08b99f3d6" />
      </body>
      <title>Back in Business Again (4 monitor configuration on Vista)</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,4e6081dc-2afd-4b61-bf69-ebb08b99f3d6.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,4e6081dc-2afd-4b61-bf69-ebb08b99f3d6.aspx</link>
      <pubDate>Fri, 22 Dec 2006 15:43:42 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font size=4&gt;&lt;strong&gt;Back in Business Again (4 monitor configuration on Vista)&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   Over the past year, I've really been addicted to using my four monitor configuration
   within Windows XP.&amp;nbsp; In October, I made the switch to Vista for my main desktop
   system and have had&amp;nbsp;a difficulty running in this configuration.&amp;nbsp; First with
   a couple of ATI X1300 cards, where when I go into 4 monitor mode, one of the screens
   was half black half green (with RC2, but not fixed in RTM Vista) Then I purchased
   a couple of NVidia cards, a 7900GS PCI Express card, and an FX 5200 PCI card, I was
   able to get these working, however I wasn't able to rotate the screen into portrait
   mode, which is really almost a requirement unless you want to constantly be tweaking
   your neck to view all the monitors.&amp;nbsp; The native drivers for NVidia (at least
   version 9.6.8.5 dated 10/9/2006) did not support any mechanism for doing rotation
   so I found this very kewl program called iRotate from an excellent company &lt;a href="http://entechtaiwan.net"&gt;EnTech
   Taiwan&lt;/a&gt;.&amp;nbsp;The following &lt;a href="http://entechtaiwan.net/forums/viewtopic.php?t=4451&amp;amp;sid=5174007cc5a2b568b7b11edbbc176dc4"&gt;post&lt;/a&gt; describes
   how to tweak your registry to allow for &lt;a href="http://entechtaiwan.net/util/irotate.shtm"&gt;iRotate&lt;/a&gt; to
   work with the NVidia driver.&amp;nbsp; They have another very cool program called &lt;a href="http://entechtaiwan.net/util/ps.shtm"&gt;PowerStrip&lt;/a&gt; that
   allows you to do some pretty amazing things with your video card.
&lt;/p&gt;
&lt;p&gt;
   Here's a picture of my development workstation...
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/100_1113.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   The most important part of this setup is just to the left of my keyboard (coffee mug).
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/100_1115.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   I think that 4 monitors is actually an excellent environment for doing development,
   let me explain my setup
&lt;/p&gt;
&lt;p&gt;
   From left to right:&lt;br&gt;
   1) 900x1440 Monitor - This is really my system dash board, I run Outlook, keep my
   IM window open, SysInternals (or I guess Microsoft's)&amp;nbsp;&lt;a href="http://www.microsoft.com/technet/sysinternals/utilities/ProcessExplorer.mspx"&gt;Process
   Explorer&amp;nbsp;&lt;/a&gt;and while really "getting into it" I may start an instance of&amp;nbsp;&lt;a href="http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx"&gt;DebugView&lt;/a&gt; or &lt;a href="http://www.docquir.net/desktopdefault.aspx?doc=cedbgview_us&amp;amp;tabindex=1&amp;amp;tabid=8"&gt;CEDebug
   view &lt;/a&gt;on top of those windows.
&lt;/p&gt;
&lt;p&gt;
   2) 900x1440 Monitor - Tool windows for VS.NET, I usually have the following configuration,
   the screen divided from left to right in about 2/3 on the left and 1/3 on the right,
   the left side is divided just about in 1/2 with the top having the Output and Error
   List window, the bottom has properties and a couple of cool VS.NET addins I created
   using the &lt;a href="http://www.devexpress.com/"&gt;DevExpress&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.devexpress.com/Downloads/NET/IDETools/DXCore/Index.xml"&gt;DXCore&lt;/a&gt; product
   (if you have any interest in building add-ins for VS.NET you MUST look at this Free,
   yes I said Free product, it takes care of all the plumbing so you can focus on your
   task at hand), one addin allows me to bill time and the other has a bunch of metrics
   like how much time I've spent on classes, methods, billed against clients as well
   as the number of builds I've performed.&amp;nbsp; The right side of the screen has my
   solution explorer from the top to bottom so I can quickly open files.&amp;nbsp; In my
   attempt to free myself from using the mouse, I've started to use hot keys to open
   files, but the jury is still out on if this is more efficient than just using the
   mouse.&amp;nbsp; In addition there is a tab on the right side that allows for access to
   the Team Foundation Server explorer.
&lt;/p&gt;
&lt;p&gt;
   3) 1200x1600 Monitor - This is where the "magic" happens, this is my current port
   between me and the computer for translating the designs I got from my brain into what
   ever language I'm using (mostly C#)...still think there is a better way to do this,
   but that's another post for another day...
&lt;/p&gt;
&lt;p&gt;
   4) 1200x1600 Monitor - Work space, this is where I test the application I'm working
   on, open up IE windows, open up file explorer etc..
&lt;/p&gt;
&lt;p&gt;
   The idea with this configuration is really to allow for very efficient context switching,
   it's much easier to turn my head, then open a window, check it out and get back to
   my main task
&lt;/p&gt;
&lt;h5&gt;Other "stuff" in the pictures:
&lt;/h5&gt;
&lt;p&gt;
   I just love my &lt;a href="http://www.microsoft.com/hardware/mouseandkeyboard/productdetails.aspx?pid=043"&gt;Microsoft
   Natural Ergonomic Keyboard 4000&lt;/a&gt;, it took a little while to get used to but I started
   without the detachable support on the front that raises the front up about 2" and
   moved to that after about a week.&amp;nbsp; I wish it was wireless and had a finger print
   reader built it, but I've got two of these and feel that I'm at a disadvantage when
   I can use it.&amp;nbsp; This is really a good tool to increase the "TX Baud Rate" between
   the brain and the computer.&lt;br&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/dsc00274.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   I'm impressed with the Logitech mouse line, I had one of the rechargeable ones, but
   many a time I've been feverously working on a project, the low battery light came
   on and I didn't have time to recharge before it went dead.&amp;nbsp; I'm currently using
   the &lt;a href="http://www.logitech.com/index.cfm/products/details/US/EN,CRID=2135,CONTENTID=10917"&gt;Logitech
   MX610 Laser Cordless mouse &lt;/a&gt;and like it.&amp;nbsp; It has a number of feature I don't
   use, but I like the way if fits in my palm and the battery life is excellent (besides
   when the battery gets low I just need to grab a couple AA's from my battery drawer
   and I can continue on with life (instead of get my old corded mouse out while my other
   one recharges).&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/12341.jpg" border=0&gt;
&lt;/p&gt;
&lt;h5&gt;PDA Collection
&lt;/h5&gt;
&lt;p&gt;
   My old workhorse (very powerful processor &amp;amp; lots or memory)&amp;nbsp;the HP iPAQ hx2750
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/iPaqPix.jpg" border=0&gt;
   &lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
   My current phone (jury is still out on this one) the Motorola Q (Smart phone not Pocket
   PC phone)&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/13964_MotImage.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   And finally my i-mate JasJar, I like this device, in my line of work (not a mobile
   user) it just isn't a good fit.&amp;nbsp; I use this for testing VGA resolution applications
   on mobile devices.&lt;br&gt;
   &lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/m_jasjarfront.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   And finally you can see my tablet PC hp TC1100&amp;nbsp;to the right of the monitors in
   the first pix, I love this tablet, it's a pure tablet, not a laptop wannabee/tablet
   wannabee, when I want a laptop, I'm usually using it for something completely different
   than when I want my tablet.&amp;nbsp; To my wifes joy, I think I'm going to be upgrading
   to a &lt;a href="http://www.microsoft.com/windowsxp/umpc/default.mspx"&gt;UMPC&lt;/a&gt; as soon
   as the right one comes out and she get's the coveted tablet.
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.efficientcoder.net/content/binary/tc1100.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   - ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=4e6081dc-2afd-4b61-bf69-ebb08b99f3d6" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,4e6081dc-2afd-4b61-bf69-ebb08b99f3d6.aspx</comments>
      <category>Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=4b72add4-037d-4c48-b5f2-28fe5968fd79</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,4b72add4-037d-4c48-b5f2-28fe5968fd79.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,4b72add4-037d-4c48-b5f2-28fe5968fd79.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=4b72add4-037d-4c48-b5f2-28fe5968fd79</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="4">
            <strong>Flexible Systems Integration Architecture</strong>
          </font>
        </p>
        <p>
      I may have a couple of large projects next year where I need to build up a great deal
      of functionality that easily needs to be integrated with existing systems.  What
      we want is some sort of clean very usable portal concept where a user can work with
      a predefined set of business objects.  The idea here is not to create some sort
      of "holy-grail" of a development environment where a business analyst can sit down
      and drag a few objects on to a page and wire them up.  So now that we took the
      whole "build a system without one line of code" marketing statement out of our vocabulary
      we can safely say we do need to write code and figure out the best way to do this
      to:
   </p>
        <ol>
          <li>
         Get a high-level of reuse among different implementations 
      </li>
          <li>
         Do programming at the right level to minimize defects tedious coding 
      </li>
          <li>
         React to changes very quickly 
      </li>
          <li>
         Provide a clear upgrade path<br /></li>
        </ol>
        <p>
      First let's define the three aspect that are present in pretty much every system we
      are going to build, probably in the order of importance and from the most static to
      the most dynamic:<br /><br /><strong>Data</strong> - In each problem domain there are a core set of data that describe
      the "world" of the domain.  For a sales system, this is going to be something
      like Customers, Products, Sales People, Sales Orders, Invoices etc...each of
      these has their unique set of attributes that describe them.  I would venture
      to say that in most sales system you are going to have at a minimum the above set
      of objects with probably 85% of the attributes on those objects remaining consistent. 
      For these type of objects the definition of these attributes probably remains fairly
      constant with respect to time.  That is to say the description of the objects
      is probably the most "static" part of your system.  I guess this is pretty much
      the premise of OO.<br /><br /><strong>Business Rules</strong> - Objects by them selves might be interesting however
      to do anything with them you need to implement some sort of business logic, something
      like a sales person "CREATES" the order etc...these are really the functional requirements
      of your system.  In our sales system, although the objects and their attributes
      are probably about 85% the same across different systems, the actual functional requirements
      and business rules are probably much less consistent.<br /><br /><strong>User Interface</strong> - Well now we have our data in our objects and we
      have methods so we can make them do something interesting, unless we are building a
      batch processing system, we need some sort of user interface.  If we look at
      this in terms of our sales system, there are really three components of our User Interface:
      1) Simple CRUD stuff (Create Read Update Delete) 2) The buttons you press to make
      it do something like create a new order 3) Work flow.  The first two items are
      really pretty basic, get data from the business object display it on the screen, validate
      it and dump it back to the biz object as well as react to a button to launch
      a screen.  The third item is what really differentiates one system from the next,
      the work flow that's wires up the user interface to the business rules.
   </p>
        <p>
      Let's talk a little bit about some concepts to solve these problems with a high-level
      of reuse and integration into back end systems.
   </p>
        <p>
          <strong>Data</strong> - As we defined above, we will want to create some sort of rich
      object model based upon the domains we are building the system for, these should contain
      the attributes the core attributes that we defined above that are similar between
      different implementations.  These objects would then in turn be "bound" to the underlying
      data objects to provide the basic CRUD functionality.  This would either be through
      the use of implementing interface contracts in a high-level language or creating stored
      procedures in the underlying database that would bind our objects to the data. 
      We might implement our Customer object to execute a stored procedure on an Oracle
      database and return some sort of result set for one implementation and write code
      to execute a Web Service method call to retrieve the customers attributes in another,
      either way we let the specific implementation provide the data and bind it to
      the attributes on the business object.  Our objects would also need to provide
      some sort of mechanisms return lists and collections that are implemented based upon
      the data assets within the organization.  The idea here is the business object
      in our object model provides a well defined set of services to the work
      flow and user interface layers, but the actual persistence of the data will be implementation
      specific.
   </p>
        <p>
          <strong>Business Rules</strong> - OK now we have a way to load and persists business
      objects as well as return collections and lists of these.  Now we need to make
      them do something.  The "do-something" part really comes in two flavors, simple
      methods we can invoke to set status and send out notifications to more complex work
      flow with respect to time.  They are tied together, but it may help to think
      of them separately.  As with our data implementation, our core implementation
      needs to provide a key set of methods that do certain things, like create a new order,
      send an email etc...these should be customizable by inheriting form base class and
      overriding methods.  The next flavor having to do with behavior of the object
      over time is really considered work flow and this probably the area where now two
      systems will be a like.  I think the right way to do this is through some
      sort of Work Flow engine and it just so happens with .NET 3.0 Microsoft released
      one.  The exciting part of this (at least as far as I understand it so far) we
      should be able to create our objects that have our properties and methods, but then
      "wire" them up using XAML to make them behave in a custom way.  This is not say
      we can build our systems without writing any code, but it does mean we may be able
      to "wire-up" our apps to get 80% of the way there, and then be very flexible
      with respect to change over time.
   </p>
        <p>
          <strong>User Interface</strong> - I believe that some sort of portal concept
      is the right way to go here, I'm very intrigued by Share Point Portal Services
      7.0 as providing the plumbing to hold everything.  This area probably will require
      the most customization however this will probably just be starting out with some control
      templates, dragging a few additional controls on to the template then wiring those
      controls up to the business objects.  The portal "needs" to be built as a set
      of building blocks that can be assembled and "connected" at run time.  I think
      the right way to do this is through the use of Web Parts in ASP.NET 2.0.  In
      addition, it will be important to create some sort of role based security that controls
      access to the UI components/data not only to show/hide features and UI components,
      but also something to secure access to either groups of records or specific records. 
      It's also important to build and integration story that will leverage any existing
      credentials that the company may already have.  I would love to see the use of
      "Card Spaces" for this, but I'm not sure that's all that good of an idea.  This
      may however be on implementation of our security model.
   </p>
        <p>
          <em>More to come on this topic...I'm just starting to get my head into these efforts....</em>
        </p>
        <p>
      - ec
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=4b72add4-037d-4c48-b5f2-28fe5968fd79" />
      </body>
      <title>Flexible Systems Integration Architecture</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,4b72add4-037d-4c48-b5f2-28fe5968fd79.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,4b72add4-037d-4c48-b5f2-28fe5968fd79.aspx</link>
      <pubDate>Mon, 04 Dec 2006 23:42:18 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font size=4&gt;&lt;strong&gt;Flexible Systems Integration Architecture&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   I may have a couple of large projects next year where I need to build up a great deal
   of functionality that easily needs to be integrated with existing systems.&amp;nbsp; What
   we want is some sort of clean very usable portal concept where a user can work with
   a predefined set of business objects.&amp;nbsp; The idea here is not to create some sort
   of "holy-grail" of a development environment where a business analyst can sit down
   and drag a few objects on to a page and wire them up.&amp;nbsp; So now that we took the
   whole "build a system without one line of code" marketing statement out of our vocabulary
   we can safely say we do need to write code and figure out the best way to do this
   to:
&lt;/p&gt;
&lt;ol&gt;
   &lt;li&gt;
      Get a high-level of reuse among different implementations 
   &lt;li&gt;
      Do programming at the right level to minimize defects tedious coding 
   &lt;li&gt;
      React to changes very quickly 
   &lt;li&gt;
      Provide a clear upgrade path&lt;br&gt;
   &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
   First let's define the three aspect that are present in pretty much every system we
   are going to build, probably in the order of importance and from the most static to
   the most dynamic:&lt;br&gt;
   &lt;br&gt;
   &lt;strong&gt;Data&lt;/strong&gt; - In each problem domain there are a core set of data that describe
   the "world" of the domain.&amp;nbsp; For a sales system, this is going to be something
   like Customers, Products, Sales People,&amp;nbsp;Sales Orders, Invoices etc...each of
   these has their unique set of attributes that describe them.&amp;nbsp; I would venture
   to say that in most sales system you are going to have at a minimum the above set
   of objects with probably 85% of the attributes on those objects remaining consistent.&amp;nbsp;
   For these type of objects the definition of these attributes probably remains fairly
   constant with respect to time.&amp;nbsp; That is to say the description of the objects
   is probably the most "static" part of your system.&amp;nbsp; I guess this is pretty much
   the premise of OO.&lt;br&gt;
   &lt;br&gt;
   &lt;strong&gt;Business Rules&lt;/strong&gt; - Objects by them selves might be interesting however
   to do anything with them you need to implement some sort of business logic, something
   like a sales person "CREATES" the order etc...these are really the functional requirements
   of your system.&amp;nbsp; In our sales system, although the objects and their attributes
   are probably about 85% the same across different systems, the actual functional requirements
   and business rules are probably much less consistent.&lt;br&gt;
   &lt;br&gt;
   &lt;strong&gt;User Interface&lt;/strong&gt; - Well now we have our data in our objects and we
   have methods so we can make them do something interesting, unless we are building&amp;nbsp;a
   batch processing system, we need some sort of user interface.&amp;nbsp; If we look at
   this in terms of our sales system, there are really three components of our User Interface:
   1) Simple CRUD stuff (Create Read Update Delete) 2) The buttons you press to make
   it do something like create a new order 3) Work flow.&amp;nbsp; The first two items are
   really pretty basic, get data from the business object display it on the screen, validate
   it and dump it back&amp;nbsp;to the biz object as well as&amp;nbsp;react to a button to&amp;nbsp;launch
   a screen.&amp;nbsp; The third item is what really differentiates one system from the next,
   the work flow that's wires up the user interface to the business rules.
&lt;/p&gt;
&lt;p&gt;
   Let's talk a little bit about some concepts to solve these problems with a high-level
   of reuse and integration into back end systems.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Data&lt;/strong&gt; - As we defined above, we will want to create some sort of rich
   object model based upon the domains we are building the system for, these should contain
   the attributes the core attributes that we defined above that are similar between
   different implementations.&amp;nbsp; These objects would then in turn be "bound" to the&amp;nbsp;underlying
   data objects to provide the basic CRUD functionality.&amp;nbsp; This would either be through
   the use of implementing interface contracts in a high-level language or creating stored
   procedures in the underlying database that would bind our objects to the data.&amp;nbsp;
   We&amp;nbsp;might implement our Customer object to execute a stored procedure on an Oracle
   database and return some sort of result set for one implementation and write code
   to execute a Web Service method call to retrieve the customers attributes in another,
   either way we let the specific implementation provide the data and bind it&amp;nbsp;to
   the attributes on the&amp;nbsp;business object.&amp;nbsp; Our objects would also need to provide
   some sort of mechanisms return lists and collections that are implemented based upon
   the data assets within the organization.&amp;nbsp; The idea here is the business object
   in our object model provides a&amp;nbsp;well defined&amp;nbsp;set of services to the work
   flow and user interface layers, but the actual persistence of the data will be implementation
   specific.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Business Rules&lt;/strong&gt; - OK now we have a way to load and persists business
   objects as well as return collections and lists of these.&amp;nbsp; Now we need to make
   them do something.&amp;nbsp; The "do-something" part really comes in two flavors, simple
   methods we can invoke to set status and send out notifications to more complex work
   flow with respect to time.&amp;nbsp; They are tied together, but it may help to think
   of them separately.&amp;nbsp; As with our data implementation, our core implementation
   needs to provide a key set of methods that do certain things, like create a new order,
   send an email etc...these should be customizable by inheriting form base class and
   overriding methods.&amp;nbsp; The next flavor having to do with behavior of the object
   over time is really considered work flow and this probably the area where now two
   systems will be a like.&amp;nbsp;&amp;nbsp;I think the right way to do this is through some
   sort of Work Flow engine and it just so&amp;nbsp;happens with .NET 3.0 Microsoft released
   one.&amp;nbsp; The exciting part of this (at least as far as I understand it so far) we
   should be able to create our objects that have our properties and methods, but then
   "wire" them up using XAML to make them behave in a custom way.&amp;nbsp; This is not say
   we can build our systems without writing any code, but it does mean we may be able
   to&amp;nbsp;"wire-up" our apps to get 80% of the way there, and then be very flexible
   with respect to&amp;nbsp;change&amp;nbsp;over time.
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;User Interface&lt;/strong&gt; - I believe that some sort of&amp;nbsp;portal concept
   is the right way to go here, I'm very intrigued by&amp;nbsp;Share Point Portal Services
   7.0 as providing the plumbing to hold everything.&amp;nbsp; This area probably will require
   the most customization however this will probably just be starting out with some control
   templates, dragging a few additional controls on to the template then wiring those
   controls up to the business objects.&amp;nbsp; The portal "needs" to be built as a set
   of building blocks that can be assembled and "connected" at run time.&amp;nbsp; I think
   the right way to do this is through the use of Web Parts in ASP.NET 2.0.&amp;nbsp; In
   addition, it will be important to create some sort of role based security that controls
   access to the UI components/data not only to show/hide features and UI components,
   but also something to secure access to either groups of records or specific records.&amp;nbsp;
   It's also important to build and integration story that will leverage any existing
   credentials that the company may already have.&amp;nbsp; I would love to see the use of
   "Card Spaces" for this, but I'm not sure that's all that good of an idea.&amp;nbsp; This
   may however be on implementation of our security model.
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;More to come on this topic...I'm just starting to get my head into these efforts....&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
   - ec
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=4b72add4-037d-4c48-b5f2-28fe5968fd79" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,4b72add4-037d-4c48-b5f2-28fe5968fd79.aspx</comments>
      <category>Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=61b08aee-7ea7-48d3-af7e-056c15a49bb2</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,61b08aee-7ea7-48d3-af7e-056c15a49bb2.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,61b08aee-7ea7-48d3-af7e-056c15a49bb2.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=61b08aee-7ea7-48d3-af7e-056c15a49bb2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h4 class="TextColor1" id="subjcns!8B7AC0A0972BC612!115" style="MARGIN-BOTTOM: 0px">Correct Architecture
      Level is a Formula of...
   </h4>
        <div id="msgcns!8B7AC0A0972BC612!115">
          <div>When deploying a solution that you expect to hand over the level of "Architecture"
         and thus time involved should be dependent on the more than the problem that has been
         presented to you:
      </div>
          <div> 
      </div>
          <div>1)  Before any reuse is expected the culture needs to support a certain
         level of processes/documentation.  Developers in general find it easier to start
         from scratch.  
      </div>
          <div> 
      </div>
          <div>2)  Creating documentation is a less than effective technique in a culture
         where no processes exist.
      </div>
          <div> 
      </div>
          <div>3)  If the environment is such that that proper process/documentation is
         not going to happen, attempt to go for the "low-hanging-fruit", make it easy to leverage
         components that can be used every day without much learning curve.
      </div>
          <div> 
      </div>
          <div>4)  There should be an established formula for perceived pain vs. investment
         in a learning curve vs. <strong>perceived value</strong></div>
          <div> 
      </div>
          <div>5)  Ability to tolerate learning curves is important, even if the learning
         curve is &lt; 2 hours and the pay-off from going though this learning curve would
         payback HUGE dividends that would easily justify the learning curve, if the perceived
         value is not equal to the 2 hours, the developer will probably start from scratch.
      </div>
        </div>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=61b08aee-7ea7-48d3-af7e-056c15a49bb2" />
      </body>
      <title>Investment in Software Architecture</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,61b08aee-7ea7-48d3-af7e-056c15a49bb2.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,61b08aee-7ea7-48d3-af7e-056c15a49bb2.aspx</link>
      <pubDate>Mon, 30 Oct 2006 12:33:24 GMT</pubDate>
      <description>&lt;h4 class=TextColor1 id=subjcns!8B7AC0A0972BC612!115 style="MARGIN-BOTTOM: 0px"&gt;Correct&amp;nbsp;Architecture
   Level is a Formula of...
&lt;/h4&gt;
&lt;div id=msgcns!8B7AC0A0972BC612!115&gt;
   &lt;div&gt;When deploying a solution that you expect to hand over the level of "Architecture"
      and thus time involved should be dependent on the more than the problem that has been
      presented to you:
   &lt;/div&gt;
   &lt;div&gt;&amp;nbsp;
   &lt;/div&gt;
   &lt;div&gt;1)&amp;nbsp; Before any reuse is expected the culture needs to support a certain
      level of processes/documentation.&amp;nbsp; Developers in general find it easier to start
      from scratch.&amp;nbsp; 
   &lt;/div&gt;
   &lt;div&gt;&amp;nbsp;
   &lt;/div&gt;
   &lt;div&gt;2)&amp;nbsp; Creating documentation is a less than effective technique in a culture
      where no processes exist.
   &lt;/div&gt;
   &lt;div&gt;&amp;nbsp;
   &lt;/div&gt;
   &lt;div&gt;3)&amp;nbsp; If the environment is such that that proper process/documentation is
      not going to happen, attempt to go for the "low-hanging-fruit", make it easy to leverage
      components that can be used every day without much learning curve.
   &lt;/div&gt;
   &lt;div&gt;&amp;nbsp;
   &lt;/div&gt;
   &lt;div&gt;4)&amp;nbsp; There should be an established formula for perceived pain&amp;nbsp;vs. investment
      in a&amp;nbsp;learning curve vs. &lt;strong&gt;perceived value&lt;/strong&gt;
   &lt;/div&gt;
   &lt;div&gt;&amp;nbsp;
   &lt;/div&gt;
   &lt;div&gt;5)&amp;nbsp; Ability to tolerate learning curves is important, even if the learning
      curve is &amp;lt; 2 hours and the pay-off from going though this learning curve would
      payback HUGE dividends that would easily justify the learning curve, if the perceived
      value is not equal to the 2 hours, the developer will probably start from scratch.
   &lt;/div&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=61b08aee-7ea7-48d3-af7e-056c15a49bb2" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,61b08aee-7ea7-48d3-af7e-056c15a49bb2.aspx</comments>
      <category>Software Engineering</category>
    </item>
    <item>
      <trackback:ping>http://www.efficientcoder.net/Trackback.aspx?guid=cb6f27f5-1949-4695-9d8b-2675941bada2</trackback:ping>
      <pingback:server>http://www.efficientcoder.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.efficientcoder.net/PermaLink,guid,cb6f27f5-1949-4695-9d8b-2675941bada2.aspx</pingback:target>
      <dc:creator>kevinw@software-logistics.com (Kevin D. Wolf)</dc:creator>
      <wfw:comment>http://www.efficientcoder.net/CommentView,guid,cb6f27f5-1949-4695-9d8b-2675941bada2.aspx</wfw:comment>
      <wfw:commentRss>http://www.efficientcoder.net/SyndicationService.asmx/GetEntryCommentsRss?guid=cb6f27f5-1949-4695-9d8b-2675941bada2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font size="4">
            <strong>Software Engineering with WorkFlow</strong>
          </font>
        </p>
        <p>
      What is the one thing we know for certain when we start ANY software development
      effort?  It really will never be 100% complete...the functionality provided by
      the application will be a function of changes and time.  What else do we know
      of a well thought system?  The core objects of the domain and their attributes
      are fairly static, the actions that can be taken on them can be fairly well defined
      and once they are defined, the may change slightly but remail fairly constant. 
      This is the basic premis of OO, it's been a long time since my last conversation of
      OOA Object Oriented Analysis, OOP Object Oriented Programming and OOD Object
      Oriented Design.
   </p>
        <p>
      So if these concepts are fairly static, what do we mean that any real software solutions
      functionality will be a function of change and time?  These changes are mainly
      a function of how these attributes and actions are assembled and their service are
      presented to end user (or external systems).
   </p>
        <p>
      What do programmers know how to do (at least experience ones)?  Take the intent
      from the subject matter expert and convert that into 1's and 0's with the help of
      developer tools (maybe someday we'll actually get a 2 or 1.5 if we get our shtick
      together).  Once us coders build those little objects how can we translate/assemble
      those into something that actually provides something useful?   The answer
      is WorkFlow(let's assume for now we can bind some sort of UI on the functionality). 
      I believe we are getting to the point with technology where we can expose the design
      of this workflow to the subject matter expert; or at least a fairly technical one.  
   </p>
        <p>
      I believe the concept here is to leverage the concept of finite state machine, along
      with work flow id and objects or object heirarchies that know how to serilize and
      deserialize themselves.  These state machines must be able to accept events from
      many different external sources, including a user interface, time events and web services.
   </p>
        <p>
      Stay tuned for future posts on some ideas on how to empower the subject matter experts
      to maintain workflow.
   </p>
        <p>
      -ec 
   </p>
        <p>
       
   </p>
        <img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=cb6f27f5-1949-4695-9d8b-2675941bada2" />
      </body>
      <title>Software Engineering with WorkFlow</title>
      <guid>http://www.efficientcoder.net/PermaLink,guid,cb6f27f5-1949-4695-9d8b-2675941bada2.aspx</guid>
      <link>http://www.efficientcoder.net/PermaLink,guid,cb6f27f5-1949-4695-9d8b-2675941bada2.aspx</link>
      <pubDate>Thu, 19 Oct 2006 01:34:16 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font size=4&gt;&lt;strong&gt;Software Engineering with WorkFlow&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   What is the one thing we know for certain when we start&amp;nbsp;ANY software development
   effort?&amp;nbsp; It really will never be 100% complete...the functionality provided by
   the application will be a function of changes and time.&amp;nbsp; What else do we know
   of a well thought system?&amp;nbsp; The core objects of the domain and their attributes
   are fairly static, the actions that can be taken on them can be fairly well defined
   and once they are defined, the may change slightly but remail fairly constant.&amp;nbsp;
   This is the basic premis of OO, it's been a long time since my last conversation of
   OOA Object Oriented Analysis, OOP&amp;nbsp;Object Oriented Programming and OOD Object
   Oriented Design.
&lt;/p&gt;
&lt;p&gt;
   So if these concepts are fairly static, what do we mean that any real software solutions
   functionality will be a function of change and time?&amp;nbsp; These changes are mainly
   a function of how these attributes and actions are assembled and their service are
   presented to end user (or external systems).
&lt;/p&gt;
&lt;p&gt;
   What do programmers know how to do (at least experience ones)?&amp;nbsp; Take the intent
   from the subject matter expert and convert that into 1's and 0's with the help of
   developer tools (maybe someday we'll actually get a 2 or 1.5 if we get our shtick
   together).&amp;nbsp; Once us coders build those little objects how can we translate/assemble
   those into something that actually provides something useful?&amp;nbsp;&amp;nbsp; The answer
   is WorkFlow(let's assume for now we can bind some sort of UI on the functionality).&amp;nbsp;
   I believe we are getting to the point with technology where we can expose the design
   of this workflow to the subject matter expert; or at least a fairly technical one.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
   I believe the concept here is to leverage the concept of finite state machine, along
   with work flow id and objects or object heirarchies that know how to serilize and
   deserialize themselves.&amp;nbsp; These state machines must be able to accept events from
   many different external sources, including a user interface, time events and web services.
&lt;/p&gt;
&lt;p&gt;
   Stay tuned for future posts on some ideas on how to empower the subject matter experts
   to maintain workflow.
&lt;/p&gt;
&lt;p&gt;
   -ec 
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.efficientcoder.net/aggbug.ashx?id=cb6f27f5-1949-4695-9d8b-2675941bada2" /&gt;</description>
      <comments>http://www.efficientcoder.net/CommentView,guid,cb6f27f5-1949-4695-9d8b-2675941bada2.aspx</comments>
      <category>Software Engineering</category>
    </item>
  </channel>
</rss>