<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.1.2" -->
<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/"
	>

<channel>
	<title>Exploration Through Example</title>
	<link>http://www.exampler.com/blog</link>
	<description>Example-driven development, Agile software development, testing, Ruby, and other things of interest to Brian Marick</description>
	<pubDate>Wed, 21 May 2008 22:39:10 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.1.2</generator>
	<language>en</language>
			<item>
		<title>Everyone needs a cryptic slogan</title>
		<link>http://www.exampler.com/blog/2008/05/21/everyone-needs-a-cryptic-slogan/</link>
		<comments>http://www.exampler.com/blog/2008/05/21/everyone-needs-a-cryptic-slogan/#comments</comments>
		<pubDate>Wed, 21 May 2008 17:54:28 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2008/05/21/everyone-needs-a-cryptic-slogan/</guid>
		<description><![CDATA[I&#8217;ve been talking to Jason and Jonathan, the post-Agile guys, about post-Agile. I don&#8217;t get it, but that&#8217;s OK. What it made me realize is that a properly obscure name for the kind of software development I want to do is&#8230;

Retro-Futurist
Micro-Scale
Anarcho-Syndicalism


It is supposed to connote:




Back to giddy optimism!




Technology! Shiny!




Don&#8217;t fret about &#8220;Them&#8221;




Goals and preferences over [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been talking to <a href="http://parlezuml.com/blog/">Jason</a> and <a href="http://www.kohl.ca/blog/">Jonathan</a>, the <a href="http://parlezuml.com/blog/?postid=407">post-Agile</a> guys, about <a href="http://www.kohl.ca/blog/archives/000166.html">post-Agile</a>. I don&#8217;t get it, but that&#8217;s OK. What it made me realize is that a properly obscure name for the kind of software development I want to do is&#8230;</p>
<p style="text-align: center; font-face: futura; font-size: 200%">
<a href="http://en.wikipedia.org/wiki/Retro-futurism">Retro-Futurist</a><br />
Micro-Scale<br />
<a href="http://en.wikipedia.org/wiki/Anarcho-syndicalism">Anarcho-Syndicalism</a>
</p>
<p>
It is supposed to connote:
</p>
<ul>
<li>
<p>
Back to giddy optimism!
</p>
</li>
<li>
<p>
Technology! Shiny!
</p>
</li>
<li>
<p>
Don&#8217;t fret about &#8220;Them&#8221;
</p>
</li>
<li>
<p>
Goals and preferences over rules
</p>
</li>
<li>
<p>
We&#8217;re all in this together
</p>
</li>
</ul>
<p>
Perhaps there will be t-shirts and <a href="http://www.exampler.com/propaganda.html">posters</a> by <a href="http://www.agile2008.org/">Agile2008</a>.
</p>
<p>P.S. I use the term &#8220;anarcho-syndicalism&#8221; pretty loosely. Don&#8217;t forget the two lines of qualifiers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2008/05/21/everyone-needs-a-cryptic-slogan/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Conference of the Association of Software Testing 2008</title>
		<link>http://www.exampler.com/blog/2008/05/20/conference-of-the-association-of-software-testing-2008/</link>
		<comments>http://www.exampler.com/blog/2008/05/20/conference-of-the-association-of-software-testing-2008/#comments</comments>
		<pubDate>Tue, 20 May 2008 22:28:43 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[testing]]></category>

		<category><![CDATA[conferences]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2008/05/20/conference-of-the-association-of-software-testing-2008/</guid>
		<description><![CDATA[The third annual Conference of the Association of Software Testing (CAST) 2008 in Toronto, July 14-16. Early bird registration ends May 30. Here&#8217;s what Michael Bolton has written about it:

A colleague recently pointed out that an important mission of our community is to remind people&#8211;and ourselves&#8211;that testing doesn&#8217;t have to suck.
Well, neither do testing conferences. [...]]]></description>
			<content:encoded><![CDATA[<p>The third annual Conference of the Association of Software Testing (CAST) 2008 in Toronto, July 14-16. Early bird registration ends May 30. Here&#8217;s what <a href="http://developsense.com/blog.html">Michael Bolton</a> has written about it:</p>
<blockquote><p>
A colleague recently pointed out that an important mission of our community is to remind people&#8211;and ourselves&#8211;that testing doesn&#8217;t have to suck.</p>
<p>Well, neither do testing conferences.  CAST 2008 is the kind of conference that I&#8217;ve always wanted to attend.  The theme is &#8220;Beyond the Boundaries: Interdisciplinary Approaches to Software Testing&#8221;, and the program is incredibly eclectic and diverse.  Start with the keynotes: Jerry Weinberg on Lessons from the Past to Carry into the Future; Cem Kaner on The Value of Checklists and the Danger of Scripts: What Legal Training Suggests for Testers; Robert Sabourin (with Anne Sabourin) on Applied Testing Lessons from Delivery Room Labor Triage (there&#8217;s a related article in this month&#8217;s Better Software magazine); and Brian Fisher on The New Science of Visual Analytics.  Track sessions include talks relating testing to improv theatre (Adam White), to music (yours truly and Jonathan Kohl), to finance and accounting (Doug Hoffman), to wargaming and Darwinian evolution (Bart Brokeman, author of /Testing Embedded Software/ and one of the co-authors of the /TMap Next/ book); to civil engineering (Scott Barber), to scientific software (Diane Kelly and Rebecca Sanders), to magic (Jeremy Kominar), to file systems (Morven Gentleman), and to data warehousing (Steve Richardson and Adam Geras), and to data visualization (Martin Taylor)&#8230; to four-year-olds playing lacrosse (Adam Goucher). There will be lightning talks and a tester competition.  Jerry Weinberg will be doing a one-day tutorial workshop, as will Hung Nguyen, Scott Barber, and Julian Harty.</p>
<p>Yet another feature of the conference is that Jerry is launching his book on testing, /Perfect Software and Other Testing Myths/.  I read an early version of it, and I&#8217;m waiting for it with bated breath. It&#8217;s a book that we&#8217;ll all want to read, and after we&#8217;re done, we&#8217;ll want to hand to people who are customers of testing.  For some, we&#8217;ll want to tie them to a chair and /read it to them/.</p>
<p>The conference hotel is inexpensive, the food in Toronto is great, the nightlife is wonderful, the music is excellent&#8230;</p>
<p>More Information<br />
================<br />
You can find details on the program at <a href="http://www.cast2008.org/Program">http://www.cast2008.org/Program</a>.  </p>
<p>You can find information on the venue and logistics at <a href="http://www.cast2008.org/Venue">http://www.cast2008.org/Venue</a>.</p>
<p>Those from outside Canada should look at <a href="http://www.associationforsoftwaretesting.org/drupal/CAST2008/Venue#customs">http://www.associationforsoftwaretesting.org/drupal/CAST2008/Venue#customs</a>.</p>
<p>You can get registration information at <a href="http://www.cast2008.org/Registration">http://www.cast2008.org/Registration</a>.</p>
<p>Paying the Way<br />
==============</p>
<p>If you need help persuading your company to send you to the conference, check out this: <a href="http://www.ayeconference.com/Articles/Mycompanywontpay.html">http://www.ayeconference.com/Articles/Mycompanywontpay.html</a>.</p>
<p>And if all that fails, you can likely write off the cost of the conference against your taxes, even if you&#8217;re an employee. (I am not a tax professional, but INC magazine reports that you can write off expenses to &#8220;maintain or improve skills required in your present employment&#8221;.  Americans should see IRS Publication 970 (<a href="http://www.irs.gov/publications/p970/ch12.html">http://www.irs.gov/publications/p970/ch12.html</a>), Section 12, and ask your accountant!)</p>
<p>Come Along and Spread The Word!</p>
<p>===============================</p>
<p>So (if necessary) get your passports in order, take advantage of early bird registration (if you register in the next two weeks), and come join us.  In addition (and I&#8217;m asking a favour here), please please /please/ tell your colleagues, both in your company and outside, about CAST.  We want to share some great ideas on testing and other disciplines, and we want to make this the best CAST ever.  And the event will only be improved by your presence.</p>
<p>So again, please spread the word, and come if you can.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2008/05/20/conference-of-the-association-of-software-testing-2008/feed/</wfw:commentRss>
		</item>
		<item>
		<title>First review draft of RubyCocoa book</title>
		<link>http://www.exampler.com/blog/2008/05/15/first-review-draft-of-rubycocoa-book/</link>
		<comments>http://www.exampler.com/blog/2008/05/15/first-review-draft-of-rubycocoa-book/#comments</comments>
		<pubDate>Thu, 15 May 2008 15:53:54 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[ruby]]></category>

		<category><![CDATA[rubycocoa]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2008/05/15/first-review-draft-of-rubycocoa-book/</guid>
		<description><![CDATA[I&#8217;m ready for people to review the first draft of my RubyCocoa book. Here&#8217;s the goal of the book:

    With any complex framework, there&#8217;s a moment when you realize you finally have a feel    for it&#8212;when faced with a new problem, you&#8217;re able to    guess whether [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m ready for people to review the first draft of my RubyCocoa book. Here&#8217;s the goal of the book:</p>
<blockquote><p>
    With any complex framework, there&#8217;s a moment when you realize you finally have a <em>feel</em>    for it&mdash;when faced with a new problem, you&#8217;re able to    guess whether the framework addresses it, roughly how it    will address it, and where to look to find the    details. The aim of this book is to give you that feel for    Cocoa and RubyCocoa. [&#8230;]
</p></blockquote>
<p>You can fetch the most recent draft from <a href="http://www.exampler.com/tmp/drafts/current.dmg">http://www.exampler.com/tmp/drafts/current.dmg</a>. It&#8217;s 80-some pages and contains the first six chapters:</p>
<ul>
<li>
<p> <b>Introduction</b> </p>
</li>
<li>
<p>  <b>How Do We Get This Thing Started?</b>: A fast introduction to RubyCocoa. </p>
</li>
<li>
<p>  <b>Part 1: Building a Useful App</b></p>
<ul>
<li>
<p> <b>Working with Interface Builder and XCode</b>: Drawing a user interface, putting code behind it, and debugging that code. Text fields and text views. </p>
</li>
<li>
<p> <b>One Good App Observes Another</b>: Extending the app to use interprocess communication to listen to another app. The Cocoa Notification system. Reopening Objective-C classes. </p>
</li>
<li>
<p> <b>A Better User Interface</b>: Buttons (and the default button), combo boxes (and first responders), and a highly decoupled app architecture. </p>
</li>
<li>
<p> <b>Taking Advantage of Ruby</b>: A DSL to make it easier to define actions, delegates, and methods that post or receive notifications. </p>
</li>
</ul>
</li>
</ul>
<p>Here&#8217;s what I&#8217;d like to hear about:</p>
<ul>
<li>
<p>
Any parts you have to struggle to understand.
</p>
</li>
<li>
<p>
Parts that move too slowly or too quickly.
</p>
</li>
<li>
<p>
Whether the book is taking the right approach, or started with the right approach and has veered off track.
</p>
</li>
<li>
<p>
Problems with the code samples. Don&#8217;t struggle to fix them&mdash;let me know and let me fix them.
</p>
</li>
<li>
<p>
Whether you&#8217;d buy the book if the rest is like what you see.
</p>
</li>
</ul>
<p>
  Don&#8217;t bother with typos, grammatical errors, or layout problems (like highlighted words that run together or long identifiers that stick past the margins - those will get fixed in due time).
</p>
<p>You can send comments to me <a href="mailto:marick@exampler.com">directly</a> or via the book&#8217;s <a href="http://groups.google.com/group/rubycocoa-book">mailing list</a>. </p>
<p>Thank you.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2008/05/15/first-review-draft-of-rubycocoa-book/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Education</title>
		<link>http://www.exampler.com/blog/2008/04/20/education/</link>
		<comments>http://www.exampler.com/blog/2008/04/20/education/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 17:06:49 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[the larger world]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2008/04/20/education/</guid>
		<description><![CDATA[When I was in Middle School (~12 years old, around 1971), we did a murder mystery exercise in class. The teacher passed out slips of papers with clues and then shut up. The children milled around aimlessly for a while, comparing slips. Finally, I got fed up, got everyone&#8217;s attention, and said, &#8220;OK. Everyone with [...]]]></description>
			<content:encoded><![CDATA[<p>When I was in Middle School (~12 years old, around 1971), we did a murder mystery exercise in class. The teacher passed out slips of papers with clues and then shut up. The children milled around aimlessly for a while, comparing slips. Finally, I got fed up, got everyone&#8217;s attention, and said, &#8220;OK. Everyone with clues about the murder weapon, go over there. Everyone with clues about the victim, over there.&#8221; Then I went from group to group, and we quickly solved the mystery.</p>
<p>I learned three things that day. </p>
<ol>
<li>
<p>
Sometimes people need external organization to get things done.
</p>
</li>
<li>
<p>
I can do that organizing.
</p>
</li>
<li>
<p>
People will get mad at me when I do.
</p>
</li>
</ol>
<p>The lesson has affected my consulting. I suspect that my daughter&#8217;s homework today&mdash;identifying the parts of a knight&#8217;s armor&mdash;will not affect her future in the slightest way. Social studies no longer appears to involve the study of society. Not surprising, I suppose: too much risk of children drawing conclusions that will get their parents mad at the school, and who needs the hassle?</p>
<p>And the <a href="http://en.wikipedia.org/wiki/New_Math">New Math</a> rocked, by the way. It was good that I learned simple set theory so young, and the idea that there could be number bases other than ten was a good lesson in questioning the verities.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2008/04/20/education/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Security mindset</title>
		<link>http://www.exampler.com/blog/2008/04/19/security-mindset/</link>
		<comments>http://www.exampler.com/blog/2008/04/19/security-mindset/#comments</comments>
		<pubDate>Sat, 19 Apr 2008 14:16:49 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[agile]]></category>

		<category><![CDATA[testing]]></category>

		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2008/04/19/security-mindset/</guid>
		<description><![CDATA[A continual debate on the agile-testing mailing list is to what degree testers think differently than programmers and are therefore able to find bugs that programmers won&#8217;t. Without ever really resolving that question, the conversation usually moves onto whether the mental differences are innate or learnable.
I myself have no fixed opinion on the matter. That&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>A continual debate on the <a href="http://tech.groups.yahoo.com/group/agile-testing/">agile-testing mailing</a> list is to what degree testers <a href="http://www.io.com/%7Ewazmo/papers/testers_and_developers.pdf">think differently</a> than programmers and are therefore able to find bugs that programmers won&#8217;t. Without ever really resolving that question, the conversation usually moves onto whether the mental differences are innate or learnable.</p>
<p>I myself have no fixed opinion on the matter. That&#8217;s probably because, while vast numbers of testers are better than I am, I can imagine myself being like them and thinking like them. The same is true for programmers. In contrast, I simply can&#8217;t imagine being the sort of person who <em>really</em> cares who wins the World Cup or whether gay people I don&#8217;t know get married. (I&#8217;m not saying, &#8220;I couldn&#8217;t lower myself to their level&#8221; or anything stupid like that&mdash;I&#8217;m saying I can&#8217;t imagine what it would be like. It feels like trying to imagining <a href="http://members.aol.com/NeoNoetics/Nagel_Bat.html">what it is like to be a bat</a>.) </p>
<p>However, I&#8217;ve long thought that <em>security</em> testers are a different breed, though I can&#8217;t articulate any way that they&#8217;re different in kind rather than degree. It&#8217;s just that the really good ones are transcendentally awesome at seeing how two disparate facts about a system can be combined and exploited. (<a href="http://www.testingcraft.com/exploiting-interactions.html">A favorite example</a>)</p>
<p>Bruce Schneier has <a href="http://www.wired.com/politics/security/commentary/securitymatters/2008/03/securitymatters_0320">an essay</a> on security testers that I found interesting, though it doesn&#8217;t resolve any of my questions. Perhaps that&#8217;s because he said something I&#8217;ve been thinking for a while:</p>
<blockquote><p>
The designers are so busy making these systems work that they don&#8217;t stop to notice how they might fail or be made to fail, and then how those failures might be exploited. Teaching designers a security mindset will go a long way toward making future technological systems more secure.
</p></blockquote>
<p>The first sentence seems to make the second false. When I look back at the bugs I, acting as a programmer, fail to prevent and then fail to catch, an awful lot of the time their root cause wasn&#8217;t my knowledge. It&#8217;s that I have a compulsive personality and also habitually overcommit. As a result, there&#8217;s a lot of pressure to <em>get done</em>. The problem isn&#8217;t that I can&#8217;t flip into an adequate tester mindset, it&#8217;s that I don&#8217;t step back and <em>take the time</em>. </p>
<p>So, I suspect the interminable and seemingly irresolvable agile-testing debate should be shelved until we solve a more pressing problem: few teams have the <a href="http://www.exampler.com/discipline-and-skill.html">discipline</a> to adopt a <a href="http://industrialxp.org/sustainablePace.html">sustainable pace</a>, so few teams are even in a position to know if programmers could do as well as dedicated testers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2008/04/19/security-mindset/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Good customer test story</title>
		<link>http://www.exampler.com/blog/2008/04/06/good-customer-test-story/</link>
		<comments>http://www.exampler.com/blog/2008/04/06/good-customer-test-story/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 14:53:36 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2008/04/06/good-customer-test-story/</guid>
		<description><![CDATA[From Andy Pols: the customer who wouldn&#8217;t deploy without a test (via Keith Braithwaite).
]]></description>
			<content:encoded><![CDATA[<p>From <a href="http://www.pols.co.uk/blog/">Andy Pols</a>: the customer who <a href="http://www.pols.co.uk/archives/172">wouldn&#8217;t deploy</a> without a test (via <a href="http://peripateticaxiom.blogspot.com/">Keith Braithwaite</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2008/04/06/good-customer-test-story/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Agile Alliance academic research programme</title>
		<link>http://www.exampler.com/blog/2008/03/25/agile-alliance-academic-research-programme/</link>
		<comments>http://www.exampler.com/blog/2008/03/25/agile-alliance-academic-research-programme/#comments</comments>
		<pubDate>Tue, 25 Mar 2008 18:05:31 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2008/03/25/agile-alliance-academic-research-programme/</guid>
		<description><![CDATA[
This program aims to encourage researchers to focus on research questions and issues concerned with agile software development. Researchers are encouraged to apply for small grants to support activities such as conducting a series of visits to practitioner sites, performing interviews, supporting a researcher for a short time to extend existing work into agile development, [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
This program aims to encourage researchers to focus on research questions and issues concerned with agile software development. Researchers are encouraged to apply for small grants to support activities such as conducting a series of visits to practitioner sites, performing interviews, supporting a researcher for a short time to extend existing work into agile development, running workshops, and so on.
</p></blockquote>
<p><a href="http://www.agilealliance.org/show/1655">More here</a>.</p>
<p>The next deadline for submissions is May 31.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2008/03/25/agile-alliance-academic-research-programme/feed/</wfw:commentRss>
		</item>
		<item>
		<title>An alternative to business-facing TDD</title>
		<link>http://www.exampler.com/blog/2008/03/23/an-alternative-to-business-facing-tdd/</link>
		<comments>http://www.exampler.com/blog/2008/03/23/an-alternative-to-business-facing-tdd/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 03:34:08 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[agile]]></category>

		<category><![CDATA[exampling]]></category>

		<category><![CDATA[testing]]></category>

		<category><![CDATA[TDD]]></category>

		<category><![CDATA[aa-ftt]]></category>

		<category><![CDATA[visible workings]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2008/03/23/an-alternative-to-business-facing-tdd/</guid>
		<description><![CDATA[The value of programmer TDD is well established. It&#8217;s natural to extrapolate that practice to business-facing tests, hoping to obtain similar value. We&#8217;ve been banging away at that for years, and the results disappoint me. Perhaps it would be better to invest heavily in unprecedented amounts of built-in support for manual exploratory testing.
In 1998, I [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><i>The value of programmer TDD is well established. It&#8217;s natural to extrapolate that practice to <a href="http://www.testing.com/cgi-bin/blog/2003/08/21#agile-testing-project-1">business-facing</a> tests, hoping to obtain similar value. We&#8217;ve been banging away at that for years, and the results disappoint me. Perhaps it would be better to invest heavily in unprecedented amounts of built-in support for manual exploratory testing.</i></p></blockquote>
<p>In 1998, I wrote a paper, &#8220;<a href="http://www.testing.com/writings/automate.pdf">When should a test be automated?</a>&#8220;, that sketched some economics behind automation. Crucially, I took the value of a test to be the bugs it found, rather than (as was common at the time) how many times it could be run in the time needed to step through it manually. </p>
<p>My conclusions looked roughly like the following:</p>
<p><img src="http://www.exampler.com/blog/wp-content/uploads/2008/03/test-tradeoffs-r-1.jpg" alt="test tradeoffs in general" /></p>
<p>Scripted tests, be they automated or manual, are expensive to create (first column). Manual scripts are cheaper, but they still require someone to write steps down carefully, and they likely require polishing before they can truly be followed by someone else. (Note: height of bars not based on actual data.) </p>
<p>In the second column, I assume that a particular set of steps has roughly the same chance of finding a bug whether executed manually or by a computer, and whether the steps were planned or chosen on the fly. (I say &#8220;roughly&#8221; because computers don&#8217;t get bored and miss bugs, but they also don&#8217;t notice bugs they weren&#8217;t instructed to find.)</p>
<p>Therefore, if the immediate value of a test is all that matters, exploratory manual testing is the right choice. What about long-term value?</p>
<p>Assume that exploratory tests are never intentionally repeated. Both their long-term cost and value are zero. Both kinds of scripted tests have quite substantial maintenance costs (especially in that era, when testing was typically done through an unmodified GUI). So, to pull ahead of exploratory tests in the long term, scripted tests must have substantial bug-finding power. Many people at that time observed that, in fact, most tests either found a bug the first time they were run or never found a bug at all. You were more likely to fix a test because of an intentional GUI change than to fix the code because the test found a bug.</p>
<p>So the answer to &#8220;when should a test be automated?&#8221; was &#8220;not very often&#8221;.</p>
<p>Programmer TDD changes the balance in two ways:</p>
<p><img src="http://www.exampler.com/blog/wp-content/uploads/2008/03/test-tradeoffs-tdd-r-1.jpg"  alt="Test tradeoffs for TDD" /></p>
<ol>
<li>
<p>
New sources of value are added. Extremely rapid feedback reduces the cost of debugging. (Most bugs strike while what you did to create them is fresh in your mind.) Many people find the steady pace of TDD allows them to go faster, and that the incremental growth of the code-under-test makes for easier design. And, most importantly as it turns out, the need to make tests run fast and reduce maintenance cost leads to designs with good properties like low coupling and high cohesion. (That is, properties that previously were considered good in the long term&mdash;but were routinely violated for short-term gain&mdash;now had powerful short-term benefits.)
</p>
</li>
<li>
<p>
Good design and better programmer tools dramatically lowered the long-term cost of tests.
</p>
</li>
</ol>
<p>So, much to my surprise, the balance tipped in favor of automation&mdash;for programmer tests. It&#8217;s not surprising that many people, including me, hoped the balance could also tip for business-facing tests. Here are some of the hoped-for benefits:</p>
<ul>
<li>
<p>
Tests might <b>clarify communication</b> and avoid some cases where the business asks for something, the team thinks they&#8217;ve delivered it, and the business says &#8220;that&#8217;s not what I wanted.&#8221;
</p>
</li>
<li>
<p>
They might <b>sharpen design thinking</b>. The discipline of putting generalizations into concrete examples often does.
</p>
</li>
<li>
<p>
Programmers have learned that TDD supports <b>iterative design</b> of interfaces and behavior. Since whole products are also made of interfaces and behavior, they might also benefit from designers who react to partially-finished products rather than having to get it right up front.
</p>
</li>
<li>
<p>
Because businesses have learned to mistrust teams who show no visible progress for eight months (at which point, they ask for a slip), they might like to see <b>evidence of continuous progress</b> in the form of passing tests.
</p>
</li>
<li>
<p>
People often need documentation. Documentation is often improved by examples. Executable tests are examples. Tests as <b>executable documentation</b> might get two benefits for less than their separate costs.
</p>
</li>
<li>
<p>
And, oh yeah, tests could <b>find regression bugs</b>.
</p>
</li>
</ul>
<p>So a number of people launched off to explore this approach, most notably with Fit. But Fit hasn&#8217;t lived up to our hopes, I think. The things that particularly bother me about it are:</p>
<ul>
<li>
<p>
It works well for business logic that&#8217;s naturally tabular. But tables have proven awkward for other kinds of tests.
</p>
</li>
<li>
<p>
In part, the awkwardness is because <i>there are no decent HTML table editors</i>. That inhibits experimentation: if you don&#8217;t get a table format right the first time, you&#8217;re tempted to just leave it.
</p>
<p>
Note: I haven&#8217;t tried <a href="http://www.zibreve.com/visit.php?page=index">ZiBreve</a>. By now, I should have. I do include Word, Excel, and their OpenOffice equivalents among the ranks of the not-decent, at least if you want executable documentation. (I&#8217;ve never tried treating .doc files as the real tests that are &#8220;compiled&#8221; into HTML before they&#8217;re executed.)
</p>
</li>
<li>
<p>
Fit is not integrated into programmer editors the way xUnit is. For example, you can&#8217;t jump from a column name to the Java method that defines it. Partly for this reason, programmers tend to get impatient with people who invent new table formats&mdash;can&#8217;t they just get along with the old one?
</p>
</li>
</ul>
<p>With my <a href="http://www.exampler.com/blog/2007/07/13/graphical-workflow-tests-for-rails/">graphical tests</a>, I took aim at those sources of friction. If I have a workflow test, I can express it as boxes and arrows:</p>
<p><img class="centered" src="http://www.exampler.com/blog/wp-content/uploads/2008/03/workflow-test.jpg"  alt="a workflow test" /></p>
<p>I translate the graphical documents into ordinary xUnit tests so that I can use my familiar tools while coding. The graphical editor is pretty decent, so I can readily change tests when I get better ideas. (There are occasional quirks where test content has changed more than it looks like it has. That aspect of using Fit hasn&#8217;t gone away entirely.) </p>
<p>I&#8217;ve been using these tests, most recently on <a href="http://wevouchfor.org/">wevouchfor.org</a>&mdash;and they don&#8217;t wow me. <img class="alignright" src="http://www.exampler.com/blog/wp-content/uploads/2008/03/smallsad-r.jpg" alt="Sad" /> While I almost always use programmer TDD when coding (and often regret skipping it when I don&#8217;t), TDD with these kinds of tests is a chore. It doesn&#8217;t feel like enough of the potential value gets realized for the tests to be worth the cost. </p>
<ul style="list-style: none; margin-left: 1em; padding-left: 0; text-indent: -1em">
<li>
<p>
<b>&darr;</b> <b>Writing the executable test doesn&#8217;t help clarify or communicate design.</b> Let me be careful here. I&#8217;m a big fan of sketching things out on whiteboards or paper:
</p>
<p><img class="centered" src="http://www.exampler.com/blog/wp-content/uploads/2008/03/whiteboard.jpg" alt="A whiteboard" /></p>
<p style="text-indent: 0">
That <i>does</i> clarify thinking and improve communication. But the subsequent typing of the examples into the computer is work that rarely leads to any more design benefits.</p>
</li>
<li>
<p>
<b>&harr;</b> Passing tests do continuously <b>show progress</b> to the business, but&#8230; Suppose you demonstrate each completed story anyway, at an end-of-iteration demo or (my preference) as soon as it&#8217;s finished. Given that, does seeing more tests pass every day <i>really</i> help?
</p>
</li>
<li>
<p>
<b>&uarr;</b> Tests do serve as <b>documentation</b> (at least when someone takes the time to surround them with explanatory text, and if the form and content of the test aren&#8217;t distorted to cram a new idea into existing test formats).
</p>
</li>
<li>
<p>
<b>&uarr;</b> The word I&#8217;m hearing is that these tests are <b>finding bugs</b> more often than I expected. I want to dig into that more: if they&#8217;re the sort of &#8220;I changed this thing over here and broke that supposedly unrelated thing over there&#8221; bugs that whole-product regression tests are traditionally supposed to find, that alone may justify the expense of test automation&mdash;unless I can find a way to blame it on inadequate unit tests or a need to rejigger the app.
</p>
</li>
<li>
<p>
<b>&darr;</b> (This is the one that made me say &#8220;Eureka!&#8221;) Tests alone fail at <b>iterative product design</b> in an interesting way. Whenever I&#8217;ve made significant progress implementing the next chunk of workflow or other GUI-visible change, I just naturally check what I&#8217;ve done through the GUI. Why? This checking makes new bugs (ones the automated tests don&#8217;t check for) leap out at me. They also sometimes make me slap my forehead and say, &#8220;What I intended here was stupid!&#8221;
</p>
</li>
</ul>
<p>But if I&#8217;m going to be looking at the page for both bugs and to change my intentions, I&#8217;m really edging into exploratory testing. Hmm&#8230; What if an app did <i>whatever it could</i> to aid exploratory testing? I don&#8217;t mean traditional testability features like, say, a scripting interface; I mean a concerted effort to let exploratory testers peek and poke at <i>anything they want</i> within the app. (That may not be different than my old motto &#8220;<a href="http://www.testing.com/cgi-bin/blog/2004/03/30#debug-dump">No bug should be hard to find the second time</a>,&#8221; but it feels different.)</p>
<p>So, although features of Rails like not having to restart the server after most code changes are nice, I want more. Here&#8217;s an example. </p>
<p>The following page contains a bug:</p>
<p><img src="http://www.exampler.com/blog/wp-content/uploads/2008/03/bugpage.jpg"  alt="an ordinary web page" /></p>
<p>Although you can&#8217;t see it, the bottom two links are wrong. They are links to <code>/certifications/4</code> instead of <code>/promised_certifications/4</code>. </p>
<ol>
<li>
<p>
Unit tests couldn&#8217;t catch that bug. (The two methods that create those types of links are tested and correct; I just used the wrong one.)
</p>
</li>
<li>
<p>
One test of the action that created the page could have caught the bug, but did not. (To avoid maintenance problems, that test checked the minimum needed to convince me that the correct &#8220;certifications&#8221; had been displayed. I assumed that if they were displayed at all, the unit tests meant they were displayed correctly. That was  actually almost right&mdash;every character outside the link&#8217;s <code>href</code> value was correct.)
</p>
</li>
<li>
<p>
I missed the bug when I checked the page. (I suspect that I did click one of the links, but didn&#8217;t notice it went to the wrong place. If so, I bet I missed the wrongness because I didn&#8217;t have enough variety in the test data I set up&mdash;ironic, because I&#8217;ve been harping on the importance of &#8220;irrelevant&#8221; variety since <a href="http://www.testing.com/writings/reviews/marick-craft.html">1994</a>.)
</p>
</li>
<li>
<p>
A user had no trouble finding the bug when he tried to edit one of his promised certifications and found himself with a form for someone else&#8217;s already-accepted certification. (Had he submitted the form, it would have been rejected, but still.)
</p>
</li>
</ol>
<p>That&#8217;s my bug: a small error in a big pile of HTML the app fired and forgot.<br />
Suppose, though, that the app created and retained an object representing the page. Suppose further that an exploration support app let you switch to another view of that object/page, one that highlights link structure and downplays text:</p>
<p><img src="http://www.exampler.com/blog/wp-content/uploads/2008/03/bugpage-links.jpg"  alt="The same page, highlighting link hrefs" /></p>
<p>To the eyes of someone who just added promised certifications to that page, the wrong link targets ought to jump out. </p>
<p>There&#8217;s more that I&#8217;d like, though. The program knows more about those links than it included in the HTTP Response body. Specifically, it knows they link to a certain kind of object: a <code>PromisedCertification</code>. I should be able to get a view of that object (without committing to following the link). I should be able to get it in both HTML form and in some raw format. (And if the link-to-be-displayed were an object in its own right, I would have had a place to put my method, and I wouldn&#8217;t have used the wrong one. Testability changes often feed into error prevention.)</p>
<p>And so on&#8230; It&#8217;s easy enough for me to come up with a list of ways I&#8217;d like the app to speak of its internal <a href="http://visibleworkings.com/">workings</a>. So what I&#8217;m thinking of doing is grabbing some web framework, doing what&#8217;s required to make it explorable, using it to build an app, and also building an exploration assistant in <a href="http://rubycocoa.sourceforge.net/HomePage">RubyCocoa</a> (allowing me to kill <a href="http://www.exampler.com/blog/category/rubycocoa/">another bird</a> with this stone). </p>
<p>To be explicit, here&#8217;s my hypothesis:</p>
<blockquote><p>
An application built with programmer TDD, whiteboard-style and example-heavy business-facing design, <b>exploratory testing of its visible workings</b>, and some <b>small set of automated whole-system sanity tests</b> will be <i>cheaper</i> to develop and <i>no worse in quality</i> than one that differs in having <b>minimal exploratory testing</b>, done through the GUI, plus a full set of <b>business-facing TDD tests</b> derived from the example-heavy design.
</p></blockquote>
<p>We shall see, I hope.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2008/03/23/an-alternative-to-business-facing-tdd/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Google talk references</title>
		<link>http://www.exampler.com/blog/2008/03/19/google-talk-references/</link>
		<comments>http://www.exampler.com/blog/2008/03/19/google-talk-references/#comments</comments>
		<pubDate>Wed, 19 Mar 2008 21:31:35 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[testing]]></category>

		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2008/03/19/google-talk-references/</guid>
		<description><![CDATA[One thing I meant to say and forgot: Just as the evolution of amphibians didn&#8217;t mean that all the fish disappeared, the creation of a new kind of testing to fit a new niche doesn&#8217;t mean existing kinds are now obsolete.
Context-driven testing:
Testing Computer Software, Kaner, Falk, and Nguyen
Lessons Learned in Software Testing, Kaner, Bach, and [...]]]></description>
			<content:encoded><![CDATA[<p>One thing I meant to say and forgot: Just as the evolution of amphibians didn&#8217;t mean that all the fish disappeared, the creation of a new kind of testing to fit a new niche doesn&#8217;t mean existing kinds are now obsolete.</p>
<p>Context-driven testing:</p>
<p><i>Testing Computer Software</i>, Kaner, Falk, and Nguyen<br />
<i>Lessons Learned in Software Testing</i>, Kaner, Bach, and Pettichord<br />
<a href="http://www.context-driven-testing.com">http://www.context-driven-testing.com</a><br />
<a href="http://www.testing.com/writings/automate.pdf">&#8220;When Should a Test Be Automated?&#8221;</a>, Marick</p>
<p>Exploratory testing:</p>
<p><a href="http://www.satisfice.com/articles.shtml">James Bach</a><br />
<a href="http://www.developsense.com/">Michael Bolton</a><br />
<a href="http://www.testobsessed.com/">Elisabeth Hendrickson</a><br />
<a href="http://www.kohl.ca/">Jonathan Kohl</a></p>
<p>Left out:</p>
<p><a href="http://www.exampler.com/blog/2007/10/14/crowdware/">The undescribed fourth age</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2008/03/19/google-talk-references/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Comments</title>
		<link>http://www.exampler.com/blog/2008/03/15/comments/</link>
		<comments>http://www.exampler.com/blog/2008/03/15/comments/#comments</comments>
		<pubDate>Sat, 15 Mar 2008 17:02:21 +0000</pubDate>
		<dc:creator>Brian Marick</dc:creator>
		
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://www.exampler.com/blog/2008/03/15/comments/</guid>
		<description><![CDATA[My spam filter seems to be classifying everything as spam. I&#8217;ve unspammed the real comments that hadn&#8217;t been auto-deleted yet. If you were wondering why your comment never got posted, that&#8217;s why. Maybe I should go back to requiring registration.
]]></description>
			<content:encoded><![CDATA[<p>My spam filter seems to be classifying everything as spam. I&#8217;ve unspammed the real comments that hadn&#8217;t been auto-deleted yet. If you were wondering why your comment never got posted, that&#8217;s why. Maybe I should go back to requiring registration.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exampler.com/blog/2008/03/15/comments/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
