<feed xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
    <title>Development In a Tesseract</title>
    <link rel="self" type="application/xml" href="http://geekswithblogs.net/smitcham/Atom.aspx" />
    <subtitle type="html">Observations and Developmental Experiences</subtitle>
    <id>http://geekswithblogs.net/smitcham/Default.aspx</id>
    <author>
        <name>Steven Mitcham</name>
        <uri>http://geekswithblogs.net/smitcham/Default.aspx</uri>
    </author>
    <generator uri="http://subtextproject.com" version="Subtext Version 0.0.0.0">Subtext</generator>
    <updated>2008-01-10T12:46:12Z</updated>
    <entry>
        <title>Framework Blues</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/smitcham/archive/2008/01/10/framework-blues.aspx" />
        <id>http://geekswithblogs.net/smitcham/archive/2008/01/10/framework-blues.aspx</id>
        <published>2008-01-10T12:46:12-06:00:00</published>
        <updated>2008-01-10T12:46:12Z</updated>
        <content type="html">Being an ultra-introvert, it always freaks me out when a comment I make brings me out from under the radar.&lt;br /&gt;
&lt;br /&gt;
I &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/message/812"&gt;posted on the alt.net list&lt;/a&gt; to a thread concerning the pro's and cons.  Jeremy Miller &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2008/01/09/do-you-even-need-to-build-your-own-cab.aspx"&gt;posted an opinion&lt;/a&gt; on my comment, and I followed up with a comment on the post.&lt;br /&gt;
&lt;br /&gt;
As a reflection on all that,  I'd like to say that I think that in priciple I'm inclined to agree with Jeremy.  In practice, I'm stuck with the Framework that led to the post.&lt;br /&gt;
&lt;br /&gt;
I believe that my ideas of what a 'Framework' should be is changing.  Jeremy talks about code generation and the templates and IDE productivity stuff, but I think that I'm going a different route myself, although it wouldn't be the first time I was wrong.&lt;br /&gt;
&lt;br /&gt;
What I've been currently trying to do, with the help of the language enhancements (anonymous delegates, generics, lambda expressions, etc.) is get libraries of limited scope reusable objects that can be modified through the use of generics and delegates to perform instance specific work.&lt;br /&gt;
&lt;br /&gt;
What I am working on right now involves a ton of reuse,  many of our systems are basically made up of building blocks that are identical in specification.  Our framework involved creating blocks of reusable objects, along with the rules of validation, that could be dropped into place.&lt;br /&gt;
&lt;br /&gt;
For the first round of systems (which were almost identical), this worked very well; however, as more less similar systems were included, the framework started to show strain.  My original point was that the framework would have been able to be adapted or evolved into a better form, except that the development contracts were written in such a way as to preclude any further development on the system in question (a bad choice by program management).  Once we finally got the money in place to make updates to the framework, the enhancements are stretching the capabilities of the framework.&lt;br /&gt;
&lt;br /&gt;
One of the biggest issues I've had recently was to try to convince a team not to use the system for a project that didn't fit well with the design intent with the framework, and they suffered exactly the fate that Jeremy mentions in his post and would have been better off starting from scratch.&lt;img src="http://geekswithblogs.net/smitcham/aggbug/118439.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>A missing piece to CMMI</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/smitcham/archive/2007/10/30/A-missing-piece-to-CMMI.aspx" />
        <id>http://geekswithblogs.net/smitcham/archive/2007/10/30/A-missing-piece-to-CMMI.aspx</id>
        <published>2007-10-30T11:27:07-05:00:00</published>
        <updated>2007-10-30T11:27:07Z</updated>
        <content type="html">&lt;p&gt;I've been working in organizations that adhere to some level of the CMMI for some time now.  And we are trying to fit what we can of agile programming into our process, and hopefully are achieving better results while still keeping the structure required of our contracts.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;A long time ago I ran across this article which discusses some of the levels of process that are often encountered in the wild, but rarely discussed by SEI.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;So here's the &lt;strong&gt;&lt;a href="http://www.stsc.hill.af.mil/crosstalk/1996/11/xt96d11h.asp"&gt;The Capability Im-Maturity Model (CIMM)&lt;/a&gt;&lt;/strong&gt; as envisioned by Capt. Tom Shorsch USAF.&lt;/p&gt;&lt;img src="http://geekswithblogs.net/smitcham/aggbug/116457.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Work Life Balance</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/smitcham/archive/2007/10/24/Work-Life-Balance.aspx" />
        <id>http://geekswithblogs.net/smitcham/archive/2007/10/24/Work-Life-Balance.aspx</id>
        <published>2007-10-24T22:09:01-05:00:00</published>
        <updated>2007-10-24T22:10:14Z</updated>
        <content type="html">&lt;a href="http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=2131"&gt;Chris Sells&lt;/a&gt; has been writing on working at home, and &lt;a href="http://www.hanselman.com/blog/MicrosoftSurvivingFirstThreeWeeksAsARemoteEmployee.aspx"&gt;Scott Hanselman&lt;/a&gt; has as well.&lt;br /&gt;
&lt;br /&gt;
As for myself, my employer frowns on working at home, although I am on a laptop, and we do have a VPN.  Several times I have gotten permission to work from home simply so I can focus on one project at a time and actually accomplish things.&lt;br /&gt;
&lt;br /&gt;
My normal course of action is to keep accepting small tasks that 'should be done easily' and then have them pile up as the daily fires appear and consume my time.&lt;br /&gt;
&lt;br /&gt;
Ultimately, my to do list threatens to suck my computer into the void due to its massive gravitational weight and I have to blow everyone off and get the plate clean again.&lt;br /&gt;
&lt;br /&gt;
I'm not sure if working full time from home would work from me,  I certainly doubt my employer would buy into it.  But currently, I'm sitting at the office trying to play the same game of catch-up.  It's 10pm and I'd rather be home to do this work.&lt;img src="http://geekswithblogs.net/smitcham/aggbug/116312.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Extension Methods and Dictionaries</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/smitcham/archive/2007/10/19/Extension-Methods-and-Dictionaries.aspx" />
        <id>http://geekswithblogs.net/smitcham/archive/2007/10/19/Extension-Methods-and-Dictionaries.aspx</id>
        <published>2007-10-19T15:24:54-05:00:00</published>
        <updated>2007-10-19T15:24:54Z</updated>
        <content type="html">&lt;p&gt;I have started looking at improvements to the NMock2 code with respect to writing a branch of the code in .NET 3.5.&lt;/p&gt;  &lt;p&gt;The availability of extension methods in C# 3.0 have solved a common code issue of mine where I want to use Dictionary.TryGetValue to see if there is a value in a dictionary for a given key and create a default if not.  Which leads to the following code.&lt;/p&gt;  &lt;p&gt;public static class ExtensionMethods   &lt;br /&gt;{    &lt;br /&gt;    public static U SafeGetValue&amp;lt;T,U&amp;gt;(this Dictionary&amp;lt;T,U&amp;gt; dictionary, T key)     &lt;br /&gt;      where U:new()    &lt;br /&gt;    {    &lt;br /&gt;        U value;    &lt;br /&gt;        if (!dictionary.TryGetValue(key, out value))    &lt;br /&gt;        {    &lt;br /&gt;            dictionary[key] = value = new U();    &lt;br /&gt;        }    &lt;br /&gt;        return value;    &lt;br /&gt;    } &lt;/p&gt;  &lt;p&gt;    public delegate U NewInstance&amp;lt;U&amp;gt;(); &lt;/p&gt;  &lt;p&gt;    public static U SafeGetValue&amp;lt;T, U&amp;gt;(this Dictionary&amp;lt;T, U&amp;gt; dictionary, T key, NewInstance&amp;lt;U&amp;gt; newInstance)   &lt;br /&gt;    {    &lt;br /&gt;        U value;    &lt;br /&gt;        if (!dictionary.TryGetValue(key, out value))    &lt;br /&gt;        {    &lt;br /&gt;            dictionary[key] = value = newInstance();    &lt;br /&gt;        }    &lt;br /&gt;        return value;    &lt;br /&gt;    }    &lt;br /&gt;} &lt;/p&gt;&lt;img src="http://geekswithblogs.net/smitcham/aggbug/116170.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Why half implementations of TDD don't work</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/smitcham/archive/2007/09/12/Why-half-implementations-of-TDD-dont-work.aspx" />
        <id>http://geekswithblogs.net/smitcham/archive/2007/09/12/Why-half-implementations-of-TDD-dont-work.aspx</id>
        <published>2007-09-12T08:26:32-05:00:00</published>
        <updated>2007-09-12T08:26:32Z</updated>
        <content type="html">Currently I'm in the process of reviewing some code that was written and then had MbUnit tests written to back flush the requirements.  Since I'm part of a more traditional shop, the code has already been peer reviewed.  The tests, of course, revealed errors in the code that weren't caught as a part of the peer review; so the code was corrected and re-reviewed.  Of course, when the tests were reviewed, the tests were found to have errors, which precipitated further changes.&lt;br /&gt;
&lt;br /&gt;
I addressed the approach we are using to fix this effect (although the fix won't be perfect due to the limitations of our process) in the post &lt;a href="http://geekswithblogs.net/smitcham/archive/2007/08/20/Making-the-most-of-traditional-peer-reviews.aspx"&gt;How to make the most of traditional peer reviews&lt;/a&gt;.&lt;img src="http://geekswithblogs.net/smitcham/aggbug/115303.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Infragistics Pain</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/smitcham/archive/2007/09/06/Infragistics-Pain.aspx" />
        <id>http://geekswithblogs.net/smitcham/archive/2007/09/06/Infragistics-Pain.aspx</id>
        <published>2007-09-06T21:59:38-05:00:00</published>
        <updated>2007-09-06T21:59:38Z</updated>
        <content type="html">It is entirely possible for something to have too many features.&lt;br /&gt;
&lt;br /&gt;
In response to a question from a co-worker, we spent approximately 2 hours digging through the options and model structure of the Infragistics UltraGrid control to discover the way to get the bound rectangle of a row for a drag operation.&lt;br /&gt;
&lt;br /&gt;
While I get the desire for everything to be super customizable, at some point it seems like overkill.&lt;img src="http://geekswithblogs.net/smitcham/aggbug/115197.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Debugging Visual Basic 6 code through Visual Studio 2005</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/smitcham/archive/2007/08/23/Debugging-Visual-Basic-6-code-through-Visual-Studio-2005.aspx" />
        <id>http://geekswithblogs.net/smitcham/archive/2007/08/23/Debugging-Visual-Basic-6-code-through-Visual-Studio-2005.aspx</id>
        <published>2007-08-23T11:34:14-05:00:00</published>
        <updated>2007-08-23T11:34:14Z</updated>
        <content type="html">Today I had an issue where an application that as a mixture of .NET, VB6 and C++ code needed to be debugged.  Since the component that I needed to look at was in the VB 6 portion, I attempted to debug from VB6 only to be met with a variety of bizarre errors.&lt;br /&gt;
&lt;br /&gt;
I don't have visibility into the rest of the application, so I continued with the .NET 2005 debugging session, which executed correctly, and noticed that I could set a breakpoint in the VB 6 code when the unmanaged debugging support was turned on.&lt;br /&gt;
&lt;br /&gt;
The debugger visualizations are not quite correct, the .NET objects were showing up a &amp;lt;void&amp;gt;, but I was surprised to see that you could do this at all.  I was able to trace through to the source of the error and move on.&lt;img src="http://geekswithblogs.net/smitcham/aggbug/114922.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>BindFailures MDA in VS 2005</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/smitcham/archive/2007/08/22/BindFailures-MDA-in-VS-2005.aspx" />
        <id>http://geekswithblogs.net/smitcham/archive/2007/08/22/BindFailures-MDA-in-VS-2005.aspx</id>
        <published>2007-08-22T23:37:55-05:00:00</published>
        <updated>2007-08-22T23:38:35Z</updated>
        <content type="html">&lt;p&gt;While debugging a COM Interop error I came across the fact that Binding Failures can now be trapped in the IDE using the BindingFailurse MDA (Managed Debugging Assistant).  Up until today, I'd still been using the FUSLOGVW utility to track down binding failures.&lt;/p&gt;&lt;img src="http://geekswithblogs.net/smitcham/aggbug/114911.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Solid build process</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/smitcham/archive/2007/08/22/Solid-build-process.aspx" />
        <id>http://geekswithblogs.net/smitcham/archive/2007/08/22/Solid-build-process.aspx</id>
        <published>2007-08-22T23:36:24-05:00:00</published>
        <updated>2007-08-22T23:36:24Z</updated>
        <content type="html">&lt;p&gt;Experiences today have made me realize how important a solid build process is.  I spent 6 hours today trying to get a development environment in a virtual machine to build the source to a component that I needed to help debug.  The actual debugging session has taken less than five minutes and will probably take only about another 30 minutes tomorrow.&lt;/p&gt;&lt;img src="http://geekswithblogs.net/smitcham/aggbug/114910.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Making the Most of Traditional Peer Reviews</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/smitcham/archive/2007/08/20/Making-the-most-of-traditional-peer-reviews.aspx" />
        <id>http://geekswithblogs.net/smitcham/archive/2007/08/20/Making-the-most-of-traditional-peer-reviews.aspx</id>
        <published>2007-08-20T13:12:23-05:00:00</published>
        <updated>2007-08-20T13:54:50Z</updated>
        <content type="html">&lt;font face="Arial"&gt;
&lt;p&gt;In the traditional waterfall development process, one of the key pieces of quality assurance is the traditional peer review. In theory, peer reviews allow additional coders to view the code and hopefully discover issues before the make it into the release of the software. &lt;/p&gt;
&lt;p&gt;Unfortunately, in practice,  the reviews do not really add meaningful value to the development process.  Typically, the reviews are done near the end of development, and are almost always superficial in nature.  The first few files in the review get a decent treatment, but quickly the effort turns to just validating the coding standard and perhaps finding some examples of the reviewers pet issues. In an effort to reduce this tendency, often limits are imposed to the number of files, or number of lines that can be placed in a review, but that only adds the additional overhead of more reviews.&lt;/p&gt;
&lt;p&gt;My team is currently involved in a very large coding effort and our peer reviews are encountering the same kind of symptoms.  In an effort to improve the situation, I've been moved to make the following suggestion in how to deal with peer reviews in the future.  Some of the remedy involves borrowing techniques from agile development to help focus the point of the reviews.  It is possible that something similar can be done without the use of the agile methods, but I believe that the method described is a good mix of the traditional and the agile.&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;strong&gt;The Steps&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;First, it is important not to review things that are better reviewed by a machine.  We are creating a gateway procedure that uses the tools available to us to eliminate the common, clerical findings that clutter up most peer reviews.  The starting point is using a tool, such as Resharper, to assist in getting the code into the standard format.  Also, tools are used to measure complexity as well as check against basic coding standards.  We are currently using the Static Analysis function in Visual Studio Team Developer Edition.  Finally, we have implemented the requirement for executable unit tests (in MbUnit) that are passing and have at least 85% coverage. By letting the peer review moderator ensure that the code has been run through these tools first, and that the code is passing a basic level of quality before involving more than one other &lt;/font&gt;&lt;font face="Arial"&gt;person in a review.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Once the review is allowed to go foward, the 'peer review' is actually divided into two parts.  The first review&lt;font face="Arial"&gt; takes the set of unit tests and matches them against the requirements.  The purpose of this review is two-fold,  to ensure that all the requirements have been satisfied, and to ensure that as written, each test actually tests what it says it does.  The code the unit tests are executing is not reviewed at this time.  &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Given that the units test are passing (we would hope), then if the requirements map to the tests and the tests test what they say they do, we have a level of confidence in the code under test.  Additionally, if a problem is found with the requirements, or the tests, then we know that it is fruitless to continue with the rest of the review cycle.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;After the review of the unit tests is complete, and any findings in the tests have been worked through the codebase, then we proceed with a review of the code itself.  Because of the earlier steps, the reviewers understand the requirements and have reviewed the tests which should give them a basic understanding of what they are actually reviewing.  Additionally, because all the clerical noise and basic 'correctness' has been dealt with via tools and the earlier reviews, the reviewers are free to examine the more important (and more difficult to automate) issues of maintainability, and hard to find errors such as memory leaks. &lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt; In the pilot projects where we have run this process all the way through, we are seeing additional benefits from our code reviews.&lt;/p&gt;
&lt;/font&gt;&lt;img src="http://geekswithblogs.net/smitcham/aggbug/114810.aspx" width="1" height="1" /&gt;</content>
    </entry>
</feed>