<?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>The Farr Side</title>
	<atom:link href="http://ericfarr.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://ericfarr.net</link>
	<description>Eric Farr - Agile Software Developer, Architect, and Leader in .NET and in Mobile.</description>
	<lastBuildDate>Fri, 04 May 2012 15:45:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Help Turn the &#8220;Jersey Shore&#8221; into &#8220;Silicone Shore&#8221;</title>
		<link>http://ericfarr.net/help-turn-the-jersey-shore-into-silicone-shore/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=help-turn-the-jersey-shore-into-silicone-shore</link>
		<comments>http://ericfarr.net/help-turn-the-jersey-shore-into-silicone-shore/#comments</comments>
		<pubDate>Fri, 04 May 2012 15:45:58 +0000</pubDate>
		<dc:creator>efarr</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[Hiring]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[NServiceBus]]></category>
		<category><![CDATA[RavenDB]]></category>
		<category><![CDATA[Sencha Touch]]></category>
		<category><![CDATA[SignalR]]></category>

		<guid isPermaLink="false">http://ericfarr.net/?p=331</guid>
		<description><![CDATA[Want to work with the latest technology on a self-directed team? Think you need to be in Silicone Valley to be part of a company setting the standard in cloud and mobile computing? Read on. Marathon Data Systems, on the &#8230; <a href="http://ericfarr.net/help-turn-the-jersey-shore-into-silicone-shore/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://ericfarr.net/wp-content/uploads/2012/05/SiliconeShore.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 23px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SiliconeShore" border="0" alt="SiliconeShore" align="left" src="http://ericfarr.net/wp-content/uploads/2012/05/SiliconeShore_thumb.png" width="244" height="204"></a>Want to work with the latest technology on a self-directed team? Think you need to be in Silicone Valley to be part of a company setting the standard in cloud and mobile computing? Read on.</p>
<p><a href="http://www.marathondata.com/">Marathon Data Systems</a>, on the beautiful <a href="http://www.visitthejerseyshore.com/">Jersey Shore</a>, through our various vertical-focused brands, serves the people who provide the services that we all count on: HVAC, plumbing, lawn care, pest control, maid services, carpet cleaning, and more. We are in the process of building a mobility solution that will set the industry standard for field service worker and salesperson productivity.</p>
<h2>Cross-Platform Mobile</h2>
<p>Our new cross-platform mobile client is HTML5-powered and will initially run on iOS and Android devices. The technician or salesperson is continually operating on the latest information (no more periodic synchronization) and yet can be fully functional while out of network coverage. </p>
<p><a href="http://ericfarr.net/wp-content/uploads/2012/05/SenchaPlusCoffee.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SenchaPlusCoffee" border="0" alt="SenchaPlusCoffee" src="http://ericfarr.net/wp-content/uploads/2012/05/SenchaPlusCoffee_thumb.png" width="614" height="90"></a></p>
<p>The new mobile client is built in <a href="http://coffeescript.org/">CoffeeScript</a> on the <a href="http://www.sencha.com/products/touch/">Sencha Touch 2</a> platform. The combination of Sencha Touch and CoffeeScript making building off-line capable, singe-page applications actually pretty fun. Sencha takes care of the tedium of rendering just the right HTML to the screen for each device, while we focus&nbsp; on building great user experiences. </p>
<p>Since <a href="http://en.wikipedia.org/wiki/WebSocket">WebSockets</a> are not yet a reality (and pull-based applications are lame), we’re using <a href="http://signalr.net/">SignalR</a> to simulate server push from ASP.NET MVC (think Node.js scalability in ASP.NET MVC).</p>
<h2>Message-Driven CQRS Back-End</h2>
<p><a href="http://ericfarr.net/wp-content/uploads/2012/05/DomainDrivenDesign.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="DomainDrivenDesign" border="0" alt="DomainDrivenDesign" align="right" src="http://ericfarr.net/wp-content/uploads/2012/05/DomainDrivenDesign_thumb.jpg" width="186" height="244"></a>On the back-end we are are building out a scalable, event-driven <a href="http://www.udidahan.com/2009/12/09/clarified-cqrs/">CQRS</a> system built around <a href="http://nservicebus.com/">NServiceBus</a>, following the principles of <a href="http://domaindrivendesign.org/">Domain-Driven Design</a> (DDD).</p>
<p>In Domain-Driven Design, we recognize that the heart of the software is the domain-specific behavior that allows its users to solve their problems. We establish a vocabulary that spans across technical and nontechnical people. We iteratively tweak and adjust our domain model to better map to the problem space. We focus on building an effective model of our domain, while minimizing entanglement with infrastructure concerns. </p>
<p><a href="http://nservicebus.com/"><img style="background-image: none; border-right-width: 0px; margin: 0px 17px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="nServiceBus_Logo" border="0" alt="nServiceBus_Logo" align="left" src="http://ericfarr.net/wp-content/uploads/2012/05/nServiceBus_Logo.png" width="424" height="102"></a>NServiceBus (NSB) allows us to focus on the semantic meaning of our commands and events and what the system’s behavior should be. NSB handles interaction with queues, message routing, retries, and other plumbing-level concerns.</p>
<p><a href="http://ericfarr.net/wp-content/uploads/2012/05/ravendb.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px; padding-top: 0px" title="ravendb" border="0" alt="ravendb" align="right" src="http://ericfarr.net/wp-content/uploads/2012/05/ravendb_thumb.jpg" width="275" height="110"></a></p>
<p>Data persistence is achieved through the joy that is <a href="http://ravendb.net/">RavenDB</a>. If you think ORMs like <a href="http://nhforge.org/">NHibernate</a> are good, just wait until you have built a C# application with RavenDB. </p>
<p>RavenDB is a high-performance, second generation document database, native to C#. Queries are made through LINQ. Joins and transforms are handled through map/reduce functions also written in LINQ. The impedance mismatch between object-oriented code and a relational database is not merely bridged, but is eliminated.</p>
<h2>Agile Team</h2>
<p>Agile can mean almost anything you want it to mean, but at Marathon, it means…</p>
<p><a href="http://ericfarr.net/wp-content/uploads/2012/05/Agile-at-Marathon.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Agile at Marathon" border="0" alt="Agile at Marathon" src="http://ericfarr.net/wp-content/uploads/2012/05/Agile-at-Marathon_thumb.png" width="644" height="358"></a></p>
<p>A belief in the core values of the <a href="http://agilemanifesto.org/">agile manifesto</a>: </p>
<blockquote><p>Individuals and interactions over processes and tools<br />Working software over comprehensive documentation<br />Customer collaboration over contract negotiation<br />Responding to change over following a plan</p>
</blockquote>
<p>The <a href="http://www.mountaingoatsoftware.com/topics/scrum">Scrum process</a>, where a self-organizing team works together to plan and deliver iteratively and incrementally. </p>
<p>The <a href="http://www.extremeprogramming.org/">Extreme Programming</a> (XP) practices of test-driven development, pair-programming, continuous integration, collective code ownership.</p>
<p>A commitment to <a href="http://en.wikipedia.org/wiki/Software_craftsmanship">software craftsmanship</a>. Being a professional means a commitment to quality work and continual improvement. Great software comes less from particular technologies that come and go, but from fundamentals like the <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">SOLID principles</a> and object-oriented design principles and patterns that stand the test of time. </p>
<h2>This job may be for you if…</h2>
<ul>
<li>You are good, but you expect to keep getting better. </li>
<li>You can do it yourself, but you’d much rather work together with a team of dedicated developers. </li>
<li>You love cool technologies, but you care about user loving and using your software more.</li>
<li>You love coding in C#.</li>
<li>If you are not currently test-driven, you want to learn to be.</li>
<li>If you are not currently pair-programming, you are willing to give it a try.</li>
</ul>
<p>If that sounds like you, please send your resume to <a href="mailto:jobs@marathondata.com">jobs@marathondata.com</a>. Come join us as we create great software to serve the people who serve the world!</p>
]]></content:encoded>
			<wfw:commentRss>http://ericfarr.net/help-turn-the-jersey-shore-into-silicone-shore/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript and the Seven Stages of Grief</title>
		<link>http://ericfarr.net/javascript-and-the-seven-stages-of-grief/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=javascript-and-the-seven-stages-of-grief</link>
		<comments>http://ericfarr.net/javascript-and-the-seven-stages-of-grief/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 00:27:34 +0000</pubDate>
		<dc:creator>efarr</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[CoffeScript]]></category>
		<category><![CDATA[grief]]></category>
		<category><![CDATA[Jasmine]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://ericfarr.net/javascript-and-the-seven-stages-of-grief/</guid>
		<description><![CDATA[Shock and Denial: “Surely JavaScript is just for designers and for making annoying, gratuitous animations on Web pages.” Pain and Guilt: “No classes. No namespaces. I didn’t know where else to put the code except in the script tag on &#8230; <a href="http://ericfarr.net/javascript-and-the-seven-stages-of-grief/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<ol>
<li><font size="4"><strong>Shock and Denial:</strong> “Surely JavaScript is just for designers and for making annoying, gratuitous animations on Web pages.”</font>
<li><font size="4"><strong>Pain and Guilt:</strong> “No classes. No namespaces. I didn’t know where else to put the code except in the script tag on the page!”</font>
<li><font size="4"><strong>Anger:</strong> “You expect me to write JavaScript!?! I’m a <em>real</em> programmer!”</font>
<li><font size="4"><strong>Bargaining:</strong> “Don’t we have an intern that can do this?”</font>
<li><font size="4"><strong>Depression and Sorrow:</strong> “I realize JavaScript is dynamic and functional, but every time I have to write or read it, I begin to consider changing careers.”</font> <font size="4"><strong></strong></font>
<li><font size="4"><strong>Testing and Reconstruction:</strong> “At least with Jasmine, I can write tests, but look how ugly it is. There has got to be a better way.”</font>
<li><font size="4"><strong>Acceptance:</strong> “CoffesScript!”</font></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://ericfarr.net/javascript-and-the-seven-stages-of-grief/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Review of Advanced Distributed Systems Design using SOA &amp; DDD on Video</title>
		<link>http://ericfarr.net/review-of-advanced-distributed-systems-design-using-soa-ddd-on-video/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=review-of-advanced-distributed-systems-design-using-soa-ddd-on-video</link>
		<comments>http://ericfarr.net/review-of-advanced-distributed-systems-design-using-soa-ddd-on-video/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 02:17:32 +0000</pubDate>
		<dc:creator>efarr</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[CAP Theorem]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[NServiceBus]]></category>
		<category><![CDATA[SOA]]></category>

		<guid isPermaLink="false">http://ericfarr.net/review-of-advanced-distributed-systems-design-using-soa-ddd-on-video/</guid>
		<description><![CDATA[As my team was getting ready to embark on a significant new project built around asynchronous messaging and NServiceBus, I would have really liked to send the entire team to Udi Dahan&#8216;s  five-day Advanced Distributed Systems Design using SOA &#38; &#8230; <a href="http://ericfarr.net/review-of-advanced-distributed-systems-design-using-soa-ddd-on-video/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>As my team was getting ready to embark on a significant new project built around asynchronous messaging and NServiceBus, I would have really liked to send the entire team to <a href="http://www.udidahan.com">Udi Dahan</a>&#8216;s  five-day <a href="http://www.udidahan.com/training/#Advanced_Distributed_System_Design">Advanced Distributed Systems Design using SOA &amp; DDD</a> course. Distributed, service-oriented systems have many advantages over traditional centralized solutions. However, the change in thinking that the development team must go through is daunting. However, sending the entire team offer a week would&#8217;ve been a challenge. As an alternative, I purchased the course videos and we work through them together over the course of three weeks. This is my review of that course (on video).</p>
<h2>Why should you even care?</h2>
<p>Before getting into the review, why would you want to build a distributed, service-oriented system? In a word, <em>scale</em>.</p>
<p><strong>Scaling the software:</strong> Asynchronous messaging and eventual consistency allows the system to scale out to redundant, cheap hardware. Brewer’s <a href="http://en.wikipedia.org/wiki/CAP_theorem">CAP theorem</a> shows, centralized systems that rely on two-phase commits for all updates sacrifice reliability/availability in favor of an immediate consistency that isn’t always necessary.</p>
<p><strong>Scaling the development team:</strong> A well-factored service-oriented system avoids the problem of a single monolithic system that becomes increasingly difficult to enhance and maintain and requires scale up of a single development team and resists scale out to multiple teams.</p>
<h2>Review</h2>
<p><a href="http://ericfarr.net/wp-content/uploads/2012/04/Advanced_Distributed_Systems_Design_-_Day_1_Session_1.png"><img style="background-image: none; margin: 0px 9px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border-width: 0px;" title="Advanced_Distributed_Systems_Design_-_Day_1_Session_1" src="http://ericfarr.net/wp-content/uploads/2012/04/Advanced_Distributed_Systems_Design_-_Day_1_Session_1_thumb.png" alt="Advanced_Distributed_Systems_Design_-_Day_1_Session_1" width="640" height="304" align="left" border="0" /></a>The production quality leaves a lot to be desired. There is an annoying amount of background noise through all of the videos. The video is shot with a single camera that pans inconsistently between Udi, the whiteboard, and the projector screen. Honestly, you have to really want the content to make it through all 40 hours. However, you will be well rewarded.</p>
<p>The best way to describe the course is to think of it as a five day walk through all of the factors that led Udi to develop NServiceBus. I’ve followed Udi since way before NServiceBus. I listened to the <a href="http://feeds2.feedburner.com/ask-udi">Ask Udi</a> podcast and attempted to grasp the essence of SOA. No matter how hard I tried, I was never able to implement the <a href="http://msdn.microsoft.com/en-us/library/ms954638.aspx#soade_topic2">tenants of SOA</a> with the traditional Microsoft tools and WCF. It wasn’t until I built a system with NServiceBus that I started to make the mental transition. Every time something I was trying to do was difficult and I was feeling that NServiceBus was overly constraining, I eventually realized <em>it’s not you, it’s me</em>. When you are doing it right, NServiceBus feels natural. When you violate good design for distributed, service-oriented systems, NServiceBus nudges you back by becoming difficult, causing you to go looking for a work-around, and eventually finding a post by Udi that gently explains why what you are trying to do would eventually bite you in the rear end and what you should be doing instead. This course lays the groundwork that will help you avoid the wrong turns and false starts you are bound to make otherwise if you are moving from the familiar world of centralized, monolithic systems.</p>
<p>He spends a significant portion of the course methodically and deliberately dislodging ideas that most of us have held for so long that we no longer question. He also works to temper and ground some of the techniques that have caught on with a small but vocal minority of.net developers, such as CQRS and event sourcing.</p>
<p>I recommend this course if any of these apply to you:</p>
<ul>
<li>I don’t know how to model autonomous services. Everything is related to everything else. My domain is too hard to tease apart into independent components. (<em>Hint: this is hard at first, but Udi will take you through enough examples to get you headed in the right direction. Oh… and your domain is not too hard to do this.</em>)</li>
<li>I love <a href="http://domaindrivendesign.org/resources/what_is_ddd">Domain-Driven Design</a>, but I don’t know how to model the domain and application layers. I recognize that I have fallen into the <a href="http://martinfowler.com/bliki/AnemicDomainModel.html">anemic domain model</a> and all of my logic is in procedural application layer functions. (<em>Hint: There is a place for simple CRUD and the rest cannot be modeled without sagas.</em>)</li>
<li>I like the idea of CQRS, but I don’t know how to approach it, or I tried and it didn’t work out as well as I expected. (Hint: Event sourcing is not the silver bullet of CQRS.)</li>
<li>I am using NServiceBus, but I don’t understand <a href="http://www.nservicebus.com/sagas.aspx">sagas</a>; so, I’m not using them. (<em>Hint: you’re doing it wrong.</em>)</li>
</ul>
<p>All of these were true for me at some level. Getting these issues addressed made the course extremely valuable to me.</p>
<h2>Conclusion</h2>
<p>The entire team feels the course was a great investment and is entering this new project with anticipation and confidence that we will avoid many mistakes that we would have otherwise made if we had not taken the virtual course. I believe we will save the money we spent on the course and the time away from coding many times over on this project and beyond. If you are building a moderately complex collaborative system, you owe it to yourself to check out this course. If you can attend a live offering, I recommend that. But if you cannot, then the videos are well worth the investment as the next best thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericfarr.net/review-of-advanced-distributed-systems-design-using-soa-ddd-on-video/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lightweight Context/Specification BDD in C#</title>
		<link>http://ericfarr.net/lightweight-contextspecification-bdd-in-c/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lightweight-contextspecification-bdd-in-c</link>
		<comments>http://ericfarr.net/lightweight-contextspecification-bdd-in-c/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 03:55:05 +0000</pubDate>
		<dc:creator>efarr</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://ericfarr.net/lightweight-contextspecification-bdd-in-c/</guid>
		<description><![CDATA[Behavior-Driven Development (BDD) provides all of the engineering benefits of traditional Test-Driven Development (TDD) while additionally resulting in a specification that non-developers can read and validate. At its heart, BDD transforms the tests of TDD into specifications. Those specifications are &#8230; <a href="http://ericfarr.net/lightweight-contextspecification-bdd-in-c/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">Behavior-Driven Development</a> (BDD) provides all of the engineering benefits of traditional <a href="http://en.wikipedia.org/wiki/Test-driven_development">Test-Driven Development</a> (TDD) while additionally resulting in a specification that non-developers can read and validate. At its heart, BDD transforms the <em>tests</em> of TDD into <em>specifications</em>. Those specifications are expressed in English sentences that are expressed in business value as opposed to coding or engineering terms.</p>
<p>The most popular structure for BDD today is called the Gherkin format and follows a Given/When/Then format, like…</p>
<blockquote><p>Given a new bowling game<br />When all frames are strikes<br />Then the score should be 300</p>
</blockquote>
<p>There are frameworks like <a href="http://specflow.org/">SpecFlow</a> to help you arrange your specifications (test) into this format. However, I find this format awkward and forced. I prefer the simpler format known as Context/Specification (aka When/Should)…</p>
<blockquote><p>When all frames are strikes<br />Should have a score of 300</p>
</blockquote>
<p>There are frameworks, like <a href="https://github.com/machine/machine.specifications">MSpec</a>, that attempt to make the specifications read more like English sentences. However, I find that these frameworks get in the way as much as they help. It is also nice to be able to write readable tests with just PONU (plain old NUnit). Over time, I’ve developed a convention that I find easy to write and easy to read. I’ve also developed a tool&nbsp; that turns the tests into a markdown file that can be turned into a pretty HTML report.</p>
<p>To show the approach at work, I present some snippets from a hypothetical order pricing system I created as a “developer test” provided by a prospective employer last summer. Here is what I was given:</p>
<table border="2" cellspacing="0" cellpadding="2" width="600">
<tbody>
<tr>
<td valign="top" width="600">
<p><b>Instructions</b>: Build a system that will meet the following requirements. You may make assumptions if any requirements are ambiguous or vague but you must state the assumptions in your submission.
<p><b>Overview</b>: You will be building an order calculator that will provide tax and totals. The calculator will need to account for promotions, coupons, various tax rule, etc&#8230; You may assume that the database and data-access is already developed and may mock the data-access system. No UI elements will be built for this test.
<p><b>Main Business Entities</b>:
<ul>
<li>Order: A set of products purchased by a customer.
<li>Product: A specific item a customer may purchase.
<li>Coupon: A discount for a specific product valid for a specified date range.
<li>Promotion: A business wide discount on all products valid for a specified date range.</li>
</ul>
<p>*Not all entities are listed – you may need to create additional models to complete the system.
<p><b>Business Rules</b>:
<ul>
<li>Tax is calculated per state as one of the following:
<ul>
<li>A simple percentage of the order total.
<li>A flat amount per sale.</li>
</ul>
<li>Products categorized as ‘Luxury Items’ are taxed at twice the normal rate in the following states
<ul>
<li>FL
<li>NC
<li>CA</li>
</ul>
<li>Tax is normally calculated after applying coupons and promotional discounts. However, in the following states, the tax must be calculated prior to applying the discount:
<ul>
<li>FL
<li>NM
<li>NV</li>
</ul>
<li>In CA, military members do not pay tax.</li>
</ul>
<p><b>Requirements</b>:
<p>Adhering to the business rules stated previously:
<ul>
<li>The system shall calculate the total cost of an order.
<li>The system shall calculate the pre-tax cost of an order.
<li>The system shall calculate the tax amount of an order.</li>
</ul>
<p><b>Deliverables</b>:
<ul>
<li>A .NET solution (you may choose either C# or VB) containing the source code implementing the business rules.
<li>Unit tests (you may choose the unit testing framework).
<li>A list of assumptions made during the implementation and a relative assessment of risk associated with those assumptions.</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>You can see that there are quite a few specifications here. It’s a perfect scenario for a BDD approach. Lets take a look at the specification that most states charge taxes on the discounted price, while a few states require taxes to be calculated on the original price.</p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>Here is a specification that a standard tax state calculates taxes on the discounted price…</p>
<pre class="csharpcode"><span class="kwrd">namespace</span> Acme.Tests.ConcerningCoupons
{
    [TestFixture]
    <span class="kwrd">public</span> <span class="kwrd">class</span> When_coupon_is_applied_to_item_on_order_in_standard_tax_state
    {
        <span class="kwrd">private</span> Order _order;
        [TestFixtureSetUp] <span class="kwrd">public</span> <span class="kwrd">void</span> Context()
        {
            Product product = <span class="kwrd">new</span> Product(10);
            Coupon coupon = CreateCoupon.For(product).WithDiscountOf(.5m);
            _order = CreateOrder.Of(product).Apply(coupon).In(StateOf.NC);
        }

        [Test] <span class="kwrd">public</span> <span class="kwrd">void</span> Should_calculate_tax_on_discounted_price()
        {
            _order.Tax.ShouldEqual(.25m);
        }
    }
}</pre>
<p>You can see that the test fixture class name defines the context (the <em>when</em>) The test method name specifies the specification (the <em>should</em>). The Context method sets us the context in the class name. Also note the ConcerningCoupons in the namespace. This allows us to categorize the specification. </p>
<p>Here is the code that specifies the prediscount tax states…</p>
<pre class="csharpcode"><span class="kwrd">namespace</span> Acme.Tests.ConcerningCoupons
{
    [TestFixture]
    <span class="kwrd">public</span> <span class="kwrd">class</span> When_coupon_is_applied_to_item_on_order_in_prediscount_tax_state
    {
        <span class="kwrd">private</span> Order _order;
        [TestFixtureSetUp] <span class="kwrd">public</span> <span class="kwrd">void</span> Context()
        {
            Product product = <span class="kwrd">new</span> Product(10);
            Coupon coupon = CreateCoupon.For(product).WithDiscountOf(.5m);
            _order = CreateOrder.Of(product).Apply(coupon).In(StateOf.FL);
        }

        [Test] <span class="kwrd">public</span> <span class="kwrd">void</span> Should_calculate_tax_on_full_price()
        {
            _order.Tax.ShouldEqual(.50m);
        }
    }
}</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>Now take a look at a section of the report generated from the tests…</p>
<p><font color="#000000" face="Consolas"></font></p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p><a href="http://ericfarr.net/wp-content/uploads/2012/01/orders1.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="orders" border="0" alt="orders" src="http://ericfarr.net/wp-content/uploads/2012/01/orders_thumb.png" width="568" height="772"></a></p>
<p>Anyone can now compare the generated report to the original specification to verify we hit the mark. It’s a little more work to structure your tests this way, but the benefits are worth it.</p>
<p>The full source for the sample and the report generator are available <a href="https://github.com/efarr/Simple-CS-BDD">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericfarr.net/lightweight-contextspecification-bdd-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lunch with Uncle Bob</title>
		<link>http://ericfarr.net/lunch-with-uncle-bob/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lunch-with-uncle-bob</link>
		<comments>http://ericfarr.net/lunch-with-uncle-bob/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 20:43:54 +0000</pubDate>
		<dc:creator>efarr</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[solid]]></category>
		<category><![CDATA[teams]]></category>
		<category><![CDATA[Uncle Bob]]></category>

		<guid isPermaLink="false">http://ericfarr.net/lunch-with-uncle-bob/</guid>
		<description><![CDATA[Ever since I stumbled across the original C++ Report articles that have become known as the SOLID principles, I have been a disciple of Robert Martin (aka Uncle Bob). He is a leader within the agile and software craftsmanship movements. &#8230; <a href="http://ericfarr.net/lunch-with-uncle-bob/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Robert_Cecil_Martin"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="unclebob" border="0" alt="unclebob" align="right" src="http://ericfarr.net/wp-content/uploads/2012/01/unclebob.jpg" width="108" height="158"></a>
<p>Ever since I stumbled across the original <em>C++ Report</em> articles that have become known as the <a href="http://ericfarr.net/solid-what-is-old-is-new-again/">SOLID principles</a>, I have been a disciple of Robert Martin (aka Uncle Bob). He is a leader within the <a href="http://agilemanifesto.org/">agile</a> and <a href="http://manifesto.softwarecraftsmanship.org/">software craftsmanship</a> movements. He has as good a sense of what makes good software as anyone currently writing and teaching. If he thinks it’s worth writing, then it’s worth reading.</p>
<p>I’m not usually a fan of video for learning. I like the random access referenceability of books and I like the on-the-go accessibility of audio recordings. I find video to be the worst of both worlds: I cannot flip to the a particular page or go at my own pace, nor can I consume it while driving or mowing the lawn. Further, there are so many good conference videos available for free that I find it difficult to justify paying for video content.</p>
<p><a href="http://www.cleancoders.com/"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 17px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="clean_code" border="0" alt="clean_code" align="left" src="http://ericfarr.net/wp-content/uploads/2012/01/clean_code.png" width="208" height="208"></a>However, when Uncle Bob began releasing the <a href="http://www.cleancoders.com/">Clean Code video series</a>, I thought I’d at least check them out. I found them to be so good, that I’m now having my development team watch them together over lunch hours. Uncle Bob does a great job teaching (and preaching) the techniques that lead to clean, maintainable software. As we watch the sessions together, we are creating a common baseline of understanding that we can all refer to as we work together. </p>
<p>I highly recommend them for any software development team that is looking to get better (and if your team is not working to get better, it is on it’s way to <a href="http://ericfarr.net/why-software-will-always-be-hard-part-2/">obsolescence</a>).&nbsp; If you have trouble justifying the cost ($12 per viewer per video) to management, have them take a look at <a href="http://www.cleancoders.com/promotions/the_business_case">this excellent explanation</a> of the value of software craftsmanship and professionalism.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericfarr.net/lunch-with-uncle-bob/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Outstanding Summary of Domain Driven Design</title>
		<link>http://ericfarr.net/outstanding-summary-of-domain-driven-design/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=outstanding-summary-of-domain-driven-design</link>
		<comments>http://ericfarr.net/outstanding-summary-of-domain-driven-design/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 18:12:05 +0000</pubDate>
		<dc:creator>efarr</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[DDD]]></category>

		<guid isPermaLink="false">http://ericfarr.net/outstanding-summary-of-domain-driven-design/</guid>
		<description><![CDATA[I just came across the best magazine-article-length summary of DDD that I’ve ever seen. If you’ve heard of DDD, but not ready to commit to reading the whole Blue Book, check out Dan Haywood’s An Introduction to Domain Driven Design. &#8230; <a href="http://ericfarr.net/outstanding-summary-of-domain-driven-design/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I just came across the best magazine-article-length summary of DDD that I’ve ever seen. If you’ve heard of DDD, but not ready to commit to reading the whole <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">Blue Book</a>, check out Dan Haywood’s <a href="http://www.methodsandtools.com/archive/archive.php?id=97">An Introduction to Domain Driven Design</a>. It is clear, concise, and remarkably comprehensive for all of it’s brevity. It also makes for a great refresher.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericfarr.net/outstanding-summary-of-domain-driven-design/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Commoditization of Transactions</title>
		<link>http://ericfarr.net/the-commoditization-of-transactions/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-commoditization-of-transactions</link>
		<comments>http://ericfarr.net/the-commoditization-of-transactions/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 01:50:42 +0000</pubDate>
		<dc:creator>efarr</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://ericfarr.net/the-commoditization-of-transactions/</guid>
		<description><![CDATA[I’ve written in the past about how the relentless march of progress in software has made yesterday’s innovations today’s commodity. This article from HBR captures the essence of how the software landscape is in the process of making traditional, data-oriented, &#8230; <a href="http://ericfarr.net/the-commoditization-of-transactions/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dachisgroup.com/2011/06/moving-beyond-systems-of-record-to-systems-of-engagement/"><img src="http://www.dachisgroup.com/wp-content/uploads/2011/06/systems_of_record_systems_of_engagement.png"></a></p>
<p>I’ve <a href="http://ericfarr.net/why-software-will-always-be-hard-part-2/">written in the past</a> about how the relentless march of progress in software has made yesterday’s innovations today’s commodity.</p>
<p>This <a href="http://blogs.hbr.org/cs/2011/10/moving_from_transaction_to_eng.html">article from HBR</a> captures the essence of how the software landscape is in the process of making traditional, data-oriented, system-of-record, transactional systems into commodity systems. Companies that have made a living with these traditional systems are going to wake up very shortly and find that their <em>customers</em> have become someone else’s <em>community participants</em>.</p>
<p>The combination of ubiquitous mobile connection, cloud computing, and the general adoption of social media is in the process of changing the expectations of software users. Keeping their data safe is no longer enough. They now expect (or soon will) a more immersive experience.</p>
<p>This doesn’t mean a link to a Facebook fan page that is merely a shallow marketing ploy. Users expect that their hosted application will allow them to interact with all of the other uses of your software (see <a href="http://www.spiceworks.com/">Spiceworks</a> as the best example of this). They expect that the software they run their business on enlists them into the community of users of your software. Don’t have a “community” of users? Your competition soon will.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericfarr.net/the-commoditization-of-transactions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DDD Anti-Pattern #4: Allowing Implementation Decisions to Drive the Domain Model</title>
		<link>http://ericfarr.net/ddd-anti-pattern-4-allowing-implementation-decisions-to-drive-the-domain-model/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ddd-anti-pattern-4-allowing-implementation-decisions-to-drive-the-domain-model</link>
		<comments>http://ericfarr.net/ddd-anti-pattern-4-allowing-implementation-decisions-to-drive-the-domain-model/#comments</comments>
		<pubDate>Sat, 24 Sep 2011 12:19:24 +0000</pubDate>
		<dc:creator>efarr</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[OO]]></category>

		<guid isPermaLink="false">http://ericfarr.net/ddd-anti-pattern-4-allowing-implementation-decisions-to-drive-the-domain-model/</guid>
		<description><![CDATA[This is the last (for now) in my series of lessons learned building a complex product from the ground up following the principles of Domain Driven Design. The Field Service domain is all about getting people to Locations to perform &#8230; <a href="http://ericfarr.net/ddd-anti-pattern-4-allowing-implementation-decisions-to-drive-the-domain-model/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>This is the last (for now) in my series of lessons learned building a complex product from the ground up following the principles of Domain Driven Design.</p>
<p><a href="http://ericfarr.net/wp-content/uploads/2011/09/Appointment-to-WorkOrder.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 5px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Appointment to WorkOrder" border="0" alt="Appointment to WorkOrder" align="left" src="http://ericfarr.net/wp-content/uploads/2011/09/Appointment-to-WorkOrder_thumb.png" width="244" height="124"></a>
<p>The Field Service domain is all about getting people to Locations to perform Activities. The Activities and the Location are defined by a Work Order. The person performing the Activities (and possibly the time) are defined by an Appointment. You can think of the Work Order as the <em>what</em> and <em>where</em> and the Appointment as the <em>who</em> and <em>when</em>.</p>
<p><a href="http://ericfarr.net/wp-content/uploads/2011/09/Many-Appointments-to-WorkOrder.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Many Appointments to WorkOrder" border="0" alt="Many Appointments to WorkOrder" align="right" src="http://ericfarr.net/wp-content/uploads/2011/09/Many-Appointments-to-WorkOrder_thumb.png" width="244" height="139"></a>
<p>The model is simple as long as there is one Work Order and one Appointment. In fact, you’d be tempted to combine them into one entity. However, things get more complicated when you have one Work Order that requires multiple Appointments to complete it. It might be two technicians at one time or the same technician on two different visits or multiple technicians over multiple visits.</p>
<p><a href="http://ericfarr.net/wp-content/uploads/2011/09/Activities-to-Appointment-to-WorkOrder.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 5px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Activities to Appointment to WorkOrder" border="0" alt="Activities to Appointment to WorkOrder" align="left" src="http://ericfarr.net/wp-content/uploads/2011/09/Activities-to-Appointment-to-WorkOrder_thumb.png" width="244" height="236"></a></p>
<p>In these cases, we are splitting the Activities of the Work Order over multiple Appointments. Some of the Activities are associated with one Appointment and some with another.</p>
<p>The Work Order is complete when all Activities over all Appointments are complete. Not too complicated.</p>
<p>Now also imagine that a technician goes out on one Appointment but services more than Work Order.<a href="http://ericfarr.net/wp-content/uploads/2011/09/Activities-to-Appointment-to-WorkOrder-2.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Activities to Appointment to WorkOrder 2" border="0" alt="Activities to Appointment to WorkOrder 2" align="right" src="http://ericfarr.net/wp-content/uploads/2011/09/Activities-to-Appointment-to-WorkOrder-2_thumb.png" width="244" height="231"></a></p>
<p>In simplest terms, we have a many-to-many between Appointments and Work Orders. You can imagine the twisted case where a given Appointment services two different Work Orders, and each of those Work Orders has other Appointments serving them. </p>
<p>We’ve all implemented many-to-many relationships in databases and in object models. However, this situation is a little different because of the role of the Activity. The linkage between the Appointment and the Work Order is through their association with a common Activity.</p>
<p><a href="http://ericfarr.net/wp-content/uploads/2011/09/Appointment-to-WorkOrder-through-Activity.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 5px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Appointment to WorkOrder through Activity" border="0" alt="Appointment to WorkOrder through Activity" align="left" src="http://ericfarr.net/wp-content/uploads/2011/09/Appointment-to-WorkOrder-through-Activity_thumb.png" width="244" height="239"></a>A given Activity is associated with one Work Order and one Appointment. We can now traverse that relationship to discover the relationship between Appointment and Work Order.</p>
<p>We simply have Work Orders with collections of Activities and Appointments with collections of Activities. With that, the complex relationship between Appointment and Work Order is completely modeled, with no redundant connections (like something directly linking Appointments and Work Orders). I thought this was pretty cool. And it was.</p>
<p>But here is where the problem comes in… In the real world, Appointments really are associated with Work Orders—and not just by the happenstance of common Activities. (One could argue this actually is true because you would only schedule an Appointment to service a Work Order if there was some Activity to perform, but this is not how anyone thinks about the relationship.)</p>
<p>With our model, to answer the question “Where does this Appointment take place?” we have to go to one of the Activities in our collection, navigate to its Work Order, and look at its Location property. This not a big deal to do in code, and we can even put a property on the Appointment that hides this messiness and gives the illusion that an Appointment has a Location. But this is not the only difficulty.</p>
<p>Try looking in our database to see what Work Order a given Appointment is associated with. You have to go to the Activity table and find all the Activities associated with this Work Order, then look at the Work Order column of those Activities to find the ID(s) of the Work Order(s). One day I tried to create a view that shows an Appointment and its first Work Order (there was only ever one Work Oder per Appointment in practice). I gave up after 20 minutes.</p>
<p>Now imagine explaining this model to a programmer trying to integrate with our system. Its possible, but there is much more confusion than you’d like. </p>
<p>We had a technically tight and elegant implementation, but it ended up obscuring one of the most fundamental relationships in our domain. </p>
<h3>Remedy</h3>
<p>As much as we liked the normalization of our current implementation, the team decided that it would be better to model the relationship between Appointment and Work Order explicitly. If we had focused more on the domain and less on the cleverness of the implementation, we could have avoided this rework of the design.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericfarr.net/ddd-anti-pattern-4-allowing-implementation-decisions-to-drive-the-domain-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>11 Reasons You Want Mobility Experience Before Building a Mobile HTML5 Application</title>
		<link>http://ericfarr.net/11-reasons-you-want-mobility-experience-before-building-a-mobile-html5-application/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=11-reasons-you-want-mobility-experience-before-building-a-mobile-html5-application</link>
		<comments>http://ericfarr.net/11-reasons-you-want-mobility-experience-before-building-a-mobile-html5-application/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 11:25:00 +0000</pubDate>
		<dc:creator>efarr</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[cross-platform]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://ericfarr.net/11-reasons-you-want-mobility-experience-before-building-a-mobile-html5-application/</guid>
		<description><![CDATA[Two forces have converged: 1) Mobility has gone from an optional differentiator to an expected component of any software offering, and 2) HTML5 has been crowned as the solution that will solve the cross-platform problem that Java, Flash, and Silverlight &#8230; <a href="http://ericfarr.net/11-reasons-you-want-mobility-experience-before-building-a-mobile-html5-application/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://ericfarr.net/wp-content/uploads/2011/09/HTML5_Logo.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 3px 3px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="HTML5_Logo" border="0" alt="HTML5_Logo" align="right" src="http://ericfarr.net/wp-content/uploads/2011/09/HTML5_Logo_thumb.png" width="260" height="260"></a>
<p>Two forces have converged: 1) Mobility has gone from an optional differentiator to an expected component of any software offering, and 2) HTML5 has been crowned as the solution that will solve the cross-platform problem that Java, Flash, and Silverlight failed to solve before it.</p>
<p>This collision of forces has turned HTML5 into a buzzword with a life of its own. In fact, it appears to be on its way to becoming as detached from reality as the all-time-champion of promising technology turned meaningless buzzword: SOA.</p>
<p>Don’t get me wrong, I believe HTML5 is the best current answer to cross-platform mobile software. Before recommending to my executive management that we build our cross-platform offering in JavaScript, using the family of features loosely known as HTML5, I looked at pure native, cross-platform native with Mono, frameworks like Titanium.&nbsp; I made that recommendation before HTML5 became the cool thing to do, and I haven’t regretted it for a second.</p>
<p>A sure sign that a technology has reached fad level is when articles start to appear pointing out that said new technology will not, in fact, usher in world peace. Such an article was the popular <a href="http://images.infoworld.com/d/html5/11-hard-truths-about-html5-169665">11 hard truths about HTML5</a>.</p>
<p>The title was a little ominous and I began to read it with some trepidation, as we were still a couple of months away from being ready to ship our HTML5 client application. However, as I read, I was comforted by the fact that although all 11 truths were valid challenges, our team had faced and dealt with each of them. </p>
<p>The article lays out eleven challenges when building an HTML5 application:</p>
<ol>
<li>Security is a nightmare.
<li>Local data storage is limited
<li>Local data can be manipulated.
<li>Offline apps are a nightmare to sync.
<li>The cloud owes you nothing.
<li>Forced upgrades aren&#8217;t for everyone.
<li>Web Workers offer no prioritization.
<li>Format incompatibilities abound.
<li>Implementations are browser-dependent.
<li>Hardware idiosyncrasies bring new challenges.
<li>Politics as usual.</li>
</ol>
<p>It’s a scary list, and they are all true. My team was able to handle and mitigate each of these challenges largely because we had years of experience building native mobile applications and desktop Web applications and much of what we learned there applied in the HTML5 world.</p>
<p>If you don’t have solid answers for each of these challenges, you really ought to get someone on the team who has confidence in dealing with each of them.</p>
<p>You can check my current availability <a href="http://ericfarr.net/availability/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericfarr.net/11-reasons-you-want-mobility-experience-before-building-a-mobile-html5-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sprint Planning and Decision Fatigue</title>
		<link>http://ericfarr.net/sprint-planning-and-decision-fatigue/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sprint-planning-and-decision-fatigue</link>
		<comments>http://ericfarr.net/sprint-planning-and-decision-fatigue/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 14:01:49 +0000</pubDate>
		<dc:creator>efarr</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[decisions]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://ericfarr.net/sprint-planning-and-decision-fatigue/</guid>
		<description><![CDATA[This article explores the physiological and psychological effects of fatigue brought on by making decisions. The fatigue that comes from making decision after decision immediately reminded me of my team’s Scrum sprint planning days. The Scrum method breaks software development &#8230; <a href="http://ericfarr.net/sprint-planning-and-decision-fatigue/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.nytimes.com/2011/08/21/magazine/do-you-suffer-from-decision-fatigue.html" target="_blank"><img src="http://graphics8.nytimes.com/images/2011/08/21/magazine/21fatigue_span/21fatigue_span-articleLarge-v2.jpg"></a></p>
<p><a href="http://www.nytimes.com/2011/08/21/magazine/do-you-suffer-from-decision-fatigue.html" target="_blank">This article</a> explores the physiological and psychological effects of fatigue brought on by making decisions. The fatigue that comes from making decision after decision immediately reminded me of my team’s Scrum sprint planning days.</p>
<p>The Scrum method breaks software development into iterative cycles called sprints. Our sprints were the highly typical two weeks in length. The idea is that two weeks is a short enough planning horizon that we can pull in enough work from the backlog to fill that time period. Then we demo what we’ve done to the various stakeholders in the company, adjust existing backlog priorities, plan another sprint, and on it goes.</p>
<p>Sprint planning day looked something like this…</p>
<blockquote><p><strong>9:00 Demos</strong> (any stories that haven’t been shown yet)</p>
<p><strong>9:30 Close out the Previous Sprint</strong> (closing stories in VersionOne, splitting any unfinished stories, etc.)</p>
<p><strong>10:00 Retrospective</strong> (look back over the prior sprint and identify things that worked well that we want to do more of, what didn’t work so well, and identify any impediments to progress)</p>
<p><strong>10:45 Start Sprint Planning (Story Breakdown) </strong></p>
<p><strong>1:30 Finish Sprint Planning (Story Breakdown)</strong></p>
</blockquote>
<p>We often wouldn’t finish sprint planning until after 4:30.&nbsp; </p>
<h3>Story Breakdown</h3>
<p>Sprint planning is the process of taking the high-level stories and breaking them down into tasks. We did this as a team; so, we had everyone’s input and everyone knew how we were going to go about implementing each story. This is vital to maintaining a team approach to building the product. </p>
<p>This story breakdown, however, is the hardest part of the whole sprint. We have to make decision after decision about how we are going to implement a feature… </p>
<blockquote><p>Will there be a new database table? Will it be a variant of some existing feature or something new? Is there some new UI element that we haven’t tackled before? and so on.</p>
</blockquote>
<p> Then for every decision, we have one more decision: how long do we think it will take.</p>
<p>I believe the hardest part is that we move from one decision to the next without actually <em>doing</em> anything. We are simply adding our decisions to the inventory to be acted on over the next two week. This makes the decision fatigue factor even greater.</p>
<p>By the time we got to 3:00 or 3:30 the team would often be so fatigued that we would start placing two tasks on each story: <em>Plan it</em> and <em>Do it</em>. During the sprint, if we came across a story with a “Do it” task, it was a safe bet that it was planned late in the day.</p>
<h3>Remedy</h3>
<p>I can see two ways to reduce the decision fatigue that comes with Scrum planning day: 1) reduce the Sprint length, or 2) don’t do Scrum. </p>
<p>For most teams doing Scrum, I think shrinking the Sprint length to one week will reduce the planning day fatigue. Our team, for other reasons, <a href="http://ericfarr.net/shifting-from-scrum-to-kanban/">switched to a Kanban</a> continuous flow model. Under that model, we did the story breakdown as the queue of planned stories got low. It was never two weeks worth at one time, and we had fewer “Do it” tasks.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericfarr.net/sprint-planning-and-decision-fatigue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

