<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Falconer Development, LLC</title>
	<atom:link href="http://www.falconerdevelopment.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.falconerdevelopment.com</link>
	<description></description>
	<lastBuildDate>Thu, 29 Dec 2011 17:15:22 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.2</generator>
		<item>
		<title>Introducing Dropstream: eCommerce Integration Service for Retailers</title>
		<link>http://www.falconerdevelopment.com/2011/12/29/introducing-dropstream-ecommerce-integration-service-retailers/</link>
		<comments>http://www.falconerdevelopment.com/2011/12/29/introducing-dropstream-ecommerce-integration-service-retailers/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 17:15:22 +0000</pubDate>
		<dc:creator>Karl Falconer</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.falconerdevelopment.com/?p=689</guid>
		<description><![CDATA[Today I am sharing the beginning of a new software service, Dropstream. Dropstream is a unique service that provides an integration hub between eCommerce platforms and fulfillment centers, allowing retailers to spend less time processing orders and more time growing their business. Now, the niche that Dropstream targets may seem like a radical deviation from [...]]]></description>
				<content:encoded><![CDATA[<p>
<img class="image-box" src="http://s3.amazonaws.com/falconerdevelopment/wp-content/uploads/2011/12/Dropstream03.png" alt="Dropstream Logo" title="Dropstream_logo" width="500" height="91" class="alignnone size-full wp-image-690" />
</p>
<p>Today I am sharing the beginning of a new software service, <a href="http://getdropstream.com" title="eCommerce fulfillment service" target="_blank">Dropstream</a>. Dropstream is a unique service that provides an integration hub between eCommerce platforms and fulfillment centers, allowing retailers to spend less time processing orders and more time growing their business.</p>
<p>Now, the niche that Dropstream targets may seem like a radical deviation from some of the other products I’ve marketed and in the past, and you’re right, it is very different. But the one thing all of my other products have in common is that they started to scratch my own itch, and Dropstream is no different.</p>
<p>Lately, I’ve been less interested in exercising my technical skills to build new products and more interested in online marketing, which I admit, I struggle. A few failed negotiations later, I happened across a niche eCommerce website for sale. Running an eCommerce store was something I never considered, however, it came across as the perfect opportunity to gain valuable knowledge in online marketing. As I researched the details of operating an eCommerce store I began to see a potential problem that could be solved through automation.</p>
<p>Many fulfillment centers that eCommerce Retailers work with typically process orders and track inventory in one of several ways: E-mail, FTP Upload (CSV, XML files), and Webservice API. With the abundance of eCommerce platforms, the responsibility is on the retailer to provide an integration with their platform. Those without a technical background wishing to automate these back-office tasks have two options: continue to process tasks manually, or outsource integration development.</p>
<p>Dropstream provides a third option, enabling retailers to better manager their time operating their store. Visit <a href="http://getdropstream.com/blog" title="Dropstream eCommerce Blog" target="_blank">Dropstream’s blog</a> for the latest insights in eCommerce and Dropstream progress.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.falconerdevelopment.com/2011/12/29/introducing-dropstream-ecommerce-integration-service-retailers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VurtleOne 1.2 Released</title>
		<link>http://www.falconerdevelopment.com/2011/11/01/vurtleone-1-2-released/</link>
		<comments>http://www.falconerdevelopment.com/2011/11/01/vurtleone-1-2-released/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 22:29:31 +0000</pubDate>
		<dc:creator>Karl Falconer</dc:creator>
				<category><![CDATA[Falconer Development]]></category>

		<guid isPermaLink="false">http://www.falconerdevelopment.com/?p=686</guid>
		<description><![CDATA[VurtleOne has been updated with a new Options menu that will allow users to customize the details written to the TortoiseSVN commit message. By default a Backlog Item or Defect will always include the title, optionally you can include the description or URL. Download the new version today.]]></description>
				<content:encoded><![CDATA[<p>VurtleOne has been updated with a new Options menu that will allow users to customize the details written to the TortoiseSVN commit message. By default a Backlog Item or Defect will always include the title, optionally you can include the description or URL. <a href="http://www.falconerdevelopment.com/downloads/" title="Downloads">Download the new version today</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.falconerdevelopment.com/2011/11/01/vurtleone-1-2-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How Agile Teams Can Find Time To Tackle Technical Debt</title>
		<link>http://www.falconerdevelopment.com/2011/07/18/agile-teams-find-time-tackle-technical-debt/</link>
		<comments>http://www.falconerdevelopment.com/2011/07/18/agile-teams-find-time-tackle-technical-debt/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 12:00:11 +0000</pubDate>
		<dc:creator>Karl Falconer</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://www.falconerdevelopment.com/?p=666</guid>
		<description><![CDATA[Photo by Will Scullin On any project of significant size, there are a few constants, one of them is technical debt. Those problems with your code base that irritate you, but never seem to get fixed. This could be poor architectural decisions, messy code, or the lack of automated tests. To put your team in a [...]]]></description>
				<content:encoded><![CDATA[<p><img class="image-box" src="http://s3.amazonaws.com/falconerdevelopment/wp-content/uploads/2011/04/3770015203.jpg" alt="Blueprint" width="500" height="333" /><span class="attrib">Photo by <a href="http://www.falconerdevelopment.com/go/Will+Scullin/" target="_blank">Will Scullin</a></span></p>
<p>On any project of significant size, there are a few constants, one of them is <a title="Technical Debt" href="http://www.allaboutagile.com/paying-down-technical-debt/" target="_blank">technical debt</a>. Those problems with your code base that irritate you, but never seem to get fixed. This could be poor architectural decisions, messy code, or the lack of <a title="Automated Software Testing Techniques" href="http://www.falconerdevelopment.com/2011/03/10/automated-software-testing-techniques/">automated tests</a>.</p>
<p>To put your team in a better position to tackle technical debt, there is only one thing that you need to do. Plan.</p>
<h2>Smart Sprint Planning</h2>
<p>Typically during sprint planning, the scrum master will take a tally of each team members availability during the the sprint. This number will be the teams total capacity for the sprint. Then teams begin to load stories from the backlog to fill their capacity. This is where the trouble begins.</p>
<p>Many teams will over-commit the amount of work that can be done during a given sprint. Committing 100% of their capacity to completing new features. Meaning if you have estimated your team has 100 hours of working hours available during a sprint, the team commits to completing very close to 100 hours of work during the sprint, neglecting to plan for the unexpected.</p>
<p>Like death and taxes, you can always expect new features to produce new bugs. Failing to plan for the fix/test cycle can cripple a teams velocity. So not only are you pressed for time fixing new bugs, there is really no time for addressing technical debt. So how exactly do you plan for fixing technical debt? This ends up being a two step process.</p>
<h2>Planing for Technical Debt</h2>
<p>Just like any other new feature to be built, technical debt must be estimated, broken down into discrete tasks, included in the backlog and prioritized. The next step is critical, during your regular sprint planning meeting, it is important that your team does not over-commit.
<p>I would highly recommend committing only to a percentage of your total capacity for a sprint, so for example 80%. Continuing from the previous example, a team with a total sprint capacity of 100 hours would leave the team an extra 20 hours to fix bugs directly related to tasks from that sprint and address any technical debt.</p>
<p>The break down could be like this: 100% (Team capacity in hours) = 80% (New Features) + 10% (Task Bugs) + 10% (Technical debt). The important point here is to play an active role in reducing the amount of technical debt for your project in every sprint. Depending on your projects needs and team dynamic, it is a good idea to experiment a bit with these numbers to see what works best.</p>
<h2>Conclusion</h2>
<p>By leaving your team room to work within a sprint, you are able to be flexible, adjusting for user stories that may run longer, or shorter in a sprint, but also address those code stinks that you’ve been itching to git rid of. How does your team address technical debt in your projects?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.falconerdevelopment.com/2011/07/18/agile-teams-find-time-tackle-technical-debt/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>V1MantisBT 1.2 Now Available</title>
		<link>http://www.falconerdevelopment.com/2011/07/02/v1mantisbt-120-now-available/</link>
		<comments>http://www.falconerdevelopment.com/2011/07/02/v1mantisbt-120-now-available/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 22:11:12 +0000</pubDate>
		<dc:creator>Karl Falconer</dc:creator>
				<category><![CDATA[Falconer Development]]></category>

		<guid isPermaLink="false">http://www.falconerdevelopment.com/?p=679</guid>
		<description><![CDATA[Mantis Bug Tracker &#8211; VersionOne Defect Integration V1MantisBT 1.2 is now available to download. What&#8217;s changed: Support for Mantis-to-VersionOne project Mapping. You can now configure which VersionOne project your Mantis Issues are imported to. Easy installation with a new Windows installer. V1MantisBT has moved to a paid model, with two different feature editions. Update Instructions: [...]]]></description>
				<content:encoded><![CDATA[<h2>Mantis Bug Tracker &#8211; VersionOne Defect Integration</h2>
<p>V1MantisBT 1.2 is <a href="http://www.falconerdevelopment.com/downloads" title="Download V1MantisBT">now available to download</a>.</p>
<p><strong>What&#8217;s changed</strong>:</p>
<ul>
<li>Support for Mantis-to-VersionOne project Mapping. You can now configure which VersionOne project your Mantis Issues are imported to.</li>
<li>Easy installation with a new Windows installer.</li>
<li>V1MantisBT has moved to a paid model, with two different <a href="http://www.falconerdevelopment.com/v1mantisbt-pricing" title="V1MantisBT Pricing">feature editions</a>.</li>
</ul>
<p><strong>Update Instructions</strong>:</p>
<ol>
<li><a href="http://www.falconerdevelopment.com/downloads" title="Download V1MantisBT">Download the latest version here</a>.</li>
<li>Back up any existing configuration file.</li>
<li>Run the downloaded file.</li>
<li>Replace existing configuration file, or create a new one.</li>
</ol>
<p>Now you are done and ready to get back to building great software.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.falconerdevelopment.com/2011/07/02/v1mantisbt-120-now-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using the Builder Pattern to Create Data Access Layer Integration Tests</title>
		<link>http://www.falconerdevelopment.com/2011/04/18/builder-pattern-create-data-access-layer-integration-tests/</link>
		<comments>http://www.falconerdevelopment.com/2011/04/18/builder-pattern-create-data-access-layer-integration-tests/#comments</comments>
		<pubDate>Mon, 18 Apr 2011 04:08:40 +0000</pubDate>
		<dc:creator>Karl Falconer</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.falconerdevelopment.com/?p=663</guid>
		<description><![CDATA[Photo by bucklava Automated testing is a good software engineering principle regardless of which development management process being used, Scrum, TDD, XP, etc. You know all about the benefits of unit-testing. It will reduce the number of defects, catch bugs earlier, unicorns will manifest themselves and bring you a beer. Great! But how do you start? [...]]]></description>
				<content:encoded><![CDATA[<p><img class="image-box" src="http://s3.amazonaws.com/falconerdevelopment/wp-content/uploads/2011/04/3218009163.jpg" alt="LEGO 7630 Front End Loader" width="461" height="346" /><span class="attrib">Photo by <a href="http://www.falconerdevelopment.com/go/bucklava/">bucklava</a></span></p>
<p>Automated testing is a good software engineering principle regardless of which development management process being used, <a title="Agile Scrum" href="http://www.allaboutagile.com/agile-scrum/" target="_blank">Scrum</a>, TDD, XP, etc. You know all about the benefits of unit-testing. It will reduce the number of defects, catch bugs earlier, unicorns will manifest themselves and bring you a beer. Great! But how do you start?</p>
<p>There are various opinions on how to test your Data Access Layer (DAL). Some would argue that it makes sense to write tests that run against an actual database. Others will argue that DAL tests should be mocked. While, I’ve talked previously about <a title="3 Tips for Unit Testing Best Practices" href="http://www.falconerdevelopment.com/2011/03/24/3-tips-unit-testing-practices/" target="_blank">techniques for unit-testing</a>, advocating, pleading, begging for the usage of mocked dependencies (using a mocking framework). When it comes to testing the DAL, this is where I make an exception to that guidance.</p>
<p>Don’t get me wrong, the database is a dependency on the DAL, but the trade offs between mocking the database versus having a separate test database is a more efficient use of development effort. Grated, using a mock framework in place of a database dependency will allow you to run your tests quickly, and all those great things that come with pure unit-tests. But the DAL is special, it is like an ice berg, its runtime logic is only partially contained within its code. (Hint: The other portion is contained in the database)</p>
<p>It does not matter if you are using a the latest-and-greatest wiz-bang <a title="Object-relation mapping" href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORM</a>, stored procedures, or dynamic SQL, your database will always contain some logic that needs to be tested. Which is why am a supporter of <a title="Automated Software Testing Techniques" href="http://www.falconerdevelopment.com/2011/03/10/automated-software-testing-techniques/" target="_blank">integration testing</a> your Data Access Layer, and not unit-testing. There are many issues that can be uncovered by integration testing your DAL. Including, but not limited to, typographical errors, foreign-key violations, and plain old incorrect SQL.</p>
<p><em>As an aside, having database integration tests are a great way to performance tune your data schema and SQL.</em></p>
<h2>Builder Pattern</h2>
<p>So how exactly do we go about creating integration tests for our Data Access Layer. Well, this is a little tricky, since rarely will you have one domain object that does not have a dependency on another. So creating Create, Read, Update, Delete (CRUD) integration tests can quickly get out of hand and result in lots of duplicated code across tests.</p>
<p>This is where the Builder pattern will help. The Builder design pattern is similar to the <a title="Abstract Factory Pattern" href="http://en.wikipedia.org/wiki/Abstract_factory_pattern" target="_blank">Factory pattern</a>, in that  both patterns abstract away the instantiation of an object, however the builder pattern has a few more features that suite it well for creating integration tests.</p>
<p>The purpose of the Builder pattern create a flexible interface by which a developer can create a dataset that can be used to test the CRUD operations of a Data Access component. Lets take a look at an example:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">override</span> Person Build<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">return</span> Builder<span style="color: #008000;">.</span><span style="color: #0000FF;">CreateNew</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">.</span><span style="color: #0000FF;">And</span><span style="color: #008000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x<span style="color: #008000;">.</span><span style="color: #0000FF;">OrganizationId</span> <span style="color: #008000;">=</span> organization<span style="color: #008000;">.</span><span style="color: #0000FF;">OrganizationId</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">.</span><span style="color: #0000FF;">And</span><span style="color: #008000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span> <span style="color: #008000;">=</span> GetRandom<span style="color: #008000;">.</span><span style="color: #0000FF;">Phrase</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">10</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">.</span><span style="color: #0000FF;">And</span><span style="color: #008000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x<span style="color: #008000;">.</span><span style="color: #0000FF;">StartDT</span> <span style="color: #008000;">=</span> startDate<span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">.</span><span style="color: #0000FF;">Build</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span></pre></div></div>

<p>The example PersonBuilder class has two main functions, Build and Save. The build function simply creates an instance of a person with all reasonable defaults initialized. In this example, the Name, StartDT and OrganizationId.  I am also using a framework called <a title="NBuilder" href="http://nbuilder.org/" target="_blank">NBuilder</a> to do the actual instantiation of the Person object. NBuilder provides some very handy features for rapid object generation.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">override</span> Person Save<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Person person <span style="color: #008000;">=</span> Build<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008000;">new</span> PersonDA<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Insert</span><span style="color: #008000;">&#40;</span>person<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">return</span> person<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span></pre></div></div>

<p>The Save function is a little trickier, since this is where the instance of a person is actually persisted to the database. This is where you must be aware of your particular database constraints. In our example, the Person Table has a relationship with the Organization Table, so we must save the Organization to the database before we can save the Person. This is the responsibility of the caller, the integration test.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">        <span style="color: #0600FF; font-weight: bold;">public</span> PersonBuilder WithStartDate<span style="color: #008000;">&#40;</span>DateTime startDate<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">startDate</span> <span style="color: #008000;">=</span> startDate<span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> PersonBuilder WithOrganization<span style="color: #008000;">&#40;</span>Organization organization<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">organization</span> <span style="color: #008000;">=</span> organization<span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span></pre></div></div>

<p>There are two other methods that should be highlighted, WithStartDate, and WithOrganization. These methods allow a developer to override the default values of the OrganizationId and StartDT property on the Person instance. Providing these methods allows a developer to craft a dataset to fits the need of a particular test. For example, asserting the <a title="Cardinality (data modeling)" href="http://en.wikipedia.org/wiki/Cardinality_(data_modeling)" target="_blank">cardinality</a> between an Organization and Person, or testing specific query logic that may filter records.</p>
<p>In practice, these extra methods are not needed for every single property of a class, you will have to use your best judgement to determine when they are needed under a particular unit testing scenario. When going through this process, a Domain Specific Language (DSL) is being created, that will allow other developers to quickly ramp up to using a set of builder classes to create complex integration tests.</p>
<p>One last thing about this examples DSL methods you may have noticed, the return type is this. Returning the current builder instance creates a fluent interface for the DSL. Making possible method calls like this:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">var personBuilder <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> PersonBuilder<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
personBuilder
    <span style="color: #008000;">.</span><span style="color: #0000FF;">WithStartDate</span><span style="color: #008000;">&#40;</span>DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span><span style="color: #008000;">.</span><span style="color: #0000FF;">AddDays</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">.</span><span style="color: #0000FF;">WithOrganization</span><span style="color: #008000;">&#40;</span>organization<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">.</span><span style="color: #0000FF;">Save</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span></pre></div></div>

<p>The full source for the PersonBuilder class is <a href="http://s3.amazonaws.com/falconerdevelopment/wp-content/uploads/downloads/2011/04/PersonBuilder.cs" target="_blank">available here</a>.</p>
<h2>Conclusion</h2>
<p>Using the Builder Design Pattern has numerous advantages, and its my perfered method of creating an easy to use framework when testings Data Access Components. How do you test your Data Access Layer?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.falconerdevelopment.com/2011/04/18/builder-pattern-create-data-access-layer-integration-tests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Benchmark Method Execution Time in C#</title>
		<link>http://www.falconerdevelopment.com/2011/04/11/benchmark-method-execution-time/</link>
		<comments>http://www.falconerdevelopment.com/2011/04/11/benchmark-method-execution-time/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 10:38:00 +0000</pubDate>
		<dc:creator>Karl Falconer</dc:creator>
				<category><![CDATA[Tips and Tricks]]></category>

		<guid isPermaLink="false">http://www.falconerdevelopment.com/?p=650</guid>
		<description><![CDATA[Photo by pixolga I often find myself debating the performance implications of various algorithms and alternate implementations. The only way to know for sure is to test the theory. Here is a quick and dirty way to benchmark the execution time of any method. public static TimeSpan Time&#40;Action action&#41; &#123; Stopwatch stopwatch = Stopwatch.StartNew&#40;&#41;; action&#40;&#41;; stopwatch.Stop&#40;&#41;; return [...]]]></description>
				<content:encoded><![CDATA[<p><img class="image-box" title="Felis catus" src="http://farm6.static.flickr.com/5262/5581474477_1b0c867ba0.jpg" alt="Felis catus" width="500" height="387"><span class="attrib">Photo by <a href="http://www.flickr.com/photos/pix-olga/" target="_blank">pixolga</a></span></p>
<p>I often find myself debating the performance implications of various algorithms and alternate implementations. The only way to know for sure is to test the theory. Here is a quick and dirty way to benchmark the execution time of any method.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> TimeSpan Time<span style="color: #008000;">&#40;</span>Action action<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Stopwatch stopwatch <span style="color: #008000;">=</span> Stopwatch<span style="color: #008000;">.</span><span style="color: #0000FF;">StartNew</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    action<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    stopwatch<span style="color: #008000;">.</span><span style="color: #0000FF;">Stop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">return</span> stopwatch<span style="color: #008000;">.</span><span style="color: #0000FF;">Elapsed</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>An example usage:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">TimeSpan time <span style="color: #008000;">=</span> Time<span style="color: #008000;">&#40;</span>TestedMethod<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Format</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;TestMethod executed in [{0}] ms&quot;</span>,
                                                  time<span style="color: #008000;">.</span><span style="color: #0000FF;">TotalMilliseconds</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.falconerdevelopment.com/2011/04/11/benchmark-method-execution-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VurtleOne Now Compatible with VisualSVN</title>
		<link>http://www.falconerdevelopment.com/2011/04/09/vurtleone-compatible-visualsvn/</link>
		<comments>http://www.falconerdevelopment.com/2011/04/09/vurtleone-compatible-visualsvn/#comments</comments>
		<pubDate>Sat, 09 Apr 2011 21:02:41 +0000</pubDate>
		<dc:creator>Karl Falconer</dc:creator>
				<category><![CDATA[Falconer Development]]></category>

		<guid isPermaLink="false">http://www.falconerdevelopment.com/?p=659</guid>
		<description><![CDATA[VurtleOne Update VurtleOne is now compatible with VisualSVN&#8216;s Visual Studio Subversion plug-in! Now you can enjoy the same VurtleOne integration within Visual Studio. See our VurtleOne product page for more information on the features of VurtleOne. See our downloads page for the latest version of VurtleOne.]]></description>
				<content:encoded><![CDATA[<h2>VurtleOne Update</h2>
<p>VurtleOne is now compatible with <a title="VisualSVN" href="http://www.visualsvn.com/" target="_blank">VisualSVN</a>&#8216;s Visual Studio Subversion plug-in! Now you can enjoy the same VurtleOne integration within Visual Studio. See our VurtleOne product page for more information on the <a title="VurtleOne: VersionOne and TortoiseSVN Integration" href="http://www.falconerdevelopment.com/projects/vurtleone/">features of VurtleOne</a>.</p>
<p>See our <a title="Downloads" href="http://www.falconerdevelopment.com/downloads/">downloads page</a> for the latest version of VurtleOne.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.falconerdevelopment.com/2011/04/09/vurtleone-compatible-visualsvn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Commit Messages: What are they good for?</title>
		<link>http://www.falconerdevelopment.com/2011/04/04/commit-messages-good-for/</link>
		<comments>http://www.falconerdevelopment.com/2011/04/04/commit-messages-good-for/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 00:21:32 +0000</pubDate>
		<dc:creator>Karl Falconer</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.falconerdevelopment.com/?p=655</guid>
		<description><![CDATA[Photo by lowjumpingfrog Writing a commit messages is like telling a joke without a punchline. While writing these messages may be tedious at times, I’ve found their presence invaluable over the years. Having worked with source control management system, you may be intimately familiar with the commit dialog. That annoying dialog that has an endless [...]]]></description>
				<content:encoded><![CDATA[<p><img class="image-box" title="Shadow of a Writing Hand" src="http://s3.amazonaws.com/falconerdevelopment/wp-content/uploads/2011/04/2229437427_40e2a1bb32.jpg" alt="" width="500" height="375" /><span class="attrib">Photo by <a href="http://www.flickr.com/photos/jenorton/2229437427/">lowjumpingfrog</a></span></p>
<p>Writing a commit messages is like telling a joke without a punchline. While writing these messages may be tedious at times, I’ve found their presence invaluable over the years.</p>
<p>Having worked with source control management system, you may be intimately familiar with the commit dialog. That annoying dialog that has an endless craving for prose. Usually a commit message is encourage, but not required. However, I&#8217;ve seen some team environments where a minimum character length was enforced by the source control management system!</p>
<p>As developers, the decisions to enforce such policies are usually out of our control, but honestly, this is one policy I can support. At first glance, it would seem like writing detailed commit messages is just another one those administrative tasks with no tangible benefits.</p>
<p>I&#8217;ve found the that detailed commit messages have saved me countless hours over the years when the need to hunt down changes in the version control history. Common source control client tools like TortoiseSVN, Git, Perforce, and TFS include features to browse changeset history, which will contain the comments written by another developer.</p>
<p>Browsing version control history (with detailed changset descriptions) it becomes very easy to understand the holistic reasoning behind code changes in a way that in-line commenting can not provide. Often times when a bug is reported, being able to isolate an issue to a changeset, a set of modified files, will dramatically reduce the time it takes to find, test and implement a fix.</p>
<p>As a project grows and becomes more complex, as does the time it takes for new developers to learn their way through the labyrinth of the code-base. Having the ability for new developers to learn by example based on changeset revisions is a boon for all involved.</p>
<p>When it comes times to release your software, you generally want to communicate to your customers what features and fixes are in the latest version. Having details commit messages, is a great starting place for creating release notes for the marketing department.</p>
<p>Depending on your development environment, there are many tools that exist to help automate the task of creating commit messages based on an item of work that may exist in an external project management application. A few of these tools which integrate with TortoiseSVN can be found on their <a title="TortoiseSVN Issue Tracker Plugins" href="http://tortoisesvn.net/issuetrackerplugins.html" target="_blank">issue tracker integrations</a> page.</p>
<p><em>Full disclosure: Falconer Development makes an issue tracker plugin for <a title="TortoiseSVN" href="http://tortoisesvn.net/" target="_blank">TortoiseSVN</a> and <a title="VersionOne" href="http://www.versionone.com" target="_blank">VersionOne</a> called <a title="VurtleOne" href="http://www.falconerdevelopment.com/projects/vurtleone/" target="_blank">VurtleOne</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.falconerdevelopment.com/2011/04/04/commit-messages-good-for/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3 Tips for Unit Testing Best Practices</title>
		<link>http://www.falconerdevelopment.com/2011/03/24/3-tips-unit-testing-practices/</link>
		<comments>http://www.falconerdevelopment.com/2011/03/24/3-tips-unit-testing-practices/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 10:46:25 +0000</pubDate>
		<dc:creator>Karl Falconer</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.falconerdevelopment.com/?p=648</guid>
		<description><![CDATA[Unit testing has been widely accepted within the software development community as one of the best ways to verify the effectiveness of an application. Many of today&#8217;s agile methodologies rely on some form of automated testing as its cornerstone to providing quality software. Creating unit-tests is a development task that should be implemented with flexibility [...]]]></description>
				<content:encoded><![CDATA[<p>Unit testing has been widely accepted within the software development community as one of the best ways to verify the effectiveness of an application. Many of today&#8217;s agile methodologies rely on some form of <a title="Automated Software Testing Techniques" href="http://www.falconerdevelopment.com/2011/03/10/automated-software-testing-techniques/" target="_blank">automated testing</a> as its cornerstone to providing quality software.</p>
<p>Creating unit-tests is a development task that should be implemented with flexibility and maintainability in mind. This means designing your <a title="Qualities of a Good Unit Test" href="http://codebetter.com/jeremymiller/2005/07/20/qualities-of-a-good-unit-test/" target="_blank">unit-tests to be atomic, isolated, and fast</a>. Here are a few tips to be aware of when writing unit-tests.</p>
<h2>Mock Dependencies</h2>
<p>At some point a class or method under test will require some functionality defined outside of its scope. In typical web application, this could an architectural boundary like the database layer, or service layer.</p>
<p>In these scenarios, the focus should be to isolate the code being tested from its dependency. A way to accomplish this is to use a mock, or fake implementation of the dependency. This allows the unit-test to run in memory and the mocked implementation can also be manipulated to force edge cases to be tested.</p>
<p>When implementing a unit-test with a mocked dependency it is best to use one of the many available mocking frameworks. Most offer an intuitive API and and a robust feature set, and are freely available.</p>
<h2>Thoroughly Test Your Code</h2>
<p>The goal of for any suite of unit-tests is to have 100% code coverage. In reality, this can be a challenge for many different reasons. However, with mocked dependencies, only the most extreme cases would prevent you from hitting the coveted 100% mark for a given unit of code.</p>
<p>However, there can be situations where the time it takes to properly write a test for a section of code far out weights its functional value, and time to manually test. In these scenarios I find it acceptable to make a note, and skip the test.</p>
<p>In practice, some may be tempted to take the idea complete code coverage to the extreme and change the visibility of functions for the sake of testing. DO NOT DO THIS! Non-public methods should not be directly invoked by a unit-test. This violates <a title="Encapsulation" href="http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29" target="_blank">encapsulation principles</a> of object-oriented programming.</p>
<p>Instead, in-directly test the private method by invoking a public method which then makes use of the private method.</p>
<h2>Manage Risk</h2>
<p>When working on <a title="Greenfield Project" href="http://en.wikipedia.org/wiki/Greenfield_project" target="_blank">greenfield development</a> projects, its best to have unit-test created along side your application code. Many agile methodologies, like <a title="Test Driven Development" href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">TDD</a>, <a title="Extreme Programming" href="http://en.wikipedia.org/wiki/Extreme_Programming" target="_blank">XP</a>, and <a title="Scrum Development" href="http://en.wikipedia.org/wiki/Scrum_(development)" target="_blank">SCRUM</a> take this approach. But not all developers are fortunate enough to work new projects, many time the code base has existed for years.</p>
<p>Coming into an existing code base, it is best to implement unit-test in small increments. When bugs are reported in the code base, write a test that reproduces the problem before implementing the fix. This way, if the bug comes back, it will be caught by the test.</p>
<p>No matter the methodology being used, developing a suite of unit-test is key to a projects long-term success. Today’s customers are becoming less tolerant of bugs, and with the availability of mature testing tools, there really is no excuse for not being able to produce high quality software. As software developers, it is our responsibility to write code that works, unit-testing is a means to that end.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.falconerdevelopment.com/2011/03/24/3-tips-unit-testing-practices/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Debugging WPF and Silverlight Binding Errors In Visual Studio</title>
		<link>http://www.falconerdevelopment.com/2011/03/17/debugging-wpf-silverlight-binding-errors-visual-studio/</link>
		<comments>http://www.falconerdevelopment.com/2011/03/17/debugging-wpf-silverlight-binding-errors-visual-studio/#comments</comments>
		<pubDate>Thu, 17 Mar 2011 11:25:41 +0000</pubDate>
		<dc:creator>Karl Falconer</dc:creator>
				<category><![CDATA[Tips and Tricks]]></category>

		<guid isPermaLink="false">http://www.falconerdevelopment.com/?p=651</guid>
		<description><![CDATA[Recently I was working with a Microsoft Silverlight project, debugging a XAML binding error. After a few hours of searching, I found a blog describing how to alter the WPF Trace Settings to enable a more verbose output while debugging. After changing the trace level, you will see a more detailed output in the Debugger [...]]]></description>
				<content:encoded><![CDATA[<p>Recently I was working with a Microsoft Silverlight project, debugging a XAML binding error. After a few hours of searching, I found a blog describing how to alter the WPF Trace Settings to enable a more verbose output while debugging.</p>
<p>After changing the trace level, you will see a more detailed output in the Debugger Output Window. Above is is a screenshot of the how to enable the proper settings.</p>
<p><span style="font-size: 10px; font-weight: bold;">Source Article: <a title="Permanent Link: Visual Studio 2010 WPF Trace Settings Default Is Incorrect" href="http://karlshifflett.wordpress.com/2010/06/24/visual-studio-2010-wpf-trace-settings-default-is-incorrect/" target="_blank">Visual Studio 2010 WPF Trace Settings Default Is Incorrect</a></span></p>
<p>Find more useful Visual Studio help in the <a title="Tips and Tricks" href="http://www.falconerdevelopment.com/category/tips-and-tricks/">Tips and Tricks</a> section.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.falconerdevelopment.com/2011/03/17/debugging-wpf-silverlight-binding-errors-visual-studio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Object Caching 1886/1890 objects using disk: basic
Content Delivery Network via Amazon Web Services: S3: s3.amazonaws.com/falconerdevelopment

Served from: www.falconerdevelopment.com @ 2013-07-15 09:19:57 -->