<?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>MuellerDesigns.net</title>
    <link>http://www.muellerdesigns.net/dasblog/</link>
    <description>Alex Mueller on Software and Technology</description>
    <language>en-us</language>
    <copyright>MuellerDesigns.net</copyright>
    <lastBuildDate>Fri, 26 Sep 2008 15:42:42 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.0.7226.0</generator>
    <managingEditor>muellerdesigns@gmail.com</managingEditor>
    <webMaster>muellerdesigns@gmail.com</webMaster>
    <item>
      <trackback:ping>http://www.muellerdesigns.net/dasblog/Trackback.aspx?guid=5479eac1-2b65-4fbc-ab9d-e52e822957d6</trackback:ping>
      <pingback:server>http://www.muellerdesigns.net/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muellerdesigns.net/dasblog/PermaLink,guid,5479eac1-2b65-4fbc-ab9d-e52e822957d6.aspx</pingback:target>
      <dc:creator>Alex Mueller</dc:creator>
      <wfw:comment>http://www.muellerdesigns.net/dasblog/CommentView,guid,5479eac1-2b65-4fbc-ab9d-e52e822957d6.aspx</wfw:comment>
      <wfw:commentRss>http://www.muellerdesigns.net/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=5479eac1-2b65-4fbc-ab9d-e52e822957d6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I am reading "<a title="The Software Architect's Profession: An Introduction" target="_blank" href="http://www.amazon.com/Software-Architects-Profession-Introduction-Architecture/dp/0130607967">The
Software Architect's Profession: An Introduction</a>," by Marc T. Sewell and Laura
M. Sewell. I am not writing a book review with this post. Instead, I would like to
highlight some similarities between the two disciplines. Whether we are building with
brick and mortar, wood, steel, or computer code, the roles and processes are analogous.
The role of the architect is important for both, but when it comes to software, the
architect often goes unfulfilled. 
</p>
        <p>
Compared to architecting and constructing homes, hospitals, and skyscrapers, architecting
and developing software is new to many of us. In our minds, whether we understand
the processes required to erect the Empire State building or not, most of us 
possess an intuitive understanding of the distinct roles of the architect, scientist,
engineer, builder, electrician, and plumber. We realize that buildings provide shelter,
make our lives easier, and consist of rooms specific to living activities. We have
living rooms, family rooms, meeting rooms, workout rooms, kitchens, ect. If we want
to add on a garage, screened-in porch, or modify an existing room, the architect needs
to plan for this in his/her design.
</p>
        <p>
When it comes to software and the processes required to plan, design, develop, and
test, many of us lack the intuitive knowledge of what is, or should be, necessary
to build software. Just like a building, software makes our lives easier and consists
of rooms, such as  chat rooms, document libraries, art studios, financial planning,
shopping, and home buying to name a few. If we want to add on a new room or modify
and existing, the architect needs to plan for this in his/her design.
</p>
        <p>
It becomes easier to see how buildings and software are similar and how the roles
specific to each appear to be obvious and necessary. A building needs an architect,
a builder, an electrician, and so forth. Software, similarly, needs an architect,
a developer, a tester, and so forth. 
</p>
        <p>
Ask yourself this, "how many buildings (homes, schools, hospitals, malls, ect.) can
I think of that were built without an architect?" Hmmm... I probably cannot think
of any, or I should hope the answer is zero. 
</p>
        <p>
Now ask yourself, "how many software applications were built without an architect?"
This one I can answer more easily - several. I try to convince myself that so-and-so
was "acting" as the architect on this or that project, but the nature of it is, too
many software projects are built without a dedicated architect.
</p>
        <p>
Why is it that we feel like a building requires an architect, but that software can
get by without it? 
</p>
        <p>
Is it because over centuries and millennia, we have been exposed to the processes
required to construct buildings on a daily basis? Whereas, since software is comparatively
new, the processes and roles required are not fully defined, or engrained in us, or
we have yet to see centuries worth of catastrophic errors from omitting these roles?
</p>
        <p>
"Blaming software failure or difficulty on 'changing requirements' is merely symptomatic
of the lack of true architecture." As owners and builders see what is being built,
they realize what is incorrect and begin to make modifications to align their initial
expectations with the reality before it is too late.
</p>
        <p>
"It is equally erroneous to blame software failure on poor management. Even the best
managers cannot produce a satisfying result from a bad design or a lack of design."
</p>
        <p>
Without this post becoming tiresome and long-winded, this book draws some good comparisons
between the nature of building structures and software and the roles necessary for
each. 
</p>
        <p>
Do you have an architect in your organization? Is he/she only an architect, or is
he/she sharing this responsibility? Why?
</p>
        <img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=5479eac1-2b65-4fbc-ab9d-e52e822957d6" />
      </body>
      <title>Architecting Buildings and Software</title>
      <guid isPermaLink="false">http://www.muellerdesigns.net/dasblog/PermaLink,guid,5479eac1-2b65-4fbc-ab9d-e52e822957d6.aspx</guid>
      <link>http://www.muellerdesigns.net/dasblog/2008/09/26/ArchitectingBuildingsAndSoftware.aspx</link>
      <pubDate>Fri, 26 Sep 2008 15:42:42 GMT</pubDate>
      <description>&lt;p&gt;
I am reading "&lt;a title="The Software Architect's Profession: An Introduction" target="_blank" href="http://www.amazon.com/Software-Architects-Profession-Introduction-Architecture/dp/0130607967"&gt;The
Software Architect's Profession: An Introduction&lt;/a&gt;," by Marc T. Sewell and Laura
M. Sewell. I am not writing a book review with this post. Instead, I would like to
highlight some similarities between the two disciplines. Whether we are building with
brick and mortar, wood, steel, or computer code, the roles and processes are analogous.
The role of the architect is important for both, but when it comes to software, the
architect often goes unfulfilled. 
&lt;/p&gt;
&lt;p&gt;
Compared to architecting and constructing homes, hospitals, and skyscrapers, architecting
and developing software is new to many of us. In our minds, whether we understand
the processes required to erect the Empire State building or not, most of us&amp;nbsp;
possess an intuitive understanding of the distinct roles of the architect, scientist,
engineer, builder, electrician, and plumber. We realize that buildings provide shelter,
make our lives easier, and consist of rooms specific to living activities. We have
living rooms, family rooms, meeting rooms, workout rooms, kitchens, ect. If we want
to add on a garage, screened-in porch, or modify an existing room, the architect needs
to plan for this in his/her design.
&lt;/p&gt;
&lt;p&gt;
When it comes to software and the processes required to plan, design, develop, and
test, many of us lack the intuitive knowledge of what is, or should be, necessary
to build software. Just like a building, software makes our lives easier and consists
of rooms, such as&amp;nbsp; chat rooms, document libraries, art studios, financial planning,
shopping, and home buying to name a few. If we want to add on a new room or modify
and existing, the architect needs to plan for this in his/her design.
&lt;/p&gt;
&lt;p&gt;
It becomes easier to see how buildings and software are similar and how the roles
specific to each appear to be obvious and necessary. A building needs an architect,
a builder, an electrician, and so forth. Software, similarly, needs an architect,
a developer, a tester, and so forth. 
&lt;/p&gt;
&lt;p&gt;
Ask yourself this, "how many buildings (homes, schools, hospitals, malls, ect.) can
I think of that were built without an architect?" Hmmm... I probably cannot think
of any, or I should hope the answer is zero. 
&lt;/p&gt;
&lt;p&gt;
Now ask yourself, "how many software applications were built without an architect?"
This one I can answer more easily - several. I try to convince myself that so-and-so
was "acting" as the architect on this or that project, but the nature of it is, too
many software projects are built without a dedicated architect.
&lt;/p&gt;
&lt;p&gt;
Why is it that we feel like a building requires an architect, but that software can
get by without it? 
&lt;/p&gt;
&lt;p&gt;
Is it because over centuries and millennia, we have been exposed to the processes
required to construct buildings on a daily basis? Whereas, since software is comparatively
new, the processes and roles required are not fully defined, or engrained in us, or
we have yet to see centuries worth of catastrophic errors from omitting these roles?
&lt;/p&gt;
&lt;p&gt;
"Blaming software failure or difficulty on 'changing requirements' is merely symptomatic
of the lack of true architecture." As owners and builders see what is being built,
they realize what is incorrect and begin to make modifications to align their initial
expectations with the reality before it is too late.
&lt;/p&gt;
&lt;p&gt;
"It is equally erroneous to blame software failure on poor management. Even the best
managers cannot produce a satisfying result from a bad design or a lack of design."
&lt;/p&gt;
&lt;p&gt;
Without this post becoming tiresome and long-winded, this book draws some good comparisons
between the nature of building structures and software and the roles necessary for
each. 
&lt;/p&gt;
&lt;p&gt;
Do you have an architect in your organization? Is he/she only an architect, or is
he/she sharing this responsibility? Why?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=5479eac1-2b65-4fbc-ab9d-e52e822957d6" /&gt;</description>
      <comments>http://www.muellerdesigns.net/dasblog/CommentView,guid,5479eac1-2b65-4fbc-ab9d-e52e822957d6.aspx</comments>
      <category>Design</category>
    </item>
    <item>
      <trackback:ping>http://www.muellerdesigns.net/dasblog/Trackback.aspx?guid=7797a439-8a36-444d-9ee2-8b5ae1df8022</trackback:ping>
      <pingback:server>http://www.muellerdesigns.net/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muellerdesigns.net/dasblog/PermaLink,guid,7797a439-8a36-444d-9ee2-8b5ae1df8022.aspx</pingback:target>
      <dc:creator>Alex Mueller</dc:creator>
      <wfw:comment>http://www.muellerdesigns.net/dasblog/CommentView,guid,7797a439-8a36-444d-9ee2-8b5ae1df8022.aspx</wfw:comment>
      <wfw:commentRss>http://www.muellerdesigns.net/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=7797a439-8a36-444d-9ee2-8b5ae1df8022</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is an <a title="interesting webcast" href="http://channel9.msdn.com/shows/Continuum/Building-NBCOlympicscom-with-Silverlight/" target="_blank">interesting
webcast</a> on Channel9 where Eric Schmidt provides a technical tour of the <a href="http://www.nbcolympics.com" target="_blank">NBCOlympics.com</a> site
built with Silverlight. If you are like me and become frustrated with the limited
options of events the stations choose to broadcast, then we are in luck. The <a title="video" href="http://www.nbcolympics.com/video/index.html" target="_blank">video</a> that
the <a href="http://www.nbcolympics.com" target="_blank">NBCOlympics.com</a> site
is providing is excellent and covers nearly all the sports. I have heard estimates
of roughly 2,200 hours of video, live commentary, live events, and with the ability
to choose what we prefer to view. For those events we miss, we can search and view
them at our leisure. 
</p>
        <p>
I have been able to watch some events I have always wanted to see but the television
stations do not televise. Popularity and advertising dollars demand that stations
air the usual suspects, swimming, track and field, gymnastics, ect. I have been able
to explore fencing, sailing, handball, archery, and weightlifting to name a few. 
</p>
        <p>
If interested, check it out. If you have not seen the U.S. Men's 4x100 freestyle relay, <a title="check it out" href="http://www.nbcolympics.com/video/player.html?assetid=0811_hd_swb_hl_l0194&amp;channelcode=sportsw" target="_blank">check
it out</a>. What a race!
</p>
        <img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=7797a439-8a36-444d-9ee2-8b5ae1df8022" />
      </body>
      <title>NBCOlympics.com with Silverlight</title>
      <guid isPermaLink="false">http://www.muellerdesigns.net/dasblog/PermaLink,guid,7797a439-8a36-444d-9ee2-8b5ae1df8022.aspx</guid>
      <link>http://www.muellerdesigns.net/dasblog/2008/08/11/NBCOlympicscomWithSilverlight.aspx</link>
      <pubDate>Mon, 11 Aug 2008 18:26:15 GMT</pubDate>
      <description>&lt;p&gt;
This is an &lt;a title="interesting webcast" href="http://channel9.msdn.com/shows/Continuum/Building-NBCOlympicscom-with-Silverlight/" target=_blank&gt;interesting
webcast&lt;/a&gt; on Channel9 where Eric Schmidt provides a technical tour of the &lt;a href="http://www.nbcolympics.com" target=_blank&gt;NBCOlympics.com&lt;/a&gt; site
built with Silverlight. If you are like me and become frustrated with the limited
options of events the stations choose to broadcast, then we are in luck. The &lt;a title=video href="http://www.nbcolympics.com/video/index.html" target=_blank&gt;video&lt;/a&gt; that
the &lt;a href="http://www.nbcolympics.com" target=_blank&gt;NBCOlympics.com&lt;/a&gt; site is
providing is excellent and covers nearly all the sports. I have heard estimates of
roughly 2,200 hours of video, live commentary, live events, and with the ability to
choose what we prefer to view. For those events we miss, we can search and view them
at our leisure. 
&lt;/p&gt;
&lt;p&gt;
I have been able to watch some events I have always wanted to see but the television
stations do not televise. Popularity and advertising dollars demand that stations
air the usual suspects, swimming, track and field, gymnastics, ect. I have been able
to explore fencing, sailing, handball, archery, and weightlifting to name a few. 
&lt;/p&gt;
&lt;p&gt;
If interested, check it out. If you have not seen the U.S. Men's 4x100 freestyle relay, &lt;a title="check it out" href="http://www.nbcolympics.com/video/player.html?assetid=0811_hd_swb_hl_l0194&amp;amp;channelcode=sportsw" target=_blank&gt;check
it out&lt;/a&gt;. What a race!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=7797a439-8a36-444d-9ee2-8b5ae1df8022" /&gt;</description>
      <comments>http://www.muellerdesigns.net/dasblog/CommentView,guid,7797a439-8a36-444d-9ee2-8b5ae1df8022.aspx</comments>
      <category>Misc</category>
      <category>Technology</category>
    </item>
    <item>
      <trackback:ping>http://www.muellerdesigns.net/dasblog/Trackback.aspx?guid=9741eff2-4076-48fb-b348-f3aa8d225648</trackback:ping>
      <pingback:server>http://www.muellerdesigns.net/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muellerdesigns.net/dasblog/PermaLink,guid,9741eff2-4076-48fb-b348-f3aa8d225648.aspx</pingback:target>
      <dc:creator>Alex Mueller</dc:creator>
      <wfw:comment>http://www.muellerdesigns.net/dasblog/CommentView,guid,9741eff2-4076-48fb-b348-f3aa8d225648.aspx</wfw:comment>
      <wfw:commentRss>http://www.muellerdesigns.net/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=9741eff2-4076-48fb-b348-f3aa8d225648</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The marker interface is an interface that is empty. It does not implement any properties
nor methods. It is used to mark the capability of a class as implementing a specific
interface at run-time. In languages that do not provide support for associating metadata
to a class, this approach can be useful. In C#, metadata attributes are available
to apply to a class, and according to the <a title=".NET Framework 3.5 Design Guidelines for Developing Class Libraries" href="http://msdn.microsoft.com/en-us/library/ms229042.aspx" target="_blank">.NET
Framework 3.5 Design Guidelines for Developing Class Libraries</a>, marker interfaces
should be avoided. 
</p>
        <p>
When I first noticed these marker interfaces in project I immediately thought it was
a code smell. It just did not seem "right." Why provide an interface that defines
nothing? Why provide a marker interface that implements a non-marker interface? Obviously
there must be a reason for this? 
</p>
        <p>
Two sources encourage me to avoid using marker interfaces and to use attributes in
C#. <a title="Interface Design" href="http://msdn.microsoft.com/en-us/library/ms229022.aspx" target="_blank">Interface
Design</a> and <a title=".NET Type Design Guidelines - Interface Design" href="http://en.csharp-online.net/.NET_Type_Design_Guidelines%E2%80%94Interface_Design" target="_blank">.NET
Type Design Guidelines - Interface Design</a>. 
</p>
        <p>
There advice is to avoid this...
</p>
        <div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">interface</span> IFooAssignable
{}</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"> </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">class</span> FooAssignableAttribute
: IFooAssignable</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">{</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #008000">//
...</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">}</pre>
          </div>
        </div>
        <p>
And to embrace this approach...
</p>
        <div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">[FooAssignable]</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">class</span> Foo</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">{</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #008000">//
...</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">}</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"> </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">class</span> FooAssignableAttribute
: Attribute</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">{</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #008000">//
...</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">}</pre>
          </div>
        </div>
        <p>
There appears to be more work involved in writing "good" code. 
</p>
        <p>
If I am using "marker" interfaces, I can do this...
</p>
        <div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #0000ff">if</span>(foo <span style="color: #0000ff">is</span> IFooAssignable)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">{</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #008000">//
...</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">}</pre>
          </div>
        </div>
        <p>
If I am using attributes, I can do something like this...
</p>
        <div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #0000ff">object</span>[]
attributes = foo.GetType().GetCustomAttributes(<span style="color: #0000ff">false</span>);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"> </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #0000ff">foreach</span> (<span style="color: #0000ff">string</span> attribute <span style="color: #0000ff">in</span> attributes)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">{</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #0000ff">if</span>(attribute
== <span style="color: #006080">"FooAssignable"</span>)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #008000">//
...</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">}</pre>
          </div>
        </div>
        <p>
Or, thanks to <a title="Jarod Ferguson" href="http://elegantcode.com/about/jarod-ferguson/" target="_blank">Jarod
Ferguson'</a>s suggestions on using extension methods and LINQ, I could have this...
</p>
        <div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">class</span> AttributeExtensions</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">{</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">bool</span> IsAttributedAs&lt;T&gt;(<span style="color: #0000ff">this</span><span style="color: #0000ff">object</span> obj)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #0000ff">if</span>(obj.GetType().GetCustomAttributes(<span style="color: #0000ff">false</span>).Where(x
=&gt; x <span style="color: #0000ff">is</span> T).ToList().Count == 1)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #0000ff">return</span>
              <span style="color: #0000ff">true</span>;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #0000ff">return</span>
              <span style="color: #0000ff">false</span>;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">}</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"> </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #008000">//
Then wherever I want to check for the attribute marker...</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #0000ff">if</span> (foo.IsAttributedAs&lt;FooAssignableAttribute&gt;())</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">{</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #008000">//
...</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">}</pre>
          </div>
        </div>
        <p>
At this point, while "marker" interfaces are a code smell to me, I am still on the
fence when it comes to using them versus custom attributes. I will more than likely
tend to favor the attribute approach, unless I can prove that the cost of reflection
is too expensive for my situation. I admit, I will do what I can to omit marker interfaces,
perhaps by using some other interface where possible.
</p>
        <p>
What are you doing in situations like this? Can you offer me a more elegant solution?
</p>
        <img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=9741eff2-4076-48fb-b348-f3aa8d225648" />
      </body>
      <title>Marker Interfaces and C# Attributes</title>
      <guid isPermaLink="false">http://www.muellerdesigns.net/dasblog/PermaLink,guid,9741eff2-4076-48fb-b348-f3aa8d225648.aspx</guid>
      <link>http://www.muellerdesigns.net/dasblog/2008/07/30/MarkerInterfacesAndCAttributes.aspx</link>
      <pubDate>Wed, 30 Jul 2008 20:01:11 GMT</pubDate>
      <description>&lt;p&gt;
The marker interface is an interface that is empty. It does not implement any properties
nor methods. It is used to mark the capability of a class as implementing a specific
interface at run-time. In languages that do not provide support for associating metadata
to a class, this approach can be useful. In C#, metadata attributes are available
to apply to a class, and according to the &lt;a title=".NET Framework 3.5 Design Guidelines for Developing Class Libraries" href="http://msdn.microsoft.com/en-us/library/ms229042.aspx" target="_blank"&gt;.NET
Framework 3.5 Design Guidelines for Developing Class Libraries&lt;/a&gt;, marker interfaces
should be avoided. 
&lt;p&gt;
When I first noticed these marker interfaces in project I immediately thought it was
a code smell. It just did not seem "right." Why provide an interface that defines
nothing? Why provide a marker interface that implements a non-marker interface? Obviously
there must be a reason for this? 
&lt;p&gt;
Two sources encourage me to avoid using marker interfaces and to use attributes in
C#. &lt;a title="Interface Design" href="http://msdn.microsoft.com/en-us/library/ms229022.aspx" target="_blank"&gt;Interface
Design&lt;/a&gt; and &lt;a title=".NET Type Design Guidelines - Interface Design" href="http://en.csharp-online.net/.NET_Type_Design_Guidelines%E2%80%94Interface_Design" target="_blank"&gt;.NET
Type Design Guidelines - Interface Design&lt;/a&gt;. 
&lt;p&gt;
There advice is to avoid this...
&lt;/p&gt;
&lt;div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; IFooAssignable
{}&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; FooAssignableAttribute
: IFooAssignable&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;{&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #008000"&gt;//
...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
And to embrace this approach...
&lt;/p&gt;
&lt;div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;[FooAssignable]&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Foo&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;{&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #008000"&gt;//
...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;}&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; FooAssignableAttribute
: Attribute&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;{&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #008000"&gt;//
...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
There appears to be more work involved in writing "good" code. 
&lt;/p&gt;
&lt;p&gt;
If I am using "marker" interfaces, I can do this...
&lt;/p&gt;
&lt;div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(foo &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; IFooAssignable)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;{&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #008000"&gt;//
...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
If I am using attributes, I can do something like this...
&lt;/p&gt;
&lt;div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[]
attributes = foo.GetType().GetCustomAttributes(&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; attribute &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; attributes)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;{&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(attribute
== &lt;span style="color: #006080"&gt;"FooAssignable"&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #008000"&gt;//
...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Or, thanks to &lt;a title="Jarod Ferguson" href="http://elegantcode.com/about/jarod-ferguson/" target="_blank"&gt;Jarod
Ferguson'&lt;/a&gt;s suggestions on using extension methods and LINQ, I could have this...
&lt;/p&gt;
&lt;div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AttributeExtensions&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;{&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; IsAttributedAs&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; obj)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(obj.GetType().GetCustomAttributes(&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;).Where(x
=&amp;gt; x &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; T).ToList().Count == 1)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;}&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #008000"&gt;//
Then wherever I want to check for the attribute marker...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (foo.IsAttributedAs&amp;lt;FooAssignableAttribute&amp;gt;())&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;{&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #008000"&gt;//
...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
At this point, while "marker" interfaces are a code smell to me, I am still on the
fence when it comes to using them versus custom attributes. I will more than likely
tend to favor the attribute approach, unless I can prove that the cost of reflection
is too expensive for my situation. I admit, I will do what I can to omit marker interfaces,
perhaps by using some other interface where possible.
&lt;/p&gt;
&lt;p&gt;
What are you doing in situations like this? Can you offer me a more elegant solution?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=9741eff2-4076-48fb-b348-f3aa8d225648" /&gt;</description>
      <comments>http://www.muellerdesigns.net/dasblog/CommentView,guid,9741eff2-4076-48fb-b348-f3aa8d225648.aspx</comments>
      <category>Design</category>
      <category>Frameworks/Patterns</category>
    </item>
    <item>
      <trackback:ping>http://www.muellerdesigns.net/dasblog/Trackback.aspx?guid=23e87f69-762f-4720-bc9d-48f5220500c8</trackback:ping>
      <pingback:server>http://www.muellerdesigns.net/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muellerdesigns.net/dasblog/PermaLink,guid,23e87f69-762f-4720-bc9d-48f5220500c8.aspx</pingback:target>
      <dc:creator>Alex Mueller</dc:creator>
      <wfw:comment>http://www.muellerdesigns.net/dasblog/CommentView,guid,23e87f69-762f-4720-bc9d-48f5220500c8.aspx</wfw:comment>
      <wfw:commentRss>http://www.muellerdesigns.net/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=23e87f69-762f-4720-bc9d-48f5220500c8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
For software engineers, the job interview process typically starts with a technical,
phone screen where a candidate's skills are verified against their resume. The end
goal is to determine, "are they who they say they are on their resume?" and "can they
meet or exceed our expectations for this position?" The phone screen is far from perfect.
Good candidates can be overlooked and bad candidates can proceed further. The nature
of the screen is prone to error. If we devise a plan and execute it, we improve our
chances of finding the right candidates and saving ourselves time and money. 
</p>
        <p>
After the technical screen, a coding assignment may initiate the next stage of the
interview process, followed by an in-person interview. If all goes well, contract
negotiations complete the process. Organizations can budget a decent amount of money
for each candidate, so it is important to approach each stage of the interview process
with a plan. A bug becomes more expensive to fix the further into the product lifecycle
it survives. Like a bug discovered after the product ships, a candidate discovered
to be dud during the full day interview becomes a financial loss. The phone screen
now becomes a more integral part of the interview process. We have a short amount
of time to uncover a potential fit with a candidate we have yet to meet.  
</p>
        <p>
Internally, interviewing is about finding the best candidate who currently meets,
exceeds, or potentially can meet the desired skill set, shows passion and motivation,
and fits with the organization's culture. Externally, interviewing is about public
relations and perception. At each stage in the interview process we want our candidates
to be challenged and think positively about both the interview process and the organization. 
</p>
        <p>
The impression the candidate takes out into the market is important if we care about
our image. Our goal is to conduct a professional interview such that, regardless of
the outcome (hire/no hire), the candidate's impression of the company is high. Word
travels fast and negative rapport hurts recruiting. We tend to remember the negative
experiences more vividly then the positive, so treat the candidates professionally
and respectfully, and by all means, conduct the interviews with staff trained to interview
and mature enough to represent the company. On several occasions I have witnessed
interviewers conducting themselves as if they are being interviewed by their peers
and managers in the room. 
</p>
        <p>
The goal of the phone screen is to assess the candidate's skills to determine if he/she
would be technical enough to be successful during a full day interview. We want the
candidate to walk away from the interview feeling rewarded and good about themselves
and the company. We want to determine fit as soon as possible to save us time and
money and have the candidate save face. 
</p>
        <p>
          <strong>The Plan</strong>
        </p>
        <p>
The phone interview should be "in and out," just like a robbery. Have a plan of attack.
Whether it is interviewing or playing a football game, those who are successful execute
a plan. In college we followed a plan for every game. "Convert third downs. Don't
give up the big play. No turnovers. No penalties. Execute the kicking game. Execute
special teams. Don't flinch." I am sorry I cannot recall all of them. When we followed
the plan we found success. When we were not successful, we could easily identify which
part of the plan we did not execute. Interviewing can use the same approach.
</p>
        <p>
Have a plan or a script in front of you during the interview. Settle on some questions
you feel will help determine technical skills and stick to them. Have some backup
questions. If the candidate answers this way, delve into his response with this. If
he fails to answer, ask him this, or move on, ect. Assuming your plan works and you
continually hone it, execute the same plan for each candidate. Make your interviewers
understand the plan. Have them execute it. Have them believe in it.
</p>
        <p>
          <strong>My Typical Plan</strong>
        </p>
        <ul>
          <li>
Schedule 30 minutes with the candidate over the telephone in a quiet room away from
distractions</li>
          <li>
Send the candidate a live meeting request</li>
          <li>
Be prompt, be prepared</li>
          <li>
Determine fit as soon as possible</li>
          <li>
Drive the discussion</li>
          <ul>
            <li>
Small introduction</li>
            <li>
Warm up questions</li>
            <li>
Get them writing code</li>
          </ul>
          <li>
Assess how they have done at this point</li>
          <ul>
            <li>
Good - continue further questioning and begin selling us more</li>
            <li>
Bad - conclude. Remember, the longer we stay on, the more attached we become.</li>
          </ul>
          <li>
Conclude</li>
          <li>
Follow up with the recruiter</li>
        </ul>
        <p>
For me, the two most important concepts to take away from the phone screen are drive
the discussion and get them to write code. Driving the discussion keeps the interviewer
in charge of the interview and enables proper execution of the plan. The longer we
stay on the phone, the more susceptible we are to making decisions based on emotion
rather than fact. Drive the discussion and stay in command. 
</p>
        <p>
Get the candidate to write code. Do not assume because they can talk about a technology
that they are comfortable working in it. Use live meeting and a have them write a
function, refactor a class, provide a working example of polymorphism. Better to find
out now if they cannot write code than further into the interview process. 
</p>
        <p>
The technical screen is more important than we tend to believe. Devise a plan and
execute it. Lead the interview and determine as soon as possible if this candidate
possess enough skills and experience to be successful within your organization. Be
professional and respectful. We want the candidate to think positively about the company
regardless of the outcome.
</p>
        <img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=23e87f69-762f-4720-bc9d-48f5220500c8" />
      </body>
      <title>The Phone Screen</title>
      <guid isPermaLink="false">http://www.muellerdesigns.net/dasblog/PermaLink,guid,23e87f69-762f-4720-bc9d-48f5220500c8.aspx</guid>
      <link>http://www.muellerdesigns.net/dasblog/2008/07/10/ThePhoneScreen.aspx</link>
      <pubDate>Thu, 10 Jul 2008 17:27:45 GMT</pubDate>
      <description>&lt;p&gt;
For software engineers, the job interview process typically starts with a technical,
phone screen where a candidate's skills are verified against their resume. The end
goal is to determine, "are they who they say they are on their resume?" and "can they
meet or exceed our expectations for this position?" The phone screen is far from perfect.
Good candidates can be overlooked and bad candidates can proceed further. The nature
of the screen is prone to error. If we devise a plan and execute it, we improve our
chances of finding the right candidates and saving ourselves time and money. 
&lt;p&gt;
After the technical screen, a coding assignment may initiate the next stage of the
interview process, followed by an in-person interview. If all goes well, contract
negotiations complete the process. Organizations can budget a decent amount of money
for each candidate, so it is important to approach each stage of the interview process
with a plan. A bug becomes more expensive to fix the further into the product lifecycle
it survives. Like a bug discovered after the product ships, a candidate discovered
to be dud during the full day interview becomes a financial loss. The phone screen
now becomes a more integral part of the interview process. We have a short amount
of time to uncover a potential fit with a candidate we have yet to meet.&amp;nbsp; 
&lt;p&gt;
Internally, interviewing is about finding the best candidate who currently meets,
exceeds, or potentially can meet the desired skill set, shows passion and motivation,
and fits with the organization's culture. Externally, interviewing is about public
relations and perception. At each stage in the interview process we want our candidates
to be challenged and think positively about both the interview process and the organization. 
&lt;p&gt;
The impression the candidate takes out into the market is important if we care about
our image. Our goal is to conduct a professional interview such that, regardless of
the outcome (hire/no hire), the candidate's impression of the company is high. Word
travels fast and negative rapport hurts recruiting. We tend to remember the negative
experiences more vividly then the positive, so treat the candidates professionally
and respectfully, and by all means, conduct the interviews with staff trained to interview
and mature enough to represent the company. On several occasions I have witnessed
interviewers conducting themselves as if they are being interviewed by their peers
and managers in the room. 
&lt;p&gt;
The goal of the phone screen is to assess the candidate's skills to determine if he/she
would be technical enough to be successful during a full day interview. We want the
candidate to walk away from the interview feeling rewarded and good about themselves
and the company. We want to determine fit as soon as possible to save us time and
money and have the candidate save face. 
&lt;p&gt;
&lt;strong&gt;The Plan&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The phone interview should be "in and out," just like a robbery. Have a plan of attack.
Whether it is interviewing or playing a football game, those who are successful execute
a plan. In college we followed a plan for every game. "Convert third downs. Don't
give up the big play. No turnovers. No penalties. Execute the kicking game. Execute
special teams. Don't flinch." I am sorry I cannot recall all of them. When we followed
the plan we found success. When we were not successful, we could easily identify which
part of the plan we did not execute. Interviewing can use the same approach.
&lt;/p&gt;
&lt;p&gt;
Have a plan or a script in front of you during the interview. Settle on some questions
you feel will help determine technical skills and stick to them. Have some backup
questions. If the candidate answers this way, delve into his response with this. If
he fails to answer, ask him this, or move on, ect. Assuming your plan works and you
continually hone it, execute the same plan for each candidate. Make your interviewers
understand the plan. Have them execute it. Have them believe in it.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;My Typical Plan&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Schedule 30 minutes with the candidate over the telephone in a quiet room away from
distractions&lt;/li&gt;
&lt;li&gt;
Send the candidate a live meeting request&lt;/li&gt;
&lt;li&gt;
Be prompt, be prepared&lt;/li&gt;
&lt;li&gt;
Determine fit as soon as possible&lt;/li&gt;
&lt;li&gt;
Drive the discussion&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
Small introduction&lt;/li&gt;
&lt;li&gt;
Warm up questions&lt;/li&gt;
&lt;li&gt;
Get them writing code&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Assess how they have done at this point&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
Good - continue further questioning and begin selling us more&lt;/li&gt;
&lt;li&gt;
Bad - conclude. Remember, the longer we stay on, the more attached we become.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Conclude&lt;/li&gt;
&lt;li&gt;
Follow up with the recruiter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
For me, the two most important concepts to take away from the phone screen are drive
the discussion and get them to write code. Driving the discussion keeps the interviewer
in charge of the interview and enables proper execution of the plan. The longer we
stay on the phone, the more susceptible we are to making decisions based on emotion
rather than fact. Drive the discussion and stay in command. 
&lt;/p&gt;
&lt;p&gt;
Get the candidate to write code. Do not assume because they can talk about a technology
that they are comfortable working in it. Use live meeting and a have them write a
function, refactor a class, provide a working example of polymorphism. Better to find
out now if they cannot write code than further into the interview process. 
&lt;/p&gt;
&lt;p&gt;
The technical screen is more important than we tend to believe. Devise a plan and
execute it. Lead the interview and determine as soon as possible if this candidate
possess enough skills and experience to be successful within your organization. Be
professional and respectful. We want the candidate to think positively about the company
regardless of the outcome.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=23e87f69-762f-4720-bc9d-48f5220500c8" /&gt;</description>
      <comments>http://www.muellerdesigns.net/dasblog/CommentView,guid,23e87f69-762f-4720-bc9d-48f5220500c8.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.muellerdesigns.net/dasblog/Trackback.aspx?guid=16ab23c3-7003-42dc-9f2a-815100a02d18</trackback:ping>
      <pingback:server>http://www.muellerdesigns.net/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muellerdesigns.net/dasblog/PermaLink,guid,16ab23c3-7003-42dc-9f2a-815100a02d18.aspx</pingback:target>
      <dc:creator>Alex Mueller</dc:creator>
      <wfw:comment>http://www.muellerdesigns.net/dasblog/CommentView,guid,16ab23c3-7003-42dc-9f2a-815100a02d18.aspx</wfw:comment>
      <wfw:commentRss>http://www.muellerdesigns.net/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=16ab23c3-7003-42dc-9f2a-815100a02d18</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I have spent the past couple weeks holed up in a cave building a web site using the
latest ASP.NET MVC framework. I am behind on blogging, responding to emails, and keeping
up with my RSS feeds. I am making good progress with ASP.NET's MVC framework and enjoying
the development experience, despite the occasional beta blip. 
</p>
        <p>
I started developing a site using the MVC Preview 2 source. Two weeks in, I pulled
the latest <a title="MvcContrib" href="http://www.codeplex.com/MVCContrib" target="_blank">MvcContrib</a> project,
and a few days ago I upgraded again to the MVC Preview 3 source. Like anyone using
beta software, I have spent some time swearing at my screen, but overall, I am pleased
with the MVC framework. After returning from vacation, I now find that I am one more
release behind on my MvcContrib binaries.
</p>
        <p>
As I began developing with the MVC framework, the similarities I was seeing with <a href="http://www.castleproject.org/monorail/index.html" target="_blank">Castle's
MonoRail</a> MVC were numerous and reassuring. I felt like I could hit the ground
running with previous MVC knowledge. The sample MVC application right out of the box
is functional and a helpful place to start familiarizing and education oneself with
the new framework. For those tools and features that are not built into the framework
at this point, I found the MvcContrib project to be helpful in my development. 
</p>
        <p>
It seemed like with each day of development I would discover something new, cool,
or exciting, and I wanted to share it on this blog. As I started down the path of
writing a blog entry, I procrastinated each time thinking, "let me just get through
this one issue first and then I will blog." That approach snowballed tremendously.
With each hurdle I had to surpass, there was another release I had to install. Of
course, I did not have to install any of these updates, but I did thinking they would
be trivial. In some cases they were, and in some they were not. My point - there is
a great deal of change and development constantly occurring on the MVC framework and
other tools supporting it. Expect this rate of change while the framework is maturing.
Sometimes it is frustrating, but there is great support on the <a title="ASP.NET/MVC" href="http://www.asp.net/mvc/" target="_blank">ASP.NET/MVC</a> forums
as well as <a title="MvcContrib" href="http://groups.google.com/group/mvccontrib-discuss" target="_blank">MvcContrib</a>.
</p>
        <p>
          <strong>
          </strong> 
</p>
        <p>
          <strong>Why do I like it?</strong>
        </p>
        <p>
MVC promotes a cleaner separation of concerns. Since I am used to developing in ASP.NET
and trying to adhere to a loosely defined MVP pattern, this MVC framework mitigates
some of the frustrations of having to enforce the pattern as well as SoC. 
</p>
        <p>
Testability is build into the framework. When creating a new project, there is an
option to create a test project to accompany it. 
</p>
        <p>
I can create a web site quickly and cleanly. As I add a new page (view), I have a
distinct controller and view for it. Unlike MVP implemented in ASP.NET, I do not have
to enforce my controller-view separation, it is done for me. 
</p>
        <p>
I am able to use use more than one view engine easily. I am tired of using the ASP.NET
view engine. While one can roll their own view engine flavor, MvcContrib provides
support for a few out of the box. I can free myself of having to use ASPX pages, ASCX
user controls, and their code-behind files. 
</p>
        <p>
I prefer using the <a href="http://nvelocity.sourceforge.net/" target="_blank">NVelocity</a> view
engine. I prefer the more simple HTML view of NVelocity. My customers enjoy it as
well, and they do not have to concern themselves with ASP syntax. They will have to
learn a few tricks with NVelocity, but nothing that is not intuitive as it is.
</p>
        <p>
Extensible source. I have been able to add custom support to provide overrides and
additional functionality to the framework as I need it.
</p>
        <p>
Community support. The MvcContrib project helps make development with MVC easier.
Use their view engines and IoC container support. Know of some functionality that
is not available, add it. 
</p>
        <p>
          <strong>
          </strong> 
</p>
        <p>
          <strong>Pitfalls</strong>
        </p>
        <p>
IIS 6 and URL rewriting. While it is possible to get the nice URL rewriting to work
with IIS 6, ISAPI filters, and extension mappings. It is a PITA. I am in the process
of upgrading my customer's environment to use IIS 7. Today, their URL contains the
".mvc" string, such as, &lt;domainName&gt;/home.mvc, or &lt;domainName&gt;/account.mvc/login.
I suggest having IIS 7 available.
</p>
        <p>
Ajax framework. I am still waiting on a good Ajax framework to be included. The one
MonoRail includes is nice. As for now, I am using jQuery and developing my own. Hmmm,
maybe this functionality could be added to the MvcContrib project, and maybe instead
of limiting it to jQuery, I could abstract it to enable other Ajax providers. We'll
see what time permits.
</p>
        <p>
Third party controls like Telerik, Infragistics, et alia. Rich datagrids, tree controls,
and other controls that rely on view state and postbacks. I expect support will come
around for these.
</p>
        <p>
I tried the <a href="http://andrewpeters.net/2007/12/19/introducing-nhaml-an-aspnet-mvc-view-engine/" target="_blank">NHaml</a> view
engine, a .NET implementation of the Rails Haml view engine. My NHaml default layout
(master page) was generating runtime errors because I was not use the proper spacing
of two characters. Seriously? Two spaces? Who cares. I moved on to try Brail.
</p>
        <p>
 
</p>
        <p>
I have been pleased thus far. Thank you to the ASP.NET MVC team and the contributors
to the MvcContrib project. Keep up the great work. 
</p>
        <img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=16ab23c3-7003-42dc-9f2a-815100a02d18" />
      </body>
      <title>Working with ASP.NET MVC and MvcContrib</title>
      <guid isPermaLink="false">http://www.muellerdesigns.net/dasblog/PermaLink,guid,16ab23c3-7003-42dc-9f2a-815100a02d18.aspx</guid>
      <link>http://www.muellerdesigns.net/dasblog/2008/06/30/WorkingWithASPNETMVCAndMvcContrib.aspx</link>
      <pubDate>Mon, 30 Jun 2008 22:15:53 GMT</pubDate>
      <description>&lt;p&gt;
I have spent the past couple weeks holed up in a cave building a web site using the
latest ASP.NET MVC framework. I am behind on blogging, responding to emails, and keeping
up with my RSS feeds. I am making good progress with ASP.NET's MVC framework and enjoying
the development experience, despite the occasional beta blip. 
&lt;/p&gt;
&lt;p&gt;
I started developing a site using the MVC Preview 2 source. Two weeks in, I pulled
the latest &lt;a title="MvcContrib" href="http://www.codeplex.com/MVCContrib" target="_blank"&gt;MvcContrib&lt;/a&gt; project,
and a few days ago I upgraded again to the MVC Preview 3 source. Like anyone using
beta software, I have spent some time swearing at my screen, but overall, I am pleased
with the MVC framework. After returning from vacation, I now find that I am one more
release behind on my MvcContrib binaries.
&lt;/p&gt;
&lt;p&gt;
As I began developing with the MVC framework, the similarities I was seeing with &lt;a href="http://www.castleproject.org/monorail/index.html" target="_blank"&gt;Castle's
MonoRail&lt;/a&gt; MVC were numerous and reassuring. I felt like I could hit the ground
running with previous MVC knowledge. The sample MVC application right out of the box
is functional and a helpful place to start familiarizing and education oneself with
the new framework. For those tools and features that are not built into the framework
at this point, I found the MvcContrib project to be helpful in my development. 
&lt;/p&gt;
&lt;p&gt;
It seemed like with each day of development I would discover something new, cool,
or exciting, and I wanted to share it on this blog. As I started down the path of
writing a blog entry, I procrastinated each time thinking, "let me just get through
this one issue first and then I will blog." That approach snowballed tremendously.
With each hurdle I had to surpass, there was another release I had to install. Of
course, I did not have to install any of these updates, but I did thinking they would
be trivial. In some cases they were, and in some they were not. My point - there is
a great deal of change and development constantly occurring on the MVC framework and
other tools supporting it. Expect this rate of change while the framework is maturing.
Sometimes it is frustrating, but there is great support on the &lt;a title="ASP.NET/MVC" href="http://www.asp.net/mvc/" target="_blank"&gt;ASP.NET/MVC&lt;/a&gt; forums
as well as &lt;a title="MvcContrib" href="http://groups.google.com/group/mvccontrib-discuss" target="_blank"&gt;MvcContrib&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Why do I like it?&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
MVC promotes a cleaner separation of concerns. Since I am used to developing in ASP.NET
and trying to adhere to a loosely defined MVP pattern, this MVC framework mitigates
some of the frustrations of having to enforce the pattern as well as SoC. 
&lt;/p&gt;
&lt;p&gt;
Testability is build into the framework. When creating a new project, there is an
option to create a test project to accompany it. 
&lt;/p&gt;
&lt;p&gt;
I can create a web site quickly and cleanly. As I add a new page (view), I have a
distinct controller and view for it. Unlike MVP implemented in ASP.NET, I do not have
to enforce my controller-view separation, it is done for me. 
&lt;/p&gt;
&lt;p&gt;
I am able to use use more than one view engine easily. I am tired of using the ASP.NET
view engine. While one can roll their own view engine flavor, MvcContrib provides
support for a few out of the box. I can free myself of having to use ASPX pages, ASCX
user controls, and their code-behind files. 
&lt;/p&gt;
&lt;p&gt;
I prefer using the &lt;a href="http://nvelocity.sourceforge.net/" target="_blank"&gt;NVelocity&lt;/a&gt; view
engine. I prefer the more simple HTML view of NVelocity. My customers enjoy it as
well, and they do not have to concern themselves with ASP syntax. They will have to
learn a few tricks with NVelocity, but nothing that is not intuitive as it is.
&lt;/p&gt;
&lt;p&gt;
Extensible source. I have been able to add custom support to provide overrides and
additional functionality to the framework as I need it.
&lt;/p&gt;
&lt;p&gt;
Community support. The MvcContrib project helps make development with MVC easier.
Use their view engines and IoC container support. Know of some functionality that
is not available, add it. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Pitfalls&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
IIS 6 and URL rewriting. While it is possible to get the nice URL rewriting to work
with IIS 6, ISAPI filters, and extension mappings. It is a PITA. I am in the process
of upgrading my customer's environment to use IIS 7. Today, their URL contains the
".mvc" string, such as, &amp;lt;domainName&amp;gt;/home.mvc, or &amp;lt;domainName&amp;gt;/account.mvc/login.
I suggest having IIS 7 available.
&lt;/p&gt;
&lt;p&gt;
Ajax framework. I am still waiting on a good Ajax framework to be included. The one
MonoRail includes is nice. As for now, I am using jQuery and developing my own. Hmmm,
maybe this functionality could be added to the MvcContrib project, and maybe instead
of limiting it to jQuery, I could abstract it to enable other Ajax providers. We'll
see what time permits.
&lt;/p&gt;
&lt;p&gt;
Third party controls like Telerik, Infragistics, et alia. Rich datagrids, tree controls,
and other controls that rely on view state and postbacks. I expect support will come
around for these.
&lt;/p&gt;
&lt;p&gt;
I tried the &lt;a href="http://andrewpeters.net/2007/12/19/introducing-nhaml-an-aspnet-mvc-view-engine/" target="_blank"&gt;NHaml&lt;/a&gt; view
engine, a .NET implementation of the Rails Haml view engine. My NHaml default layout
(master page) was generating runtime errors because I was not use the proper spacing
of two characters. Seriously? Two spaces? Who cares. I moved on to try Brail.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
I have been pleased thus far. Thank you to the ASP.NET MVC team and the contributors
to the MvcContrib project. Keep up the great work. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=16ab23c3-7003-42dc-9f2a-815100a02d18" /&gt;</description>
      <comments>http://www.muellerdesigns.net/dasblog/CommentView,guid,16ab23c3-7003-42dc-9f2a-815100a02d18.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.muellerdesigns.net/dasblog/Trackback.aspx?guid=2e60dcc4-ff02-4b38-aa22-3a637f9db8af</trackback:ping>
      <pingback:server>http://www.muellerdesigns.net/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muellerdesigns.net/dasblog/PermaLink,guid,2e60dcc4-ff02-4b38-aa22-3a637f9db8af.aspx</pingback:target>
      <dc:creator>Alex Mueller</dc:creator>
      <wfw:comment>http://www.muellerdesigns.net/dasblog/CommentView,guid,2e60dcc4-ff02-4b38-aa22-3a637f9db8af.aspx</wfw:comment>
      <wfw:commentRss>http://www.muellerdesigns.net/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=2e60dcc4-ff02-4b38-aa22-3a637f9db8af</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I have been doing code reviews frequently this past week and have been remarking on
the naming conventions of test methods. In a effort to try and find the rules of BDD
naming conventions, I came across <a title="Dan North's introduction to BDD" href="http://dannorth.net/introducing-bdd" target="_blank">Dan
North's introduction to BDD</a>, which is a great starting point, and a blog post
by <a title="David Laribee" href="http://codebetter.com/blogs/david_laribee/archive/2007/12/17/approaching-bdd.aspx" target="_blank">David
Laribee</a> that has made a good impression on me. You can read up on BDD to learn
more, this post will not go into detail about it. 
</p>
        <p>
From what I gathered from David Laribee's <a title="article" href="http://codebetter.com/blogs/david_laribee/archive/2007/12/17/approaching-bdd.aspx" target="_blank">article</a>,
I like this. I REALLY like this. 
</p>
        <p>
          <img src="http://codebetter.com/blogs/david_laribee/WindowsLiveWriter/ApproachingBDD_AED1/resharper-specs_3.jpg" />
        </p>
        <p>
By changing namespace, class, and method names, the behavior of each spec (test) is
clearly revealed. In a larger suite of tests, if there are failures, I can more easily
see what is failing and what trends, if any, are resulting in my failures. Before,
I would name my test method names to describe a behavior, "Some concept should do
this when given that." Getting the namespace and class name involved provides a more
legible test result. 
</p>
        <p>
While reviewing a test case for a peer, I took this approach and arrived at the following
scenario. I am changing the names of the methods to hide details. The original test
method was "FilterToEndPointTestReport." Making this more readable, using my previous
approach, we arrived at "FilterShouldUpdateStatusOnReportWhenDefaultFilterValueIsChanged."
Great, that is better, but...
</p>
        <p>
Applying the approach described in David's post, I now have this.
</p>
        <div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #606060"> 1:</span>
              <span style="color: #0000ff">namespace</span> Specs_for_Filters</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 2:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #606060"> 3:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">class</span> When_default_filter_value_is_changed
: FilterTestFixture</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 4:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #606060"> 5:</span> [Test]</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 6:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">void</span> Endpoint_should_be_updated_on_report
{}</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #606060"> 7:</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 8:</span> [Test]</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #606060"> 9:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">void</span> Endpoint_should_be_updated_on_grid
{}</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 10:</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #606060"> 11:</span> [Test]</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 12:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">void</span> Endpoint_should_be_updated_on_chart
{}</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #606060"> 13:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 14:</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #606060"> 15:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">abstract</span>
              <span style="color: #0000ff">class</span> FilterTestFixture</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 16:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #606060"> 17:</span>
              <span style="color: #008000">//
provide common functionality that will be used </span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 18:</span>
              <span style="color: #008000">//
among behavior-driven filter test classes.</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">
              <span style="color: #606060"> 19:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 20:</span> }</pre>
          </div>
        </div>
        <p>
When my tests run, their resulting output is more legible. This approach helps me
to think about my tests in terms of behavior rather than implementation. In my opinion,
my test cases are now more abstract and more succinct. 
</p>
        <img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=2e60dcc4-ff02-4b38-aa22-3a637f9db8af" />
      </body>
      <title>Thanks to BDD</title>
      <guid isPermaLink="false">http://www.muellerdesigns.net/dasblog/PermaLink,guid,2e60dcc4-ff02-4b38-aa22-3a637f9db8af.aspx</guid>
      <link>http://www.muellerdesigns.net/dasblog/2008/05/01/ThanksToBDD.aspx</link>
      <pubDate>Thu, 01 May 2008 18:48:23 GMT</pubDate>
      <description>&lt;p&gt;
I have been doing code reviews frequently this past week and have been remarking on
the naming conventions of test methods. In a effort to try and find the rules of BDD
naming conventions, I came across &lt;a title="Dan North's introduction to BDD" href="http://dannorth.net/introducing-bdd" target="_blank"&gt;Dan
North's introduction to BDD&lt;/a&gt;, which is a great starting point, and a blog post
by &lt;a title="David Laribee" href="http://codebetter.com/blogs/david_laribee/archive/2007/12/17/approaching-bdd.aspx" target="_blank"&gt;David
Laribee&lt;/a&gt; that has made a good impression on me. You can read up on BDD to learn
more, this post will not go into detail about it. 
&lt;/p&gt;
&lt;p&gt;
From what I gathered from David Laribee's &lt;a title="article" href="http://codebetter.com/blogs/david_laribee/archive/2007/12/17/approaching-bdd.aspx" target="_blank"&gt;article&lt;/a&gt;,
I like this. I REALLY like this. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://codebetter.com/blogs/david_laribee/WindowsLiveWriter/ApproachingBDD_AED1/resharper-specs_3.jpg"&gt; 
&lt;/p&gt;
&lt;p&gt;
By changing namespace, class, and method names, the behavior of each spec (test) is
clearly revealed. In a larger suite of tests, if there are failures, I can more easily
see what is failing and what trends, if any, are resulting in my failures. Before,
I would name my test method names to describe a behavior, "Some concept should do
this when given that." Getting the namespace and class name involved provides a more
legible test result. 
&lt;/p&gt;
&lt;p&gt;
While reviewing a test case for a peer, I took this approach and arrived at the following
scenario. I am changing the names of the methods to hide details. The original test
method was "FilterToEndPointTestReport." Making this more readable, using my previous
approach, we arrived at "FilterShouldUpdateStatusOnReportWhenDefaultFilterValueIsChanged."
Great, that is better, but...
&lt;/p&gt;
&lt;p&gt;
Applying the approach described in David's post, I now have this.
&lt;/p&gt;
&lt;div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Specs_for_Filters&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 2:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; When_default_filter_value_is_changed
: FilterTestFixture&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 4:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 5:&lt;/span&gt; [Test]&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Endpoint_should_be_updated_on_report
{}&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 7:&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 8:&lt;/span&gt; [Test]&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Endpoint_should_be_updated_on_grid
{}&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 10:&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 11:&lt;/span&gt; [Test]&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 12:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Endpoint_should_be_updated_on_chart
{}&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 13:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 14:&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 15:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; FilterTestFixture&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 16:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 17:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
provide common functionality that will be used &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 18:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
among behavior-driven filter test classes.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 19:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 20:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
When my tests run, their resulting output is more legible. This approach helps me
to think about my tests in terms of behavior rather than implementation. In my opinion,
my test cases are now more abstract and more succinct. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=2e60dcc4-ff02-4b38-aa22-3a637f9db8af" /&gt;</description>
      <comments>http://www.muellerdesigns.net/dasblog/CommentView,guid,2e60dcc4-ff02-4b38-aa22-3a637f9db8af.aspx</comments>
      <category>Design</category>
    </item>
    <item>
      <trackback:ping>http://www.muellerdesigns.net/dasblog/Trackback.aspx?guid=bc790b7d-f2bc-47e0-a5e8-465171c9b83c</trackback:ping>
      <pingback:server>http://www.muellerdesigns.net/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muellerdesigns.net/dasblog/PermaLink,guid,bc790b7d-f2bc-47e0-a5e8-465171c9b83c.aspx</pingback:target>
      <dc:creator>Alex Mueller</dc:creator>
      <wfw:comment>http://www.muellerdesigns.net/dasblog/CommentView,guid,bc790b7d-f2bc-47e0-a5e8-465171c9b83c.aspx</wfw:comment>
      <wfw:commentRss>http://www.muellerdesigns.net/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=bc790b7d-f2bc-47e0-a5e8-465171c9b83c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I am undecided on <a title="http://twitter.com" href="http://twitter.com" target="_blank">Twitter</a>.
The jury is still out in my mind. On any given day, there are things I need to do
and things I would like to do. Not taking into account family things, I read through
my emails, both work and personal, read through my RSS feeds, news feeds, weather
reports, IM with close friends and family, read a few credible news sources, and somewhere
find time to work and research new and existing technologies. If I can get that far,
that is a busy day, and that does not include family. 
</p>
        <p>
So where am I supposed to find time to update everyone on Twitter? How is Twitter
fitting into your schedule?
</p>
        <p>
          <a title="http://twitter.com/bamueller" href="http://twitter.com/bamueller" target="_blank">You
can follow me</a>, but I am not really all that active, at least until I find more
time. 
</p>
        <img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=bc790b7d-f2bc-47e0-a5e8-465171c9b83c" />
      </body>
      <title>Twitter</title>
      <guid isPermaLink="false">http://www.muellerdesigns.net/dasblog/PermaLink,guid,bc790b7d-f2bc-47e0-a5e8-465171c9b83c.aspx</guid>
      <link>http://www.muellerdesigns.net/dasblog/2008/04/30/Twitter.aspx</link>
      <pubDate>Wed, 30 Apr 2008 05:17:29 GMT</pubDate>
      <description>&lt;p&gt;
I am undecided on &lt;a title="http://twitter.com" href="http://twitter.com" target="_blank"&gt;Twitter&lt;/a&gt;.
The jury is still out in my mind. On any given day, there are things I need to do
and things I would like to do. Not taking into account family things, I read through
my emails, both work and personal, read through my RSS feeds, news feeds, weather
reports, IM with close friends and family, read a few credible news sources, and somewhere
find time to work and research new and existing technologies. If I can get that far,
that is a busy day, and that does not include family. 
&lt;/p&gt;
&lt;p&gt;
So where am I supposed to find time to update everyone on Twitter? How is Twitter
fitting into your schedule?
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://twitter.com/bamueller" href="http://twitter.com/bamueller" target="_blank"&gt;You
can follow me&lt;/a&gt;, but I am not really all that active, at least until I find more
time. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muellerdesigns.net/dasblog/aggbug.ashx?id=bc790b7d-f2bc-47e0-a5e8-465171c9b83c" /&gt;</description>
      <comments>http://www.muellerdesigns.net/dasblog/CommentView,guid,bc790b7d-f2bc-47e0-a5e8-465171c9b83c.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.muellerdesigns.net/dasblog/Trackback.aspx?guid=2f2caf81-44b8-46e6-8367-97a8ab76cabe</trackback:ping>
      <pingback:server>http://www.muellerdesigns.net/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muellerdesigns.net/dasblog/PermaLink,guid,2f2caf81-44b8-46e6-8367-97a8ab76cabe.aspx</pingback:target>
      <dc:creator>Alex Mueller</dc:creator>
      <wfw:comment>http://www.muellerdesigns.net/dasblog/CommentView,guid,2f2caf81-44b8-46e6-8367-97a8ab76cabe.aspx</wfw:comment>
      <wfw:commentRss>http://www.muellerdesigns.net/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=2f2caf81-44b8-46e6-8367-97a8ab76cabe</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I 