<?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>Green Folly<title>&#187; Software Development</title>
</title>
	<atom:link href="http://ericharrigan.com/blog/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://ericharrigan.com/blog</link>
	<description></description>
	<lastBuildDate>Sun, 08 Aug 2010 04:34:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>The importance of trust in Agile teams</title>
		<link>http://ericharrigan.com/blog/software-development/the-importance-of-trust-in-agile-teams/</link>
		<comments>http://ericharrigan.com/blog/software-development/the-importance-of-trust-in-agile-teams/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 17:32:15 +0000</pubDate>
		<dc:creator>greenguy</dc:creator>
				<category><![CDATA[Product]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://ericharrigan.com/blog/?p=65</guid>
		<description><![CDATA[I came across an old post at On Agile concerning the importance of trust within Agile teams. You should read it in full (go ahead, I&#8217;ll wait).  Trust is such an important aspect of any relationship that without it, your relationships are being built on a foundation of sand and you will not get far. [...]]]></description>
			<content:encoded><![CDATA[<p>I came across an old post at <a href="http://on-agile.blogspot.com/2006/10/trust-vs-camaraderie.html" target="_blank">On Agile</a> concerning the importance of trust within Agile teams. You should read it in full (go ahead, I&#8217;ll wait).  Trust is such an important aspect of any relationship that without it, your relationships are being built on a foundation of sand and you will not get far.</p>
<p>Within your team, do you see the following characteristics:</p>
<ul>
<li>When something goes wrong, the first question is &#8220;Who messed up?&#8221; rather than &#8220;How do we learn from this and stop it from happening again?&#8221;?</li>
<li>Is documentation created as a way to defend against the &#8220;Who messed up?&#8221; question being asked in the future?</li>
<li>Are individuals focused on ensuring they do not mess up rather than ensuring that the team&#8217;s commitments are being met?</li>
<li>Are individuals afraid to take action on bold ideas because they are too concerned about what will happen if the idea hits some roadbumps on the way to implementation?</li>
</ul>
<p>Even if you are best buds with the members of your team, if the type of characteristics above are present, you do not have a sufficient level of trust to function as a team.  As a result, productivity is taking hit and you are probably focused on tasks that are more about process adherence rather than product improvement/innovation.</p>
<p>Do you find yourself in this type of gloomy situation?  While team members themselves can focus on avoiding &#8220;CYA&#8221; type of behavior, your managers can have the biggest positive impact on the situation.  Imagine if a team meeting is called and the key managers come in and say &#8220;Going forward, we do not care if mistakes occur.  However, we do care about you learning from your mistakes and improving.  In addition, we care about you meeting your commitments more than having the proper paper trail&#8221;.  Now imagine when the first mistake after this meeting occurs and managment follows through on their statements!  By establishing the fact that  continuous improvement is valued over the blame game, teams are now enabled to build a trusting environment for themselves.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericharrigan.com/blog/software-development/the-importance-of-trust-in-agile-teams/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Well why didn&#8217;t you say so?</title>
		<link>http://ericharrigan.com/blog/software-development/well-why-didnt-you-say-so/</link>
		<comments>http://ericharrigan.com/blog/software-development/well-why-didnt-you-say-so/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 03:17:58 +0000</pubDate>
		<dc:creator>greenguy</dc:creator>
				<category><![CDATA[Product]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://ericharrigan.com/blog/?p=54</guid>
		<description><![CDATA[I have been lobbying for a key addition to our product to allow us to optimize traffic that comes to our site via a very distinct channel.  To date, this  channel has shown an extremely dramatic increase in traffic to our site (year over year) &#8211; without us optimizing the experience for the user or [...]]]></description>
			<content:encoded><![CDATA[<p>I have been lobbying for a key addition to our product to allow us to optimize traffic that comes to our site via a very distinct channel.  To date, this  channel has shown an extremely dramatic increase in traffic to our site (year over year) &#8211; without us optimizing the experience for the user or having a distinct message for this channel.</p>
<p>Up until today, I had not gained much traction in getting the changes approved.  However, after I stated the opportunity as &#8220;we pay people to manage channel X.  This other channel that we do nothing with and serve a &#8220;hostile&#8221; user experience to accounts for 1.5 times the traffic of channel X.&#8221;, people took notice.   Once the opportunity was stated in a way that used easy to understand measurements, the initiative moved from the back burner to &#8220;how do we fix this?&#8221;.</p>
<p>This change in direction would not have been possible without a proper web analytics platform being in place.  However, even if you have the &#8220;best in class&#8221; tool in place, it means nothing if you do not actively research and leverage the data being delivered to you on an ongoing basis.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericharrigan.com/blog/software-development/well-why-didnt-you-say-so/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using DbFit and Fit fixtures on the same FitNesse page</title>
		<link>http://ericharrigan.com/blog/software-development/using-dbfit-and-fit-fixtures-on-the-same-fitnesse-page/</link>
		<comments>http://ericharrigan.com/blog/software-development/using-dbfit-and-fit-fixtures-on-the-same-fitnesse-page/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 00:51:18 +0000</pubDate>
		<dc:creator>greenguy</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[DbFit]]></category>
		<category><![CDATA[Fit]]></category>
		<category><![CDATA[FitNesse]]></category>
		<category><![CDATA[transaction management]]></category>

		<guid isPermaLink="false">http://ericharrigan.com/blog/?p=49</guid>
		<description><![CDATA[A situation has come up at work where I want to use DbFit to test some business logic that is stored in stored procedures.  This is part of our company&#8217;s overall effort to reduce technical debt and to get all parties (Product, QA, Dev) talking the same language about our product&#8217;s features. DbFit provides a [...]]]></description>
			<content:encoded><![CDATA[<p>A situation has come up at work where I want to use <a href="http://gojko.net/fitnesse/dbfit/" title="DbFit" target="_blank">DbFit</a> to test some business logic that is stored in stored procedures.  This is part of our company&#8217;s overall effort to reduce technical debt and to get all parties (Product, QA, Dev) talking the same language about our product&#8217;s features.</p>
<p>DbFit provides a lightweight and quick way to test this logic.  One of the many benefits of DbFit is that, if you connect to the database in flow mode, DBFit will do transaction management for you.  The <a href="http://www.fitnesse.info/dbfit:reference:integrationtests:connectingtothedatabase" title="DbFit documentation" target="_blank">DbFit documentation</a> states that when you are in flow mode, &#8220;the current transaction is automatically rolled back at the end of the page&#8221;.  The alternative to flow mode is standalone mode.  In standalone mode, you need to specify when you want to commit or rollback the transactions (using the DatabaseEnvironment fixture).  In both flow mode and standalone mode, the transaction automatically starts when you connect to the database.</p>
<p>As I was building my DbFit tests, I realized I needed to set up some test data beforehand in the database so that the stored procedure could operate on the test data.  In addition, I would need to delete this data when my test completed so that the test did not leave a footprint.  In my case, I needed to set up a full customer account.  To do this, about 16 tables need data inserted into them.  While I could add all the necessary sql statements to the DbFit test in order to add this data, my group and I had previously created Fit sequence fixtures that we use in other areas that take care of setting up and tearing down a test customer account.  These Setup/Teardown fixtures were already in use in the more &#8220;traditional&#8221; parts of our FitNesse test suite where the bulk of test pages have been created.</p>
<p>At this point, I am feeling pretty good.  I have a Fit fixture library that can be used to set up a full account and I have DbFit tests that can operate on the test data via the respective stored procedures under test.</p>
<p>However, using database aware Fit fixtures and DbFit fixtures on the same page opens up a slightly thorny issue.  The DbFit tests were originally created to connect in flow mode in order to take advantage of the built in transaction management.    The Fit sequence fixtures I used also created transactions.  As a result, it became very important for me to know what DbFit considers the &#8220;end of the page&#8221;.</p>
<p>Consider the following flow of my test.  In this example, each line also has a reference to what transaction the statements will run in.</p>
<p><strong>MyAwesomeDbFitTest.SetUp</strong><br />
DBFit:  connect to database in flow mode (TRANSACTION 1)<br />
DBFit: set up a small piece of test data  (TRANSACTION 1)<br />
Fit Fixture:  set up full test customer  (TRANSACTION 2)</p>
<p><strong>MyAwesomeDbFitTest</strong></p>
<p>DbFit:  run queries, execute stored procs, other testing (TRANSACTION 1)</p>
<p><strong>MyAwesomeDbFitTest.TearDown</strong><br />
Fit Fixture:  teardown the full test customer (TRANSACTION 3)</p>
<p>If DbFit considers the test page &#8220;the end&#8221;,  I am ok.  The DBFit transaction will be rolled back and will not collide with the statements running in Transaction 3 when the Fit fixture is looking to teardown the test account in the database.</p>
<p>However, what I found is that DbFit considers the TearDown page (whether it is a TearDown page for just that page or a TearDown page at the Suite level that is used for each test) as part of the test and thus my overall test started to create blocks in the DB.  Specifically, TRANSACTION 1 was blocking TRANSACTION 3.</p>
<p>As I wondered how long it would be before the DBA police came to my door and revoked my access rights due to the blocks my tests were creating (it was all in a DEV environment, I swear!), I started to think about what I could do to solve this issue.  I thought of two options:</p>
<p>1.  Port the Fit Fixture setup/teardown code to sql statements that could be executed as DbFit fixtures.  This was quickly discarded due the fact that I am not keen on maintaining two copies of code that do essentially the same thing.</p>
<p>2.  Drop into standalone mode for the DbFit tests so I can maintain a tighter level of control as to when the transactions rollback/commit.</p>
<p>After experimenting with option 2, I found that the following test flow will allow for the transactions to commit/rollback as needed and not create any blocks.</p>
<p><strong>MyMoreAwesomeDbFitTest.SetUp</strong><br />
DBFit:  connect to database in standalone mode (TRANSACTION 1)<br />
DBFit: set up a small piece of test data  (TRANSACTION 1)<br />
Fit Sequence Fixture:  set up full test customer  (TRANSACTION 2)</p>
<p><strong>MyMoreAwesomeDbFitTest</strong><br />
DbFit:  run queries, execute stored procs, other testing (TRANSACTION 1)</p>
<p><strong>MyMoreAwesomeDbFitTest.TearDown</strong><br />
DbFit:  issue rollback statment via the DatabaseEnvironment fixture (TRANSACTION 1)<br />
Fit Sequence Fixture:  teardown the full test customer (TRANSACTION 3)</p>
<p>After making the necessary tweaks, the tests ran fine.  However, I still have concerns about the maintainability of this approach.  In order  for other developers to leverage this pattern, they need to understand when the transactions are being created and they need to explicitly manage the transactions.  This is not optimal.  Ideally, a FitNesse page will contain only one type of database aware fixtures, DbFit or homegrown Fit fixtures.  By doing this, transaction management can be pushed to the background and the developer can focus on test writing.</p>
<p>In an ideal world of my own making, another DbFit fixture would be available called QueryUsingFile (this is in addition to the free beer that would be present in this ideal world as well).  It would allow me to specify a path to a file and would execute the SQL statements within the file.  By doing this, I could organize a set of scripts to be used by any DbFit test and I could keep the test page code to a minimum.  DbFit already has a ConnectUsingFile option so it  seems a QueryUsingFile fixture would not be a big leap.</p>
<p>If I get a chance, I&#8217;ll post a sanitized version of the DbFit test that illustrates the pattern above.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericharrigan.com/blog/software-development/using-dbfit-and-fit-fixtures-on-the-same-fitnesse-page/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Learning Agile:  dev and qa (living in harmony)</title>
		<link>http://ericharrigan.com/blog/software-development/learning-agile-dev-and-qa-living-in-harmony/</link>
		<comments>http://ericharrigan.com/blog/software-development/learning-agile-dev-and-qa-living-in-harmony/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 16:30:19 +0000</pubDate>
		<dc:creator>greenguy</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://ericharrigan.com/blog/?p=4</guid>
		<description><![CDATA[I have been catching up on reading some blog posts and came across a couple at Damon Poole&#8217;s site that cover exactly what I have been pondering in the last week. (see the posts Part 1 and Part 2). Namely, how the heck should QA function when you are following an Agile development methodology. In [...]]]></description>
			<content:encoded><![CDATA[<p>I have been catching up on reading some blog posts and came across a couple at Damon Poole&#8217;s site that cover exactly what I have been pondering in the last week.  (see the posts <a href="http://damonpoole.blogspot.com/2007/05/role-of-qa-in-agile-development-project.html">Part 1</a> and <a href="http://damonpoole.blogspot.com/2008/01/chinese-finger-trap-part-ii.html" target="_blank">Part 2</a>).  Namely, how the heck should QA function when you are following an Agile development methodology.  In the last project at work, we adopted an Agilefall approach midstream where the requirements were first &#8220;baked&#8221; and then dev set out implementing the requirements in a iterative fashion.  A short QA cycle following the three dev cycle occurred.   QA became most engaged after feature development ended.  They would execute manual/automated tests and report bugs.  Fixes for the bugs would surface in the next interation.</p>
<p>Of course, as anyone who has built software knows, requirements are never &#8220;baked&#8221;.  This is not the fault of the requirement gatherers, the end users, QA,  or Dev.  Just like you can bet on the sun rising every morning, you can rest assured that requirements will always change.  The question is, how do you handle it?  Waterfall dictates you need change control to control/prioritize/approve the changes.  From what I know about Agile (I have only been looking into it for the last 9 months), you get around the changing requirements by <strong>embracing</strong> the fact that they change.  A small,  cross functional group work very closely together to build the features and release.</p>
<p>For Dev and QA, this approach can be a tad unsettling if  the Waterfall approach was used when they &#8220;cut their teeth&#8221; earlier in their careers.  To get the most out of QA in an Agile shop, they should be engaged tightly with Dev from Day 1.  Damon lists some great ways for this to be accomplished.  Examples include having QA check the quality and coverage of the unit/integration tests.  This alone would have gone a long way to helping our product achieve high levels of quality earlier.  In addition, QA can work to build automated tests as well to test specific areas.</p>
<p>In the tail end of the project I mentioned above, we started to adopt some of these ideas.  Two developers and a QA person teamed up to tackle a complex, brittle area of the system.  They looked to find issues that fell into the categories of &#8220;it blows up when you do this&#8221;, &#8220;it works but could work better this way&#8221;, &#8220;this is missing&#8221;, etc.  Close, daily contact on this small team led to rapid improvement in the quality of that area of the system and it engaged QA in a positive manner.  It came close to fulfilling the idea of involving QA from the start.</p>
<p>As we move into a lessons learned phase for this project that goes live tomorrow, this relationship between QA and Dev will most likely help drive how we approach feature development in the future.</p>
]]></content:encoded>
			<wfw:commentRss>http://ericharrigan.com/blog/software-development/learning-agile-dev-and-qa-living-in-harmony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
