<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Test Automation Planet</title>
	<link rel="self" href="http://tap.szabgab.com/atom.xml"/>
	<link href="http://tap.szabgab.com/"/>
	<id>http://tap.szabgab.com/atom.xml</id>
	<updated>2012-02-08T20:48:19+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry>
		<title type="html">Tester Pride Without Bug Discovery</title>
		<link href="http://feedproxy.google.com/~r/EricJacobsonSoftwareTestingBlog/~3/3Qg_txqIjSg/tester-pride-without-bug-discovery_08.html"/>
		<id>tag:blogger.com,1999:blog-8951904624959546499.post-7484417514723855360</id>
		<updated>2012-02-08T18:09:00+00:00</updated>
		<content type="html">&lt;p&gt;You don’t need bugs to feel pride about the testing service you provide to your team.&amp;nbsp; That was my initial message for my post, &lt;a href=&quot;http://www.testthisblog.com/2012/01/avoid-trivial-bugs-report-what-works.html&quot;&gt;Avoid Trivial Bugs, Report What Works&lt;/a&gt;.&amp;nbsp; I think I obscured said message by covering too many topics in that post so I’ll take a more focused stab at said topic. &lt;/p&gt; &lt;p&gt;Here is a list of things we (testers) can do to help feel pride in our testing when everything works and we have few to no bugs to report.&amp;nbsp; Here we go…&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Congratulate your programmers on a job well done.&amp;nbsp; Encourage a small celebration.&amp;nbsp; Encourage more of the same by asking what they did differently.&amp;nbsp; Feel pride with them and be grateful to be a part of a successful team.&lt;/li&gt; &lt;li&gt;If you miss the ego boost that accompanies cool bug discovery, brag about your coolest, most creative, most technical test.&amp;nbsp; You were sure the product would crash and burn but to your surprise, it held up.&amp;nbsp; Sharing an impressive test is sometimes enough to show you’ve been busy.&lt;/li&gt; &lt;li&gt;Give more test reports (or start giving them).&amp;nbsp; A test report is a method of summarizing your testing story.&amp;nbsp; You did a lot.&amp;nbsp; Share it.&lt;/li&gt; &lt;li&gt;Focus on how quickly whatever you tested has moved from development to production.&amp;nbsp; Your manager may appreciate this even more than the knowledge that you found a bunch of bugs.&amp;nbsp; Now you can test even more.&lt;/li&gt; &lt;li&gt;Start a count on a banner or webpage that indicates how many days your team has gone without bugs.&lt;/li&gt; &lt;li&gt;If the reason you didn’t find bugs is because you helped the programmer NOT write bugs from the beginning, then brag about it in your retrospective.&lt;/li&gt; &lt;li&gt;Perform a “self check”; ask another team member to see if they can find any bugs in your Feature.&amp;nbsp; If they can’t find bugs, you can feel pride in your testing.&amp;nbsp; If they can find bugs, you can feel pride in the guts it took to expose yourself to failure (and learn another test idea).&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;What additions can you think of?&lt;/p&gt;  &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8951904624959546499-7484417514723855360?l=www.testthisblog.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/EricJacobsonSoftwareTestingBlog/~4/3Qg_txqIjSg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Eric Jacobson</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.testthisblog.com/</uri>
		</author>
		<source>
			<title type="html">Test This Blog - Eric Jacobson's Software Testing Blog</title>
			<subtitle type="html">Refinements on the art of software testing</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/EricJacobsonSoftwareTestingBlog"/>
			<id>tag:blogger.com,1999:blog-8951904624959546499</id>
			<updated>2012-02-08T20:47:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Do Not Close This Window (Or Click The Back Button)</title>
		<link href="http://www.developsense.com/blog/2012/02/do-not-close-this-window/"/>
		<id>http://www.developsense.com/blog/?p=1143</id>
		<updated>2012-02-07T16:48:47+00:00</updated>
		<content type="html">&lt;p&gt;Here&amp;#8217;s a classic case of poor design and user experience. Most of us have seen something like it. It happened to my wife yesterday. It will happen to you again soon, probably.&lt;/p&gt;
&lt;p&gt;&lt;ul&gt;&lt;li&gt;You&amp;#8217;re making an online payment for some product or service.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;You press a button that says something like &amp;#8220;Submit Payment&amp;#8221;.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;A web page appears that says something like &amp;#8220;Your payment is being submitted. Please do not close this window or click the Back button on your browser.&amp;#8221;  And that&amp;#8217;s &lt;em&gt;all&lt;/em&gt; the page says.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;The page stays on your screen &lt;em&gt;forever&lt;/em&gt;&amp;mdash;or until you wince and close the browser window despite the specific instructions on the screen.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Here are some questions that a tester could ask when presented with this design, or with this experience:&lt;/p&gt;
&lt;p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&amp;#8220;Or else what?&amp;#8221;&lt;/strong&gt; &amp;#8220;Please do not close this window or click the Back button on your browser.&amp;#8221; Or else what?  What Bad Thing might happen? What Good Thing might fail to happen?  This should lead directly to&amp;#8230;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;&amp;#8220;What if&amp;#8230;?&amp;#8221;&lt;/strong&gt; What if the sequence of actions doesn&amp;#8217;t go as planned? What if a conversation between a server and a client is interrupted? (Note: the connections between any two systems are at best &lt;em&gt;somewhat&lt;/em&gt; reliable.  If you believe otherwise, a travelling testing consultant has two words for you:  &lt;em&gt;hotel WiFi&lt;/em&gt;.)  At what points might interruptions happen (quick answer: all of them.) How is the state of the conversation being managed?  Have we considered interruptions in our design? Have we tested for them?  How does the system handle and recover from delayed or interrupted transactions?&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;&amp;#8220;What should the customer reasonably expect?&amp;#8221;&lt;/strong&gt;  It&amp;#8217;s not hard to imagine a good deal of variance in the performance of a system, especially when its end nodes might be dozens of network hops apart from each other. Still, how long should a customer reasonably expect the transaction to take?  At what point might it make sense for the customer to bail out?&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;&amp;#8220;How would the customer know when it&amp;#8217;s time to bail out?&amp;#8221;&lt;/strong&gt;  If you can put a message on the screen, and if you know how long it would be reasonable to wait before bailing out, should the customer have to look at her watch? Might a countdown timer be helpful?&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;&amp;#8220;Is there another way?&amp;#8221;&lt;/strong&gt; Is there another way for the customer to see that the transaction has completed successfully, or has failed?  Does your design and the message you display make that option clear?&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;&amp;#8220;What emotions might come up?&amp;#8221;&lt;/strong&gt;  How might a customer feel uncertain, confused, frustrated, annoyed, mystified, impatient, surprised, helpless&amp;mdash;or confident, impressed, reassured, or delighted&amp;mdash;by what she sees and experiences?  How might we use those potential feelings to help us guide our search for problems?&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;&amp;#8220;Who can help?&amp;#8221;&lt;/strong&gt; If the transaction fails, who can help the customer out?  How does the customer get in touch with that person?  Is there a means of contacting customer support on that &amp;#8220;Please wait&amp;#8230;&amp;#8221; screen? &lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;&amp;#8220;What meta-information is available?&amp;#8221;&lt;/strong&gt;  I&amp;#8217;ve worked with companies that have said, &amp;#8220;We can&amp;#8217;t put a customer support telephone number on that screen; customer support would be swamped!&amp;#8221;  What does that statement tell you about the system, about people&amp;#8217;s impressions of its reliability, and about risk?&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;&amp;#8220;How do we raise awareness of problems?&amp;#8221;&lt;/strong&gt;  When a transaction on our site fails or is subject to an unreasonable delay, how do we get to find out?  Is someone alerted immediately?  Are failures aggregated?  Buried in a log file somewhere?  Who looks for problems, and how often do they look?  Who hears about problems? How does that information get relayed to the people who design, maintain, and update the system? How might that information&amp;mdash;or parts of it&amp;mdash;&lt;em&gt;not&lt;/em&gt; get relayed to those people?&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;This last question is important. Its answer provides part of the explanation for the fact that, after fifteen years of Web commerce, we&amp;#8217;re still seeing designs like the one that appears at the top of this post.&lt;/p&gt;</content>
		<author>
			<name>Michael</name>
			<uri>http://www.developsense.com/blog</uri>
		</author>
		<source>
			<title type="html">Developsense Blog</title>
			<subtitle type="html">DevelopSense Blog</subtitle>
			<link rel="self" href="http://www.developsense.com/blog/feed/atom/"/>
			<id>http://www.developsense.com/blog/feed/atom/</id>
			<updated>2012-02-08T20:48:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Looking for information about composed refactorings</title>
		<link href="http://www.exampler.com/blog/2012/02/04/looking-for-information-about-composed-refactorings/"/>
		<id>http://www.exampler.com/blog/2012/02/04/looking-for-information-about-composed-refactorings/</id>
		<updated>2012-02-05T03:56:29+00:00</updated>
		<content type="html">&lt;p&gt;Even after all these years, I take too-big steps while coding. In less finicky languages (or finicky languages with good tool support), I can get away with it, but I can&amp;#8217;t do that in C++ (a language I&amp;#8217;ve been working in the past two weeks). So I&amp;#8217;ve had to think more explicitly about taking baby steps. And that&amp;#8217;s made me realize that there must be some refactoring literature out there that I&amp;#8217;ve overlooked or forgotten. That literature would talk about composing small-scale refactorings into medium-scale changes. The only example I can think of is &lt;a href=&quot;https://twitter.com/#!/joshuakerievsky&quot;&gt;Joshua Kerievsky&lt;/a&gt;&amp;#8217;s &lt;i&gt;&lt;a href=&quot;http://industriallogic.com/xp/refactoring/&quot;&gt;Refactoring to Patterns&lt;/a&gt;&lt;/i&gt;. I like that book a lot, but it&amp;#8217;s about certain types of medium-scale refactorings (those that result in classic design patterns), and there are other, more mundane sorts.&lt;/p&gt;
&lt;p&gt;Let me give an example. This past Friday, I was pairing with &lt;a href=&quot;https://twitter.com/#!/emonical&quot;&gt;Edward Monical-Vuylsteke&lt;/a&gt; on what amounts to a desktop GUI app. Call the class in question &lt;code&gt;Controller&lt;/code&gt;, as it&amp;#8217;s roughly a Controller in the Model-View-Controller pattern. Part of what &lt;code&gt;Controller&lt;/code&gt; did was &lt;a href=&quot;http://c2.com/cgi/wiki?ObserverPattern&quot;&gt;observe&lt;/a&gt; what I&amp;#8217;ll call a &lt;code&gt;ValueTweaker&lt;/code&gt; UI widget. When the user asked for a change to the value (that is, tweaked some bit of UI), the &lt;code&gt;Controller&lt;/code&gt; would observe that, cogitate about it a bit, and then perhaps tell an object deeper in the system to make the corresponding change in some hardware somewhere. &lt;/p&gt;
&lt;p&gt;That was the state of things at the end of Story A. Story B asked us to add a second &lt;code&gt;ValueTweaker&lt;/code&gt; to let the user change a different hardware value (of the same type as the first, but reachable via a wildly different low-level interface). The change from &amp;#8220;one&amp;#8221; to &amp;#8220;two&amp;#8221; was a pretty strong hint that the &lt;code&gt;Controller&lt;/code&gt; should be split into three objects of two classes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
A &lt;code&gt;ValueController&lt;/code&gt; that would handle only the task of mediating between a &lt;code&gt;ValueTweaker&lt;/code&gt; on the UI and the hardware value described in story A.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
A second &lt;code&gt;ValueController&lt;/code&gt; that would do the same job for story B&amp;#8217;s new value. The difference between the two &lt;code&gt;ValueControllers&lt;/code&gt; wouldn&amp;#8217;t be in their code but in which lower-level objects they&amp;#8217;d be connected to.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
A simplified &lt;code&gt;Controller&lt;/code&gt; that would continue to do whatever else the original &lt;code&gt;Controller&lt;/code&gt; had done.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The question is: how to split one class into two? The way we did it was to follow these steps (if I remember right):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
Create an empty &lt;code&gt;ValueController&lt;/code&gt; class with an empty &lt;code&gt;ValueController&lt;/code&gt; test suite. Have &lt;code&gt;Controller&lt;/code&gt; be its subclass. All the &lt;code&gt;Controller&lt;/code&gt; tests still pass.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
One by one, move the &lt;code&gt;Controller&lt;/code&gt; tests that are about controlling values up into the &lt;code&gt;ValueController&lt;/code&gt; test suite. Move the code to make them pass.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
When that&amp;#8217;s done, we still have a &lt;code&gt;Controller&lt;/code&gt; object that does everything it used to do. We also have an end-to-end test that checks that a tweak of the UI propagates down into the system to make a change and also propagates back up to the UI to show that the change happened.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Change the end-to-end test so that it no longer refers to &lt;code&gt;Controller&lt;/code&gt; but only to &lt;code&gt;ValueController&lt;/code&gt;.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Change the object that wires up this whole subsystem so that it (1) creates both a &lt;code&gt;Controller&lt;/code&gt; and &lt;code&gt;ValueController&lt;/code&gt; object, (2) connects the &lt;code&gt;ValueController&lt;/code&gt; to the &lt;code&gt;ValueTweaker&lt;/code&gt; and to the appropriate object down toward the hardware, and (3) continues to connect the &lt;code&gt;Controller&lt;/code&gt; to the objects that don&amp;#8217;t have anything to do with changing the tweakable value. Confirm (manually) that both tweaking and the remaining &lt;code&gt;Controller&lt;/code&gt; end-to-end behaviors work.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Since it no longer uses its superclass&amp;#8217;s behavior, change &lt;code&gt;Controller&lt;/code&gt; so that it&amp;#8217;s no longer a subclass of &lt;code&gt;ValueController&lt;/code&gt;.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Change the wire-up-the-whole-subsystem object so that it also makes story B&amp;#8217;s vertical slice (new &lt;code&gt;ValueTweaker&lt;/code&gt;, new &lt;code&gt;ValueController&lt;/code&gt;, new connection to the hardware). Confirm manually.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I consider that a medium-scale refactoring. It&amp;#8217;s not something that even a smart IDE can do for you in one safe step, but it&amp;#8217;s still something that (even in C++!) can easily be finished in less than an afternoon.&lt;/p&gt;
&lt;p&gt;So: where are such medium-scale refactorings documented?&lt;/p&gt;</content>
		<author>
			<name>Brian Marick</name>
			<uri>http://www.exampler.com/blog</uri>
		</author>
		<source>
			<title type="html">Exploration Through Example</title>
			<subtitle type="html">Example-driven development, Agile software development, testing, Ruby, and other things of interest to Brian Marick</subtitle>
			<link rel="self" href="http://www.exampler.com/blog/feed/"/>
			<id>http://www.exampler.com/blog/feed/</id>
			<updated>2012-02-05T20:47:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">PHP Summit in München</title>
		<link href="http://sebastian-bergmann.de/archives/920-PHP-Summit-in-Muenchen.html"/>
		<id>http://sebastian-bergmann.de/archives/920-guid.html</id>
		<updated>2012-02-03T04:15:29+00:00</updated>
		<content type="html">&lt;a href=&quot;http://php-summit.de/&quot;&gt;&lt;img src=&quot;http://it-republik.de/konferenzen/phpsummit2012spring_konferenz/img/layout/teaser.jpg&quot; border=&quot;0&quot; width=&quot;500&quot; alt=&quot;PHP Summit&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;This blog posting is in German as the event it relates to is German-only.&lt;br /&gt;Sorry for the inconvenience.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bei allen PHP-Themen zählt nichts mehr als die Praxis. Deshalb bieten wir unsere Power-Workshops interaktiv und mit intensivem Praxisbezug an. Über die behandelten Themen entscheiden die Teilnehmer mit ihren konkreten Fragen. Anstelle von Frontalunterricht erleben sie die Entwicklung von neuem Code unmittelbar. Mit Augenzwinkern und Spaß erläutern Sebastian Bergmann, Arne Blankerts und Stefan Priebsch Entwicklungsmethoden und Tools und stellen Trends und Konzepte vor.&lt;/p&gt;
&lt;p&gt;Der nächste &lt;a href=&quot;http://php-summit.de/&quot;&gt;PHP Summit&lt;/a&gt; findet im März in München statt. Und das sind die Workshops:&lt;/p&gt;

&lt;dl&gt;&lt;dd&gt;&lt;h4&gt;Update PHP: Neue Features und Technologien nutzen &lt;/h4&gt;
&lt;h5&gt;Workshop von Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;PHP 5.3 und PHP 5.4 überzeugen im Programmieralltag durch eine Fülle relevanter Vereinfachungen. Lernen Sie die innovativen Features und geschickte Einsatzmöglichkeiten der neuen Versionen kennen. Entdecken Sie das Lösungspotenzial aktueller Technologien aus dem PHP-Umfeld (memcached, ZeroMQ …) für Ihre Fragestellungen.&lt;/p&gt;

&lt;h4&gt;Weg mit Strubbelcode: identifizieren – verbessern – vermeiden&lt;/h4&gt;
&lt;h5&gt;Workshop von Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Früher oder später wird unsauber geschriebener Code zum Ärgernis. Nicht nur für den, der ihn warten muss. Änderungen und Erweiterungen können im Extremfall den Code unwirtschaftlich machen. Lernen Sie schlechten Code durch statische Codeanalyse aufzufinden und in test- und wartbaren Code umzuschreiben. Lernen Sie mithilfe der SOLID-Prinzipien, nachhaltig wartbaren Code zu schreiben.&lt;/p&gt;

&lt;h4&gt;Best Practices – aus dem Alltag für den Alltag&lt;/h4&gt;
&lt;h5&gt;Workshop von Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Natürlich könnte man das Rad jeden Tag neu erfinden. Meist fehlt dafür die Zeit, Spaß macht es auch nicht und Fehler können sich so immer wieder an denselben Stellen einschleichen. Für die vielen alltäglichen Probleme, die nur geringfügig von schon vorhandenen Lösungen abweichen, gibt es clevere Ansätze, die das Leben leichter machen. In einer komplett vom Auditorium gesteuerten Live Session zeigt der Workshop dafür programmatische Konzepte und lädt zur Diskussion über Tools und klassische Fragestellungen ein.&lt;/p&gt;

&lt;h4&gt;Auf Fehler sicher vorbereitet sein&lt;/h4&gt;
&lt;h5&gt;Workshop von Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Programme und Webseiten enthalten Fehler. Immer. Sie werden sichtbar, wenn Benutzer falsche, ungültige oder unerwartete Eingaben machen, der Zugriff auf die Datenbank plötzlich unmöglich ist oder die Festplatte überläuft. Um solche und andere Probleme sicher abzufangen, gibt es verschiedene Ansätze, die hier vorgestellt und diskutiert werden. Wie man Exceptions richtig anwendet, warum ein eigener Error Handler hilfreich ist und dass Debugging viel mit Sicherheit zu tun hat, vermittelt der Workshop lebendig und anschaulich.&lt;/p&gt;

&lt;h4&gt;Objektorientierte Programmierung (OOP) in PHP I: Basiswissen&lt;/h4&gt;
&lt;h5&gt;Workshop von Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Der Workshop klärt die Frage, was es mit der objektorientierten Programmierung eigentlich auf sich hat. Jenseits der bekannten Standardbeispiele führt er praktisch in die OOP mit PHP ein. Dabei werden neben den Grundlagen und zentralen Prinzipien der OOP interessante Features beispielsweise aus der Standard PHP Library (SPL) vorgestellt und ihr sinnvoller Praxiseinsatz vorgeführt. Neben Faktenwissen wird eine Denkweise vermittelt, die es erlaubt, unnötig komplizierte Ansätze von vornherein zu umgehen.&lt;/p&gt;

&lt;h4&gt;Objektorientierte Programmierung (OOP) in PHP II: Aufbauwissen&lt;/h4&gt;
&lt;h5&gt;Workshop von Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Der Workshop zeigt Teilnehmern, die mit den Grundlagen der OOP vertraut sind, fortgeschrittene Techniken wie Dependency Injection, abstrakte Klassen, Interfaces und Best Practices für erfolgreiche OOP. Eine Live-Coding-Session macht den Einsatz der vorgestellten Techniken in der Praxis erfahrbar. Außer Faktenwissen zeigt der Workshop, dass gute Lösungen einfache Lösungen sind: Einfache Objekte sind leichter wieder zu verwenden und vermeiden Fehler.&lt;/p&gt;

&lt;h4&gt;PHP-Anwendungen testen: Basiswissen&lt;/h4&gt;
&lt;h5&gt;Workshop von Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Der Workshop vermittelt grundlegende Kenntnisse und Fähigkeiten im Einsatz von PHPUnit bei Unit Tests, Datenbank-Interaktionstests, Edge-to-Edge- Tests und End-to-End-Tests. Sie lernen alles, was Sie über das Schreiben, Ausführen und Organisieren von Unit Tests mit PHPUnit beherrschen müssen.&lt;/p&gt;

&lt;h4&gt;PHP-Anwendungen testen: Aufbauwissen&lt;/h4&gt;
&lt;h5&gt;Workshop von Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;PHPUnit clever einsetzen: Die Teilnehmer lernen die besten Praktiken beim Einsatz von PHPUnit und erprobte Strategien bei der Einführung von Testmaßnahmen an vorhandener Software kennen. Anhand zahlreicher Beispiele entwickeln Sie einen Blick für schlechte Tests und lernen, sie zu verbessern, schwer testbaren Code zu identifizieren und Legacy-Code Schritt für Schritt testbar zu machen.&lt;/p&gt;

&lt;h4&gt;Geheimtipp XML: Die smarte Art der Anwendung&lt;/h4&gt;
&lt;h5&gt;Workshop von Arne Blankerts&lt;/h5&gt;
&lt;p&gt;XML ist das Standardformat für den Datenaustausch im Web und verbirgt sich in vielen, für Endanwender oft nicht sichtbaren Dateiformaten (z. B. aktuelle MS-Office-Versionen) und Formen. Der Workshop zeigt, dass XML richtig Spaß machen kann, wenn die übermittelten Daten validiert werden und der Zugriff mit effiziente APIs erfolgt. In der Live Session erweitern wir das DOM-API von PHP um eigene Methoden und unterstützen die Lokalisierung durch PHP. Eigene XSD Schemas zur Validierung werden definiert und der Einsatz von XPath als Abfragesprache vorgeführt. Vermittelt wird auch der Einblick in eine wirklich effektive Fehlerbehandlung.&lt;/p&gt;

&lt;h4&gt;Neu: Tuning für Web-Anwendungen&lt;/h4&gt;
&lt;h5&gt;Workshop von Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Wer einen ungeschickten Weg zur Lösung beschreitet, handelt sich Probleme ein, die er gar nicht haben möchte. In der Regel geht das zulasten des Tempos und der Skalierbarkeit. Wie man solche Schwachpunkte in gängigen Aufbauten und Architekturen vorab erkennt und durch bessere Konzepte von vornherein vermeiden kann, zeigt dieser Workshop an zahlreichen Praxisbeispielen. Eigene Denk- und Herangehensweisen können überprüft und modifiziert werden.&lt;/p&gt;

&lt;h4&gt;Entwurfsmuster I: Die wichtigsten Standards&lt;/h4&gt;
&lt;h5&gt;Workshop von Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Warum das Rad jedes Mal neu erfinden? Die Teilnehmer lernen in diesem Workshop wichtige Entwurfsmuster kennen, die sich in PHP-Webanwendungen besonders bewährt haben. Häufig in der Praxis auftretende Schwierigkeiten werden vorgeführt und Lösungen werden live programmiert. Vor- und Nachteile sowie Einsatzmöglichkeiten und typische Fehler bei der Anwendung von Standardmustern werden ausführlich erläutert und diskutiert.&lt;/p&gt;

&lt;h4&gt;Entwurfsmuster II: Integration anspruchsvoller Patterns&lt;/h4&gt;
&lt;h5&gt;Workshop von Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Der Workshop behandelt Themenstellungen wie temporale Patterns, das Speichern von Objekten in relationale und NoSQL-Datenbanken oder Enterprise Integration Patterns mit Schwerpunkten, die von den Teilnehmern frei festgelegt werden. Eine Reihe typischer Probleme wird vorgeführt und analysiert. Die zu ihrer Lösung eingesetzten (wenig bekannten) Entwurfsmuster vermitteln den Teilnehmern fortgeschrittene Kenntnisse, die im Alltag wertvoll sind.&lt;/p&gt;

&lt;h4&gt;Moderne Versionskontrolle mit Git&lt;/h4&gt;
&lt;h5&gt;Workshop von Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Git ist ein mächtiges Versionsverwaltungssystem, mit dem Sie alle Bestandteile Ihrer Software durch alle Änderungen und Versionen zuverlässig verfolgen können. Damit schaffen Sie die Grundlage für die kontinuierliche Integration der Software. Der Workshop vermittelt Grundlagen für den Einsatz von Git, Best Practices und Prozesse für Entwicklung, Release-Management und Deployment, die Ihre Teamarbeit spürbar effektiver machen.&lt;/p&gt;

&lt;h4&gt;Kontinuierliche Integration mit Jenkins&lt;/h4&gt;
&lt;h5&gt;Workshop von Sebastian Bergmann&lt;/h5&gt;
&lt;p&gt;Wer die Qualität seiner Software während der Entwicklung und im Betrieb messen und kontrollieren will, profitiert vom Einrichten einer Umgebung, in der PHP-Projekte kontinuierlich integriert werden können. Mit der Kombination dynamischer und statischer Testverfahren automatisieren Sie wiederkehrende Aufgaben, sind über die Softwarequalität auf dem Laufenden und minimieren Projektrisiken erfolgreich. Der Workshop vermittelt die Grundlagen der kontinuierlichen Integration und Inspektion von PHP-Software. Sie üben Installation, Konfiguration und Betrieb von Jenkins für PHP-Projekte.&lt;/p&gt;

&lt;h4&gt;Am besten mit dem Schlimmsten rechnen!&lt;/h4&gt;
&lt;h5&gt;Workshop von Arne Blankerts&lt;/h5&gt;
&lt;p&gt;In Zeiten ständiger Einbruchsversuche durch gelangweilte Anwender ergibt es Sinn, wirklich immer mit Angriffen aus dem Internet zu rechnen. Auch vermeintlich sichere Strukturen bieten versierten Hackern oft keinen nennenswerten Widerstand. Verantwortungsbewusste Entwickler müssen wissen, wie man der eigenen Anwendung oder Infrastruktur schaden könnte. Der Workshop vermittelt grundlegende Zusammenhänge und zeigt in einer Live Session, was Begriffe wie XSS, CSRF oder SQL-Injection bedeuten, wie man Angreifern das Leben schwer macht und wirksame Lösungen implementiert.&lt;/p&gt;

&lt;h4&gt;Attacke! Was Angriffe im Web erfolgreich macht&lt;/h4&gt;
&lt;h5&gt;Workshop von Arne Blankerts&lt;/h5&gt;
&lt;p&gt;Anwendungen sind im Internet permanent Angreifern ausgesetzt. Im Workshop wechseln die Teilnehmer die Seiten und greifen selbst eine Demo-Blackbox-Anwendung an. Sie lernen, wie Angreifer Informationen sammeln, Sicherheitslücken ausnutzen und Server übernehmen. Vermittelt werden Methoden, um Lücken zu finden, sie zu schließen und Angriffe abzufangen. Der abschließende Blick in den Quellcode sensibilisiert für Schwachstellen und zeigt, wie man sie behebt.&lt;/p&gt;

&lt;h4&gt;Framework: Basics in drei Stunden&lt;/h4&gt;
&lt;h5&gt;Workshop von Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Grundlegende Fragen nach der Struktur einer Webanwendung und dem Schreiben von Code, der test-, wart- und erweiterbar ist, werden an einem praktischen Beispiel beantwortet. Wichtige Entwurfsmuster und Best Practices werden vorgeführt. Feedback und Fragen der Teilnehmenden steuern den Verlauf der Session. Ziel ist ein besseres Verständnis für die wesentlichen Konzepte von Frameworks.&lt;/p&gt;

&lt;h4&gt;Warum der Turm in Pisa schief steht&lt;/h4&gt;
&lt;h5&gt;Workshop von Stefan Priebsch&lt;/h5&gt;
&lt;p&gt;Nichtfunktionale Aspekte werden in ihrer Bedeutung für technische Entscheidungen oft unterschätzt oder ganz übersehen. Je komplexer die Fragestellungen desto wahrscheinlicher ist es, dass aus diesem Wegschauen Probleme resultieren, die später nicht leicht einzufangen sind. Wer sich vor der Entwicklung Gedanken zur Architektur macht, löst heute Probleme von morgen. Der Workshop zeigt Architekturmuster für Webanwendungen und geht auf aktuelle Trends wie Distributed Caching, Message Queues und NoSQL ein. Es werden erprobte Bausteine vorgestellt, mit denen hochperformante und skalierbare Webanwendungen in PHP entwickelt werden können.&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;



&lt;p&gt;Der &lt;a href=&quot;http://php-summit.de/&quot;&gt;PHP Summit&lt;/a&gt; bietet effizientes Lernen in entspannter Atmosphäre. Profitieren Sie von dieser einzigartig intensiven Form der Informationsvermittlung mit einem unschlagbaren Preis-Leistungs-Verhältnis &lt;a href=&quot;https://www.entwickler.com/ssl/formtool/index.php?id=221&amp;lang=de&quot;&gt;und reservieren Sie sich Ihren Platz noch heute&lt;/a&gt;!&lt;/p&gt;</content>
		<author>
			<name>Sebastian Bergmann</name>
			<email>nospam@example.com</email>
			<uri>http://sebastian-bergmann.de/</uri>
		</author>
		<source>
			<title type="html">Sebastian Bergmann</title>
			<link rel="self" href="http://sebastian-bergmann.de/feeds/index.rss2"/>
			<id>http://sebastian-bergmann.de/feeds/index.rss2</id>
			<updated>2012-02-03T08:47:14+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Signing Off</title>
		<link href="http://feedproxy.google.com/~r/blogspot/RLXA/~3/d7P7Fz0b4aQ/signing-off.html"/>
		<id>tag:blogger.com,1999:blog-15045980.post-7961603654544614438</id>
		<updated>2012-02-02T14:13:01+00:00</updated>
		<content type="html">&lt;div dir=&quot;ltr&quot;&gt;
By James Whittaker&lt;br /&gt;
&lt;br /&gt;
This will be my last post on this blog. Tomorrow is my last day at Google. It was a great ride and a great pleasure to work alongside such brilliant engineers. I will hand over this blog to another test director and then find a new place for whatever blogging I do in the future.&lt;br /&gt;
&lt;br /&gt;
Follow me on Twitter (@docjamesw) if you are interested in where I land and to find my next blog outlet.&lt;br /&gt;
&lt;br /&gt;
Peace.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/15045980-7961603654544614438?l=googletesting.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/RLXA?a=d7P7Fz0b4aQ:hoyKCu7d3Mo:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/RLXA?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/RLXA?a=d7P7Fz0b4aQ:hoyKCu7d3Mo:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/RLXA?i=d7P7Fz0b4aQ:hoyKCu7d3Mo:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/RLXA/~4/d7P7Fz0b4aQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>James Whittaker</name>
			<email>noreply@blogger.com</email>
			<uri>http://googletesting.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Google Testing Blog</title>
			<subtitle type="html">If it ain't broke, you're not trying hard enough.</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/blogspot/RLXA"/>
			<id>tag:blogger.com,1999:blog-15045980</id>
			<updated>2012-02-08T08:47:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A Tool's Tale</title>
		<link href="http://sebastian-bergmann.de/archives/919-A-Tools-Tale.html"/>
		<id>http://sebastian-bergmann.de/archives/919-guid.html</id>
		<updated>2012-02-01T06:30:00+00:00</updated>
		<content type="html">&lt;p&gt;When &lt;a href=&quot;http://twitter.com/noahsussman&quot;&gt;Noah Sussman&lt;/a&gt; asked me to give a &lt;a href=&quot;http://codeascraft.etsy.com/etsy-speaker-series/&quot;&gt;Code as Craft Technology Talk&lt;/a&gt; last week when I was consulting for Etsy I immediately said yes. However, I was a bit surprised when the talk was announced under the title &quot;An Evening with Sebastian Bergmann&quot;. When I read that title the first time, it was just minutes after Arne, Stefan and I had talked about one of our favourite scenes from &quot;&lt;a href=&quot;http://www.imdb.com/title/tt0183790/&quot;&gt;A Knight's Tale&lt;/a&gt;&quot;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Chaucer:&lt;/strong&gt; I'm a writer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wat:&lt;/strong&gt; A what?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chaucer:&lt;/strong&gt; A wha- a what? A writer. You know, I write, with ink, and parchment. Geoffrey Chaucer's the name, writing's the game. You've probably read my book? The Book of the Duchess? No? Well, it was allegorical.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Roland:&lt;/strong&gt; Well, we won't hold that against you, that's for every man to decide for himself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Just like with &lt;a href=&quot;http://sebastian-bergmann.de/archives/915-Testable-Code-Rockstar-Edition.html&quot;&gt;a talk that I gave last year&lt;/a&gt;, I suddenly had a chain of associations in my head that I just had to follow. And down the rabbit hole I went once more ...&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_1.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_1.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;Hi! I have no idea why this talk is titled &quot;An Evening with Sebastian Bergmann&quot;. I hope that this evening will turn into an interesting discussion about PHPUnit and all things testing. To break the ice, and to not appear completely unprepared, I came up with the following slides ...&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_2.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_2.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;So I recently talked with my friends Arne and Stefan about the movie &quot;A Knight's Tale&quot;. Somehow the idea stuck in my head that a variation of that title might be a good idea for a talk of mine. After dismissing &quot;A Fool's Tale&quot; I arrived at &quot;A Tool's Tale&quot;. So that's what we're stuck with and what I am going to try right now ...&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_3.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_3.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_4.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_4.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_5.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_5.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_6.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_6.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;What I just did was a variation on how Geoffrey Chaucer introduces himself in the movie.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_7.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_7.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;Some time in 2001 I started to work on PHPUnit because I wanted to have something like JUnit for PHP. The initial &quot;port&quot; was completed within one weekend. The code was ugly because I had to emulate exceptions which PHP 4 did not have. On November 27th 2001 I checked the code into &lt;code&gt;cvs.php.net&lt;/code&gt;.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_8.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_8.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;A lot has changed since 2001. Hopefully not very many developers are still stuck with PHP 4. As of PHPUnit 2.0, which was released on &lt;a href=&quot;http://sebastian-bergmann.de/feeds/sebastian-bergmann.de/archives/378-PHPUnit2-2.0.0-Released.html&quot;&gt;July 14 2004&lt;/a&gt;, the day after PHP 5.0.0 was released, PHP 5 is required to run PHPUnit. &lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_9.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_9.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;PHPUnit is neither the only testing framework nor the only quality assurance tool for PHP. Over the last years a nice ecosystem of static analysis tools started to grow.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_10.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_10.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;I get this question a lot: why do only Germans work on tools that tell me that my code is bad? I do not have an answer for this, sorry. But the statement is also not true: PHP_CodeSniffer is not developed by a German.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_11.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_11.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;PHP has changed and so the have the tools we use to write and maintain code. In 2006 the PHPUnit code was migrated from CVS to Subversion ...&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_12.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_12.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;... and in &lt;a href=&quot;http://sebastian-bergmann.de/archives/876-PHPUnit-Development-Moved-to-GitHub.html&quot;&gt;December 2009 from Subversion to Git and GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_13.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_13.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;PHPUnit is no longer one big monolithic package. It has been &lt;a href=&quot;http://sebastian-bergmann.de/archives/892-PHPUnit-3.5-Refactoring-to-Components.html&quot;&gt;refactored to components&lt;/a&gt; that are being reused by other testing frameworks, for instance. Unfortunately, &lt;a href=&quot;http://sebastian-bergmann.de/archives/899-PHPUnit-3.5-Upgrading-Woes.html&quot;&gt;this refactoring was not without problems&lt;/a&gt;.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_14.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_14.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;PHPUnit gets more and more convenience functionality. Here are a couple of examples:&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_15.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_15.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_16.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_16.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_17.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_17.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_18.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_18.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;Tests can be written, both unintentionally and intentionally, in bad ways. Bad tests can lie. They can give you a false sense of security by reporting that something is tested when it really is not.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_19.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_19.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;This is why I started iplementing coutermeasures against bad tests such as the (ultimately useless but still interesting) assertion counting ...&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_20.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_20.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;... as well as the strict execution mode.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_21.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_21.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;There is code in PHPUnit that I am not proud of. I am trying to make the world a better place by eliminating one singleton at a time, for instance. Unfortunately, cleaning up code sometimes breaks things. Contrary to what a popular opinion on Twitter is, I do not like breaking backwards compatibility in PHPUnit and try really hard to avoid it.&lt;/p&gt;
&lt;a href=&quot;http://sebastian-bergmann.de/images/a_tools_tale_22.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://sebastian-bergmann.de/images/a_tools_tale_22.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;p&gt;This is a &quot;good&quot; example of such a backwards compatibility breakage. It happened in PHPUnit 3.6 because I eliminated a Singleton. Had I known that many developers used this API (instead of the XML configuration file) to set up a code coverage blacklist or whitelist I would probably not have done the change. If more people would have tested the release candidates leading up to PHPUnit 3.6 they could have told me ... oh well.&lt;/p&gt;
&lt;p&gt;At this point the &quot;Evening with Sebastian Bergmann&quot; turned into the interesting discussion I had hoped for.&lt;/p&gt;</content>
		<author>
			<name>Sebastian Bergmann</name>
			<email>nospam@example.com</email>
			<uri>http://sebastian-bergmann.de/</uri>
		</author>
		<source>
			<title type="html">Sebastian Bergmann</title>
			<link rel="self" href="http://sebastian-bergmann.de/feeds/index.rss2"/>
			<id>http://sebastian-bergmann.de/feeds/index.rss2</id>
			<updated>2012-02-03T08:47:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">What Exploratory Testing Is Not (Part 5):  Undocumented Testing</title>
		<link href="http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-5-undocumented-testing/"/>
		<id>http://www.developsense.com/blog/?p=1099</id>
		<updated>2012-01-30T14:25:42+00:00</updated>
		<content type="html">&lt;p&gt;This week I had the great misfortune of reading yet another article which makes the false and ridiculous claim that exploratory testing is &amp;#8220;undocumented&amp;#8221;.  After years and years of plenty of people talking about and writing about and practicing excellent documentation as part of an exploratory testing approach, it&amp;#8217;s depressing to see that there are still people shovelling fresh manure onto a pile that should have been carted off years ago.&lt;/p&gt;
&lt;p&gt;Like the other approaches to test activities that have been discussed in this series (&amp;#8220;&lt;a href=&quot;http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-1-touring/&quot; title=&quot;Exploratory Testing is Not Touring&quot; target=&quot;_blank&quot;&gt;touring&lt;/a&gt;&amp;#8220;, &amp;#8220;&lt;a href=&quot;http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-2-after-everything-else-testing/&quot; title=&quot;Exploratory Testing is Not After-Everything-Else Testing&quot; target=&quot;_blank&quot;&gt;after-everything-else&lt;/a&gt;&amp;#8220;, &amp;#8220;&lt;a href=&quot;http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-3-tool-free-testing/&quot; title=&quot;Exploratory Testing is Not Tool-Free Testing&quot; target=&quot;_blank&quot;&gt;tool-free&lt;/a&gt;&amp;#8220;, and &amp;#8220;&lt;a href=&quot;http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-4-quick-tests/&quot; title=&quot;Exploratory Testing is Not Quick Tests&quot; target=&quot;_blank&quot;&gt;quick testing&lt;/a&gt;&amp;#8220;), &amp;#8220;documented vs. undocumented&amp;#8221; is in a category orthogonal to &amp;#8220;exploratory vs. scripted&amp;#8221;.  True:  usually scripted activities are performed by some agency following a set of instructions that has been written down somewhere.  But we could choose to think of &amp;#8220;scripted&amp;#8221; in a slightly different and more expansive way, as &amp;#8220;prescriptive&amp;#8221;, or &amp;#8220;&lt;a href=&quot;http://www.developsense.com/blog/2011/12/shapes-of-actions/&quot;&gt;mimeomorphic&lt;/a&gt;&amp;#8220;.  A scripted activity, in this sense, is one for which the actions to be performed have been established in advance, and the choices of the actions are not determined by the agency performing them.  In that sense, a cook at McDonalds doesn&amp;#8217;t &lt;em&gt;read&lt;/em&gt; a script as he prepares your burger, but the preparation of a McDonald&amp;#8217;s burger is a highly scripted activity.&lt;/p&gt;
&lt;p&gt;Thus any kind of testing can be heavily documented or completely undocumented.  A thoroughly documented test might be highly exploratory in nature, or it might be highly scripted.&lt;/p&gt;
&lt;p&gt;In the Rapid Software Testing class, James Bach and I point out that when someone says &amp;#8220;that should be documented&amp;#8221;, what they&amp;#8217;re really saying is &amp;#8220;that should be documented &lt;em&gt;if and how and when it serves our purposes&lt;/em&gt;.&amp;#8221;  So, let&amp;#8217;s start by looking at the &amp;#8220;when&amp;#8221;.&lt;/p&gt;
&lt;p&gt;When we question anything in order to evaluate it, there are moments in the process in which we might choose to record ideas or actions.  I&amp;#8217;ve broken these down into three basic categories that I hope you find helpful:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Before&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;During&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;After&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;
There are &amp;#8220;before&amp;#8221;, &amp;#8220;during&amp;#8221;, and &amp;#8220;after&amp;#8221; moments with respect to any test activity, whether it&amp;#8217;s a part of test design, test execution, result interpretation, or learning.  Again, a hallmark of exploratory testing is the tester&amp;#8217;s freedom and responsibility to optimize the value of the work as it&amp;#8217;s happening. That means that when it&amp;#8217;s important to record something, the tester is not only welcome but encouraged to &lt;ul&gt;
&lt;li&gt;pick up a pen&lt;/li&gt;
&lt;li&gt;take a screen shot&lt;/li&gt;
&lt;li&gt;launch a session of &lt;a href=&quot;http://testing.gershon.info/reporter/o&quot;&gt;Rapid Reporter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;create or update a mind map&lt;/li&gt;
&lt;li&gt;fire up a screen recorder&lt;/li&gt;
&lt;li&gt;initiate logging (if it doesn&amp;#8217;t start by default on the product you&amp;#8217;re testing&amp;mdash;and if logging isn&amp;#8217;t available, you might consider identifying that as a testability problem and a related product and project risk)&lt;/li&gt;
&lt;li&gt;sketch out a flowchart diagram&lt;/li&gt;
&lt;li&gt;type notes into a private or shared repository&lt;/li&gt;
&lt;li&gt;add to a table of data in Excel&lt;/li&gt;
&lt;li&gt;fire off a note to a programmer or a product owner&lt;/li&gt;
&lt;p&gt;&lt;/p&gt;&lt;/ul&gt;and that&amp;#8217;s an incomplete list.  But they&amp;#8217;re all forms of documentation.&lt;/p&gt;
&lt;p&gt;Freedom to document at will should also mean that the tester is free to &lt;em&gt;refrain&lt;/em&gt; from documenting something when the documentation doesn&amp;#8217;t add value.  At the same time, the tester is responsible and accountable for that decision. In Rapid Testing, we recommend writing down (or saving, or illustrating) only the things that are necessary or valuable to the project, and only when the value of doing so exceeds the cost.  &lt;strong&gt;This doesn&amp;#8217;t mean no documentation&lt;/strong&gt;; it means the most informative yet fastest and least expensive documentation that completely fulfils the testing mission. Integrating that with testing work leads, we hold, to excellent testing&amp;mdash;but it takes practice and skill.&lt;/p&gt;
&lt;p&gt;For most test activities, it&amp;#8217;s possible to relay information to other people orally, or even sometimes by allowing people to observe our behaviour. (At the beginning of the Rapid Testing class, I sometimes silently hold aloft a 5&amp;#8243; x 8&amp;#8243; index card in landscape orientation.  I fold it in half along the horizontal axis, and write my first name on one side using a coloured marker.  Everyone in the class mimics my actions.  Without a single word of instruction being given or questions being asked, either verbally or in writing, the mission has been accomplished: each person now has a tent card in front of him.)&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a potential risk associated with an exploratory approach: that the tester might fail to document something important. In that case, we do what skilled people do with risk: &lt;strong&gt;we manage it&lt;/strong&gt;.  James Bach talks at length about managing exploratory testing sessions &lt;a href=&quot;http://www.developsense.com/blog/2010/04/coding-qa-podcast-on-exploratory-testing-part-2/&quot; title=&quot;Coding QA Podcast on Exploratory Testing&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. Producing appropriate documentation is partly a technical process, but the technical considerations are dominated by business imperatives: cost, value, and risk.  There are also social considerations, too.  The tester, the test lead, the test manager, the programmers, other managers, and the product owner determine collaboratively what&amp;#8217;s important to document and what&amp;#8217;s not so important with respect to the current testing mission.  In an exploratory approach, we&amp;#8217;re more likely to be emphasizing the discovery of new information. So we&amp;#8217;re less likely to spend time on documenting what we &lt;em&gt;will do&lt;/em&gt;, more likely to document what we &lt;em&gt;are doing&lt;/em&gt; and what we &lt;em&gt;have done&lt;/em&gt;.  We could do a good deal of preparatory reading and writing, even in an exploratory approach&amp;mdash;but we realize that there&amp;#8217;s an ever-increasing risk that new discoveries will undermine the worth of what we write ahead of time.&lt;/p&gt;
&lt;p&gt;That leads directly to &amp;#8220;our purposes&amp;#8221;, the task that we want to accomplish when documenting something.  Just as testing itself has many possible missions, so too does test documentation. Here&amp;#8217;s a decidedly non-exhaustive list, prepared over a couple of minutes:&lt;ul&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;li&gt;to express testing strategy and tactics for an entire project, or for projects in general&lt;/li&gt;
&lt;li&gt;to keep a set of personal notes to help structure a debriefing conversation&lt;/li&gt;
&lt;li&gt;to outline testing activities for a test cycle&lt;/li&gt;
&lt;li&gt;to report on activities during testing execution &lt;/li&gt;
&lt;li&gt;to outline attributes of a particular quality criterion&lt;/li&gt;
&lt;li&gt;to catalogue ideas about risk&lt;/li&gt;
&lt;li&gt;to describe test coverage&lt;/li&gt;
&lt;li&gt;to account for the work that we&amp;#8217;ve done&lt;/li&gt;
&lt;li&gt;to program a machine to perform a given set of actions&lt;/li&gt;
&lt;li&gt;to alert people to potential problems in the product&lt;/li&gt;
&lt;li&gt;to guide a tester&amp;#8217;s actions over a test session&lt;/li&gt;
&lt;li&gt;to identify structures in the application or service&lt;/li&gt;
&lt;li&gt;to provide a description of how to use a particular test tool that we&amp;#8217;ve crafted&lt;/li&gt;
&lt;li&gt;to describe the tester&amp;#8217;s role, skills, and qualifications&lt;/li&gt;
&lt;li&gt;to explain business rules to someone else on the team&lt;/li&gt;
&lt;li&gt;to outline scenarios in which the product might be used or tested&lt;/li&gt;
&lt;li&gt;to identify, for a tester, a specific, explicit sequence of actions to perform, input to provide, and observations to make&lt;/li&gt;
&lt;p&gt;&lt;/p&gt;&lt;br /&gt;
That last item is the classic form of highly scripted testing, and that kind of documentation is usually absent from exploratory testing.  Even so, a tester can take an exploratory approach using a script as a point of departure or as a reference, just as you might use a trail map to help guide an off-trail hike (among other things, you might want to discover shortcuts or avoid the usual pathways).  So when someone says that &amp;#8220;exploratory testing is undocumented&amp;#8221;, I hear them saying something else.  I hear them saying, &amp;#8220;I only understand one form of test documentation, and I&amp;#8217;ve successfully &lt;strong&gt;ignored&lt;/strong&gt; &lt;em&gt;every other approach to it or purpose for it&lt;/em&gt;.&amp;#8221;
&lt;p&gt;If you look in the appendices for the &lt;a href=&quot;http://www.developsense.com/courses.html&quot;&gt;Rapid Software Testing class&lt;/a&gt; (you can find a .PDF at &lt;a href=&quot;http://www.satisfice.com/rst-appendices.pdf&quot; title=&quot;Rapid Software Testing Appendices&quot; target=&quot;_blank&quot;&gt;http://www.satisfice.com/rst-appendices.pdf&lt;/a&gt;), you&amp;#8217;ll see a large number of examples of documentation that are entirely consistent with an exploratory approach. That&amp;#8217;s just one source. For each item in my partial list above, here&amp;#8217;s a partial list of approaches, examples, and tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testing strategy and tactics for an entire project, or for projects in general.&lt;/strong&gt;&lt;br /&gt;
Look at the &lt;a href=&quot;http://www.satisfice.com/tools/satisfice-tsm-4p.pdf&quot;&gt;Satisfice Heuristic Test Strategy Model&lt;/a&gt; and the &lt;a href=&quot;http://www.satisfice.com/tools/satisfice-cm.pdf&quot;&gt;Context Model for Heuristic Test Planning&lt;/a&gt; (these also appear in the &lt;a href=&quot;http://www.satisfice.com/rst-appendices.pdf&quot;&gt;RST Appendices&lt;/a&gt;).  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An outline of testing activities for a test cycle.&lt;/strong&gt;&lt;br /&gt;
Look at the &lt;a href=&quot;http://www.satisfice.com/tools/procedure.pdf&quot;&gt;General Functionality and Stability Test Procedure for Certifed for Microsoft Windows Logo&lt;/a&gt;.  See also the OWL Quality Plan (and the Risk and Task Correlation) in the &lt;a href=&quot;http://www.satisfice.com/rst-appendices.pdf&quot;&gt;RST Appendices&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keeping a set of personal notes to help structure a debriefing or other conversation.&lt;/strong&gt;&lt;br /&gt;
See the &amp;#8220;Beans &amp;#8216;R Us Test Report&amp;#8221; in the &lt;a href=&quot;http://www.satisfice.com/rst-appendices.pdf&quot;&gt;RST Appendices&lt;/a&gt;; or see &lt;a href=&quot;http://www.developsense.com/newsletter/DevelopSense%20Newsletter%202006-01.pdf&quot;&gt;my notes on testing an in-flight entertainment system&lt;/a&gt; which I did for fun on a flight from India to Amsterdam.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recording activities and ideas during test execution&lt;/strong&gt;&lt;br /&gt;
A video camera or a screen recording tool can capture the specific actions of a tester for later playback and review.  Well-designed log files may also provide a kind of retrospective record about what was testing. Still neither of these provide insight into the tester&amp;#8217;s mind.  Recorded narration or conversation can do that; tools like BB Test Assistant, Camtasia, or Morae can help.  The classic approach, of course, is to take notes.  Have a look at my presentation, &amp;#8220;&lt;a href=&quot;http://www.developsense.com/presentations/etnotebook.pdf&quot;&gt;An Exploratory Tester&amp;#8217;s Notebook&lt;/a&gt;&amp;#8220;, which has examples of freestyle notes taken during an impromptu testing session, and detailed, annotated examples of &lt;a href=&quot;http://www.satisfice.com/sbtm&quot;&gt;Session-Based Test Management&lt;/a&gt; sessions. Shmuel Gerson&amp;#8217;s &lt;a href=&quot;http://testing.gershon.info/reporter/&quot; title=&quot;Rapid Reporter&quot;&gt;Rapid Reporter&lt;/a&gt; and Jonathan Kohl&amp;#8217;s &lt;a href=&quot;http://sessiontester.openqa.org/&quot; title=&quot;Session Tester&quot; target=&quot;_blank&quot;&gt;Session Tester&lt;/a&gt; are tools oriented towards taking notes (and, in the former case, including screen captures) of testing sessions on the fly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Outlining many attributes of a particular quality criterion&lt;/strong&gt;&lt;br /&gt;
See &amp;#8220;Heuristics of Software Testability&amp;#8221; in the &lt;a href=&quot;http://www.satisfice.com/rst-appendices.pdf&quot;&gt;RST Appendices&lt;/a&gt; for one example.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cataloguing ideas about risk&lt;/strong&gt;&lt;br /&gt;
Several examples of this in the &lt;a href=&quot;http://www.satisfice.com/rst-appendices.pdf&quot;&gt;RST Appendices&lt;/a&gt;, most extensively in the &amp;#8220;Deployment Planning and Risk Analysis&amp;#8221; example. You&amp;#8217;ll also find an &amp;#8220;Install Risk Catalog&amp;#8221;; &amp;#8220;The Risk of Incompatibility&amp;#8221;; the Risk vs. Tasks section in the &amp;#8220;OWL Quality Plan&amp;#8221;; the &amp;#8220;Y2K Compliance Report&amp;#8221;; &amp;#8220;Round Results Risk A&amp;#8221;, which shows a mapping of Risk Areas vs. Test Strategy and Tasks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Describing or outlining test coverage&lt;/strong&gt;&lt;br /&gt;
A &lt;em&gt;mapping&lt;/em&gt; establishes or illustrates relationships between things. We can use any of these to help us think about test coverage.  In testing, a map might look like a road map, but it might also look like a list, a chart, a table, or a pile of stories.  These can be constructed before, after, or during a given test activity, with the goal of covering the map with tests, or using testing to extend the map.  I catalogued several ways of thinking about coverage and reporting on it, in three articles &lt;a href=&quot;http://www.developsense.com/articles/2008-10-GotYouCovered.pdf&quot;&gt;Got You Covered&lt;/a&gt;, &lt;a href=&quot;http://www.developsense.com/articles/2008-11-CoverOrDiscover.pdf&quot;&gt;Cover or Discover&lt;/a&gt;, and &lt;a href=&quot;http://www.developsense.com/articles/2008-11-AMapByAnyOtherName.pdf&quot;&gt;A Map By Any Other Name&lt;/a&gt;.  Several examples of lightweight coverage outlines can be found in the &lt;a href=&quot;http://www.satisfice.com/rst-appendices.pdf&quot;&gt;RST Appendices&lt;/a&gt; (&amp;#8220;Putt Putt Saves the Zoo&amp;#8221;, &amp;#8220;Table Formatting Test Notes&amp;#8221;, There are also coverage ideas incorporated into the Apollo mission notes that we&amp;#8217;ve titled &amp;#8220;Guideword Heuristics for Astronauts&amp;#8221;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accounting for testing work that we&amp;#8217;ve done.&lt;/strong&gt;&lt;br /&gt;
See &lt;a href=&quot;http://www.satisfice.com/sbtm&quot; title=&quot;Session-Based Test Management&quot; target=&quot;_blank&quot;&gt;Session-Based Test Management&lt;/a&gt;, and see &amp;#8220;&lt;a href=&quot;http://www.developsense.com/presentations/etnotebook.pdf&quot;&gt;An Exploratory Tester&amp;#8217;s Notebook&lt;/a&gt;&amp;#8220;.  Darren McMillan provides &lt;a href=&quot;http://www.bettertesting.co.uk/content/?p=956&quot;&gt;excellent examples of annotated mind maps&lt;/a&gt;; scroll down to the section headed &amp;#8220;Session Reports&amp;#8221;, and continue through &amp;#8220;Simplifying feedback to management&amp;#8221; and &amp;#8220;Simplifying feedback to groups&amp;#8221;.  A forthcoming article, written by me, shows how a senior test manager tracks testing sessions at a half-day granularity level.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Programming a machine to help you to explore&lt;/strong&gt;&lt;br /&gt;
See all manner of books on programming, both references and cookbooks, but for testers in particular, have a look at Brian Marick&amp;#8217;s &lt;a href=&quot;http://www.amazon.com/Everyday-Scripting-Ruby-Teams-Testers/dp/0977616614&quot;&gt;Everyday Scripting with Ruby&lt;/a&gt;.  Check out Pete Houghton&amp;#8217;s splendid examples of exploratory test automation that begin &lt;a href=&quot;http://www.investigatingsoftware.co.uk/2011/08/test-automation-that-helps-guardian.html&quot;&gt;here&lt;/a&gt;.  Cem Kaner (often in collaboration with Doug Hoffman) write extensively about automation-assisted exploratory testing; an example is &lt;a href=&quot;http://kaner.com/wp-content/uploads/2010/08/ExploratoryTestAutomationHoffman.pdf&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alerting people to potential problems in the product&lt;/strong&gt;&lt;br /&gt;
In general, bug reporting systems provide one way to handle the task of recording and reporting problems in the product.  James Bach provides &lt;a href=&quot;http://www.satisfice.com/articles/mpim-report.pdf&quot;&gt;an example of a report&lt;/a&gt; that he provided to a client (along with &lt;a href=&quot;http://www.satisfice.com/blog/archives/598&quot;&gt;a more informal account of the session&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Guiding a tester&amp;#8217;s actions over a test session&lt;/strong&gt;&lt;br /&gt;
Guiding a tester involves skills like chartering and checklisting.  Start with the documentation on Session Based Test Management (http://www.satisfice.com/sbtm). Selena Delesie has produced &lt;a href=&quot;http://selenadelesie.com/2009/12/18/charting-a-course/&quot;&gt;an excellent blog post on chartering exploratory testing sessions&lt;/a&gt;.  The title of Cem Kaner&amp;#8217;s presentation at CAST 2008, &lt;a href=&quot;http://www.kaner.com/pdfs/ValueOfChecklists.pdf&quot;&gt;The Value of Checklists and the Danger of Scripts:  What legal training suggests for testers&lt;/a&gt; describes the content perfectly.  Michael Hunter&amp;#8217;s &lt;a href=&quot;http://www.thebraidytester.com/downloads/YouAreNotDoneYet.pdf&quot;&gt;You Are Not Done Yet&lt;/a&gt; lists can be used and adapted to your context as a set of checklists.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To identify structures in the application or service&lt;/strong&gt;&lt;br /&gt;
The &amp;#8220;Product Elements&amp;#8221; section in the &lt;a href=&quot;http://www.satisfice.com/tools/satisfice-tsm-4p.pdf&quot;&gt;Heuristic Test Strategy Model&lt;/a&gt; provides a kind of framework for documenting product structures.  In the &lt;a href=&quot;http://www.satisfice.com/rst-appendices.pdf&quot;&gt;RST Appendices&lt;/a&gt;, the test notes for &amp;#8220;Putt Putt Saves the Zoo&amp;#8221; and &amp;#8220;Diskmapper&amp;#8221;, and the &amp;#8220;OWL Quality Plan&amp;#8221; provide examples of identifying several different structures in the programs under test.  Mind mapping provides a means of describing and illustrating structures, too; see Darren McMillan&amp;#8217;s examples &lt;a href=&quot;http://www.bettertesting.co.uk/content/?p=1438&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;http://www.bettertesting.co.uk/content/?p=1372&quot;&gt;here&lt;/a&gt;.  Ruud Cox and Ru Cindrea used &lt;a href=&quot;http://yfrog.com/h25gtqej&quot;&gt;a mind map of product elements&lt;/a&gt; to help win the Best Bug Report award in the Test Lab at EuroSTAR 2011.  I&amp;#8217;ve created a list of &lt;a href=&quot;http://www.developsense.com/resources.html#exploratory&quot;&gt;structures that support exploratory testing&lt;/a&gt;, and many of these are related to structures in the product.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Providing a description of how to use a particular test tool that we&amp;#8217;ve crafted&lt;/strong&gt;&lt;br /&gt;
While working at a bank, I developed (in Excel and VBA) a tool that could be used as an oracle and as a way of recording test results.  (Thanks to non-disclosure agreements, I can describe these, but cannot provide examples.)  When I left the project, I was obliged to document my work.  I didn&amp;#8217;t work on the assumption that anyone off the street would be reading the document. Instead, I presumed that anyone assigned to that testing job and to using that tool, would have the rapid learning skill to explore the tool, the product, and the business domain in a mutually supportive way.  So I crafted documentation that was intended to tell testers just enough to get them exploring.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Explaining business rules to someone else on the team&lt;/strong&gt;&lt;br /&gt;
I did include documentation for novices of one kind:  within the documentation for that testing tool, I  included a general description of how foreign exchange transactions worked from the bank&amp;#8217;s perspective, and how appropriate accounts got credited and debited. I had learned this by reverse-engineering use cases and consulting with the local business analyst. I summarized it with a two-page document written in simple, direct language, referring disrectly to the simpler use cases and explaining the more confusing bits in more detail.  For those whose learning style was oriented toward code, I also described the tables and array formulas that applied the business rules.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Outlining scenarios in which the product might be used or tested&lt;/strong&gt;&lt;br /&gt;
I discuss some issues about scenarios &lt;a href=&quot;http://www.developsense.com/blog/2010/05/why-we-do-scenario-testing/&quot;&gt;here&lt;/a&gt;&amp;mdash;why they&amp;#8217;re important, and why it&amp;#8217;s important to keep them open-ended and open to interpretation.  It&amp;#8217;s more important to record than to prescribe, since in a good scenario, you&amp;#8217;ll observe and discover much more than you&amp;#8217;ve articulated in advance. Cem Kaner gives ideas on how to produce &lt;a href=&quot;http://kaner.com/pdfs/CAST2010ScenarioTestingTutorial.pdf&quot;&gt;scenarios&lt;/a&gt;; Hans Buwalda presents examples of &lt;a href=&quot;http://www.logigear.com/logi_media_dir/Documents/Soap_Opera_Testing.pdf&quot;&gt;soap opera testing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Identifying required tester skill&lt;/strong&gt;&lt;br /&gt;
People with skill don&amp;#8217;t need prescriptive documentation for every little thing.  Responsible managers identify the skills needed to test, and who commit to employing people who either have those skills or can develop them quickly.  James Bach eliminated 50 pages of otiose documentation with &lt;a href=&quot;http://www.developsense.com/blog/2011/12/worthwhile-documentation/&quot;&gt;two paragraphs&lt;/a&gt;. (Otiose is a marvelous word; it&amp;#8217;s fun to &lt;a href=&quot;http://thesaurus.com/browse/otiose&quot;&gt;look it up in a thesaurus&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Identifying, for a tester, a particular explicit sequence of actions to perform, input to provide, and observations to make.&lt;/strong&gt;&lt;br /&gt;
Again, a document that attempts to specify exactly what a tester should do is the hallmark of scripted testing.  James Bach &lt;a href=&quot;http://www.satisfice.com/blog/archives/672&quot;&gt;articulates a paradox&lt;/a&gt; that has not yet been noted clearly in our craft:  in order to perform a scripted test &lt;em&gt;well&lt;/em&gt;, you need signficant amounts of skill and tacit knowledge (and you also need to ignore the script on occasion, and you need to know when those occasions are).  There&amp;#8217;s another interesting issue here:  preparing such documents usually depends on exploratory activity.  There&amp;#8217;s no script to tell you how to write a script.  (You might argue there&amp;#8217;s one exception.  You can follow this script to write a test script:  take each line of a requirements document, and add the words &amp;#8220;Verify that&amp;#8221; to the beginning of each line.)&lt;/p&gt;
&lt;p&gt;Now, just as you can perform testing badly using any approach, you can perform exploratory testing and document it inappropriately, either by under-documenting it OR over-documenting it using any of the kinds of documentation above. But, as &lt;em&gt;this document&lt;/em&gt; shows, the notion that exploratory testing is by its nature undocumented is not only ignorant, but &lt;em&gt;aggressively&lt;/em&gt; ignorant about both testing and documentation.  Whenever you see someone claim that exploratory testing is undocumented, I&amp;#8217;d ask you to help by setting the record straight.  Feel free to refer to this blog post, if you find it helpful; also, please point me to other exemplars of excellent documentation that are consistent with exploratory approaches. If we all work together, we can bury this myth, while providing excellent records and reports for our clients.&lt;/p&gt;</content>
		<author>
			<name>Michael</name>
			<uri>http://www.developsense.com/blog</uri>
		</author>
		<source>
			<title type="html">Developsense Blog</title>
			<subtitle type="html">DevelopSense Blog</subtitle>
			<link rel="self" href="http://www.developsense.com/blog/feed/atom/"/>
			<id>http://www.developsense.com/blog/feed/atom/</id>
			<updated>2012-02-08T20:48:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">We’ve Hired My Sister– Website Will Improve Soon!</title>
		<link href="http://www.satisfice.com/blog/archives/716"/>
		<id>http://www.satisfice.com/blog/?p=716</id>
		<updated>2012-01-30T09:59:12+00:00</updated>
		<content type="html">&lt;p&gt;Satisfice, Inc. welcomes my sister Erika Good to our company. She&amp;#8217;s our new Director of Marketing and Communication.&lt;/p&gt;
&lt;p&gt;Erika is two years older than me. When I first got kicked out of my home, in 1981, I was a freshman in high school. Erika and I would meet each morning (on the mornings I didn&amp;#8217;t oversleep or otherwise skip school) in the school library to check in. Later, it was Erika who alerted my father that I had started drinking, which is why I have only been drunk twice in my life&amp;#8211; both when I was 15 years old&amp;#8211; and why I barely ever drink now. Erika and I have always had a bond. Now she and my wife Lenore will share the burden of keeping me productive when I&amp;#8217;m on the road and helping me organize and publish all my stuff.&lt;/p&gt;
&lt;p&gt;Erika is quiet, polite, and unassuming (the opposite of me, in other words); a dedicated housewife and mother of two grown boys. She&amp;#8217;s also an expert marksman (she competed as a member the Vermont National Guard &lt;span&gt;pistol team&lt;/span&gt;— wait, she&amp;#8217;s saying it was the rifle team. How did I not know that?),  an &lt;a href=&quot;http://www.quillscapes.com/index.htm&quot;&gt;artist&lt;/a&gt;, an &lt;a href=&quot;http://www.lulu.com/product/paperback/living-away-a-mothers-story-of-letting-go/18848862&quot;&gt;author&lt;/a&gt; as well as a private pilot and webmaster, who also helps run her husband&amp;#8217;s property business&amp;#8230; Geez, I didn&amp;#8217;t realize how much she&amp;#8217;s done until I had to write that sentence!&lt;/p&gt;
&lt;p&gt;One immediate effect she will have is on our long neglected website. She&amp;#8217;s already put up the announcement of the &lt;a href=&quot;http://www.satisfice.com/rapidtestevent.shtml&quot;&gt;Rapid Testing Intensive&lt;/a&gt;, and added a &lt;a href=&quot;http://www.satisfice.com/videos.shtml&quot;&gt;video page&lt;/a&gt;. She&amp;#8217;s helping me create a &lt;a href=&quot;http://www.librarything.com/catalog/esatisfice/testersbookshelf&quot;&gt;brand new bibliography&lt;/a&gt; and resource list. She&amp;#8217;s going to add tags to all the blog entries and get a lot more content published that has been sitting on my hard drive.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone&quot; title=&quot;Erika Bach Good&quot; src=&quot;http://www.satisfice.com/images/erika.jpg&quot; alt=&quot;&quot; width=&quot;288&quot; height=&quot;216&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>James Bach</name>
			<uri>http://www.satisfice.com/blog</uri>
		</author>
		<source>
			<title type="html">James Bach’s Blog</title>
			<subtitle type="html">The Consulting Software Tester</subtitle>
			<link rel="self" href="http://www.satisfice.com/blog/feed"/>
			<id>http://www.satisfice.com/blog/feed</id>
			<updated>2012-01-31T20:48:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A Consulting Session With an Unfortunate Victim</title>
		<link href="http://www.satisfice.com/blog/archives/705"/>
		<id>http://www.satisfice.com/blog/?p=705</id>
		<updated>2012-01-28T03:50:02+00:00</updated>
		<content type="html">&lt;p&gt;&lt;em&gt;This poor girl from Ghana inherited many kilograms of gold and can&amp;#8217;t get at it because she can&amp;#8217;t pay the back due rent on the gold storage unit. She has reached out to me, a total stranger, for help. I use my testing skills to help her understand that she&amp;#8217;s being scammed. But you know, sometimes it&amp;#8217;s hard to help people see the truth when fantasy seems less painful&amp;#8230; &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A stranger approaches on Skype&amp;#8230;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[12:29:22 AM] Irene Kusi: Hello&lt;/p&gt;
&lt;p&gt;[12:29:33 AM] James Bach: hi&lt;/p&gt;
&lt;p&gt;[12:29:44 AM] Irene Kusi: How are you doing ?&lt;/p&gt;
&lt;p&gt;[12:29:54 AM] James Bach: Why are you contacting me?&lt;/p&gt;
&lt;p&gt;[12:30:10 AM] Irene Kusi: I am very sorry about that and sorry again if i disturb you. I am Irene Kusi from the UK but i am now in Ghana and i would like to know more about you.&lt;/p&gt;
&lt;p&gt;[12:30:51 AM] James Bach: Why are you contacting ME, though?&lt;/p&gt;
&lt;p&gt;[12:31:39 AM] Irene Kusi: Like i just told you .sorry if i disturb you.&lt;/p&gt;
&lt;p&gt;[12:32:06 AM] James Bach: You haven&amp;#8217;t told me why you came to me instead of someone else. Is there any reason?&lt;/p&gt;
&lt;p&gt;[12:32:10 AM] Irene Kusi: Can we get to know each other personally? What do you mean ?&lt;/p&gt;
&lt;p&gt;[12:32:27 AM] James Bach: Look, strangers contact me often for business purposes. That&amp;#8217;s normal. I&amp;#8217;m trying to figure out if this is for business. Usually people tell me why they are contacting me.&lt;/p&gt;
&lt;p&gt;[12:33:08 AM] Irene Kusi: Yes is not strictly business. I just would like to get to know you&lt;/p&gt;
&lt;p&gt;[12:33:18 AM] James Bach: So, you don&amp;#8217;t know who I am.&lt;/p&gt;
&lt;p&gt;[12:33:54 AM] Irene Kusi: Yes i really dont know you but i found your profile on skype and decided to get to know you if i can work with you.&lt;/p&gt;
&lt;p&gt;[12:34:23 AM] James Bach: You just chose me at random? Seems like a lot of people from Ghana are doing that.&lt;/p&gt;
&lt;p&gt;[12:35:13 AM] Irene Kusi: Why have some people from ghana done something like that to you ?&lt;/p&gt;
&lt;p&gt;[12:35:18 AM] James Bach: Yes you are not the first person from Ghana to randomly contact me&lt;/p&gt;
&lt;p&gt;[12:35:40 AM] Irene Kusi: And what did they want ??&lt;/p&gt;
&lt;p&gt;[12:35:51 AM] James Bach: They wouldn&amp;#8217;t tell me&amp;#8230; Just like you aren&amp;#8217;t telling me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(She cuts the small-talk and tells me her problem&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;[12:36:30 AM] Irene Kusi: My main motive here is to find someone who will help me inherit my property thats why i am on skype .&lt;/p&gt;
&lt;p&gt;[12:36:40 AM] James Bach: oh, a 419 thing. I understand&lt;/p&gt;
&lt;p&gt;[12:38:27 AM] Irene Kusi: Oh who said is a 419 thing&lt;/p&gt;
&lt;p&gt;[12:39:03 AM] James Bach: I did, &amp;#8220;oh, a 419 thing&amp;#8221; See, that&amp;#8217;s where I said it.&lt;/p&gt;
&lt;p&gt;[12:39:23 AM] Irene Kusi: what shows is a 419 thing&lt;/p&gt;
&lt;p&gt;[12:39:41 AM] James Bach: You said &amp;#8220;My main motive here is to find someone who will help me inherit my property thats why i am on skype.&amp;#8221; If you haven&amp;#8217;t heard of 419, that&amp;#8217;s okay.&lt;/p&gt;
&lt;p&gt;[12:40:54 AM] Irene Kusi: Ok&lt;/p&gt;
&lt;p&gt;[12:41:12 AM] James Bach: Usually it&amp;#8217;s Nigerians who need this kind of help. I didn&amp;#8217;t know it was happening in Ghana, too.&lt;/p&gt;
&lt;p&gt;[12:41:34 AM] Irene Kusi: Ok .so are you going to help me or not ?&lt;/p&gt;
&lt;p&gt;[12:41:46 AM] James Bach: What do you need?&lt;/p&gt;
&lt;p&gt;[12:42:06 AM] Irene Kusi: I will like you to help me pay with the bills so that i can get the gold&lt;/p&gt;
&lt;p&gt;[12:43:07 AM] James Bach: Oh, you want money. Why didn&amp;#8217;t you say so at the start?&lt;/p&gt;
&lt;p&gt;[12:43:20 AM] Irene Kusi: I dont know why&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(With my tester skills, I immediately comprehend what&amp;#8217;s going on: she&amp;#8217;s too innocent; she sees only the good in people&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;[12:44:26 AM] James Bach: Okay, but, why would you trust me? You don&amp;#8217;t know me. I might be a bad guy.&lt;/p&gt;
&lt;p&gt;[12:45:11 AM] Irene Kusi: Nothing i have just gotten to know that you a very giid guy and i will trsut you .&lt;/p&gt;
&lt;p&gt;[12:46:39 AM] James Bach: I think you have to be careful, though. There are many people in the world who may try to take advantage of you. Especially if you have inherited gold. Let me ask you this: If I help you, will you share part of the gold with me?&lt;/p&gt;
&lt;p&gt;[12:47:51 AM] Irene Kusi: I will do exactly that not just half but i will let you get the whole gold that is i will bring it to the USA and then we will sell it there and share the money. But before we share the money i will give you 5kilograms of the gold for free just for helping me get it . &lt;em&gt;[Editors note: that's about $300,000]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;[12:48:30 AM] James Bach: See? You were just about to trust me and then I tried to take your gold! Irene, you are WAY too trusting. People will want to take from you and not give you anything.&lt;/p&gt;
&lt;p&gt;[12:49:14 AM] Irene Kusi: Oh so will you do that to me ?&lt;/p&gt;
&lt;p&gt;[12:49:28 AM] James Bach: I just proved that you would LET me if I TRIED to. That was a test. I do testing for a living. And you showed that you are too innocent and good. This is a hard world, full of cheaters.&lt;/p&gt;
&lt;p&gt;[12:50:07 AM] Irene Kusi: Oh okay thank you so much for telling me this .&lt;/p&gt;
&lt;p&gt;[12:50:13 AM] James Bach: They may try to contact you and fool you into giving up your money. So be more careful.&lt;/p&gt;
&lt;p&gt;[12:50:26 AM] Irene Kusi: Thank you&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(Now I go into consulting mode&amp;#8230; First, learn about the problem. Often the real problem is not the one they come to you with.)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[12:50:31 AM] James Bach: Why don&amp;#8217;t you keep your money? You will need it.&lt;/p&gt;
&lt;p&gt;[12:51:16 AM] Irene Kusi: Ok so are you going to help me pay for the bills so that i get the gold ??&lt;/p&gt;
&lt;p&gt;[12:51:46 AM] James Bach: I thought you said the gold belonged to you.&lt;/p&gt;
&lt;p&gt;[12:51:52 AM] Irene Kusi: Yes&lt;/p&gt;
&lt;p&gt;[12:52:04 AM] James Bach: Then you have much much more money than I have. You can pay them yourself, can&amp;#8217;t you?&lt;/p&gt;
&lt;p&gt;[12:52:21 AM] Irene Kusi: Oh no not right now. You know my dad left the Gold as a form of inheritance for me and since he could keep all that in his house he had to give it to his lawyer.&lt;/p&gt;
&lt;p&gt;[12:53:14 AM] James Bach: Okay, so the lawyer has it.&lt;/p&gt;
&lt;p&gt;[12:53:42 AM] Irene Kusi: Yes and what the lawyer is also saying is that he gave it to a security house here in ghana&lt;/p&gt;
&lt;p&gt;[12:53:55 AM] James Bach: That&amp;#8217;s good. Then you know where it is. What happened when you went to get it?&lt;/p&gt;
&lt;p&gt;[12:54:42 AM] Irene Kusi: They told me that i have to pay for the number of years that it has been there so that they can give it to me . And the lawyer told me that i also need to get a man who will stand by me just to help me&lt;/p&gt;
&lt;p&gt;[12:55:42 AM] James Bach: Is this place a bank?&lt;/p&gt;
&lt;p&gt;[12:56:03 AM] Irene Kusi: No is not bank but a storage house .&lt;/p&gt;
&lt;p&gt;[12:56:19 AM] James Bach: Is it licensed to store gold?&lt;/p&gt;
&lt;p&gt;[12:56:29 AM] Irene Kusi: Yes. Is a licensed company. It has the sole mandate to store gold for people&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(Use my knowledge of local laws and customs to reveal the true culprit. A consultant should have deep knowledge in useful domains.)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[12:56:57 AM] James Bach: Then they are violating Ghanan law by charging you to release it. Your lawyer should have told you that. Do you trust that lawyer? Do you know him well?&lt;/p&gt;
&lt;p&gt;[12:57:27 AM] Irene Kusi: Yes he is the family lawyer .&lt;/p&gt;
&lt;p&gt;[12:57:51 AM] James Bach: Then why is he telling you something that is against the laws of your own country? I think you need to talk to a different lawyer.&lt;/p&gt;
&lt;p&gt;[12:58:59 AM] Irene Kusi: When we went there they told me that is not like they are charging me for the gold which is mine said by my late dad but for the number of years they have kept the gold for safe keeping thats what they mean. The lawyer has got nothing to do with this at all.&lt;/p&gt;
&lt;p&gt;[1:01:34 AM] James Bach: That&amp;#8217;s called an &amp;#8220;advance fee scam&amp;#8221; and they are trying to trick you. You need to go to the police. But I think your lawyer may be in on this. He may even have paid off the police.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(My kind of consulting involves tough, direct speech, on occasion. Sometimes that&amp;#8217;s hard for clients to hear.)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[1:02:07 AM] Irene Kusi: You cant talk to my lawyer like that&lt;/p&gt;
&lt;p&gt;[1:02:12 AM] James Bach: Your lawyer, if he knows Ghanan law, knows that they aren&amp;#8217;t ALLOWED to charge you. They can&amp;#8217;t charge you! You are being tricked!&lt;/p&gt;
&lt;p&gt;[1:02:26 AM] Irene Kusi: Ok&lt;/p&gt;
&lt;p&gt;[1:02:39 AM] James Bach: I told you that you have to be careful. Gold is VERY valuable. People want to steal it.&lt;/p&gt;
&lt;p&gt;[1:03:03 AM] Irene Kusi: so now are you going to help me pay the bills or not ?&lt;/p&gt;
&lt;p&gt;[1:03:46 AM] James Bach: I&amp;#8217;m telling you that you don&amp;#8217;t owe any bills. It&amp;#8217;s a trap. They want you to pay them and then they won&amp;#8217;t give you anything. You need to wake up Irene. You are a crime victim.&lt;/p&gt;
&lt;p&gt;[1:04:05 AM] Irene Kusi: Stop what you are saying&lt;/p&gt;
&lt;p&gt;[1:04:06 AM] James Bach: That gold is yours. You deserve it.&lt;/p&gt;
&lt;p&gt;[1:04:08 AM] Irene Kusi: i hate it.  what do you take me for ? you are not ready to pay fpor the bills thats why you are doing this&lt;/p&gt;
&lt;p&gt;[1:04:40 AM] James Bach: I think you put too much belief in people who are now trying to hurt you.  Now you are upset and you want to blame me. But I am just the messenger.&lt;/p&gt;
&lt;p&gt;[1:05:08 AM] Irene Kusi: do you think the storage house is an orphanage home where they keep things for free?&lt;/p&gt;
&lt;p&gt;[1:05:59 AM] James Bach: Stand up for your rights, Irene. Even in Ghana, there are laws and people have to follow them. They can&amp;#8217;t just steal your gold and say you can&amp;#8217;t have it because it&amp;#8217;s been &amp;#8220;sitting there for a long time&amp;#8221;&lt;/p&gt;
&lt;p&gt;[1:06:24 AM] Irene Kusi: Stop what you are saying&lt;/p&gt;
&lt;p&gt;[1:06:26 AM] James Bach: Under GHANA LAW a licensed gold storage house CANNOT charge for storage AFTER the fact. They take payment UP FRONT. Your father already paid. Your lawyer knows that. You have to fight for what is right.&lt;/p&gt;
&lt;p&gt;[1:06:49 AM] Irene Kusi: no he didnt pay&lt;/p&gt;
&lt;p&gt;[1:07:06 AM] James Bach: THAT&amp;#8217;S WHAT YOUR LAWYER TOLD YOU? I can&amp;#8217;t believe what a liar this guy is. Do you think you can just bring gold to a storage house and not pay them to store it? He must have paid. So now you are asking strangers to help you pay a bill that YOU DON&amp;#8217;T EVEN HAVE.&lt;/p&gt;
&lt;p&gt;[1:08:23 AM] Irene Kusi: Bye&lt;/p&gt;
&lt;p&gt;[1:08:29 AM] James Bach: I hope you get your gold. Think about what I said.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(If the client is not ready, it doesn&amp;#8217;t matter what you tell them: they won&amp;#8217;t benefit. I like to think Irene is taking my words to heart. But I have to accept that she probably won&amp;#8217;t. Meanwhile I can only hope that her lawyer has invested his ill-gotten gains in an American solar company.)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;</content>
		<author>
			<name>James Bach</name>
			<uri>http://www.satisfice.com/blog</uri>
		</author>
		<source>
			<title type="html">James Bach’s Blog</title>
			<subtitle type="html">The Consulting Software Tester</subtitle>
			<link rel="self" href="http://www.satisfice.com/blog/feed"/>
			<id>http://www.satisfice.com/blog/feed</id>
			<updated>2012-01-31T20:48:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Rapid Testing Intensive</title>
		<link href="http://www.satisfice.com/blog/archives/693"/>
		<id>http://www.satisfice.com/blog/?p=693</id>
		<updated>2012-01-25T02:03:21+00:00</updated>
		<content type="html">&lt;p&gt;Announcing the &lt;a href=&quot;http://www.satisfice.com/rapidtestevent.shtml&quot;&gt;Rapid Testing Intensive seminar&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is something new. From July 24 to 28, my brother and I are going to run a short, extreme testing project over five days. We have a nice big space, good Internet, and we&amp;#8217;ll be cut off from all distractions.&lt;/p&gt;
&lt;p&gt;The most interesting element, from my point of view, is that students can attend onsite OR online. Onsite attendance is more trouble, more work, more expense, but also a completely vivid immersive testing experience where you will work shoulder to shoulder with two of the guys who created the Rapid Testing methodology that is now taught all over the world. Online participants will also test and attend optional webinars twice a day during the week. We will have a dedicated coordinator and an online forum so that the experience will be exactly like working as a remote tester on a busy project team.&lt;/p&gt;
&lt;p&gt;The outcome of the week will be a test report that will become a part of each participant&amp;#8217;s professional portfolio.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m so glad Jon is doing this with me. We complement each other well. Jon is a day-to-day test manager who has applied Rapid Testing in his work for nearly all his career since the mid-90&amp;#8217;s. I&amp;#8217;m a consultant who&amp;#8217;s been teaching Rapid Testing since I invented it. Besides, it gives me an excuse to use this graphic&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone&quot; src=&quot;http://www.satisfice.com/images/Bachbros_small.jpg&quot; alt=&quot;&quot; width=&quot;200&quot; height=&quot;200&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This may look like George Lucas and Vladimir Lenin, but it&amp;#8217;s me and Jon&amp;#8230;&lt;/p&gt;</content>
		<author>
			<name>James Bach</name>
			<uri>http://www.satisfice.com/blog</uri>
		</author>
		<source>
			<title type="html">James Bach’s Blog</title>
			<subtitle type="html">The Consulting Software Tester</subtitle>
			<link rel="self" href="http://www.satisfice.com/blog/feed"/>
			<id>http://www.satisfice.com/blog/feed</id>
			<updated>2012-01-31T20:48:20+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Avoid Trivial Bugs, Report What Works</title>
		<link href="http://feedproxy.google.com/~r/EricJacobsonSoftwareTestingBlog/~3/Yw4pmrhasTI/avoid-trivial-bugs-report-what-works.html"/>
		<id>tag:blogger.com,1999:blog-8951904624959546499.post-1524771626100825913</id>
		<updated>2012-01-24T18:10:00+00:00</updated>
		<content type="html">&lt;blockquote&gt; &lt;p&gt;&lt;em&gt;I’ve been testing this darn thing all morning and I haven't found a single bug, or even an &lt;/em&gt;&lt;a href=&quot;http://www.developsense.com/blog/2011/01/youve-got-issues/&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;issue&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&amp;nbsp; My manager probably thinks I’m not testing well enough.&amp;nbsp; My other tester colleagues keep finding bugs in their projects.&amp;nbsp; Maybe I’m not a very good tester.&amp;nbsp; My next scrum report is going to be lame.&amp;nbsp; This sucks, man.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Wrong!&amp;nbsp; It probably doesn’t suck.&amp;nbsp; Not finding bugs may be a good thing.&amp;nbsp; Your team may be building stuff that works.&amp;nbsp; And you get to be the lucky dude who delivers the good news.&amp;nbsp; &lt;/p&gt; &lt;p&gt;If there is lots of stuff that works and no bugs, you have even more to report than testers who keep finding bugs.&amp;nbsp; Testers who keep finding bugs are probably executing fewer tests than you so they know less about their products than you.&amp;nbsp; Instead of figuring out what works, they are stuck investigating what doesn’t work.&amp;nbsp; They’ll still need to figure out what works eventually, it’s just going to take them a while to get there.&amp;nbsp; And &lt;em&gt;that&lt;/em&gt; sucks.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;My manager is probably looking at my low bug count metric, thinking I’m not doing anything.&amp;nbsp; Logging bugs makes me feel like a bad ass.&amp;nbsp; There must be something I can log…hmmm…I know, I’ll log a bug for this user message; it’s not really worded as well as it could be…it has been like that for the last four years.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;No!&amp;nbsp; No!&amp;nbsp; No!&amp;nbsp; That’s gaming the system.&amp;nbsp; It’s not going to work.&amp;nbsp; You’re going to get a reputation as a tester who logs trivial bugs.&amp;nbsp; Your manager is only counting bugs because you’re not giving her anything else.&amp;nbsp; She just wants to know what you’re doing.&amp;nbsp; Help your manager.&amp;nbsp; Show her where to find your test reports, session sheets, or test execution results.&amp;nbsp; Invite her to your scrum meetings. Tell her how busy you’ve been knocking out tests and how bad ass your entire project team is.&lt;/p&gt; &lt;p&gt;Think about it.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Reporting what works may be better than reporting trivial bugs.&lt;/p&gt;  &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8951904624959546499-1524771626100825913?l=www.testthisblog.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/EricJacobsonSoftwareTestingBlog/~4/Yw4pmrhasTI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Eric Jacobson</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.testthisblog.com/</uri>
		</author>
		<source>
			<title type="html">Test This Blog - Eric Jacobson's Software Testing Blog</title>
			<subtitle type="html">Refinements on the art of software testing</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/EricJacobsonSoftwareTestingBlog"/>
			<id>tag:blogger.com,1999:blog-8951904624959546499</id>
			<updated>2012-02-08T20:47:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Software Testing Resources</title>
		<link href="http://feedproxy.google.com/~r/venkatreddyc/~3/GakAefjIWsw/"/>
		<id>http://www.venkatreddy.in/?p=388</id>
		<updated>2012-01-24T10:30:19+00:00</updated>
		<content type="html">Software Testing resources that are helpful to development community&lt;br /&gt;
&lt;br /&gt;
[[ This is a content summary only. Visit my website for full links, other content, and more! ]]&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/venkatreddyc?a=GakAefjIWsw:pI3T5TuXy2I:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/venkatreddyc?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/venkatreddyc?a=GakAefjIWsw:pI3T5TuXy2I:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/venkatreddyc?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/venkatreddyc?a=GakAefjIWsw:pI3T5TuXy2I:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/venkatreddyc?i=GakAefjIWsw:pI3T5TuXy2I:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/venkatreddyc?a=GakAefjIWsw:pI3T5TuXy2I:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/venkatreddyc?d=qj6IDK7rITs&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/venkatreddyc?a=GakAefjIWsw:pI3T5TuXy2I:YwkR-u9nhCs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/venkatreddyc?d=YwkR-u9nhCs&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/venkatreddyc?a=GakAefjIWsw:pI3T5TuXy2I:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/venkatreddyc?d=dnMXMwOfBR0&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/venkatreddyc/~4/GakAefjIWsw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Venkat Reddy Chintalapudi</name>
			<uri>http://www.venkatreddy.in</uri>
		</author>
		<source>
			<title type="html">Venkat's Blog</title>
			<subtitle type="html">Exploring the craft of Software Testing, Quality &amp;amp; Development</subtitle>
			<link rel="self" href="http://venkatreddy.in/feed/atom/"/>
			<id>http://www.venkatreddy.in/feed/atom/</id>
			<updated>2012-02-03T20:48:21+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">An ode to running a database on bare metal</title>
		<link href="http://agiletesting.blogspot.com/2012/01/ode-to-running-database-on-bare-metal.html"/>
		<id>tag:blogger.com,1999:blog-9238405.post-221047676093181510</id>
		<updated>2012-01-24T09:03:01+00:00</updated>
		<content type="html">&lt;br /&gt;No, my muse is not quite as strong as to inspire me to write an ode, but I still want to emphasize a few points about the goodness of running a database on bare metal.&lt;br /&gt;&lt;br /&gt;At Evite, we use sharded MySQL for our production database. We designed the current architecture in 2009, when NoSQL was still very much in its infancy, so MySQL seemed a solid choice, a technology that we could at least understand. As I explained&amp;nbsp;&lt;a href=&quot;http://agiletesting.blogspot.com/2011/04/lessons-learned-from-deploying.html&quot;&gt;elsewhere&lt;/a&gt;, we do use MySQL in an almost non-relational way, and we sharded from the get-go, with the idea that it's better to scale horizontally than vertically.&lt;br /&gt;&lt;br /&gt;We initially launched with the database hosted at a data center on a few Dell PE2970 servers, each with 16 GB of RAM and 2 quad-core CPUs. Each server was running 2 MySQL instances. We didn't get a chance to dark launch, but the initial load testing we did showed that we should be OK. However, there is nothing like production traffic to really stress test your infrastructure, and we soon realized that we have an insufficient number of servers for the peak traffic we were expecting towards the end of the year.&lt;br /&gt;&lt;br /&gt;We decided to scale horizontally in EC2, with one MySQL instance per m1.xlarge EC2 instance. At the time we also engaged Percona and they helped us fine-tune our Percona XtraDB MySQL configuration so we could get the most out of the m1.xlarge horsepower. We managed to scale sufficiently enough for our high season in 2010, although we had plenty of pain points. We chose to use EBS volumes for our database files, because at the time EBS still gave people the illusion of stability and durability. We were very soon confronted with severe performance issues, manifested as very high CPU I/O wait times, which were sometimes so high as to make the instance useless.&lt;br /&gt;&lt;br /&gt;I described in a&amp;nbsp;&lt;a href=&quot;http://agiletesting.blogspot.com/2011/04/lessons-learned-from-deploying.html&quot;&gt;previous post&lt;/a&gt;&amp;nbsp;how proficient we became at failing over from a master that went AWOL to a slave. Our issues with EBS volumes were compounded by the fact that our database access pattern is very write-intensive, and a shared medium such as EBS was far from ideal. Our devops team was constantly on the alert, and it seemed like we were always rebuilding instances and recovering from EC2 instance failures, although the end-user experience was not affected.&lt;br /&gt;&lt;br /&gt;Long story short, we decided to bring the database back in-house, at the data center, on 'real' bare-metal servers. No virtualization, thanks. The whole process went relatively smoothly. One important point I want to make here is that we already had a year's worth of hard numbers at that point regarding the access patterns to our database, iops/sec, MySQL query types, etc, etc. So it made it easy to do proper capacity planning this time, in the presence of production traffic.&lt;br /&gt;&lt;br /&gt;We started by buying 2 Dell&amp;nbsp;&lt;a href=&quot;http://www.dell.com/us/business/p/poweredge-c2100/pd&quot;&gt;C2100&lt;/a&gt;&amp;nbsp;servers, monster machines, with dual Intel Xeon X5650 processors (for a total of 24 cores), 144 GB RAM, and 12 x 1 TB hard disks out of which we prepared a 6 TB RAID 10 volume which we further divided in LVM logical volumes for specific types of MySQL files.&lt;br /&gt;&lt;br /&gt;We put 2 MySQL instances on each server, and we engaged&amp;nbsp;&lt;a href=&quot;http://www.percona.com/&quot;&gt;Percona&lt;/a&gt;&amp;nbsp;again to help us fine-tune the configuration, this time including not only MySQL, but also the hardware and the OS. They were super helpful to us, as usual. Here are only some of the things they recommended, which we implemented:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;set vm.swappiness kernel setting to 0 in /etc/sysctl.conf&lt;/li&gt;&lt;li&gt;set InnoDB flush method to O_DIRECT because we can rely on the RAID controller to do the caching (we also mounted XFS with the nobarrier option in conjunction with this change)&lt;/li&gt;&lt;li&gt;disable MySQL query cache, which uses a global mutex that can cause performance issues when used on a multi-core server&lt;/li&gt;&lt;li&gt;various other optimizations which were dependent on our setup, things like tweaking MySQL configuration options such as key_buffer_size and innodb_io_capacity&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;One important MySQL configuration option that we had to tweak was&amp;nbsp;innodb_buffer_pool_size. If we set it too high, the server could start swapping. If we set it too low, the disk I/O on the server could become too problematic. Since we had 144 GB of RAM and we were running 2 MySQL instances per server, we decided to give each instance 60 GB of RAM. This proved to strike a good balance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Once the fine-tuning was done, we directed production traffic away from 4 EC2 m1.xlarge instances to 2 x 2 MySQL instances, with each pair running on a C2100. We then sat back and wallowed for a while in the goodness of the I/O numbers we were observing. Basically, the servers were barely working. This is how life should be.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We soon migrated all of our MySQL masters back into the data center. We left the slaves running in EC2 (still one m1.xlarge slave per MySQL master instance), but we changed them from being EBS-backed to using the&amp;nbsp;&lt;a href=&quot;http://agiletesting.blogspot.com/2011/05/setting-up-raid-0-across-ephemeral.html&quot;&gt;local ephemeral disk in RAID 0 with LVM&lt;/a&gt;. We look at EC2 in this case as a secondary data center, used only in emergency situations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One thing that bit us in our bare-metal setup was....a bare-metal issue around the LSI MegaRAID controllers. I already blogged about the problems we had with the&amp;nbsp;&lt;a href=&quot;http://agiletesting.blogspot.com/2011/09/slow-database-check-raid-battery.html&quot;&gt;battery relearning cycle&lt;/a&gt;, and with&amp;nbsp;&lt;a href=&quot;http://agiletesting.blogspot.com/2011/10/more-fun-with-lsi-megaraid-controllers.html&quot;&gt;decreased performance in the presence of bad drives&lt;/a&gt;. But these things were easy to fix (again thanks to our friends at Percona for diagnosing these issues correctly in the first place...)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am happy to report that we went through our high season for 2011 without a glitch in this setup. Our devops team slept much better at night too! One nice thing about having EC2 as a 'secondary data center' is that if need be, we can scale out horizontally &amp;nbsp; by launching more EC2 instances. In fact, we doubled the number of MySQL slave instances for the duration of our high season, with the thought that if we need to, we can double the number of shards at the application layer, and thus scale horizontally that way. We didn't have to do any tweaking fortunately, but we were able to -- a strategy which would otherwise be hard to pull off if we didn't have any cloud presence, unless we bought a lot of extra capacity at the data center.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This brings me to one of the points I want to make in this post:&amp;nbsp;&lt;b&gt;it is a very valuable strategy to be able to use the cloud to roll out a new architecture (which you designed from the get-go however to be horizontally scalable) and to gauge its performance in the presence of real production traffic&lt;/b&gt;. You will get less than optimal performance per instance (because of virtualization vs. real hardware) , but since you can scale horizontally, you should be able to sustain the desired level of traffic for your application. You will get hard numbers that will help you do capacity planning and you will be able to bring the database infrastructure back to real hardware if you so wish, like we did. Note that&amp;nbsp;&lt;a href=&quot;http://gigaom.com/2010/06/08/how-zynga-survived-farmville/&quot;&gt;Zynga has a similar strategy&lt;/a&gt;&amp;nbsp;-- they roll out new games in EC2 and once they get a handle on how much traffic a game has, they bring it back into the data center (although it looks like they still use a private cloud and not bare metal).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another point I want to make is that&amp;nbsp;&lt;b&gt;the cloud is not ready yet for write-intensive transactional databases&lt;/b&gt;, mainly because of the very poor I/O performance that you get on virtual instances in the cloud (compounded by shared network storage such as EBS).&amp;nbsp;&lt;a href=&quot;http://perfcap.blogspot.com/&quot;&gt;Adrian Cockcroft&lt;/a&gt;&amp;nbsp;will reply that Netflix is doing just fine and they're exclusively in EC2. I hope they are doing just fine, and I hope his devops team is getting some good sleep at night, but I'm not sure. I need to perhaps qualify my point and say that the cloud is not ready for traditional transactional databases such as MySQL and PostgreSQL, which require manual sharding to be horizontally scalable. If I had to look at redesigning our database architecture today, I'd definitely try out HBase, Riak and maybe Cassandra. The promise there at least is that adding a new node to the cluster in these technologies is much less painful than in the manual sharding and scaling scenario. This still doesn't guarantee that you won't end up paying for a lot of instances to compensate for poor individual I/O per instance. Maybe a cloud vendor like Joyent with their&amp;nbsp;&lt;a href=&quot;http://www.joyent.com/products/smartmachines/&quot;&gt;SmartMachines&lt;/a&gt;&amp;nbsp;will make a difference in this area (in fact, it is on our TODO list to test out their &lt;a href=&quot;http://wiki.joyent.com/display/smart/Joyent+Percona+SmartMachine&quot;&gt;Percona SmartMachine&lt;/a&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note however that there's something to be said about using good ol' RDBMS technologies. Ryan Mack says this in a&amp;nbsp;&lt;a href=&quot;http://www.facebook.com/note.php?note_id=10150468255628920&quot;&gt;Facebook Engineering post&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;&quot;After a few discussions we decided to build on four of our core technologies:&amp;nbsp;&lt;a href=&quot;https://www.facebook.com/MySQLatFacebook&quot;&gt;MySQL/InnoDB&lt;/a&gt;&amp;nbsp;for storage and replication, Multifeed (the technology that powers News Feed) for ranking, Thrift for communications, and memcached for caching.&amp;nbsp;&lt;b&gt;We chose well-understood technologies so we could better predict capacity needs and rely on our existing monitoring and operational tool kits&lt;/b&gt;.&quot;&lt;/i&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The emphasis on the last sentence is mine. It's the operational aspect of a new architecture that will kill you first. With a well understood architecture, at least you have a chance to tame it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yet another point I'd like to make is:&amp;nbsp;&lt;b&gt;do not base your disaster recovery strategy in EC2 around EBS volumes&lt;/b&gt;, especially if you have a write-intensive database. It's not worth the performance loss, and most of all it's not worth the severe and unpredictable fluctuation in performance. It works much better in our experience to turn the ephemeral disks of an m1.xlarge EC2 instance into a RAID 0 array and put LVM on top of that, and use it for storing the various MySQL file types. We are then able to do LVM snapshots of that volume, and upload the snapshots to S3. To build a new slave, we can restore the snapshot from S3, then catch up the replication with the master. Works fine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There you have it. An ode in prose to running your database on bare metal. Try it, you may sleep better at night!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9238405-221047676093181510?l=agiletesting.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Grig Gheorghiu</name>
			<email>noreply@blogger.com</email>
			<uri>http://agiletesting.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Agile Testing</title>
			<subtitle type="html">Thoughts on testing and systems infrastructure with an agile, mostly Pythonic, twist.</subtitle>
			<link rel="self" href="http://agiletesting.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-9238405</id>
			<updated>2012-02-07T20:47:48+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Scripts or No Scripts, Managers Might Have to Manage</title>
		<link href="http://www.developsense.com/blog/2011/12/scripts-or-no-scripts/"/>
		<id>http://www.developsense.com/blog/?p=1111</id>
		<updated>2012-01-23T18:38:03+00:00</updated>
		<content type="html">&lt;p&gt;A fellow named Oren Reshef writes in response to &lt;a href=&quot;http://www.developsense.com/blog/2011/12/worthwhile-documentation&quot; title=&quot;Worthwhile Documentation&quot; target=&quot;_blank&quot;&gt;my post on Worthwhile Documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Let me be the devil’s advocate for a post.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Not having fully detailed test steps may lead to insufficient data in bug reports.&lt;/p&gt;
&lt;p&gt;Yup, that could be a risk (although having fully detailed steps in a test script might also lead to insufficient data in bug reports; and insufficient to whom, exactly?).&lt;/p&gt;
&lt;p&gt;So what do you do with a problem like that?  &lt;strong&gt;You manage it.&lt;/strong&gt;  You train the tester, reminding her of the heuristic that each problem report needs a &lt;strong&gt;p&lt;/strong&gt;roblem description; an &lt;strong&gt;e&lt;/strong&gt;xample of something that shows the problem; and &lt;strong&gt;w&lt;/strong&gt;hy she thinks it&amp;#8217;s a problem (that is, the oracle; the principle or mechanism by which the tester recognizes the problem).  &lt;strong&gt;P&lt;/strong&gt;roblem, &lt;strong&gt;e&lt;/strong&gt;xample, and &lt;strong&gt;w&lt;/strong&gt;hy; &lt;strong&gt;PEW&lt;/strong&gt;.  You praise and reward the tester for producing reports that follow the PEW heuristic; you critique reports that don&amp;#8217;t have them.  You show the tester lots of examples of bug reports, and ask her to differentiate between the good ones and the bad ones, why each one might be consider good or bad, and in what ways.  If the tester isn&amp;#8217;t getting it, you have the tester work with and be coached by someone who does get it.  The coach talks the tester through the process of identifying a problem, deciding why it&amp;#8217;s a problem, and outlining the necessary information.  Sometimes it&amp;#8217;s steps and specific data; sometimes the steps are obvious and it&amp;#8217;s only the data you need to specify; sometimes the problem happens with any old data, and it&amp;#8217;s the steps that are important.  And sometimes the description of the problem contains enough information that you need supply neither steps nor data.  As a tester under time pressure, she needs to develop the skill to do this rapidly and well&amp;mdash;or, if nothing works, she might have to find a job for which she is better suited.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;You can argue that a good tester should include the needed information and steps in her bug report, but this raise (at least) two problems:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;- The same information may be duplicated across many bugs, and even worst it will not be consistent.&lt;/p&gt;
&lt;p&gt;As a manager, I can not only argue that a tester should include the needed information; I can &lt;strong&gt;require&lt;/strong&gt; that a tester include the needed information.  Come on, Mr. Advocate&amp;#8230; this is a problem that a capable tester and a capable test manager (and presumably your client) can solve.  If &amp;#8220;the same&amp;#8221; information is duplicated across many bugs, might that be an interesting factor worth noting?  A test result, if you will?  Will this actually persist for long without the test manager (or test leads, or the test team) noticing or managing it?&lt;/p&gt;
&lt;p&gt;And in any case, would a script solve the problem that you post above?  If you can solve that problem in a script, can you solve it in a (set of) bug report(s)?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Writing test steps is not as trivial as it sounds (for example due to cognitive biases, or simply by overlooking steps that seems obvious to you), and to be efficient they also need to be peer reviewed and tested. You don’t want that to happen in a bug report.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Writing test steps is not as trivial as it sounds.&amp;#8221;  I know. It&amp;#8217;s non-trivial in terms of time, and it&amp;#8217;s non-trivial in terms of skill, and it&amp;#8217;s non-trivial in terms of cost.  That&amp;#8217;s why I write about those problems. That&amp;#8217;s why &lt;a href=&quot;http://www.satisfice.com/blog/archives/672&quot;&gt;James Bach writes about them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Again: how do you solve problems like testers providing inefficient repro steps?  You solve it with training, practice, coaching, review, supervision, observation, interaction&amp;#8230;  that is, if you don&amp;#8217;t like the results you&amp;#8217;re getting, you steer the testers in the direction you want them to go, with leadership and management.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The tester may choose the same steps over and over, or steps that are easier for her but does not represent real customers.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Yes, I often hear things like this to justify poor testing. &amp;#8220;Real customers&amp;#8221; according to whom?  It seems as though many organizations have a problem recognizing that hackers are real; that people under pressure are real; that people who make mistakes are real; that people who can become distracted are real. That people who get up and go away from the keyboard, such that a transaction times out are real.&lt;/p&gt;
&lt;p&gt;Is it the role of testers to behave &lt;strong&gt;always&lt;/strong&gt; like idealized &amp;#8220;real&amp;#8221; customers?  That&amp;#8217;s like saying that it&amp;#8217;s the role of airport security to assume that all of the business class customers are &amp;#8220;real&amp;#8221; business people. I&amp;#8217;d argue that it&amp;#8217;s nice for testers to be able to act like customers, but it&amp;#8217;s far more important for testers to act like &lt;strong&gt;testers&lt;/strong&gt;. It&amp;#8217;s the tester&amp;#8217;s role to identify important vulnerabilities in the product. Sometimes that involves behaving like a typical customer, and sometimes it involves behaving like an &lt;em&gt;atypical&lt;/em&gt; customer, or and sometimes it involves behaving like someone who is not a customer at all.  But again, mostly it involves behaving like a &lt;strong&gt;tester&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Again you may argue that a good tester should take all that into account, but it’s not that simple to verify it especially for tests involving many short trivial steps.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Maybe it isn&amp;#8217;t that simple.  If that&amp;#8217;s a problem, what about logging?  What about screen capture tools?  Such tools will track activities far more accurately than a script the tester allegedly followed.  After all, a test script is just a rumour of how something should be done, and the claim that the script was followed is also a rumour.  What about direct supervision and scrutiny?  What about occasional pairing?  What about reviewing the testers&amp;#8217; work?  What about providing feedback to testers, while affording them both freedom and responsibility?&lt;/p&gt;
&lt;p&gt;And would scripts solve that problem when (for example) you&amp;#8217;re a recording bug that you&amp;#8217;ve just discovered (probably after deviating from a script)?  How, exactly?  What happens when a problem identified by a script is fixed?  Does the value of the script stay constant over time?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Detailed test steps (at least to some extent) might important if your test activity might be transferred to another offshore team someday (happened to me a few weeks ago, I sent them a test document with only high level details and hoped for the best), or your customer requires in-depth understanding of your tests (a multi-billion Canadian telecommunication company insisted on getting those from us during the late 90’s, we chose the least readable TestDirector export format and shipped it to them…).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ah, yes.  &amp;#8220;I sent them a test document with only high level details and hoped for the best.&amp;#8221; What can I say about &amp;#8220;hope&amp;#8221; as a management approach?  Does a pile of test scripts impart in-depth understanding?  Or are they (as I suspect) a way of responding to a question that you didn&amp;#8217;t know how to answer, which was in fact a question that the telco didn&amp;#8217;t know how to ask?&lt;/p&gt;
&lt;p&gt;Going through some set of actions by rote &lt;strong&gt;is not a test&lt;/strong&gt;.  A test script is not a test.  A test is what you think and what you do.  It is a complex, cognitive activity that requires the presence or the development of much tacit knowledge.  Raw data or raw instructions at best provide you with a miniscule fraction of what you need to know.  If someone wanted in-depth understanding of how a retail store works, would you send them a pile of uncontextualized cash register receipts?&lt;/p&gt;
&lt;p&gt;The Devil&amp;#8217;s Advocate never seems to have a thoughtful manager for a client.  I would suggest that a tester neither hire nor work for the devil.&lt;/p&gt;
&lt;p&gt;Thank you for playing the devil&amp;#8217;s advocate, Oren.&lt;/p&gt;</content>
		<author>
			<name>Michael</name>
			<uri>http://www.developsense.com/blog</uri>
		</author>
		<source>
			<title type="html">Developsense Blog</title>
			<subtitle type="html">DevelopSense Blog</subtitle>
			<link rel="self" href="http://www.developsense.com/blog/feed/atom/"/>
			<id>http://www.developsense.com/blog/feed/atom/</id>
			<updated>2012-02-08T20:48:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">That’s a Nice Theory</title>
		<link href="http://testobsessed.com/blog/2012/01/21/thats-a-nice-theory/"/>
		<id>http://testobsessed.com/?p=758</id>
		<updated>2012-01-21T15:43:17+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://dhemery.com/&quot;&gt;Dale Emery&lt;/a&gt; has taught me an enormous amount about using &lt;a href=&quot;http://dhemery.com/articles/resistance_as_a_resource/&quot;&gt;resistance as a resource&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m grateful. I use his ideas every time I set foot in a classroom or start consulting with a new client.&lt;/p&gt;
&lt;p&gt;In particular, I channel my inner Dale whenever discussing any of the various controversial things I advocate, such as:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;The whole team is responsible for testing and quality, not just QA or the designated testers.&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;If the regression tests aren&amp;#8217;t automated and the team is having a hard time finishing all the testing within a sprint, have programmers help execute them.&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Do away with traditional (and often punitive) defect metrics like % missed by phase. Focus instead on metrics related to accomplishments: story points completed, cycle time, and test coverage.&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In many organizations these suggestions fly in the face of their accepted &amp;#8220;best practices.&amp;#8221; Such ideas also tread on political toes. So one response I hear a lot is: &amp;#8220;That&amp;#8217;s a nice theory, but it won&amp;#8217;t work here.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Before learning techniques for reframing that resistance into a resource, I would end up in a position based argument that amounted to the professional equivalent of &amp;#8220;Will too!&amp;#8221; &amp;#8220;Will not!&amp;#8221; &amp;#8220;Will too!&amp;#8221; &amp;#8220;Will not!&amp;#8221; Not useful. &lt;/p&gt;
&lt;p&gt;Dale&amp;#8217;s nicer and wiser than I am, so even when I don&amp;#8217;t handle the interaction as well as I would like, by leaning on Dale&amp;#8217;s techniques, I certainly handle the conversation better than I otherwise would have. (Although I&amp;#8217;m far from perfect at this. Sometimes people succeed in pushing my buttons in such a way that I forget everything I know about how to communicate effectively.)&lt;/p&gt;
&lt;p&gt;The first thing I need to know is whether the results of doing whatever it is would be useful. So I ask something like:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Do you think this practice could help improve things?&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;If I hear &amp;#8220;No,&amp;#8221; as the reply, we have a fundamental and possibly insurmountable difference in perspective. Nothing I can say will make them try the practice if they do not believe there is any value in it.&lt;/p&gt;
&lt;p&gt;I can explore their reasoning. I can say, &amp;#8220;That&amp;#8217;s interesting. Why not?&amp;#8221; But if someone flat out does not believe that a practice I advocate will help, and I disagree even after listening to their reasoning, there is a good chance that I will not be able to help them. Further discussion will cause more harm than good. The best thing for me to do is to stop.&lt;/p&gt;
&lt;p&gt;On the other hand if I hear &amp;#8220;Yes&amp;#8230;but&amp;#8230;&amp;#8221; then we have a different conversation. First I have to understand what follows the &amp;#8220;but&amp;#8230;&amp;#8221; Often it&amp;#8217;s:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;It won&amp;#8217;t work here.&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;At this point I am tempted to ask, &amp;#8220;Why not?&amp;#8221; &lt;/p&gt;
&lt;p&gt;But I don&amp;#8217;t. &lt;/p&gt;
&lt;p&gt;&amp;#8220;Why not?&amp;#8221; won&amp;#8217;t get us anywhere. We&amp;#8217;ll end up running down a rathole of excuses starting with &amp;#8220;our context is different.&amp;#8221; (And of course, they&amp;#8217;re right. Their context is different. Every context is different.)&lt;/p&gt;
&lt;p&gt;So instead of asking &amp;#8220;Why not?&amp;#8221; I flip it around. I ask:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;What would have to change for this practice to work here?&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now we get a list of objections, but each one is framed as a neat little impediment statement.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;It would need to allow for this inherent complexity in our situation.&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;We&amp;#8217;d need to allow time for it.&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;We&amp;#8217;d need executive support.&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;We&amp;#8217;d need money in the training budget.&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;We&amp;#8217;d need to get the programmers to buy in.&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;We&amp;#8217;d need the QA manager to agree.&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And we can work on each of those impediments in much the same way, following the trail of reasons why this is a nice theory that can&amp;#8217;t possibly work in their real world context all the way down to the bottom.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;In what way would it have to accommodate the complexity?&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;What would have to happen in order to make time for it?&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;What would have to happen in order to get executive support?&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;What would have to happen in order to get budget money?&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;What would have to happen in order for the programmers to buy in?&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;What would have to happen in order for the QA manager to agree?&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The answers usually reveal perfectly practical steps. We can talk to the people in a position of authority or influence who can get us resources, training, budget money. We can try a small pilot. We can experiment with variations.&lt;/p&gt;
&lt;p&gt;The simple reframe from &amp;#8220;Why not?&amp;#8221; to &amp;#8220;What would have to change?&amp;#8221; opens up possibilities. What could have become an argument becomes instead a brainstorming session. The result is a chain of steps we can take to go from where we are now to where we want to be.&lt;/p&gt;</content>
		<author>
			<name>Elisabeth Hendrickson</name>
			<uri>http://testobsessed.com</uri>
		</author>
		<source>
			<title type="html">Test Obsessed</title>
			<subtitle type="html">Because empirical evidence trumps speculation. Every. Single. Time. (Elisabeth Hendrickson's thoughts on Agile, Testing, and Agile Testing.)</subtitle>
			<link rel="self" href="http://testobsessed.com/feed/"/>
			<id>http://testobsessed.com/feed/</id>
			<updated>2012-01-21T20:47:54+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Eight Things You May Not Need To Test</title>
		<link href="http://feedproxy.google.com/~r/EricJacobsonSoftwareTestingBlog/~3/rREb5_XbTZA/eight-things-you-may-not-need-to-test.html"/>
		<id>tag:blogger.com,1999:blog-8951904624959546499.post-6012075506386254614</id>
		<updated>2012-01-20T20:39:00+00:00</updated>
		<content type="html">&lt;p&gt;This article will be published in a future addition of the &lt;em&gt;Software Test Professionals Insider – community news&lt;/em&gt;.&amp;nbsp; I didn’t get a chance to write my blog post this week so I thought I would cheat and publish it on my own blog first. &lt;/p&gt; &lt;p&gt;I will also be interviewed about it on Rich Hand’s live Blog Talk Radio Show on Tuesday, January 31st at 1PM eastern time.&amp;nbsp; &lt;/p&gt; &lt;p&gt;My article is below.&amp;nbsp; If it makes sense to you or bothers you, make sure you tune in to the radio show to ask questions…and leave a comment here, of course.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Don’t Test It&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;As testers, we ask ourselves lots of questions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;What is the best test I can execute right now?&lt;/li&gt; &lt;li&gt;What is my test approach going to be?&lt;/li&gt; &lt;li&gt;Is that a bug?&lt;/li&gt; &lt;li&gt;Am I done yet?&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;But how many of us ask questions like the following?&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Does this Feature need to ever be tested?&lt;/li&gt; &lt;li&gt;Does it need to be tested by me?&lt;/li&gt; &lt;li&gt;Who cares if it doesn’t work?&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;In my opinion, not enough of us ask questions like the three above.&amp;nbsp; Maybe it’s because we’ve been taught to test everything.&amp;nbsp; Some of us even have a process that requires every Feature to be stamped “Tested” by someone on the QA team.&amp;nbsp; We treat testing like a routine factory procedure and sometimes we even take pride in saying...&lt;/p&gt; &lt;p&gt;&lt;em&gt;“I am the tester.&amp;nbsp; Therefore, everything must be tested...by me...even if a non-tester already tested it...even if I already know it will pass...even if a programmer needs to tell me how to test it...I must test it, no exceptions!”&lt;/em&gt;&lt;/p&gt; &lt;p&gt;This type of thinking may be giving testers a bad reputation.&amp;nbsp; It emphasizes testing importance because of a thoughtless process rather than a service to provide the most valuable information to someone.&amp;nbsp; &lt;/p&gt; &lt;p&gt;James Bach came up with the following test execution heuristic:&lt;/p&gt; &lt;p&gt;Basic Heuristic:&amp;nbsp; “If it exists, I want to test it”&lt;/p&gt; &lt;p&gt;I disagree with that heuristic, as it is shown above and often published.&amp;nbsp; However, I completely agree with the full version James published when he introduced it in his 7/8/2006 &lt;a href=&quot;http://www.satisfice.com/blog/archives/54&quot; target=&quot;_blank&quot;&gt;blog post&lt;/a&gt;:&lt;/p&gt; &lt;p&gt;“If it exists, I want to test it. (The only exception is if I have something more important to do.)” &lt;/p&gt; &lt;p&gt;The second sentence is huge!&amp;nbsp; Why?&amp;nbsp; Because often we do have something more important to do, and it’s usually another test!&amp;nbsp; Unfortunately, importance is not always obvious.&amp;nbsp; So rather than measuring importance, I like to ask the three questions above and look for things that may not be worth my time to test.&amp;nbsp; Here are eight examples of what I’m talking about:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Features that don’t go to production&lt;/strong&gt; -&amp;nbsp; My team has these every iteration.&amp;nbsp; These are things like enhancements to error logging tables or audit reports to track production activity.&amp;nbsp; On Agile teams these fall under the umbrella of Developer User Stories.&amp;nbsp; The bits literally do not go to production and by their nature cannot directly affect users.&amp;nbsp; &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Patches for critical production problems that can’t get worse&lt;/strong&gt; - One afternoon our customers called tech support indicating they were on the verge of missing a critical deadline because our product had a blocking bug.&amp;nbsp; We had one hour to deliver the fix to production.&amp;nbsp; The programmer had the fix ready quickly and the risk of further breaking production was insignificant because production was currently useless.&amp;nbsp; Want to be a hero?&amp;nbsp; Don’t slow things down.&amp;nbsp; Pass it through to production.&amp;nbsp; Test it later if you need to.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Cosmetic bug fixes with timely test setup&lt;/strong&gt; - We fixed a spelling mistake that had shown up on a screen shot of a user error message.&amp;nbsp; The user was unaware of the spelling mistake but we fixed it anyway; quick and easy.&amp;nbsp; Triggering said error message required about 30 minutes of setup.&amp;nbsp; Is it worth it?&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Straight forward configuration changes&lt;/strong&gt; - Last year our product began encountering abnormally large production jobs it could not process.&amp;nbsp; A programmer attempted to fix the problem with an obvious configuration change.&amp;nbsp; There was no easy way to create a job large enough to cross the threshold in the QA environment.&amp;nbsp; We made the configuration change in production and the users happily did the testing for us.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Too technical for a non-programmer to test&lt;/strong&gt; - Testing some functionality requires performing actions while using breakpoints in the code to reproduce race conditions.&amp;nbsp; Sometimes a tester is no match for the tools and skills of a programmer with intimate knowledge of the product code.&amp;nbsp; Discuss the tests but step aside.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Non-tester on loan&lt;/strong&gt; - If a non-tester on the team is willing to help test, or better yet, wants to help test a certain Feature, take advantage of it.&amp;nbsp; Share test ideas and ask for test reports.&amp;nbsp; If you’re satisfied, don’t test it.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;No repro steps&lt;/strong&gt; - Occasionally a programmer will take a stab at something.&amp;nbsp; There are often errors reported for which nobody can determine the reproduction steps.&amp;nbsp; We may want to regression test the updated area, but we won’t prevent the apparent fix from deploying just because we don’t know if it works or not.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Inadequate test data or hardware&lt;/strong&gt; - Let’s face it.&amp;nbsp; Most of us don’t have as many load balanced servers in our QA environment as we do in production.&amp;nbsp; When a valid test requires production resources not available outside of production, we may not be able to test it.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Many of you are probably trying to imagine cases where the items above could result in problems if untested.&amp;nbsp; I can do that too.&amp;nbsp;&amp;nbsp; Remember, these are items that may not be worth our time to test.&amp;nbsp; Weigh them against what else you can do and ask your stakeholders when it’s not obvious.&lt;/p&gt; &lt;p&gt;If you do choose not to test something, it’s important not to mislead.&amp;nbsp; Here is the approach we use on my team. During our Feature Reviews, we (testers) say, “we are not going to test this”.&amp;nbsp; If someone disagrees, we change our mind and test it.&amp;nbsp; If no one disagrees, we “rubber stamp” it. Which means we indicate nothing was tested (on the work item or story) and pass it through so it can proceed to production.&amp;nbsp; The expression “rubber stamping” came from the familiar image of an administrative worker rubber stamping stacks of papers without really spending any time on each.&amp;nbsp; The rubber stamp is valuable, however.&amp;nbsp; It tells us something did not slip through the cracks.&amp;nbsp; Instead, we used our brains and determined our energy was best used elsewhere.&lt;/p&gt; &lt;p&gt;So the next time you find yourself embarking on testing that feels much less important than other testing you could be doing, you may want to consider...not testing it.&amp;nbsp; In time, your team will grow to respect your decision and benefit from fewer bottlenecks and increased test coverage where you can actually add value.&lt;/p&gt;  &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8951904624959546499-6012075506386254614?l=www.testthisblog.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/EricJacobsonSoftwareTestingBlog/~4/rREb5_XbTZA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Eric Jacobson</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.testthisblog.com/</uri>
		</author>
		<source>
			<title type="html">Test This Blog - Eric Jacobson's Software Testing Blog</title>
			<subtitle type="html">Refinements on the art of software testing</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/EricJacobsonSoftwareTestingBlog"/>
			<id>tag:blogger.com,1999:blog-8951904624959546499</id>
			<updated>2012-02-08T20:47:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Blog Rolling with MongoDB, Node.js and Coffeescript</title>
		<link href="http://blog.james-carr.org/2012/01/16/blog-rolling-with-mongodb-node-js-and-coffeescript/"/>
		<id>http://blog.james-carr.org/?p=1329</id>
		<updated>2012-01-16T18:54:26+00:00</updated>
		<content type="html">&lt;p&gt;This morning I woke up with a lingering thought on my mind that was left over from recent conversations. In the technical community we often get so invested in our work that rather than talk about the simple building blocks that build our success we talk about the huge breakthroughs we make. The problem however is that our breakthroughs most often aren&amp;#8217;t accessible to someone who wants to just get started. So today I will give an intro tutorial to using node.js, coffeescript and mongodb to build a simple blog. It builds off the concept in a &lt;a href=&quot;http://howtonode.org/express-mongodb&quot;&gt;tutorial&lt;/a&gt; I first used to learn node.js more than a year ago, but with a completely from scratch approach. In this tutorial I will also cover practicing &lt;a href=&quot;http://en.wikipedia.org/wiki/Behavior_Driven_Development&quot;&gt;Behavior Driven Development&lt;/a&gt; using Mocha. &lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-1329&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;Getting Started&lt;/h4&gt;
&lt;p&gt;Quite obviously, you&amp;#8217;re going to need node.js and mongodb installed. I recommend downloading and installing from the &lt;a href=&quot;http://nodejs.org/&quot;&gt;node.js website&lt;/a&gt; and following the instructions. I will note that this tutorial covers &lt;strong&gt;0.6.7&lt;/strong&gt; so if you come across this post a year from now the API might have changed significantly since then. You will also need mongodb installed, you can &lt;a href=&quot;http://www.mongodb.org/downloads&quot;&gt;download it here&lt;/a&gt;. If you use Ubuntu (or some other Debian derivative) you should consider installing from their &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages&quot;&gt;apt repository&lt;/a&gt;. OSX? No problem, you can also &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Quickstart+OS+X&quot;&gt;install it via homebrew or macports&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Finally, since we&amp;#8217;ll be using coffeescript for this tutorial, run &lt;strong&gt;&lt;code&gt;npm -g install coffee-script&lt;/code&gt;&lt;/strong&gt; (you might need to sudo) to install coffeescript. Run coffee from the commandline to access the coffeescript &lt;a href=&quot;http://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop&quot;&gt;REPL&lt;/a&gt;. If all works well, install these additional packages listed below via npm that we&amp;#8217;ll be using throughout the tutorial.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;express&lt;/li&gt;
&lt;li&gt;mocha&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now let&amp;#8217;s bootstrap our project structure. Type &lt;strong&gt;&lt;code&gt;express coffeepress&lt;/code&gt;&lt;/strong&gt; to generate a skeleton express project structure. You should see output similar to the following:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.james-carr.org/wp-content/uploads/2012/01/express.png&quot;&gt;&lt;img src=&quot;http://blog.james-carr.org/wp-content/uploads/2012/01/express.png&quot; alt=&quot;&quot; title=&quot;express&quot; width=&quot;400&quot; height=&quot;306&quot; class=&quot;aligncenter size-full wp-image-1330&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Notice how at the end it says to cd to the directory and type &lt;strong&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/strong&gt;? Let&amp;#8217;s follow those instructions. Let&amp;#8217;s run what we have so far by typing &lt;strong&gt;&lt;code&gt;node app.js&lt;/code&gt;&lt;/strong&gt; and navigating to &lt;a href=&quot;http://localhost:3000&quot;&gt;http://localhost:3000&lt;/a&gt;. This is the default structure that gives a good starting point.  Feel free to investigate the files under the directory before moving on. I even suggest poking around by changing the view a bit and changing the title from express to &amp;#8220;My Coffeepress Blog&amp;#8221;. &lt;/p&gt;
&lt;h4&gt;Porting to Coffeescript&lt;/h4&gt;
&lt;p&gt;At this point, let&amp;#8217;s port our backend to coffeescript. I used to copy and paste files into the &lt;a href=&quot;http://js2coffee.org/&quot;&gt;js2coffee&lt;/a&gt; website but you can also install js2coffee via npm. So run the following:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Now you can run &lt;strong&gt;&lt;code&gt;coffee app.coffee&lt;/code&gt;&lt;/strong&gt; to run the same app, but now in coffeescript. Take a look at the resulting files to get a feel for what has changed. New to coffeescript? Then I recommend taking a gander at &lt;a href=&quot;http://coffeescript.org/&quot;&gt;coffeescript.org&lt;/a&gt; before moving on. Here is the &lt;a href=&quot;https://github.com/jamescarr/nodejs-mongodb-blog/zipball/convert-to-coffee&quot;&gt;project structure&lt;/a&gt; so far.&lt;/p&gt;
&lt;h4&gt;Basic Navigation&lt;/h4&gt;
&lt;p&gt;I like to try and work my way from the outside in while developing a site or feature, materializing components into existence as I need them. So let&amp;#8217;s start by working on the initial navigation of the site with some simple in-memory storage of blog posts. This is a good time to get our test framework setup and write a few simple tests against our routes. Normally I prefer to not write tests against my routes, shoving logic into heavy models or services. However I have come to learn that untested components of a system serve as a gravity well for untested code that eventually leads to clients calling you about broken applications. What follows serves as both an introduction to &lt;a href=&quot;http://visionmedia.github.com/mocha/&quot;&gt;Mocha&lt;/a&gt; as well as &lt;a href=&quot;http://expressjs.com/guide.html#route-middleware&quot;&gt;express&amp;#8217; routing mechanism&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s edit our package.json to include our test framework dependencies.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;We include &lt;a href=&quot;https://github.com/visionmedia/should.js&quot;&gt;should&lt;/a&gt; so that we can use BDD style assertions (more on this in a bit). Write a simple test case located at test/routes-test.coffee with the following code to get us started with mocha&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Now run this by typing &lt;strong&gt;&lt;code&gt;mocha&lt;/code&gt;&lt;/strong&gt; from the root of the project directory. It should pass. Let&amp;#8217;s go ahead and make it fail by changing 4 to 5 and rerunning it. Hopefully this gives you a good feel for our test framework before we move on and change this test to reflect our existing index route. Swap the code in this test out with the following.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Here we fake our requests and response in order to capture what is passed into the response. We fake the render method and verify that our rendered view is &amp;#8220;index&amp;#8221; and that the variable title is equal to what we expect to be passed in. Run the tests and make changes to your route to make it pass.&lt;/p&gt;
&lt;p&gt;Now let&amp;#8217;s add a post variable that will be an array of posts we&amp;#8217;ll display on the front page. Add the following assertion right after the title assertion:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Run the tests to see it fail and change the route to have a posts array variable available in the template.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately you&amp;#8217;ll notice that the test fails. This is due to a subtle difference between &lt;strong&gt;&lt;code&gt;equal&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;eql&lt;/code&gt;&lt;/strong&gt;. The former enforces strict equality while the latter is a bit looser, so we change our assertion to use &lt;code&gt;eql&lt;/code&gt;. Take a look at the &lt;a href=&quot;https://github.com/visionmedia/should.js&quot;&gt;should documentation&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;Next let&amp;#8217;s write tests for the &amp;#8220;new post&amp;#8221; route.&lt;br /&gt;
&lt;br /&gt;
Run it, see the failure, and rework our routes.coffee file to include the route (with no implementation yet)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You&amp;#8217;ll notice our test passes. That&amp;#8217;s not good. Why? Because we put our assertion in our req.render callback, which never gets executed. Doh! How can we make absolutely sure it gets called during our test run? Old school thinking would have you assign a local variable outside the scope of the callback that gets assigned during execution and then can be verified against later on. However we have no guarantee that the routing logic will be synchronous!&lt;/p&gt;
&lt;p&gt;Thankfully mocha has a feature that allows for easy testing in these situations. In the method declaration of our test specify a parameter named &lt;strong&gt;&lt;code&gt;done&lt;/code&gt;&lt;/strong&gt;. This is a callback that we can call anywhere to indicate the test is done. Basically the test will wait up to a default of 2000ms for it to be called. With this in mind, let&amp;#8217;s modify our tests with the following:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;If we run this via mocha now we&amp;#8217;ll notice that we have one failure. Let&amp;#8217;s go ahead and implement the route and connect it into our router.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;And connecting it up in the app.coffee&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;Modifying the Views&lt;/h4&gt;
&lt;p&gt;This code is useless without views, so let&amp;#8217;s modify our views a bit. Let&amp;#8217;s modify our layout.jade to link to the new posts page. This layout also makes use of twitter bootstrap because I&amp;#8217;m too lazy to design something for this tutorial. &lt;img src=&quot;http://blog.james-carr.org/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;And create our add_post view at &lt;strong&gt;&lt;code&gt;views/add_post.jade&lt;/code&gt;&lt;/strong&gt;. An interesting thing to note here that I&amp;#8217;ll touch on in a bit is that I prefix the input names with post. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Now let&amp;#8217;s add another route to handle the post. This time I&amp;#8217;m going to kind of skip delving into the details of writing the test, but you can look at what I have so far &lt;a href=&quot;https://github.com/jamescarr/nodejs-mongodb-blog/zipball/fully-functional-in-memory&quot;&gt;here&lt;/a&gt; if you&amp;#8217;d like to see it. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;For now, we&amp;#8217;re just going to store each post in an array. Nothing fancy yet. We also add a new route to app.coffee. We could refactor or use some express-mvc plugin to reduce adding each route by hand, but I think it&amp;#8217;s good to do it like this to get a feel for express&amp;#8217; low level routing mechanisms. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Finally, we&amp;#8217;ll add one last view for viewing a single post:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Go ahead and start the application up and navigate to &lt;a href=&quot;http://localhost:3000&quot;&gt;http://localhost:3000&lt;/a&gt;. Post a few posts and play around a bit. You can see the finished application we have so far &lt;a href=&quot;https://github.com/jamescarr/nodejs-mongodb-blog/tree/fully-functional-in-memory&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Mongoose&lt;/h4&gt;
&lt;p&gt;Whew. I hope I haven&amp;#8217;t lost you yet. Especially with the tests against the routes&amp;#8230; I know those are always a bit painful! Now that we have functional blog let&amp;#8217;s make it work by storing posts in mongodb using &lt;a href=&quot;http://mongoosejs.com/&quot;&gt;Mongoose&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s add a dependency on mongoose to our project and freeze it at version 2.4.10. As always, run npm install to bring it in. Now we&amp;#8217;ll create an initial test to just test mongoose out. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Here we import both mongoose and the model object that we&amp;#8217;re going to create. Since we want our test to start with a clean slate, we use the before hook (which runs once before anything else in the test runs) to both connect to the database and then remove all of the Post objects from mongodb. We pass the done callback to the remove call so that tests don&amp;#8217;t run until all Posts have been removed. &lt;/p&gt;
&lt;p&gt;Now we create a new Post instance. You can pass an object literal in to set properties on the model, so we do that here. Finally, in our post.save callback we look the post back up and verify certain attributes have been set. It&amp;#8217;s a dumb test (and in fact I rarely test mongoose&amp;#8217;s behavior like this), but it does verify that we&amp;#8217;ve configured our model correctly.&lt;/p&gt;
&lt;p&gt;Now let&amp;#8217;s implement our model to make the test pass.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Pretty simple. Now let&amp;#8217;s refit our routes to use the Post model instead of an in memory array.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s all good and dandy, but one last hiccup is our tests for our routes now fail. Chalk this one up to not having any abstraction or dependency injection in place, but that is fine for now, we&amp;#8217;ll live with it and change the tests.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Finally we need our app to actually connect to mongoose when we run it. I like to do this based on the express configuration. This is immensely important if you have mongodb running on servers separated from your application.  For this example we&amp;#8217;ll just use the databases coffeepress-dev and coffeepress-prod. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Run it and write a few posts. Restart the app and you&amp;#8217;ll see the posts still there. Woot!&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;Well, that about wraps it up&amp;#8230; you can see this tutorial in it&amp;#8217;s finished glory on the &lt;a href=&quot;https://github.com/jamescarr/nodejs-mongodb-blog/tree/fully-functional-in-memory&quot;&gt;finished&lt;/a&gt; branch of the repository. There&amp;#8217;s a bit missing out here that we&amp;#8217;d implement in the real world. Obviously some kind of authentication would be in order if we took this further, possibly using mongoose-auth. We&amp;#8217;d also want to add some validation when posting.  These are all excellent topics for future posts but for now I hope this was enough to help you get going! &lt;img src=&quot;http://blog.james-carr.org/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
		<author>
			<name>James Carr</name>
			<uri>http://blog.james-carr.org</uri>
		</author>
		<source>
			<title type="html">James Carr</title>
			<subtitle type="html">Rants and Musings of an Agile Developer</subtitle>
			<link rel="self" href="http://blog.james-carr.org/feed/"/>
			<id>http://blog.james-carr.org/feed/</id>
			<updated>2012-01-29T20:47:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">On the Usability of Codecademy</title>
		<link href="http://feedproxy.google.com/~r/ZenAndTheArtOfRubyProgramming/~3/dbg07l-mD_g/"/>
		<id>http://programmingzen.com/?p=1444</id>
		<updated>2012-01-16T17:09:21+00:00</updated>
		<content type="html">&lt;p&gt;I asked a friend of mine (who isn&amp;#8217;t a coder) if she could try out the amazing &lt;a title=&quot;Codecademy&quot; href=&quot;http://www.codecademy.com/&quot; target=&quot;_blank&quot;&gt;Codecademy&lt;/a&gt; for me.&lt;/p&gt;
&lt;p&gt;She is a smart person, but again, she isn&amp;#8217;t a programmer. I thought Codecademy would be a great way to introduce her to programming for the web. As a programmer, I thought it was extremely well made and assumed it would work for anyone.&lt;/p&gt;
&lt;p&gt;She landed &lt;a href=&quot;http://www.codecademy.com/#!/exercises/0&quot; target=&quot;_blank&quot;&gt;on the homepage&lt;/a&gt; and read the instructions.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-1445&quot; title=&quot;liz1&quot; src=&quot;http://programmingzen.com/wp-content/uploads/2012/01/liz1-e1326643550987.png&quot; alt=&quot;&quot; width=&quot;600&quot; height=&quot;94&quot; /&gt;&lt;/p&gt;
&lt;p&gt;She wrote her name (&amp;#8220;Elizabeth&amp;#8221;), then decided however to change it to the shortened form of her name, &amp;#8220;Liz&amp;#8221;. To do so she highlighted the whole string she had just typed and tried to press the backspace key to delete it. The whole page disappeared and the browser redirected her to the new tab.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-1446&quot; title=&quot;liz2&quot; src=&quot;http://programmingzen.com/wp-content/uploads/2012/01/liz2-e1326643534499.png&quot; alt=&quot;&quot; width=&quot;600&quot; height=&quot;101&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liz&lt;/strong&gt;: &amp;#8220;Why did it do that?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Me&lt;/strong&gt;: &amp;#8220;You can&amp;#8217;t highlight a word like you&amp;#8217;d do in Microsoft Word. You&amp;#8217;re in a browser, so the backspace button tells the browser to go back to the previous page you visited in that particular tab. You need to delete the string one letter at the time.&amp;#8221;&lt;/p&gt;
&lt;p&gt;She reopened the page and tried again, this time things were successful.&lt;/p&gt;
&lt;p&gt;Next, she had to measure the length of her name. But she forgot the quotes, so she got this:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-1447&quot; title=&quot;liz3&quot; src=&quot;http://programmingzen.com/wp-content/uploads/2012/01/liz3-e1326643520479.png&quot; alt=&quot;&quot; width=&quot;600&quot; height=&quot;231&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liz&lt;/strong&gt;: &amp;#8220;What happened?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Me&lt;/strong&gt;: &amp;#8220;What do you think happened?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liz&lt;/strong&gt;: &amp;#8220;Some kind of error, but what does &amp;#8216;Liz is not defined&amp;#8217; mean?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Me&lt;/strong&gt;: &amp;#8220;You accidentally forgot the quotes.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liz&lt;/strong&gt;: &amp;#8220;Oh, OK, let me try again.&amp;#8221;&lt;/p&gt;
&lt;p&gt;She wrote the first quote but pressed enter before immediately realizing she had forgotten the closing one. As such she encountered the following scenario:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-1448&quot; title=&quot;liz4&quot; src=&quot;http://programmingzen.com/wp-content/uploads/2012/01/liz4-e1326643506756.png&quot; alt=&quot;&quot; width=&quot;600&quot; height=&quot;139&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liz&lt;/strong&gt;: &amp;#8220;I messed it, let me try again.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-1449&quot; title=&quot;liz5&quot; src=&quot;http://programmingzen.com/wp-content/uploads/2012/01/liz5-e1326643492795.png&quot; alt=&quot;&quot; width=&quot;600&quot; height=&quot;73&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liz&lt;/strong&gt;: &amp;#8220;I typed it right this time, why didn&amp;#8217;t it work?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Me&lt;/strong&gt;: &amp;#8220;Since you didn&amp;#8217;t close the first string, it thinks that the second line is still part of the first command. Do you know how to get out of this?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liz&lt;/strong&gt;: &amp;#8220;No, but let me try.&amp;#8221;&lt;/p&gt;
&lt;p&gt;No, she didn&amp;#8217;t close the string and pressed enter twice or deleted a bunch of characters (this web REPL allows it, kudos to Codecademy). She simply reloaded the page. Thankfully the same exercise (#1) was reloaded. After completing it successfully though, instead of exercise #2, exercise #0 reappeared, asking her to enter her first name again.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-1450&quot; title=&quot;liz6&quot; src=&quot;http://programmingzen.com/wp-content/uploads/2012/01/liz6-e1326643476536.png&quot; alt=&quot;&quot; width=&quot;600&quot; height=&quot;133&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After raising an eyebrow at that point, she went along with it. Next she was asked to try some math.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-1451&quot; title=&quot;liz7&quot; src=&quot;http://programmingzen.com/wp-content/uploads/2012/01/liz7-e1326643460337.png&quot; alt=&quot;&quot; width=&quot;600&quot; height=&quot;165&quot; /&gt;&lt;/p&gt;
&lt;p&gt;She can&amp;#8217;t be faulted for thinking that &amp;#8220;for instance&amp;#8221; meant she could try something else. Yet, she got an &amp;#8220;Oops, try again.&amp;#8221; message.&lt;/p&gt;
&lt;p&gt;At that point I suspended this tiny hallway test and I asked her what she thought of this system. She found the site to be a bit unintuitive, but above all felt like she didn&amp;#8217;t know how to get unstuck when she made an error.&lt;/p&gt;
&lt;p&gt;Now, before you all jump in and tell me that my friend is dumb, that she&amp;#8217;ll never be a programmer, or that you can&amp;#8217;t idiot-proof a design, keep in mind the very point of this post.&lt;/p&gt;
&lt;p&gt;Usability is hard because real users use our UIs and software in different and unexpected ways. Codecamedy did a very good job, but even they left plenty of room for improvement. As web developers it&amp;#8217;s our duty to give usability and user experience a significant amount of attention. The UI is the software to the end user.&lt;/p&gt;
&lt;p&gt;No related posts.&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=dbg07l-mD_g:13SouUfiue8:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=dbg07l-mD_g:13SouUfiue8:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?i=dbg07l-mD_g:13SouUfiue8:F7zBnMyn0Lo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=dbg07l-mD_g:13SouUfiue8:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?i=dbg07l-mD_g:13SouUfiue8:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=dbg07l-mD_g:13SouUfiue8:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?d=qj6IDK7rITs&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=dbg07l-mD_g:13SouUfiue8:l6gmwiTKsz0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?d=l6gmwiTKsz0&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=dbg07l-mD_g:13SouUfiue8:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?i=dbg07l-mD_g:13SouUfiue8:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/dbg07l-mD_g&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Antonio Cangiano</name>
			<uri>http://programmingzen.com</uri>
		</author>
		<source>
			<title type="html">Zen and the Art of Programming</title>
			<subtitle type="html">Meditations on programming, startups, and technology</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/ZenAndTheArtOfRubyProgramming"/>
			<id>http://programmingzen.com/feed/atom/</id>
			<updated>2012-01-16T20:47:54+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Who Tests Your Automated Tests?</title>
		<link href="http://feedproxy.google.com/~r/EricJacobsonSoftwareTestingBlog/~3/Sfk4_e5xwEY/who-tests-your-automated-tests.html"/>
		<id>tag:blogger.com,1999:blog-8951904624959546499.post-8467583291253877860</id>
		<updated>2012-01-11T21:32:00+00:00</updated>
		<content type="html">&lt;p&gt;Who tests the automated tests? Well, we know the test automation engineer does.&amp;nbsp; But per our usual rationale, shouldn’t someone other than the test automation engineer test the automated tests?&amp;nbsp; After all, they are coded…in some cases by people with less programming experience than the product programmers.&lt;/p&gt; &lt;p&gt;We’re experimenting with manual testers testing automated tests on one of my project teams.&amp;nbsp; The test automation engineer hands each completed automated test to a manual tester.&amp;nbsp; The manual tester then executes the automated test.&amp;nbsp; At this point the manual tester is testing two things at the same time.&amp;nbsp; They are:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Testing the automated test and&lt;/li&gt; &lt;li&gt;testing whatever the automated test tests&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Or, to be more precise, we can &lt;a href=&quot;http://www.developsense.com/blog/2009/08/testing-vs-checking/&quot; target=&quot;_blank&quot;&gt;use Michael Bolton speak&lt;/a&gt; and say the tester is:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Testing the automated check and&lt;/li&gt; &lt;li&gt;checking whatever the automated check checks&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Whatever you call it, during this exercise, it’s important to distinguish the above two activities.&amp;nbsp; If the automated test's execution results in a “Fail”, it doesn’t mean the test of the automated test fails…but it may.&amp;nbsp; Are you with me still?&amp;nbsp; An automated test’s execution result of “Fail” may, in fact, mean the automated test is a damn good test.&amp;nbsp; It may have found a bug in the product under test.&amp;nbsp; But that is completely up to the manual tester who is testing the automated test.&amp;nbsp; One cannot trust the expected result of an automated test until one has finished testing the automated test.&lt;/p&gt; &lt;p&gt;Thus, the tester of the automated test will need to evaluate the test somehow and declare it to be a good test.&amp;nbsp; They may be able to do this several ways:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Manipulate the product to see if the test both passes and fails under the right conditions.&lt;/li&gt; &lt;li&gt;Execute the automated test by itself then as part of the test suite to determine if the setup/teardown routines adapt sufficiently.&lt;/li&gt; &lt;li&gt;Read the automated test’s code (e.g., does the Assert check the intended observation correctly?).&lt;/li&gt; &lt;li&gt;Manually test the same thing the automated test checks.&lt;/li&gt; &lt;li&gt;Manipulate the product such that the test cannot evaluate its check. Does the test resolve as “Inconclusive”?&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;It would be nice to have the luxury of time/resources to test the automated checks thoroughly but in the end, I suspect we will have to draw the line somewhere and trust the test automation engineer’s test of their check.&amp;nbsp; In the meantime, we’ll see where this gets us.&lt;/p&gt;  &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8951904624959546499-8467583291253877860?l=www.testthisblog.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/EricJacobsonSoftwareTestingBlog/~4/Sfk4_e5xwEY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Eric Jacobson</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.testthisblog.com/</uri>
		</author>
		<source>
			<title type="html">Test This Blog - Eric Jacobson's Software Testing Blog</title>
			<subtitle type="html">Refinements on the art of software testing</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/EricJacobsonSoftwareTestingBlog"/>
			<id>tag:blogger.com,1999:blog-8951904624959546499</id>
			<updated>2012-02-08T20:47:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Public Class in England March 7-9</title>
		<link href="http://www.satisfice.com/blog/archives/687"/>
		<id>http://www.satisfice.com/blog/?p=687</id>
		<updated>2012-01-09T10:42:10+00:00</updated>
		<content type="html">&lt;p&gt;Hey, I&amp;#8217;ll be doing a public class in England, once again. This time in Cambridge. See the details, &lt;a href=&quot;http://www.ministryoftesting.com/training-events/rapid-software-testing/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This year I also have public classes in Estonia, Romania, Australia, and New Zealand.&lt;/p&gt;</content>
		<author>
			<name>James Bach</name>
			<uri>http://www.satisfice.com/blog</uri>
		</author>
		<source>
			<title type="html">James Bach’s Blog</title>
			<subtitle type="html">The Consulting Software Tester</subtitle>
			<link rel="self" href="http://www.satisfice.com/blog/feed"/>
			<id>http://www.satisfice.com/blog/feed</id>
			<updated>2012-01-31T20:48:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Agile Adjustments: a WordCount Story</title>
		<link href="http://testobsessed.com/blog/2012/01/05/agile-adjustments-a-wordcount-story/"/>
		<id>http://testobsessed.com/?p=755</id>
		<updated>2012-01-05T21:03:58+00:00</updated>
		<content type="html">&lt;p&gt;&lt;em&gt;I originally wrote this for the &lt;a href=&quot;http://www.ayeconference.com/&quot;&gt;AYE website&lt;/a&gt; in 2007. It&amp;#8217;s no longer published there so I&amp;#8217;m posting it here. Despite itching to tweak some words and add a better conclusion, I resisted the temptation to edit it other than formatting it for this blog. It&amp;#8217;s as I wrote it in 2007. (Despite being 4 years old, I think this post is still relevant&amp;#8230;perhaps even more so today with Agile having crossed the chasm.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We were in the middle of my Agile Testing class, and the simulation had run for two rounds so far. Some of the participants created &amp;#8220;software&amp;#8221; on index cards. Others tested it. Still others deployed it. The participants were wholly engaged in their work for the fictitious &amp;#8220;Word Count, Inc.&amp;#8221; As the facilitator, I was running the simulation in 15 minute rounds followed by 15 minute reflect-and-adjust mini-retrospectives.&lt;/p&gt;
&lt;p&gt;After the second round, during the mini-retrospective, I asked, &amp;#8220;What do you see happening?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;The deployment team looked like they were twiddling their thumbs for most of the round,&amp;#8221; one participant observed.&lt;/p&gt;
&lt;p&gt;Another participant added, &amp;#8220;I think that&amp;#8217;s because most of the cards are still on the QA table,&amp;#8221; she said. &amp;#8220;QA is a bottleneck.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;No, the problem is that development didn&amp;#8217;t deliver anything until the very last minute.&amp;#8221; objected one of the QA team members.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Well that&amp;#8217;s because it took us most of the last round to coordinate with the deployment team,&amp;#8221; one of the Developers countered.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Your cards were all mixed up when you delivered them. We sent them back so you could sort them out. That&amp;#8217;s hardly a &amp;#8216;coordination&amp;#8217; problem.&amp;#8221; scowled a Deployment team member.&lt;/p&gt;
&lt;p&gt;Mixed up source code, software stuck in QA, late deliverables. Sounded like a real world project to me.&lt;/p&gt;
&lt;p&gt;I shifted the conversation: &amp;#8220;What would you like to change to improve the outcome in the next iteration?&amp;#8221;&lt;/p&gt;
&lt;p&gt;The answers varied: &amp;#8220;Hold more project meetings to coordinate efforts!&amp;#8221; &amp;#8220;Appoint a project manager to keep everything on track!&amp;#8221; &amp;#8220;More people in QA!&amp;#8221; &amp;#8220;Define a source code control process!&amp;#8221; The suggestions may all have been different, but there was a general trend: the participants wanted to add control points, process steps, and personnel in an attempt to reduce the chaos.&lt;/p&gt;
&lt;p&gt;For the next round, the team adopted new practices: adding a new role of project manager; adding more meetings; and adding a strict change control process. During the next round I observed the team use half their available time standing in a big group discussing how to proceed. It seemed to me that in their attempt to control the chaos, they created a process in which it was almost impossible to get anything done. Once again, they weren&amp;#8217;t able to deploy an updated version. And at the end of the round, the project manager quit the role in disgust and went back to &amp;#8220;coding&amp;#8221; on cards.&lt;/p&gt;
&lt;p&gt;The team meant well when they added the role of project manager, and added more meetings, but their strategy backfired.&lt;/p&gt;
&lt;p&gt;Most groups that go through the WordCount, Inc. simulation encounter problems similar to the ones that this team encountered. Some react by attempting to introduce the same kinds of controls as this group, with similar results. But some respond differently.&lt;/p&gt;
&lt;p&gt;One group responded to the mixed-up-source-code problem by creating a centralized code repository that was visible and shared by all. Instead of creating a change control process to manage the multiple copies of the source code floating around, they posted one copy to be shared by all in a central location: the paper equivalent of source control.&lt;/p&gt;
&lt;p&gt;Another group responded to coordination and bottleneck problems by co-locating teams. Instead of holding meetings, they coordinated efforts by working together.&lt;/p&gt;
&lt;p&gt;Yet another group established an &amp;#8220;automated&amp;#8221; regression test suite that the deployment team always ran prior to each deployment. They then posted the test results on a Big Visible Chart so everyone knew the current state of the deployed system.&lt;/p&gt;
&lt;p&gt;These steps all had the effect of making the team more Agile by increasing visibility, increasing feedback, improving collaboration, and increasing communication. And the end result for each group was success.&lt;/p&gt;
&lt;p&gt;When reflecting-and-adjusting, it&amp;#8217;s easy to reach for command-and-control solutions, to add quality gates and checkpoints and formal processes. But the irony is that such process changes often increase the level of chaos rather than reducing it. They introduce delays and bloat the process without solving the core problem.&lt;/p&gt;
&lt;p&gt;It happens in the real world too.&lt;/p&gt;
&lt;p&gt;One organization struggling with buggy code decided to create a role of Code Czar. Before any code could be checked into the source control system, it had to go through the Code Czar who would walk through the proposed changes with the programmer. The Code Czar role required someone very senior. Someone with tremendous experience with the large, complex code base under development. Someone who was also very, very busy. The result: code checkins were delayed whenever the Code Czar was unavailable. Worse, despite having more experience than anyone else on the team, the Code Czar couldn&amp;#8217;t always tell what effect a given set of changes might have. The delays in checkins weren&amp;#8217;t worth it; they did not result in an overall improvement in code quality.&lt;/p&gt;
&lt;p&gt;By contrast, many teams find that automated unit tests work far better as a code quality feedback mechanism than a designated human code reviewer. Instead of waiting for a very busy person to become available, programmers can find out for themselves in minutes if their latest changes will have undesired side effects.&lt;/p&gt;
&lt;p&gt;Even Agile teams that regularly reflect-and-adapt in iteration retrospectives are not immune to the temptation to revert to command-and-control practices. For example, Agile teams struggling to test everything during an iteration sometimes create a formal testing phase outside the iteration. I even heard of one organization that was struggling with completing all the tasks in an iteration attempt to solve the problem by having their Scrum Master do a Work Breakdown Structure (WBS) and delegate tasks to specific team members. Not surprisingly, both solutions caused more problems than they solved.&lt;/p&gt;
&lt;p&gt;So how can you tell if a given process change will actually be an improvement and make a team more Agile? Before implementing a process change, consider how (or if) the proposed change supports Agile values like visibility, feedback, communication, collaboration, efficiency, and rapid and frequent deliveries. Also ask yourself these questions:&lt;/p&gt;
&lt;p&gt;Does the process change rely on humans achieving perfection? To succeed in the role, the Code Czar would have had to have perfect knowledge of all the interdependencies in the code. Similarly, some processes rely on having perfect requirements up front. Successful practices don&amp;#8217;t rely on perfect knowledge or perfect work products. Instead, they rely on fast feedback and visibility to enable the team to detect problems early, correct them while they&amp;#8217;re small, and enable the team to improve iteratively.&lt;/p&gt;
&lt;p&gt;Does it result in more time talking than working? Beware any process improvement that involves more meetings. More meetings rarely solve either communication or coordination problems. As the project manager in the simulation discovered, talking about work doesn&amp;#8217;t increase the amount of work actually accomplished. As an alternative to meetings, consider collaborative working sessions where team members do the work rather than talking about it.&lt;/p&gt;
&lt;p&gt;Does it introduce unnecessary delays or false dependencies? Whenever a process change increases the number of formal hand-offs, it slows things down but may not improve the overall outcome. The Code Czar learned this the hard way.&lt;/p&gt;</content>
		<author>
			<name>Elisabeth Hendrickson</name>
			<uri>http://testobsessed.com</uri>
		</author>
		<source>
			<title type="html">Test Obsessed</title>
			<subtitle type="html">Because empirical evidence trumps speculation. Every. Single. Time. (Elisabeth Hendrickson's thoughts on Agile, Testing, and Agile Testing.)</subtitle>
			<link rel="self" href="http://testobsessed.com/feed/"/>
			<id>http://testobsessed.com/feed/</id>
			<updated>2012-01-21T20:47:54+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Change Artist Challenge #11: Putting Theory Into Practice</title>
		<link href="http://secretsofconsulting.blogspot.com/2012/01/change-artist-challenge-11-putting.html"/>
		<id>tag:blogger.com,1999:blog-25922407.post-7657910195442849312</id>
		<updated>2012-01-05T12:14:21+00:00</updated>
		<content type="html">&lt;i&gt;There's nothing more practical than a good theory. - Kenneth Boulding&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Reading a book is one thing. Applying what you learn is quite another. If you don't apply it soon, it simply fades away. The same is true of any educational experience. If you come back from a class and don't start using some of the material, you may as well not have gone in the first place.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Challenge&lt;/b&gt;&lt;br /&gt;Your challenge is to review the chapters in any of the four Quality Software Management volumes concerning specifics of the Anticipating organization and consider each idea in terms of the artistry that you can use to introduce it to your organization. Try to create at least one specific action item that will advance the transformation to that way of doing things.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Experiences&lt;/b&gt;&lt;br /&gt;1. I started a brown bag special-interest group on our new CASE tool as a place for people who were using it to share learnings, and as a low-risk place for those who weren't using it to find out about it. The hardest part for me—and the real challenge—was to be the first speaker. I haven't been a person who enjoys speaking in front of groups, but I got some support and made myself do it. The group now runs on its own—with little nudges from me once in a while—and there's no trouble getting speakers. It has tripled in size as our use of the tool has grown, and people think that without the group the tool would have died in the original group, or at least not spread.&lt;br /&gt;&lt;br /&gt;2. I set out to measure something that would be useful to upper management and to the people whose work was being measured. After a few false starts, I hit upon measuring resolution time for failures found in test. I set up a system to capture this data from our bug database and to plot it automatically week by week. One of the surprising things it showed was the way the new configuration management system actually slowed down resolution time. Since I was advocating the new system, I was rather disappointed, but I resisted the temptation to fudge the figures. Management wanted to throw the system out, but I invoked the Satir Change Model to get a few weeks grace period. With the help of some investigation into the causes of Chaos, the graph improved. In about three weeks, the resolution time was back to what it was before the tool, and after six weeks, the time was cut by 32%. This was the first time anyone had ever demonstrated the value of a new tool in our organization.&lt;br /&gt;&lt;br /&gt;3. My challenge to myself was to open up information in my organization. To do this, I decided to be the model by using Public Project Progress Posters for the three projects I'm managing. I was surprised by the emotional reactions—mine and others'. I was apprehensive and defensive, yet proud of my courage. One of the other managers came into my office, shut the door, and started screaming obscenities at me for embarrassing him (because he wasn't going to post his progress). The people in the projects were generally accepting, though I spent a lot of time in the next two weeks explaining how to read the posters, what certain slippages meant, and what I was going to do about them. It was a lot more trouble than I anticipated, but now that things have settled down, it seems to be worth it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-79smsX7UAE8/TqWuExImbJI/AAAAAAAAAJ0/QxXZrEjczGc/s1600/QS%2B7%2BCover%2BFull.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; width=&quot;234&quot; src=&quot;http://1.bp.blogspot.com/-79smsX7UAE8/TqWuExImbJI/AAAAAAAAAJ0/QxXZrEjczGc/s320/QS%2B7%2BCover%2BFull.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This post is part of the series, adapted from the book, &lt;i&gt;&lt;a href=&quot;http://www.geraldmweinberg.com&quot;&gt;Becoming a Change Artist&lt;/a&gt;&lt;/i&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/25922407-7657910195442849312?l=secretsofconsulting.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Gerald M. Weinberg</name>
			<email>noreply@blogger.com</email>
			<uri>http://secretsofconsulting.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Gerald Weinberg's Secrets of Writing and Consulting</title>
			<subtitle type="html">This blog is a continuation of my books, &lt;a href=&quot;http://www.geraldmweinberg.com/Site/Consulting_Secrets.html&quot;&gt;The Secrets of Consulting&lt;/a&gt;, &lt;a href=&quot;http://www.geraldmweinberg.com/Site/More_Secrets.html&quot;&gt;More Secrets of Consulting&lt;/a&gt;, and &lt;a href=&quot;http://www.geraldmweinberg.com/Site/On_Writing.html&quot;&gt;Weinberg on Writing: The Fieldstone Method&lt;/a&gt; as well as my work at &lt;a href=&quot;http://ayeconference.com/&quot;&gt;the AYE Conference&lt;/a&gt;</subtitle>
			<link rel="self" href="http://secretsofconsulting.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-25922407</id>
			<updated>2012-02-08T14:48:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">PHP Training in Montréal</title>
		<link href="http://sebastian-bergmann.de/archives/917-PHP-Training-in-Montreal.html"/>
		<id>http://sebastian-bergmann.de/archives/917-guid.html</id>
		<updated>2012-01-04T08:00:00+00:00</updated>
		<content type="html">&lt;p&gt;Together with my friends and partners from &lt;a href=&quot;http://thePHP.cc/&quot; title=&quot;thePHP.cc - The PHP Consulting Company&quot;&gt;thePHP.cc&lt;/a&gt;, Arne Blankerts and Stefan Priebsch, I will be giving an &quot;&lt;a href=&quot;http://confoo.ca/en/2012/session/advanced-php-development-2&quot;&gt;Advanced PHP Development&lt;/a&gt;&quot; training in Montréal in March.&lt;/p&gt;&lt;dl&gt;&lt;dd&gt;&lt;p&gt;With all PHP topics, nothing counts more than their practical application. This is why &lt;a href=&quot;http://thePHP.cc/&quot; title=&quot;thePHP.cc - The PHP Consulting Company&quot;&gt;thePHP.cc&lt;/a&gt; once again offers a highly interactive and practical training right before the &lt;a href=&quot;http://confoo.ca/en&quot;&gt;ConFoo&lt;/a&gt; conference. Based on their own specific needs and questions, the attendees decide on the topics that are covered. They experience the development of new code at first hand, following their own agendas rather than those of the three trainers.&lt;/p&gt;
&lt;p&gt;With a twinkle in their eyes and a dash of fun, &lt;strong&gt;Sebastian Bergmann&lt;/strong&gt;, &lt;strong&gt;Arne Blankerts&lt;/strong&gt;, and &lt;strong&gt;Stefan Priebsch&lt;/strong&gt; explain &lt;strong&gt;development methods and tools&lt;/strong&gt;, present &lt;strong&gt;trends and concepts&lt;/strong&gt;, and perform joint &lt;strong&gt;code review&lt;/strong&gt; sessions. This is efficient learning in a relaxed environment.&lt;/p&gt;
&lt;p&gt;Topics covered include &lt;strong&gt;development best practices&lt;/strong&gt;, &lt;strong&gt;object-oriented programming&lt;/strong&gt;, &lt;strong&gt;design patterns&lt;/strong&gt;, &lt;strong&gt;web application architecture&lt;/strong&gt;, &lt;strong&gt;security&lt;/strong&gt;, &lt;strong&gt;software quality and testing&lt;/strong&gt;. All three trainers will be present at all times, so attendees have an unparalleled level of access to top-notch PHP expertise.&lt;/p&gt;
&lt;p&gt;This training gives answers to every question you ever had about PHP and software development with PHP. Attendees should bring their own code and as many questions as they have.&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;As the training is scheduled right before the &lt;a href=&quot;http://confoo.ca/en&quot;&gt;ConFoo&lt;/a&gt; conference and the topics covered complement its presentations, the &lt;a href=&quot;http://confoo.ca/en/2012/session/advanced-php-development-2&quot;&gt;Advanced PHP Development&lt;/a&gt;&quot; training is the perfect preparation for attendees to get the most out of the conference.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://confoo.ca/en/register&quot;&gt;Register now&lt;/a&gt;&lt;/strong&gt; to secure your seat as the number of attendees is limited to ensure a beneficial learning environment.&lt;/p&gt;</content>
		<author>
			<name>Sebastian Bergmann</name>
			<email>nospam@example.com</email>
			<uri>http://sebastian-bergmann.de/</uri>
		</author>
		<source>
			<title type="html">Sebastian Bergmann</title>
			<link rel="self" href="http://sebastian-bergmann.de/feeds/index.rss2"/>
			<id>http://sebastian-bergmann.de/feeds/index.rss2</id>
			<updated>2012-02-03T08:47:14+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Tester New Year’s Resolutions</title>
		<link href="http://feedproxy.google.com/~r/EricJacobsonSoftwareTestingBlog/~3/Jqit7Nx8O1w/tester-new-years-resolutions.html"/>
		<id>tag:blogger.com,1999:blog-8951904624959546499.post-7502971487110013463</id>
		<updated>2012-01-03T18:17:00+00:00</updated>
		<content type="html">&lt;p&gt;Dear project team, &lt;/p&gt; &lt;p&gt;This year I will…&lt;/p&gt; &lt;ul&gt; &lt;li&gt;target my testing to find you the right information sooner and trust your decision to ship early.&lt;/li&gt; &lt;li&gt;not test everything just because it is possible to test.&amp;nbsp; Instead, I’ll spend my energy where I think my services are most valuable to you.&amp;nbsp; I’ll tell you what I decide not to test and why.&amp;nbsp; If you disagree, I will change my plan and test it. &lt;/li&gt; &lt;li&gt;consider the idea to stop executing tests that I’m 99.99% sure will pass.&lt;/li&gt; &lt;li&gt;not stress out about test deadlines.&amp;nbsp; When I run out of time I will share that with you; in the past you have either jumped in to help or given me more time.&amp;nbsp; It typically is not as terrible as I anticipate.&amp;nbsp; Nevertheless, I promise not to be a slacker because it doesn’t feel nearly as good as being an over-achiever.&lt;/li&gt; &lt;li&gt;swallow my pride and ask you questions sooner, rather than hoping I understand later (even though I enjoy self-education via independent exploring and experimenting).&lt;/li&gt; &lt;li&gt;pay more attention to the business needs behind the things I test, as they will help me focus my test coverage.&lt;/li&gt; &lt;li&gt;look for ways to increase my value to you, like giving impromptu test reports, offering to log your bugs, and testing breadth before depth to at least catch the obvious ones early.&lt;/li&gt; &lt;li&gt;learn something about Selenium because everyone keeps talking about it and I feel dumb not knowing much about it.&amp;nbsp; And who knows, someday I may have an opportunity to test a website for a change.&lt;/li&gt; &lt;li&gt;congratulate you on good work and take more interest in your achievements as BAs, Programmers, and CMs.&lt;/li&gt; &lt;li&gt;read that Data Warehouse Toolkit book by Kimball that you keep referring to.&amp;nbsp; I’m sure much of it will be boring but I think it will help me respect your development efforts and determine new test ideas.&amp;nbsp; It should also increase my Data Warehouse vocabulary.&lt;/li&gt; &lt;li&gt;squeeze time out of each day for learning something new about testing because fresh ideas make my job more interesting and make me a better tester.&amp;nbsp; I will share these test ideas with you for the fun of it.&amp;nbsp; Who knows, it may lead to something we can use here on a project.&lt;/li&gt; &lt;li&gt;stay late to meet deadlines or accommodate production releases…sometimes.&amp;nbsp; Not often, hopefully.&amp;nbsp; But I will do my time like others on our team and I will thank you when you work late.&amp;nbsp; My personal time is important to me, therefore, it must also be important to you.&lt;/li&gt; &lt;li&gt;pay attention to my little tester light bulb that occasionally goes off with new thoughts.&amp;nbsp; I will attempt to blog about these thoughts on my personal blog during non-work time.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;How about you?&amp;nbsp; Any Tester New Year’s Resolutions?&lt;/p&gt;  &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8951904624959546499-7502971487110013463?l=www.testthisblog.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/EricJacobsonSoftwareTestingBlog/~4/Jqit7Nx8O1w&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Eric Jacobson</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.testthisblog.com/</uri>
		</author>
		<source>
			<title type="html">Test This Blog - Eric Jacobson's Software Testing Blog</title>
			<subtitle type="html">Refinements on the art of software testing</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/EricJacobsonSoftwareTestingBlog"/>
			<id>tag:blogger.com,1999:blog-8951904624959546499</id>
			<updated>2012-02-08T20:47:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Why Checking Is Not Enough</title>
		<link href="http://www.developsense.com/blog/2011/12/why-checking-is-not-enough/"/>
		<id>http://www.developsense.com/blog/?p=1125</id>
		<updated>2011-12-28T05:33:03+00:00</updated>
		<content type="html">&lt;p&gt;Here is a specific, real-world example of testing where the focus doesn&amp;#8217;t include explicit checking, and does not result in yes-or-no answers to predetermined questions.&lt;/p&gt;
&lt;p&gt;This morning, I acted on a piece of email I received several days ago, offering a free upgrade to a PDF conversion package which I&amp;#8217;ll call &amp;#8220;PDFThing&amp;#8221;. I&amp;#8217;ll walk you through what happened, and parts of my thought process as it happened.&lt;/p&gt;
&lt;p&gt;Since the email is addressed to me, and since it notes that I had purchased upgrade insurance, I presume that the company has all of the data needed to know which product was associated with that email address.&lt;/p&gt;
&lt;p&gt;The mail message includes this text:  &amp;#8220;It’ll only take a few minutes, but we’ll need your serial number (also known as a license key) to deliver your upgade. [How do I find my serial number?]&amp;#8221;  (The text in square brackets was a link.)&lt;/p&gt;
&lt;p&gt;I note that &amp;#8220;upgrade&amp;#8221; is misspelled. Spelling can be checked, and a spelling checker would have found that problem, but checks can&amp;#8217;t guarantee correct spelling.  Do you doubt this?  What if I had said that Czechs can&amp;#8217;t guarantee correct spelling?  Or that cheques can&amp;#8217;t guarantee correct spelling?  You would have noticed right away, but a spelling checker would not have.&lt;/p&gt;
&lt;p&gt;I see a more serious potential problem, though.  If the company has data about me, why not provide helpful serial number information directly and immediately?  Options include &amp;#8220;Your serial number is&amp;#8230;&amp;#8221; or if they&amp;#8217;re worried about someone intercepting the mail, &amp;#8220;The serial number can be found in your version of PDFThing by&amp;#8230;&amp;#8221;, in a way specific to the version that is associated with that email address.&lt;/p&gt;
&lt;p&gt;I click on the link.  It takes me to an FAQ page that has a list of questions.  Conveniently, the question titled &amp;#8220;Where do I find my serial number for PDFThing?&amp;#8221; already shows an answer: &lt;/p&gt;
&lt;p&gt;&amp;#8220;It depends on what version of PDFThing you have and where you bought it. If you bought PDFThing 7 from our website, your serial number (in alpha-numeric characters) can be found under the Help tab in the About section.&amp;#8221;&lt;/p&gt;
&lt;p&gt;I have PDFThing 6, though. And I purchased it at a store.  So I apply an oracle: consistency with an implicit purpose.  An implicit purpose of this answer is to convey information to users of *any* version of PDFThing, purchased *anywhere*.  The answer doesn&amp;#8217;t do that.  Is this a problem?  I don&amp;#8217;t know if the product owner will consider this a problem at all, or a problem worth fixing, so I can&amp;#8217;t provide a yes-or-no answer.  What I can do as a tester is to note a &lt;em&gt;possible&lt;/em&gt; problem, and move on.&lt;/p&gt;
&lt;p&gt;I decide to open my existing version PDFThing, and I apply another set of consistency heuristics:  consistency with history; consistency within the product; consistency with an implicit claim; consistency within the product.  Maybe the serial number for version 6 is located in the same place as the serial number for version 7. I click on Help and then About. I find that the serial number is not in the place referred to by the FAQ text, so with respect to the product I own, that text is misleading and incorrect.  Plus I apply the &amp;#8220;consistency with comparable product&amp;#8221; heuristic; many products put the serial number in the Help/About box.  All in all, this looks more like a problem.  Will the product owner see it that way?&lt;/p&gt;
&lt;p&gt;I dimly remember that I received a copy of the serial number in the e-mail that I got when I first registered the product. I go on a hunt for that e-mail.  It takes me a few minutes to find it, but eventually I do. I copy the serial number to the clipboard and I returned to the original e-mail and click on upgrade to download the product. My own impatience and exasperation suggests to me that there&amp;#8217;s a problem here. Note that although you can test for an emotional reaction, you can&amp;#8217;t check for it. At best, you can anticipate things like delays of a certain duration as the program is executing.  Measurement theorists call that a surrogate measure&amp;mdash;using one kind of measureument as a substitute or a stand-in for the thing that we&amp;#8217;d actually like to measure.&lt;/p&gt;
&lt;p&gt;When the product finishes downloading, I begin the installation process. I&amp;#8217;m prompted for the serial number for my older version, which I provide.  The installer accepts the serial number and prompts me for a directory into which the new version of PDFThing should be installed. I notice that the product is being installed into a folder that is specific to version 7.  I suspect that the prior version of PDFThing is not being uninstalled, so rather than accepting the default directory, I browse upward.  I find that indeed the new product is not replacing the old product.  Problem or no problem?  For a check to determine this, the decision rule would have to have been decided and programmed in advance.&lt;/p&gt;
&lt;p&gt;I go to Add/Remove programs, and begin the uninstallation process for PDFThing 6.  The uninstaller posts a dialog saying, &amp;#8220;The following applications should be closed before continuing the install&amp;#8221;, and in the window beneath, I see a reference to the title of an email message I&amp;#8217;m drafting in Outlook.  That makes sense; PDFThing 6 installs a toolbar in Outlook so that I can print PDFs directly from the program.  Still, there&amp;#8217;s no reference to Outlook itself, though. So is that the message that the designer of the program wants me to see?&lt;/p&gt;
&lt;p&gt;I close the offending message window and save the message as a draft.  I return to the uninstallation dialog, press Retry, and the uninstallation proceeds.  It appears to make some progress.  I switch to another window and continue working while uninstallation continues in background.  After a brief interval, it posts the same dialog as before, but this time tells me that Microsoft Word should be closed before continuing the install.  Is this the behaviour that the designer wanted?&lt;/p&gt;
&lt;p&gt;I now wonder what would have happened had I not chosen to uninstall PDFThing 6.  Would Outlook and Word have acquired a second set of toolbars for PDFThing 7?  Would they be separate?  Would the new one have replaced the old one?  I could have perhaps have programmed checks for that, but would it have been worthwhile to do that?  Wouldn&amp;#8217;t eyeballing it be cheaper and faster?  Maybe not; maybe there are bunches of registry entries and files and configuration settings and stuff connected to Outlook (and Word, and Explorer, and PowerPoint, and Excel) such that we&amp;#8217;d really need a program to help us probe that.  Would a check have wondered and raised that issue to programmers or designers?&lt;/p&gt;
&lt;p&gt;The installation process continues.  In the middle, a browser window appears, asking me why I&amp;#8217;m uninstalling PDFThing 6. The options are &amp;#8220;I don&amp;#8217;t want to purchase or continue with the trial&amp;#8221;; &amp;#8220;I purchased the product and am uninstalling the trial&amp;#8221;; &amp;#8220;I&amp;#8217;m upgrading to the latest version&amp;#8221;; &amp;#8220;I&amp;#8217;m about to move my PDFThing 6 license to another computer.&amp;#8221;  It seems to me that the third option would be unnecessary if PDFThing 7&amp;#8242;s installation program automatically removed PDFThing 6.  So is this the uninstallation process that the product owner wants?&lt;/p&gt;
&lt;p&gt;I answer the question (I&amp;#8217;m upgrading), and the Web page offers a thank you for answering the question.  In the interim, the uninstallation process seems to have terminated.  Was it successful?  I don&amp;#8217;t know.  Did the designers intend that uninstallation should end immediately?  And what if I hadn&amp;#8217;t had an active Internet connection; what would have happened then?  Would checks raise these questions?  Perhaps &lt;em&gt;the development&lt;/em&gt; of checks might have, but the checks themselves would not have.&lt;/p&gt;
&lt;p&gt;I return to the installer for PDFThing 7, and start it up again.  Oddly, I&amp;#8217;m not asked for my serial number this time. Has the product retained it from the last attempt?  I don&amp;#8217;t know.  How would I find out?&lt;/p&gt;
&lt;p&gt;The installation process carries on for a while, and at the end, I&amp;#8217;m presented with a dialog that asks whether I want to buy the product or activate it.  I choose the latter; I&amp;#8217;ve already bought it.  The activation window asks for the serial number.  I provide it, and immediately I&amp;#8217;m presented with this error dialog (which I haven&amp;#8217;t altered):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.developsense.com/images/PDFThingInstallationErrorSmall.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Note that the dialog is titled &amp;#8220;Information&amp;#8221;; the name of the product isn&amp;#8217;t provided.  Look as well at the formatting of the message; it looks sloppy and unprofessional to me.  Oh, and dammit, it IS the right serial number (it was accepted last time). Is this what the product owner wants?&lt;/p&gt;
&lt;p&gt;I dismiss the dialog, and the activation dialog has a moving graphic indicating that the product is waiting from something.  Otherwise, the product seems hung.  Just in case, though, I click on the Activate button again.  The &amp;#8220;Information&amp;#8221; dialog above appears again.  There&amp;#8217;s no choice apparent except to dismiss the two dialogs and get on the line to technical support, whereupon the costs will really begin to rack up.&lt;/p&gt;
&lt;p&gt;Now you could say that, if I were a tester working for the PDFThing people, I should have received all of this information before beginning test execution, whereupon I should have prepared checks to be applied against the product.  It&amp;#8217;s a fine idea.  But even when we&amp;#8217;re working on the best imaginable teams in the best-managed projects, as soon as we begin to test &lt;i&gt;test&lt;/i&gt;, we begin immediately to discover things that &lt;i&gt;no one&lt;/i&gt;&amp;mdash;neither testers, designers, programmers, nor product owner&amp;mdash;had anticipated or considered before testing revealed them.  It&amp;#8217;s simply fatuous to suggest that everyone involved in the development of the product knows exactly what they will want or need from the outset. It&amp;#8217;s even more fatuous to suggest that they &lt;i&gt;should&lt;/i&gt; know such a thing. Software development is not simply construction according to prescribed plans.  It is &lt;i&gt;development&lt;/i&gt;.  Like testing itself, it is a process of exploration, discovery, investigation, and learning.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s important not to confuse checks with oracles.  An oracle is a principle or mechanism by which we recognize a problem.  A check is a mechanism, an observation linked to a decision rule.  That rule is based on a single application of a single principle.  A check provides a signal, a bit, when the product&amp;#8217;s behaviour or state is inconsistent with that principle.  A check follows a rule; it does not apply a heuristic. Testing, which may include many checks, is not so restricted.  Testing may produce a yes-or-no answer, but it may also produce an observation, a question, a concern, a dilemma, a new test idea, or a new check idea.  Testing is not governed by rules; it is governed by heuristics that, to be applied appropriately, require sapient awareness and judgement.&lt;/p&gt;
&lt;p&gt;Checking is an approach to making sure that we get the right answers, for questions and desired answers that we&amp;#8217;ve already determined in advance.  A passing check doesn&amp;#8217;t tell us that the product is acceptable.  At best, a check that &lt;em&gt;doesn&amp;#8217;t&lt;/em&gt; pass suggests that there is a problem in the product that &lt;em&gt;might&lt;/em&gt; make it &lt;em&gt;un&lt;/em&gt;acceptable. &lt;/p&gt;
&lt;p&gt;Testing incorporates checking, but is a far richer set of activities: exposing ourselves to the unexpected, making new observations, spotting unanticipated problems, and raising new questions.  Yet not even testing is about telling people that the product is acceptable.  On the one hand, testing may have a different purpose.  Cem Kaner, in the BBST course, lists &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finding defects&lt;/li&gt;
&lt;li&gt;Maximizing bug count&lt;/li&gt;
&lt;li&gt;Blocking premature product releases&lt;/li&gt;
&lt;li&gt;Helping managers make ship / no-ship decisions&lt;/li&gt;
&lt;li&gt;Minimizing technical support costs&lt;/li&gt;
&lt;li&gt;Assessing conformance to specification&lt;/li&gt;
&lt;li&gt;Assessing conformance to regulations&lt;/li&gt;
&lt;li&gt;Minimizing safety-related lawsuit risk&lt;/li&gt;
&lt;li&gt;Finding safe scenarios for use of the product (workarounds that make the product potentially tolerable, in spite of the bugs)&lt;/li&gt;
&lt;li&gt;Assessing quality&lt;/li&gt;
&lt;li&gt;Verifying the correctness of the product&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To which I would add&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;assessing compatibility with other products or systems&lt;/li&gt;
&lt;li&gt;assessing readiness for internal deployment&lt;/li&gt;
&lt;li&gt;ensuring that that which used to work still works&lt;/li&gt;
&lt;li&gt;design-oriented testing, such as review or test-driven development&lt;/li&gt;
&lt;li&gt;understanding the workings of a poorly-documented product or library&lt;/li&gt;
&lt;li&gt;evaluating the usefulness of a new tool or service&lt;/li&gt;
&lt;li&gt;refining notions of risk&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the other hand, much of the time, we&amp;#8217;re testing to help determine whether a product is acceptable for release. But decisions about acceptability are in the hands of managers, programmers, designers; those who build the product (and ultimately, acceptability is the decision of the product owner).  Testing is about investigating the product to reveal knowledge that informs the acceptability decision.  Sometimes that information comes in the form of binary answers to known questions; checks.  Sometimes that information comes in the form of discoveries that pose new ideas, new risks, and new questions for those who are responsible for building and releasing the product.&lt;/p&gt;</content>
		<author>
			<name>Michael</name>
			<uri>http://www.developsense.com/blog</uri>
		</author>
		<source>
			<title type="html">Developsense Blog</title>
			<subtitle type="html">DevelopSense Blog</subtitle>
			<link rel="self" href="http://www.developsense.com/blog/feed/atom/"/>
			<id>http://www.developsense.com/blog/feed/atom/</id>
			<updated>2012-02-08T20:48:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">2nd Annual QA/Test Job Posting Study</title>
		<link href="http://testobsessed.com/blog/2011/12/23/2nd-annual-qatest-job-posting-study/"/>
		<id>http://testobsessed.com/?p=750</id>
		<updated>2011-12-23T20:38:34+00:00</updated>
		<content type="html">&lt;p&gt;&lt;em&gt;This is a guest blog post by Daniel Frank, my assistant. Daniel took on the challenge of updating the QA/Test job study for 2011, just in time for making New Year&amp;#8217;s resolutions. Enjoy! Elisabeth&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s been a little over a year since Elisabeth published &amp;#8220;&lt;a href=&quot;http://testobsessed.com/blog/2010/10/20/testers-code/&quot;&gt;Do Testers Have to Write Code&lt;/a&gt;,&amp;#8221; the results of an in-depth survey of job ads that she and Melinda conducted to see if employers expect testers to program. The resounding conclusion, with 80% of tester job ads requesting some kind of programming skill, was &amp;#8220;Yes.&amp;#8221;&lt;/p&gt;
&lt;p&gt;This year we wanted to see if things have changed, so I conducted the same study again. I also wanted to add a bit more granularity to the study, to see if there were any trends that were missed last time.&lt;/p&gt;
&lt;p&gt;I screened the lists with the same basic guidelines as our previous study. That means I restricted my search to the US only. I only counted a job if it was described as a testing/QA position in the job title. I did not include recruiter listings in order to avoid the risk of including duplicate jobs or even fake jobs used to gather pools of applicants.&lt;/p&gt;
&lt;p&gt;Our final sample size this year is 164 jobs. That&amp;#8217;s a little less than last year. Why?&lt;/p&gt;
&lt;p&gt;The lists were sparse. There just aren&amp;#8217;t that many job ads out there. Many of the job ads I found were from recruiters or were repeats, with the same company listing the same position several weeks in a row. &lt;/p&gt;
&lt;p&gt;The simple fact that I had a hard time finding the same number of ads as last year is interesting information all on its own. From an overall economic standpoint, the country is in no more of a slump than we were in 2010. So why are there fewer listings for testers? Could it be that Alberto Savoia, who recently declared testing dead, is correct? We&amp;#8217;ll come back to that question later.&lt;/p&gt;
&lt;p&gt;Back to the study&amp;#8230;&lt;/p&gt;
&lt;p&gt;Like last year, the majority of our jobs came from Craigslist (90) and LinkedIn (64). The rest of them came from a smattering of other sites. &lt;/p&gt;
&lt;p&gt;The data includes an even higher proportion of jobs in California than last year: 102 of the listings were in CA, with the remainder divided in small chunks between 28 other states. Unsurprisingly,Texas, Massachusetts, and Washington are the three runners up. &lt;/p&gt;
&lt;p&gt;Last year there was some question of whether or not the sample was biased simply because we&amp;#8217;re located in California. However, I took extra steps to try and get equal representation. The simple fact is that a search that might find 70 jobs when I filter the location for CA will result in 30 jobs or fewer if I filter for another area. If anything, I&amp;#8217;d estimate that California is actually under represented.&lt;/p&gt;
&lt;p&gt;I kept track of the job titles. By far the most popular title is &amp;#8220;QA Engineer&amp;#8221; (99 of the listings).  136 of the titles contained &amp;#8220;QA&amp;#8221; compared with only 32 containing the word &amp;#8220;Test.&amp;#8221; &lt;/p&gt;
&lt;p&gt;An interesting side note: when I searched for the word &amp;#8220;test&amp;#8221; in the body of job ads, I found far more developer positions than similar searches for &amp;#8220;qa&amp;#8221; did. It would seem that at the same time QA/Test positions are requiring more coding skills, developer positions are requiring more testing skills. That might be another interesting job ad survey project.&lt;/p&gt;
&lt;p&gt;So how much coding are testers expected to do?&lt;/p&gt;
&lt;p&gt;Of the 164 listings, 102 jobs say they require knowledge of at least one programming language, and 38 jobs indicate coding is a nice to have. That&amp;#8217;s 140 out of 164, or 85.37% of the sample. That&amp;#8217;s an even higher percentage than last year. It&amp;#8217;s difficult to say if the 5% uptick represents a real increase in demand, but at the very least it&amp;#8217;s fair to say that demand for testers who code remains high.&lt;/p&gt;
&lt;p&gt;I used the same criteria that Elisabeth and Melinda used last year. That means that I counted a job as requiring programming if the job required experience in or knowledge of a specific language, or if the job duties mentioned a language. There were 7 jobs which listed broad experience requirements like &amp;#8220;must be able to script in multiple languages,&amp;#8221; which also counted as requiring programming.&lt;/p&gt;
&lt;p&gt;There were some judgment calls to be made about what may or may not count as a programming language. For the purpose of the results here, I counted SQL or other relational database knowledge as a programming language in order to be consistent with last year. However, unlike last year, I tracked proficiency in relational databases separately. This will let me track specific trends more easily in future studies.&lt;/p&gt;
&lt;p&gt;One of the questions Elisabeth wanted to answer last year was whether jobs with self-identified Agile organizations required testers to code more than other jobs. This year 46 of of the 58 Agile job ads list programming skills as required or nice to have. That&amp;#8217;s 79.31%, which is actually a lot less than last year&amp;#8217;s 90%. However, this is one of those places where the small sample size has to be taken into consideration. In 2010, 49 out 55 agile jobs mentioned programming. Today, 46 out of 58 jobs mention it. Just a few jobs result in a 10% variation. &lt;/p&gt;
&lt;p&gt;An enduring question about any kind of job is how much it pays. I saw even less mentions of pay this time around. Only 7 jobs even listed it, and 5 of those were button-pushing game testing positions in the $10-$20/hour range. The other two ran around $85,000-$105,000. Most positions simply don&amp;#8217;t provide up front salary estimations, so we cannot draw any real conclusions from these data points. &lt;/p&gt;
&lt;p&gt;Just for fun, I also noted whenever a job requested a certification. In 164 jobs I found exactly 4 mentions of certification, and not a single one was required. 3 of them were vendor or technology certifications that had nothing to do with testing. And even in the single instance where a testing certification was nice to have, it was &lt;a href=&quot;http://www.softwarecertifications.org/qai_cste.htm&quot;&gt;the CSTE offered by QAI&lt;/a&gt;, rather than the much more hyped ISTQB. So it would seem that testing certifications are not much in demand. The bottom line is that someone looking to improve their marketability would be much better served by upskilling to a new proficiency rather than picking up an irrelevant certification.&lt;/p&gt;
&lt;p&gt;And that&amp;#8217;s about it for our study. If you&amp;#8217;d like to dig through the raw data to look for any trends I may have missed, I&amp;#8217;ll be happy to send it to you. &lt;a href=&quot;mailto:info@qualitytree.com&quot;&gt;Drop me a line&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now back to the question about the number of QA/Test jobs out there. Could it be that there are fewer QA/Test positions? Was this just a matter of luck and timing, or is there a trend?&lt;/p&gt;
&lt;p&gt;Alberto Savoia gave &lt;a href=&quot;http://www.youtube.com/watch?v=X1jWe5rOu3g&quot;&gt;a talk titled &amp;#8220;Test is Dead&amp;#8221; at GTAC&lt;/a&gt; (dressed as the Grim Reaper). He may have used intentionally inflammatory hyperbole to make his point, but that doesn&amp;#8217;t change the fact that he had interesting points to make. &lt;/p&gt;
&lt;p&gt;Alberto points out that especially in web development, speed is paramount. Further, the biggest challenge isn&amp;#8217;t in building &amp;#8220;it&amp;#8221; right, but in building the right &amp;#8220;it.&amp;#8221; So the goal is to get a minimum viable product out as quickly as possible, and get fast feedback from real users and customers. Traditional black box testing ends up taking a back seat in this type of development, and these projects often rely heavily on user feedback instead.&lt;/p&gt;
&lt;p&gt;At STARWest 2011, James Whittaker of Google gave &lt;a href=&quot;http://www.youtube.com/watch?v=yOrPuMCdVXA&quot;&gt;a talk titled &amp;#8220;All That Testing is Getting in the Way of Quality&amp;#8221;&lt;/a&gt; where he talked about the closest thing to a traditional testing role they have at Google. It&amp;#8217;s called the &amp;#8220;Test Engineer,&amp;#8221; and they spend anywhere from 20%-80% of their time writing code. He also explains how Google utilizes their user bases to do almost all of their exploratory tests. As he puts it, &amp;#8220;Users are better at being users than testers are, by definition.&amp;#8221; &lt;/p&gt;
&lt;p&gt;With James and Alberto&amp;#8217;s talks firmly in mind, I can&amp;#8217;t help but wonder if the difficulty I experienced in finding job ads that met my criteria is indicative of a sea-change in the industry rather than an anomaly. Could it be that we&amp;#8217;re seeing a reduction in the number of QA/Test positions?&lt;/p&gt;
&lt;p&gt;What do you think? Are you seeing fewer QA/Test positions in your organization or (if you&amp;#8217;re looking) in your job search?&lt;/p&gt;</content>
		<author>
			<name>Elisabeth Hendrickson</name>
			<uri>http://testobsessed.com</uri>
		</author>
		<source>
			<title type="html">Test Obsessed</title>
			<subtitle type="html">Because empirical evidence trumps speculation. Every. Single. Time. (Elisabeth Hendrickson's thoughts on Agile, Testing, and Agile Testing.)</subtitle>
			<link rel="self" href="http://testobsessed.com/feed/"/>
			<id>http://testobsessed.com/feed/</id>
			<updated>2012-01-21T20:47:54+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">What Exploratory Testing is Not</title>
		<link href="http://www.satisfice.com/blog/archives/678"/>
		<id>http://www.satisfice.com/blog/?p=678</id>
		<updated>2011-12-22T04:43:06+00:00</updated>
		<content type="html">&lt;p&gt;Michael Bolton has gone off like a volcano in Iceland, writing a series about what exploratory testing isn&amp;#8217;t:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-1-touring&quot;&gt;http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-1-touring&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-2-after-everything-else-testing&quot;&gt;http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-2-after-everything-else-testing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-3-tool-free-testing&quot;&gt;http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-3-tool-free-testing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-4-quick-tests&quot;&gt;http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-4-quick-tests&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.developsense.com/blog/2011/12/what-exploratory-testing-isnt-part-5-undocumented-testing&quot;&gt;http://www.developsense.com/blog/2011/12/what-exploratory-testing-isnt-part-5-undocumented-testing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another thing I would add to this:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Exploratory testing is not defined by any specific example of exploratory testing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Just as tap dancing does not characterize ballroom dancing, you can&amp;#8217;t take any one example of exploratory testing and treat that as representative of the entire concept of ET.&lt;/p&gt;
&lt;p&gt;If you were to hear me singing an aria by Mozart, that would be an example of opera singing. It would be an example of BAD opera singing, but it would truly be an example of the style. Similarly, I regularly talk to testers who go &amp;#8220;oh yeah I&amp;#8217;ve seen that exploratory testing stuff but it&amp;#8217;s not structured&amp;#8230; not documented&amp;#8230; not x&amp;#8230; not y&amp;#8230; not whatever.&amp;#8221; And my reply is &amp;#8220;you probably haven&amp;#8217;t seen skilled exploratory testing. Would you like to hear me sing an opera now? OR, I could show you a good example of ET in practice.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Exploratory testing can be done in an unskilled, slapdash, silly way. Just as a unskilled driver behind the wheel of a car is still a driver who is driving a car, a poor tester can still be doing ET&amp;#8211; albeit probably not very well.&lt;/p&gt;
&lt;p&gt;The cool thing about ET is that, even done badly, it&amp;#8217;s still a great way to find some bugs. Michael and I try to help you do much, much better than that.&lt;/p&gt;
&lt;p&gt;The core idea of ET remains as it always has been. It&amp;#8217;s been expressed in many different ways, but boils down to this: &lt;em&gt;test design and test execution and learning mixed together in a mutually supportive way.&lt;/em&gt; Whenever you see that, and to the degree that you see that, you are seeing exploratory testing.&lt;/p&gt;</content>
		<author>
			<name>James Bach</name>
			<uri>http://www.satisfice.com/blog</uri>
		</author>
		<source>
			<title type="html">James Bach’s Blog</title>
			<subtitle type="html">The Consulting Software Tester</subtitle>
			<link rel="self" href="http://www.satisfice.com/blog/feed"/>
			<id>http://www.satisfice.com/blog/feed</id>
			<updated>2012-01-31T20:48:20+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Test Idea Wall</title>
		<link href="http://feedproxy.google.com/~r/EricJacobsonSoftwareTestingBlog/~3/qXhnEb4IAHg/test-idea-wall.html"/>
		<id>tag:blogger.com,1999:blog-8951904624959546499.post-2058160863069693950</id>
		<updated>2011-12-20T18:43:00+00:00</updated>
		<content type="html">&lt;p&gt;After seeing &lt;a href=&quot;http://www.markvasko.com/blog/&quot; target=&quot;_blank&quot;&gt;Mark Vasko&lt;/a&gt;’s CAST 2011 lightning talk, I was inspired to create a Test Idea Wall with one of my project teams.&amp;nbsp; Much to my surprise, the damn thing actually works.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-BAdM7NPTTdw/TvHvyRnBhNI/AAAAAAAAHCQ/GgFgq7wjJyo/s1600-h/TestIdeaBoard%25255B2%25255D.jpg&quot;&gt;&lt;img title=&quot;TestIdeaBoard&quot; border=&quot;0&quot; alt=&quot;TestIdeaBoard&quot; src=&quot;http://lh5.ggpht.com/-mi2b9mfhtds/TvHvynKxOXI/AAAAAAAAHCY/EusS-vvBlEM/TestIdeaBoard_thumb.jpg?imgmax=800&quot; width=&quot;232&quot; height=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;When I’m taking a break from testing something, I pause as I walk past the Test Idea Wall.&amp;nbsp; My brain jumps around between the pictures and discovers gaps in my test coverage.&lt;/p&gt; &lt;p&gt;Our wall is incredibly simple, but so far it contains the main test idea triggers we forget.&amp;nbsp; For example, the picture of the pad lock reminds us to consider locking scenarios, something that is often just an afterthought, but always gets us fruitful information:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;What if we run the same tests as a read-only user?&lt;/li&gt; &lt;li&gt;What if we run the same tests while another user has our lock?&lt;/li&gt; &lt;li&gt;What if we run the same tests while the system has our lock?&lt;/li&gt; &lt;li&gt;What if certain users should not have this permission?&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Thanks, Mark!&lt;/p&gt;  &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8951904624959546499-2058160863069693950?l=www.testthisblog.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/EricJacobsonSoftwareTestingBlog/~4/qXhnEb4IAHg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Eric Jacobson</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.testthisblog.com/</uri>
		</author>
		<source>
			<title type="html">Test This Blog - Eric Jacobson's Software Testing Blog</title>
			<subtitle type="html">Refinements on the art of software testing</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/EricJacobsonSoftwareTestingBlog"/>
			<id>tag:blogger.com,1999:blog-8951904624959546499</id>
			<updated>2012-02-08T20:47:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">What Exploratory Testing Is Not (Part 2): After-Everything-Else Testing</title>
		<link href="http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-2-after-everything-else-testing/"/>
		<id>http://www.developsense.com/blog/?p=1078</id>
		<updated>2011-12-20T09:26:37+00:00</updated>
		<content type="html">&lt;p&gt;Exploratory testing is not &amp;#8220;after-everything-else-is-done&amp;#8221; testing.  Exploratory testing can (and does) take place at any stage of testing or development.&lt;/p&gt;
&lt;p&gt;Indeed, TDD (test-driven development) is a form of exploratory development.  TDD happens in loops, in which the programmer develops a check, then develops the code to make the check pass (along with all of the previous checks), then fixes any problems that she has discovered, and then loops back to implementing a new bit of behaviour and inventing a new check.  The information obtained from each loop feeds into the next; and the activity is guided and structured by the person or people involved in the moment, rather than in advance.  The checks themselves are scripted, but the activity required to produce them and to analyze the results is not.  Compared to the complex cognitive activity&amp;mdash;exploratory, iterative&amp;mdash;that&amp;#8217;s going on as code is being developed, the checks themselves&amp;mdash;scripted, linear&amp;mdash;are trivial.&lt;/p&gt;
&lt;p&gt;Requirement review is an exploratory activity too.  Review of requirements (or specifications, or user stories, or examples) tends happens early on in a development cycle, whether it&amp;#8217;s a long or a short cycle. While review might be guided by checklists, the people involved in the activity are making decisions on the fly as they go through loops of design, investigation, discovery, and learning.  The outcome of each loop feeds back into the next activity, often immediately.&lt;/p&gt;
&lt;p&gt;Code review can also be done in a scripted way or an exploratory way.  When humans analyze the code, it&amp;#8217;s an unscripted, self-directed activity that happens in loops; so it is exploratory.  We &lt;em&gt;call&lt;/em&gt; it review, but it&amp;#8217;s gathering information with the intention of informing a decision; so it is testing.  There is a way to review code that involves the application of scripted processes, via a tools that people generally call &amp;#8220;static testing tools.  When a machine parses code and produces a report, by definition it&amp;#8217;s a form of checking, and it&amp;#8217;s scripted.  Yet using those tools productively requires a great deal of exploratory activity.  Parsing and interpreting the report and responding to it is &lt;a href=&quot;http://www.developsense.com/blog/2011/12/shapes-of-actions/&quot; title=&quot;Shapes of Actions&quot; target=&quot;_blank&quot;&gt;polimorphic&lt;/a&gt;, human action—unscripted, open-ended, iterative, and therefore exploratory.  &lt;/p&gt;
&lt;p&gt;Learning about a new product or a new feature is an exploratory activity if you want to do it or foster it &lt;em&gt;well&lt;/em&gt;. Some suggest that test scripts provide a useful means of training testers.  Research into learning shows that people tend to learn more quickly and more deeply when their learning is based on interaction and feedback; guided, perhaps, but not controlled. If you really want to learn about a product, try creating a &lt;a href=&quot;http://www.bettertesting.co.uk/content/?p=956&quot; title=&quot;Mind Mapping 101&quot; target=&quot;_blank&quot;&gt;mind map&lt;/a&gt;, documenting some aspect of the program&amp;#8217;s behaviour, or creating plausible scenarios in which people might use&amp;mdash;or misuse—the product.  All of these activities promote learning, and they&amp;#8217;re all exploratory activities. There&amp;#8217;s far more information that you can use, apply, and discover than a script can tell you about.  Come to think of it&amp;#8230; where does the script come from?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.satisfice.com/blog/archives/602&quot; title=&quot;Who says ET is good for Medical Devices? The FDA!&quot; target=&quot;_blank&quot;&gt;Developing a test procedure&lt;/a&gt;—even developing a test script, whether for a machine or a human to follow, or developing the kind of &amp;#8220;test&amp;#8221; that skilled testers would call a demonstration—is an exploratory activity.  There is no script that specifies how to write a new script for a particular purpose. Heard about a new feature and pondering how you might test it?  You&amp;#8217;ve already begun testing; you&amp;#8217;re doing test design and you&amp;#8217;re probably learning as you go.  To the extent that you use the product or interact with it, bounce ideas off other people, or think critically about your design, you&amp;#8217;re testing, and you&amp;#8217;re doing it in an unscripted way.  Some might suggest that certain tools create scripts that can perform automatic checks. Yet  reviewing those checks for appropriateness, interpreting the results, and troubleshooting unexpected outcomes are all exploratory activities.&lt;/p&gt;
&lt;p&gt;Supposing that a programmer, midway through a sprint, decides that she&amp;#8217;d like some feedback on the work that she&amp;#8217;s done so far on a new module. She hands you a bit of code to look at. You might interact with the code directly through a test tool that she provided, or (say) via the Ruby interpreter, or you might write some script code to exercise some of the functions in the module.  In any event, you find some problems in it.  In order to investigate a problem that you&amp;#8217;ve discovered, you &lt;em&gt;must&lt;/em&gt; explore.  You must explore whether your recognition of the problem was triggered by your own interaction with the program or by a mechanically executed script.  You&amp;#8217;re in control of the activity; each new test around the problem feeds back into your choice of the next activity, and into the story that you&amp;#8217;re going to tell about the product.&lt;/p&gt;
&lt;p&gt;All of the larger activities that I&amp;#8217;ve described above are exploratory, and they all happen before you have a completed function or story or sprint. Exploratory testing is not a stage or phase of testing to be performed after you&amp;#8217;ve performed your other test techniques. Exploratory testing is not an &amp;#8220;other&amp;#8221; test technique, because &lt;em&gt;it&amp;#8217;s not a technique at all&lt;/em&gt;. Exploratory testing is not &lt;em&gt;a thing that you do&lt;/em&gt;, but rather &lt;em&gt;a way that you work&lt;/em&gt; (and think, and act), the hallmarks being who (or what) is in control, and the extent to which your activity is part of a loop, rather than a straight line.  Any test technique can be applied in a scripted way or in an exploratory way.  To those who say &amp;#8220;we do exploratory testing after our acceptance tests are all running green&amp;#8221;, I would suggest looking carefully and observing the extent to which you&amp;#8217;re doing exploratory testing all the way along.&lt;/p&gt;</content>
		<author>
			<name>Michael</name>
			<uri>http://www.developsense.com/blog</uri>
		</author>
		<source>
			<title type="html">Developsense Blog</title>
			<subtitle type="html">DevelopSense Blog</subtitle>
			<link rel="self" href="http://www.developsense.com/blog/feed/atom/"/>
			<id>http://www.developsense.com/blog/feed/atom/</id>
			<updated>2012-02-08T20:48:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Worthwhile Documentation</title>
		<link href="http://www.developsense.com/blog/2011/12/worthwhile-documentation/"/>
		<id>http://www.developsense.com/blog/?p=1091</id>
		<updated>2011-12-20T03:10:05+00:00</updated>
		<content type="html">&lt;p&gt;In the &lt;a href=&quot;http://www.developsense.com/courses.html&quot;&gt;Rapid Software Testing class&lt;/a&gt;, we focus on ways of doing the fastest, least expensive testing that still completely fulfills the mission.  That involves doing some things more quickly, and it also involves doing other things less, or less wastefully.  One of the prime candidates for radical waste reduction is documentation that&amp;#8217;s incongruent with the testing mission.&lt;/p&gt;
&lt;p&gt;Medical device projects typically present a high degree of risk.  Excellent testing helps teams and product owners to identify risks and problems in the product. The quality of testing is a function of the skill of the tester; one would not set loose an incapable tester on high-risk project.  Yet some managers have told me that they commission people to write test documentation in a particular style.  That style is, to me, overly elaborate and specific with respect to actions to perform and observations to make.  Yet at the same time, that style is remarkably devoid of ideas about motivation or risk.&lt;/p&gt;
&lt;p&gt;I sometimes ask managers why they use this style of instruction.  They usually answer, &amp;#8220;because we want anyone to be able to walk up to this system and test it.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Anyone?&amp;#8221; I ask.  &amp;#8220;Why anyone?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;You know how it is.  If we have to test a new revision of this program a year from now, there&amp;#8217;s a good chance that we won&amp;#8217;t have the same testers.&amp;#8221;  &lt;em&gt;(Dude. If you&amp;#8217;re inflicting on your staff the idea of testing as writing or following instructions for an automaton, I might have an explanation for you.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;#8220;Anyone?&lt;/em&gt;&amp;#8221; I ask.  &amp;#8220;How about a cat?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Well, Michael, that&amp;#8217;s silly.  Cats can&amp;#8217;t think.  Cats can&amp;#8217;t read.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;How about my daughter?  She&amp;#8217;s seven, and she can read well enough to read &lt;em&gt;that&lt;/em&gt;.  And she could follow the steps pretty well, too.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;We don&amp;#8217;t hire children here!&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Okay,&amp;#8221; I offer.  &amp;#8220;Would you hire a completely incompetent tester who needed to be told absolutely everything, in painful detail?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;We wouldn&amp;#8217;t hire anyone like that.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Fair enough, and I&amp;#8217;d hope not.  &lt;em&gt;So, why do you insist that people write instructions for them that way?&lt;/em&gt;&amp;#8221;&lt;/p&gt;
&lt;p&gt;Let me be clear: when the situation calls for skilled testers, you don&amp;#8217;t need overly specific instructions for them.  On the other hand, if you don&amp;#8217;t have skilled testers, you&amp;#8217;ve got &lt;a href=&quot;http://www.satisfice.com/blog/archives/672&quot; title=&quot;Why Scripted Testing is Not for Novices&quot; target=&quot;_blank&quot;&gt;a problem that scripted testing won&amp;#8217;t be able to solve&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a splendid example of a machete that we believe that managers could use to cut through jungles of waste. In a recent project that involved work with FDA-regulated medical devices, James Bach found a huge number of excruciatingly overspecified, low-value test cases aimed at &amp;#8220;anyone&amp;#8221;.  The following two paragraphs replaced 50 pages of waste.&lt;/p&gt;
&lt;h2&gt;3.0 Test Procedures&lt;/h2&gt;
&lt;h3&gt;3.1 General Testing Protocol&lt;/h3&gt;
&lt;p class=&quot;citation&quot;&gt;In the test descriptions that follow, the word &amp;#8220;verify&amp;#8221; is used to highlight specific items that must be checked.  In addition to those items, the tester shall at all times be alert for any unexplained or erroneous behaviour of the product.  The tester shall bear in mind that, regardless of any specific requirement for any specific test, there is the overarching general requirement that the product shall not pose an unacceptable risk of harm to the patient, including an unacceptable risk due to reasonably foreseeable misuse.&lt;/p&gt;
&lt;p class=&quot;citation&quot;&gt;Test personnel requirements:  The tester shall be thoroughly familiar with the Generator and Workstation Function Requirement Specifications, as well as the working principles of the devices themselves.  The tester shall also know the workings of the power test jig and associated software, including how to configure and calibrate it and how to recognize it is not working correctly.  The tester shall have sufficient skill in data analysis and measurement theory to make sense of statistical test results.  The tester shall be sufficiently familiar with test design to complement this protocol with exploratory testing in the event that anomalies appear that require investigation.  The tester shall know how to keep test records to a credible professional standard.&lt;/p&gt;
&lt;p&gt;To me, &lt;em&gt;that&amp;#8217;s&lt;/em&gt; something worth writing down. Follow &lt;em&gt;those&lt;/em&gt; instructions, and your team will save time, save work, and put the emphasis in the right places:  on risk, and on meeting and mitigating that risk with &lt;em&gt;skills&lt;/em&gt;.&lt;/p&gt;</content>
		<author>
			<name>Michael</name>
			<uri>http://www.developsense.com/blog</uri>
		</author>
		<source>
			<title type="html">Developsense Blog</title>
			<subtitle type="html">DevelopSense Blog</subtitle>
			<link rel="self" href="http://www.developsense.com/blog/feed/atom/"/>
			<id>http://www.developsense.com/blog/feed/atom/</id>
			<updated>2012-02-08T20:48:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">What Exploratory Testing Is Not (Part 4):  Quick Tests</title>
		<link href="http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-4-quick-tests/"/>
		<id>http://www.developsense.com/blog/?p=1087</id>
		<updated>2011-12-19T15:46:44+00:00</updated>
		<content type="html">&lt;p&gt;Quick testing is another approach to testing that can be done in a scripted way or an exploratory way.  A tester using a highly exploratory approach is likely to perform many quick tests, and quick tests are often key elements in an exploratory approach.  Nonetheless, quick testing and exploratory testing aren&amp;#8217;t the same.&lt;/p&gt;
&lt;p&gt;Quick tests are inexpensive tests that require little time or effort to prepare or perform. They may not even require a great deal of knowledge about the application being tested or its business domain, but they can help to develop new knowledge rapidly. Rather than emphasizing comprehensiveness or integrity, quick tests are designed to reveal information in a hurry at a minimal cost.&lt;/p&gt;
&lt;p&gt;A quick test can be a great way to learn about the product, or to identify areas of risk, fragility, or confusion. A tester can almost always sneak a quick test or two into other testing activity. A burst of quick tests can help as the first activities during a &lt;a href=&quot;http://www.developsense.com/blog/2011/11/smoke-testing-vs-sanity-testing/&quot; title=&quot;Smoke Testing and Sanity Testing&quot; target=&quot;_blank&quot;&gt;smoke or sanity test&lt;/a&gt;. Cycles of relatively unplanned, informal quick tests may help to you discover or refine a more comprehensive or formal plan.&lt;/p&gt;
&lt;p&gt;James Bach and I provide examples of many kinds of quick tests in the Rapid Software Testing class.  You&amp;#8217;ll notice that some of them are called tours. Note that not all tours are quick, and not all quick tests are tours.  Here&amp;#8217;s a  catalog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Happy Path&lt;/strong&gt;&lt;br /&gt;
Perform a task, from start to finish, that an end-user might be expected to do. Use the product in the most simple, expected, straightforward way, just as the most optimistic programmer or designer might imagine users to behave.  Look for anything that might confuse, delay, or irritate a reasonable person. Cem Kaner sometimes calls this &amp;#8220;sympathetic testing&amp;#8221;.  Lean towards learning about the product, rather than finding bugs. If you do see obvious problems, it may be bad news for the product.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Variable Tour&lt;/strong&gt;&lt;br /&gt;
Tour a product looking for anything that is variable and vary it. Vary it as far as possible, in every dimension possible.  If you&amp;#8217;re using quick tests for learning, seek and catalog the important variables.  Look for potential relationships between them. Identifying and exploring variations is part of the basic structure of our testing when we first encounter a product.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sample Data Tour&lt;/strong&gt;&lt;br /&gt;
Employ any sample data you can, and all that you can.  For one kind of quick tests, prefer simple values whose effects are easy to see or calculate. For a different kind of quick test, choose complex or extreme data sets. Observe the units or formats in which data can be entered, and try changing them. Challenge the assumption that the programmers have thought to reject or massage inappropriate data.  Once you&amp;#8217;ve got a handle on your ideas about reasonable or mildly challenging data, you might choose to try&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input Constraint Attack&lt;/strong&gt;&lt;br /&gt;
Discover sources of input and attempt to violate constraints on that input. Try some samples of pathological data:  use zeroes where large numbers are expected; use negative numbers where positive numbers are expected; use huge numbers where modestly-sized ones are expected; use letters in every place that’s supposed to handle only numbers, and vice versa. Use a geometrically expanding string in a field. Keep doubling its length until the product crashes.  Use characters that are in some way distinct from your idea of &amp;#8220;normal&amp;#8221; or &amp;#8220;expected&amp;#8221;.  Inject noise of any kind into a system and see what happens.  Use &lt;a href=&quot;http://www.satisfice.com&quot; target=&quot;_blank&quot;&gt;Satisfice&lt;/a&gt;’s PerlClip utility to create strings of arbitrary length and content; use PerlClip’s counterstring feature to create a string that tells you its own length so that you can see where an application cuts off input.&lt;/p&gt;
&lt;p&gt;People tend to talk a lot about input constraint attacks. Perhaps that&amp;#8217;s because input constraint attacks are used by hackers to compromise systems; perhaps it&amp;#8217;s because input constraint attacks can be performed relatively straightforwardly; perhaps it&amp;#8217;s because they can be described relatively easily; perhaps it&amp;#8217;s because input constraint attacks can produce dramatic and highly unexpected results.  Yet they&amp;#8217;re by no means the only kind of quick test, and they&amp;#8217;re certainly not the only way to test using an exploratory approach.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Documentation Tour&lt;/strong&gt;&lt;br /&gt;
Look in the online help or user manual and find some instructions about how to perform some interesting activity. Do those actions explicitly. Then improvise from them and experiment.  If your product has a tutorial, follow it. You may expose a problem in the product or in the documentation; either way, you’ve found an inconsistency that is potentially important. Even if you don’t expose a problem, you’ll still be learning about the product.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;File Tour&lt;/strong&gt;&lt;br /&gt;
Have a look at the folder where the program&amp;#8217;s .EXE file is found.  Check out the directory structure, including subs.  Look for READMEs, help files, log files, installation scripts, .cfg, .ini, .rc files.&lt;br /&gt;
Look at the names of .DLLs, and extrapolate on the functions that they might contain or the ways in which their absence might undermine the application.  Use whatever supplemental material you&amp;#8217;ve got to guide or focus your actions. Another way to gather information for this kind of test: use tools to monitor the installation, and take the output from the tool as a point of departure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Complexity Tour&lt;/strong&gt;&lt;br /&gt;
Tour a product looking for the most complex features, the most challenging data sets, and the biggest interdepencies. Look for hidden nooks and crannies, but also look for the program&amp;#8217;s high-traffic areas, busy markets, big office buildings, and train stations&amp;mdash;places where there&amp;#8217;s lots of interactions, and where bugs might be blending in with the crowd.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Menu, Window, and Dialog Tour&lt;/strong&gt;&lt;br /&gt;
Tour a product looking for all the menus (main and context menus), menu items, windows, toolbars, icons, and other controls.  Walk through them.  Try them.  Catalog them, or construct a mind map.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keyboard and Mouse Tour&lt;/strong&gt;&lt;br /&gt;
Tour a product looking for all the things you can do with a keyboard and mouse. Hit all of the keys on the keyboard. Hit all the F-keys; hit Enter, Tab, Escape, Backspace; run through the alphabet in order, and combine each key with Shift, Ctrl, Alt, the Windows key, CMD or Option, on other platforms, the AltGr key in Europe.  Click (right, left, both, double, triple) on everything.  Combine clicks with shifted keys.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interruptions&lt;/strong&gt;&lt;br /&gt;
Start activities and stop them in the middle. Stop them at awkward times. Perform stoppages using cancel buttons, O/S level interrupts (ctrl-alt-delete or task manager). Arrange for other programs to interrupt (such as screensavers or virus checkers).  Also, try suspending an activity and returning later. Put your laptop into sleep or hibernation mode.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Undermining&lt;/strong&gt;&lt;br /&gt;
Start using a function when the system is in an appropriate state, then change the state part way through.&lt;br /&gt;
Delete a file while it is being edited; eject a disk; pull net cables or power cords) to get the machine an inappropriate state. This is similar to interruption, except you are expecting the function to interrupt &lt;i&gt;itself&lt;/i&gt; by detecting that it no longer can proceed safely. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adjustments&lt;/strong&gt;&lt;br /&gt;
Set some parameter to a certain value, then, at any later time, reset that value to something else without resetting or recreating the containing document or data structure. Programmers often expect settings or variables to be adjusted through the GUI.  Hackers and tinkerers expect to find other ways.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dog Piling&lt;/strong&gt;&lt;br /&gt;
Whatever you&amp;#8217;re doing, do more of it and do other stuff as well while you&amp;#8217;re at it. Get more processes going at once; try to establish more states existing concurrently. Invoke nested dialog boxes and non-modal dialogs. On multi-user systems, get more people using the system or simulate that with tools. If your test seems to trigger odd behaviour, pile on in the same place until the odd becomes crazy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Continuous Use&lt;/strong&gt;&lt;br /&gt;
While testing, do not reset the system.  Leave windows and files open; let disk and memory usage mount.&lt;br /&gt;
You&amp;#8217;re hoping to show that the system loses track of things or ties itself in knots over time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Feature Interactions&lt;/strong&gt;&lt;br /&gt;
Discover where individual functions interact or share data.  Look for any interdependencies. Explore them, exploit them, and stress them out. Look for places where the program repeats itself or allows you to do the same thing in different places. For example, for data to be displayed in different ways and in different places, and seek inconsistencies.  For example, load up all the fields in a form to their maximums and then traverse to the report generator.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summon Help&lt;/strong&gt;&lt;br /&gt;
Bring up the context-sensitive help feature during some operation or activity.  Does the product’s help file explain things in a useful way, or does it offend the user’s intelligence by simply restating what’s already on the screen?  Is help even available at all?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Click Frenzy&lt;/strong&gt;&lt;br /&gt;
Ever notice how a cat or a kid can crash a system with ease? Testing is more than &amp;#8220;banging on the keyboard&amp;#8221;, but that phrase wasn&amp;#8217;t coined for nothing. Try banging on the keyboard. Try clicking everywhere.  Poke every square centimeter of every screen until you find a secret button.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shoe Test&lt;/strong&gt;&lt;br /&gt;
Use auto-repeat on the keyboard for a very cheap stress test.  Look for dialog boxes constructed such that pressing a key leads to, say, another dialog box (perhaps an error message) that also has a button connected to the same key that returns to the first dialog box. Place a shoe on the keyboard and walk away.  Let the test run for an hour.  If there’s a resource or memory leak, this kind of test could expose it. Note that some lightweight automation can provide you with a virtual shoe.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blink Test&lt;/strong&gt;&lt;br /&gt;
Find an aspect of the product that produces huge amounts of data or does some operation very quickly.  Look through a long log file or browse database records, deliberately scrolling too quickly to see in detail. Notice trends in line lengths, or the look or shape of the data.  Use Excel’s conditional formatting feature to highlight interesting distinctions between cells of data.  Soften your focus. If you have a test lab with banks of monitors, scan them or stroll by them; patterns of misbehaviour can be surprisingly prominent and easy to spot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Error Message Hangover&lt;/strong&gt;&lt;br /&gt;
Programmers are rewarded for implementing features.  There&amp;#8217;s a psychological problem with errors or exceptions:  the label itself suggests that something has gone wrong.  People often actively avoid thinking about problems or mistakes, and as a consequence, programmers sometimes handle errors poorly. Make error messages happen and test hard after they are dismissed. Watch for subtle changes in behaviour between error and normal paths. With automation, make the same error conditions appear thousands of times.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Resource Starvation&lt;/strong&gt;&lt;br /&gt;
Progressively lower memory, disk space, display resolution, and other resources.  Keep starving the product until it collapses, or gracefully (we hope) degrades. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multiple Instances&lt;/strong&gt;&lt;br /&gt;
Run a lot of instances of the app at the same time.  Open, use, update, and save the same files.  Manipulate them from different windows.  Watch for competition for resources and settings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Crazy Configs&lt;/strong&gt;&lt;br /&gt;
Modify the operating system’s configuration in non-standard or non-default ways, either before or after installing the product. Turn on &amp;#8220;high contrast&amp;#8221; accessibility mode, or change the localization defaults. Change the letter of the system hard drive. Put things in non-default directories. Use RegEdit (for registry entries) or a text editor (for initialization files) to corrupt your program&amp;#8217;s settings in a way that should trigger an error message, recovery, or an appropriate default behavior.&lt;/p&gt;
&lt;p&gt;Again: quick tests tend to be highly exploratory, but they represent only one kind of exploratory testing.  Don&amp;#8217;t be fooled into believing that quick testing&amp;mdash;or certain kinds of quick testing&amp;mdash;is all there is to exploratory testing.&lt;/p&gt;</content>
		<author>
			<name>Michael</name>
			<uri>http://www.developsense.com/blog</uri>
		</author>
		<source>
			<title type="html">Developsense Blog</title>
			<subtitle type="html">DevelopSense Blog</subtitle>
			<link rel="self" href="http://www.developsense.com/blog/feed/atom/"/>
			<id>http://www.developsense.com/blog/feed/atom/</id>
			<updated>2012-02-08T20:48:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">TDD Workflow (Sinatra / Haml / jQuery) Part 1</title>
		<link href="http://www.exampler.com/blog/2011/12/17/tdd-workflow-sinatra-haml-jquery-part-1/"/>
		<id>http://www.exampler.com/blog/2011/12/17/tdd-workflow-sinatra-haml-jquery-part-1/</id>
		<updated>2011-12-17T23:08:25+00:00</updated>
		<content type="html">&lt;p&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;This is a draft. Worth continuing the series? &lt;a href=&quot;mailto:marick@exampler.com&quot;&gt;Let me know.&lt;/a&gt; &lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Critter4Us is a webapp used to schedule teaching animals at the University of Illinois Vet School. Its original version was a Ruby/&lt;a href=&quot;http://www.sinatrarb.com/&quot;&gt;Sinatra&lt;/a&gt; application with a &lt;a href=&quot;http://cappuccino.org/&quot;&gt;Cappuccino&lt;/a&gt; front end. Cappuccino lets you write desktop-like webapps using a framework modeled after Apple&amp;#8217;s &lt;a href=&quot;http://developer.apple.com/technologies/mac/cocoa.html&quot;&gt;Cocoa&lt;/a&gt;. I chose it for two reasons: it made it easy to test front-end code headlessly (which was harder back then than it is now), and it let me reuse my &lt;a href=&quot;http://pragprog.com/book/bmrc/programming-cocoa-with-ruby&quot;&gt;RubyCocoa experience&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Earlier this year, I decided it was time for another bout of experimentation. I decided to switch from Cappuccino to jQuery, &lt;a href=&quot;http://jashkenas.github.com/coffee-script/&quot;&gt;Coffeescript&lt;/a&gt;, &lt;a href=&quot;http://haml-lang.com/&quot;&gt;Haml&lt;/a&gt; because I thought they were technologies I should know and because they&amp;#8217;d force me to develop a new TDD workflow. I&amp;#8217;d never gotten comfortable with the testing&amp;#8212;or for that matter, any of the design&amp;#8212;of &amp;#8220;traditional&amp;#8221; front-end webapp code and the parts of the backend from the controller layer up. &lt;/p&gt;
&lt;p&gt;I now think I&amp;#8217;ve reached a plateau at which I&amp;#8217;m temporarily comfortable, so this is a good time to report. Other people might find the approach and the tooling useful. And other people might explain places where my inexperience has led me astray.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;The example&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Suppose an instructor wants to reserve the horses Genesis and Guicho each Tuesday morning from October 8 through the 29th. For historical reasons, that&amp;#8217;s done by making a reservation for the 8th and then making three copies. Here&amp;#8217;s what that page looks like today:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.exampler.com/images/reservation.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;(As you can see, I haven&amp;#8217;t gotten to making the UI attractive yet.)&lt;/p&gt;
&lt;p&gt;After the stop date is chosen, a click of the &amp;#8220;Duplicate&amp;#8221; button causes three successive Ajax calls to be sent to the server. (That&amp;#8217;s a bit gratuitous - I just like the idea of the UI showing each reservation &amp;#8220;coming to life&amp;#8221; in turn.)&lt;/p&gt;
&lt;p&gt;Ideally, Genesis and Guicho will be reserved for each Tuesday. However, it&amp;#8217;s possible that one of them has already been reserved for the 22nd. In that case, the reservation is still made, but the animal is dropped from it. The user has to edit that reservation to pick a replacement animal. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Testing the Haml&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I usually test in an outside-in, mock-heavy style derived from &lt;i&gt;&lt;a href=&quot;http://www.growing-object-oriented-software.com/&quot;&gt;Growing Object-Oriented Software&lt;/a&gt;&lt;/i&gt; (GOOS). &amp;#8220;Derived&amp;#8221;, naturally, means I depart from GOOS in my very first step: I &lt;a href=&quot;http://www.exampler.com/blog/2010/01/08/some-preliminary-thoughts-on-end-to-end-testing-in-growing-object-oriented-software/&quot;&gt;avoid automating end-to-end tests&lt;/a&gt;. For my small-scale purposes, I don&amp;#8217;t find GUI tests (&lt;a href=&quot;http://watir.com/&quot;&gt;Watir&lt;/a&gt;, &lt;a href=&quot;http://seleniumhq.org/&quot;&gt;Selenium&lt;/a&gt;, etc.) worth the price. To be clear: I &lt;i&gt;think about&lt;/i&gt; GOOS-style tests, and I &lt;i&gt;execute them&lt;/i&gt;&amp;#8212;I &lt;a href=&quot;http://www.exampler.com/blog/2008/12/12/interview-alternatives-to-automated-acceptance-test-driven-design/&quot;&gt;just don&amp;#8217;t &lt;i&gt;automate&lt;/i&gt; them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Having thought of an end-to-end test for a particular user task, the next step is to sketch out a page that supports it. I sketch it out in Haml to be the beginnings of the page above.&lt;/p&gt;
&lt;p&gt;My page testing is driven by this observation: the user will use the same page for many different reservations. It has a constant part that&amp;#8217;s independent of the reservation, and a part that depends on the particular reservation. I only write automated tests for the variable part. I test the constant part by looking at it, by looking at the generated HTML, and by trying the finished story by hand. &lt;/p&gt;
&lt;p&gt;There are three parts of this particular page that vary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
There&amp;#8217;s a snippet of text that reminds the user what reservation she&amp;#8217;s working with.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
There has to be a starting date used to set up the calendar.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
There has to be some URI that&amp;#8217;s used to &lt;code&gt;PUT&lt;/code&gt; a new repetition into the system. That URI will look something like &lt;code&gt;/reservations/441/repetitions&lt;/code&gt;.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;#8217;s the setup for tests to check those three claims:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
Whenever I create a model object, I usually give it a &lt;code&gt;random&lt;/code&gt; constructor that builds it with innocuous values unless I give it explicit ones. I&amp;#8217;ll explain why I&amp;#8217;m giving it only one value below.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
I &lt;i&gt;hate&lt;/i&gt; the &lt;a href=&quot;http://www.popsci.com/scitech/article/2009-06/quantum-entaglement&quot;&gt;spooky action at a distance&lt;/a&gt; of setting instance variables in a controller in order to have some effect way off in another file written in a different language. I&amp;#8217;d much rather have a nice explicit function-call interface and a &lt;a href=&quot;http://erector.rubyforge.org/userguide.html&quot;&gt;builder&lt;/a&gt; or &lt;a href=&quot;https://github.com/cgrand/enlive&quot;&gt;transformation&lt;/a&gt; approach. Most of the world thinks differently, so I concede. However, I do try to come closer to a function-call interface by passing in locals instead of setting instance variables.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Passing in a whole &lt;code&gt;Reservation&lt;/code&gt; model object makes me queasy for reasons &lt;a href=&quot;http://blog.8thlight.com/uncle-bob/2011/11/22/Clean-Architecture.html&quot;&gt;Bob Martin has explained&lt;/a&gt;.  I&amp;#8217;m intruding the model into the view rather than passing in just what the view needs. This is a consequence of some amount of laziness after bowing to the peer pressure to use partials. I do make &lt;i&gt;some&lt;/i&gt; effort to separate presentation-relevant data from model-relevant objects, as you&amp;#8217;ll see later.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
In order &lt;a href=&quot;http://en.wikipedia.org/wiki/Don't_repeat_yourself&quot;&gt;not to repeat myself&lt;/a&gt;, I make one Ruby file the authority over all URIs and links. Therefore, any URI gets passed into the HAML. In pages like these, which exist to aid some specific user task and have a single URI that they use when the appropriate data has been supplied by the user, I call that single URI the &amp;#8220;fulfillment&amp;#8221; link.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That given, here&amp;#8217;s the test in which I claim that a reservation summary appears on the page:&lt;/p&gt;

&lt;p&gt;I use &lt;a href=&quot;https://github.com/thoughtbot/shoulda&quot;&gt;shoulda&lt;/a&gt; because I like nested contexts and strings to name tests, but I don&amp;#8217;t need the rest of Rspec. I use &lt;a href=&quot;http://assert2.rubyforge.org/&quot;&gt;Assert{2.0}&lt;/a&gt; because I find Hamcrest-style matchers too wordy and Assert{2.0} gives me usefully detailed failure messages. (It prints every subexpression of a false expression. &lt;a href=&quot;https://github.com/sconover/wrong&quot;&gt;Wrong&lt;/a&gt; is a more recent implementation of this idea.)&lt;/p&gt;
&lt;p&gt;The actual reservation summary is created with a partial. By checking for &amp;#8216;Dr. Dawn&amp;#8217;, this test claims the partial has been &amp;#8220;called&amp;#8221;. (It&amp;#8217;s thus a clumsier and less explicit example of a mockish test.) I&amp;#8217;m testing only that here because I want the freedom to what the summary looks like without having to change this test.&lt;/p&gt;
&lt;p&gt;The next test claims that a correct Javascript date exists in the HTML (presumably in some Javascript code):&lt;/p&gt;

&lt;p&gt;Notice that the check is, again, minimalist. The test isn&amp;#8217;t about how the date is used, just that it exists. Peeking ahead, it&amp;#8217;s actually used like this:&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s a gap in the test coverage, in that no automated test checks that this initialization code is correct. Pretty low risk, given that it&amp;#8217;s straight-line code that cannot avoid execution whenever the page is loaded. So long as I try this page out once, and remember to try the page again if I change the initialization code, I should be safe.&lt;/p&gt;
&lt;p&gt;The final test is this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;assert_text_has_attributes&lt;/code&gt; is part of a thin wrapper on top of the HTML parsing part of &lt;a href=&quot;https://github.com/jnicklas/capybara&quot;&gt;Capybara&lt;/a&gt; (&lt;i&gt;not&lt;/i&gt; the integration testing part). I used to use &lt;a href=&quot;http://assert2.rubyforge.org/assert2_xpath.html&quot;&gt;assert_xhtml&lt;/a&gt;, a sweet package, but it&amp;#8217;s dead in Ruby 1.9 and I haven&amp;#8217;t found another one like it. &lt;a href=&quot;mailto:marick@exampler.com&quot;&gt;Let me know&lt;/a&gt; if you have one.&lt;/p&gt;
&lt;p&gt;The Haml code that passes these tests looks like this:&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; is, annoyingly, generated by another action at a distance, with a &lt;code&gt;layout.haml&lt;/code&gt; file that gets wrapped around the above code. That file uses the third of the &amp;#8220;parameters&amp;#8221;:&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What now?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The static page and the acceptance test I have in mind call for some Javascript. That needs to be tested into existence.&lt;/p&gt;</content>
		<author>
			<name>Brian Marick</name>
			<uri>http://www.exampler.com/blog</uri>
		</author>
		<source>
			<title type="html">Exploration Through Example</title>
			<subtitle type="html">Example-driven development, Agile software development, testing, Ruby, and other things of interest to Brian Marick</subtitle>
			<link rel="self" href="http://www.exampler.com/blog/feed/"/>
			<id>http://www.exampler.com/blog/feed/</id>
			<updated>2012-02-05T20:47:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">What Exploratory Testing Is Not (Part 3):  Tool-Free Testing</title>
		<link href="http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-3-tool-free-testing/"/>
		<id>http://www.developsense.com/blog/?p=1082</id>
		<updated>2011-12-17T20:29:08+00:00</updated>
		<content type="html">&lt;p&gt;People often make a distinction between &amp;#8220;automated&amp;#8221; and &amp;#8220;exploratory&amp;#8221; testing. This is like the distinction between &amp;#8220;red&amp;#8221; cars and &amp;#8220;family&amp;#8221; cars.  That is, &amp;#8220;red&amp;#8221; (colour) and &amp;#8220;family&amp;#8221; (some notion of purpose) are in orthogonal categories.  A car can be one colour or another irrespective of its purpose, and a car can be used for a particular purpose irrespective of its colour.  Testing, whether exploratory or not, can make heavy or light use of tools.  Testing, whether it entails the use of tools or not, can be highly scripted or highly exploratory.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Exploratory&amp;#8221; testing is not &amp;#8220;manual&amp;#8221; testing.  &amp;#8220;Manual&amp;#8221; isn&amp;#8217;t a useful word for describing software testing in any case.  When you&amp;#8217;re testing, it&amp;#8217;s not the hands that do the testing, any more than when you&amp;#8217;re riding a bike it&amp;#8217;s the feet that do the bike-riding.  The &lt;i&gt;brain&lt;/i&gt; does the testing; the hands, at best, provide one means of input and interaction with the thing we&amp;#8217;re testing.  And not even &amp;#8220;manual&amp;#8221; testing is manual in the sense of being tool- or machinery-free.  You do you use a computer when you&amp;#8217;re testing, don&amp;#8217;t you?  &lt;/p&gt;
&lt;p&gt;(Well, mostly, but not always. If you&amp;#8217;re reviewing requirements, specifications, code, or documentation, you might be looking at paper, but you&amp;#8217;re still testing.  A thought experiment or a conversation about a product is a kind of a test; you&amp;#8217;re questioning something in order to evaluate it, pitting ideas against other ideas in an unscripted way.  While you&amp;#8217;re reviewing, are you using a pen to annotate the paper you&amp;#8217;re reading?  A notepad to record your observations?  Sticky tabs to mark important places in the text?  Then you&amp;#8217;re using tools, low-tech as they might be.)&lt;/p&gt;
&lt;p&gt;Some people think of test automation in terms of a robot that pounds on virtual keys more quickly, more reliably, and more deterministically than a human could.  That&amp;#8217;s certainly one potential notion of test automation, but it&amp;#8217;s very limiting.  That traditional view of test automation focuses on performing &lt;a href=&quot;http://www.developsense.com/blog/2009/09/transpection-and-three-elements-of/&quot; title=&quot;Transpection and the Three Elements of Checking&quot; target=&quot;_blank&quot;&gt;checks&lt;/a&gt;, but that&amp;#8217;s not the only way in which automation can help testing.&lt;/p&gt;
&lt;p&gt;In the Rapid Software Testing class, &lt;a href=&quot;http://www.satisfice.com&quot;&gt;James Bach&lt;/a&gt; and I suggest a more expansive view of test automation:  &lt;i&gt;any use of tools to support testing&lt;/i&gt;.  This helps keeps us open to the idea that machines can help us with almost any of the &lt;a href=&quot;http://www.developsense.com/blog/2011/12/shapes-of-actions/&quot;&gt;mimeomorphic&lt;/a&gt;, non-&lt;a href=&quot;http://www.satisfice.com/blog/archives/99&quot;&gt;sapient&lt;/a&gt; aspects of testing, so that we can focus on and add power to the &lt;a href=&quot;http://www.developsense.com/blog/2011/12/shapes-of-actions/&quot;&gt;polimorphic&lt;/a&gt;, &lt;a href=&quot;http://www.satisfice.com/blog/archives/99&quot;&gt;sapient&lt;/a&gt; aspects.  Exploration is polimorphic activity, but it can include and be supported by mimeomorphic actions.  Cem Kaner and Doug Hoffman take a similar tack: &lt;a href=&quot;http://kaner.com/wp-content/uploads/2010/08/ExploratoryTestAutomationHoffman.pdf&quot;&gt;exploratory test automation&lt;/a&gt; is &amp;#8220;computer-assisted testing that supports learning of new information about the quality of the software under test.&amp;#8221;  Learning new information is one of the hallmarks of exploratory testing, which usually points towards emphasizing variation rather than repetition.&lt;/p&gt;
&lt;p&gt;That said, there can be a role for mechanized repetition, even when you&amp;#8217;re using a highly exploratory approach:  when repeating aspects of the test are intended to support discovery of something new or surprising.  The key is not whether you&amp;#8217;re mechanizing the activity.  The key is what happens at the end of the activity.  The less the results of one activity are permitted to inform the next, the more scripted the approach.  If the repetition is part of a learning loop&amp;mdash;a cycle of probing, discovering, investigating, and interpreting&amp;mdash;that feeds back on itself immediately, then the approach is exploratory. James has also posted a number of motivations for &lt;a href=&quot;http://www.satisfice.com/repeatable.shtml&quot;&gt;repeating tests&lt;/a&gt;.  Each one can (with the possible exception of &amp;#8220;avoidance or indifference&amp;#8221;) be entirely consistent with and supportive of exploration.&lt;/p&gt;
&lt;p&gt;There are some actions that tools can perform better than humans, as long as the action doesn&amp;#8217;t require human judgment or wisdom.  Humanity can even get in the way of some desirable outcome.  For example, when your exploration of some aspect of a product is based on statistical analysis, and randomization is part of the test design, it&amp;#8217;s important to remember that people are downright lousy at generating randomized data.   Even when people believe that they&amp;#8217;re choosing numbers at random, there are underlying (and usually quite unconscious) patterns and biases that inform their choices.  If you want random numbers, tools can help.&lt;/p&gt;
&lt;p&gt;Tools can support exploration in plenty of other ways:  data generation, system configuration; simulation; logging and video capture; probes that examine the internal state of the system; oracles that detect certain kinds of error conditions in a product or generate plausible results for comparison; visualization of data sets, key elements to observe, relationships, or timing; recording and reporting of test activity.&lt;/p&gt;
&lt;p&gt;A few years back, I was doing testing of a teller workstation application at a bank (I&amp;#8217;ve written about this in &lt;a href=&quot;http://www.amazon.com/How-Reduce-Cost-Software-Testing/dp/1439861552&quot; title=&quot;How To Reduce the Cost of Software Testing&quot; target=&quot;_blank&quot;&gt;How to Reduce the Cost of Software Testing&lt;/a&gt;).  The other testers, working on domestic transactions, were working from scripts that contained painfully detailed and explicit steps and observations. (Part of the pain came from the fact that the scripts were supplemented with screen shots, and the text and the images didn&amp;#8217;t always agree.)  My testing assignment involved foreign exchange, and the testing tasks I had been given were unscripted and, to a large degree, self-determined.  In order to learn the application quickly, I had to explore, but this in no way meant that I didn&amp;#8217;t use tools.  On the contrary, in fact.  In that context, Excel was the most readily available and powerful tool on hand.  I used it (and its embedded Visual Basic for Applications) to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;maintain and update (at a key stroke) enormous tables of currencies, rates, and transaction types&lt;/li&gt;
&lt;li&gt;access appropriate entries from the table via regular expression parsing&lt;/li&gt;
&lt;li&gt;model the business rules of the application under test&lt;/li&gt;
&lt;li&gt;display the intended flow of money through a transaction&lt;/li&gt;
&lt;li&gt;add visual emphasis to the salient outcomes of tests and test scenarios&lt;/li&gt;
&lt;li&gt;provide, using a comparable algorithm, clear results to which the product&amp;#8217;s results could be compared&lt;/li&gt;
&lt;li&gt;help in performing extremely rapid evaluation of a test idea&lt;/li&gt;
&lt;li&gt;create tables of customer data so that I could perform a test using a variety of personas&lt;/li&gt;
&lt;li&gt;accelerate my understanding of the product and the test space&lt;/li&gt;
&lt;li&gt;enhance my learning about Boolean algebra and how it could be used in algorithms&lt;/li&gt;
&lt;li&gt;record my work and illustrate outcomes for my clients&lt;/li&gt;
&lt;li&gt;perform quick calculations when necessary&lt;/li&gt;
&lt;li&gt;help me find more actual problems than the other four testers combined&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this activity happened in a highly exploratory way; each of the activities interacted with the others.  I used very rapid cycles of looking at what I needed to learn next about the application, experimenting with and performing tests, programming, asking questions of subject matter experts and programmers and managers, reporting, reading reference documentation, debugging, and learning.  Tight loops of activities happening in parallel are what characterize exploratory processes.  Yet this was not tool-free work; tools were absolutely central to my exploration of the product, to my learning about it, and to the mission of finding bugs.  Indeed, without the tools, I would have had much more limited ideas about what could be tested, and how it could be tested.&lt;/p&gt;
&lt;p&gt;The explorers of old used tools: compasses and astrolabes, maps and charts, ropes and pulleys, ships and wagons.  These days, software testers explore applications by using mind-mapping software and text editors; spreadsheets and calculators; data generation tools and search engines; scripting tools and automation frameworks.  The concept that characterizes exploratory testing is not the input mechanism, which can be fingers on a keyboard, tables of data pumped into the program via API calls, bits delivered through the network, signals from a variable voltage controller.  Exploratory testing is about the way you work, and the extent to which test design, test execution, and learning support and reinforce each other.  Tools are often a critical part of that process.&lt;/p&gt;</content>
		<author>
			<name>Michael</name>
			<uri>http://www.developsense.com/blog</uri>
		</author>
		<source>
			<title type="html">Developsense Blog</title>
			<subtitle type="html">DevelopSense Blog</subtitle>
			<link rel="self" href="http://www.developsense.com/blog/feed/atom/"/>
			<id>http://www.developsense.com/blog/feed/atom/</id>
			<updated>2012-02-08T20:48:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">What Exploratory Testing Is Not (Part 1):  Touring</title>
		<link href="http://www.developsense.com/blog/2011/12/what-exploratory-testing-is-not-part-1-touring/"/>
		<id>http://www.developsense.com/blog/?p=1072</id>
		<updated>2011-12-16T19:23:05+00:00</updated>
		<content type="html">&lt;p&gt;Touring is one way of structuring exploratory testing, but exploratory testing is not necessarily touring, and touring is not necessarily exploratory.  &lt;/p&gt;
&lt;p&gt;At one extreme, a tourist might parachute into a territory for which there is no detailed knowledge of the landscape, flora and fauna, or human culture, with the goal of identifying what&amp;#8217;s there to be learned. Except in such cases, we wouldn&amp;#8217;t call her a tourist; we&amp;#8217;d call her an anthropologist, or a field botanist, or a field geologist, or an archaeologist.  The activity is in this case is interactive with the territory.  At the other extreme, a tourist might visit a travel agent, get on a plane to Orlando, meet a chartered bus at the airport, and sit through the rides at Disney World.  The activity there is largely passive.&lt;/p&gt;
&lt;p&gt;Touring a program can be done in a more scripted or more exploratory way, just as touring a city can be done in a more scripted or more exploratory way. A tourist has many options. Before going on a trip, a tourist might study what is already known about a particular destination. To prepare, she might supply herself with maps and travel guides, and some ideas about destinations of interest. Upon arrival, she might choose a set of walking tours from a guidebook and follow the routes closely, eating only at the restaurants identified in the guidebook, noting buildings and artifacts and other objects of interest by matching them with the descriptions and illustrations. At a given site, she might listen to a prepared audio guide that directs her observations very specifically. She might spend all of her time in the presence of a tour guide who tells her what to observe and how to interpret it.  She might choose to accept everything the tour guide told her as the complete story, and refrain from asking questions. Even though the experience would be new to her, and she might learn something from it, she would not likely add much to what is already known.  We call that activity touring, but it isn&amp;#8217;t very exploratory, and a report on such a tour would largely recapitulate the guidebook.  Is your testing like that?&lt;/p&gt;
&lt;p&gt;On the other hand, rather than touring like a tourist, she might cover a territory as a historian, or a social scientist, or a travel writer.  In that kind of role, she would have a research goal based on the idea of obtaining new knowledge. Learning something new and imparting it to other people requires a more open agenda than sitting on the bus while someone or something else directs your attention.  Our researcher might make her way directly to particular destinations or landmarks and begin her research there, or she might amble through neighbourhoods or historical sites to discover new things about them.  She could choose to focus on specific aspects of what&amp;#8217;s there to observe, or she could choose to let the observations come to her&amp;mdash;and, of course, she might do both.  She might work with descriptions that she had been given with the intention of adding to them, or she might work from a set of questions that haven&amp;#8217;t been asked before. Depending on her mission, she might choose to look for specific patterns or problems, or she might seek deeper understanding that would help her to identify or refine what kind of patterns or problems to look for.  Even though the mission to discover new information might come from someone else, she remains in control of the specifics of the itinerary and of each activity from one moment to the next.  Is your testing more like that?&lt;/p&gt;
&lt;p&gt;One of the hallmarks of exploratory activity is the extent to which it is guided and structured by the person performing that activity.  Another hallmark is the extent to which new knowledge feeds into choice of which action to perform next.  Touring is not equivalent to exploration; touring can be done is a scripted way or an exploratory way.&lt;/p&gt;</content>
		<author>
			<name>Michael</name>
			<uri>http://www.developsense.com/blog</uri>
		</author>
		<source>
			<title type="html">Developsense Blog</title>
			<subtitle type="html">DevelopSense Blog</subtitle>
			<link rel="self" href="http://www.developsense.com/blog/feed/atom/"/>
			<id>http://www.developsense.com/blog/feed/atom/</id>
			<updated>2012-02-08T20:48:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A Big List of Interesting Programming Books Released in 2011</title>
		<link href="http://feedproxy.google.com/~r/ZenAndTheArtOfRubyProgramming/~3/wqmDrJa4aqI/"/>
		<id>http://programmingzen.com/?p=1437</id>
		<updated>2011-12-16T19:16:08+00:00</updated>
		<content type="html">&lt;p&gt;The following is a list of 48 interesting programming books that were released in 2011. While technically some of them are only programming-related and not about coding per se, each one is sure to be of interest to some programmers.
&lt;/p&gt;
&lt;p&gt;As some of you know, I run a service called &lt;a href=&quot;http://anynewbooks.com&quot; title=&quot;New Books&quot; target=&quot;_blank&quot;&gt;Any New Books?&lt;/a&gt;, which emails you a list of new books that are related to the categories of your choice each week. For the most part I pulled this list from the weekly staff picks there throughout this past year, just in time for your Christmas shopping. &lt;img src=&quot;http://programmingzen.com/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;The books are ordered by their current sale rank on Amazon (from the most popular to the least popular at the moment, with hardcovers first). I hope this page will help you discover a few titles you may have not have noticed yet.&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://math-blog.com/2011/12/16/interesting-mathematics-books-2011/&quot;&gt;Mathematics book list&lt;/a&gt;]&lt;/p&gt;
&lt;table border=&quot;0&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot; cellspacing=&quot;0&quot;&gt;
&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Information-History-Theory-Flood/dp/0375423729%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0375423729&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/519uLG8YD1L._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Information-History-Theory-Flood/dp/0375423729%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0375423729&quot;&gt;&lt;strong&gt;The Information: A History, a Theory, a Flood&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Information-History-Theory-Flood/dp/0375423729%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0375423729&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0375423729/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0375423729/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B004DEPHUC/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B004P1JEY8/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;By &lt;strong&gt;James Gleick&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0375423729&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Pantheon&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;March 1, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Hardcover&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$16.82&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22The+Information%3A+A+History%2C+a+Theory%2C+a+...%22:&amp;url=http://amzn.to/tgui9E&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/rpOjIC&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Computer-Programming-Volumes-1-4A-Boxed/dp/0321751043%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321751043&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41gCSRxxVeL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Computer-Programming-Volumes-1-4A-Boxed/dp/0321751043%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321751043&quot;&gt;&lt;strong&gt;The Art of Computer Programming, Volumes 1-4A Boxed Set&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Computer-Programming-Volumes-1-4A-Boxed/dp/0321751043%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321751043&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0321751043/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Donald E. Knuth&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0321751043&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;March 13, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Hardcover&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$190.47&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22The+Art+of+Computer+Programming%2C+Volumes...%22:&amp;url=http://amzn.to/rt5YtA&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/v1NTXW&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D032157351X&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41ZpPEIT09L._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D032157351X&quot;&gt;&lt;strong&gt;Algorithms (4th Edition)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D032157351X&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/032157351X/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/032157351X/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/032157351X/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B004P8J1NA/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B004P8J1NA/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Robert Sedgewick, Kevin Wayne&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;032157351X&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;March 19, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Hardcover&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$59.99&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Algorithms+%284th+Edition%29%22:&amp;url=http://amzn.to/vzHCPY&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/vBWNfC&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Art-Computer-Programming-Combinatorial-Algorithms/dp/0201038048%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0201038048&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41Uv2Tm1D4L._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Art-Computer-Programming-Combinatorial-Algorithms/dp/0201038048%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0201038048&quot;&gt;&lt;strong&gt;The Art of Computer Programming, Volume 4A: Combinatorial Algorithms, Part 1&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Art-Computer-Programming-Combinatorial-Algorithms/dp/0201038048%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0201038048&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0201038048/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0201038048/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0201038048/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Donald E. Knuth&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0201038048&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;January 22, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Hardcover&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$53.15&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22The+Art+of+Computer+Programming%2C+Volume+...%22:&amp;url=http://amzn.to/s4QWmp&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/t4tpI6&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/GPU-Computing-Gems-Emerald-Applications/dp/0123849888%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123849888&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51jY%2BFkYsPL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/GPU-Computing-Gems-Emerald-Applications/dp/0123849888%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123849888&quot;&gt;&lt;strong&gt;GPU Computing Gems Emerald Edition&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/GPU-Computing-Gems-Emerald-Applications/dp/0123849888%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123849888&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0123849888/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0123849888/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0123849888/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B004MPRDUO/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B004MPRDUO/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Editors at Morgan Kaufmann&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0123849888&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Morgan Kaufmann&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;February 7, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Hardcover&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$29.06&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22GPU+Computing+Gems+Emerald+Edition+%28Appl...%22:&amp;url=http://amzn.to/vfJd1o&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/tSBe4G&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Visualize-This-FlowingData-Visualization-Statistics/dp/0470944889%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0470944889&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51QSh0URPML._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Visualize-This-FlowingData-Visualization-Statistics/dp/0470944889%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0470944889&quot;&gt;&lt;strong&gt;Visualize This: The FlowingData Guide to Design, Visualization, and Statistics&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Visualize-This-FlowingData-Visualization-Statistics/dp/0470944889%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0470944889&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0470944889/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0470944889/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0470944889/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005CCT19M/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005CCT19M/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Nathan Yau&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0470944889&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Wiley&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;July 20, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$20.48&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Visualize+This%3A+The+FlowingData+Guide+to...%22:&amp;url=http://amzn.to/q9G425&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/nTEaqa&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Programming-Android-Zigurd-Mednieks/dp/1449389694%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449389694&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/515diZDqQ3L._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Programming-Android-Zigurd-Mednieks/dp/1449389694%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449389694&quot;&gt;&lt;strong&gt;Programming Android&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Programming-Android-Zigurd-Mednieks/dp/1449389694%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449389694&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1449389694/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1449389694/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1449389694/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005EI86D6/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005EI86D6/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Zigurd Mednieks, Laird Dornin, G. Blake Meike, Masumi Nakamura&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1449389694&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;O&amp;#8217;Reilly Media&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;August 5, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$22.98&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Programming+Android%22:&amp;url=http://amzn.to/qjT3Be&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/oUTXIK&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/JavaScript-Definitive-Guide-Activate-Guides/dp/0596805527%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0596805527&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51onEPAeDcL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/JavaScript-Definitive-Guide-Activate-Guides/dp/0596805527%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0596805527&quot;&gt;&lt;strong&gt;JavaScript: The Definitive Guide: Activate Your Web Pages&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/JavaScript-Definitive-Guide-Activate-Guides/dp/0596805527%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0596805527&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0596805527/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0596805527/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0596805527/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B004XQX4K0/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B004XQX4K0/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;David Flanagan&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0596805527&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;O&amp;#8217;Reilly Media&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;May 10, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$27.48&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22JavaScript%3A+The+Definitive+Guide%3A+Activa...%22:&amp;url=http://amzn.to/rFsjDa&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/uMHhsO&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/iOS-Programming-Ranch-Guide-Guides/dp/0321773772%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321773772&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/412zhvqyIXL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/iOS-Programming-Ranch-Guide-Guides/dp/0321773772%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321773772&quot;&gt;&lt;strong&gt;iOS Programming: The Big Nerd Ranch Guide (2nd Edition)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/iOS-Programming-Ranch-Guide-Guides/dp/0321773772%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321773772&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0321773772/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0321773772/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0321773772/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B004Z2NQJQ/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B004Z2NQJQ/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Joe Conway, Aaron Hillegass&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0321773772&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;July 2, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$26.95&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22iOS+Programming%3A+The+Big+Nerd+Ranch+Guid...%22:&amp;url=http://amzn.to/pvnN0Q&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/qIYE4V&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Programming-Objective-C-Third-Developers-Library/dp/0321711394%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321711394&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/514GKabDXcL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Programming-Objective-C-Third-Developers-Library/dp/0321711394%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321711394&quot;&gt;&lt;strong&gt;Programming in Objective-C, Third Edition&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Programming-Objective-C-Third-Developers-Library/dp/0321711394%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321711394&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0321711394/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0321711394/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0321711394/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B004QQ3MI6/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B004QQ3MI6/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Stephen G. Kochan&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0321711394&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;June 20, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$25.99&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Programming+in+Objective-C%2C+Third+Editio...%22:&amp;url=http://amzn.to/uKKeOS&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/vdlyDA&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Cocoa-Programming-Mac-OS-4th/dp/0321774086%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321774086&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41pMj0Bsr1L._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Cocoa-Programming-Mac-OS-4th/dp/0321774086%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321774086&quot;&gt;&lt;strong&gt;Cocoa Programming for Mac OS X (4th Edition)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Cocoa-Programming-Mac-OS-4th/dp/0321774086%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321774086&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0321774086/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B006H4MMYU/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B006H4MMYU/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Aaron Hillegass, Adam Preble&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0321774086&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;November 19, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$27.99&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Cocoa+Programming+for+Mac+OS+X+%284th+Edit...%22:&amp;url=http://amzn.to/tUV1xH&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/sLY2WI&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Introducing-HTML5-2nd-Bruce-Lawson/dp/0321784421%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321784421&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41nRzz0KemL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Introducing-HTML5-2nd-Bruce-Lawson/dp/0321784421%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321784421&quot;&gt;&lt;strong&gt;Introducing HTML5 (2nd Edition)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Introducing-HTML5-2nd-Bruce-Lawson/dp/0321784421%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321784421&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0321784421/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0321784421/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005OR9MJY/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005OR9MJY/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Bruce Lawson, Remy Sharp&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0321784421&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;New Riders Press&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;October 28, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$14.49&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Introducing+HTML5+%282nd+Edition%29%22:&amp;url=http://amzn.to/uiiy82&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/v3kTX9&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0596158106&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51geJj9aghL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0596158106&quot;&gt;&lt;strong&gt;Programming Python&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0596158106&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0596158106/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0596158106/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0596158106/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B004GTLFJ6/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B004GTLFJ6/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Mark Lutz&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0596158106&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;O&amp;#8217;Reilly Media&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;January 7, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$36.42&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Programming+Python%22:&amp;url=http://amzn.to/uuE9cj&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/sQjIDF&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Beginning-Android-Application-Development-Programmer/dp/1118017110%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1118017110&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51-qKJitSbL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Beginning-Android-Application-Development-Programmer/dp/1118017110%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1118017110&quot;&gt;&lt;strong&gt;Beginning Android Application Development&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Beginning-Android-Application-Development-Programmer/dp/1118017110%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1118017110&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1118017110/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1118017110/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1118017110/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Wei-Meng Lee&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1118017110&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Wrox&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;April 19, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$15.99&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Beginning+Android+Application+Developmen...%22:&amp;url=http://amzn.to/vmPs3M&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/twDl2C&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Agile-Development-Rails-Pragmatic-Programmers/dp/1934356549%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1934356549&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51Pkt8UcdAL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Agile-Development-Rails-Pragmatic-Programmers/dp/1934356549%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1934356549&quot;&gt;&lt;strong&gt;Agile Web Development with Rails&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Agile-Development-Rails-Pragmatic-Programmers/dp/1934356549%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1934356549&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1934356549/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1934356549/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1934356549/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Sam Ruby, Dave Thomas, David Heinemeier Hansson&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1934356549&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Pragmatic Bookshelf&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;March 31, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$22.36&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Agile+Web+Development+with+Rails+%28Pragma...%22:&amp;url=http://amzn.to/svQiug&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/ukRdLA&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Eloquent-Ruby-Addison-Wesley-Professional/dp/0321584104%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321584104&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41IDuwJXFCL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Eloquent-Ruby-Addison-Wesley-Professional/dp/0321584104%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321584104&quot;&gt;&lt;strong&gt;Eloquent Ruby&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Eloquent-Ruby-Addison-Wesley-Professional/dp/0321584104%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321584104&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0321584104/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0321584104/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0321584104/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B004MMEJ36/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B004MMEJ36/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Russ Olsen&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0321584104&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;February 21, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$24.99&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Eloquent+Ruby+%28Addison-Wesley+Profession...%22:&amp;url=http://amzn.to/si7i3b&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/terEI8&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Matlab-Second-Practical-Introduction-Programming/dp/0123850819%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123850819&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/61aJAurzdPL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Matlab-Second-Practical-Introduction-Programming/dp/0123850819%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123850819&quot;&gt;&lt;strong&gt;Matlab, Second Edition: A Practical Introduction to Programming and Problem Solving&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Matlab-Second-Practical-Introduction-Programming/dp/0123850819%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123850819&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0123850819/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0123850819/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005DI9M44/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005DI9M44/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Stormy Attaway&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0123850819&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Butterworth-Heinemann&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;August 11, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$35.44&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Matlab%2C+Second+Edition%3A+A+Practical+Intr...%22:&amp;url=http://amzn.to/ucF0h4&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/s9Ntur&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Java-Performance-Charlie-Hunt/dp/0137142528%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0137142528&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51iFHhu62yL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Java-Performance-Charlie-Hunt/dp/0137142528%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0137142528&quot;&gt;&lt;strong&gt;Java Performance&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Java-Performance-Charlie-Hunt/dp/0137142528%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0137142528&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0137142528/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0137142528/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0137142528/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005R4NELQ/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005R4NELQ/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Charlie Hunt, Binu John&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0137142528&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Prentice Hall&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;October 10, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$40.73&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Java+Performance%22:&amp;url=http://amzn.to/ofdnkx&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/nLnpEO&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Gamification-Design-Implementing-Mechanics-Mobile/dp/1449397670%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449397670&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51w5ybeiwKL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Gamification-Design-Implementing-Mechanics-Mobile/dp/1449397670%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449397670&quot;&gt;&lt;strong&gt;Gamification by Design: Implementing Game Mechanics in Web and Mobile Apps&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Gamification-Design-Implementing-Mechanics-Mobile/dp/1449397670%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449397670&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1449397670/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1449397670/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1449397670/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005KKMM9W/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005KKMM9W/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Gabe Zichermann, Christopher Cunningham&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1449397670&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;O&amp;#8217;Reilly Media&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;August 19, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$14.34&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Gamification+by+Design%3A+Implementing+Gam...%22:&amp;url=http://amzn.to/pGFofI&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/oZvRCJ&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Learn-You-Haskell-Great-Good/dp/1593272839%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1593272839&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41JyzF1dU4L._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Learn-You-Haskell-Great-Good/dp/1593272839%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1593272839&quot;&gt;&lt;strong&gt;Learn You a Haskell for Great Good!: A Beginner&amp;#8217;s Guide&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Learn-You-Haskell-Great-Good/dp/1593272839%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1593272839&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1593272839/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1593272839/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1593272839/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B004VB3V0K/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B004VB3V0K/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Miran Lipovaca&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1593272839&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;No Starch Press&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;April 18, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$21.55&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Learn+You+a+Haskell+for+Great+Good%21%3A+A+B...%22:&amp;url=http://amzn.to/gSwkiX&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/hnNLQQ&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Supercharged-JavaScript-Graphics-canvas-jQuery/dp/1449393632%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449393632&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51YCd8RsKKL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Supercharged-JavaScript-Graphics-canvas-jQuery/dp/1449393632%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449393632&quot;&gt;&lt;strong&gt;Supercharged JavaScript Graphics: with HTML5 canvas, jQuery, and More&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Supercharged-JavaScript-Graphics-canvas-jQuery/dp/1449393632%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449393632&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1449393632/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1449393632/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1449393632/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005EI85IC/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005EI85IC/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Raffaele Cecco&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1449393632&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;O&amp;#8217;Reilly Media&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;August 2, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$21.31&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Supercharged+JavaScript+Graphics%3A+with+H...%22:&amp;url=http://amzn.to/qMlopf&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/pr6sdq&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Arduino-Robotics-John-David-Warren/dp/1430231831%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1430231831&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51QiJDgc4wL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Arduino-Robotics-John-David-Warren/dp/1430231831%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1430231831&quot;&gt;&lt;strong&gt;Arduino Robotics&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Arduino-Robotics-John-David-Warren/dp/1430231831%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1430231831&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1430231831/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1430231831/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1430231831/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005PZ28WI/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005PZ28WI/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;John-David Warren, Josh Adams, Harald Molle&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1430231831&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Apress&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;July 14, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$26.38&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Arduino+Robotics%22:&amp;url=http://amzn.to/nGY0r3&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/nENCSc&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/HBase-Definitive-Guide-Lars-George/dp/1449396100%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449396100&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51OcYjwWI9L._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/HBase-Definitive-Guide-Lars-George/dp/1449396100%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449396100&quot;&gt;&lt;strong&gt;HBase: The Definitive Guide&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/HBase-Definitive-Guide-Lars-George/dp/1449396100%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449396100&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1449396100/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1449396100/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1449396100/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005KOJ3U4/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005KOJ3U4/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Lars George&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1449396100&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;O&amp;#8217;Reilly Media&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;September 20, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$24.99&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22HBase%3A+The+Definitive+Guide%22:&amp;url=http://amzn.to/qTv9I8&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/mVQyih&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Tangled-Web-Securing-Modern-Applications/dp/1593273886%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1593273886&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/516vnTrKJJL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Tangled-Web-Securing-Modern-Applications/dp/1593273886%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1593273886&quot;&gt;&lt;strong&gt;The Tangled Web: A Guide to Securing Modern Web Applications&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Tangled-Web-Securing-Modern-Applications/dp/1593273886%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1593273886&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1593273886/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B006FZ3UNI/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B006FZ3UNI/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Michal Zalewski&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1593273886&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;No Starch Press&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;November 26, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$26.50&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22The+Tangled+Web%3A+A+Guide+to+Securing+Mod...%22:&amp;url=http://amzn.to/rXr30s&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/vrDTdW&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/MongoDB-Action-Kyle-Banker/dp/1935182870%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1935182870&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51-K3pehVFL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/MongoDB-Action-Kyle-Banker/dp/1935182870%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1935182870&quot;&gt;&lt;strong&gt;MongoDB in Action&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/MongoDB-Action-Kyle-Banker/dp/1935182870%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1935182870&quot;&gt;USA&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Kyle Banker&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1935182870&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Manning Publications&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;December 16, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$27.46&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22MongoDB+in+Action%22:&amp;url=http://amzn.to/vv71we&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/v6Q1UZ&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Programming-Pig-Alan-Gates/dp/1449302645%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449302645&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/4101GbF6usL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Programming-Pig-Alan-Gates/dp/1449302645%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449302645&quot;&gt;&lt;strong&gt;Programming Pig&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Programming-Pig-Alan-Gates/dp/1449302645%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449302645&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1449302645/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1449302645/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1449302645/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B0065KVFBM/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B0065KVFBM/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Alan Gates&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1449302645&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;O&amp;#8217;Reilly Media&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;October 20, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$24.99&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Programming+Pig%22:&amp;url=http://amzn.to/si5fSo&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/tIsMKL&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Python-Standard-Library-Example-Developers/dp/0321767349%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321767349&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/518kgosz6XL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Python-Standard-Library-Example-Developers/dp/0321767349%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321767349&quot;&gt;&lt;strong&gt;The Python Standard Library by Example&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Python-Standard-Library-Example-Developers/dp/0321767349%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321767349&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0321767349/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0321767349/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0321767349/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B0054RF6WG/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B0054RF6WG/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Doug Hellmann&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0321767349&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;June 11, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$31.49&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22The+Python+Standard+Library+by+Example+%28...%22:&amp;url=http://amzn.to/mvlrO7&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/kK9n0G&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Joy-Clojure-Thinking-Way/dp/1935182641%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1935182641&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51LKOYzkfWL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Joy-Clojure-Thinking-Way/dp/1935182641%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1935182641&quot;&gt;&lt;strong&gt;The Joy of Clojure: Thinking the Clojure Way&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Joy-Clojure-Thinking-Way/dp/1935182641%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1935182641&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1935182641/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1935182641/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1935182641/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Michael Fogus, Chris Houser&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1935182641&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Manning Publications&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;April 4, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$21.99&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22The+Joy+of+Clojure%3A+Thinking+the+Clojure...%22:&amp;url=http://amzn.to/rv6MqQ&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/rUNdgp&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Xcode-Developer-Reference-Richard-Wentk/dp/111800759X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D111800759X&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/31SsLdXkxKL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Xcode-Developer-Reference-Richard-Wentk/dp/111800759X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D111800759X&quot;&gt;&lt;strong&gt;Xcode 4&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Xcode-Developer-Reference-Richard-Wentk/dp/111800759X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D111800759X&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/111800759X/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/111800759X/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/111800759X/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B0055AUG1I/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B0055AUG1I/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Richard Wentk&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;111800759X&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Wiley&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;June 28, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$19.99&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Xcode+4+%28Developer+Reference%29%22:&amp;url=http://amzn.to/iHzOzV&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/lpSsjF&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Programming-Amazon-EC2-Jurg-Vliet/dp/1449393683%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449393683&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51gP-tf0sWL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Programming-Amazon-EC2-Jurg-Vliet/dp/1449393683%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449393683&quot;&gt;&lt;strong&gt;Programming Amazon EC2&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Programming-Amazon-EC2-Jurg-Vliet/dp/1449393683%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449393683&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1449393683/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1449393683/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1449393683/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B004V9MR5M/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B004V9MR5M/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Jurg van Vliet, Flavia Paganelli&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1449393683&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;O&amp;#8217;Reilly Media&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;March 14, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$24.22&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Programming+Amazon+EC2%22:&amp;url=http://amzn.to/rEptbY&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/tkzUQQ&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Advanced-Mac-OS-Programming-Guides/dp/0321706250%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321706250&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51nHtmazpNL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Advanced-Mac-OS-Programming-Guides/dp/0321706250%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321706250&quot;&gt;&lt;strong&gt;Advanced Mac OS X Programming: The Big Nerd Ranch Guide&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Advanced-Mac-OS-Programming-Guides/dp/0321706250%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321706250&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0321706250/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0321706250/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0321706250/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005GWG0L0/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005GWG0L0/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Mark Dalrymple&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0321706250&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;August 28, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$32.95&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Advanced+Mac+OS+X+Programming%3A+The+Big+N...%22:&amp;url=http://amzn.to/r963xx&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/nipLGi&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/CUDA-Application-Design-Development-Farber/dp/0123884268%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123884268&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51At7qey-QL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/CUDA-Application-Design-Development-Farber/dp/0123884268%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123884268&quot;&gt;&lt;strong&gt;CUDA Application Design and Development&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/CUDA-Application-Design-Development-Farber/dp/0123884268%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123884268&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0123884268/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0123884268/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B006CFEA3K/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B006CFEA3K/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Rob Farber&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0123884268&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Morgan Kaufmann&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;November 14, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$43.98&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22CUDA+Application+Design+and+Development%22:&amp;url=http://amzn.to/scY06z&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/w5iXO5&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Sinatra-Up-Running-Alan-Harris/dp/1449304230%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449304230&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51qMOM6YkdL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Sinatra-Up-Running-Alan-Harris/dp/1449304230%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449304230&quot;&gt;&lt;strong&gt;Sinatra: Up and Running&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Sinatra-Up-Running-Alan-Harris/dp/1449304230%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449304230&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1449304230/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B006C3HPS4/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B006C3HPS4/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Alan Harris, Konstantin Haase&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1449304230&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;O&amp;#8217;Reilly Media&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;December 1, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$15.29&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Sinatra%3A+Up+and+Running%22:&amp;url=http://amzn.to/tdyjqr&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/si00Te&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Management-3-0-Developers-Developing-Addison-Wesley/dp/0321712471%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321712471&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51dtvyU2b4L._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Management-3-0-Developers-Developing-Addison-Wesley/dp/0321712471%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321712471&quot;&gt;&lt;strong&gt;Management 3.0: Leading Agile Developers, Developing Agile Leaders&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Management-3-0-Developers-Developing-Addison-Wesley/dp/0321712471%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321712471&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0321712471/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0321712471/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0321712471/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B004ISL6JY/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B004ISL6JY/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Jurgen Appelo&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0321712471&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;January 7, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$29.50&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Management+3.0%3A+Leading+Agile+Developers...%22:&amp;url=http://amzn.to/uwPmzt&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/tS9W4I&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Professional-NoSQL-Wrox-Programmer/dp/047094224X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D047094224X&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51BEW-rAcXL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Professional-NoSQL-Wrox-Programmer/dp/047094224X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D047094224X&quot;&gt;&lt;strong&gt;Professional NoSQL&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Professional-NoSQL-Wrox-Programmer/dp/047094224X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D047094224X&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/047094224X/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/047094224X/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/047094224X/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005LVQFZC/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005LVQFZC/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Shashank Tiwari&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;047094224X&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Wrox&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;September 13, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$16.99&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Professional+NoSQL+%28Wrox+Programmer+to+P...%22:&amp;url=http://amzn.to/ukYyfS&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/tvAyxM&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Scalability-Rules-Principles-Scaling-Sites/dp/0321753887%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321753887&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/5151N6oWZoL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Scalability-Rules-Principles-Scaling-Sites/dp/0321753887%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321753887&quot;&gt;&lt;strong&gt;Scalability Rules: 50 Principles for Scaling Web Sites&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Scalability-Rules-Principles-Scaling-Sites/dp/0321753887%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321753887&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0321753887/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0321753887/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0321753887/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B00503D1TY/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B00503D1TY/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Martin L. Abbott, Michael T. Fisher&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0321753887&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;May 15, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$16.96&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Scalability+Rules%3A+50+Principles+for+Sca...%22:&amp;url=http://amzn.to/j0PaUH&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/lp4VaC&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Programming-Concurrency-JVM-Mastering-Synchronization/dp/193435676X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D193435676X&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/419hxrFyOUL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Programming-Concurrency-JVM-Mastering-Synchronization/dp/193435676X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D193435676X&quot;&gt;&lt;strong&gt;Programming Concurrency on the JVM: Mastering Synchronization, STM, and Actors&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Programming-Concurrency-JVM-Mastering-Synchronization/dp/193435676X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D193435676X&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/193435676X/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/193435676X/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/193435676X/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Venkat Subramaniam&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;193435676X&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Pragmatic Bookshelf&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;September 2, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$19.29&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Programming+Concurrency+on+the+JVM%3A+Mast...%22:&amp;url=http://amzn.to/oLj6d6&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/qohyFc&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Learning-HTML5-Game-Programming-Hands-/dp/0321767365%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321767365&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41CX-urFCML._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Learning-HTML5-Game-Programming-Hands-/dp/0321767365%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321767365&quot;&gt;&lt;strong&gt;Learning HTML5 Game Programming: A Hands-on Guide to Building Online Games Using Canvas, SVG, and WebGL&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Learning-HTML5-Game-Programming-Hands-/dp/0321767365%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321767365&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0321767365/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0321767365/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0321767365/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005OR9NH0/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005OR9NH0/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;James L. Williams&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0321767365&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;October 5, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$16.54&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Learning+HTML5+Game+Programming%3A+A+Hands...%22:&amp;url=http://amzn.to/shepkc&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/rRhugn&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Semantic-Web-Working-Ontologist-Second/dp/0123859654%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123859654&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51CI0qnpeXL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Semantic-Web-Working-Ontologist-Second/dp/0123859654%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123859654&quot;&gt;&lt;strong&gt;Semantic Web for the Working Ontologist, Second Edition: Effective Modeling in RDFS and OWL&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Semantic-Web-Working-Ontologist-Second/dp/0123859654%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123859654&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0123859654/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0123859654/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0123859654/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Dean Allemang, James Hendler&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0123859654&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Morgan Kaufmann&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;June 3, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$38.43&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Semantic+Web+for+the+Working+Ontologist%2C...%22:&amp;url=http://amzn.to/ioQAoC&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/iBwDi7&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Brave-NUI-World-Designing-Interfaces/dp/0123822319%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123822319&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41agKLjLzaL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Brave-NUI-World-Designing-Interfaces/dp/0123822319%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123822319&quot;&gt;&lt;strong&gt;Brave NUI World: Designing Natural User Interfaces for Touch and Gesture&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Brave-NUI-World-Designing-Interfaces/dp/0123822319%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0123822319&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0123822319/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0123822319/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0123822319/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Daniel Wigdor, Dennis Wixon&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0123822319&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Morgan Kaufmann&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;April 27, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$18.49&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Brave+NUI+World%3A+Designing+Natural+User+...%22:&amp;url=http://amzn.to/itTxF1&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/lwbvyp&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Haskell-Functional-Programming-International-Computer/dp/0201882957%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0201882957&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/4114w7dnO5L._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Haskell-Functional-Programming-International-Computer/dp/0201882957%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0201882957&quot;&gt;&lt;strong&gt;Haskell: The Craft of Functional Programming (3rd Edition)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Haskell-Functional-Programming-International-Computer/dp/0201882957%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0201882957&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0201882957/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0201882957/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0201882957/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Simon Thompson&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0201882957&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;October 2, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$44.96&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Haskell%3A+The+Craft+of+Functional+Program...%22:&amp;url=http://amzn.to/n2Puvp&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/qBgQJk&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Think-Stats-Allen-B-Downey/dp/1449307116%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449307116&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/512es42TshL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Think-Stats-Allen-B-Downey/dp/1449307116%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449307116&quot;&gt;&lt;strong&gt;Think Stats&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Think-Stats-Allen-B-Downey/dp/1449307116%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449307116&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1449307116/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1449307116/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1449307116/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005EI85LO/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005EI85LO/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Allen B. Downey&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1449307116&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;O&amp;#8217;Reilly Media&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;July 22, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$21.98&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Think+Stats%22:&amp;url=http://amzn.to/pWXBee&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/phj4Iz&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Rails-3-Action-Ryan-Bigg/dp/1935182277%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1935182277&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51MthaBNDEL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Rails-3-Action-Ryan-Bigg/dp/1935182277%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1935182277&quot;&gt;&lt;strong&gt;Rails 3 in Action&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Rails-3-Action-Ryan-Bigg/dp/1935182277%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1935182277&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1935182277/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1935182277/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1935182277/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Ryan Bigg, Yehuda Katz&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1935182277&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Manning Publications&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;September 28, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$27.48&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Rails+3+in+Action%22:&amp;url=http://amzn.to/nAkvxG&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/oZ1BCn&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Driven-Development-Embedded-Pragmatic-Programmers/dp/193435662X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D193435662X&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51AWF3--mpL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Driven-Development-Embedded-Pragmatic-Programmers/dp/193435662X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D193435662X&quot;&gt;&lt;strong&gt;Test Driven Development for Embedded C&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Driven-Development-Embedded-Pragmatic-Programmers/dp/193435662X%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D193435662X&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/193435662X/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/193435662X/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/193435662X/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;James W. Grenning&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;193435662X&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Pragmatic Bookshelf&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;May 2, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$19.37&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Test+Driven+Development+for+Embedded+C+%28...%22:&amp;url=http://amzn.to/mTd1Xo&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/ljuG3i&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/MacRuby-Definitive-Guide-Ruby-Cocoa/dp/1449380379%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449380379&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51fD8i7AueL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/MacRuby-Definitive-Guide-Ruby-Cocoa/dp/1449380379%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449380379&quot;&gt;&lt;strong&gt;MacRuby: The Definitive Guide: Ruby and Cocoa on OS X&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/MacRuby-Definitive-Guide-Ruby-Cocoa/dp/1449380379%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1449380379&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1449380379/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1449380379/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005WL6HBS/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005WL6HBS/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Matt Aimonetti&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1449380379&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;O&amp;#8217;Reilly Media&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;November 4, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$16.70&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22MacRuby%3A+The+Definitive+Guide%3A+Ruby+and+...%22:&amp;url=http://amzn.to/tdXExG&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/shKIZO&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Modern-Information-Retrieval-Concepts-Technology/dp/0321416910%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321416910&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51l1Y9vy94L._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Modern-Information-Retrieval-Concepts-Technology/dp/0321416910%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321416910&quot;&gt;&lt;strong&gt;Modern Information Retrieval: The Concepts and Technology behind Search (2nd Edition)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Modern-Information-Retrieval-Concepts-Technology/dp/0321416910%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321416910&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0321416910/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0321416910/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0321416910/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Ricardo Baeza-Yates, Berthier Ribeiro-Neto&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0321416910&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Addison-Wesley Professional&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;February 10, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$56.24&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Modern+Information+Retrieval%3A+The+Concep...%22:&amp;url=http://amzn.to/tppFVo&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/sHpADB&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Designing-Search-Strategies-eCommerce-UXmatters/dp/0470942231%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0470942231&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41z526qP0HL._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Designing-Search-Strategies-eCommerce-UXmatters/dp/0470942231%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0470942231&quot;&gt;&lt;strong&gt;Designing Search: UX Strategies for eCommerce Success&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Designing-Search-Strategies-eCommerce-UXmatters/dp/0470942231%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0470942231&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/0470942231/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/0470942231/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/0470942231/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B0050PJ8S0/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B0050PJ8S0/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Greg Nudelman&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;0470942231&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Wiley&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;May 24, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$14.99&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Designing+Search%3A+UX+Strategies+for+eCom...%22:&amp;url=http://amzn.to/tP6AB7&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/vLxOW0&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;

&lt;tr&gt;
&lt;td width=&quot;130&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Windows-Phone-Recipes-Problem-Solution-Approach/dp/1430233710%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1430233710&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41isqMINz8L._SL160_.jpg&quot; border=&quot;0&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
	  &lt;a href=&quot;http://www.amazon.com/Windows-Phone-Recipes-Problem-Solution-Approach/dp/1430233710%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1430233710&quot;&gt;&lt;strong&gt;Windows Phone 7 Recipes: A Problem-Solution Approach&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;Stores: &lt;a href=&quot;http://www.amazon.com/Windows-Phone-Recipes-Problem-Solution-Approach/dp/1430233710%3FSubscriptionId%3D0BZQ5SJTYZCHFG60RT02%26tag%3Dblpro-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1430233710&quot;&gt;USA&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/1430233710/nosearch-21/ref=nosim/&quot;&gt;UK&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.ca/exec/obidos/ASIN/1430233710/nosearchca-20/ref=nosim/&quot;&gt;Canada&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.it/exec/obidos/ASIN/1430233710/nosearchit-21/ref=nosim/&quot;&gt;Italy&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B005PZ0AEG/blpro-20/ref=nosim/&quot;&gt;Kindle&lt;/a&gt; | &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B005PZ0AEG/nosearch-21/ref=nosim/&quot;&gt;UK Kindle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;By &lt;strong&gt;Fabio Claudio Ferracchiati, Emanuele Garofalo&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;ISBN: &lt;strong&gt;1430233710&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publisher: &lt;strong&gt;Apress&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Publication date: &lt;strong&gt;May 26, 2011&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Binding: &lt;strong&gt;Paperback&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;Estimated price: &lt;strong&gt;$22.99&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Share this book on &lt;a href=&quot;http://twitter.com/share?text=Check+out+%22Windows+Phone+7+Recipes%3A+A+Problem-Solut...%22:&amp;url=http://amzn.to/koAyOa&amp;via=anynewbooks&quot;&gt;Twitter&lt;/a&gt; |&lt;a href=&quot;http://www.facebook.com/share.php?u=http://amzn.to/khsBrk&quot;&gt;Facebook&lt;/a&gt;
 	 &lt;/p&gt;


&lt;p&gt;No related posts.&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=wqmDrJa4aqI:R58z7pZFzXc:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=wqmDrJa4aqI:R58z7pZFzXc:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?i=wqmDrJa4aqI:R58z7pZFzXc:F7zBnMyn0Lo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=wqmDrJa4aqI:R58z7pZFzXc:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?i=wqmDrJa4aqI:R58z7pZFzXc:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=wqmDrJa4aqI:R58z7pZFzXc:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?d=qj6IDK7rITs&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=wqmDrJa4aqI:R58z7pZFzXc:l6gmwiTKsz0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?d=l6gmwiTKsz0&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=wqmDrJa4aqI:R58z7pZFzXc:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?i=wqmDrJa4aqI:R58z7pZFzXc:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/wqmDrJa4aqI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Antonio Cangiano</name>
			<uri>http://programmingzen.com</uri>
		</author>
		<source>
			<title type="html">Zen and the Art of Programming</title>
			<subtitle type="html">Meditations on programming, startups, and technology</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/ZenAndTheArtOfRubyProgramming"/>
			<id>http://programmingzen.com/feed/atom/</id>
			<updated>2012-01-16T20:47:54+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Crowdsource Testing – Acting vs. Using</title>
		<link href="http://feedproxy.google.com/~r/EricJacobsonSoftwareTestingBlog/~3/_50LLZAJqWU/crowdsource-testing-acting-vs-using.html"/>
		<id>tag:blogger.com,1999:blog-8951904624959546499.post-3540149575115234318</id>
		<updated>2011-12-15T22:36:00+00:00</updated>
		<content type="html">&lt;p&gt;My tech department had a little internal one day idea conference this week.&amp;nbsp; I wanted to keep it from being a programmer fest so I pitched Crowdsource Testing as a topic.&amp;nbsp; Although I knew nothing about it, I had just seen &lt;a href=&quot;http://www.testthisblog.com/2011/10/james-whittakers-starwest-keynote.html&quot; target=&quot;_blank&quot;&gt;James Whittaker’s STARwest Keynote&lt;/a&gt;, and the notion of having non-testers test my product had been bouncing around my brain.&lt;/p&gt; &lt;p&gt;With a buzzword like “crowdsource” I guess I shouldn’t be surprised they picked it.&amp;nbsp; That and maybe I was one of their only submissions.&lt;/p&gt; &lt;p&gt;Due to several personal conflicts I had little time to research, but I did spend about 12 hours alone with my brain in a long car ride.&amp;nbsp; During that time I came up with a few ideas, or at least built on other people’s.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Would you hang this on your wall?&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-Ig-E6Y7erxA/TuqES1K7fdI/AAAAAAAAHBc/uJNXc-1DsJc/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-2KMsgPl7vtI/TuqEThIE_UI/AAAAAAAAHBk/9KzkLhRBBr4/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;197&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;…only a handful of people raised their hands. But this is a Jackson Pollock!&amp;nbsp; Worth millions! It’s &lt;u&gt;quality&lt;/u&gt; art!&amp;nbsp; Maybe software has something in common with art. &lt;/li&gt; &lt;li&gt;Two testing challenges that can probably not be solved by skilled in-house testers are:&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Quality is subjective. (I tip my hat to &lt;a href=&quot;http://www.developsense.com/&quot; target=&quot;_blank&quot;&gt;Michael Bolton&lt;/a&gt; and &lt;a href=&quot;http://www.geraldmweinberg.com/Site/Home.html&quot; target=&quot;_blank&quot;&gt;Jerry Weinberg&lt;/a&gt;)&lt;/li&gt; &lt;li&gt;There are an infinite amount of tests to execute. (I tip my hat to &lt;a href=&quot;http://www.satisfice.com/&quot; target=&quot;_blank&quot;&gt;James Bach&lt;/a&gt; and &lt;a href=&quot;http://www.amibugshare.com/&quot; target=&quot;_blank&quot;&gt;Robert Sabourin&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;There is a difference between acting like a user and using software. (I tip my hat to &lt;a href=&quot;http://googletesting.blogspot.com/search/label/Whittaker&quot; target=&quot;_blank&quot;&gt;James Whittaker&lt;/a&gt;).&amp;nbsp; The only way to truly measure software quality is to use the software, &lt;u&gt;as a user&lt;/u&gt;.&amp;nbsp; How else can you hit just the right tests?&lt;/li&gt; &lt;li&gt;Walking through the various test levels: Skilled testers act.&amp;nbsp; Team testers act (this is when non-testers on your product team help you test).&amp;nbsp; User acceptance testing is acting (they are still pretending to do some work).&amp;nbsp; Dogfooders…ah yes!&amp;nbsp; Dogfooders are finally not acting.&amp;nbsp; This is the first level to cross the boundary between pretending and acting.&amp;nbsp; Why not stop here?&amp;nbsp; It’s still weak in the infinite tests area.&lt;/li&gt; &lt;li&gt;The next level is crowdsource testing.&amp;nbsp; Or is it crowdsourc&lt;u&gt;ed&lt;/u&gt; testing?&amp;nbsp; I see both used frequently.&amp;nbsp; I can think of three ways to implement crowdsource testing:&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Use a crowdsource testing company.&lt;/li&gt; &lt;li&gt;Do a limited beta release.&lt;/li&gt; &lt;li&gt;Do a public beta release.&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Is crowdsource testing acting or using? If you outsource your crowdsource testing to a company (e.g., &lt;a href=&quot;http://www.utest.com/&quot; target=&quot;_blank&quot;&gt;uTest&lt;/a&gt;, &lt;a href=&quot;http://www.mob4hire.com/&quot; target=&quot;_blank&quot;&gt;Mob4hire&lt;/a&gt;, &lt;a href=&quot;http://www.topcoder.com/&quot; target=&quot;_blank&quot;&gt;TopCoder&lt;/a&gt;), now you’re hiring actors again.&amp;nbsp; However, if you do a limited or public beta release, you’re asking people to &lt;u&gt;use&lt;/u&gt; your product.&amp;nbsp; See the difference?&lt;/li&gt; &lt;li&gt;Beta…is a magic word.&amp;nbsp; It’s like stamping “draft” on the report you’re about to give your boss.&amp;nbsp; It also says, this product is alive!&amp;nbsp; New!&amp;nbsp; Exciting!&amp;nbsp; Maybe cutting edge.&amp;nbsp; It’s fixable still.&amp;nbsp; We won’t hang you out to dry.&amp;nbsp; It can only get better!&lt;/li&gt; &lt;li&gt;Who should facilitate crowdsource testing?&amp;nbsp; The skilled in-house tester. Maybe crowdsource testing is just another tool in their toolbox.&amp;nbsp; If they spent this much time executing their own tests…&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/-Dchl6NzBSqE/TuqEUD4Z4YI/AAAAAAAAHBs/nqasdXUAM8U/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-_A2BgozKZDA/TuqEUUu0TJI/AAAAAAAAHB0/usZO2BFT9-U/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;…maybe instead, they could spend this much time (blue) executing their own tests, and this much time (yellow) collecting test information from their crowd…&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-Ums4WXjxWJU/TuqEUg7U92I/AAAAAAAAHB8/iRtTHw-L_q8/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-y23_MJwIE4U/TuqEUxCIN0I/AAAAAAAAHCE/rNut1LsDHx8/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt; &lt;li&gt;How do we get feedback from the crowd?&amp;nbsp; (from least cool to coolest) The crowd calls our tech support team, virtual feedback meetings, we go find the feedback on twitter etc., the crowd provides feedback via tightly integrated feedback options on the product’s UI, we programmatically collect it in a stealthy way. &lt;/li&gt; &lt;li&gt;How do we enlist the crowd?&amp;nbsp; Via creative spin and marketing (e.g., follow Hipster’s example).&lt;/li&gt; &lt;li&gt;Which products do we crowdsource test?&amp;nbsp; NOT the mission critical ones.&amp;nbsp; We crowdsource the trivial products like entertainment or social products.&lt;/li&gt; &lt;li&gt;How far can we take this?&amp;nbsp; Far.&amp;nbsp; We can ask the crowd to build the product too.&lt;/li&gt; &lt;li&gt;What can we do now?&lt;/li&gt; &lt;ul&gt; &lt;li&gt;BA’s: determine beta candidate features.&lt;/li&gt; &lt;li&gt;Testers: spend less time testing trivial features.&amp;nbsp; Outsource those to the crowd.&lt;/li&gt; &lt;li&gt;Programmers: Decouple trivial features from critical features.&lt;/li&gt; &lt;li&gt;UX Designers: Help users find beta features and provide feedback.&lt;/li&gt; &lt;li&gt;Managers: Encourage more features to get released earlier.&lt;/li&gt; &lt;li&gt;Executives: Hire a crowdsource test czar.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;There it is in a nutshell.&amp;nbsp; Of course, the live presentation includes a bunch of fun extra stuff like the 1978 Alpo commercial that may have inspired the term “dogfooding”, as well as other theories and silliness.&lt;/p&gt;  &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8951904624959546499-3540149575115234318?l=www.testthisblog.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/EricJacobsonSoftwareTestingBlog/~4/_50LLZAJqWU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Eric Jacobson</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.testthisblog.com/</uri>
		</author>
		<source>
			<title type="html">Test This Blog - Eric Jacobson's Software Testing Blog</title>
			<subtitle type="html">Refinements on the art of software testing</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/EricJacobsonSoftwareTestingBlog"/>
			<id>tag:blogger.com,1999:blog-8951904624959546499</id>
			<updated>2012-02-08T20:47:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Why Scripted Testing is Not for Novices</title>
		<link href="http://www.satisfice.com/blog/archives/672"/>
		<id>http://www.satisfice.com/blog/?p=672</id>
		<updated>2011-12-15T21:31:32+00:00</updated>
		<content type="html">&lt;p&gt;&amp;#8230;Unless you want bad testing.&lt;/p&gt;
&lt;p&gt;Claire Moss writes:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;I am surprised that you say that scripted testing is harder for novice&lt;br /&gt;
testers. I would have expected that having so much structure around&lt;br /&gt;
the tests would make getting into testing easier for someone with less&lt;br /&gt;
experience and that the scripted instructions would make up for a lack&lt;br /&gt;
of discipline on the part of the tester.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Structure != &amp;#8220;being told what to do&amp;#8221;&lt;br /&gt;
&lt;/strong&gt;First,  you are misusing the word &amp;#8220;structure.&amp;#8221; All testing is structured. If  what you mean by structure is &amp;#8220;externally imposed structure&amp;#8221; then say  that. But even if you are not aware of a structure in your testing, it  is there. When I tell a novice tester to test, and don&amp;#8217;t tell him how to test,  he will be dominated by certain structures he is largely unaware of&amp;#8211;  or if aware he cannot verbalize or control them much. For instance: the  user interface look and feel is a guiding structure for novice testers.  They test what they see.&lt;/p&gt;
&lt;p&gt;Cognitive science offer plenty of ideas and insights about the structures that guide our thinking and behavior. See the book &lt;a href=&quot;http://www.amazon.com/Predictably-Irrational-Hidden-Forces-Decisions/dp/006135323X&quot;&gt;Predictably Irrational by Dan Ariely&lt;/a&gt; for more on this.&lt;/p&gt;
&lt;p&gt;Scripted testing always has at least two distinct parts: test design and test execution. They must be considered independently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scripted  test execution&lt;/strong&gt; is quite a bit more difficult than exploratory testing,  unless you are assuming that the tester following the script has exactly  the same knowledge and skill as the test designer (even then it is a qualitatively different sort of cognitive process than designing). An exploratory  tester is following (indeed forming as he goes) his own intentions and ideas. But,  a scripted tester, to do well, must apprehend the intent of the one who  wrote the script. Moreover, the scripted tester must go beyond the  stated intent and honor the tacit intent, as well&amp;#8211; otherwise it&amp;#8217;s just  shallow, bad testing.&lt;/p&gt;
&lt;p&gt;Try using a script to guide a 10 year-old to drive a car safely on a  busy city street. I don&amp;#8217;t believe it can be done. You can&amp;#8217;t overcome  lack of basic skills with written instructions.&lt;/p&gt;
&lt;p&gt;And sure, yeah, there is also the discipline issue, but that&amp;#8217;s a minor thing, compared to the other things.&lt;/p&gt;
&lt;p&gt;As for&lt;strong&gt; scripted test design&lt;/strong&gt;, that also is a special skill. I can ask  my son to put together a computer. He knows how to do that. But if I  were to ask him for a comprehensive step-by-step set of instructions to  allow me to do it, I doubt the result would help me much. Writing a  script requires patience, judgment, and lots of empathy for the person  who will execute it. He doesn&amp;#8217;t yet have those qualities.&lt;/p&gt;
&lt;p&gt;Most people don&amp;#8217;t like to write. They aren&amp;#8217;t motivated. Now give them a task that requires excellent writing. Bad work generally results.&lt;/p&gt;
&lt;p&gt;Both  on the design side and the execution side, scripted testing &lt;em&gt;done  adequately&lt;/em&gt; is harder than exploratory testing done adequately. It&amp;#8217;s  hard to separate an integrated cognitive activity into two pieces and  still make it work.&lt;/p&gt;
&lt;p&gt;The  reason managers assume it&amp;#8217;s simpler and easier is that they have low  standards for the quality of testing and yet a strong desire for the &lt;em&gt;appearances&lt;/em&gt; of order and productivity.&lt;/p&gt;
&lt;p&gt;When I am training a new tester, I begin with highly exploratory testing. Eventually, I will introduce elements of scripting. All skilled testers must feel comfortable with scripted testing, for those rare times when it&amp;#8217;s quite important.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;1. Start browser&lt;/p&gt;
&lt;p&gt;2. Go to CNN.com&lt;/p&gt;
&lt;p&gt;3. Test CNN.com and report any problems you find.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This looks like a script, and it is sort of a script, but the interesting details of the testing are left unspecified. One of the elements of good test scripting is to match the instructions to the level of the tester as well as to the design goal of the test. In this case, no design goal is apparent.&lt;/p&gt;
&lt;p&gt;This script does not necessarily represent bad testing&amp;#8211; because it doesn&amp;#8217;t represent any testing whatsoever.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;1. Open Notepad&lt;/p&gt;
&lt;p&gt;2. Type &amp;#8220;hello&amp;#8221;&lt;/p&gt;
&lt;p&gt;3. Verify that &amp;#8220;hello&amp;#8221; appears on the screen.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This script has the opposite problem. It specifies what is completely unnecessary to specify. If the tester follows this script, he is probably dumbing himself down. There may be some real good reason for these steps, but again, the design goal is not apparent. The tester&amp;#8217;s mind is therefore not being effectively engaged. Congratulations, designer, you&amp;#8217;ve managed to treat a sophisticated miracle of human procreation, gestation, mothering, socializing, educating, etc. as if he were the equivalent of an animated poking stick. That&amp;#8217;s like buying an iPad, then using it as a serving tray for a platter of cheese.&lt;/p&gt;</content>
		<author>
			<name>James Bach</name>
			<uri>http://www.satisfice.com/blog</uri>
		</author>
		<source>
			<title type="html">James Bach’s Blog</title>
			<subtitle type="html">The Consulting Software Tester</subtitle>
			<link rel="self" href="http://www.satisfice.com/blog/feed"/>
			<id>http://www.satisfice.com/blog/feed</id>
			<updated>2012-01-31T20:48:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Exploratory Testing is not “Experienced-Based” Testing</title>
		<link href="http://www.satisfice.com/blog/archives/664"/>
		<id>http://www.satisfice.com/blog/?p=664</id>
		<updated>2011-12-10T00:32:35+00:00</updated>
		<content type="html">&lt;p&gt;Prabhat Nayak is yet another sapient tester recently hired by the rising Indian testing powerhouse, &lt;a href=&quot;http://moolya.com/&quot;&gt;Moolya&lt;/a&gt;. Speaking of the ISTQB syllabus, he writes:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;One such disagreement of mine is they have put “Exploratory Testing” on purely experienced based testing. James, correct me if I have got ET wrong (and I am always ready to be corrected if I have misunderstood something), a novice tester who has got great cognizance and sapience and can explore things better, can think of different ways the product may fail to perform per requirement can always do a great job in ET than a 5 years experienced tester who has only learned to execute a set of test cases. That is probably one of the beauties of ET. There is of course, always an advantage of having some experience but that alone doesn’t suffice ET to be put under experienced based testing.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;You are quite correct Prabhat. Thank you for pointing this out.&lt;/p&gt;
&lt;p&gt;The shadowy cabal known as the ISTQB insulates itself from debate and criticism. They make their decisions in secret (under NDA, if you can believe it!) and they don&amp;#8217;t invite my opinion, nor anyone&amp;#8217;s opinion who has made a dedicated study of exploratory testing. That alone would be a good reason to dismiss whatever they do or claim.&lt;/p&gt;
&lt;p&gt;But this case is an especially sad example of incompetent analysis. Let me break it down:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What does &amp;#8220;experience-based&amp;#8221; mean?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Usually when people in the technical world speak of something as &amp;#8220;x-based&amp;#8221; they generally mean that it is &amp;#8220;organized according to a model of x&amp;#8221; or perhaps &amp;#8220;dominated by a consideration of x.&amp;#8221; The &amp;#8220;x&amp;#8221;, whatever it is, plays a special role in the method compared to its role in some other &amp;#8220;normal&amp;#8221; or &amp;#8220;typical&amp;#8221; method.&lt;/p&gt;
&lt;p&gt;What is a normal or typical method of software testing? I&amp;#8217;m not aware the the ISTQB explicitly takes a position on that. But by calling ET an experience-based technique, they imply that no other test technique involves the application of experience to a comparable degree. If they have intended that implication&amp;#8211; that would be a claim both remarkable and absurd. Why should any test technique not benefit from experience? Do they think that a novice tester and an experienced tester would choose the exact same tests when practicing other test techniques? Do they think there is no value to experience except when using ET? What research have they done to substantiate this opinion? I bet none.&lt;/p&gt;
&lt;p&gt;If they have not intended this implication, then by calling ET experience-based it seems to me they are merely making impressive sounds for the sake of it. They might as well have called ET &amp;#8220;breathing-based&amp;#8221; on the theory that testers will have to breathe while testing, too.&lt;/p&gt;
&lt;p&gt;Ah, but maybe there is another interpretation. They may have called ET &amp;#8220;experienced-based&amp;#8221; not to imply that ET is any more experience-based than other techniques, but rather as a warning that expresses their belief that the ONLY way ET can be valuable is through the personal heroism and mastery of the individual tester. In other words, what they meant to say was that ET is &amp;#8220;personal excellence-based&amp;#8221; testing, rather than testing whose value derives from an explicit algorithm that is objective and independent of the tester himself.&lt;/p&gt;
&lt;p&gt;I suspect that what&amp;#8217;s really going on, here: They think the other techniques are concrete and scientific, whereas ET is somehow mystical and perhaps based on the same sort of dodgy magic that you find in Narnia or MiddleEarth. They say &amp;#8220;experience-based&amp;#8221; to refer to a dark and scary forest that some enter but none ever return therefrom&amp;#8230; They say &amp;#8220;experienced-based&amp;#8221; because they have no understanding of any other basis that ET can possibly have!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why would it be difficult for Factory School testing thinkers (of which ISTQB is a product) to understand the basis of ET?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s difficult for them because Factory School people, by the force of their creed, seek to minimize the role of humanness in any technical activity. They are radical mechanizers. They are looking for algorithms instead of heuristics. They want to focus on artifacts, not thoughts or feelings or activities. They need to deny the role and value of tacit knowledge and skill. Their theory of learning was state of the art &lt;em&gt;in the 18th century&lt;/em&gt;: memorization and mimicry. Then, when they encounter ET, they look for something to memorize or mimic, and find nothing.&lt;/p&gt;
&lt;p&gt;Those of us who study ET, when we try to share it, talk a lot about cognitive science, epistemology, and modern learning theory. We talk about the importance of practice. This sounds to the Factory Schoolers like incomprehensible new agey incantations in High Elvish. They suspect we are being deliberately obscure just to keep our clients confused and intimidated.&lt;/p&gt;
&lt;p&gt;This is also what makes them want to call ET a technique, rather than an approach. I have, since the late nineties, characterized exploratory testing as an approach that applies to any technique. It is a mindset and set of behaviors that occur, to some degree, in ALL testing. To say &amp;#8220;Let&amp;#8217;s use ET, now&amp;#8221; is technically as incoherent as saying &amp;#8220;Let&amp;#8217;s use knowledge, now.&amp;#8221; You are always using knowledge, to some degree, in any work that you do. &amp;#8220;Knowledge&amp;#8221; is not a technique that you sometimes deploy. However, knowledge plays more a role in some situations and less a role in others. Knowledge is not always and equally applicable, nor is it uniformly applied even when applicable.&lt;/p&gt;
&lt;p&gt;For the Factory Schoolers to admit that ET is endemic to all testing, to some degree, would force them to admit that their ignorance of ET is largely ignorance of testing itself! They cannot allow themselves to do that. They have invested everything in the claim that they understand testing.  No, we will have to wait until those very proud and desperately self-inflated personalities retire, dry up, and blow away. The salvation of our craft will come from recruiting smart young testers into a better way of thinking about things like ET. The brain drain will eventually cause the Factory School culture to sink into the sea like a very boring version of Altantis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bottom Line: Most testing benefits from experience, but no special experience is necessary to do ET&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Exploratory testing is not a technique, so it doesn&amp;#8217;t need to be categorized alongside techniques. However, a more appropriate way to characterize ET, if you want to charactize it in some way, is to call it self-managed and self-structured (as opposed to externally managed and externally structured). It is testing wherein the design part of the process and the execution part of the process are parallel and interactive.&lt;/p&gt;
&lt;p&gt;You know what else is self-managed and self-structured? &lt;em&gt;Learning how to walk and talk.&lt;/em&gt; Does anyone suggest that only &amp;#8220;experienced people&amp;#8221; should be allowed to do that?&lt;/p&gt;</content>
		<author>
			<name>James Bach</name>
			<uri>http://www.satisfice.com/blog</uri>
		</author>
		<source>
			<title type="html">James Bach’s Blog</title>
			<subtitle type="html">The Consulting Software Tester</subtitle>
			<link rel="self" href="http://www.satisfice.com/blog/feed"/>
			<id>http://www.satisfice.com/blog/feed</id>
			<updated>2012-01-31T20:48:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Gradle Tip: Start/Stop Embedded Jetty for System Tests</title>
		<link href="http://blog.james-carr.org/2011/12/06/gradle-tip-startstop-embedded-jetty-for-system-tests/"/>
		<id>http://blog.james-carr.org/?p=1306</id>
		<updated>2011-12-06T23:18:31+00:00</updated>
		<content type="html">&lt;p&gt;I thought I&amp;#8217;d share another feature of &lt;a href=&quot;http://gradle.org&quot;&gt;gradle&lt;/a&gt; that i have found extremely useful, starting and stopping an embedded jetty server when my tests run. This is really useful for projects that host web services as it allows me to hit them and very the correct results plus it verifies the full stack is configured correctly. One could quite possibly also use this setup on web projects and have &lt;a href=&quot;http://www.gebish.org/&quot;&gt;Geb&lt;/a&gt; based tests run against their project.&lt;/p&gt;
&lt;p&gt;Given a project setup using the jetty plugin as I described in my &lt;a href=&quot;http://blog.james-carr.org/2011/11/27/gradle-using-jndi-with-the-jetty-plugin/&quot;&gt;previous post&lt;/a&gt;, all you need to do is hook jetty into run before and after the test task:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;And that&amp;#8217;s it. Now whenever you run &lt;code&gt;gradle test&lt;/code&gt; the embedded jetty server will run along with your tests. &lt;/p&gt;</content>
		<author>
			<name>James Carr</name>
			<uri>http://blog.james-carr.org</uri>
		</author>
		<source>
			<title type="html">James Carr</title>
			<subtitle type="html">Rants and Musings of an Agile Developer</subtitle>
			<link rel="self" href="http://blog.james-carr.org/feed/"/>
			<id>http://blog.james-carr.org/feed/</id>
			<updated>2012-01-29T20:47:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Shapes of Actions</title>
		<link href="http://www.developsense.com/blog/2011/12/shapes-of-actions/"/>
		<id>http://www.developsense.com/blog/?p=1063</id>
		<updated>2011-12-05T20:33:06+00:00</updated>
		<content type="html">&lt;p&gt;In the spring of 2010, I was privileged to have a conversation with &lt;a href=&quot;http://en.wikipedia.org/wiki/Simon_Schaffer&quot; target=&quot;_blank&quot;&gt;Simon Schaffer&lt;/a&gt;, who pointed me to the work of a sociologist and philosopher of science named &lt;a href=&quot;http://en.wikipedia.org/wiki/Harry_Collins&quot; target=&quot;_blank&quot;&gt;Harry Collins&lt;/a&gt;. This year, I discovered and read Collins&amp;#8217; new book, &lt;a href=&quot;http://www.amazon.com/Tacit-Explicit-Knowledge-Harry-Collins/dp/0226113809&quot; title=&quot;Tacit and Explicit Knowledge&quot; target=&quot;_blank&quot;&gt;Tacit and Explicit Knowledge&lt;/a&gt;, and a somewhat older book, &lt;a href=&quot;http://www.amazon.com/Shape-Actions-What-Humans-Machines/dp/0262032570&quot; target=&quot;_blank&quot;&gt;The Shape of Actions&lt;/a&gt; (co-authored with Martin Kusch). My colleague &lt;a href=&quot;http://www.satifice.com&quot; title=&quot;James Bach&quot; target=&quot;_blank&quot;&gt;James Bach&lt;/a&gt; and I believe that these books have great significance in terms of the way we understand, practice, learn, and teach the craft of testing.  Three ideas in particular stand out: a distinction between two kinds of actions; a distinction between three types of tacit knowledge; and the notion of repair, whereby people fix up interactions with each other and with our media&amp;mdash;and particularly with our machines.  Today, I&amp;#8217;ll talk about shapes of actions.&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;The Shape of Actions&lt;/em&gt;, Collins and Kusch describe key differences between two kinds of intentional human actions that they call &lt;em&gt;mimeomorphic&lt;/em&gt; and &lt;em&gt;polimorphic&lt;/em&gt;. In both words, &amp;#8220;morph&amp;#8221; refers to shape, or form. &amp;#8220;Mimeo-&amp;#8221; refers to copying. (The grey-haired among us may remember that stencil printing machines used to be called mimeographs.)  &lt;em&gt;Mimeomorphic actions&lt;/em&gt; are actions that we want to do the same way every time, almost as though we were machines. Collins and Kusch use the example of a golf swing, a kind of action in which we want to eliminate variation and emphasize precision, regularity, and smoothness.  &amp;#8220;Poli-&amp;#8221; is a pun, referring to two similar-sounding Greek roots.  The Greek word &lt;em&gt;polys&lt;/em&gt; refers to many, much, or several. The Greek &lt;em&gt;polis&lt;/em&gt;&amp;mdash;a different word entirely&amp;mdash; literally means the city, so Collins and Kusch use &amp;#8220;poli-&amp;#8221; to emphasize the collective and diversified nature of human actions.  &lt;em&gt;Polimorphic actions&lt;/em&gt; are naturally and appropriately variable, and are rooted in social and human interactions and goals. Conversation is a canonical example of polimorphic action.  &lt;/p&gt;
&lt;p&gt;Most human life and human value is centred around polimorphic actions. Still, in many actions, there&amp;#8217;s an interplay between the mimeomorphic and the polimorphic. Shifting gears, when performed by a human driver, is something that we almost always want to do smoothly, regularly, mechanically, and (most of the time) below the level of consciousness. Indeed, the majority of North American drivers delegate the mimeomorphic action of gear shifting to mechanisms in the car itself.&lt;/p&gt;
&lt;p&gt;Making shifting into a mimeomophic action provides support for the parts of driving that are decidedly &lt;em&gt;not&lt;/em&gt; mimeomorphic: merging into traffic, negotiating a left turn, and knowing when to break the letter of traffic laws while maintaining their spirit. Polimorphic actions are handled differently in different places, based on different social paradigms and performed for different purposes. Collins and Kusch note that in some parts of the world (Britain and North America, for example), responsibility for safety is governed by the idea of people &lt;em&gt;following the rules&lt;/em&gt;, &amp;#8220;violations from the rules of orderly flow being met with expressions of rage&amp;#8221;. In &lt;em&gt;Tacit and Explicit Knowledge&lt;/em&gt;, Collins point out that in other parts of the world (China, India), responsibility for safety is rooted in the collective, and is governed by the idea of drivers &lt;em&gt;expecting the unexpected&lt;/em&gt;.  To drivers from the West, drivers from these parts of the world drive in ways that we would consider suicidal or sociopathic. Equally surprisingly to us, people in China and India deal with this style of driving without getting upset or even remarking on it.&lt;/p&gt;
&lt;p&gt;All this reminds me of the passage, written by &lt;a href=&quot;http://www.kaner.com&quot; title=&quot;Cem Kaner&quot; target=&quot;_blank&quot;&gt;Cem Kaner&lt;/a&gt;, in the preface of &lt;a href=&quot;http://www.amazon.com/Testing-Computer-Software-2nd-Kaner/dp/0471358460&quot; title=&quot;Testing Computer Software&quot; target=&quot;_blank&quot;&gt;Testing Computer Software&lt;/a&gt;: &lt;/p&gt;
&lt;p class=&quot;citation&quot;&gt;Some books say that if our projects are not “properly” controlled, if our written specifications are not always complete and up to date, if our code is not properly organized according to whatever methodology is fashionable, then, well, they should be. These books talk about testing when everyone else plays “by the rules.&amp;#8221;&lt;/p&gt;
&lt;p class=&quot;citation&quot;&gt;This book is about doing testing when your coworkers don’t, won’t and don’t have to follow the rules.&lt;/p&gt;
&lt;p class=&quot;citation&quot;&gt;Consumer software projects are often characterized by a budget that is too small, a staff that is too small, a deadline that is too soon and which can’t be postponed for as long as it should be, and by a shared vision and a shared commitment among the developers.&lt;/p&gt;
&lt;p class=&quot;citation&quot;&gt;The quality of a great product lies in the hands of the individuals designing, programming, testing, and documenting it, each of whom counts. Standards, specifications, committees, and change controls will not assure quality, nor do software houses rely on them to play that role. It is the commitment of the individuals to excellence, their mastery of the tools of their crafts, and their ability to work together that makes the product, not the rules.&lt;/p&gt;
&lt;p&gt;That is:  software development is a polimorphic activity, and if that&amp;#8217;s true, testing needs to respond accordingly.&lt;/p&gt;
&lt;p&gt;Software development involves mostly polimorphic actions, but some mimeomorphic actions help it along. Compiling a program is so much of a mimeomorphic action that these days we delegate it entirely to machines. Typing is mimeomorphic; we learn to touch-type mimeomorphically so that we can develop programs without the mechanics of typing getting in the way. Programming coaches and programming groups often mandate programmers to develop a specific style of indentation and punctuation to reduce overhead in reading and parsing code, and they mandate exercises or policies to make the regularity automatic. Even though code is designed to be &lt;em&gt;run&lt;/em&gt; mimeomorphically, developing it, maintaining it, and interpreting it when things go wrong are all polimorphic actions.&lt;/p&gt;
&lt;p&gt;Mimeomorphic activities tend to be easy to observe, so they tend to be easy to identify and to explicate. As a result, conversation, writing, and training in testing has tended to focus on artifacts, on documents, on procedures, and on things that can be automated&amp;mdash;the mimeomorphic actions. Those conversations, writings, and training programs almost entirely ignore aspects of testing that are much less visible yet are far more important. This, I believe, is why so many people in our craft talk about writing test cases that are easily described as mimeomorphic actions. Those same people seem to spend little time in discussing &lt;em&gt;how to test&lt;/em&gt;, which is composed mostly of polimorphic actions. The challenges of understanding polimorphic actions&amp;mdash;combined with the ease of observing and describing mimeomorphic actions&amp;mdash;explains why so many people confuse testing with checking. Those challenges explain why people credit Cucumber and its given/when/then formulas much more quickly than they credit the conversations that surround it. Those challenges explain why lowering cost by outsourcing checking work dominates the idea of increasing value by developing local testing skill. And those challenges explain why automation is often seen as some kind of silver bullet for testing problems.&lt;/p&gt;
&lt;p&gt;Polimorphic actions are often based on tacit knowledge, different ways of valuing things, and social contexts. Collins notes that polimorphic actions &lt;/p&gt;
&lt;p class=&quot;citation&quot;&gt;&amp;#8220;can only be executed successfully by a person who understands the social context. Copying the visible behaviour that is the counterpart of an observed action is unlikely to reproduce the action unless it is a mimeomorphic action, because in the case of polimorphic actions, the right behavioural instantiations will change with context.  Here &lt;em&gt;(that is, in the book &lt;strong&gt;Tacit and Explicit Knowledge&lt;/strong&gt; &amp;#8211;MB)&lt;/em&gt; it will be concluded that, for now and the foreseeable future, polimorphic actions&amp;mdash;and only polimorphic actions&amp;mdash;remain outside the domain of the explicable, whichever of the four possible ways &amp;#8216;explicable&amp;#8217; is defined. This has significance for the success of different kinds of machines and for the way we teach.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Watch for a lot more discussion of polimorphic and mimeomorphic actions in the next few blog posts.  Watch also for such discussion to work its way into the ways that James and I teach rapid testing.&lt;/p&gt;</content>
		<author>
			<name>Michael</name>
			<uri>http://www.developsense.com/blog</uri>
		</author>
		<source>
			<title type="html">Developsense Blog</title>
			<subtitle type="html">DevelopSense Blog</subtitle>
			<link rel="self" href="http://www.developsense.com/blog/feed/atom/"/>
			<id>http://www.developsense.com/blog/feed/atom/</id>
			<updated>2012-02-08T20:48:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">From the mailbox: selecting test automation tools</title>
		<link href="http://testobsessed.com/blog/2011/12/01/selecting-test-automation-tools/"/>
		<id>http://testobsessed.com/?p=746</id>
		<updated>2011-12-01T03:47:45+00:00</updated>
		<content type="html">&lt;p&gt;A long time ago, all the way back in 1999, I wrote an article on selecting GUI test automation tools. Someone recently found it and wrote me an email to ask about getting help with evaluating tools. I decided my response might be useful for other people trying to choose tools, so I turned it into a blog post.&lt;/p&gt;
&lt;p&gt;By the way, so much has changed since my article on GUI testing tools was published back in 1999 that my approach is a little different these days. There are so many options available now that weren&amp;#8217;t 12 years ago, and there are new options appearing nearly every day it seems.&lt;/p&gt;
&lt;p&gt;Back in 1999 I advocated a heavy-weight evaluation process. I helped companies evaluate commercial tools, and at the time it made sense to spend lots of time and money on the evaluation process. The cost of making a mistake in tool selection was too high.&lt;/p&gt;
&lt;p&gt;After all, once we chose a tool we would have to pay for it, and that licensing fee became a sunk cost. Further, the cost of switching between tools was exorbitant. Tests were tool-specific and could not move from one tool to another. Thus we&amp;#8217;d have to throw away anything we created in Tool A if we later decided to adopt Tool B. Further, any new tool would cost even more money in licensing fees. So spending a month evaluating tools before making a 6-figure investment made sense.&lt;/p&gt;
&lt;p&gt;But now the market has changed. Open source tools are surpassing commercial tools, so the license fee is less of an issue. There are still commercial tools, but I always recommend looking at the open source tools first to see if there&amp;#8217;s anything that fits before diving into commercial tool evaluations.&lt;/p&gt;
&lt;p&gt;So here&amp;#8217;s my quick and dirty guide to test tool selection.&lt;/p&gt;
&lt;p&gt;If you want a tool to do functional test automation (as opposed to unit testing), you will probably need both a framework and a driver.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;framework&lt;/strong&gt; is responsible for defining the format of the tests, making the connection between the tests and test automation code, executing the tests, and reporting results.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;driver&lt;/strong&gt; is responsible for manipulating the interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, for example, on my side project entaggle.com, I use Cucumber (framework) with Capybara (driver).&lt;/p&gt;
&lt;p&gt;To decide what combination of framework(s) and driver(s) are right for your context&amp;#8230;&lt;/p&gt;
&lt;h3&gt;Step 1. Identify possible frameworks&amp;#8230;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Consideration #1: Test Format&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The first thing to consider is if you need a framework that supports expressing tests in a natural language (e.g. English), or in code.&lt;/p&gt;
&lt;p&gt;This is a question for the whole team, not just the testers or programmers. Everyone on the project must be able to at least read the functional tests. Done well, the tests can become executable requirements. So the functional testing framework needs to support test formats that work for collaboration across the whole team.&lt;/p&gt;
&lt;p&gt;Instead of assuming what the various stakeholders want to see, ask them.&lt;/p&gt;
&lt;p&gt;In particular, if you are contemplating expressing tests in code, make very sure to ask the business stakeholders how they feel about that. And I don&amp;#8217;t mean ask them like, &amp;#8220;Hey, you don&amp;#8217;t mind the occasional semi-colon, right? It&amp;#8217;s no big deal, right? I mean, you&amp;#8217;re SMART ENOUGH to read CODE, right?&amp;#8221; That kind of questioning backs the business stakeholders into a corner. They might say, &amp;#8220;OK,&amp;#8221; but it&amp;#8217;s only because they&amp;#8217;ve been bullied.&lt;/p&gt;
&lt;p&gt;I mean mock up some samples and ask like this: &amp;#8220;Hey, here&amp;#8217;s an example of some tests for our system written in a framework we&amp;#8217;re considering using. Can you read this? What do you think it&amp;#8217;s testing?&amp;#8221; If they are comfortable with the tests, the format is probably going to work. If not, consider other frameworks.&lt;/p&gt;
&lt;p&gt;Note that the reason that it&amp;#8217;s useful to express expectations in English isn&amp;#8217;t to dumb down the tests. This isn&amp;#8217;t about making it possible for non-technical people to do all the automation.&lt;/p&gt;
&lt;p&gt;Even with frameworks that express tests in natural language, There is still programming involved. Test automation is still inherently about programming.&lt;/p&gt;
&lt;p&gt;But by separating the essence of the tests from the test support code, we&amp;#8217;re able to separate the concerns in a way that makes it easier to collaborate on the tests, and further the tests become more maintainable and reusable.&lt;/p&gt;
&lt;p&gt;When I explain all that, people sometimes ask me, &amp;#8220;OK, that&amp;#8217;s fine, but what&amp;#8217;s the EASIEST test automation tool to learn?&amp;#8221; Usually they&amp;#8217;re thinking that &amp;#8220;easy&amp;#8221; is synonymous with &amp;#8220;record and playback.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Such kinds of easy paths may look inviting, but it&amp;#8217;s a trap leads into a deep dark swamp from which there may be no escape. None of the tools I&amp;#8217;ve talked about do record and playback. Yes, there is a Selenium recorder. I do not recommend using it except as a way to learn.&lt;/p&gt;
&lt;p&gt;So natural language tests facilitate collaboration. But I&amp;#8217;ve seen organizations write acceptance tests in Java with JUnit using Selenium as the driver and still get a high degree of collaboration. The important thing is the collaboration, not the test format.&lt;/p&gt;
&lt;p&gt;In fact, there are advantages to expressing tests in code.&lt;/p&gt;
&lt;p&gt;Using the same unit testing framework for the functional tests and the code-facing tests removes one layer of abstraction. That can reduce the complexity of the tests and make it easier for the technical folks to create and update the tests.&lt;/p&gt;
&lt;p&gt;But the times I have seen this work well for the organization is when the business people were all technology savvy so they were able to read the tests just fine even when expressed in Java rather than English.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Consideration #2: Programming Language&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The next consideration is the production code language.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot;&gt;&lt;strong&gt;If your production code is written in&amp;#8230;&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot;&gt;&lt;strong&gt;And you want to express expectations in natural language, consider&amp;#8230;&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot;&gt;&lt;strong&gt;Or you want to express expectations in code, consider&amp;#8230;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot;&gt;Java&lt;/td&gt;
&lt;td valign=&quot;top&quot;&gt;Robot Framework, JBehave, Fitnesse, Concordion&lt;/td&gt;
&lt;td valign=&quot;top&quot;&gt;JUnit, TestNG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot;&gt;Ruby&lt;/td&gt;
&lt;td valign=&quot;top&quot;&gt;Cucumber&lt;/td&gt;
&lt;td valign=&quot;top&quot;&gt;Test::Unit, RSpec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot;&gt;.NET&lt;/td&gt;
&lt;td valign=&quot;top&quot;&gt;Specflow&lt;/td&gt;
&lt;td valign=&quot;top&quot;&gt;NUnit&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;By the way, the tools I&amp;#8217;ve mentioned so far are not even remotely close to a comprehensive list. There are lots more tools listed on the &lt;a title=&quot;AA-FTT Tools Spreadsheet&quot; href=&quot;http://bit.ly/aaftt-tools&quot;&gt;AA-FTT spreadsheet&lt;/a&gt;. (The AA-FTT is the Agile Alliance Functional Testing Tools group. It&amp;#8217;s a program of the Agile Alliance. The spreadsheet came out of work that the AA-FTT community did. If you need help interpreting the spreadsheet, you can ask questions about it on the &lt;a title=&quot;AA-FTT Mail List&quot; href=&quot;http://tech.groups.yahoo.com/group/aa-ftt/&quot;&gt;AA-FTT mail list&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;So, why consider the language that the production code is written in? I advocate choosing a tool that will allow you to write the test automation code in the same language (or at least one of the same languages if there are several) as the production code for a number of reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The programmers will already know the language. This is a huge boon for getting the programmers to collaborate on functional test automation.&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s probably a real programming language with a real IDE that supports automated refactoring and other kinds of good programming groovy-ness. It&amp;#8217;s critical to treat test automation code with the same level of care as production code. Test automation code should be well factored to increase maintainability, remove duplication, and exhibit &lt;a href=&quot;http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29&quot;&gt;SOLID principles&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;It increases the probability that you&amp;#8217;ll be able to bypass the GUI for setting up conditions and data. You may even be able to leverage test helper code from the unit tests. For example, on entaggle.com, I have some data generation code that is shared between the unit tests and the acceptance tests. Such reuse drastically cuts down on the cost of creating and maintaining automated tests.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Consideration #3: The Ecosystem&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Finally, as you are considering frameworks, consider also the ecosystem in which that framework will live. I personally dismiss any test framework that does not play nicely with both the source control system and the automated build process or continuous integration server. That means at a bare minimum:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All assets must be flat files, no binaries. So no assets stored in databases, and no XLS spreadsheets (though comma separated values or .CSV files can be OK). In short, if you can&amp;#8217;t read all the assets in a plain old text editor like Notepad, you&amp;#8217;re going to run into problems with versioning.&lt;/li&gt;
&lt;li&gt;It can execute from a command line and return an exit code of 0 if everything passes or some other number if there&amp;#8217;s a failure. (You may need more than this to kick off the tests from the automated build and report results, but the exit code criteria is absolutely critical.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Step 2. Choose your driver(s)&amp;#8230;&lt;/h3&gt;
&lt;p&gt;A driver is just a library that knows how to manipulate the interface you&amp;#8217;re testing against. You may actually need more than one driver depending on the interfaces in the system you&amp;#8217;re testing. You might need one driver to handle web stuff while another driver can manipulate Windows apps.&lt;/p&gt;
&lt;p&gt;Note that the awesome thing about the way test tools work these days is that you can use multiple drivers with any given functional testing framework. In fact, you can use multiple drivers all in a single test. Or you can have a test that executes against multiple interfaces. Not a copy of the test, but actually the same test. By separating concerns, separating the framework from the driver, we make it possible for tests to be completely driver agnostic.&lt;/p&gt;
&lt;p&gt;Choosing drivers is often a matter of just finding the most popular driver for your particular technical context. It&amp;#8217;s hard for me to offer advice on which drivers are good because there are so many more drivers available than I know about. Most of the work I do these days is web-based. So I use Selenium / WebDriver.&lt;/p&gt;
&lt;p&gt;To find a specific driver for a specific kind of interface, look at the tools spreadsheet or ask on the AA-FTT mail list.&lt;br /&gt;
&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Step 3. Experiment&lt;/h3&gt;
&lt;p&gt;Don&amp;#8217;t worry about choosing The One Right tool. Choose something that fits your basic criteria and see how it works in practice. These days it&amp;#8217;s so much less costly to experiment and see how things go working with the tool on real stuff than to do an extensive tool evaluation.&lt;/p&gt;
&lt;p&gt;How can this possibly be? First, lots of organizations are figuring out that the licensing costs are no longer an issue. Open source tools rule. Better yet, if you go with a tool that lets you express tests in natural language it&amp;#8217;s really not that hard to convert tests from one framework to another. I converted a small set of Robot Framework tests to Cucumber and it took me almost no time to convert the tests themselves. The formats were remarkably similar. The test automation code took a little longer, but there was less of it.&lt;/p&gt;
&lt;p&gt;Given that the cost of making a mistake on tool choice is so low, I recommend experimenting freely. Try a tool for a couple weeks on real tests for your real project. If it works well for the team, awesome. If not, try a different one.&lt;/p&gt;
&lt;p&gt;But whatever you do, don&amp;#8217;t spend a month (or more) in meetings speculating about what tools will work. Just pick something to start with so you can try and see right away. (As you all know, empirical evidence trumps speculation. &lt;img src=&quot;http://testobsessed.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; )&lt;/p&gt;
&lt;p&gt;Eventually, if you are in a larger organization, you might find that a proliferation of testing frameworks becomes a problem. It may be necessary to reduce the number of technologies that have to be supported and make reporting consistent across teams.&lt;/p&gt;
&lt;p&gt;But beware premature standardization. Back in 1999, choosing a single tool gave large organizations an economy of scale. They could negotiate better deals on licenses and run everyone through the same training classes. Such economies of scale are evaporating in the open source world where license deals are irrelevant and training is much more likely to be informal and community-based.&lt;/p&gt;
&lt;p&gt;So even in a large organization I advocate experimenting extensively before standardizing.&lt;/p&gt;
&lt;p&gt;Also, it&amp;#8217;s worth noting that while I can see a need to standardize on a testing framework, I see much less need to standardize on drivers. So be careful about what aspects of the test automation ecosystem you standardize on.&lt;/p&gt;
&lt;p&gt;Good luck and happy automating&amp;#8230;&lt;/p&gt;</content>
		<author>
			<name>Elisabeth Hendrickson</name>
			<uri>http://testobsessed.com</uri>
		</author>
		<source>
			<title type="html">Test Obsessed</title>
			<subtitle type="html">Because empirical evidence trumps speculation. Every. Single. Time. (Elisabeth Hendrickson's thoughts on Agile, Testing, and Agile Testing.)</subtitle>
			<link rel="self" href="http://testobsessed.com/feed/"/>
			<id>http://testobsessed.com/feed/</id>
			<updated>2012-01-21T20:47:54+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Disposable Programs</title>
		<link href="http://secretsofconsulting.blogspot.com/2011/11/disposable-programs.html"/>
		<id>tag:blogger.com,1999:blog-25922407.post-8618448661940268770</id>
		<updated>2011-11-30T14:42:13+00:00</updated>
		<content type="html">In many IT installations today, the number one problem is program maintenance.&lt;br /&gt;Although the total problem is far from simple, there are a number of relatively simple ideas that can be applied immediately to furnish &quot;prompt relief.&quot; One such idea is the disposable program.&lt;br /&gt;&lt;br /&gt;The idea of disposable programs is not new. Every programmer has written code that was to be used once and then thrown away—codes such as:&lt;br /&gt;&lt;br /&gt;1. First-cut subroutines, as for simple, quick formatting of output.&lt;br /&gt;&lt;br /&gt;2. One-time reports.&lt;br /&gt;&lt;br /&gt;3. Test drivers.&lt;br /&gt;&lt;br /&gt;4. Research programs to probe some peculiar feature of the programming language, operating system, database, or other &quot;black box.&quot;&lt;br /&gt;&lt;br /&gt;5. Engineering assist programs, to help diagnose a particular hardware malfunction.&lt;br /&gt;&lt;br /&gt;If you consider these ﬁve examples relative to your own experience, you will notice two categories:&lt;br /&gt;&lt;br /&gt;KEPT: ﬁrst-cut routines, and one-time reports, and&lt;br /&gt;&lt;br /&gt;DISPOSED: test drivers, research programs, and hardware testers. That is, though all are thought of as single use programs, the KEPT routines tend to be held, somewhere, &quot;just in case.&quot; Only the DISPOSED programs are actually discarded, whether they should be or not.&lt;br /&gt;&lt;br /&gt;Can you recall an instance when you wished you had actually retained a discarded program?&lt;br /&gt;&lt;br /&gt;And can you recall cases of KEPT programs you devoutly wish you had destroyed when you had the chance? These are the programs you see and curse almost every day, as their user phones, pleading for &quot;just one little change.&quot;&lt;br /&gt;&lt;br /&gt;Perhaps we would immediately begin improving the maintenance situation by applying two simple rules about &quot;one- time&quot; programs:&lt;br /&gt;&lt;br /&gt;1. If you are about to throw it away, keep it.&lt;br /&gt;&lt;br /&gt;2. If you are about to keep it, throw it away.&lt;br /&gt;&lt;br /&gt;Unfortunately, applying these two rules together creates an inﬁnite recursion. All programmers would be instantly paralyzed. There must be a better way. (Or do you believe that instant paralysis of all programmers would be of great benefit to the human species?)&lt;br /&gt;&lt;br /&gt;Consider the examples once again; you'll notice that the underlying principle seems to be:&lt;br /&gt;&lt;br /&gt;If the programmer is responsible for the decision, the program is discarded; but if the user is responsible the program is kept.&lt;br /&gt;&lt;br /&gt;But why not just keep all programs, for all time? There are many reasons why a program brought out of hibernation could incur costs:&lt;br /&gt;&lt;br /&gt;1. The hardware environment has changed.&lt;br /&gt;&lt;br /&gt;2. The system software environment has changed.&lt;br /&gt;&lt;br /&gt;3. The size or format of the data has changed.&lt;br /&gt;&lt;br /&gt;4. The human environment has changed.&lt;br /&gt;&lt;br /&gt;5. Some part of the program or its supporting material has been lost or damaged.&lt;br /&gt;&lt;br /&gt;So it does cost to rerun an &quot;unchanged&quot; program, and the longer the period of hibernation, the greater the cost. But you already knew this—we all know this. Then why, oh why, do we keep tumbling into the same trap? And how do we get out, or stay out, of the trap.&lt;br /&gt;&lt;br /&gt;Well, we'll watch for readers' ideas on these questions, and next blog entry, I'll give a few ideas of my own.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/25922407-8618448661940268770?l=secretsofconsulting.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Gerald M. Weinberg</name>
			<email>noreply@blogger.com</email>
			<uri>http://secretsofconsulting.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Gerald Weinberg's Secrets of Writing and Consulting</title>
			<subtitle type="html">This blog is a continuation of my books, &lt;a href=&quot;http://www.geraldmweinberg.com/Site/Consulting_Secrets.html&quot;&gt;The Secrets of Consulting&lt;/a&gt;, &lt;a href=&quot;http://www.geraldmweinberg.com/Site/More_Secrets.html&quot;&gt;More Secrets of Consulting&lt;/a&gt;, and &lt;a href=&quot;http://www.geraldmweinberg.com/Site/On_Writing.html&quot;&gt;Weinberg on Writing: The Fieldstone Method&lt;/a&gt; as well as my work at &lt;a href=&quot;http://ayeconference.com/&quot;&gt;the AYE Conference&lt;/a&gt;</subtitle>
			<link rel="self" href="http://secretsofconsulting.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-25922407</id>
			<updated>2012-02-08T14:48:37+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">STARwest 2011 Lightning Talk Keynotes</title>
		<link href="http://feedproxy.google.com/~r/EricJacobsonSoftwareTestingBlog/~3/PfGyGM4Lxfo/starwest-2011-lightning-talk-keynotes.html"/>
		<id>tag:blogger.com,1999:blog-8951904624959546499.post-8567690973792386571</id>
		<updated>2011-11-28T17:28:00+00:00</updated>
		<content type="html">&lt;p&gt;If there were a testing conference that consisted of only lightning talks, I would be the first to sign up.&amp;nbsp; Maybe I have a short attention span or something.&amp;nbsp; STARwest’s spin on lightning talks is “Lightning Talk Keynotes” in which (I assume) Lee Copeland handpicks lightning talk presenters.&amp;nbsp; He did not disappoint.&amp;nbsp; Here is my summary:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Michael Bolton&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Michael started with RST’s formal definition of a Bug: “anything that threatens the value of the product”.&amp;nbsp; Then he shared his definition of an Issue: “anything that threatens the value of the testing” (e.g., a tool I need, a skill I need).&amp;nbsp; Finally, Bolton suggested, maybe issues are more important than bugs, because issues give bugs a place to hide.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Hans Buwalda&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;His main point was, “It’s the test, stupid”.&amp;nbsp; Hans suggested, when test automation takes place on teams, it’s important to separate the testers from the test automation engineers.&amp;nbsp; Don’t let the engineers dominate the process because no matter how fancy the programming is, what it tests is still more important.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Lee Copeland&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Lee asked his wife why she cuts the ends off her roasts, and lays them against the long side of the roast, before cooking them.&amp;nbsp; She wasn’t sure because she learned it from her mother.&amp;nbsp; So they asked her mother why she cuts the ends off her roasts.&amp;nbsp; Her mother had the same answer so they asked her grandmother.&amp;nbsp; Her grandmother said, “Oh, that’s because my oven is too narrow to fit the whole roast in it”.&lt;/p&gt; &lt;p&gt;Lee suggested most processes begin with “if…then” statements (e.g., if the software is difficult to update, then we need specs).&amp;nbsp; But over time, the “if” part fades away.&amp;nbsp; Finally, Lee half-seriously suggested all processes should have a sunset clause.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Dale Emory&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;If an expert witness makes a single error, out of an otherwise perfect testimony, it raises doubts in the juror's minds.&amp;nbsp; If 1 out of 800 automated tests throws a false positive, people accept that.&amp;nbsp; If it keeps happening, people loose faith in the tests and stop using them.&amp;nbsp; Dales suggests the following prioritized way of preventing the above:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Remove the test.  &lt;li&gt;Try to fix the test.  &lt;li&gt;If you are sure it works properly, add it back to the suite.&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;In summary, Dale suggests, reliability of the test suite is more important then coverage.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Julie Gardiner&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Julie showed a picture of one of those sliding piece puzzles; the kind with one empty slot so adjacent pieces can slide into it.&amp;nbsp; She pointed out that this puzzle could not be solved if it weren’t for the empty slot.&lt;/p&gt; &lt;p&gt;Julie suggested slack is essential for improvement, innovation, and morale and that teams may want to stop striving for 100% efficiency.&lt;/p&gt; &lt;p&gt;Julie calls this “the myth of 100% efficiency”.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Note: as a fun gimmicky add-on, she offered to give said puzzle to anyone that went up to her after her lightning talk to discuss it with her.&amp;nbsp; I got one!&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Bob Galen&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Sorry, I didn’t take any notes other than “You know you’ve arrived when people are pulling you”.&amp;nbsp; Either it was so compelling I didn’t have time to take notes, or I missed the take-away.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Dorothy Graham&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Per Dorothy, coverage is a measure of some aspect of thoroughness.&amp;nbsp; 100% coverage does not mean running 100% of all the tests we’ve thought of.&amp;nbsp; Coverage is not a relationship between the tests and themselves.&amp;nbsp; Instead, it is a relationship between the tests and the product under test.&lt;/p&gt; &lt;p&gt;Dorothy suggests, whenever you hear “coverage”, ask “Of what?”.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Jeff Payne&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Jeff began by suggesting, “If you’re a tester and don’t know how to code in 5 years, you’ll be out of a job”.&amp;nbsp; He said 80% of all tester job posts require coding and this is because we need more automated tests.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Martin Pol&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;My notes are brief here but I believe Martin was suggesting, in the near future, testers will need to focus more on non-functional tests.&amp;nbsp; The example Martin gave is the cloud; if the cloud goes down, your services (dependent on the cloud) will be unavailable.&amp;nbsp; This is an example of an extra dependency that comes with using future technology (i.e., the cloud).&lt;/p&gt;  &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8951904624959546499-8567690973792386571?l=www.testthisblog.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/EricJacobsonSoftwareTestingBlog/~4/PfGyGM4Lxfo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Eric Jacobson</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.testthisblog.com/</uri>
		</author>
		<source>
			<title type="html">Test This Blog - Eric Jacobson's Software Testing Blog</title>
			<subtitle type="html">Refinements on the art of software testing</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/EricJacobsonSoftwareTestingBlog"/>
			<id>tag:blogger.com,1999:blog-8951904624959546499</id>
			<updated>2012-02-08T20:47:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Gradle: Using JNDI with the Jetty Plugin</title>
		<link href="http://blog.james-carr.org/2011/11/27/gradle-using-jndi-with-the-jetty-plugin/"/>
		<id>http://blog.james-carr.org/?p=1309</id>
		<updated>2011-11-27T17:06:16+00:00</updated>
		<content type="html">&lt;p&gt;I use &lt;a href=&quot;http://gradle.org&quot;&gt;gradle&lt;/a&gt; a lot at work and I believe one discovery that was a true win was discovering how to fake JNDI when using the jettyRun task for local development.  Originally googling and searching the documentation didn&amp;#8217;t yield anything so I thought I&amp;#8217;d write a quick post detailing how to do it in case you&amp;#8217;re like me and googling for the same thing.&lt;/p&gt;
&lt;p&gt;First off you need to create a &lt;a href=&quot;http://docs.codehaus.org/display/JETTY/jetty-env.xml&quot;&gt;jetty-env configuration&lt;/a&gt; file and put it somewhere in your project (I prefer src/test/resources). Here&amp;#8217;s a sample of one I use that uses H2 for the dataSource:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This uses an already running H2 instance and runs an init script located in src/test/resources for populating the database with some tables. From our gradle script we need to reference the file from the jettyRun task (I also add it to the jettyRunWar task as well).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Finally, to complete this example, we want H2 running before jetty kicks off. So we add the h2 dependency to our build script and run the main method of &lt;code&gt;org.h2.tools.Server&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve created a &lt;a href=&quot;https://github.com/jamescarr/gradle-jetty-h2&quot;&gt;sample spring MVC 3 project&lt;/a&gt; that makes use of all the above for local development. Just clone it and run &lt;code&gt;gradle jettyRun&lt;/code&gt; to see it in action!&lt;/p&gt;</content>
		<author>
			<name>James Carr</name>
			<uri>http://blog.james-carr.org</uri>
		</author>
		<source>
			<title type="html">James Carr</title>
			<subtitle type="html">Rants and Musings of an Agile Developer</subtitle>
			<link rel="self" href="http://blog.james-carr.org/feed/"/>
			<id>http://blog.james-carr.org/feed/</id>
			<updated>2012-01-29T20:47:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Download DB2 Express-C 9.7.5</title>
		<link href="http://feedproxy.google.com/~r/ZenAndTheArtOfRubyProgramming/~3/wSEh9xOxoVw/"/>
		<id>http://programmingzen.com/?p=1433</id>
		<updated>2011-11-21T20:56:56+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-1434&quot; title=&quot;Download DB2 Express-C 9.7.5&quot; src=&quot;http://programmingzen.com/wp-content/uploads/2011/11/download-db2-express-c.png&quot; alt=&quot;Download DB2 Express-C 9.7.5&quot; width=&quot;600&quot; height=&quot;148&quot; /&gt;IBM recently released a new edition of DB2 Express-C, the free edition of their powerful commercial database. You can grab &lt;a href=&quot;http://db2express.com/download/?S_TACT=ACDB201&quot;&gt;DB2 Express-C 9.7.5&lt;/a&gt; for Linux, Unix, and Windows &lt;a href=&quot;http://db2express.com/download/?S_TACT=ACDB201&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This new version includes support for Oracle compatibility (which was previously only available for commercial editions), and a few other features, including an enhanced db shell known as CLP+.&lt;/p&gt;
&lt;p&gt;If you downloaded DB2 in the past, take this new edition for a spin and let us know what you think. If you haven&amp;#8217;t, now would be a great time to try out DB2 Express-C in its enhanced incarnation.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s entirely free of charge and there are no limits on the amount of data you can store in development, testing, or production.&lt;/p&gt;
&lt;p&gt;In a future post I will also explain why, contrary to what some may believe, it&amp;#8217;s an excellent choice for startups that are looking for a solution that goes beyond the relational paradigm.&lt;/p&gt;
&lt;p&gt;No related posts.&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=wSEh9xOxoVw:33RUzolJY1g:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=wSEh9xOxoVw:33RUzolJY1g:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?i=wSEh9xOxoVw:33RUzolJY1g:F7zBnMyn0Lo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=wSEh9xOxoVw:33RUzolJY1g:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?i=wSEh9xOxoVw:33RUzolJY1g:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=wSEh9xOxoVw:33RUzolJY1g:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?d=qj6IDK7rITs&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=wSEh9xOxoVw:33RUzolJY1g:l6gmwiTKsz0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?d=l6gmwiTKsz0&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?a=wSEh9xOxoVw:33RUzolJY1g:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ZenAndTheArtOfRubyProgramming?i=wSEh9xOxoVw:33RUzolJY1g:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/wSEh9xOxoVw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Antonio Cangiano</name>
			<uri>http://programmingzen.com</uri>
		</author>
		<source>
			<title type="html">Zen and the Art of Programming</title>
			<subtitle type="html">Meditations on programming, startups, and technology</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/ZenAndTheArtOfRubyProgramming"/>
			<id>http://programmingzen.com/feed/atom/</id>
			<updated>2012-01-16T20:47:54+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">STARwest’s “Test Estimation &amp;amp; the Art of Negotiation”</title>
		<link href="http://feedproxy.google.com/~r/EricJacobsonSoftwareTestingBlog/~3/_B5fu6yVInA/starwests-test-estimation-and-art-of.html"/>
		<id>tag:blogger.com,1999:blog-8951904624959546499.post-7828255395843680721</id>
		<updated>2011-11-21T18:11:00+00:00</updated>
		<content type="html">&lt;p&gt;I’m going back through my STARwest notes and I want to blog about a few other sessions I enjoyed.&lt;/p&gt; &lt;p&gt;One of those  was &lt;a href=&quot;http://unimaginedtesting.ca/&quot; target=&quot;_blank&quot;&gt;Nancy Kelln&lt;/a&gt; and &lt;a href=&quot;http://qualityperspectives.ca/&quot; target=&quot;_blank&quot;&gt;Lynn McKee&lt;/a&gt;’s, “Test Estimation and the Art of Negotiation”, in which they suggested a new way to answer the popular question…&lt;/p&gt; &lt;p&gt;&lt;strong&gt;How long will testing take?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I figured Nancy and Lynn would have some fresh and interesting things to say about test estimation since they hosted the &lt;a href=&quot;http://www.postworkshop.ca/post2011.html&quot; target=&quot;_blank&quot;&gt;Calgary Perspectives on Software Testing workshop on test estimation&lt;/a&gt; this year.  I was right.&lt;/p&gt; &lt;p&gt;In this session, they tried to help us get beyond using what one guy in the audience referred to as a SWAG (Silly Wild-Ass Guess).  &lt;/p&gt; &lt;ol&gt; &lt;li&gt;Nancy and Lynn pointed to the challenge of dependencies. Testers sometimes attempt to deal with dependencies by padding their estimates.  This won’t work for &lt;a href=&quot;http://www.developsense.com/blog/2010/10/project-estimation-and-black-swans/&quot; target=&quot;_blank&quot;&gt;Black Swans&lt;/a&gt;, which are the unknown unknowns; those events cannot be planned for or referenced.  &lt;/li&gt;&lt;li&gt;The second challenge is optimism.  We think we can do more than we can.  Nancy and Lynn demonstrated an example of the impact of bugs on testing time.  As more bugs are discovered, and their fixes need to be verified, more time is taken from new testing, time that is often under estimated.  &lt;/li&gt;&lt;li&gt;The third challenge is identifying what testing means to each person.  Does it include planning?  Reporting?  Lynn suggested to try to estimate how much fun one would have at Disneyland.  Does the trip start when I leave my house, get to California, enter the park, or get on a ride?  When does it end?&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Eventually, Lynn and Nancy suggested &lt;strong&gt;the best estimate is no estimate at all&lt;/strong&gt;.  &lt;/p&gt; &lt;p&gt;Instead, it is a negotiation with the business (or your manager).  When someone asks, “how long will testing take?”, maybe you should explain that testing is not a phase.  Testing is exploration, discovery, learning, and reporting.  Testing &lt;em&gt;could&lt;/em&gt; end when there are no more interesting questions to answer but stopping testing is a business decision.  &lt;/p&gt; &lt;p&gt;They further suggested that testers have a responsibility to help the business understand the trade-offs; if quality expectations are high, it may require more testing than if they are lower.  Change your test approach to fit the needs.  If you only have one day to test, you can still do your best to find the most mission critical information that you can in one day.&lt;/p&gt; &lt;p&gt;Apart from the session content, Lynn and Nancy were awesome presenters.  They used volunteers from the audience for role plays, cartoons, brainstorms, and other interactive techniques to keep the session engaging.  I heard they proposed a full day session for STPCon Spring.  That would be a fun day.&lt;/p&gt; &lt;p&gt;Thanks Nancy and Lynn!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8951904624959546499-7828255395843680721?l=www.testthisblog.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/EricJacobsonSoftwareTestingBlog/~4/_B5fu6yVInA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Eric Jacobson</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.testthisblog.com/</uri>
		</author>
		<source>
			<title type="html">Test This Blog - Eric Jacobson's Software Testing Blog</title>
			<subtitle type="html">Refinements on the art of software testing</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/EricJacobsonSoftwareTestingBlog"/>
			<id>tag:blogger.com,1999:blog-8951904624959546499</id>
			<updated>2012-02-08T20:47:18+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Seven years of blogging in less than 500 words</title>
		<link href="http://agiletesting.blogspot.com/2011/11/seven-years-of-blogging-in-less-than.html"/>
		<id>tag:blogger.com,1999:blog-9238405.post-4949175369966639603</id>
		<updated>2011-11-17T14:43:45+00:00</updated>
		<content type="html">&lt;br /&gt;&lt;div&gt;In a couple of days, this blog will be7 years old. Hard to believe so much time has passed since my first&amp;nbsp;&lt;a href=&quot;http://agiletesting.blogspot.com/2004/11/hello-world.html&quot;&gt;Hello World&lt;/a&gt; post. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I keep reading that blogging is on thewane, and it's true, mainly because of the popularity of Twitter. ButI strongly believe that blogging is still important, and that morepeople should do it. For me, it's a way to give back to thecommunity. I can't even remember how many times I found solutions tomy technical problems by reading a blog post. I personally try topost something on my blog every single time I solve an issue thatI've struggled with. If you post documentation to a company wiki(assuming it's not confidential), I urge you to try to also blogpublicly about it – think of it as a public documentation that canhelp both you and others. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Blogging is also a great way to furtheryour career. Back in September 2008 I blogged about &lt;a href=&quot;http://agiletesting.blogspot.com/2008/09/experiences-with-amazon-ec2-and-ebs.html&quot;&gt;my experiences with EC2&lt;/a&gt;. I had launched an m1.small instance and I had started toplay with it. Lo and behold, I got a job offer based on that post. Iaccepted the offer, and that job allowed me to greatly enhance myexperience with cloud computing. This brings me to a more generalpoint: if you want to work on something you know nothing about, startsmall on your own, persevere, and yes, blog about it! In myexperience, you'll invariably find yourself in a position to be paidto work on it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's also pretty interesting for me tolook at my blog posts and to recognize in them the evolution of myown career. I started to blog when I was working as a tester. I waspassionate about &lt;a href=&quot;http://agiletesting.blogspot.com/2004/11/writing-fitnesse-tests-in-python.html&quot;&gt;automated testing&lt;/a&gt;, &lt;a href=&quot;http://agiletesting.blogspot.com/2005/01/python-unit-testing-part-3-pytest-tool.html&quot;&gt;Python&lt;/a&gt; and &lt;a href=&quot;http://agiletesting.blogspot.com/2006/04/should-acceptance-tests-be-included-in.html&quot;&gt;agile processes and tools&lt;/a&gt;. Thisled to digging more into automation tools, then into &lt;a href=&quot;http://agiletesting.blogspot.com/2010/03/automated-deployments-with-fabric-tips.html&quot;&gt;automated deployments&lt;/a&gt; and &lt;a href=&quot;http://agiletesting.blogspot.com/2010/07/working-with-chef-cookbooks-and-roles.html&quot;&gt;configuration management&lt;/a&gt; in the context of &lt;a href=&quot;http://agiletesting.blogspot.com/2010/11/how-to-whip-your-infrastructure-into.html&quot;&gt;system architecture&lt;/a&gt;. This led into &lt;a href=&quot;http://agiletesting.blogspot.com/2011/03/working-in-multi-cloud-with-libcloud.html&quot;&gt;cloud computing&lt;/a&gt;, and these days this isleading into &lt;a href=&quot;http://agiletesting.blogspot.com/2011/11/experiences-with-amazon-elastic.html&quot;&gt;Big Data analytics&lt;/a&gt;. Who knows what's next? Whatever itis, I'm sure it will be exciting, because I make an effort to make itso!&lt;br /&gt;&lt;br /&gt;I think it's also important to recognize that learning a tool or a technique is necessary but not sufficient: at the end of the day it's what you do with it that matters. For me the progression has been testing-&amp;gt;automation-&amp;gt;cloud computing-&amp;gt;data analytics-&amp;gt;??? (I actually started my career as a programmer, but here I include only the period coinciding with my blogging years.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This may be self-help-kind-of-corny,but a quote which is attributed (maybe &lt;a href=&quot;http://www.goethesociety.org/pages/quotescom.html&quot;&gt;wrongly&lt;/a&gt;) to Goethe reallyapplies to everybody:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;“Whatever you can do, or dream you can do, begin it. Boldness has genius, power, and magic in it. Begin it now.&quot;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9238405-4949175369966639603?l=agiletesting.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Grig Gheorghiu</name>
			<email>noreply@blogger.com</email>
			<uri>http://agiletesting.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Agile Testing</title>
			<subtitle type="html">Thoughts on testing and systems infrastructure with an agile, mostly Pythonic, twist.</subtitle>
			<link rel="self" href="http://agiletesting.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-9238405</id>
			<updated>2012-02-07T20:47:48+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">RPF: Google's Record Playback Framework</title>
		<link href="http://feedproxy.google.com/~r/blogspot/RLXA/~3/0IyDVwm9R0c/rpf-googles-record-playback-framework.html"/>
		<id>tag:blogger.com,1999:blog-15045980.post-8181824926851031728</id>
		<updated>2011-11-17T05:34:16+00:00</updated>
		<content type="html">&lt;div dir=&quot;ltr&quot;&gt;
By Jason Arbon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span id=&quot;internal-source-marker_0.25297700078226626&quot;&gt;At &lt;/span&gt;&lt;a href=&quot;http://www.gtac.biz/&quot;&gt;&lt;span&gt;GTAC&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, folks asked how well the Record/Playback (RPF) works in the Browser Integrated Test Environment (&lt;/span&gt;&lt;a href=&quot;http://googletesting.blogspot.com/2011/10/take-bite-out-of-bugs-and-redundant.html&quot;&gt;&lt;span&gt;BITE&lt;/span&gt;&lt;/a&gt;&lt;span&gt;). We were originally skeptical ourselves, but figured somebody should try. Here is some anecdotal data and some background on how we started measuring the quality of RPF.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;The idea is to just let users use the application in the browser, record their actions, and save them as a javascript to play back as a regression test or repro later. Like most test tools, especially code generating ones, it works most of the time but its not perfect. Po Hu had an early version working, and decided to test this out on a real world product. Po, the developer of RPF, worked with the chrome web store team to see how an early version would work for them. Why &lt;/span&gt;&lt;a href=&quot;https://chrome.google.com/webstore/&quot;&gt;&lt;span&gt;chrome web store&lt;/span&gt;&lt;/a&gt;&lt;span&gt;? It is a website with lots of data-driven UX, authentication, file upload, and it was changing all the time and breaking existing &lt;/span&gt;&lt;a href=&quot;http://seleniumhq.org/&quot;&gt;&lt;span&gt;Selenium&lt;/span&gt;&lt;/a&gt;&lt;span&gt; scripts: a pretty hard web testing problem, only targeted the chrome browser, and most importantly they were sitting 20 feet from us. &lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Before sharing with the chrome web store test developer Wensi Liu, we invested a bit of time in doing something we thought was clever: fuzzy matching and inline updating of the test scripts. Selenium rocks, but after an initial regression suite is created, many teams end up spending a lot of time simply maintaining their Selenium tests as the products constantly change. Rather than simply fail like the existing Selenium automation would do when a certain element isn’t found, and require some manual DOM inspection, updating the Java code and re-deploying, re-running, re-reviewing the test code what if the test script just kept running and updates to the code could be as simple as point and click? We would keep track of all the attributes in the element recorded, and when executing we would calculate the percent match between the recorded attributes and values and those found while running. If the match isn’t exact, but within tolerances (say only its parent node or class attribute had changed), we would log a warning and keep executing the test case. If the next test steps appeared to be working as well, the tests would keep executing during test passes only log warnings, or if in debug mode, they would pause and allow for a quick update of the matching rule with point and click via the BITE UI. We figured this might reduce the number of false-positive test failures and make updating them much quicker.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;We were wrong, but in a good way!&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;We talked to the tester after a few days of leaving him alone with RPF. He’d already re-created most of his Selenium suite of tests in RPF, and the tests were already breaking because of product changes (its a tough life for a tester at google to keep up with the developers rate of change). He seemed happy, so we asked him how this new fuzzy matching fanciness was working, or not. Wensi was like “oh yeah, that? Don’t know. Didn’t really use it...”. We started to think how our update UX could have been confusing or not discoverable, or broken. Instead, Wensi said that when a test broke, it was just far easier to re-record the script. He had to re-test the product anyway, so why not turn recording on when he manually verified things were still working, remove the old test and save this newly recorded script for replay later? &lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;During that first week of trying out RPF, Wensi found:&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;span&gt;77% of the features in Webstore were testable by RPF&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Generating regression test scripts via this early version of RPF was about 8X faster than building them via Selenium/WebDriver&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;The RPF scripts caught 6 functional regressions and many more intermittent server failures.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Common setup routines like login should be saved as modules for reuse (a crude version of this was working soon after)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;RPF worked on Chrome OS, where Selenium by definition could never run as it required client-side binaries. RPF worked because it was a pure cloud solution, running entirely within the browser, communicating with a backend on the web.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Bugs filed via bite, provided a simple link, which would install BITE on the developers machine and re-execute the repros on their side. No need for manually crafted repro steps. This was cool.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Wensi wished RPF was cross browser. It only worked in Chrome, but people did occasionally visit the site with a non-Chrome browser.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span&gt;&lt;/span&gt;&lt;span&gt;So, we knew we were onto something interesting and continued development. In the near term though, chrome web store testing went back to using Selenium because that final 23% of features required some local Java code to handle file upload and secure checkout scenarios. In hindsight, a little testability work on the server could have solved this with some AJAX calls from the client.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;We performed a check of how RPF faired on some of the top sites of the web. This is shared on the &lt;/span&gt;&lt;a href=&quot;https://docs.google.com/spreadsheet/ccc?key=0AsbIZrIYVyF0dEJGQV91WW9McW1fMjItRmhzcWkyanc&quot;&gt;&lt;span&gt;BITE project wiki&lt;/span&gt;&lt;/a&gt;&lt;span&gt;. This is now a little bit out of date, with lots more fixes, but it gives you a feel for what doesn’t work. Consider it Alpha quality at this point. It works for most scenarios, but there are still some serious corner cases. &lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Joe Muharsky drove a lot of the UX (user experience) design for BITE to turn our original and clunky developer and functional-centric UX into something intuitive. Joe’s key focus was to keep the UX out of the way until it is needed, and make things as self-discoverable and findable as possible. We’ve haven't done formal usability studies yet, but have done several experiments with external crowd testers using these tools, with minimal instructions, as well as internal dogfooders filing bugs against Google Maps with little confusion. Some of the fancier parts of RPF have some hidden easter eggs of awkwardness, but the basic record and playback scenarios seem to be obvious to folks.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;RPF has graduated from the experimental centralized test team to be a formal part of the Chrome team, and used regularly for regression test passes. The team also has an eye on enabling non-coding crowd sourced testers generate regression scripts via BITE/RPF.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Please join us in maintaining &lt;/span&gt;&lt;a href=&quot;http://code.google.com/p/bite-project/&quot;&gt;&lt;span&gt;BITE/RPF&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, and be nice to Po Hu and Joel Hynoski who are driving this work forward within Google. &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/15045980-8181824926851031728?l=googletesting.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/RLXA?a=0IyDVwm9R0c:ACT6cBZHgCQ:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/RLXA?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/RLXA?a=0IyDVwm9R0c:ACT6cBZHgCQ:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/RLXA?i=0IyDVwm9R0c:ACT6cBZHgCQ:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/RLXA/~4/0IyDVwm9R0c&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>James Whittaker</name>
			<email>noreply@blogger.com</email>
			<uri>http://googletesting.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Google Testing Blog</title>
			<subtitle type="html">If it ain't broke, you're not trying hard enough.</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/blogspot/RLXA"/>
			<id>tag:blogger.com,1999:blog-15045980</id>
			<updated>2012-02-08T08:47:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A Tester’s Commitments</title>
		<link href="http://www.satisfice.com/blog/archives/652"/>
		<id>http://www.satisfice.com/blog/?p=652</id>
		<updated>2011-11-17T02:10:17+00:00</updated>
		<content type="html">&lt;p&gt;&lt;strong&gt;This is the latest version of the commitments I make when I work with a programmer.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Dear Programmer,&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt; &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My job is to help you look good. My job is to support you as you create quality; to ease that burden instead of adding to it. In that spirit, I make the following commitments to you.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt; &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Sincerely,&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt; &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tester&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I provide a service. You are an important client of that service. I am not satisfied unless you are satisfied.&lt;/li&gt;
&lt;li&gt;I am not the gatekeeper of quality. I don’t “own” quality. Shipping a good product is a goal shared by all of us.&lt;/li&gt;
&lt;li&gt;I will test your code as soon as I can after you deliver it to me. I know that you need my test results quickly (especially for fixes and new features).&lt;/li&gt;
&lt;li&gt;I will strive to test in a way that allows you to be fully productive. I will not be a bottleneck.&lt;/li&gt;
&lt;li&gt;I&amp;#8217;ll make every reasonable effort to test, even if I have only partial information about the product.&lt;/li&gt;
&lt;li&gt;I will learn the product quickly, and make use of that knowledge to test more cleverly.&lt;/li&gt;
&lt;li&gt;I will test important things first, and try to find important problems. &lt;em&gt;(I will also report things you might consider unimportant, just in case they turn out to be important after all, but I will spend less time on those.)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;I will strive to test in the interests of everyone whose opinions matter, including you, so that you can make better decisions about the product.&lt;/li&gt;
&lt;li&gt;I will write clear, concise, thoughtful, and respectful problem reports. &lt;em&gt;(I may make suggestions about design, but I will never presume to be the designer.)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;I will let you know how I’m testing, and invite your comments. And I will confer with you about little things you can do to make the product much easier to test.&lt;/li&gt;
&lt;li&gt;I invite your special requests, such as if you need me to spot check something for you, help you document something, or run a special kind of test.&lt;/li&gt;
&lt;li&gt;I will not carelessly waste your time. Or if I do, I will learn from that mistake.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(This is cool! Yong Goo Yeo has created &lt;a href=&quot;http://prezi.com/yymvnxbysd9i/a-testers-commitments-by-james-bach/&quot;&gt;a Prezi of this&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An Important Comment&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This comment came in from Stuart Taylor. I think it&amp;#8217;s important enough that I should add this to the post:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Hi James,&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt; &lt;/em&gt;&lt;em&gt;I&amp;#8217;m not sure if this is meant to be a little tongue in cheek, but that&amp;#8217;s how I read it. That said, I fell at point 1. &amp;#8220;I provide a service&amp;#8221; really? &lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Yes, really. This is not a joke. And point #1 is the most important point.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;This implies there may be alternative service providers, and if my customer relationship management isn&amp;#8217;t up to snuff, I could lose this &amp;#8220;client&amp;#8221;. Already I feel subservient, I&amp;#8217;m an option.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Of course there are alternative service providers. (There are alternative programmers as well, but I&amp;#8217;m not concerned with that, here. I&amp;#8217;m making commitments that have to do with me and my role, here.) And yes, of COURSE you may lose your client. Actually that&amp;#8217;s a lot of what &amp;#8220;Agile&amp;#8221; has done: fired the testers. In their place, we often find quasi-tester/quasi-programmers who are more concerned with fitting in and poking around tools than doing testing.&lt;/p&gt;
&lt;p&gt;Testing is &lt;strong&gt;not&lt;/strong&gt; programming. Programmers are &lt;strong&gt;not&lt;/strong&gt; testers. If you mix that, you do a sorry job of both. In other words: I am a programmer and a tester, but not a good programmer at the same time that I&amp;#8217;m a good tester.&lt;/p&gt;
&lt;p&gt;Please meditate on the difference between &lt;em&gt;service &lt;/em&gt;and &lt;em&gt;subservience&lt;/em&gt;. I am a servant and I am proud of that. I am support crew. I spent my time as a production programmer and I&amp;#8217;m glad I don&amp;#8217;t do that any more. I don&amp;#8217;t like that sort of pressure. I like to serve people who will take that pressure on my behalf.&lt;/p&gt;
&lt;p&gt;This doesn&amp;#8217;t make me a doormat. Nobody wipes their feet on me&amp;#8211; &lt;em&gt;I clean their feet. &lt;/em&gt;There&amp;#8217;s a world of difference. Good mothers know this difference better than anyone.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Personally, when I work on a software  project, I want to feel like I&amp;#8217;m part of the team. I need the developer, and the developer wants me. We work together to bake quality in from the start, and not try and sprinkle it on at the end as part of a &amp;#8220;service&amp;#8221; that I offer.&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;What strange ideas you have about service. You think people on the same team don&amp;#8217;t serve each other? You think services are something &amp;#8220;sprinkled&amp;#8221; on the end? Please re-think this.&lt;/p&gt;
&lt;p&gt;I want to be on the same team, too. The difference, maybe, is that I require my colleagues to choose me. I don&amp;#8217;t rap on the door and say &amp;#8220;let me in I belong here! I like to be on the team!&amp;#8221; (You can&amp;#8217;t just &amp;#8220;join&amp;#8221; a team. The easier it is to join a team, the less likely that it is actually a team, I think. Excellent teams must gel together over time. I want to speed that process&amp;#8211; hence my commitments) Instead, I am invited. I insist that it be an invitation. And how I get invited quickly is by immediately dissolving any power struggle that the programmers may worry about, then earning their respect through the fantastic quality of my work.&lt;/p&gt;
&lt;p&gt;You can, of course, &lt;em&gt;demand&lt;/em&gt; respect. Then you will fail. Then five years later, you will realize true respect cannot be demanded. (That&amp;#8217;s what I did. Ask anyone about what a terror I was when I worked at Apple Computer. If you are less combative or more intelligent than I am, you may make this transition in less time.)&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;I may have actually agreed with your points before I was exposed to Continuous Integration, because that&amp;#8217;s how my relationship used to be; hence me interpreting this as a light hearted piece. However I know that this kind of relationship still exists today (its here at this place). When I began working with continuous integration, the traditional role of the tester, with a discrete testing phase became blurred, as the test effort is pushed back up stream towards the source. If the tester and developer share a conversation about &amp;#8220;how can we be sure we build the right thing, and how can we ensure we built it right&amp;#8221; before the code gets cut, and the resulting tests from that are used to help write the code (TDD, BDD, SBE), then both of us can have a nice warm fuzzy feeling about the code being of good quality. The automation removes the repetition (and reduces the feedback) to maintain that assertion.&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;First, your experience has nothing to do with &amp;#8220;continuous integration.&amp;#8221; Continuous integration is a concept. Your experience is actually related to people. Specific people are collaborating with you in specific satisfying ways, probably because it is their pleasure to do so. I have had wonderful and satisfying professional relationships on a number of projects&amp;#8211; mostly at Borland, where we were not doing continuous integration, and where testers and programmers cooperated freely, despite being organized into separate administrative entities.&lt;/p&gt;
&lt;p&gt;(Besides, I have to say&amp;#8230; Testing cannot be automated. Automation doesn&amp;#8217;t remove repetition, it changes it. Continuous integration, as I see it, is another way of forcing your customers do the testing, while placing naive trust in the magic of bewildering machinery. I have yet to hear about continuous integration from anyone who seemed to me to be a student of software testing. Perhaps that will happen someday.)&lt;/p&gt;
&lt;p&gt;In any case, nothing I&amp;#8217;m saying here prevents or discourages collaboration. What it addresses are some of the unhealthy things that discourage collaboration between a tester and a programmer. I&amp;#8217;m not sure if in your role you are doing testing. If you want to be a programmer or a designer or manager or cheerleader or hanger-on, then do that. However, testing is inherently about critical thinking, and therefore it always carries a risk (in the same way that being a dentist does) that we may touch a nerve with our criticism. This is the major risk I&amp;#8217;m trying to mitigate.&lt;/p&gt;
&lt;p&gt;[Note: Michael Bolton pointed out to me the &quot;warm fuzzy&quot; line. I can't believe I let that go by when I wrote this reply, earlier. Dude! Stuart! If you are in the warm fuzzy business, you are NOT in the testing business. My goal is not anything to do with warm fuzzy thinking. My goal is to patrol out in the cold and shine my bright bright torches into the darkness. On some level, I am never satisfied as a tester. I'm never sure of anything. That's what it MEANS to be a professional tester, rather than an amateur or a marketer. Other people think positively. Other people believe. The warmth and fuzziness of belief is not for us, man. Do not pollute your testing mentality with that.]&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;My confusion over this being a tongue in cheek post is further compounded by point 2. Too many testers do believe that they own quality. They become the quality gate keeper, and i think they enjoy it. The question &amp;#8220;can this go live&amp;#8221; is answered by the tester. The tester may be unwilling to relinquish that control, because they perceive that as a loss of power.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Just as excellent testers must understand they provide a service, they must also understand that they are not &amp;#8220;quality&amp;#8221; people. They simply hold the light so that other people can work. Testers do not create quality. If you create quality, you are not being a tester. You are being an amateur programmer/designer/manager. That&amp;#8217;s okay, but my commitment list is meant for people who see themselves as testers.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;I guess what i&amp;#8217;m fumbling about with here, is that some testers will read this, and sign up to it. Maybe even print it out and put it up on the wall. &lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I hope they do. This list has served me well.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Either way, you have written another thought provoking piece James, but i cant help wondering about the back story. What prompted you to write it?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt; &lt;/em&gt;&lt;em&gt;Stuart - sat in the coffee shop, but with laptop and wifi, not a notepad &lt;img src=&quot;http://www.satisfice.com/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This piece was originally prompted when I took over a testing and build team for SmartPatents, in 1997. I was told that I would decide when the software was good enough. I called a meeting of the programmers and testers and distributed the first version of this document in order to clarify to the programmers that I was not some obstacle or buzzing horsefly, but rather a partner with them in a SERVICE role.&lt;/p&gt;
&lt;p&gt;That was also the first time I gave up my office and opted to sit in a low cubicle next to the entrance that no one else wanted&amp;#8211; the receptionist&amp;#8217;s cubicle. It was perfect for my role. Programmers streamed by all day and couldn&amp;#8217;t avoid me.&lt;/p&gt;
&lt;p&gt;I think this piece is also a reaction to the Tester&amp;#8217;s Bill of Rights (the one by Gilb, not the one by Bernie Berger, although I have my concerns about that one, too), which is one of the most arrogant pieces of crap I&amp;#8217;ve ever seen written on behalf of testers. I will not link to it.&lt;/p&gt;
&lt;p&gt;And now that I think of it, I wrote this a year after I hired a personal assistant, and two months later had her promoted to be my boss, even though she retained almost the same duties. The experience of working for someone whose actual day-to-day role was to serve me&amp;#8211; but who felt powerful and grateful as my manager&amp;#8211; helped me understand the nature of service and leadership in a new way.&lt;/p&gt;
&lt;p&gt;Finally, a current that runs through my life is my experience as a husband and father. I am very powerful. I can make my family miserable if I so choose. I choose to serve them, instead.&lt;/p&gt;</content>
		<author>
			<name>James Bach</name>
			<uri>http://www.satisfice.com/blog</uri>
		</author>
		<source>
			<title type="html">James Bach’s Blog</title>
			<subtitle type="html">The Consulting Software Tester</subtitle>
			<link rel="self" href="http://www.satisfice.com/blog/feed"/>
			<id>http://www.satisfice.com/blog/feed</id>
			<updated>2012-01-31T20:48:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">10 steps to a successful testing career</title>
		<link href="http://www.teknologika.com/blog/10-steps-to-a-successful-testing-career/"/>
		<id>http://www.teknologika.com/blog/?p=649</id>
		<updated>2011-11-15T01:18:48+00:00</updated>
		<content type="html">This is a presentation that I gave earlier this year to group of new testers, hoping to guide them on how to gave a great testing career. 10 steps for a successful testing careerView more presentations from teknologika.
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/ciW_yuADWVgfJgD1kNzh8uzVqOg/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/ciW_yuADWVgfJgD1kNzh8uzVqOg/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/ciW_yuADWVgfJgD1kNzh8uzVqOg/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/ciW_yuADWVgfJgD1kNzh8uzVqOg/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Teknologika - Bruce McLeod</name>
			<uri>http://www.teknologika.com/blog</uri>
		</author>
		<source>
			<title type="html">Teknologika - The software testing blog of Bruce McLeod</title>
			<subtitle type="html">Saving the world, one testcase at a time</subtitle>
			<link rel="self" href="http://www.teknologika.com/blog/SyndicationService.asmx/GetAtom"/>
			<id>http://www.teknologika.com/blog/SyndicationService.asmx/GetAtom</id>
			<updated>2011-11-15T02:47:59+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Journey to 1000 tests a day</title>
		<link href="http://www.teknologika.com/blog/journey-to-1000-tests-a-day/"/>
		<id>http://www.teknologika.com/blog/?p=646</id>
		<updated>2011-11-14T23:36:48+00:00</updated>
		<content type="html">To help, give something back to the community, I recently gave a presentation at the 2011 ignite software testing conference in Sydney. Here is an updated version of that presentation. Journey to 1000 tests a day View more presentations from teknologika
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/J1v5zShogbQs8khBp2pdB6H3hJg/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/J1v5zShogbQs8khBp2pdB6H3hJg/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/J1v5zShogbQs8khBp2pdB6H3hJg/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/J1v5zShogbQs8khBp2pdB6H3hJg/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Teknologika - Bruce McLeod</name>
			<uri>http://www.teknologika.com/blog</uri>
		</author>
		<source>
			<title type="html">Teknologika - The software testing blog of Bruce McLeod</title>
			<subtitle type="html">Saving the world, one testcase at a time</subtitle>
			<link rel="self" href="http://www.teknologika.com/blog/SyndicationService.asmx/GetAtom"/>
			<id>http://www.teknologika.com/blog/SyndicationService.asmx/GetAtom</id>
			<updated>2011-11-15T02:47:59+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Smoke Testing vs. Sanity Testing:  What You Really Need to Know</title>
		<link href="http://www.developsense.com/blog/2011/11/smoke-testing-vs-sanity-testing/"/>
		<id>http://www.developsense.com/blog/?p=1046</id>
		<updated>2011-11-08T16:31:35+00:00</updated>
		<content type="html">&lt;p&gt;If you spend any time in forums in which new testers can be found, it won&amp;#8217;t be long before someone asks &amp;#8220;&amp;#8221;What is the difference between smoke testing and sanity testing?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;What is the difference between smoke testing and sanity testing?&amp;#8221; is a &lt;a href=&quot;http://www.satisfice.com/blog/archives/67&quot;&gt;unicorn question&lt;/a&gt;.  That is, it&amp;#8217;s a question that shouldn&amp;#8217;t be answered except perhaps by questioning the question:  &lt;i&gt;Why does it matter to you?&lt;/i&gt; &lt;i&gt;Who&amp;#8217;s asking you?&lt;/i&gt; &lt;em&gt;What would you do if I gave you an answer?&lt;/em&gt; &lt;em&gt;Why should you trust my answer, rather than someone else&amp;#8217;s?&lt;/em&gt; &lt;i&gt;Have you looked it up on Google?&lt;/i&gt; &lt;i&gt;What happens if people on Google disagree?&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;But if you persist and ask me, here&amp;#8217;s what I will tell you:&lt;/p&gt;
&lt;p&gt;The distinction between the smoke and sanity testing is not generally important.  In fact, it&amp;#8217;s one of the most trivial aspects of testing that I can think of, offhand.  Yet it does point to something that &lt;em&gt;is&lt;/em&gt; important.&lt;/p&gt;
&lt;p&gt;Both smoke testing and sanity testing refer to a first-pass, shallow form of testing intended to establish whether a product or system can perform the most basic functions.  Some people call such testing &amp;#8220;smoke testing&amp;#8221;; others call it &amp;#8220;sanity testing&amp;#8221;.  &amp;#8220;Smoke testing&amp;#8221; derives from the hardware world; if you create an electronic circuit, power it up, and smoke comes out somewhere, the smoke test has failed.  Sanity testing has no particular derivation that I&amp;#8217;m aware of, other than the common dictionary definition of the word.  Does the product behave in some crazy fashion? If so, it has failed the sanity test.  &lt;/p&gt;
&lt;p&gt;Do you see the similarity between these two forms of testing?  Can you make a meaningful distinction between them?  Maybe someone can.  If so, let them make it. If you&amp;#8217;re talking to some person, and that person want to make a big deal about the distinction, go with it.  Some organizations make a distinction between the smoke and sanity testing; some don&amp;#8217;t.  If it seems important in your workplace, then ask in your workplace, and adapt your thinking accordingly while you&amp;#8217;re there. If it&amp;#8217;s important that you provide a &amp;#8220;correct&amp;#8221; answer on someone&amp;#8217;s idiotic certification exam, give them the answer they want according to their &amp;#8220;body of knowledge&amp;#8221;.  Otherwise, it&amp;#8217;s not important.  &lt;i&gt;Don&amp;#8217;t worry about it.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s what &lt;i&gt;is&lt;/i&gt; important: wherever you find yourself in your testing career, people will use language that has evolved as part of the culture of that organization. Some consultancies or certification mills or standards bodies claim the goal of providing &amp;#8220;a common worldwide standard language for testing&amp;#8221;.  This is as &lt;a href=&quot;http://www.developsense.com/blog/2011/06/common-languages-aint-so-common/&quot; title=&quot;Common Languages Ain't So Common&quot; target=&quot;_blank&quot;&gt;fruitless and as pointless a goal&lt;/a&gt; as a common worldwide standard language for humanity.  Throughout all of human history history, people have developed different languages to address things that were important in their cultures and societies and environments. Those languages continue to develop as change happens. &lt;em&gt;This is not a bad thing. This is a good thing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There is no term in testing of which I am aware whose meaning is universally understood and accepted.  There&amp;#8217;s nothing either wrong or unusual about that. It&amp;#8217;s largely true outside the testing world too.  Pick an English word at random, and odds are you&amp;#8217;ll find multiple meanings for it.  Examples:&lt;/p&gt;
&lt;p&gt;&lt;ul&gt;&lt;li&gt;Pick (choose, plectrum for a guitar)&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;English (a language, spin on a billiard ball)&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;word (a unit of speech, a 32-bit value)&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;random (without a definite path, of equal probability)&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;odds (probability, numbers not divisible by two)&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;multiple (more than one, divisible by)&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;meaning (interpretation, significance)&lt;/li&gt;&lt;br /&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Never mind the shades and nuances of interpretation within each meaning of each word!  And notice that &amp;#8220;never mind&amp;#8221;, in this context, is being used ironically. Here, &amp;#8220;never mind&amp;#8221; doesn&amp;#8217;t mean &amp;#8220;forget&amp;#8221; or &amp;#8220;ignore&amp;#8221;; here, it &lt;em&gt;really&lt;/em&gt; means the opposite: &amp;#8220;also pay attention to&amp;#8221;!&lt;/p&gt;
&lt;p&gt;Not only is there no universally accepted term for anything, there&amp;#8217;s no universally accepted authority that could authoritatively declare or enforce a given meaning for all time.  (Some might point to law, claiming that there are specific terms which have solid interpretations. If that were true, we wouldn&amp;#8217;t need courts or lawyers.)&lt;/p&gt;
&lt;p&gt;If you find yourself in conversation (or in an interview) with someone who asks you &amp;#8220;Do you do X?&amp;#8221;, and you&amp;#8217;re not sure what X is by their definition, a smart and pragmatic reply starts with, &amp;#8220;I may do X, but not necessarily by that name.&amp;#8221;  After that,&lt;/p&gt;
&lt;p&gt;&lt;ul&gt;&lt;li&gt;You can offer to describe your notion of X (if you have one).&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;You can describe something that you do that could be interpreted as X.  That can be risky, so offer this too: &amp;#8220;Since I don&amp;#8217;t know what you mean by X, here&amp;#8217;s something that I do. I think it sounds similar to X, or could be interpreted as X.  But I&amp;#8217;d like to make sure that we both recognize that we could have different interpretations of what X means.&amp;#8221;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;You can say, &amp;#8220;I&amp;#8217;d like to avoid the possibility that we might be talking at cross-purposes.  If you can describe what X means to you, I can tell you about my experiences doing similar things, if I&amp;#8217;ve done them.  What does X mean to you?&amp;#8221;  Upon hearing their defintion of X, then truthfully describe your experience, or say that you haven&amp;#8217;t done it.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;If you searched online for an answer to the smoke vs. sanity question, you&amp;#8217;d find dozens, hundreds of answers from dozens, hundreds of people.  (Ironically, &lt;a href=&quot;http://www.satisfice.com/blog/archives/67&quot; title=&quot;What Size Unicorn Should I Wear?&quot; target=&quot;_blank&quot;&gt;the very post that introduces the notion of the unicorn question&lt;/a&gt; includes, in the second-to-last paragraph, a description of a smoke test.  Or a sanity test.  Whatever.)  The people who answer the smoke vs. sanity question don&amp;#8217;t agree, and neither do their answers.  Yet many, even most, of the people will seem very sure of their own answers.  People will have their own firm ideas about how many angels can fit on the head of a pin, too.  However, there is no &amp;#8220;correct&amp;#8221; definition for either term outside of a specific context, since there is no authority that is univerally accepted.  If someone claimed to be a universally accepted authority, I&amp;#8217;d reject the claim, which would put an instant end to the claim of universal acceptance.&lt;/p&gt;
&lt;p&gt;With the possibile exception of the skills of memorization, there is no testing skill involved in memorizing someone&amp;#8217;s term for something.  Terms and their meanings are slippery, indistinct, controversial, and context-dependent.  The real testing skill is in learning to deal with the risk of ambiguity and miscommunication, and the power of expressing ourselves in many ways.&lt;/p&gt;</content>
		<author>
			<name>Michael</name>
			<uri>http://www.developsense.com/blog</uri>
		</author>
		<source>
			<title type="html">Developsense Blog</title>
			<subtitle type="html">DevelopSense Blog</subtitle>
			<link rel="self" href="http://www.developsense.com/blog/feed/atom/"/>
			<id>http://www.developsense.com/blog/feed/atom/</id>
			<updated>2012-02-08T20:48:13+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">MORE BATS – Or Build Your Own Test Report Heuristic</title>
		<link href="http://feedproxy.google.com/~r/EricJacobsonSoftwareTestingBlog/~3/K_Yjwc4NORI/more-bats-or-build-your-own-test-report.html"/>
		<id>tag:blogger.com,1999:blog-8951904624959546499.post-1434610272825169612</id>
		<updated>2011-11-07T18:18:00+00:00</updated>
		<content type="html">&lt;p&gt;When someone walks up to your desk and asks, “How’s the testing going?”, a good answer depends on remembering to tell that person the right things.&lt;/p&gt; &lt;p&gt;After reading &lt;a href=&quot;http://michaeldkelly.com/blog/2005/8/19/coming-up-with-a-heuristic.html&quot; target=&quot;_blank&quot;&gt;Michael Kelly’s post&lt;/a&gt; on coming up with a heuristic (model), I felt inspired to tweak his MCOASTER test reporting heuristic model.&amp;nbsp; I tried using it but it felt awkward.&amp;nbsp; I wanted one that was easier for me to remember, with slightly different trigger words, ordered better for my context.&amp;nbsp; It was fun.&amp;nbsp; Here is what I did:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;I listed all the words that described things I may want to cover in a test report.&amp;nbsp; Some words were the same as Michael Kelly’s but some were different (e.g., “bugs”).  &lt;li&gt;Then I took the first letter of each of my words and plugged them into Wordsmith.org’s &lt;a href=&quot;http://wordsmith.org/anagram/&quot; target=&quot;_blank&quot;&gt;anagram solver&lt;/a&gt;.  &lt;li&gt;Finally, I skimmed through the anagram solver results, until I got to those starting with ‘M’ (I knew I wanted ‘Mission’ to be the first trigger).&amp;nbsp; If my mnemonic didn’t jump out at me, I tweaked the input words slightly using synonyms and repeated step 2.&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Two minutes later I settled on MORE BATS.&amp;nbsp; After being an avid caver for some 13 years, it was perfect.&amp;nbsp; When someone asks for a test report, I feel slightly lost at first, until I see MORE BATS.&amp;nbsp; Just like in caving; when deep into the cave I feel lost, but seeing “more bats” is a good sign the entrance is in that general direction, because more bats tend to be near the entrance.&lt;/p&gt; &lt;p&gt;Here’s how it works (as a test report heuristic):&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;M&lt;/strong&gt;ission&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;O&lt;/strong&gt;bstacles&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;R&lt;/strong&gt;isks&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;E&lt;/strong&gt;nvironment&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;B&lt;/strong&gt;ugs&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;A&lt;/strong&gt;udience&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;T&lt;/strong&gt;echniques&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;S&lt;/strong&gt;tatus&lt;/font&gt;&lt;/p&gt; &lt;p&gt;“My &lt;strong&gt;mission&lt;/strong&gt; is to test the new calendar control.&amp;nbsp; My only &lt;strong&gt;obstacle&lt;/strong&gt; is finding enough data in the future for some of my scenarios.&amp;nbsp; The &lt;strong&gt;risks&lt;/strong&gt; I’m testing include long range future entries, multiple date ranges, unknown begin dates, and extremely old dates.&amp;nbsp; I’m using the Dev &lt;strong&gt;environment&lt;/strong&gt; because the control is not working in QA.&amp;nbsp; I found two date range &lt;strong&gt;bugs&lt;/strong&gt;.&amp;nbsp; &lt;em&gt;Since this is a programmer (&lt;strong&gt;audience&lt;/strong&gt;) asking me for a test report I will describe my &lt;strong&gt;techniques&lt;/strong&gt;;&lt;/em&gt; I’m checking my results in database tableA because the UI is not completed.&amp;nbsp; I think I’ll be done today (&lt;strong&gt;status&lt;/strong&gt;).”&lt;/p&gt; &lt;p&gt;Try to make your own and let me know what you come up with.&lt;/p&gt;  &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8951904624959546499-1434610272825169612?l=www.testthisblog.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/EricJacobsonSoftwareTestingBlog/~4/K_Yjwc4NORI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Eric Jacobson</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.testthisblog.com/</uri>
		</author>
		<source>
			<title type="html">Test This Blog - Eric Jacobson's Software Testing Blog</title>
			<subtitle type="html">Refinements on the art of software testing</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/EricJacobsonSoftwareTestingBlog"/>
			<id>tag:blogger.com,1999:blog-8951904624959546499</id>
			<updated>2012-02-08T20:47:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Testing a simple Perl module</title>
		<link href="http://szabgab.com/testing-a-simple-perl-module.html"/>
		<id>http://szabgab.com/testing-a-simple-perl-module.html</id>
		<updated>2011-11-03T21:47:53+00:00</updated>
		<content type="html">&lt;p&gt;

&lt;h2&gt;Welcome back&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;

It has been a long time since I posted a 
&lt;a href=&quot;http://szabgab.com/test_automation_tips.html&quot;&gt;Test Automation Tip&lt;/a&gt;
of my own but now it is going to change. 
&lt;/p&gt;
&lt;p&gt;

&lt;p&gt;
&lt;form class=&quot;subscribe&quot; action=&quot;http://szabgab.com/subscribe.html&quot; method=&quot;POST&quot;&gt;
&lt;span class=&quot;label&quot;&gt;To subscribe enter e-mail:&lt;/span&gt;
&lt;input name=&quot;email&quot; /&gt;
&lt;input type=&quot;hidden&quot; name=&quot;list&quot; value=&quot;tat&quot; /&gt;
&lt;input type=&quot;submit&quot; value=&quot;Sign Me Up!&quot; /&gt;
&lt;/form&gt;
&lt;/p&gt;



&lt;/p&gt;
&lt;p&gt;

I started to make some adjustments to my business
that is already reflected by the creation and publication
of the &lt;a href=&quot;http://szabgab.com/perl_tutorial.html&quot;&gt;Perl Tutorial&lt;/a&gt;
and in general the changes to my web site. 
&lt;/p&gt;
&lt;p&gt;

I am going to send a lot more of this newsletter and I'll
need your help in making sure I am providing good value to you.
So feel free to let me know how you think I could improve it.
&lt;/p&gt;
&lt;p&gt;

&lt;h2&gt;Free testing class in London on 12th November 2011&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;

I am being sponsored by 
&lt;a href=&quot;http://www.net-a-porter.com/&quot;&gt;Net A Porter&lt;/a&gt; to
attend the London Perl Workshop on 12th November and to give
a 4-hour training session about Test Automation in Perl.
&lt;/p&gt;
&lt;p&gt;

Both the London Perl Workshop and my class is free of charge.
For details visit the
&lt;a href=&quot;http://conferences.yapceurope.org/lpw2011/&quot;&gt;London Perl Workshop&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;

If you are near-by, please come and join us.
&lt;/p&gt;
&lt;p&gt;

&lt;h2&gt;Testing a simple Perl module&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;

Let's assume you have just started a new module 
in Perl and you would like to write some automated test.
&lt;/p&gt;
&lt;p&gt;

In order to make it simple I use the good old math example.
&lt;/p&gt;
&lt;p&gt;

It is probably a good idea for any project to follow the
regular practices of the Perl community and create the layout
of the project as most of the CPAN modules are structured.
This means you will have all the files of the project, 
the modules, the tests and all other auxiliary files in a 
single directory structure.
&lt;/p&gt;
&lt;p&gt;

Within that structure the modules are going to be in the &lt;span class=&quot;hl&quot;&gt;lib/&lt;/span&gt;
subdirectory and the test script will be in the &lt;span class=&quot;hl&quot;&gt;t/&lt;/span&gt; subdirectory.
The tests are simple perl scripts but with a &lt;span class=&quot;hl&quot;&gt;.t&lt;/span&gt; extension.
&lt;/p&gt;
&lt;p&gt;

so we created the first version of our &lt;span class=&quot;hl&quot;&gt;Math.pm&lt;/span&gt; module, and placed it
in &lt;span class=&quot;hl&quot;&gt;lib/Math.pm&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;

&lt;h2&gt;The module&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;

The lib/Math.pm file looks like this:
&lt;/p&gt;
&lt;pre class=&quot;sh_perl&quot;&gt;

  package Math;
  use strict;
  use warnings;
  use 5.010;

  use base 'Exporter';
  our @EXPORT_OK = qw(compute);

  sub compute {
    my ($operator, $x, $y) = @_;

    given ($operator) {
      when ('+') {
        return $x + $y;
      }
      when ('-') {
        return $x - $y;
      }
      when ('*') {
        return $x - $y;
      }
    }
  }

  1;

&lt;/pre&gt;
&lt;p&gt;

I won't go into details now but you can use it like this:
&lt;/p&gt;
&lt;pre class=&quot;sh_perl&quot;&gt;

  use Math qw(compute);
  say compute('+', 2, 3);    # will print 5


&lt;/pre&gt;
&lt;p&gt;

&lt;h2&gt;The Test&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;

The test script needs to call the &lt;span class=&quot;hl&quot;&gt;compute()&lt;/span&gt; function and check if the resulting
value is the same as we expected. To follow the conventions we create a file in
the &lt;span class=&quot;hl&quot;&gt;t/&lt;/span&gt; directory with a &lt;span class=&quot;hl&quot;&gt;.t&lt;/span&gt; extension:
&lt;/p&gt;
&lt;p&gt;

t/01_compute.t contains the following:
&lt;/p&gt;
&lt;pre class=&quot;sh_perl&quot;&gt;

  use strict;
  use warnings;
  use 5.010;

  use Test::Simple tests =&amp;gt; 2;

  use Math qw(compute);

  ok( compute('+', 2, 3) == 5 );
  ok( compute('-', 5, 2) == 3 );


&lt;/pre&gt;
&lt;p&gt;

&lt;h2&gt;Run the test script&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;

Once we have this we can run the script by typing
&lt;/p&gt;
&lt;pre class=&quot;sh_perl&quot;&gt;

  perl t/01_compute.t

&lt;/pre&gt;
&lt;p&gt;

If we are lucky we get an error message that looks like this:
&lt;/p&gt;
&lt;pre class=&quot;sh_perl&quot;&gt;

  1..2
  Can't locate Math.pm in @INC (@INC contains: 
    /etc/perl /usr/local/lib/perl/5.12.4 /usr/local/share/perl/5.12.4 
    /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.12 /usr/share/perl/5.12 
    /usr/local/lib/site_perl .) at t/01_compute.t line 7.
  BEGIN failed--compilation aborted at t/01_compute.t line 7.
  # Looks like your test exited with 2 before it could output anything.

&lt;/pre&gt;
&lt;p&gt;

This happens because the perl script cannot find the Math.pm in any 
of its standard directories and it does not know it should look inside
the lib/ directory.
&lt;/p&gt;
&lt;p&gt;

I wrote &quot;if we are lucky&quot; because that's the better case. The unlucky case
is if we already have a previous version of this module installed.
In that case perl will pick up that version of Math.pm and not the one
we are currently writing. This can lead to all kind of unpleasant feelings
when you spend hours trying to figure out why changing lib/Math.pm does
not impact the execution of the test script.
&lt;/p&gt;
&lt;p&gt;

Trust me, it happens to all of us.
&lt;/p&gt;
&lt;p&gt;

In order to ensure you perl finds the correct version of your module
you need to tell it where to look for the module. The usual way for this
is to run your script with the following command:
&lt;/p&gt;
&lt;pre class=&quot;sh_perl&quot;&gt;

  perl -Ilib t/01_compute.t

&lt;/pre&gt;
&lt;p&gt;

the output will look like this:
&lt;/p&gt;
&lt;pre class=&quot;sh_perl&quot;&gt;

  1..2
  ok 1
  ok 2

&lt;/pre&gt;
&lt;p&gt;

&lt;h2&gt;Use prove&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;

An even better way to run your test scr
