<?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>Bit Motif</title>
	<atom:link href="http://www.bitmotif.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bitmotif.com</link>
	<description>A Zero Here, A One There</description>
	<lastBuildDate>Tue, 11 May 2010 10:23:20 +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>What A Little Communication Can Do</title>
		<link>http://www.bitmotif.com/development/what-a-little-communication-can-do/</link>
		<comments>http://www.bitmotif.com/development/what-a-little-communication-can-do/#comments</comments>
		<pubDate>Tue, 11 May 2010 10:23:20 +0000</pubDate>
		<dc:creator>pjberry</dc:creator>
				<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://www.bitmotif.com/?p=57</guid>
		<description><![CDATA[Over the last few weeks, my team has spent time refocusing on communication within the team as well as with our customer proxy. For various reasons, we had become a very siloed. There was little communication with our customer and only little more communication between team members&#8211;primarily among individuals that had to make their pieces [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last few weeks, my team has spent time refocusing on communication within the team as well as with our customer proxy.  For various reasons, we had become a very siloed.  There was little communication with our customer and only little more communication between team members&#8211;primarily among individuals that had to make their pieces of code talk to each other. </p>
<p>We&#8217;ve gone back to tasking out work on a regular basis.  In the course of doing this, we all are talking about what&#8217;s there, what&#8217;s needed, what we understand, what we don&#8217;t understand.  With this, we were able to figure out what we could comfortably commit to.  Then, we worked with our customer proxy while we developed.  This was done in conjunction with our normal code review/refactoring sessions.  Lo and behold, the iteration went smoothly.  </p>
<p>I hope the rest of the team feels the same way.  I know from a lead/senior development perspective, it was less painful (almost fun!) than previous iterations.  I&#8217;d almost forgot what a little communication can do.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitmotif.com/development/what-a-little-communication-can-do/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing Tools Need To Be Sharp</title>
		<link>http://www.bitmotif.com/development/testing-tools-need-to-be-sharp/</link>
		<comments>http://www.bitmotif.com/development/testing-tools-need-to-be-sharp/#comments</comments>
		<pubDate>Mon, 03 May 2010 10:54:53 +0000</pubDate>
		<dc:creator>pjberry</dc:creator>
				<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://www.bitmotif.com/?p=25</guid>
		<description><![CDATA[Too often, I hear people say &#8220;It&#8217;s test code, don&#8217;t worry about it.&#8221; Well, I disagree. I think the quality of your test code is reflective of the code base in general. The same issues that we have have with the test code we will have with production code. If you see duplication, high complexity, [...]]]></description>
			<content:encoded><![CDATA[<p>Too often, I hear people say &#8220;It&#8217;s test code, don&#8217;t worry about it.&#8221;  Well, I disagree.  I think the quality of your test code is reflective of the code base in general.  The same issues that we have have with the test code we will have with production code.  If you see duplication, high complexity, low cohesion, etc. in the tests, odds are you are going to see it in the production code base.</p>
<p>The tests and the supporting code need to be well factored.  If a &#8220;small&#8221;  change in the production code is going to result in a large amount of painful changes in test code we are less likely to make the proper changes.  And thus begins the downward slide.  </p>
<p>It is better to apply DRY and SOLID principles every time we write test code.  We get more time practicing the discipline needed to write quality code, and we set ourselves up for an easier time in the future.     </p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitmotif.com/development/testing-tools-need-to-be-sharp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Declarative Programming And Testing</title>
		<link>http://www.bitmotif.com/uncategorized/declarative-programming-and-testing/</link>
		<comments>http://www.bitmotif.com/uncategorized/declarative-programming-and-testing/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 16:01:26 +0000</pubDate>
		<dc:creator>pjberry</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bitmotif.com/?p=39</guid>
		<description><![CDATA[I delcare that this sentence is false. When I hear something like &#8220;We don&#8217;t need to test it. It&#8217;s declarative.&#8221;, I cringe. Sometimes it&#8217;s true, sometimes not. Like most engineering decisions, It&#8217;s really a matter of context, a matter of risk and effort. Computers do what you tell them to do. How do you know [...]]]></description>
			<content:encoded><![CDATA[<p><em>I delcare that this sentence is false.</em></p>
<p>When I hear something like &#8220;We don&#8217;t need to test it.  It&#8217;s declarative.&#8221;, I cringe.  Sometimes it&#8217;s true, sometimes not.  Like most engineering decisions, It&#8217;s really a matter of context, a matter of risk and effort. </p>
<p>Computers do what you tell them to do.  How do you know that what you are telling them to do is the right thing?  Sometimes the issue is that the computer is doing exactly as you declared!  We need to keep that in mind when we think &#8220;Oh, don&#8217;t worry about that.  It&#8217;s declarative.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitmotif.com/uncategorized/declarative-programming-and-testing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Software Commons</title>
		<link>http://www.bitmotif.com/agile/a-software-commons/</link>
		<comments>http://www.bitmotif.com/agile/a-software-commons/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 11:25:17 +0000</pubDate>
		<dc:creator>pjberry</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://www.bitmotif.com/development/a-software-commons/</guid>
		<description><![CDATA[Where are the places where all stakeholders can meet? Not a physical place, but artifacts, tools, etc. Assuming that our stakeholders are comprised of customers, developers, testers, database, support, and deployment working in their own silos, what is the common ground between any two? Worst case: Customer Developer Tester Database Suppport Customer - Requirements Requirements [...]]]></description>
			<content:encoded><![CDATA[<p>Where are the places where all stakeholders can meet?  Not a physical place, but artifacts, tools, etc.</p>
<p>Assuming that our stakeholders are comprised of customers, developers, testers, database, support, and deployment working in their own silos, what is the common ground between any two?</p>
<p>Worst case:</p>
<table style="border:1px solid gray;" border="1"  cellpadding="2" cellspacing="0">
<tr>
<td></td>
<td align="center">Customer</td>
<td align="center">Developer</td>
<td align="center">Tester</td>
<td align="center">Database</td>
<td align="center">Suppport</td>
</tr>
<tr>
<td>Customer</td>
<td align="center">-</td>
<td align="center">Requirements</td>
<td align="center">Requirements</td>
<td align="center">Requirements</td>
<td align="center">Requirements</td>
</tr>
<tr>
<td>Developer</td>
<td align="center">Application</td>
<td align="center">-</td>
<td align="center">Application</td>
<td align="center">DB Schema</td>
<td align="center">Application</td>
</tr>
<tr>
<td>Tester</td>
<td align="center">Bug Report</td>
<td align="center">Bug Report</td>
<td align="center">-</td>
<td align="center">Bug Report</td>
<td align="center">Bug Report</td>
</tr>
<tr>
<td>Database</td>
<td align="center">DB Schema</td>
<td align="center">DB Schema</td>
<td align="center">DB Schema</td>
<td align="center">-</td>
<td align="center">DB Schema</td>
</tr>
<tr>
<td>Support</td>
<td align="center">Application</td>
<td align="center">Application</td>
<td align="center">Application</td>
<td align="center">DB Schema</td>
<td align="center">-</td>
</tr>
</table>
<p>We can see that in a worst-case, siloed organization, the conduit for communication can differ.  Even between two stake holders, the conduit can differ depending on the flow of information (e.g., the conduit between Customer and Support is not the same as Support and Customer).  Each conduit is a chance for miscommunication.  </p>
<p>So, the common ground between any two can vary.  What if we have an idea or issue that spans several silos?  More and possibly very different artifacts will have to be taken into account.  Because these artifacts were created by different groups, there&#8217;s a good chance there is going to be miscommunication and wasted effort.</p>
<p>Now, let&#8217;s tweak the terms like &#8220;Requirements&#8221;, &#8220;Application&#8221;, &#8220;Bug Report&#8221;, and &#8220;DB Schema&#8221; for a best-case description of said artifacts/conduits:  </p>
<blockquote><p>
<strong>Requirements: </strong>Description of what the Application should do with runnable examples and text<br />
<strong>Application:  </strong>The system that will be deployed for users, as well as all the tests, set up scripts, etc<br />
<strong>Bug Report:  </strong>Automated, report-as-soon-as-you-find-it test failure<br />
<strong>DB Schema: </strong>The DDL and DML used in the database in support of the Application
</p></blockquote>
<p>What we really need is something that takes the best-case description of the artifacts and holds them in a common area for all of the stake holders.  This common area would be the spot where we all can talk the same talk, manipulate the necessary artifacts, and if need be, see the appropriate &#8220;view&#8221; (as a Customer, as Tester, etc&#8230;) of the software as a whole.</p>
<p>Where/what is this commons?  Well, it doesn&#8217;t fully exist yet.  Things like <a href="http://fit.c2.com/">Fit</a>, <a href="http://fitnesse.org/">FitNesse</a>, and BDD almost get us there.  The next generation of tools such as <a href="http://studios.thoughtworks.com/twist-agile-test-automation/">Twist</a> get us even closer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitmotif.com/agile/a-software-commons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extension is about Consumption</title>
		<link>http://www.bitmotif.com/development/extension-is-about-consumption/</link>
		<comments>http://www.bitmotif.com/development/extension-is-about-consumption/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 10:59:00 +0000</pubDate>
		<dc:creator>pjberry</dc:creator>
				<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://www.bitmotif.com/uncategorized/extension-is-about-consumption/</guid>
		<description><![CDATA[The next time you are about to extend a class, stop and think about who is going to be consuming this extended class. If the extended class (instead of the base class) is in the contract amongst collaborators, why the extension? If, somewhere along the line, you want your extended class to be used (consumed) [...]]]></description>
			<content:encoded><![CDATA[<p>The next time you are about to extend a class, stop and think about who is going to be consuming this extended class.  If the extended class  (instead of the base class) is in the contract amongst collaborators, why the extension? </p>
<p>If, somewhere along the line, you want your extended class to be used (consumed) as the base class, go ahead and extend.  If that isn&#8217;t the case, then maybe composition should be preferred.</p>
<p>It really comes down to this:</p>
<blockquote><p>
Extension is about consumption.
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.bitmotif.com/development/extension-is-about-consumption/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Disconnect!</title>
		<link>http://www.bitmotif.com/development/disconnect/</link>
		<comments>http://www.bitmotif.com/development/disconnect/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 10:54:46 +0000</pubDate>
		<dc:creator>pjberry</dc:creator>
				<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://www.bitmotif.com/development/disconnect/</guid>
		<description><![CDATA[Quick&#8211;how many of your tests would fail if you were not connected to a network (for database, files, services, etc)? How many of these are labeled as &#8220;unit tests&#8221;? Do you have a way of quickly determining which tests are dependent upon that network connection? Can you easily run all the tests that aren&#8217;t dependent [...]]]></description>
			<content:encoded><![CDATA[<p>Quick&#8211;how many of your tests would fail if you were not connected to a network (for database, files, services, etc)?  How many of these are labeled as &#8220;unit tests&#8221;?</p>
<p>Do you have a way of quickly determining which tests are dependent upon that network connection?  Can you easily run all the tests that aren&#8217;t dependent upon the network?  Do you find that there are errors/failures in surprising areas?</p>
<p>Try it and see.  You may learn something interesting about your code&#8217;s dependencies.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitmotif.com/development/disconnect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Purge!</title>
		<link>http://www.bitmotif.com/development/purge/</link>
		<comments>http://www.bitmotif.com/development/purge/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 12:01:16 +0000</pubDate>
		<dc:creator>pjberry</dc:creator>
				<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://www.bitmotif.com/uncategorized/purge/</guid>
		<description><![CDATA[Quick&#8211;when was the last time you just deleted the directory for you project(s)? Could you do it right now without any problems? What would you need to recreate your set up? Once you have your setup, it seems pointless to spend any more time trying to make it easier/faster to create said setup. And maybe [...]]]></description>
			<content:encoded><![CDATA[<p>Quick&#8211;when was the last time you just deleted the directory for you project(s)?  Could you do it right now without any problems?  What would you need to recreate your set up?</p>
<p>Once you have your setup, it seems pointless to spend any more time trying to make it easier/faster to create said setup.  And maybe it is for *you*.  But, the next person coming along probably won&#8217;t consider it pointless.</p>
<p>Be hardcore.  Purge that stuff right now and see what you need to do to get going again.  You&#8217;ll find out quickly what you (and your new team member, your CI, your deployment team, etc) need.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitmotif.com/development/purge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First Principles</title>
		<link>http://www.bitmotif.com/agile/first-principles/</link>
		<comments>http://www.bitmotif.com/agile/first-principles/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 11:30:02 +0000</pubDate>
		<dc:creator>pjberry</dc:creator>
				<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://www.bitmotif.com/uncategorized/first-principles/</guid>
		<description><![CDATA[I was talking to a friend the other day about agile philosophy and practices. We were talking about priniciples leading to actions, which in turn, lead to other principles. He related an opinion he had received regarding the most important agile principle: A commitment to continual improvement Or taken from the Principles behind the Agile [...]]]></description>
			<content:encoded><![CDATA[<p>I was talking to a friend the other day about agile philosophy and practices.  We were talking about priniciples leading to actions, which in turn, lead to other principles.</p>
<p>He related an opinion he had received regarding the most important agile principle:</p>
<blockquote><p>A commitment to continual improvement</p></blockquote>
<p>Or taken from the <a href="http://agilemanifesto.org/principles.html">Principles behind the Agile Manifesto:</a></p>
<blockquote><p>
At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.
</p></blockquote>
<p>I believe that if we are serious about producing software that meets our customers&#8217; needs, all other practices and ideas can be traced back to this.  If you can&#8217;t trace a practice back to continual improvement, or if a practice/principle leads to an improvement, but cannot be extended, then you aren&#8217;t going to see real, lasting, long-term improvement.</p>
<p>Too often, when we tackle a larger-scale problem&#8211;say something that is at a multi-team level&#8211;we don&#8217;t keep the idea of continual improvement in mind.  Decisions are made that don&#8217;t take into account that we want to be able to improve even more sometime in the future.  This leads to periods of improvement, followed by a plateau, followed by some backtracking, and then a new improvement.  </p>
<p>If we want to reduce this plateau/backtracking, we must keep in mind that we want our decisions to be in accordance with our need to constantly improve.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitmotif.com/agile/first-principles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DRY &#8212; Not just for code</title>
		<link>http://www.bitmotif.com/agile/dry-not-just-for-code/</link>
		<comments>http://www.bitmotif.com/agile/dry-not-just-for-code/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 11:49:41 +0000</pubDate>
		<dc:creator>pjberry</dc:creator>
				<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://www.bitmotif.com/agile/dry-not-just-for-code/</guid>
		<description><![CDATA[Don&#8217;t repeat yourself. It is a great advice for writing code. However, it isn&#8217;t the only place it is applicable. Let&#8217;s look at a super simple description of software development roles and their artifacts: Customer: requirements, acceptance tests Developer: code, unit tests, module tests, acceptance tests Tester: module tests, acceptance tests See the overlap? If [...]]]></description>
			<content:encoded><![CDATA[<p>Don&#8217;t repeat yourself.  It is a great advice for writing code.  However, it isn&#8217;t the only place it is applicable.</p>
<p>Let&#8217;s look at a super simple description of software development roles and their artifacts:</p>
<blockquote><p>
Customer:  requirements, acceptance tests<br />
Developer:  code, unit tests, module tests, acceptance tests<br />
Tester:  module tests, acceptance tests
</p></blockquote>
<p>See the overlap?  If customers, developers, and testers aren&#8217;t working together, we are creating waste through duplication.  Even if we are working together, we can do better.  </p>
<p>What if worked in such a way that the customer requirements can be run as the acceptance tests and acceptance tests can be viewed as customer requirements?  What if architectural requirements can be run as unit tests or module tests?  Or, vice-versa?</p>
<p>You can see where I am going with this.  We are still creating a lot of waste because of duplication.  If we can work within some framework (that doesn&#8217;t necessarily mean a tool) that seamlessly allows us to have requirements as tests and the other way around, and reuse tests between customers, testers, and developers, we can make some real gains in efficiency.</p>
<p>Furthermore, working in this manner reduces duplication in communication.  Everybody is working with the same &#8220;stuff&#8221;.  This &#8220;stuff&#8221; serves as documentation as to the expected behavior and real behavior of the system.  There should be less time spent talking about the same thing amongst the various roles.</p>
<p>We are all essentially working on the same &#8220;stuff&#8221;.  So, why not act like it and identify areas of duplication and reuse?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitmotif.com/agile/dry-not-just-for-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JBehave/Selenium Example</title>
		<link>http://www.bitmotif.com/java/jbehaveselenium-example/</link>
		<comments>http://www.bitmotif.com/java/jbehaveselenium-example/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 12:21:24 +0000</pubDate>
		<dc:creator>pjberry</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.bitmotif.com/java/jbehaveselenium-example/</guid>
		<description><![CDATA[In a previous post I went through the mechanics of creating a simple JBehave test. This time around, I want to do something a little more &#8220;real&#8221;. So, let&#8217;s make another simple example that uses Selenium. That way, we have real feel for the mechanisms we would use. We&#8217;ll start once again with our scenario: [...]]]></description>
			<content:encoded><![CDATA[<p>In a <a href="http://www.bitmotif.com/java/jbehave-rave/">previous post</a> I went through the mechanics of creating a simple JBehave test.  This time around, I want to do something a little more &#8220;real&#8221;.</p>
<p>So, let&#8217;s make another simple example that uses Selenium.  That way, we have real feel for the mechanisms we would use.</p>
<p>We&#8217;ll start once again with our scenario:</p>
<blockquote><p>
Given I am on &#8220;http://www.bitmotif.com&#8221;<br />
When I click on link &#8220;Test Page For Selenium Remote Control&#8221;<br />
Then the title is &#8220;Bit Motif » Test Page For Selenium Remote Control&#8221;
</p></blockquote>
<p>This scenario needs to be saved in a file named &#8220;navigation_scenario&#8221;.  </p>
<p>Using the same approach we took in the previous post, we&#8217;ll create our scenario: </p>
<blockquote>
<pre>
package com.bitmotif.jbehaveexamples.part.two;

import org.jbehave.scenario.Scenario;

public class NavigationScenario extends Scenario {
   public NavigationScenario() {
      super(new NavigationScenarioSteps());
   }
}
</pre>
</blockquote>
<p>And, we&#8217;ll create our scenario steps:  </p>
<blockquote>
<pre>
package com.bitmotif.jbehaveexamples.part.two;

import org.jbehave.scenario.steps.Steps;
import org.jbehave.scenario.annotations.*;
import org.junit.Assert;

public class NavigationScenarioSteps extends Steps {
   private SystemUnderTest system;

   @BeforeScenario
   public void startSystem() throws Exception {
      system = new SystemUnderTest();
      system.start();
   }

   @AfterScenario
   public void stopSystem() throws Exception {
      system.stop();
   }

   @Given("I am on \"$url\"")
   public void startOnUrl(String url) {
      system.open(url);
   }

   @When("I click on link \"$linkText\"")
   public void clickLink(String linkText) {
      system.clickLink(linkText);
   }

   @Then("the title is \"$title\"")
   public void checkTitle(String title) {
      Assert.assertEquals(title, system.getCurrentTitle());
   }
}
</pre>
</blockquote>
<p>This time around we need to make certain we have the ability to start and stop our system.  We annotate the starting and the stopping of the system, so we know the state of the system when we run.</p>
<p>Like I said before, we have a system under test that is &#8220;real&#8221;.  In this particular case, our system is really a pass-through to Selenium Remote Control:</p>
<blockquote>
<pre>
package com.bitmotif.jbehaveexamples.part.two;

import com.thoughtworks.selenium.Selenium;
import com.thoughtworks.selenium.DefaultSelenium;
import org.openqa.selenium.server.SeleniumServer;

public class SystemUnderTest {
   private static final String MAX_WAIT_TIME_IN_MS = "60000";
   private static final String BASE_URL = "http://www.bitmotif.com";

   private Selenium selenium =
      new DefaultSelenium("localhost", 4444, "*firefox", BASE_URL);
   private SeleniumServer seleniumServer;

   public void start() throws Exception {
      seleniumServer = new SeleniumServer();
      seleniumServer.start();
      selenium.start();
   }

   public void stop() {
      selenium.stop();
      seleniumServer.stop();
   }

   public void open(String url) {
      selenium.open(url);
   }

   public void clickLink(String linkText) {
      selenium.click("link=" + linkText);
      selenium.waitForPageToLoad(MAX_WAIT_TIME_IN_MS);
   }

   public String getCurrentTitle() {
      return selenium.getTitle();
   }
}
</pre>
</blockquote>
<p>With this in place, we can run our scenario. Tres cool.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitmotif.com/java/jbehaveselenium-example/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
