<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Dynamic Concepts (in) Development</title>
        <link>http://geekswithblogs.net/TheCPUWizard/Default.aspx</link>
        <description>Musings of TheCPUWizard</description>
        <language>en-US</language>
        <copyright>David V. Corbin</copyright>
        <managingEditor>david.corbin@dynconcepts.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <image>
            <title>Dynamic Concepts (in) Development</title>
            <url>http://geekswithblogs.net/images/RSS2Image.gif</url>
            <link>http://geekswithblogs.net/TheCPUWizard/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>My New Blog</title>
            <link>http://geekswithblogs.net/TheCPUWizard/archive/2011/04/18/my-new-blog.aspx</link>
            <description>&lt;p&gt;After much careful consideration, I have decided to host my primary blog with WordPress&lt;/p&gt;
&lt;p&gt;&lt;a href="http://davidvcorbin.wordpress.com/"&gt;Software Development in a Dynamic Environment&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Working with the team at GeeksWithBlogs.net has been a wonderful experience, and I will periodically make posts here.&lt;/p&gt;
&lt;p&gt;Please stop by the new blog, and see what is happening....&lt;/p&gt; &lt;img src="http://geekswithblogs.net/TheCPUWizard/aggbug/144944.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David V. Corbin</dc:creator>
            <guid>http://geekswithblogs.net/TheCPUWizard/archive/2011/04/18/my-new-blog.aspx</guid>
            <pubDate>Mon, 18 Apr 2011 23:46:47 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TheCPUWizard/comments/144944.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TheCPUWizard/archive/2011/04/18/my-new-blog.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/TheCPUWizard/comments/commentRss/144944.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TheCPUWizard/services/trackbacks/144944.aspx</trackback:ping>
        </item>
        <item>
            <title>GiveCamp NYC 2011 - Project Development in under 48 hours</title>
            <category>Developing Agile Software</category>
            <category>Random Musings</category>
            <category>Developers Notes</category>
            <link>http://geekswithblogs.net/TheCPUWizard/archive/2011/01/18/givecamp-nyc-2011---project-development-in-under-48-hours.aspx</link>
            <description>&lt;p&gt;This past weekend (Jan 14-16) there were &lt;a href="http://www.givecamp.org/"&gt;GiveCamp&lt;/a&gt; events accross the country. At the &lt;a href="http://nycgivecamp.org/"&gt;New York City&lt;/a&gt; event, nearly 100 developers, designers and database administrators came together to dontate their time to provide technology solutions for over a half dozen charities.&lt;/p&gt;
&lt;p&gt;The experience was amazing, projects that would normally take weeks or months went from concept to delivery between 6:30pm Friday evening and 3:00pm Sunday afternoon. There were many comparisions to both Habitat for Humanity and Extreme Makeover Home Edition. Just like those events, the concept was simply, leverage the power of many volunteers to provide something (in this case, applied technology) that the people in need could not afford.&lt;/p&gt;
&lt;p&gt;The majority of the projects were to create (or significantly rework) a web presence for the charity. Depending on the charities needs, different technologies were choosen (Joomla, WordPress, Orchard, were a few) and many of the websites included the ability to access online donations (typically via PayPal or Google Checkout). Typically the team that created the solution had only one or two members who had experience with the technology prior to the start of the weekend, making the successes even more amazing.&lt;/p&gt;
&lt;p&gt;The project I was involved with, was a bit different from the rest [aren't most of my projects?]. &lt;a href="http://www.robinhood.org/home.aspx"&gt;Robin Hood &lt;/a&gt;&lt;em&gt;is a charity that targets poverty in New York City by finding and funding the best and most effective programs and partnering with them with them to maximize results. &lt;/em&gt;They have an in-house staff of IT that develops and manages their web-site as well as an internal SharePoint site. In order to maximize the capabilities of the SharePoint site, they needed four functional items that were beyond their capabilities.&lt;/p&gt;
&lt;p&gt;This meant we were going to be doing some "hard core development", with the result being a set of Visual Studio 2010 projects that the team at Robin Hood could then integrate with their overall site, and also continue to maintain the codebase to address the inevitable changes that would be necessary. Based on my experiences, I knew that if we adopted a purely "ad-hoc" process, that items would be missed and the it would be nearly impossible to coordinate the 9 developers (some of which had zero SharePoint knowledge, others which had SharePoint, but not Development, etc) in a way that could make the best use of their skills.&lt;/p&gt;
&lt;p&gt;I began to think...Can you adopt a (Very) light weight &lt;strong&gt;ALM practices &lt;/strong&gt;and use &lt;strong&gt;TFS 2010 &lt;/strong&gt;to manage the projects development when the &lt;em&gt;&lt;strong&gt;iteration/sprint cycle is 2-3 hours&lt;/strong&gt;&lt;/em&gt;,  to go from concept to a working set of deliverables uploaded to a "production" SharePoint site????&lt;/p&gt;
&lt;p&gt;I spend Friday night setting up a development local area network (local wireless access to our "server", with a bridge over the facility's wireless network to access external sites), a development domain, a TFS server complete with a build machine, and a few Visual Studio 2010 / SharePoint 2010 development VM's. By Saturday morning it was ready to go, with the initial 4 requirements entered in as User Stories (Epics) and a number of workitems (tasks) ready for assignment.&lt;/p&gt;
&lt;p&gt;For the next 30 hours, the team worked on the items, issues/bugs/tasks were created, items were commited to source control, and the incremental results uploaded to a temporary server (Thank you Becky Isserman for installing and configuring SharePoint!! in this environment).&lt;/p&gt;
&lt;p&gt;With three hours left before the presentation of our work to the entire audience, we had "beta" versions of each of the components up and running on the "production server", and a full set of artifacts recorded in TFS that could be turned over the the charity (by detaching and delivering the TPC).&lt;/p&gt;
&lt;p&gt;To the best of my knowledge, this is the shortest development cycle where TFS has been setup, configured, and used to create a set of deliverables. We took a lot of shortcuts in order to tailor "the process" so that it would work smoothly under this extreme time compression, but the only word I can think of to describe the result was Amazing!.&lt;/p&gt;
&lt;p&gt;After a good nights sleep, I was reflecting back on the expreience. By Sunday, most of us were so sleep deprived that short term memory, retention and other cognititave thought processes were significantly impaired. If we had gone with an "ad-hoc" process, and attempted to just use the white board (which was filled and erased many times) along with manual notes, I am convinced that we would not have been able to achieve the results that we did.&lt;/p&gt;
&lt;p&gt;Special thanks go out to team members (alhpabetically): Azret Botash, Becky Isserman, Qinfu Chen, Rajeshwar Kokkula, Ryan Finnesey, Tom Daly, and Tome Tanasovski.  Jimmy Park from Robin Hood also deserves a big hand, for being able to deal with all of us!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt; &lt;img src="http://geekswithblogs.net/TheCPUWizard/aggbug/143522.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David V. Corbin</dc:creator>
            <guid>http://geekswithblogs.net/TheCPUWizard/archive/2011/01/18/givecamp-nyc-2011---project-development-in-under-48-hours.aspx</guid>
            <pubDate>Tue, 18 Jan 2011 13:50:08 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TheCPUWizard/comments/143522.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TheCPUWizard/archive/2011/01/18/givecamp-nyc-2011---project-development-in-under-48-hours.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TheCPUWizard/comments/commentRss/143522.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TheCPUWizard/services/trackbacks/143522.aspx</trackback:ping>
        </item>
        <item>
            <title>Do (Software) Architects Architect?</title>
            <category>Developing Agile Software</category>
            <category>Developers Notes</category>
            <link>http://geekswithblogs.net/TheCPUWizard/archive/2010/11/18/do-software-architects-architect.aspx</link>
            <description>&lt;p&gt;The first question, is “Why is architect being used as a verb?”.  Mirriam-Webster dictionary does not contain a definition of architect as a verb, nor do many other recognized dictionaries. On the other hand, dictionary.com does add an entry for the use of the word as a verb:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="font-size: small"&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;strong&gt;Architect&lt;/strong&gt;&lt;br /&gt;
4. to plan, organize, or structure as an architect: The house is well architected.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This gives us three key words to start with: “plan”, “organize” and “structure”. Unfortunately these terms can apply to work done by many others involved in the project ranging from project managers to software engineers. So we must return to the key part of the definition “as an architect”&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;span style="font-size: small"&gt;–noun &lt;br /&gt;
1. a person who engages in the profession of architecture. &lt;br /&gt;
2. a person professionally engaged in the design of certain large constructions other than buildings and the like: landscape architect; naval architect. &lt;br /&gt;
3. the deviser, maker, or creator of anything: the architects of the Constitution of the United States&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Each these definitions provide some clues, however the last two do nothing to clarify the boundary between the architect’s role and that of the other team members. We are forced to return to the dictionary to see what the “profession of architecture” entails. Emphasis added to highlight aspects which will be discussed in this post.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;span style="font-size: small"&gt;&lt;strong&gt;architecture&lt;br /&gt;
&lt;/strong&gt;–noun &lt;br /&gt;
1. the profession of &lt;font style="font-weight: bold"&gt;&lt;em&gt;designing&lt;/em&gt;&lt;/font&gt; buildings, open areas, communities, and other &lt;font style="font-weight: bold"&gt;&lt;em&gt;artificial constructions and environments&lt;/em&gt;&lt;/font&gt;, usually with some regard to aesthetic effect. Architecture &lt;font style="font-weight: bold"&gt;&lt;em&gt;often includes design&lt;/em&gt; &lt;/font&gt;or selection of furnishings and decorations, &lt;font style="font-weight: bold"&gt;&lt;em&gt;supervision of construction work&lt;/em&gt;&lt;/font&gt;, and the &lt;font style="font-weight: bold"&gt;&lt;em&gt;examination&lt;/em&gt;&lt;/font&gt;, &lt;font style="font-weight: bold"&gt;&lt;em&gt;restoration&lt;/em&gt;&lt;/font&gt;, or &lt;font style="font-weight: bold"&gt;&lt;em&gt;remodeling&lt;/em&gt;&lt;/font&gt; of existing buildings. &lt;br /&gt;
2. the &lt;font style="font-weight: bold"&gt;&lt;em&gt;character or style&lt;/em&gt;&lt;/font&gt; of building: the architecture of Paris; Romanesque architecture. &lt;br /&gt;
3. the action or process of building; construction. &lt;br /&gt;
4. the &lt;font style="font-weight: bold"&gt;&lt;em&gt;result or product of architectural work&lt;/em&gt;&lt;/font&gt;, as a building. &lt;br /&gt;
5. buildings collectively. &lt;br /&gt;
6. a fundamental underlying design of computer hardware, software, or both. &lt;br /&gt;
7. the &lt;font style="font-weight: bold"&gt;&lt;em&gt;structure&lt;/em&gt;&lt;/font&gt; of anything: the architecture of a novel.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;None of these definitions (with the exception of #6) are specific to software architecture, but still can supply some valuable information as highlighted in the above text. These items can be divided into two distinct categories. The first (and most obvious) are those that relate to a specific undertaking. The second are the items which are more reflective in nature, typically the results of finding the common (and contrasting)  properties among  multiple specific instances. To simplify discussion of these two group, I propose the use of two terms: “&lt;strong&gt;&lt;em&gt;Architectural Design&lt;/em&gt;&lt;/strong&gt;” for the first category, and “&lt;strong&gt;&lt;em&gt;Architectural Style&lt;/em&gt;&lt;/strong&gt;” for the second.&lt;/p&gt;
&lt;p&gt;Returning to the title question, we can rephrase it as two distinct questions: “Do software architects create architectural designs?” and “Do software architects create architectural styles?”. The answer to the first question is a resounding yes (although we must still determine show architectural designs are distinguished from more detailed design and construction artifacts and activities). The creation of architectural styles is a different matter.&lt;/p&gt;
&lt;p&gt;The creation of a new “style” in any field is not something that is frequently attributable to a single person (or team).  In the cases where attribution can be given, it is unusual for the originator to even have been aware that they were creating something that would be recognized and adopted as a style by their peers. Consider “brick&amp;amp;mortar” architecture; “Greek”, “Roman”, “Victorian”, “Tudor”, “Modern”, “Post-Modern” are all recognized and fairly well defined; however, all of them were identified “after the fact” by analyzing common features that were used by architects in creating specific “architectural designs” at a particular point in time and/or geographic location.&lt;/p&gt;
&lt;p&gt;I believe that the same is true for software (and other technology related) architecture(s). A recognized architecture style is something that is typically distilled from the work of many, with only a few cases being the result of a specific individual or team.&lt;/p&gt;
&lt;p&gt;So to all the software architects reading this, I wish you well in creating robust, effective architectural designs – and (if you are very skillful and lucky) may history possibly look back at some of your work and recognize your contribution to an architectural style.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/TheCPUWizard/aggbug/142766.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David V. Corbin</dc:creator>
            <guid>http://geekswithblogs.net/TheCPUWizard/archive/2010/11/18/do-software-architects-architect.aspx</guid>
            <pubDate>Thu, 18 Nov 2010 15:04:25 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TheCPUWizard/comments/142766.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TheCPUWizard/archive/2010/11/18/do-software-architects-architect.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TheCPUWizard/comments/commentRss/142766.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TheCPUWizard/services/trackbacks/142766.aspx</trackback:ping>
        </item>
        <item>
            <title>Selectively Exposing Functionallity in .Net</title>
            <category>Developers Notes</category>
            <link>http://geekswithblogs.net/TheCPUWizard/archive/2010/05/06/delegatebasedinterfaces.aspx</link>
            <description>&lt;p&gt;Any developer should be aware of the principles of encapsulation, cross-tier isolation, and cross-functional separation of concerns. However, it seems the few take the time to consider the adage of "minimal yet complete"&lt;sup&gt;1 &lt;/sup&gt;when developing the software.&lt;/p&gt;
&lt;p&gt;Consider the exposure of "business objects" to the user interface. Some common situations occur:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Accessing a given element requires a compound set of calls that do not "make sense" to the User Interface.&lt;/li&gt;
    &lt;li&gt;More information than absolutely required is exposed to the user interface&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It would be much cleaner if a custom interface was provided that exposed exactly (and only) the information that is required by the consumer.&lt;/p&gt;
&lt;p&gt;Achieving this using conventional techniques would require the creation (and maintenance!) of custom classes to filter and transpose the information into the ideal format. Determining the ROI on this approach can be very difficult to ascertain, and as a result it is often ignored completely.&lt;/p&gt;
&lt;p&gt;There is another approach, which is largely made practical by virtual of the &lt;strong&gt;&lt;span style="font-family: Courier New"&gt;Action&lt;/span&gt;&lt;/strong&gt; and &lt;strong&gt;Func&lt;/strong&gt; delegates. From a callers point of view, the following two samples can be used interchangeably:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New"&gt;
&lt;p&gt;    interface ISomeInterface&lt;br /&gt;
    {&lt;br /&gt;
        void SampleMethod1(string param);&lt;br /&gt;
        string SamepleMethod2(string param);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;/p&gt;
&lt;p&gt;    class ISomeInterface&lt;br /&gt;
    {&lt;br /&gt;
        public Action&amp;lt;string&amp;gt; SampleMethod1 {get; }&lt;br /&gt;
        public Func&amp;lt;string,string&amp;gt; SamepleMethod2 {get; }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;/p&gt;
&lt;p&gt;The capabilities this simple changes enable are significant (and remember it does not cange the syntax at the call site):&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;The delegates can be initialized to directly call the proper method of any target class.&lt;/li&gt;
    &lt;li&gt;The delegates can be dynamically updated based on the current state.&lt;/li&gt;
    &lt;li&gt;The "interface" can NOT be cast to the concrete class (which often exposes more functionallity).&lt;/li&gt;
    &lt;li&gt;This patterns&lt;/li&gt;
    &lt;li&gt;By limiting the interface to the exact functionallity required, the reduced surface area will typically result in lower development, testing and maintenance costs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We are currently in the process of posting a project on CodePlex which illustrates this (and many other) techniques which have proven helpful in creating robust yet flexible solutions that are highly efficient&lt;sup&gt;2&lt;/sup&gt; and maintainable. This post will be updated as soon as the project is published.&lt;/p&gt;
&lt;span style="font-family: Courier New"&gt;
&lt;p style="margin-left: 40px"&gt;&lt;span style="font-size: smaller"&gt;1) Credit: Scott  Meyers, Effective C++, Addison-Wesley 1992&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style="font-size: smaller"&gt;2) For those who read my previous post on performance it should be noted that the use of delegates is on the same order of magnitude (actually a tiny amount faster) as conventional interfaces.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt; &lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;img src="http://geekswithblogs.net/TheCPUWizard/aggbug/139701.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David V. Corbin</dc:creator>
            <guid>http://geekswithblogs.net/TheCPUWizard/archive/2010/05/06/delegatebasedinterfaces.aspx</guid>
            <pubDate>Fri, 07 May 2010 02:44:51 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TheCPUWizard/comments/139701.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TheCPUWizard/archive/2010/05/06/delegatebasedinterfaces.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/TheCPUWizard/comments/commentRss/139701.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TheCPUWizard/services/trackbacks/139701.aspx</trackback:ping>
        </item>
        <item>
            <title>Interfaces and Virtuals Everywhere????</title>
            <category>Developers Notes</category>
            <link>http://geekswithblogs.net/TheCPUWizard/archive/2010/05/06/interfacesandvirtuals.aspx</link>
            <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;First a disclaimer; this post is about micro-optimization of C# programs and does not apply to most common scenarios - but when it does, it is important to know.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Many developers are in the habit of declaring member virtual to allow for future expansion or using interface based designs&lt;sup&gt;1&lt;/sup&gt;. Few of these developers think about what the runtime performance impact of this decision is.&lt;/p&gt;
&lt;p&gt;A simple test will show that this decision can have a serious impact. For our purposes, we used a simple loop to time the execution of 1 billion calls to both non-virtual and virtual implementations of a method that took no parameters and had a void return type:&lt;/p&gt;
&lt;p style="margin-left: 40px"&gt;&lt;span style="font-family: Courier New"&gt;Direct Call:     1.5uS&lt;br /&gt;
Virtual Call:   13.0uS&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The overhead of the call increased by nearly an order of magnitude!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once again, it is important to realize that if the method does anything of significance then this ratio drops quite quickly. If the method does just 1mS of work, then the differential only accounts for a 1% decrease in performance. Additionally the method in question must be called thousands of times in order to produce a meaqsurable impact at the application level.&lt;/p&gt;
&lt;p&gt;Yet let us consider a situation such as the per-pixel processing of a graphics processing application. Here we may have a method which is called millions of times and even the slightest increase in overhead can have significant ramification. In this case using either explicit virtuals or interface based constructs is likely to be a mistake.&lt;/p&gt;
&lt;p&gt;In conclusion, good design principles should always be the driving force behind descisions such as these; but remember that these decisions do not come for free.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p style="margin-left: 40px"&gt;&lt;span style="font-size: smaller"&gt;1) When a concrete class member implements an interface it does not need to be explicitly marked as virtual (unless, of course, it is to be overriden in a derived concerete class). Nevertheless, &lt;em&gt;when accessed via the interface &lt;/em&gt;it behaves exactly as if it had been marked as virtual. &lt;/span&gt;&lt;/p&gt; &lt;img src="http://geekswithblogs.net/TheCPUWizard/aggbug/139700.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David V. Corbin</dc:creator>
            <guid>http://geekswithblogs.net/TheCPUWizard/archive/2010/05/06/interfacesandvirtuals.aspx</guid>
            <pubDate>Fri, 07 May 2010 01:46:19 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TheCPUWizard/comments/139700.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TheCPUWizard/archive/2010/05/06/interfacesandvirtuals.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TheCPUWizard/comments/commentRss/139700.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TheCPUWizard/services/trackbacks/139700.aspx</trackback:ping>
        </item>
        <item>
            <title>Does Test Driven Development (TDD) improve Quality and Correctness? (Part 1)</title>
            <category>Developing Agile Software</category>
            <category>Contrary Views</category>
            <link>http://geekswithblogs.net/TheCPUWizard/archive/2010/03/11/does-test-driven-development-tdd-improve-quality-and-correctness.aspx</link>
            <description>&lt;p&gt;Since the dawn of the computer age, various methodologies have been introduced to improve quality and reduce cost. In this posting, I will by sharing my experiences with Test Driven Development; both its benefits and limitations.&lt;/p&gt;
&lt;p&gt;To start this topic, we need to agree on what TDD is. The first is to define each of the three words as used in this context.&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Test&lt;/strong&gt; - An item or action which measures something in some quantifiable form.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Driven&lt;/strong&gt; - The primary motivation or focus of a series of activities (process)&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Development &lt;/strong&gt;- All phases of a software project/product from concept through delivery.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The above are very simple definitions that result in the following:&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;em&gt;&lt;strong&gt;"TDD is a process where the primary focus is on measuring and quantifying &lt;br /&gt;
all aspects of the creation of a (software) product."&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There are many places where TDD is used outside of software development, even though it is not known by this name. Consider the (conventional) education process that most of us grew up on. The focus was to get the best grades as measured by different tests. Many of these tests measured rote memorization and not understanding of the subject matter. The result of this that many people graduated with high scores but without "quality and correctness" in their ability to utilize the subject matter (of course, the flip side is true where certain people DID understand the material but were not very good at taking this type of test).&lt;/p&gt;
&lt;p&gt;Returning to software development, let us look at some common scenarios. While these items are generally applicable regardless of platform, language and tools; the remainder of this post will utilize Microsoft Visual Studio and Team Foundation Server (TFS) for examples.&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;It should be realized that everyone does at least some aspect of TDD. At the most rudimentary level, getting a program to compile involves a "pass/fail" measurement (is the syntax valid) that drives their ability to proceed further (run the program).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
    &lt;li&gt;Other developers may create "Unit Tests" in the belief that having a test for every method/property of a class and good code coverage is the goal of TDD. These items may be helpful and even important, but really only address a small aspect of the overall effort.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To see TDD in a bigger view, lets identify the various activities that are part of the Software Development LifeCycle. These are going to be presented in a Waterfall style for simplicity, but each item also occurs within Iterative methodologies such as Agile/Scrum. the key ones here are:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Requirements Gathering&lt;/li&gt;
    &lt;li&gt;Architecture&lt;/li&gt;
    &lt;li&gt;Design&lt;/li&gt;
    &lt;li&gt;Implementation&lt;/li&gt;
    &lt;li&gt;Quality Assurance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Can each of these items be subjected to a process which establishes metrics (quantified metrics) that reflect both the quality and correctness of each item?&lt;/strong&gt; It should be clear that conventional Unit Tests do not apply to all of these items; at best they can verify that a local aspect (e.g. a Class/Method) of implementation matches the (test writers perspective of) the appropriate design document. So what can we do?&lt;/p&gt;
&lt;p&gt;For each of area, the goal is to create tests that are quantifiable and durable. The ability to quantify the measurements (beyond a simple pass/fail) is critical to tracking progress(eventually measuring the level of success that has been achieved) and for providing clear information on what items need to be addressed (along with the appropriate time to address them - in varying levels of detail) . Durability is important so that the test can be reapplied (ideally in an automated fashion) over the entire cycle.&lt;/p&gt;
&lt;p&gt;Returning for a moment back to our "education example", one must also be careful of how the tests are organized and how the measurements are taken. If a test is in a multiple choice format, there is a significant statistical probability that a correct answer might be the result of a random guess. Also, in many situations, having the student simply provide a final answer can obscure many important elements. For example, on a math test, having the student simply provide a numeric answer (rather than showing the methodology) may result in a complete mismatch between the process and the result. It is hard to determine which is worse: The student who makes a simple arithmetric error at one step of a long process (resulting in a wrong answer) or The student who (without providing the "workflow") uses a completely invalid approach, yet still comes up with the right number.&lt;/p&gt;
&lt;p&gt;The "Wrong Process"/"Right Answer" is probably the single biggest problem in software development. Even very simple items can suffer from this. As an example consider the following code for a "straight line" calculation....Is it correct? (for Integral Points)&lt;/p&gt;
&lt;p&gt;        int Solve(int m, int b, int x) { return m * x + b; }&lt;br /&gt;
 &lt;/p&gt;
&lt;p&gt;Most people would respond "Yes". But let's take the question one step further... Is it correct &lt;strong&gt;&lt;em&gt;for all &lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;possible values of m,b,x&lt;/strong&gt;&lt;/em&gt;??? &lt;em&gt;(no fair if you cheated by being focused on the bolded text!) &lt;/em&gt; Without additional information regarding constrains on "the possible values of m,b,x" the answer must be NO, there is the risk of overflow/wraparound that will produce an incorrect result!&lt;/p&gt;
&lt;p&gt;To properly answer this question (i.e. Test the Code), one MUST be able to backtrack from the implementation through the design, and architecture all the way back to the requirements. And the requirement itself must be tested against the stakeholder(s). It is only when the bounding conditions are defined that it is possible to determine if the code is "Correct" and has "Quality".&lt;/p&gt;
&lt;p&gt;Yet, how many of us (myself included) have written such code without even thinking about it. In many canses we (think we) "know" what the bounds are, and that the code will be correct. As we all know, requirements change, "code reuse" causes implementations to be applied to different scenarios, etc. This leads directly to the types of system failures that plague so many projects.&lt;/p&gt;
&lt;p&gt;This approach to TDD is much more holistic than ones which start by focusing on the details. The fundamental concepts still apply:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Each item should be tested.&lt;/li&gt;
    &lt;li&gt;The test should be defined/implemented before (or concurrent with) the definition/implementation of the actual item.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We also add concepts that expand the scope and alter the style by recognizing:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;There are many things beside "lines of code" that benefit from testing (measuring/evaluating in a formal way)&lt;/li&gt;
    &lt;li&gt;Correctness and Quality can not be solely measured by "correct results"&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the future parts, we will examine in greater detail some of the techniques that can be applied to each of these areas....&lt;/p&gt; &lt;img src="http://geekswithblogs.net/TheCPUWizard/aggbug/138451.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David V. Corbin</dc:creator>
            <guid>http://geekswithblogs.net/TheCPUWizard/archive/2010/03/11/does-test-driven-development-tdd-improve-quality-and-correctness.aspx</guid>
            <pubDate>Thu, 11 Mar 2010 14:16:43 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TheCPUWizard/comments/138451.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TheCPUWizard/archive/2010/03/11/does-test-driven-development-tdd-improve-quality-and-correctness.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/TheCPUWizard/comments/commentRss/138451.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TheCPUWizard/services/trackbacks/138451.aspx</trackback:ping>
        </item>
        <item>
            <title>Think you write good code????</title>
            <category>A Look Back In Time</category>
            <category>Developing Agile Software</category>
            <category>Random Musings</category>
            <link>http://geekswithblogs.net/TheCPUWizard/archive/2009/12/03/thinkyouwritegoodcode.aspx</link>
            <description>&lt;p&gt;I will formally announce that I have written some of the baddest [actually meaning worse, and not the venaculare where bad is really good] code in the universe.&lt;/p&gt;
&lt;p&gt;How do I know this? Because I have carefully studied the code I have written over the past 37 years (yes, since Sept 1972) and analyzed how it has fared over time.&lt;/p&gt;
&lt;p&gt;While there are only a few true "WTFs" [Worse Than Failure] , the majority of code in this category is code that I thought was excellent at the time of original implementation (and was even reviewed by peers). Yet, over time it was proven that an alternate approach (which was considered and disarded) would have proven better in the long run.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is the "silent killer" of the software development world&lt;/strong&gt;. Code that looks great, performs great, and yet still manages to incur higher costs over the entire lifecycle.&lt;/p&gt;
&lt;p&gt;Do I have an answer for this? Unfortunately, "Not Really"!  Yet I am 100% convinced that code in this category costs the industry significantly more than truely "bad" code.&lt;/p&gt;
&lt;p&gt;The first step to addressing this issue is the implementation of a rigorous process where "issues" are tracked, with a focus on determining the original conditions where the decision to choose a certain implementation was made.&lt;/p&gt;
&lt;p&gt;I cahallenge all software developers to take a hard look at this aspect of their careers. Not only "&lt;em&gt;What worked well over time?&lt;/em&gt;",  "&lt;em&gt;WHY did it work out well?&lt;/em&gt;" but to also carefully look for the items where the code proved to be problematic over time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Were decisions made..&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;To Early?&lt;/strong&gt; (research "Big Requirements Up Front")&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;To Late?&lt;/strong&gt;  (are you abusing "agile" development processes?)&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;With Insufficient Information?&lt;/strong&gt; (how do you research and analyze requirements?)&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Ingoring Inevitable Changes?&lt;/strong&gt; (do you make assumptions about invaraibility?)&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Without sufficient Skils?&lt;/strong&gt; (what is your approach to learning new techniques?)&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;In too much of a Rush?&lt;/strong&gt; (how much impact analysis is taken into account when developing a schedule?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are no simple answers, but I have consistently  found that when a developer or team carefully considers the above points, &lt;strong&gt;and has the support of management&lt;/strong&gt; to make the necessary changes in process the cost of software development always decreases.&lt;/p&gt;
&lt;p&gt;So spend a few minutes today and look back at the code you have developed. Ask yourself if when viewed from todqay's perspective you still think you write good code....&lt;/p&gt;
&lt;p&gt; &lt;/p&gt; &lt;img src="http://geekswithblogs.net/TheCPUWizard/aggbug/136677.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David V. Corbin</dc:creator>
            <guid>http://geekswithblogs.net/TheCPUWizard/archive/2009/12/03/thinkyouwritegoodcode.aspx</guid>
            <pubDate>Thu, 03 Dec 2009 15:18:20 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TheCPUWizard/comments/136677.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TheCPUWizard/archive/2009/12/03/thinkyouwritegoodcode.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TheCPUWizard/comments/commentRss/136677.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TheCPUWizard/services/trackbacks/136677.aspx</trackback:ping>
        </item>
        <item>
            <title>Sorry Johnny - There is NO Garbage Collection in .NET</title>
            <category>Contrary Views</category>
            <link>http://geekswithblogs.net/TheCPUWizard/archive/2009/09/24/sorry-johnny---there-is-no-garbage-collection-in-.net.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;&lt;font size="1"&gt;[Originally Published Apr 2004 - Updated October 2009]&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Everyone "understands" that Microsoft's .NET and the CLR is a "garbage collector" based environment; but is it really.&lt;/p&gt;
&lt;p&gt;First we must establish what is meant be "garbage" in this context. When an object is created there is (typically) one reference by which it can be accessed (the return value of "new"). While the program executes, there may be other references established to the same item; and established references may terminate. When an object can no longer be referenced, it is deemed to be "Garbage". [note: This is a bit of a simplification but will satisify out needs]&lt;/p&gt;
&lt;p&gt;Next we must look at the definition of "collection", Websters dictionary offers the following:&lt;/p&gt;
&lt;blockquote style="MARGIN-RIGHT: 0px" dir="ltr"&gt;
&lt;p&gt;&lt;strong&gt;collection&lt;/strong&gt;: the act or process of collecting.&lt;br /&gt;
&lt;strong&gt;colllect&lt;/strong&gt;: to bring together into one body or place.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;Now lets look at what happens when a "GC.Collect" occurs.... (For simplicity we will look at generation 0, and ignore the impact of "pinned" objects). The object graph is "walked" starting at the rooted references, and any reachable item that is in Generation 0 is marked. When the walk is complete, &lt;strong&gt;the &lt;font size="4"&gt;live&lt;/font&gt; objects are moved to the Gen1 heap&lt;/strong&gt;, and the Gen0 heap reset back to the beginning. The result is that the memory occupied by all of the previous Gen0 residents is now available.&lt;/p&gt;
&lt;p dir="ltr"&gt;This reveals the fundamental problem with calling this process "garbage collection". Absolutely NOTHING is done with the garbage. Specifically there are no operations which involve moving the garbage so it is "brought together in one place".&lt;/p&gt;
&lt;p dir="ltr"&gt;To see what a "real" garbage collection is, consider an anology. In ones house, there are likely to be multiple wastebaskets; one in the kitchen, one in the bathroom, and other scattered throughout the residence. On trash day (or earlier if the Wife has anything to say about the matter), one goes through the residence and collects all of the garbage from multiple locations, places it in one bag, and brings it outside to the rubbish container. The amount of work is dependant on the number of original locations of garbage, and the amount of garbage in each location. The amount of "precious" (non-garbage) item in the house has absolutely no bearing on the process or the effort it will involve.&lt;/p&gt;
&lt;p dir="ltr"&gt;But when we look at the .NET situation, the exact opposite is true. It is the number of LIVE objects that impacts the performance as these are what must be scanned and moved. It does not matter if there is a single small "garbage" object on the heap, or if there are tens of thousands (of varying sizes). Once the live (precious) objects have been moved out of harms way, it is a single, constant time operation to reset the heap to be ready to get new objects.&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;&lt;font size="4"&gt;This shows that .NET implements a Live Object Preservation pattern, and NOT a grabage collection pattern.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;While this entire post may seem like a "symantic quibble", it has serious ramifications when dealing with .NET architecture/design and implementation. In other environments there is NO overhead (aside from the actual memory) to keeping references to heap based object which will be needed (or even just possibly needed) later. In many cases, the cost of allocating [always higher in a conventional heap than in a CLR heap]  and deleting (updating the freelist) far outwieghs the memory utilization issue, and so references are kept for an extended period of time.&lt;/p&gt;
&lt;p dir="ltr"&gt;When this approach is taken in a .NET application, these live objects represent a performance hit everytime (neglecting some optimizations) that the GC runs - simply because the GC deals with processing live objects. On the otherhand, allocating a (non-large) object in .NET is typically a simply pointer increment, and abandoning it (assuming no finalizer) is a 0 time issue. &lt;/p&gt;
&lt;p dir="ltr"&gt;Over the past few years, I have been involved with a number of projects where clients were complaining that ".NET was slow" and could not meet their perfomance demands. In the vast majority of cases, this was directly tracked to the implementation not having proper (for .NET) object lifetime management..&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;addendum:&lt;/strong&gt; When one looks at environments such at C/C++, the conventional/standard implementation (pre C++0x) do not include "garbage collection". The heap is (typically, and simplified) implemented as a structure containing the "free blocks" of items that were previously deleted. This means that (a pointer to) memory that is not longer in use [i.e. garbage] IS actually MOVED. Each time there is a call to "delete" or "free(...)" there is a synchronous [i.e. it completes before delete/free() returns] collection of information about the garbage that occurs.&lt;/p&gt;
&lt;p dir="ltr"&gt;In .NET the large object heap [LOH] is used for items which exceed a threshold size [80,000 bytes]. This particular heap IS operated in a manner nearly identical to a C/C++, in that the "live" objects are NOT moved, and it is a set of references to the avilable memory (garbage) that is manipulated.&lt;/p&gt;
&lt;p dir="ltr"&gt; &lt;/p&gt;
&lt;blockquote style="MARGIN-RIGHT: 0px" dir="ltr"&gt;
&lt;p align="left"&gt; &lt;/p&gt;
&lt;/blockquote&gt; &lt;img src="http://geekswithblogs.net/TheCPUWizard/aggbug/135083.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David V. Corbin</dc:creator>
            <guid>http://geekswithblogs.net/TheCPUWizard/archive/2009/09/24/sorry-johnny---there-is-no-garbage-collection-in-.net.aspx</guid>
            <pubDate>Fri, 25 Sep 2009 00:46:22 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TheCPUWizard/comments/135083.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TheCPUWizard/archive/2009/09/24/sorry-johnny---there-is-no-garbage-collection-in-.net.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TheCPUWizard/comments/commentRss/135083.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TheCPUWizard/services/trackbacks/135083.aspx</trackback:ping>
        </item>
        <item>
            <title>The CLR does not a Virtual Machine Make...</title>
            <category>Contrary Views</category>
            <link>http://geekswithblogs.net/TheCPUWizard/archive/2009/09/24/the-clr-does-not-a-virtual-machine-make.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;font size="1"&gt;[Originally Written October 2004 - Updated September 2009]&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Many people state that Microsoft .Net technology provides a "Virtual Machine" environment via the CLR. However, an examination of various definitions of Virtual &lt;strong&gt;Machine&lt;/strong&gt; shows that this is not the best analogy.&lt;/p&gt;
&lt;p&gt;For our first example definition, let us look no further than Microsoft's own site:&lt;/p&gt;
&lt;blockquote style="MARGIN-RIGHT: 0px" dir="ltr"&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: &amp;quot;Times New Roman&amp;quot;, &amp;quot;serif&amp;quot;; FONT-SIZE: 10pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;strong&gt;Virtual Machine&lt;/strong&gt;: &lt;em&gt;A software-implemented computer that emulates a complete hardware system in a self-contained, isolated software environment and runs its own operating system.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;&lt;span style="FONT-FAMILY: &amp;quot;Times New Roman&amp;quot;, &amp;quot;serif&amp;quot;; FONT-SIZE: 10pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;Clearly this does not apply so lets break down the parts of  "a complete hardware system". The three major categories of devices that make up a system are: Memory (some type of storage),  Processing, and Input/Output. &lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span style="FONT-FAMILY: &amp;quot;Times New Roman&amp;quot;, &amp;quot;serif&amp;quot;; FONT-SIZE: 10pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;When a program written in any language uses the Microsoft Implementation of the CLR, it directly utilizes the actual memory presented by the underlying system, All processing is done using native instruction execution on the underlying processor, and all Input/Output is accomplished via the device (Drivers) provided by the underlying operating system.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span style="FONT-FAMILY: &amp;quot;Times New Roman&amp;quot;, &amp;quot;serif&amp;quot;; FONT-SIZE: 10pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;So, while it is possible (and there are projects attempting to reach this goal) to implement the CLR as a Virtual Machine. It is clear that the current Microsoft implementation provides none of these features.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span style="FONT-FAMILY: &amp;quot;Times New Roman&amp;quot;, &amp;quot;serif&amp;quot;; FONT-SIZE: 10pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;The feature that the CLR provides is that there is an intermediate stage where the source code has been reduced from the original form into a well defined set of intermediate instructions that are independant of any specific target environment. Additionally a rich library (the BCL) is provided for addressing many common constructs and providing additional abstractions over lower level functionallity.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span style="FONT-FAMILY: &amp;quot;Times New Roman&amp;quot;, &amp;quot;serif&amp;quot;; FONT-SIZE: 10pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;strong&gt;&lt;font size="3"&gt;But remember this intermediate code NEVER executes. It undergoes a second compilation phase to become pure native instructions.&lt;/font&gt;&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span style="FONT-FAMILY: &amp;quot;Times New Roman&amp;quot;, &amp;quot;serif&amp;quot;; FONT-SIZE: 10pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;This process actually has a long history. Long, long ago [1970's 1980's] it was quite common for high level language compilers to emit (either by default or as an option) assembly language SOURCE rather than object code. This output could then be copies to various target machines (with differences in capabilities) and run through the assembler (often with differing configurations or external linkages) to produce an executable that was specifically tailored to the targeted machine.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span style="FONT-FAMILY: &amp;quot;Times New Roman&amp;quot;, &amp;quot;serif&amp;quot;; FONT-SIZE: 10pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;Although the mechanics are different this is completely analogous to what happens with a CLR based program.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span style="FONT-FAMILY: &amp;quot;Times New Roman&amp;quot;, &amp;quot;serif&amp;quot;; FONT-SIZE: 10pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;The result is that while .Net (the CLR) does provide a level of abstraction from the actual executable code, it does not meet the criteria for a "Virtual Machine".&lt;/span&gt;&lt;/p&gt; &lt;img src="http://geekswithblogs.net/TheCPUWizard/aggbug/135082.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David V. Corbin</dc:creator>
            <guid>http://geekswithblogs.net/TheCPUWizard/archive/2009/09/24/the-clr-does-not-a-virtual-machine-make.aspx</guid>
            <pubDate>Fri, 25 Sep 2009 00:04:58 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TheCPUWizard/comments/135082.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TheCPUWizard/archive/2009/09/24/the-clr-does-not-a-virtual-machine-make.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TheCPUWizard/comments/commentRss/135082.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TheCPUWizard/services/trackbacks/135082.aspx</trackback:ping>
        </item>
        <item>
            <title>One mans view of the Microsoft MVP Program</title>
            <category>Random Musings</category>
            <link>http://geekswithblogs.net/TheCPUWizard/archive/2009/03/17/one-mans-view-of-the-microsoft-mvp-program.aspx</link>
            <description>&lt;p&gt;As I indicated in a previous post, I was contacted by Newsday (a large regional newspaper from Long Island, New York) about what the MVP program meant for me as a small business owner. The original article is available at: &lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;a href="http://www.newsday.com/business/ny-bzinside166071263mar16,0,4560998.story"&gt;http://www.newsday.com/business/technology/one-of-microsoft-s-mvps-again-1.769775&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #808080"&gt;&lt;em&gt;update 26-Mar-2010: Newsday moved the article...link has been updated &lt;/em&gt;&lt;/span&gt;&lt;/p&gt; &lt;img src="http://geekswithblogs.net/TheCPUWizard/aggbug/130168.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>David V. Corbin</dc:creator>
            <guid>http://geekswithblogs.net/TheCPUWizard/archive/2009/03/17/one-mans-view-of-the-microsoft-mvp-program.aspx</guid>
            <pubDate>Wed, 18 Mar 2009 02:22:18 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TheCPUWizard/comments/130168.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TheCPUWizard/archive/2009/03/17/one-mans-view-of-the-microsoft-mvp-program.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TheCPUWizard/comments/commentRss/130168.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TheCPUWizard/services/trackbacks/130168.aspx</trackback:ping>
        </item>
    </channel>
</rss>
