<?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>ext.IT</title>
	<atom:link href="http://www.ext-it.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ext-it.com</link>
	<description>Extend your IT capabilities and produce real results.</description>
	<lastBuildDate>Fri, 09 Dec 2011 22:25:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Installing DBFit for SQL Server</title>
		<link>http://www.ext-it.com/2011/blog/installing-dbfit-for-sql-server.html</link>
		<comments>http://www.ext-it.com/2011/blog/installing-dbfit-for-sql-server.html#comments</comments>
		<pubDate>Fri, 09 Dec 2011 19:15:13 +0000</pubDate>
		<dc:creator>Paddy Healey</dc:creator>
				<category><![CDATA[Consulting practices]]></category>
		<category><![CDATA[ext.IT Blog]]></category>
		<category><![CDATA[Paddy's Prose]]></category>
		<category><![CDATA[acceptance testing]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[DbFit]]></category>
		<category><![CDATA[developer tools]]></category>
		<category><![CDATA[fitnesse]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.ext-it.com/?p=1380</guid>
		<description><![CDATA[I&#8217;ve been using DBFit on several projects recently, and I&#8217;m really pleased with the results. If you&#8217;re not familiar with DBFit, it&#8217;s a set of Fit fixtures that allows Fitnesse tests to execute directly against a database, without you having to build a separate connector. This post shows you how to get started with DbFit [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using <a href="http://gojko.net/fitnesse/dbfit/" target="_blank">DBFit</a> on several projects recently, and I&#8217;m really pleased with the results. If you&#8217;re not familiar with DBFit, it&#8217;s a set of <a href="http://fit.c2.com/" target="_blank">Fit </a>fixtures that allows <a href="http://fitnesse.org/" target="_blank">Fitnesse</a> tests to execute directly against a database, without you having to build a separate connector. This post shows you how to get started with DbFit with the least amount of pain.</p>
<p>We practice Test Driven Development at ext.IT and while TDD is a pretty mature discipline in most modern programming languages, it&#8217;s still not widely practiced in the database world. We&#8217;ve had some success in the past using TSQLUnit, but I prefer DbFit because you can use it to write Unit Tests as well as Acceptance Tests. In addition, Fitnesse allows you to add additional colour in the form of documentation to truly turn your acceptance tests into an executable specification.</p>
<p>One thing that doesn&#8217;t (at least to me) appear to be clear from the documentation is that to install DbFit to test a Microsoft SQL Server database, you can simply install Fitnesse, and then install FitSharp. The advantage of doing this, compared to installing DbFit from sourceforge is that you will be working with the latest and greatest versions of Fitnesse and FitSharp. The current instance of DbFit on sourceforge uses a Fitnesse build from 2008.</p>
<p>Here is a high level overview of the installation steps (more detailed information including troubleshooting steps is available at each of the links below):</p>
<ol>
<li>If necessary, install Java 6 from here: <a href="http://www.java.com/en/download/index.jsp">http://www.java.com/en/download/index.jsp</a></li>
<li>Install Fitnesse from here: <a href="http://fitnesse.org/FrontPage.FitNesseDevelopment.DownLoad">http://fitnesse.org/FrontPage.FitNesseDevelopment.DownLoad. </a>As it mentions on the downloads page, just download fitnesse.jar, into the folder in which you&#8217;d like to install it  and type java -jar fitnesse.jar -p 8080 (where 8080 is the port number you&#8217;d like to use to run fitnesse from &#8211; usually port 80 is taken by other stuff on your machine) at the command line. Fitnesse will unpack and install itself.</li>
<li>If necessary, install .NET framework 3.5 or 4.0 from here: <a href="http://msdn.microsoft.com/en-us/netframework/aa569263">http://msdn.microsoft.com/en-us/netframework/aa569263</a></li>
<li>Install FitSharp from here (choose the correct version for your version of the .NET framework): <a href="https://github.com/jediwhale/fitsharp/downloads">https://github.com/jediwhale/fitsharp/downloads</a>. To install FitSharp, create a folder under the folder into which you installed Fitnesse (I name mine FitSharp) and unpack the installation files into this folder.</li>
<li>Once you&#8217;re installed and up and running, follow the examples in the <a href="http://www.fitnesse.info/dbfit:reference">DbFit Reference</a> to see how the whole thing works.</li>
<li>One additional tip is that if you&#8217;re following the Hello World example in the DbFit reference, use the following text instead of the one they document in<a href="http://www.fitnesse.info/dbfit:reference:databaseunittests:helloworld:settinguptheenvironment" target="_blank"> Step 2: Setting Up the Environment</a>. This will correctly point you to the location of your FitSharp installation files and use the Microsoft SQL Server flavour of DbFit:</li>
</ol>
<pre style="padding-left: 60px;">!define COMMAND_PATTERN {%m -r fitnesse.fitserver.FitServer,"FitSharp\fit.dll" %p}
!define TEST_RUNNER {FitSharp\Runner.exe}
!define PATH_SEPARATOR {;}
!path FitSharp\dbfit.sqlserver.dll</pre>
<p>I&#8217;ll be posting some further information on using DbFit as an executable specification that includes acceptance tests, for Unit Testing and performance testing, as well as showing you some of the ways we&#8217;ve organized our test suites to make them more maintainable and easier to understand. Happy Database Testing!</p>
<pre></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ext-it.com/2011/blog/installing-dbfit-for-sql-server.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Launching Cast Iron Studio 5 on Windows 7</title>
		<link>http://www.ext-it.com/2011/blog/launching-cast-iron-studio-5-on-windows-7.html</link>
		<comments>http://www.ext-it.com/2011/blog/launching-cast-iron-studio-5-on-windows-7.html#comments</comments>
		<pubDate>Fri, 25 Mar 2011 18:27:04 +0000</pubDate>
		<dc:creator>Paddy Healey</dc:creator>
				<category><![CDATA[ext.IT Blog]]></category>
		<category><![CDATA[Paddy's Prose]]></category>
		<category><![CDATA[applications]]></category>
		<category><![CDATA[Cast Iron]]></category>
		<category><![CDATA[tips and tricks]]></category>

		<guid isPermaLink="false">http://www.ext-it.com/?p=1352</guid>
		<description><![CDATA[We were recently working on a customer&#8217;s Cast Iron projects that had been upgraded from version 4.5 to version 5.0 and ran into a problem launching Cast Iron Studio 5.0.0.6, which we solved. I thought I&#8217;d throw this blog post out as I couldn&#8217;t find any help from Google about this problem, so if anyone [...]]]></description>
			<content:encoded><![CDATA[<p>We were recently working on a customer&#8217;s Cast Iron projects that had been upgraded from version 4.5 to version 5.0 and ran into a problem launching Cast Iron Studio 5.0.0.6, which we solved.</p>
<p>I thought I&#8217;d throw this blog post out as I couldn&#8217;t find any help from Google about this problem, so if anyone else is running into this, then you will be able to find an answer without having to open a support ticket with IBM!</p>
<h2>Problem</h2>
<p>After installing Cast Iron Studio 5.0.0.6 on Windows 7, the Studio will launch correctly the first time, but each subsequent time you try to run Cast Iron Studio, it will show the splash screen then close the application.</p>
<p>If you look in the installation folder, you will see an <strong>error.txt</strong> file that contains something similar to this:</p>
<blockquote><p>org.osgi.framework.BundleException: A fragment bundle cannot be started: update@plugins/com.approuter.module.jde.tp-1.0.0.jar [77]<br />
at org.eclipse.osgi.framework.internal.core.BundleFragment.startWorker(BundleFragment.java:224)<br />
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:265)<br />
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:257)<br />
at com.approuter.studio.plugins.BootstrapActivator.startApplication(BootstrapActivator.java:60)<br />
at com.approuter.studio.plugins.BootstrapActivator.start(BootstrapActivator.java:39)<br />
at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:1009)<br />
at java.security.AccessController.doPrivileged(Native Method)<br />
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:1003)<br />
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:984)<br />
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346)<br />
at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:355)<br />
at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1074)<br />
at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:616)<br />
at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:508)<br />
at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:299)<br />
at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:489)<br />
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:211)<br />
at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:321)</p></blockquote>
<h2>Solution</h2>
<p>The solution is simple &#8211; launch Cast Iron Studio with Administrator privileges. You can of course right click the application from the start menu short cut and choose <strong>Run as administrator</strong>, but to avoid having to right click every time, follow these steps:</p>
<ol>
<li>Go to the desktop shortcut for Cast Iron Studio (if you didn&#8217;t create a shortcut when you installed Cast Iron, then simply right click the Cast Iron Studio start menu item and click <strong>Send To&#8230;, Desktop (create shortcut).</strong></li>
<li>Right<strong> </strong>click the short cut and click <strong>Properties.</strong></li>
<li>From the <strong>Shortcut </strong>tab, click the <strong>Advanced </strong>button.</li>
<li>Check the box that says <strong>Run as administrator.</strong></li>
<li>Click <strong>OK</strong> to close the Advanced properties dialog and click<strong> OK</strong> to close the shortcut properties dialog.</li>
</ol>
<p><strong><a href="http://www.ext-it.com/wp-content/uploads/2011/03/Cast_Iron_Shortcut.png"><img class="alignnone size-full wp-image-1355" title="Cast_Iron_Shortcut" src="http://www.ext-it.com/wp-content/uploads/2011/03/Cast_Iron_Shortcut.png" alt="Cast Iron Shortcut menu" width="638" height="543" /></a><br />
</strong></p>
<p>If you&#8217;d prefer to use a start menu item, rather than a shortcut, simply right click the short cut and cilck <strong>Pin to Start Menu</strong>.</p>
<p>Now Cast Iron Studio will launch successfully.</p>
<p>Let me know if this blog post helped you, or if there is a simpler work around that exists; this was an odd problem that didn&#8217;t appear to have a well documented solution that Google could find for me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ext-it.com/2011/blog/launching-cast-iron-studio-5-on-windows-7.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bob&#8217;s Report &#8211; The cost of redundant processes</title>
		<link>http://www.ext-it.com/2011/blog/bobs-report-the-cost-of-redundant-processes.html</link>
		<comments>http://www.ext-it.com/2011/blog/bobs-report-the-cost-of-redundant-processes.html#comments</comments>
		<pubDate>Fri, 18 Feb 2011 20:10:34 +0000</pubDate>
		<dc:creator>Russ</dc:creator>
				<category><![CDATA[Consulting practices]]></category>
		<category><![CDATA[ext.IT Blog]]></category>
		<category><![CDATA[Russ's Writings]]></category>
		<category><![CDATA[5 whys]]></category>
		<category><![CDATA[applications]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[business analyst]]></category>
		<category><![CDATA[business processes]]></category>
		<category><![CDATA[business requirement]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[microsoft sql server reporting services]]></category>
		<category><![CDATA[pragmatic strategy]]></category>
		<category><![CDATA[sql server reporting services]]></category>

		<guid isPermaLink="false">http://www.ext-it.com/?p=1336</guid>
		<description><![CDATA[Have you ever been in a situation where you wondered where the original business requirement came from? &#8220;Bob&#8217;s report must be produced every Monday morning by 10am!&#8221; Mary extracts the data from the database Bill adds the data to a spreadsheet and applies some pivots to massage the data Sue looks at the report and [...]]]></description>
			<content:encoded><![CDATA[<p>Have you ever been in a situation where you wondered where the original business requirement came from?</p>
<p>&#8220;Bob&#8217;s report must be produced every Monday morning by 10am!&#8221;</p>
<ol type="1">
<li>Mary extracts the data from the database</li>
<li>Bill adds the data to a      spreadsheet and applies some pivots to massage the data</li>
<li>Sue looks at the report and      makes sure there are no errors</li>
<li>Harry applies some text to      the report and finishes off the formatting, then emails the report to Bob</li>
<li>Bob looks through the 200      unread emails in his inbox and tries to prioritize them. In the end he      glances at &#8220;his&#8221; report for 30 seconds and thinks nothing more      of it.</li>
</ol>
<p>Where did the requirement for Bob&#8217;s report come from? Lets look at the history behind this requirement.</p>
<p>1996 &#8211; A new application is implemented for tracking the sale of widgets</p>
<p>1997 &#8211; Jean the head of sales has the requirement for a sales report for her weekly meeting with the CEO at midday on a Monday. She describes her requirements to the business analyst implementing the application. The format is decided and the process to produce the report is documented and discussed with the parties involved</p>
<p>2005 &#8211; Jean leaves Widgets inc. for a new position at another company. Bob is employed as head of sales. The CEO and Bob decide that they are going to meet on a Wednesday every other week to discuss the sale of widgets.</p>
<p>&#8220;Bob&#8217;s report&#8221; (originally Jean&#8217;s report) hasn&#8217;t been reassessed since 1997. Since 1997 Widgets inc have changed personnel and business processes have been updated. Technology has changed since 1997 and the process of producing Bob&#8217;s report should be much easier with a more modern approach (automated processing with<a href="http://www.microsoft.com/sqlserver/2008/en/us/reporting.aspx" target="_blank"> Microsoft SQL Server Reporting Services</a>, <a href="http://www.sap.com/solutions/sapbusinessobjects/large/business-intelligence/index.epx" target="_blank">Business Objects</a>, <a href="http://www-01.ibm.com/software/data/cognos/" target="_blank">Cognos</a> and many more). What&#8217;s more, four people have spent hours of time on a Monday morning producing a report for the past 6 years and it is not even read!</p>
<p><strong>Solving the problem</strong></p>
<p>This may be an extreme example, but I can guarantee you will have come across a similar scenario either in the organization you work in or in other organizations if you are a consultant like me. In so many cases we hit a wall when we ask the question, &#8220;Why do we need X?&#8221; Many times the reason is political, but in some cases it is purely because of a historical requirement and no one is prepared to ask the question. As it turns out, Bob is unaware of the effort that goes into producing his report; if he knew he would stop this process or refine the contents of the report so that it is more useful.</p>
<p>As consultants or business analysts we are always likely to have to dig deeper until we can find the truth. One method that can be useful is to follow the &#8220;<a href="http://en.wikipedia.org/wiki/5_Whys" target="_blank">5 Whys</a>&#8220;:</p>
<blockquote><p>The <strong>5 Whys</strong> is a questions-asking method used to explore the cause/effect relationships underlying a particular problem. Ultimately, the goal of applying the 5 Whys method is to determine a root cause of a defect or problem.</p></blockquote>
<p>Quite often we find that the problem is several levels deep. Using the 5 Whys technique can help to get to the root cause of a business problem rather than the apparent problem on the surface, or even worse a problem that has not been identified.</p>
<p>As consultants our hardest task can be getting to talk to the right people. How can we reach our goal in a reasonable time without upsetting too many people? Here are some rules we can follow:</p>
<ul type="disc">
<li>Set expectations up front. You want      X number of hours time from people in the relevant areas of the business.      You want to be able to speak to them in a reasonable period of time.</li>
<li>Speak to the right people.      You are not likely to get a lot of the CEO&#8217;s time, but if his or her input      is likely to help ask for their time. Be prepared with targeted questions      where possible:
<ul type="circle">
<li>What reports do you       currently receive? Do you use the data in these reports?</li>
<li>What do you use this data       for?</li>
<li>What information is not made       available to you that you would like to see?</li>
</ul>
</li>
</ul>
<ul type="disc">
<li>Don&#8217;t accept the answer      &#8220;that&#8217;s just the way it&#8217;s done&#8221;. Use the 5 Whys to dig deeper until you find the      real reason for a requirement.</li>
<li>Stick to your guns!</li>
</ul>
<p>Remember, getting      down to the root cause will benefit the organization you are      working for. They may be throwing thousands of dollars per year away on Bob&#8217;s reports.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ext-it.com/2011/blog/bobs-report-the-cost-of-redundant-processes.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Show them the numbers &#8211; it&#8217;s results that matter</title>
		<link>http://www.ext-it.com/2011/blog/show-them-the-numbers.html</link>
		<comments>http://www.ext-it.com/2011/blog/show-them-the-numbers.html#comments</comments>
		<pubDate>Thu, 17 Feb 2011 05:11:18 +0000</pubDate>
		<dc:creator>Paddy Healey</dc:creator>
				<category><![CDATA[Consona / Onyx CRM]]></category>
		<category><![CDATA[Consulting practices]]></category>
		<category><![CDATA[ext.IT Blog]]></category>
		<category><![CDATA[Paddy's Prose]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[customers]]></category>
		<category><![CDATA[Onyx / Consona CRM]]></category>
		<category><![CDATA[Oracle Financials]]></category>
		<category><![CDATA[pragmatic strategy]]></category>
		<category><![CDATA[project kickoff]]></category>

		<guid isPermaLink="false">http://www.ext-it.com/?p=1090</guid>
		<description><![CDATA[On a recent project one of our customers had some questions about the project&#8217;s progress. The project was a mid-size systems integration between Oracle Financials and Onyx CRM for a Fortune 500 company. As with many large companies, there were several business units and people with interest in the project, and also as with many [...]]]></description>
			<content:encoded><![CDATA[<p>On a recent project one of our customers had some questions about the project&#8217;s progress. The project was a mid-size systems integration between <a title="Oracle Financials" href="http://www.oracle.com/us/products/applications/ebusiness/financials/053262.html" target="_blank">Oracle Financials</a> and <a title="Onyx and Consona CRM" href="http://crm.consona.com/" target="_blank">Onyx CRM</a> for a Fortune 500 company.</p>
<p>As with many large companies, there were several business units and people with interest in the project, and also as with many large companies, people had several other projects to deal with and were not attending the daily standups or weekly progress meetings.</p>
<p>I began to hear that there were some concerns about the project progress from some of the management team and a concern that we were spending too much time writing tests instead of code.</p>
<p>This came as a big surprise to me: from the perspective of the team working on the project on a daily basis (both customer and ext.IT), we were sailing along with no problems. We were providing the usual artifacts such as status reports which showed how we were tracking against estimated hours and when our code complete date would be, and all of this was tracking well against our original estimates, so to hear that people were unhappy was a big shock.</p>
<p>I called a meeting with all of the stakeholders and as soon as I invited all of the stakeholders I realized two things:</p>
<ol>
<li>This meeting would be the first time in the whole project that all of the stakeholders had been in a room together.</li>
<li>While we had discussed our approach during the initial engagement, we hadn&#8217;t held a project kickoff with all of the stakeholders to discuss our approach to building software.</li>
</ol>
<p>Both of these items were my fault, but here I was, several months into the project with an unhappy customer, so I thought I would address it in this meeting.</p>
<p>I put together a short presentation which discussed our approach to building software, including brief descriptions of how we perform iterations, test driven development, automated acceptance testing, retrospectives and other benefits to the way we build software, and why we considered our approach to be best practice.</p>
<p>Almost as an afterthought, I ended the presentation with a couple of slides showing our project status. This was an afterthought because everyone at the meeting was a recipient of the weekly status report containing the same information. I created one slide comparing our original project estimates (before we had detailed requirements) to our detailed estimates (once requirements were fleshed out) and to our actual hours so far on the completed features, and another slide showing our defect count and comparing it to another of the customer&#8217;s internal projects that they had build without the benefit of automated tests.</p>
<p>Once the meeting started, it was clear that I didn&#8217;t need any of the slides about our approach. We spent a few minutes discussing the original estimates against the actual time taken for completed features: everyone was happy with the job we had done in estimating against the original high-level requirements. We also discussed how we were tracking on the hours left: again, everyone was satisfied with the results. Finally, we spent five minutes comparing the low defect count on our project (with a high level of test automation), compared to some of the customer&#8217;s other projects (without unit tests), and everyone was satisfied with this too.</p>
<p>There wasn&#8217;t a single question about our approach, and ultimately no-one in the higher echelons of the customer&#8217;s business cared about the minutiae of our approach, nor were they interested in why we thought our approach was best practice.</p>
<p><em>They simply wanted to see the results of our approach.</em></p>
<p>In retrospect, this might seem obvious, but<em> the best way to convince anyone that your approach to doing something is practical and pragmatic, is to do it and measure it against other approaches</em>. People don&#8217;t care about dogma, or why you think something <em>should </em>be the best way. Only by showing people the numbers and measuring the effectiveness of your approach can you truly show that your practices are effective.</p>
<p>To conclude: After this meeting, the project was delivered successfully without any more concerns from the customer. We were one of several projects integrating with Oracle and we were the only project to deliver on time and under budget, with a very happy customer!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ext-it.com/2011/blog/show-them-the-numbers.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data Smells</title>
		<link>http://www.ext-it.com/2011/blog/data-smells.html</link>
		<comments>http://www.ext-it.com/2011/blog/data-smells.html#comments</comments>
		<pubDate>Tue, 15 Feb 2011 19:44:01 +0000</pubDate>
		<dc:creator>Wayne Hiner</dc:creator>
				<category><![CDATA[ext.IT Blog]]></category>
		<category><![CDATA[Wayne's Words]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[OEP]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[salesforce.com]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.ext-it.com/?p=1319</guid>
		<description><![CDATA[There has been much discussion in recent years about code smells and using them to drive refactoring.  I have heard and read very little, however, about data smells.  Data smells are different from code smells and they drive a different process, but I believe that they are equally as important. Data is like fresh food [...]]]></description>
			<content:encoded><![CDATA[<p>There has been much discussion in recent years about code smells and using them to drive refactoring.  I have heard and read very little, however, about data smells.  Data smells are different from code smells and they drive a different process, but I believe that they are equally as important.</p>
<p>Data is like fresh food from the grocery store; much of what you buy has a &#8220;use or freeze by&#8221; date.  Data too has this expiration date and like the fresh food, if this date is ignored, there will be spoilage that results in unpleasant smells.  In data&#8217;s case, the &#8220;use by&#8221; date can be quite obvious as in the case of accounting data or more subtle like the useful lifespan of customer purchasing data.  The &#8220;freeze by&#8221; date gives an indication of when the data is no longer useful in daily operations but generally has value as historical information to be used in reporting and analysis.  The most insidious data is comprised of the fields, tables and sometimes entire data stores that have been rarely or never used.  The bad smells don&#8217;t reach us because this data or structure is not being actively used.</p>
<p>Where does this data originate?  Sometimes, it comes from the pet projects of long-departed managers or executives that ultimately didn&#8217;t serve a useful business function.  Others may come from projects that were dropped due to budget or other business constraints and left in a partially-complete state.  In my experience, the greatest contributors to stale data are the large, enterprise applications like Onyx CRM / Consona CRM or Oracle Financials that have been implemented in a traditional waterfall fashion.  SaaS applications such as Salesforce.com that allow well-intentioned but technically-challenged users to create entire data structures are a close second and gaining rapidly.</p>
<p>In waterfall implementations of large, enterprise-level applications, user groups often pile on requirements in an effort not to miss any possible use case, even those which should be considered to be marginal.  Because requirements are gathered upfront and then cast in stone, it&#8217;s easy to see why so much marginally-useful or even useless data points are created to satisfy the perceived business need.   How often do we review this data once it has been implemented?  Monthly, yearly, once a decade?  Unfortunately, the likely answer is: never.  We have servers to manage, upgrades, updates and patches to test, database code to write and refactor, documentation to maintain, meetings to attend, newer, shinier applications to prepare and the list goes on and on.  Meanwhile, columns that contain minimal or no data and tables with stale, useless data take up space and use server resources unnecessarily.</p>
<p>It is incumbent on data professionals, and I include DBAs, data developers and business analysts in this category, to find these issues and to offer solutions.</p>
<ul>
<li>Consider re-purposing custom and user-defined data columns to support newer business needs.</li>
<li>Offer to archive (just in case) those old tables and to eliminate them from the production server.</li>
<li>Refactor code to eliminate dead-ends and processes that are creating the offending rows.  I have seen several cases where there hundreds of thousands of rows of data that is still being created to support a process that no longer exists or is assigned to a user who is long-gone.</li>
</ul>
<p>We offer CRM &#8220;tune-ups&#8221; for Onyx CRM, Consona CRM, Oracle Financials, Microsoft Dynamics CRM and Salesforce.com which would include data analysis of this kind.  Look for a blog post on this in the future.</p>
<p>In addition, I&#8217;ll address the &#8220;how-to&#8221; side of this issue in a future post.  In the meantime, take a look at your biggest data stores.  Do you have any columns that have never been populated, have not been populated in more than a year or have a population of less than 5% of the rows?  If so, these are candidates for the big cleanup ahead.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ext-it.com/2011/blog/data-smells.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How do I manage changes to the Onyx Employee Portal UCW?</title>
		<link>http://www.ext-it.com/2011/blog/how-do-i-manage-changes-to-the-onyx-employee-portal-ucw.html</link>
		<comments>http://www.ext-it.com/2011/blog/how-do-i-manage-changes-to-the-onyx-employee-portal-ucw.html#comments</comments>
		<pubDate>Mon, 14 Feb 2011 20:25:16 +0000</pubDate>
		<dc:creator>Paddy Healey</dc:creator>
				<category><![CDATA[Consona / Onyx CRM]]></category>
		<category><![CDATA[Consulting practices]]></category>
		<category><![CDATA[ext.IT Blog]]></category>
		<category><![CDATA[Paddy's Prose]]></category>
		<category><![CDATA[assembla]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[customers]]></category>
		<category><![CDATA[Global Delta]]></category>
		<category><![CDATA[Layers]]></category>
		<category><![CDATA[OEP]]></category>
		<category><![CDATA[Onyx / Consona CRM]]></category>
		<category><![CDATA[Onyx CRM]]></category>
		<category><![CDATA[UCW]]></category>

		<guid isPermaLink="false">http://www.ext-it.com/?p=1279</guid>
		<description><![CDATA[With Onyx CRM version 6.0 and Consona CCM 7.0, you have a great feature called UCW (UI Configuration Workbench). There are several benefits to using the UCW. The Onyx Employee Portal 6.0 Technical Guide lists the main ones as: Ease of configuration: UCW provides WYSIWYG configuration of many areas in OEP, enabling you to configure, [...]]]></description>
			<content:encoded><![CDATA[<p>With <a title="http://crm.consona.com/" href="http://crm.consona.com/" target="_blank">Onyx CRM version 6.0 and Consona CCM 7.0</a>, you have a great feature called UCW (UI Configuration Workbench). There are several benefits to using the UCW. The Onyx Employee Portal 6.0 Technical Guide lists the main ones as:</p>
<blockquote><p><strong>Ease of configuration:</strong> UCW provides WYSIWYG  configuration of many areas in OEP, enabling you to configure, compile, and test  your configurations, including changes to user navigation and form presentation  and behavior.</p></blockquote>
<blockquote><p><strong>Custom OEP pages for different teams:</strong> Using UCW and  OEP Profiles, you can configure the same OEP page differently for different  teams in your organization, enabling profile-based user navigation and page  presentation and behavior. You can apply your UCW configurations to one or more  custom UIs (accessed via the related OEP  profiles) or to all custom UIs at once (using the baseline UI accessed with  the Global profile).</p></blockquote>
<blockquote><p><strong>Upgradeability:</strong> When you configure OEP using UCW, you  ensure that your UI configurations will be upgraded to the next version of OEP  without requiring you to rewrite or re-implement your modifications.  Customizations that are implemented outside of UCW, however, are not  automatically applied when OEP is upgraded.</p></blockquote>
<p>However, while the technical documentation has some best practices and tips and tricks, what isn&#8217;t well-documented is how to work with the UCW so that you can more effectively manage your UI changes. This post will show you how to split your UI changes into layers.</p>
<p>Following the approach I am about to describe has the following benefits:</p>
<ul>
<li>Several developers can simultaneously work on different UI features at the same time (in different developer environments) without causing any dependency issues or needing to &#8220;check out&#8221; or lock files.</li>
<li>Changes to one area of the UI can be deployed without worrying about changes in other areas.</li>
<li>Splitting the changes into layers means that you can &#8220;throw away&#8221; or remove whole areas of customizations without needing to manually edit the global delta xml files or delete your changes through the UI.</li>
</ul>
<h2>How does this work?</h2>
<p>It&#8217;s very simple. When you make changes in the Onyx / Consona UI, the UCW framework is tracking those changes and adding all of your actions to one file called global_delta.xml. This file is found here: <strong> </strong></p>
<p><strong>EmployeePortal\ucf\data\layers\active</strong></p>
<p>By default, <em>all </em>of your changes live in this file, whether they are changes to the company edit screen, the incident edit page, or the powerpage. This is undesirable and means that all of your customizations have dependencies and only one person can work on UCW at a time, even if you have several development environments, so it&#8217;s best to break up the work into custom layers.</p>
<p>Before your start, please add your Onyx UI files to source control! There are many choices and a lot of them are free. We use <a title="Assembla" href="http://www.assembla.com/" target="_blank">Assembla&#8217;s</a> hosted <a title="Subversion" href="http://subversion.apache.org/" target="_blank">Subversion</a> repositories.</p>
<p>To add a custom layer, follow these steps:</p>
<ol>
<li>Navigate to <strong>EmployeePortal\custom\ucf\data\layers.</strong></li>
<li>Create an empty folder with your layer name. For example, if you want to add a layer for the company powerpage, name this folder <strong>companypowerpage</strong>.</li>
<li>Navigate to <strong>EmployeePortal\ucf\data\configuration.</strong></li>
<li>Add the path to your layer to the layers.xml file. Set the sequence number so that this comes before the active layer and after the onyxvalidation layer. Adjust the sequence number of the following layers. In the screenshot below, we have added two custom layers: one for the company powerpage and one for the company edit screen.</li>
</ol>
<p><img class="alignnone size-full wp-image-1281" title="layers" src="http://www.ext-it.com/wp-content/uploads/2011/02/layers.png" alt="Layers" width="762" height="182" /></p>
<p>The first time you edit your new layer:</p>
<ol>
<li>Navigate to <strong>EmployeePortal\ucf\data\layers\active</strong> &#8211; <em>ensure that this is empty!</em></li>
<li>Make your changes to the layer you are configuring.</li>
<li><em>Move</em> (not copy) the global_delta.xml file that has been generated in the <strong> ucf\data\layers\active</strong> folder back to the folder you created within  <strong>custom\ucf\data\layers</strong></li>
</ol>
<p>Each subsequent time you edit your new layer:</p>
<ol>
<li>Navigate to <strong>EmployeePortal\ucf\data\layers\active</strong> &#8211; <em>ensure that this is empty!</em></li>
<li><em>Move</em> (not copy) the global_delta.xml file within <strong> custom\ucf\data\layers</strong> over to the<strong> ucf\data\layers\active</strong> folder</li>
<li>Make your changes to the layer you are configuring.</li>
<li><em>Move</em> (not copy) the global_delta.xml file that has been modified in the<strong> ucf\data\layers\active</strong> folder back to the folder you created within <strong> custom\ucf\data\layers</strong></li>
</ol>
<p>That&#8217;s it! Now you can effectively separate all of your Onyx UI changes into a more manageable structure.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ext-it.com/2011/blog/how-do-i-manage-changes-to-the-onyx-employee-portal-ucw.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Fuss about Test Driven Development</title>
		<link>http://www.ext-it.com/2011/blog/the-fuss-about-tdd.html</link>
		<comments>http://www.ext-it.com/2011/blog/the-fuss-about-tdd.html#comments</comments>
		<pubDate>Fri, 28 Jan 2011 05:07:43 +0000</pubDate>
		<dc:creator>Paddy Healey</dc:creator>
				<category><![CDATA[Consulting practices]]></category>
		<category><![CDATA[ext.IT Blog]]></category>
		<category><![CDATA[Paddy's Prose]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.ext-it.com/wordpress/?p=160</guid>
		<description><![CDATA[There has been a lot of debate about the benefits, or otherwise, of Test-Driven Development (TDD). In this short post, I will attempt to enumerate some of the benefits, and show that practicing TDD means that your code becomes an asset to the business, instead of a liability. I will also point you to a [...]]]></description>
			<content:encoded><![CDATA[<p>There has been a lot of debate about the benefits, or otherwise, of Test-Driven Development (TDD). In this short post, I will attempt to enumerate some of the benefits, and show that practicing TDD means that your code becomes an asset to the business, instead of a liability. I will also point you to a few resources that will help you get started with TDD.</p>
<h2>What is Test Driven Development?</h2>
<p>Most people have heard the term Test-Driven Development (or TDD), but not everyone seems to understand what it means, so we&#8217;ll start with a brief definition:</p>
<blockquote><p>Test-driven development (TDD) is a software development technique that relies on the repetition of a very short development cycle: First the developer writes a failing automated test case that defines a desired improvement or new function, then produces code to pass that test and finally refactors the new code to acceptable standards.</p></blockquote>
<h3 id="the_four_rules_of_tdd">The Four Rules of TDD</h3>
<p>Robert C. Martin, wrote a <a href="http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd">famous blog pos</a>t that defined <em>the three rules of test driven development.</em></p>
<ol>
<blockquote>
<li> You are not allowed to write any production code unless it is to make a failing unit test pass.</li>
<li>You are not allowed to write any more of a unit test than is sufficient to fail.</li>
<li>You are not allowed to write any more production code than is sufficient to pass the one failing unit test.</li>
</blockquote>
</ol>
<p>While Bob mentions refactoring as part of the TDD cycle in his post, I think it&#8217;s important enough to be its own rule. So rule 4 reads:</p>
<blockquote><p>4.  You should refactor your code once the tests pass.</p></blockquote>
<p>It&#8217;s a technique that needs to be witnessed and practiced to really be used effectively. The steps are very small, with each cycle lasting perhaps five minutes at most. This means that you make lots of tiny steps towards your goal throughout your day, but each step is a &#8220;mini-milestone&#8221;, because once you get to the Green bar (or to the step where all of your test are passing), your code is in a known good state. This makes it simpler to return to that good known state via the undo button if you take a wrong turn and can&#8217;t get the next test to pass. This is a really refreshing change from spending hours in the debugger trying to figure out where you went wrong!</p>
<p>There are many productivity benefits to TDD that outweigh the additional time taken to create the tests. These include working code, less time debugging and a suite of automated regression tests that can be ran at any time. In addition, the tests allow us to change, or <strong>refactor</strong><a href="http://en.wikipedia.org/wiki/Code_refactoring"></a> the code without fear of breaking it.</p>
<p>One final point before I move on to discuss how to get started: TDD generates unit tests, <em>but </em><em>unit testing is not the same as TDD! </em>In TDD, the tests come first, before the code they are testing and are automated. In unit testing, the tests typically come after the code, and are not always automated.</p>
<h2>Code Katas</h2>
<p>Given all of these benefits, it should be a no-brainer to decide whether or not to adopt this practice. And yet, there have recently been some debates about its effectiveness. I&#8217;m not going to recount these debates here, as my philosophy is &#8220;just do it&#8221;. If you want to know if TDD works, but you are worried about the amount of time it would take to investigate, then follow the <a title="http://en.wikipedia.org/wiki/Kata" href="http://en.wikipedia.org/wiki/Kata" target="_blank">kata </a>approach. Wikipedia defines a kata as:</p>
<blockquote><p><strong>Kata</strong> (型 or 形, <em>literally: &#8220;form&#8221;</em>) is a Japanese word describing detailed choreographed patterns of movements practised either solo or in pairs.</p></blockquote>
<p>While katas are most often associated with martial arts, it has also become a popular phrase for working with code. Again, from Wikipedia:</p>
<blockquote><p><strong>Code Kata</strong> is a term coined by Dave Thomas&#8230; A code kata is an exercise in programming which helps hone your skills through practice and repetition.</p></blockquote>
<p>If you are interested in learning about TDD and code katas, simply set aside a short amount of time each day and start to experiment. To get you started, here are a few resources:</p>
<ul>
<li>Dave Thomas has posted several katas on his <a title="http://codekata.pragprog.com/codekata/" href="http://codekata.pragprog.com/codekata/" target="_blank">Code Kata website.</a></li>
<li>Some screencasts of katas from the <a title="http://katas.softwarecraftsmanship.org/" href="http://katas.softwarecraftsmanship.org/" target="_blank">Software Craftsmanship website</a>.</li>
<li>Robert C. Martin&#8217;s<a title="http://vimeo.com/7762511" href="http://vimeo.com/7762511" target="_blank"> screencast of his Prime Factors kata in Ruby</a>.</li>
</ul>
<p>In addition, you should really beg, steal or borrow (or alternatively, just buy) these books:</p>
<ul>
<li><a title="http://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530" href="http://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530" target="_blank">Test Driven Development: By Example by Kent Beck</a></li>
<li><a title="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=pd_bxgy_b_img_b" href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=pd_bxgy_b_img_b" target="_blank">Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin</a></li>
<li><a title="http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=pd_bxgy_b_img_c" href="http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=pd_bxgy_b_img_c" target="_blank">Refactoring: Improving the Design of Existing Code by Martin Fowler</a></li>
</ul>
<p>In the future, we&#8217;ll be posting articles about different unit testing frameworks and techniques; until then, good luck getting started with TDD!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ext-it.com/2011/blog/the-fuss-about-tdd.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jasmine &#8211; JavaScript Unit Testing Framework</title>
		<link>http://www.ext-it.com/2010/blog/jasmine-javascript-unit-testing-framework.html</link>
		<comments>http://www.ext-it.com/2010/blog/jasmine-javascript-unit-testing-framework.html#comments</comments>
		<pubDate>Thu, 11 Nov 2010 14:02:24 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Andy's Anecdotes]]></category>
		<category><![CDATA[ext.IT Blog]]></category>
		<category><![CDATA[applications]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[developer tools]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[tips and tricks]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.ext-it.com/?p=1123</guid>
		<description><![CDATA[I recently joined a project which includes a substantial amount of user interface web development. I have typically been involved in projects as a middle tier/database developer, or at most extending an existing user interface using pre-packaged software. I want to utilize the same TDD (Test Driven Development) approach to UI coding as well and [...]]]></description>
			<content:encoded><![CDATA[<p>I recently joined a project which includes a substantial amount of user interface web development. I have typically been involved in projects as a middle tier/database developer, or at most extending an existing user interface using pre-packaged software. I want to utilize the same TDD (Test Driven Development) approach to UI coding as well and this led me down the path to find a JavaScript Unit Testing Framework that is as robust as <a href="http://www.nunit.org/" target="_blank">NUnit</a> <em><strong>*and*</strong></em> is actively maintained. Doing a Google search led me to find the <a href="http://pivotal.github.com/jasmine/index.html" target="_blank">Jasmine Unit Testing Framework</a> by <a href="http://pivotallabs.com/" target="_blank">Pivotal Labs </a>that satisfied both criteria (latest code update was 10/5/2010!). Below are some of the key points that piqued my interest in this framework.</p>
<ul>
<li>Suites &#8211; allows grouping of Specs (Tests). Included is also the idea of Nested Suites.</li>
<li>Disabling &#8211; Easily disable Specs or Suites by, without having to comment out code</li>
<li>Matchers &#8211; built in support for numerous expectations (Assertions) such as .toBe(), .toBeNull(), .toBeTruthy(), toBeFalsy() etc. Ability to easily add Custom Matchers (assertions).</li>
<li>Setup and Teardown fixtures &#8211; beforeEach() can execute at the beginning of a suite or before every single spec. Similarly afterEach() can execute after all specs have been executed in a suite or after every spec. In addition, there is support for an after() method to be requested during a single spec execution and will execute regardless if a spec finishes successfully or not.</li>
<li>Spies &#8211; Jasmine integrates ‘spies’ that permit many spying, mocking, and faking behaviors. Some interesting methods that can be invoked on spies:spyOn(x, &#8216;method&#8217;).andCallThrough(): spies on AND calls the original function spied onspyOn(x, &#8216;method&#8217;).andReturn(arguments): returns passed arguments when spy is called
<p>spyOn(x, &#8216;method&#8217;).andThrow(exception): throws passed exception when spy is called</p>
<p>spyOn(x, &#8216;method&#8217;).andCallFake(function): calls passed function when spy is called</li>
<li>Asynchronous Specs &#8211; Ability to invoke a function and have Jasmine wait for a period of time, checking the result of the function call in order to execute the spec.</li>
</ul>
<p>While these are the high level features of Jasmine, they provide a robust framework similar to what I have come to expect from compiled code testing frameworks. I will post examples of how to use Jasmine in future blog posts.</p>
<p>Happy Testing!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ext-it.com/2010/blog/jasmine-javascript-unit-testing-framework.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Watts Humphrey, 1927 &#8211; 2010</title>
		<link>http://www.ext-it.com/2010/blog/watts-humphrey-1927-2010.html</link>
		<comments>http://www.ext-it.com/2010/blog/watts-humphrey-1927-2010.html#comments</comments>
		<pubDate>Fri, 29 Oct 2010 04:36:54 +0000</pubDate>
		<dc:creator>Paddy Healey</dc:creator>
				<category><![CDATA[ext.IT Blog]]></category>
		<category><![CDATA[Paddy's Prose]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[improving software]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://www.ext-it.com/?p=1115</guid>
		<description><![CDATA[I just read that Watts Humphrey has passed away at the age of 83. My thoughts are with the family and friends of this great man, who cared deeply about improving software engineering processes. He founded the Software Process Program at Carnegie Mellon University and wrote several books on understanding and improving the process of [...]]]></description>
			<content:encoded><![CDATA[<p>I just read that <a href="http://en.wikipedia.org/wiki/Watts_Humphrey" target="_blank">Watts Humphrey</a> has passed away at the age of 83. My thoughts are with the family and friends of this great man, who cared deeply about improving software engineering processes. He founded the Software Process Program at Carnegie Mellon University and wrote several books on understanding and improving the process of developing software.</p>
<p>There&#8217;s an obituary from the university here: <a href="http://www.cmu.edu/news/archive/2010/October/oct28_wattshumphreyobit.shtml" target="_blank">http://www.cmu.edu/news/archive/2010/October/oct28_wattshumphreyobit.shtml</a></p>
<p>Rest in peace, sir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ext-it.com/2010/blog/watts-humphrey-1927-2010.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Waterfall approach to reading</title>
		<link>http://www.ext-it.com/2010/blog/the-waterfall-approach-to-reading.html</link>
		<comments>http://www.ext-it.com/2010/blog/the-waterfall-approach-to-reading.html#comments</comments>
		<pubDate>Wed, 25 Aug 2010 00:10:10 +0000</pubDate>
		<dc:creator>Paddy Healey</dc:creator>
				<category><![CDATA[ext.IT Blog]]></category>
		<category><![CDATA[Paddy's Prose]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[flexibility]]></category>
		<category><![CDATA[iterations]]></category>
		<category><![CDATA[software projects]]></category>
		<category><![CDATA[waterfall approach]]></category>

		<guid isPermaLink="false">http://www.ext-it.com/?p=1023</guid>
		<description><![CDATA[I was chatting to my wife the other evening and started to discuss reading lists. I wondered aloud how many years I had to live (30? 40? 50?), and was thinking about how many more books I would be able to read in that time.  A book a week for 40 years would mean I [...]]]></description>
			<content:encoded><![CDATA[<p>I was chatting to my wife the other evening and started to discuss reading lists. I wondered aloud how many years I had to live (30? 40? 50?), and was thinking about how many more books I would be able to read in that time.  A book a week for 40 years would mean I could read about 2,000 more books in my lifetime.</p>
<p>A quick search netted this wonderful article from the Guardian Online: <a href="http://www.guardian.co.uk/books/2009/jan/23/bestbooks-fiction" target="_blank">1000 novels everyone must read</a>, so that was a great starting point.</p>
<p>I thought about how the task of building a reading list would look like if I approached the task like a software project.</p>
<h2>The Waterfall Approach</h2>
<ol>
<li>Use the Guardian article, Amazon reviews and recommendations to create the complete list of 2,000 books I am going to read.</li>
<li>Prioritize the list.</li>
<li>Buy all of the books in the list.</li>
<li>Work through the list, reading the books in order.</li>
</ol>
<p>Now deciding ahead of time what you are going to read for the next forty years is clearly ludicrous, as so much will change in that time.  My interests and priorities will change. The world will change. The available books will change. Even the cost and technologies for delivering books will change. All of this means that making decisions now about events far in the future is a pointless and expensive exercise, as most of the books in the list would go unread.</p>
<h2>The Agile Approach</h2>
<ol>
<li>Decide how far ahead you want to plan &#8211; far enough to avoid running out of books to read, but not so far as to make change costly.</li>
<li>Make a <em>much shorter</em> list of books to read.</li>
<li>Prioritize the list.</li>
<li>Buy the first few books in the list.</li>
<li>Keep updating this shortlist as your interests change and new books are published.</li>
</ol>
<p>This approach has the advantage of having less overhead to maintain (a few books instead of 2,000), cheaper (less cost and inventory up front) and more flexibility (the list can change more easily over time).</p>
<h2>Don&#8217;t plan in detail too far ahead, but be prepared for change</h2>
<p>On many software projects, we are asked to plan iterations and projects months and even years into the future. This is as foolish as planning your reading list far in advance.</p>
<p>Just as most of the 2,000 books in our waterfall reading list would probably go unread, by the time we get to the end of a long software project, we know so much more about what we need to do and so much has changed that a lot of the later detailed planning has to be completely redone as it is worthless and out of date.</p>
<p>I&#8217;m not saying it&#8217;s worthless to have <em>high level</em> plans &#8211; in fact this is really important. We need to know if certain things have to be lined up ahead of time (for example communicating release plans and outages, getting users trained, making sure other teams are ready for the downstream affects of our changes) and we need to know when the last responsible moment to make those decisions will be.</p>
<p>We also often need to provide our customers with a ballpark idea of the costs and schedule of a project (is it a week? a month? a year?) before the project begins, but we shouldn&#8217;t treat this as being cast in stone. The plan has to be flexible enough to change with the landscape. The cost and schedule estimates need to be improved and updated as time goes on, as uncertainties about the project are reduced (I&#8217;ll write more about this in another blog post).</p>
<p>While a high level plan is a good thing, what is foolish is detailed design, task planning, assignment and estimating for items far in the future of a project. While this may give the illusion of control and predictability, it is just that: an illusion. In fact it&#8217;s harmful to have that level of detail because the more design artifacts and task details that need to change in a project, the higher the overhead of maintaining these details and the more rigid the project will become.</p>
<p>Just like keeping your reading list short and easy to change, you should keep your iterations and detailed project plan short. This will give you a flexible plan that can adapt as the project progresses.</p>
<p>For more ideas about shrinking your iterations, see <a href="http://www.ext-it.com/2010/blog/the-shortest-amount-of-time-that-could-possibly-work-shrinking-your-iterations.html" target="_self">my recent blog post</a> on the topic.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ext-it.com/2010/blog/the-waterfall-approach-to-reading.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

