<?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>2009-01-07T04:20:46+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en-us">
		<title type="html">Testing is Overrated</title>
		<link href="http://www.kohl.ca/blog/archives/000203.html"/>
		<id>http://www.kohl.ca/blog/archives/000203.html</id>
		<updated>2009-01-06T22:20:28+00:00</updated>
		<content type="html">I stumbled across a presentation by Luke Francl called: Testing is Overrated. He could have called it: &quot;programmer testing is overrated&quot; but that doesn't have as much zing to it. His slides display a refreshing reminder to look for balance...</content>
		<author>
			<name>Jonathan Kohl</name>
			<uri>http://www.kohl.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Collaborative Software Testing</title>
			<subtitle type="html">Jonathan Kohl's blog on software investigation.</subtitle>
			<link rel="self" href="http://www.kohl.ca/blog/index.rdf"/>
			<id>http://www.kohl.ca/blog/index.rdf</id>
			<updated>2009-01-06T22:20:28+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Getting closer...</title>
		<link href="http://weblogs.java.net/blog/robogeek/archive/2008/07/getting_closer.html"/>
		<id>tag:weblogs.java.net,2008:/blog/robogeek/270.10137</id>
		<updated>2009-01-06T20:08:09+00:00</updated>
		<content type="html">&lt;p&gt;We've been working legal ropes for awhile to get this result:  &lt;a href=&quot;http://notes.bikemonkey.org/post/41640903/sun-approved-merge-from-bsd-java-to-openjdk&quot;&gt;Sun Approved: Merge from BSD Java to OpenJDK&lt;/a&gt;.  There was a funky little legal snarl in that the BSD Java team has been working on Java ports to xyzzyBSD for years but it was under the JRL or SCSL license and they couldn't directly offer their changes to the OpenJDK project.  One little bit of interesting is the SoyLatte work by Landon Fuller, which was based on that very same BSD Java port.  The legal unwrangling now allows Landon to post this:  &lt;i&gt;Sun has approved merging the JRL-licensed BSD Java to the GPLv2+ClassPath OpenJDK-6. That means that all of the BSD Java changes, including the SoyLatte Mac OS X port, can now be sent to the OpenJDK project, and an official BSD porters group can be proposed:&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Cheers and 13949712720901ForOSX&lt;/p&gt;

&lt;p&gt;But wait, that's not all... &lt;a href=&quot;http://robilad.livejournal.com/33750.html&quot;&gt;Dalibor noted a couple days ago&lt;/a&gt; that &lt;a href=&quot;http://packages.qa.debian.org/o/openjdk-6.html&quot;&gt;Openjdk 6 is in Debian Main&lt;/a&gt;... and &lt;a href=&quot;http://blogs.sun.com/barton808/entry/openjdk_in_opensuse&quot;&gt;our esteemed Linux strategist, Barton George&lt;/a&gt; notes OpenJDK 6 is heading into OpenSUSE 11.  And there appears to be interest &lt;a href=&quot;https://qa.mandriva.com/show_bug.cgi?id=41651&quot;&gt;to include OpenJDK in Mandriva&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>robogeek</name>
			<email>David.Herron@Sun.COM</email>
			<uri>http://weblogs.java.net/blog/robogeek/</uri>
		</author>
		<source>
			<title type="html">David Herron's Blog</title>
			<link rel="self" href="http://weblogs.java.net/blog/robogeek/atom.xml"/>
			<id>tag:weblogs.java.net,2009:/blog/robogeek/270</id>
			<updated>2009-01-06T22:20:11+00:00</updated>
			<rights type="html">Copyright (c) 2009, robogeek</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Great milestone reached by OpenJDK on Fedora</title>
		<link href="http://weblogs.java.net/blog/robogeek/archive/2008/06/great_milestone.html"/>
		<id>tag:weblogs.java.net,2008:/blog/robogeek/270.9996</id>
		<updated>2009-01-06T20:08:09+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://blog.softwhere.org/archives/196&quot;&gt;Java is finally Free and Open&lt;/a&gt; .. hey, The Fedora/IcedTea team have reached a great milestone.  Their build of the OpenJDK has passed the (extensive) JCK test suite.  I bet they now have a huge appreciation the extent to which we took the slogan &quot;&lt;i&gt;Compatibility Matters!&lt;/i&gt;&quot;.&lt;/p&gt;

&lt;p&gt;Since this inspired Rich to take a walk down memory lane... in May 2006 I was in the audience for the JavaOne keynote.  I was real excited because a project I'd been working on intensely was about to be announced by Jonathan Schwartz and Mark Shuttleworth from the stage.  This project, the &lt;a href=&quot;http://jdk-distros.dev.java.net&quot;&gt;Operating System Distributor License for Java (DLJ)&lt;/a&gt; was our latest hope to improve the state of Java on Linux by giving the world the JDK's rebundled with a more permissive license.  It was going to usher in an age of nirvana and happiness, but it seems that Jonathan Schwartz and Rich Green had a different idea in mind.  Jonathan and Mark did announce the DLJ project that day, and DLJ derived JDK's have been shipping in several Linux's and Solari since then.  However Jonathan and Rich a few minutes after the DLJ announcement completely upstaged it with &quot;It's not a matter of if but when&quot; (or something like that).&lt;/p&gt;

&lt;p&gt;Thus ensued a huge amount of work.  The initial open sourcing happened on the first Java Freedom day, November 13, 2006.  The second Java Freedom Day happened at JavaOne 2007 when the rest of the OpenJDK was released ... except... there was two issues, first that some code was encumbered and we weren't able to open source it right away.  This made for a more complex build situation where replacement code was available as binary to plug in the holes left by the encumbered source.  The second is we never got to open sourcing the plugin or java web start.&lt;/p&gt;

&lt;p&gt;I see the slashdot thread, &lt;a href=&quot;http://developers.slashdot.org/developers/08/06/19/1754255.shtml&quot;&gt;IcedTea's OpenJDK Passes Java Test Compatibility Kit&lt;/a&gt;, has it's usual set of mistakes and misconceptions so I'll be answering some of them as I go through the rest of this.&lt;/p&gt;

&lt;p&gt;The IcedTea project formed almost immediately and initially its purpose was to reuse Classpath code to fill the gaps of the encumbered code.  At some point in (?late?) 2007 they had a complete unencumbered IcedTea build derived from the OpenJDK7 source tree.  At the same time in the OpenJDK team work was done to replace the encumbered code by various means.  For some code we were able to get permission to release it under open source, in other cases we chose open source alternative implementations.  For example a remaining encumbrance is the font rendering code, and in the OpenJDK we are using open source font rendering code (FreeType) but the closed source code is continuing to be used in the commercial JDK builds.&lt;/p&gt;

&lt;p&gt;Performance .. the OpenJDK uses the exact same HotSpot as is used in regular JDK builds.  Performance should be 99.9% the same.  Since some of the GUI rendering code differs the GUI performance is likely different.&lt;/p&gt;

&lt;p&gt;&quot;&lt;i&gt;&lt;a href=&quot;http://developers.slashdot.org/comments.pl?sid=589313&amp;amp;cid=23861467&quot;&gt;Only 4% of the Sun Java code wasn't released. So IcedTea only had to implement the 4% of Java that wasn't GPLed.&lt;/a&gt;&lt;/i&gt;&quot; This is no longer true... the OpenJDK6 source tree is 100% unencumbered.&lt;/p&gt;

&lt;p&gt;OpenJDK7? OpenJDK6?  In the beginning there was OpenJDK, and it was pleasing to Richard Stallman and he smiled.  However there was a promise made to have an open source implementation compatible with Java 6, and thus was OpenJDK6 born.  &lt;a href=&quot;http://blogs.sun.com/darcy/entry/forward_to_the_past&quot;&gt;OpenJDK6 is an example of making reverse progress by moving forward into the past&lt;/a&gt; ... OpenJDK6 is a fork of OpenJDK7 where features and code was removed until it could pass the JCK tests.  If you look in the IcedTea project there are two branches, the one derived from OpenJDK7 and the one derived from OpenJDK6.  It's the OpenJDK6 which the IcedTea/Fedora project have made pass the certification tests.&lt;/p&gt;

&lt;p&gt;What's the big deal?  This is Sun's own code base so of course it's going to pass the compatibility tests ??? &lt;/p&gt;

&lt;p&gt;Not so fast, as there are some differences from any other release which passed JCK6a.  The last version to pass JCK6a was the Java6 release (which is up to Java 6u6).  Remember that OpenJDK 6 started life as a fork of OpenJDK 7.  While OpenJDK7 started from the JDK6 source tree ... some changes had been made.  There was 20 builds worth of Java7 new feature development and bug fixes, and there was source tree rejigglings related to open sourcing.  Further there were changed introduced by removing the encumbrances, and there were changes introduced by IcedTea/Fedora.  This means there's a lot of ways a conformance failure could have been inserted.&lt;/p&gt;

&lt;p&gt;Hey, great news and I hear there is some celebration at FUDCON.  Wish I'd been able to attend.&lt;br /&gt;
&lt;/p&gt;</content>
		<author>
			<name>robogeek</name>
			<email>David.Herron@Sun.COM</email>
			<uri>http://weblogs.java.net/blog/robogeek/</uri>
		</author>
		<source>
			<title type="html">David Herron's Blog</title>
			<link rel="self" href="http://weblogs.java.net/blog/robogeek/atom.xml"/>
			<id>tag:weblogs.java.net,2009:/blog/robogeek/270</id>
			<updated>2009-01-06T22:20:11+00:00</updated>
			<rights type="html">Copyright (c) 2009, robogeek</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Re-released Microsoft Compatibility Testing Virtual PC Images</title>
		<link href="http://www.eviltester.com/index.php/2009/01/06/re-released-microsoft-compatibility-testing-virtual-pc-images/"/>
		<id>http://www.eviltester.com/index.php/2009/01/06/re-released-microsoft-compatibility-testing-virtual-pc-images/</id>
		<updated>2009-01-06T03:20:32+00:00</updated>
		<content type="html">The Microsoft compatibility Virtual PC images have had a re-release.&amp;#160; These time out on April 2009 (even when they time out you still get a grace 1 hour usage as I found out this morning).


Windows XP SP3 with IE6
Windows XP SP2 with IE7
Windows XP SP3 with IE8 Beta 2
Vista Image with IE7 

At no [...]</content>
		<author>
			<name>Alan Richardson</name>
			<uri>http://www.eviltester.com</uri>
		</author>
		<source>
			<title type="html">Evil Tester</title>
			<subtitle type="html">A different view of software testing</subtitle>
			<link rel="self" href="http://www.eviltester.com/index.php/feed/atom/"/>
			<id>http://www.eviltester.com/index.php/feed/atom/</id>
			<updated>2009-01-06T03:20:32+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">It will be (Open)JDK7 where OpenJDK==JDK</title>
		<link href="http://weblogs.java.net/blog/robogeek/archive/2009/01/it_will_be_open.html"/>
		<id>tag:weblogs.java.net,2009:/blog/robogeek/270.10962</id>
		<updated>2009-01-05T22:48:15+00:00</updated>
		<content type="html">&lt;p&gt;I'm listening to the &lt;a href=&quot;http://javaposse.com/index.php?post_id=418753&quot;&gt;'holidays 2008ish' episode of Javaposse&lt;/a&gt; and in reviewing their last years predictions they have enough fumbling around the status of OpenJDK that I want to do a little bit of explaining.&lt;/p&gt;

&lt;h2&gt;OpenJDK 6 != JDK 6&lt;/h2&gt;

&lt;p&gt;There are circuitous historical reasons for this but the fact is that OpenJDK 6, as good as it is, does not correspond to JDK 6uN for any value of N.  OpenJDK 6 began as a fork of OpenJDK 7, and the team stripped out code from the OpenJDK 7 fork until it became compatible with the Java6 specification as verified by the JCK 6 test suite.&lt;/p&gt;

&lt;p&gt;Joe Darcy has posted several blogs about this &lt;a href=&quot;http://blogs.sun.com/darcy/entry/openjdk_6_genealogy&quot;&gt;OpenJDK 6 Genealogy&lt;/a&gt;, &lt;a href=&quot;http://blogs.sun.com/darcy/entry/openjdk_6_and_6u10_features&quot;&gt;OpenJDK 6 and 6u10 features&lt;/a&gt;, &lt;a href=&quot;http://blogs.sun.com/darcy/entry/openjdk_6_logistics_of_partial&quot;&gt;OpenJDK 6: Logistics of Partial Merge with 6u10&lt;/a&gt;, and the most important of these is:  &lt;a href=&quot;http://blogs.sun.com/darcy/entry/forward_to_the_past&quot;&gt;Forward to the Past: Toward OpenJDK 6&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're scratching your head going &quot;&lt;i&gt;huh??&lt;/i&gt;&quot;, well, I don't blame you, just read Joe Darcy's blog postings and it will be clear as, well, uh, I just hope it's clear why.&lt;/p&gt;

&lt;p&gt;The bottom line is that OpenJDK 6 works rather well, several Linux distros are using it as their JDK, it can be built to pass the JCK6b test suite, meaning OpenJDK 6 can be used to build a compliant JDK, and unfortunately it is this evolutionary sidetrack which we hope will be relatively short-lived.  It serves a purpose, namely of having an fully open OpenJDK compliant with Java6 ....&lt;/p&gt;

&lt;h2&gt;OpenJDK ~=~ IcedTea&lt;/h2&gt;

&lt;p&gt;It seems some people really like typing &quot;./configure&quot; rather than setting up environment variables and running &quot;make&quot;.  The IcedTea project originally began due to incompleteness in the OpenJDK (gaps due to encumbrances) and the community requirement of a fully open source toolchain and code base.  IcedTea has long been a set of patches applied to OpenJDK, along with a different build system that is &quot;./configure&quot; based as I just said.&lt;/p&gt;

&lt;p&gt;In OpenJDK we've replaced the encumbered code such that there are no gaps any longer.  As we've done so I believe the IcedTea project has shrunken the number of patches they use.  One nice thing seems to be that the IcedTea configure script makes it easy to build OpenJDK in many different modes such as using the Zero Assembler port to support compiling on non-x86/sparc chipsets, etc.  &lt;/p&gt;

&lt;p&gt;A big piece IcedTea provides is a plugin/java-web-start infrastructure.  We haven't been able to open source our plugin and of course for 6u10 we completely rewrote the plugin.  It is hoped we will open source the new plugin into the OpenJDK project but to my knowledge that decision has not been made concrete set in stone.&lt;/p&gt;

&lt;p&gt;I don't spend much of my time looking at IcedTea so don't be alarmed if I've missed something ...&lt;/p&gt;

&lt;h2&gt;OpenJDK 7 == JDK 7&lt;/h2&gt;

&lt;p&gt;Okay, given that there is not a Java7 JSR and all the JCP stuff related to that issue ... Hopefully all that will be straightened out and we do have a proper Java7 JSR, so for the following please assume that's the case, that Java7's JSR status is straightened out ... the plan is that beginning with OpenJDK7/JDK7 that the code bases will be nearly identical.  It is obviously expensive to maintain a fork, and if JDK7 were to diverge strongly from OpenJDK7 it would do two things: a) be very expensive, b) undermine our efforts at an open source ecosystem.  &lt;/p&gt;

&lt;p&gt;But &quot;nearly identical&quot; does mean it's likely there will be some differences.&lt;/p&gt;

&lt;p&gt;Remember those gaps due to encumbrances?  Some of those gaps were simply code we couldn't open source as of May 2007 but have since done so, other gaps are for code we still have to gain approval on (e.g. SNMP), but there is some code where there are open source replacements where we still use the old closed source code.  This is primarily in font and graphics rasterization.  The old closed source rasterisation code, while being encumbered, has had 10+ years of bug fixing and fine tuning etc and, for any open source replacement to displace that code in productized JDK builds, it would have to be provably as fast and stable and good quality as the existing closed code.&lt;/p&gt;

&lt;h2&gt;What took so long?&lt;/h2&gt;

&lt;p&gt;If we had followed normal release patterns JDK7 would be shipping about now.  That is, Java6 shipped in December 2006 and our normal pattern is 18-24 months between major releases meaning the JDK7 launch would have been 2-5 months ago.  What happened?  Well, clearly there was a resource crunch on several angles.  &lt;/p&gt;

&lt;p&gt;For example getting the nearly complete OpenJDK source release in May 2007 took a lot of effort from lots of people.  But there was also certain announcements at JavaONE in May 2007 (a little thing named JavaFX) which also turned into a major rethink of Java (as some have said, &lt;i&gt;this ain't yer Dad's Java&lt;/i&gt;) and also a major piece of work to accomplish.  &lt;/p&gt;

&lt;p&gt;In other words instead of producing JDK7 we did JDK6u10 and JavaFX.&lt;/p&gt;</content>
		<author>
			<name>robogeek</name>
			<email>David.Herron@Sun.COM</email>
			<uri>http://weblogs.java.net/blog/robogeek/</uri>
		</author>
		<source>
			<title type="html">David Herron's Blog</title>
			<link rel="self" href="http://weblogs.java.net/blog/robogeek/atom.xml"/>
			<id>tag:weblogs.java.net,2009:/blog/robogeek/270</id>
			<updated>2009-01-06T22:20:11+00:00</updated>
			<rights type="html">Copyright (c) 2009, robogeek</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">How not to behave as a test contractor</title>
		<link href="http://www.eviltester.com/index.php/2009/01/05/how-not-to-behave-as-a-test-contractor/"/>
		<id>http://www.eviltester.com/index.php/2009/01/05/how-not-to-behave-as-a-test-contractor/</id>
		<updated>2009-01-05T21:38:08+00:00</updated>
		<content type="html">Sometime back, Linda Wilkinson had a good post on Test Contractor behaviour I shall add a few more 'things not to do' to the list based on some recent (and slightly less recent) experiences with contract testing staff.

A few things to bear in mind before we start. When you contract as a tester you [...]</content>
		<author>
			<name>Alan Richardson</name>
			<uri>http://www.eviltester.com</uri>
		</author>
		<source>
			<title type="html">Evil Tester</title>
			<subtitle type="html">A different view of software testing</subtitle>
			<link rel="self" href="http://www.eviltester.com/index.php/feed/atom/"/>
			<id>http://www.eviltester.com/index.php/feed/atom/</id>
			<updated>2009-01-06T03:20:32+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Testability and Reproducibility</title>
		<link href="http://secretsofconsulting.blogspot.com/2009/01/testability-and-reproducibility.html"/>
		<id>tag:blogger.com,1999:blog-25922407.post-7704644917682987559</id>
		<updated>2009-01-05T13:23:29+00:00</updated>
		<content type="html">Doug Szabo has asked me two interesting questions, and we thought we would share my answers.&lt;br /&gt;&lt;span&gt;&lt;br /&gt;Doug: Can you point me to some guiding literature that explains how to make code testable?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Explanation: I noticed at least one mention in &lt;a href=&quot;http://www.geraldmweinberg.com/Site/Perfect_Software.html&quot;&gt;Perfect Software: and Other Illusions about Testing&lt;/a&gt; of making code testable. I have seen that language in a couple of other software testing books, including Software Testing Techniques. I have even been told by more than one developer that they needed to &quot;make the code more testable&quot; before they wanted me to start testing. Since the developers who told me this didn't have the faintest clue what testing was about, I really don't know what they intended to do with their code. Apparently, neither did they - I eventually asked, &quot;what do you need to do to make it more testable?&quot;, to which they replied that they didn't know. I was and still am confounded by the lack of explanation for what it is that makes code testable. I understand when code is very difficult to test, like when you have a &quot;horrible loop&quot; (Software Testing Techniques), or when multithreaded code is not first tested in single thread contexts, but I don't understand what needs to be done to code to make it testable. Are we talking about instrumenting the code with Debug statements, assert statements, or some symbol that a test tool can detect?&lt;br /&gt;&lt;span&gt;Jerry: &lt;/span&gt;I share your dismay at the lack of publications about how to make code testable. There are many, many little techniques (like initialization on entry, not exit; eliminating as many special cases as possible; and general simplification for a reader), but they're not as important as three things:&lt;br /&gt;&lt;br /&gt;1. All code should be open code that anyone in the project can read and critique.&lt;br /&gt;&lt;br /&gt;2. All code must be reviewed in a technical review (see my &lt;a href=&quot;http://www.geraldmweinberg.com/Site/Review_Handbook.html&quot;&gt;The Handbook of Walthroughs, Inspections, and Technical Reviews&lt;/a&gt;)--in which at one professional tester is present and fully participating.&lt;br /&gt;&lt;br /&gt;3. Same as 2, except for design reviews and requirements reviews).&lt;br /&gt;&lt;br /&gt;If you do these thing, the organization will quickly learn how to make code testable.&lt;br /&gt;&lt;br /&gt;But, yes, someone should write the book and start with these three things.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Q2: Do you have some strategies for triaging bugs that do not reproduce consistently?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Explanation: I was a developer before my current role of tester. Hey. Don't roll your eyes at me. I was an engineer (a real one, with a professional license and all that hoopla) before I became a developer. So I already knew the value of testing, even if I didn't know what software testing really was. Well, as an engineer it was crucial that tests be designed such that the results would be reproducible, and measurable against a control. When I got into software development, I tried to stick to the engineering principle with respect to testing. Unfortunately, as I worked on larger software projects, particularly those where my code talked to other processes, and also where I had multiple threads running, I found that bugs were starting to occur where steps to reproduce did not consistently reproduce the bug. Oh oh. I knew that meant there was something wrong, I just didn't have something that I could run under a debugger and know where to set a breakpoint. As a developer, it seemed like there were always enough reproducible bugs that I had lots of excuses to avoid trying to solve those that might not reproduce. Now, as a tester, I am empathetic to developers and have a self-imposed guideline to make an entry of any non-reproducible issue, but at the same time I don't assign it to the pool of issues to fix until a set of steps to consistently reproduce is found. What I got out of Perfect Software is that perhaps I should be passing the tough to reproduce issues over to the pool to fix, but then what would you recommend for a triage approach, to convince stakeholders to take those issues as seriously as the ones that do consistently reproduce?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Jerry: &lt;/span&gt;Great question, Doug. &lt;br /&gt;&lt;br /&gt;First answer. Try changing &quot;not reproducible&quot; to &quot;I am unable to reproduce.&quot;&lt;br /&gt;&lt;br /&gt;Then parse the second category into sub-categories like: &lt;br /&gt;&lt;br /&gt;a. I saw this one, but was never able to make it happen again. &lt;br /&gt;&lt;br /&gt;b. I see this when I run with this setup, but sometimes I don't. &lt;br /&gt;&lt;br /&gt;c. This is the same anomaly I see under several setups, but not all the time. &lt;br /&gt;&lt;br /&gt;d. Under X setup, this happens sometimes and not other times. There may be something different from one X to the other, but I' not seeing it.&lt;br /&gt;&lt;br /&gt;In each case, you are unable to pinpoint the fault underlying the failure. There may be several faults producing the same failure, or different failures appearing from the same underlying fault. Since you don't really know the frequency of this failure, the way I use to triage the failure is to apply the question: &quot;What would it cost us every time this failure appears in the field?&quot;&lt;br /&gt;&lt;br /&gt;If that number is high, then get a team working on the bug. If it's low, let the bug rest while (perhaps) new data accumulates or the bug disappears mysteriously as other changes are made to the code.</content>
		<author>
			<name>Oregon Writers Network</name>
			<email>hardpretzel@earthlink.net</email>
			<uri>http://secretsofconsulting.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">The Secrets of 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; and &lt;a href=&quot;http://www.geraldmweinberg.com/Site/More_Secrets.html&quot;&gt;More Secrets of Consulting&lt;/a&gt;, as well as my work at &lt;a href=&quot;http://ayeconference.com/&quot;&gt;the AYE Conference&lt;/a&gt;

I invite all consultants to participate by asking questions and responding.</subtitle>
			<link rel="self" href="http://secretsofconsulting.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-25922407</id>
			<updated>2009-01-07T00:20:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Code Coverage and the Zune Bug</title>
		<link href="http://use.perl.org/~Ovid/journal/38221?from=rss"/>
		<id>http://use.perl.org/~Ovid/journal/38221?from=rss</id>
		<updated>2009-01-05T10:20:30+00:00</updated>
		<content type="html">&lt;p&gt;Many of you have probably heard of the &lt;a href=&quot;http://news.bbc.co.uk/1/hi/technology/7807797.stm&quot;&gt;Zune bug&lt;/a&gt; and some of you may have seen the &lt;a href=&quot;http://pastie.org/349916&quot;&gt;source code of the bug&lt;/a&gt;.  Specifically, the bug resides in this:&lt;/p&gt;&lt;blockquote&gt;&lt;div&gt;&lt;p&gt; &lt;tt&gt;BOOL ConvertDays(UINT32 days, SYSTEMTIME* lpTime)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; int dayofweek, month, year;&lt;br /&gt;&amp;nbsp; &amp;nbsp; UINT8 *month_tab;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; //Calculate current day of the week&lt;br /&gt;&amp;nbsp; &amp;nbsp; dayofweek = GetDayOfWeek(days);&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; year = ORIGINYEAR;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; while (days &amp;gt; 365)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (IsLeapYear(year))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (days &amp;gt; 366)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; days -= 366;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; year += 1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; days -= 365;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; year += 1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; // Determine whether it is a leap year&lt;br /&gt;&amp;nbsp; &amp;nbsp; month_tab = (UINT8 *)((IsLeapYear(year))? monthtable_leap : monthtable);&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; for (month=0; month&amp;lt;12; month++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (days &amp;lt;= month_tab[month])&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; days -= month_tab[month];&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; month += 1;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; lpTime-&amp;gt;wDay = days;&lt;br /&gt;&amp;nbsp; &amp;nbsp; lpTime-&amp;gt;wDayOfWeek = dayofweek;&lt;br /&gt;&amp;nbsp; &amp;nbsp; lpTime-&amp;gt;wMonth = month;&lt;br /&gt;&amp;nbsp; &amp;nbsp; lpTime-&amp;gt;wYear = year;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; return TRUE;&lt;br /&gt;}&lt;/tt&gt;&lt;/p&gt;&lt;/div&gt; &lt;/blockquote&gt;&lt;p&gt;Regardless of whether or not you know this programming language (C), you should be able to see what caused the Zune player to freeze.  In fact, it's a common &lt;a href=&quot;http://c2.com/xp/CodeSmell.html&quot;&gt;code smell&lt;/a&gt;:  the &lt;a href=&quot;http://c2.com/cgi/wiki?ArrowAntiPattern&quot;&gt;arrow anti-pattern&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Still don't see it?  Take a close look at that while/if/if loop.  Still don't see it?  Well, there was &lt;a href=&quot;http://www.reddit.com/r/programming/comments/7muzl/source_code_of_the_file_containing_the_zune_bug/&quot;&gt;some discussion of this code over at Reddit&lt;/a&gt;.  There was some talk about whether or not it would be possible to find this bug automatically and that's really an interesting topic.  Some type inference systems &lt;a href=&quot;http://www.usenix.org/publications/library/proceedings/vhll/full_papers/koenig.a&quot;&gt;can catch infinite loops&lt;/a&gt; (the paper that Mark Jason Dominus drew on for his &lt;a href=&quot;http://perl.plover.com/classes/typing/samples/slide030.html&quot;&gt;Strong Typing and Perl&lt;/a&gt; talk).  However, I doubt such inference could catch this bug.&lt;/p&gt;&lt;p&gt;Using type systems to find infinite loop bugs requires that you have a sound type system for your language (&lt;a href=&quot;http://www.pphsg.org/cdsmith/types.html&quot;&gt;&quot;sound type systems&quot; has a very specific meaning&lt;/a&gt;), something Perl 5 does not have (Perl 6 won't, either).  Microsoft has &lt;a href=&quot;http://research.microsoft.com/en-us/news/features/terminator.aspx&quot;&gt;Terminator&lt;/a&gt;, software which looks for infinite loops and, while admitting it can't handle everything, can find many infinite loop bugs. But Terminator probably isn't going to work for us -- it appears to be geared towards C programs and in any event, dynamic languages cause all sorts of havoc with many analysis tools.&lt;/p&gt;&lt;p&gt;So what are we to do?  Given that the code above is probably a small sample in many hundreds of thousands of lines of code, it's quite understandable how that could be missed.  But can we avoid that?&lt;/p&gt;&lt;p&gt;Well, yeah, actually.  It wouldn't be fully automatic, but the simple answer is more than just &quot;write tests for you software&quot;.  It's &quot;use code coverage tools&quot;.  Rewriting the problem in Perl (and reformatting to avoid the excessive horizontal whitespace):&lt;/p&gt;&lt;blockquote&gt;&lt;div&gt;&lt;p&gt; &lt;tt&gt; 1: while ( $days &amp;gt; 365 ){&lt;br /&gt; 2:&amp;nbsp; &amp;nbsp; if ( is_leap_year($year) ) {&lt;br /&gt; 3:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ( $days &amp;gt; 366 ) {&lt;br /&gt; 4:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $days -= 366;&lt;br /&gt; 5:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $year += 1;&lt;br /&gt; 6:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt; 7:&amp;nbsp; &amp;nbsp; }&lt;br /&gt; 8:&amp;nbsp; &amp;nbsp; else {&lt;br /&gt; 9:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $days -= 365;&lt;br /&gt;10:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $year += 1;&lt;br /&gt;11:&amp;nbsp; &amp;nbsp; }&lt;br /&gt;12: }&lt;/tt&gt;&lt;/p&gt;&lt;/div&gt; &lt;/blockquote&gt;&lt;p&gt; &lt;em&gt;Now&lt;/em&gt; does the problem stand out?  What happens if &lt;tt&gt;$day == 366&lt;/tt&gt;?  Now we have a problem, but code coverage would have caught that.&lt;/p&gt;&lt;p&gt;Specifically, &quot;conditional coverage&quot; would have caught that the condition in line 3 was never false.  Then, a sharp programmer could examine the coverage report and for those conditions which are easy to test, test them!  It doesn't guarantee that your software is bug free, but it would have helped Microsoft avoid an embarrassing PR fiasco like this one.&lt;/p&gt;</content>
		<author>
			<name>Curtis &quot;Ovid&quot; Poe</name>
			<uri>http://use.perl.org/~Ovid/journal/</uri>
		</author>
		<source>
			<title type="html">Ovid's Journal</title>
			<subtitle type="html">Ovid's use Perl Journal</subtitle>
			<link rel="self" href="http://use.perl.org/~Ovid/journal/rss"/>
			<id>http://use.perl.org/~Ovid/journal/rss</id>
			<updated>2009-01-05T10:20:30+00:00</updated>
			<rights type="html">use Perl; is Copyright 1998-2006, Chris Nandor. Stories, comments, journals, and other submissions posted on use Perl; are Copyright their respective owners.</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Buccaneer-Scholar Site is Up</title>
		<link href="http://www.satisfice.com/blog/archives/141"/>
		<id>http://www.satisfice.com/blog/archives/141</id>
		<updated>2009-01-05T02:20:38+00:00</updated>
		<content type="html">&lt;p&gt;My book &amp;#8220;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1439109087/satisin&quot; target=&quot;_blank&quot;&gt;Secrets of a Buccaneer-Scholar&lt;/a&gt;&amp;#8221; will be published in September by Simon and Schuster. It&amp;#8217;s a book about how I approach self-education, personal branding, and original thinking. It&amp;#8217;s the story of how I got started and how I got along all these years without any formal education or certification. It&amp;#8217;s not a book about testing, but it will be highly relevant to testers. It will be relevant to any knowledge worker who wants to compete better in a down economy.&lt;/p&gt;
&lt;p&gt;The book is finished and delivered, it just takes a long time to get through production and sell into book stores. While I&amp;#8217;m waiting and writing the next buccaneer book in the series, I&amp;#8217;ve started a new site at &lt;a href=&quot;http://www.buccaneerscholar.com&quot; target=&quot;_blank&quot;&gt;buccaneerscholar.com&lt;/a&gt; and a &lt;a href=&quot;http://www.buccaneerscholar.com/blog&quot; target=&quot;_blank&quot;&gt;new blog&lt;/a&gt;. There I will talk about the more general topics of thinking and learning that are not specific to testing.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m also creating a class to teach self-education (not as ironic as it sounds&amp;#8230; but it does sound ironic, eh?).&lt;/p&gt;
&lt;p&gt;This blog will continue to deal exclusively with testing and issues directly related to the software development industry.&lt;/p&gt;</content>
		<author>
			<name>james</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/atom"/>
			<id>http://www.satisfice.com/blog/feed/atom</id>
			<updated>2009-01-05T02:20:38+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The Great Implication of Context-Driven Methodology</title>
		<link href="http://www.satisfice.com/blog/archives/140"/>
		<id>http://www.satisfice.com/blog/archives/140</id>
		<updated>2009-01-05T00:31:16+00:00</updated>
		<content type="html">&lt;p&gt;Sometimes I hear people react to &lt;a href=&quot;http://www.satisfice.com/kaner/?p=45&quot;&gt;context-driven methodology&lt;/a&gt; with a shrug. &amp;#8220;Yeah, everything depends on context. So what?&amp;#8221;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the so what: &lt;strong&gt;If all practice depends upon context, then the competent practitioner must know how to invent, evaluate, criticize, and modify practices.&lt;/strong&gt; In other words, focus must shift from merely copying and memorizing practices to &lt;em&gt;developing skill in the craft&lt;/em&gt;.This is a profoundly different focus.&lt;/p&gt;
&lt;p&gt;Wouldn&amp;#8217;t it be absurd for someone to claim that the best way to commute to work, for everyone in the software industry, is to take a horse and buggy? Wouldn&amp;#8217;t it still be absurd even if they added the words &amp;#8220;but you should take context into account and do what&amp;#8217;s right for you&amp;#8221; at the end of such a strange claim? When consultants talk to people from different practical contexts, and they treat context variables as a trivial concern, they do their audience little service. That&amp;#8217;s the trouble with &amp;#8220;best practices.&amp;#8221;&lt;/p&gt;
&lt;p&gt;To say that context matters but that &amp;#8220;almost always X is the right thing to do&amp;#8221; is to speak like a parent dictating to a child. I fear that many testing bloggers and consultants are happy to do just that. But if what we want is a meeting of minds and sharing of wisdom, we need to practice talking about context-dynamics and the dynamics of practices that serve those contexts.&lt;/p&gt;
&lt;p&gt;The most recent time I practiced this, myself, was in writing the previous paragraph. I almost wrote that you should not, as a methodologist, speak to your clients as a parent dictating to children. But then I noticed that very statement is just such a dictum. I don&amp;#8217;t want to be like that. So I had to add &amp;#8220;But if what we want is&amp;#8230;&amp;#8221; to at least acknowledge that even here there are different ways to be, depending on context.&lt;/p&gt;
&lt;h2&gt;A Suggestion&lt;/h2&gt;
&lt;p&gt;A great way to automatically avoid the perils of best practice talk is simply to talk about your own experiences and preferences, rather than make general prescriptions. This is why, in peer conferences such as LAWST, we focus on experience reports (actually we called them &amp;#8220;war stories&amp;#8221; until our terminology was attacked by bloodthirsty pacifists) rather than advertisments for good practice.&lt;/p&gt;</content>
		<author>
			<name>james</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/atom"/>
			<id>http://www.satisfice.com/blog/feed/atom</id>
			<updated>2009-01-05T02:20:38+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WPF Application Quality Guide</title>
		<link href="http://www.teknologika.com/blog/wpf-application-quality-guide/"/>
		<id>http://www.teknologika.com/blog/?p=468</id>
		<updated>2009-01-04T21:38:38+00:00</updated>
		<content type="html">&lt;p&gt;Microsoft have released v0.4 of the &lt;a href=&quot;http://windowsclient.net/wpf/white-papers/wpf-app-quality-guide.aspx&quot;&gt;WPF Application Quality Guide&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Introducing &amp;#8220;WPF Application Quality Guide v.0.4&amp;#8243;&lt;/p&gt;
&lt;p&gt;In light of the rapid adoption of the WPF and the continuous requests from partners and customers, the WPF team at Microsoft is happy to present the fourth preliminary release of the “WPF Application Quality Guide”. We plan to release the Guide in stages, updating and fine-tuning the content, based on feedback provided by you. This fourth release contains a updated reading roadmap that helps guide you through the sections based on your needs, data-driven testing, stress and stability testing, accessibility testing, updated globalization and localization testing, as well as TestApi in tools section.
&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://feeds.feedburner.com/~a/Teknologika?a=BD3NUZ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~a/Teknologika?i=BD3NUZ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Bruce McLeod</name>
			<uri>http://www.teknologika.com/blog</uri>
		</author>
		<source>
			<title type="html">Teknologika</title>
			<subtitle type="html">The software testing blog of Bruce McLeod</subtitle>
			<link rel="self" href="http://www.teknologika.com/blog/SyndicationService.asmx/GetAtom"/>
			<id>http://www.teknologika.com/blog/</id>
			<updated>2009-01-07T01:20:20+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Happy New Year and....Teach Me Web Testing!</title>
		<link href="http://agiletesting.blogspot.com/2009/01/happy-new-year-andteach-me-web-testing.html"/>
		<id>tag:blogger.com,1999:blog-9238405.post-3157058959796064909</id>
		<updated>2009-01-04T14:10:27+00:00</updated>
		<content type="html">Happy New Year everybody! I hope 2009 won't rush by as quickly as 2008 did...&lt;br /&gt;&lt;br /&gt;Now for the 'Teach Me Web Testing' part: Steve Holden graciously offered to be the host of an Open Space at PyCon 2009 on this topic. Steve started the 'Teach Me...' series at the last PyCon, with his now famous '&lt;a href=&quot;http://catherinedevlin.blogspot.com/2008/03/teach-me-twisted.html&quot;&gt;Teach Me Twisted&lt;/a&gt;' session.&lt;br /&gt;&lt;br /&gt;For this format to work, we need to put together an audience which is formed of at least 3 types of people:&lt;br /&gt;&lt;br /&gt;1) people interested in learning about Web testing in Python&lt;br /&gt;2) people who write Python Web testing tools for fun and profit&lt;br /&gt;3) people who use Python Web testing tools extensively for fun and profit&lt;br /&gt;&lt;br /&gt;My role here is to rally people in categories 2 and 3. So if you're either a Web testing tool author or somebody who uses Web testing tools extensively in your job, please either comment on this post, or send me email at grig at gheorghiu dot net and let me know if you'd be interested in attending this Open Space session. Knowing Steve, I can guarantee it will be LOTS of fun.</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 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>2009-01-06T22:20:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Credo</title>
		<link href="http://www.developsense.com/2009/01/credo.html"/>
		<id>tag:blogger.com,1999:blog-6567846.post-5521412593805101954</id>
		<updated>2009-01-04T12:07:40+00:00</updated>
		<content type="html">If you want to understand &lt;a href=&quot;http://www.satisfice.com/kaner/&quot;&gt;what context-driven testing is all about&lt;/a&gt;, &lt;a href=&quot;http://www.satisfice.com&quot;&gt;James Bach&lt;/a&gt; and &lt;a href=&quot;http://www.kaner.com&quot;&gt;Cem Kaner &lt;/a&gt;have recently collaborated on a statement of what it is, and a lengthy explication.  It's posted on &lt;a href=&quot;http://www.satisfice.com/kaner&quot;&gt;Cem Kaner's blog&lt;/a&gt; at &lt;a href=&quot;http://www.satisfice.com/kaner&quot;&gt;http://www.satisfice.com/kaner&lt;/a&gt;.  The posting covers the territory admirably, and I wholeheartedly agree with it.&lt;br /&gt;&lt;br /&gt;In particular, the statement emphasizes that adaptation to the needs of the project is the &lt;span&gt;first&lt;/span&gt; step in the context-driven approach.  This makes context-driven distinct from other approaches that may acknowledge the importance of context, but make something else&amp;mdash;a standards focus, iterative development and unit tests, &quot;best practices&quot;, a particular process model&amp;mdash;paramount.</content>
		<author>
			<name>Michael</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.developsense.com/blog.html</uri>
		</author>
		<source>
			<title type="html">DevelopSense Blog</title>
			<subtitle type="html">Observations on software testing and quality, by Michael Bolton</subtitle>
			<link rel="self" href="http://www.developsense.com/blog/atom.xml"/>
			<id>tag:blogger.com,1999:blog-6567846</id>
			<updated>2009-01-04T16:20:28+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Context-Driven Testing Clarified</title>
		<link href="http://www.satisfice.com/blog/archives/139"/>
		<id>http://www.satisfice.com/blog/archives/139</id>
		<updated>2009-01-04T07:24:17+00:00</updated>
		<content type="html">&lt;p&gt;Cem Kaner has just posted a &lt;a href=&quot;http://www.satisfice.com/kaner/?p=45&quot; target=&quot;_blank&quot;&gt;clarification of context-driven testing&lt;/a&gt;. I contributed to it, and it also represents my point of view.&lt;/p&gt;
&lt;p&gt;One reason we&amp;#8217;ve come up with this new description is that several people (we don&amp;#8217;t really know who) have posted or copied descriptions of context-driven testing that bear little resemblance to the vision of the founders of the school. These descriptions typically claim that context-driven is a flavor of Agile. No, no, no, no, no, it isn&amp;#8217;t. If context-driven testing is a flavor of anything, it&amp;#8217;s a flavor of problem-solving.&lt;/p&gt;</content>
		<author>
			<name>james</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/atom"/>
			<id>http://www.satisfice.com/blog/feed/atom</id>
			<updated>2009-01-05T02:20:38+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">What is context-driven testing?</title>
		<link href="http://www.satisfice.com/kaner/?p=45"/>
		<id>http://www.satisfice.com/kaner/?p=45</id>
		<updated>2009-01-04T04:20:08+00:00</updated>
		<content type="html">James, Bret and I published our definition of context-driven testing at http://www.context-driven-testing.com/.

Some people have found the definition too complex and have tried to simplify it, attempting to equate the approach with Agile development or Agile  testing, or with the exploratory style of software testing. Here's another crack at a definition:

    Context-driven testers choose their testing objectives, techniques, and deliverables (including test documentation) by looking first to the details of the specific situation, including the desires of the stakeholders who commissioned the testing. The essence of context-driven testing is project-appropriate application of skill and judgment. The Context-Driven School of testing places this approach to testing within a humanistic social and ethical framework.

    Ultimately, context-driven testing is about doing the best we can with what we get. Rather than trying to apply &quot;best practices,&quot; we accept that very different practices (even different definitions of common testing terms) will work best under different circumstances.</content>
		<author>
			<name>kaner</name>
			<uri>http://www.satisfice.com/kaner</uri>
		</author>
		<source>
			<title type="html">Cem Kaner's Blog</title>
			<subtitle type="html">On the craft and community of software testing</subtitle>
			<link rel="self" href="http://www.satisfice.com/kaner/?feed=atom"/>
			<id>http://www.satisfice.com/kaner/?feed=atom</id>
			<updated>2009-01-04T04:20:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">&quot;Don't Shout at your Disks&quot; and Performance Testing</title>
		<link href="http://www.kohl.ca/blog/archives/000202.html"/>
		<id>http://www.kohl.ca/blog/archives/000202.html</id>
		<updated>2009-01-02T19:07:32+00:00</updated>
		<content type="html">I get asked about performance and load testing a great deal. It's fascinating work, and sometimes the strangest causes of performance problems can occur in a system. When people ask me about what goes into performance and load testing, it's...</content>
		<author>
			<name>Jonathan Kohl</name>
			<uri>http://www.kohl.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Collaborative Software Testing</title>
			<subtitle type="html">Jonathan Kohl's blog on software investigation.</subtitle>
			<link rel="self" href="http://www.kohl.ca/blog/index.rdf"/>
			<id>http://www.kohl.ca/blog/index.rdf</id>
			<updated>2009-01-06T22:20:28+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">A Little Parrot Task for the Interested</title>
		<link href="http://use.perl.org/~chromatic/journal/38201?from=rss"/>
		<id>http://use.perl.org/~chromatic/journal/38201?from=rss</id>
		<updated>2009-01-02T07:20:15+00:00</updated>
		<content type="html">&lt;p&gt;If you have some spare time in the next couple of weeks, the &lt;a href=&quot;http://www.parrot.org/scratch/todoskip-test-review&quot;&gt;Parrot TODO/skip test review&lt;/a&gt; is an embarrassingly parallel milestone which is suitable for anyone who can read code written in Perl 5 and skim code written in PIR.&lt;/p&gt;&lt;p&gt;All you need to do is pick a test file not listed on that page which contains either TODO or SKIP (capitalization does not matter) and list it on the page, with a count of the affected tests and a marker whether there's an RT or TT referenced in the reason.&lt;/p&gt;&lt;p&gt;That's it.&lt;/p&gt;&lt;p&gt;You can mail the Parrot developer list directly or tell someone in #parrot on irc.perl.org.&lt;/p&gt;&lt;p&gt;Reviewing one test file is a help.  Reviewing more is wonderful.  If you have five minutes, you can do it!&lt;/p&gt;</content>
		<author>
			<name>chromatic</name>
			<uri>http://use.perl.org/~chromatic/journal/</uri>
		</author>
		<source>
			<title type="html">chromatic's Journal</title>
			<subtitle type="html">chromatic's use Perl Journal</subtitle>
			<link rel="self" href="http://use.perl.org/~chromatic/journal/rss"/>
			<id>http://use.perl.org/~chromatic/journal/rss</id>
			<updated>2009-01-02T07:20:15+00:00</updated>
			<rights type="html">use Perl; is Copyright 1998-2006, Chris Nandor. Stories, comments, journals, and other submissions posted on use Perl; are Copyright their respective owners.</rights>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">New Year's Resolutions</title>
		<link href="http://www.szabgab.com/blog/2009/01/1230804123.html"/>
		<id>http://www.szabgab.com/blog/2009/01/1230804123.html</id>
		<updated>2009-01-01T12:02:03+00:00</updated>
		<content type="html">&lt;p&gt;
I already had one a couple of month ago &lt;a href=&quot;http://szabgab.com/blog/2008/10/1224089702.html&quot;&gt;Shana Tova - New Year's resolution&lt;/a&gt;
so now a few other items.
&lt;/p&gt;
&lt;p&gt;
&lt;ol&gt;
&lt;li&gt;Keep writing &lt;a href=&quot;http://padre.perlide.org/&quot;&gt;Padre, the perl IDE&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Offer the &lt;a href=&quot;http://szabgab.com/perl_in_test_automation.html&quot;&gt;Test Automation using Perl 5&lt;/a&gt; training class in Europe.&lt;/li&gt;
&lt;li&gt;Send more articles to the &lt;a href=&quot;http://szabgab.com/test_automation_tips.html&quot;&gt;Test Automation Tips&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Prepare a one-day training class for Perl 6 and start offering it.&lt;/li&gt;
&lt;li&gt;But most urgently, help preparing the annual accounting papers &lt;b&gt;on time&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;</content>
		<author>
			<name>Gábor Szabó</name>
			<uri>http://www.szabgab.com</uri>
		</author>
		<source>
			<title type="html">Blog of Gábor Szabó</title>
			<subtitle type="html">Gabor Szabo about Perl, automated testing, dynamic languages and everyting else</subtitle>
			<link rel="self" href="http://szabgab.com/blog/szabgab.rss"/>
			<id>http://szabgab.com/blog/szabgab.rss</id>
			<updated>2009-01-07T04:20:34+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Refactoring Finds Dead Code</title>
		<link href="http://blog.objectmentor.com/articles/2008/12/31/refactoring-finds-dead-code"/>
		<id>urn:uuid:00a7eddd-61a2-4564-88f1-666dc29cc3f3</id>
		<updated>2008-12-31T21:08:55+00:00</updated>
		<content type="html">&lt;p&gt;One of the many things that I just love about my job as a consultant/mentor is when I actually get to sit down with programmers and pair program with them. This doesn&amp;#8217;t seem to happen nearly as often as I would like, so when two developers at a recent client site asked me if I could look at some legacy code to see if I could figure out how to get some tests around it, I jumped at the opportunity. We acquired a room equipped with a projector and a whiteboard. A laptop was connected to the projector and we were all able to comfortably view the code.&lt;/p&gt;


	&lt;p&gt;I visit a lot of different companies and see a lot of absolutely ghastly code. What I was looking at here wasn&amp;#8217;t all that bad. Variable names were not chosen to limit keystrokes and method names appeared to be descriptive. This was good news, as I needed to understand how this was put together before I could offer help with a testing strategy.&lt;/p&gt;


	&lt;p&gt;As we walked through the code, I noticed that there were classes in the project directory ending in &amp;#8216;Test&amp;#8217;. This took me by surprise. Usually when I&amp;#8217;m helping people with legacy code issues, there aren&amp;#8217;t any tests. Here, there were tests in place and they actually passed. Very cool, but now my mission wasn&amp;#8217;t clear to me as I thought my help was needed getting tests in place around legacy code.&lt;/p&gt;


	&lt;p&gt;The developers clarified that they wanted help in testing private methods. Ah ha, the plot thickens.&lt;/p&gt;


	&lt;p&gt;The question of testing private methods comes up frequently whether I&amp;#8217;m teaching a class or consulting on a project. My first response is a question. &amp;#8220;Is the private method being tested through the public interface to the class?&amp;#8221; If that&amp;#8217;s the case, then there&amp;#8217;s nothing to worry about and I can steer the conversation away from testing private methods to testing behaviors of a class instead of trying to test individual methods. Note that a private method being tested through its public interface would be guaranteed if the class was developed &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; style where the test is written first, followed by one or more public methods to make the test pass, followed by one or more extract method refactorings, which would be the birth of the private methods. This is almost never the case. My client didn&amp;#8217;t know how the code was developed, but by inspection they concluded that the parameters of the test were adequately exercising the private method.&lt;/p&gt;


	&lt;p&gt;It looked like my work was done here. But not so fast.&lt;/p&gt;


	&lt;p&gt;I have a policy that says that whenever I have code up in an editor, I have to try to leave it just a little bit better than when I found it. Since we had put the testing matter to rest and we still had some time left in the conference room before another meeting started, I suggested that we see if we could make some small improvements to the code we were examining.&lt;/p&gt;


	&lt;p&gt;As I said earlier, the code wasn&amp;#8217;t horrible. The code smell going past my nostrils was Long Method and the cure was Extract Method.&lt;/p&gt;


	&lt;p&gt;The overall structure of the method we were examining was&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
    if( conditional_1 )
    {
        // do lots of complicated stuff
    }
    else if( conditional_2 )
    {
        // do even more complicated stuff
    }
    else
    {
        // do stuff so complicated nobody understood it
    }
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;where conditional_1 was some horribly convoluted expression involving lots of &amp;#38;&amp;#38;&amp;#8217;s, ||&amp;#8217;s, and parentheses. Same for condition_2, which also had a few ^&amp;#8217;s thrown in for good luck. To understand what the method did, one would have to first understand the details of how the method did it.&lt;/p&gt;


	&lt;p&gt;I asked the developers if they could come up with a nice, descriptive method name that described what I&amp;#8217;m calling condition_1 so that we could do an extract method refactoring and the code would look like:&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
    if( descriptive_name() )
    {
        // do lots of complicated stuff
    }
    // etc
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;Now there were less details to understand when trying to determine what this method did. If we were to stop here and check in the code, we could leave the session feeling good as the code is better than when we started. But we still had time before we had to abandon our conference room so I pressed on.&lt;/p&gt;


	&lt;p&gt;&amp;#8220;Can you summarize what this code does as a descriptive method name,&amp;#8221; I asked. The developers pondered a few moments and came up with what they felt was a good name. Excellent. We did the same procedure for the &amp;#8220;else if&amp;#8221; clause. When we finished that, one of the developers said something along the lines of, &amp;#8220;That was the easy part, I have no idea what this [else] remaining code does.&amp;#8221; I was going to pat everybody on the back and call it a day because the code had improved tremendously from when we started, but the developers seemed to have a &amp;#8220;we can&amp;#8217;t stop now&amp;#8221; attitude. They studied the code, pondered, cursed, discussed some more, and then one of them said, &amp;#8220;This code can never execute!&amp;#8221;&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;d like to use the expression, &amp;#8220;You could have heard a pin drop,&amp;#8221; to describe the silence in the room, but since there were only three of us, the phrase looses its power. As it turns out, now that the if() and else if() conditionals were given descriptive names and people could grok them at a glance, it became obvious that the business rules didn&amp;#8217;t permit the final else &amp;#8211; the first two conditions were all that could exist and the most complicated code of all was never being called. This was downright comical!&lt;/p&gt;


	&lt;p&gt;I asked if the tests would still pass if we deleted the code and after a short examination of the tests, the developers weren&amp;#8217;t as confident that the test parameters actually hit that area of code. There was a log() statement in that code and one of the developers was going to examine the production logs to see if the code ever executed.&lt;/p&gt;


	&lt;p&gt;So there you have it, refactor your code and the bad parts just go away!&lt;/p&gt;</content>
		<author>
			<name>Bob Koss</name>
			<uri>http://blog.objectmentor.com</uri>
		</author>
		<source>
			<title type="html">Object Mentor Blog</title>
			<link rel="self" href="http://blog.objectmentor.com/xml/atom/feed.xml"/>
			<id>tag:blog.objectmentor.com,2005:Typo</id>
			<updated>2009-01-07T00:20:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Fudge anyone?</title>
		<link href="http://blog.objectmentor.com/articles/2008/12/31/fudge-anyone"/>
		<id>urn:uuid:36578e35-eb79-4c39-bb15-e36e3acf4548</id>
		<updated>2008-12-31T16:33:49+00:00</updated>
		<content type="html">&lt;p&gt;Back in September, when I was just staring the &lt;a href=&quot;http://fitnesse.org/FitNesse.TestSystems&quot;&gt;Slim&lt;/a&gt; project, I made a crucial architectural decision.  I made it dead wrong.  And then life turned to fudge&amp;#8230;&lt;/p&gt;


	&lt;p&gt;The issue was simple.  Slim tables are, well, tables just like Fit tables are.  How should I parse these tables?  Fit parses &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;.  FitNesse parses wiki text &lt;em&gt;into&lt;/em&gt; HTML and delivers it to Fit.  Where should Slim fit in all of this?&lt;/p&gt;


	&lt;p&gt;Keep in mind that Fit &lt;em&gt;must&lt;/em&gt; parse &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; since it lives on the far side of the FitNesse/SUT boundary.  Fit doesn&amp;#8217;t have access to wiki text.  Slim tables, on the other hand, live on the &lt;em&gt;near&lt;/em&gt; side of the FitNesse/SUT boundary, and so have full access to wiki text, and the built in parsers that parse that text.&lt;/p&gt;


	&lt;p&gt;So it seemed to me that I had two options.&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;Follow the example of Fit and parse wiki text into &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;, and then have the Slim Tables parse the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; in order to process the tables.  &lt;/li&gt;
		&lt;li&gt;Take advantage of the built in wiki text parser inside of FitNesse and bypass &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; altogether.&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;I chose the latter of the two because the Parsing system of FitNesse is &lt;em&gt;trivial&lt;/em&gt; to use.  You just hand it a string of wiki text, and it hands you a nice little parse tree of wiki widgets.  All I had to do was walk that parse three and process my tables.  Voila!&lt;/p&gt;


	&lt;p&gt;This worked great!  In a matter of hours I was making significant progress on processing Slim decision tables.  Instead of worrying about parsing &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; and building my own parse tree, I could focus on the problems of translating tables into Slim directives and then using the return values from Slim to colorize the table.&lt;/p&gt;


	&lt;p&gt;&lt;em&gt;Generating&lt;/em&gt; html was no problem since that&amp;#8217;s what FitNesse does anyway.  All I had to do was modify the elements of the parse tree and then simply tell the tree to convert itself to &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;.  What a dream.&lt;/p&gt;


	&lt;p&gt;Or so it seemed.  Although things started well, progress started to slow before the week was out.  The problem was that the FitNesse parser is &lt;em&gt;tuned&lt;/em&gt; to the esoteric needs of FitNesse.  The parser makes choices that are perfectly fine if your goal is to generate &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; and pass it to Fit, but that aren&amp;#8217;t quite so nice when you&amp;#8217;re goal is to use the parse tree to process Slim tables.  As a simple example, consider the problem of literals.&lt;/p&gt;


	&lt;p&gt;In FitNesse, any camel case phrase fits the pattern of a wiki word and will be turned into a wiki link.  Sometimes, though, you want to use a camel case phrase and you &lt;em&gt;don&amp;#8217;t&lt;/em&gt; want it converted to a link.  In that case you surround the phrase with literal marks as follows: &lt;code&gt;!- FitNesse-!&lt;/code&gt;.  Anything between literal marks is simply ignored by the parser and passed through to the end.&lt;/p&gt;


	&lt;p&gt;Indeed, things inside of literals are not even escaped for html!  If you put &lt;code&gt;&amp;lt;b&amp;gt;hi&amp;lt;/b&amp;gt;&lt;/code&gt; into a wiki page, it will escape the text you&amp;#8217;ll see &lt;code&gt;&amp;lt;b&amp;gt;hi&amp;lt;/b&amp;gt;&lt;/code&gt; on the screen instead of a bold &amp;#8220;hi&amp;#8221;.  On the other hand, if you put &lt;code&gt;!- &amp;lt;b&amp;gt;hi&amp;lt;/b&amp;gt;-!&lt;/code&gt; on a page, then the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; is left unescaped and a boldfaced &amp;#8220;hi&amp;#8221; &lt;em&gt;will&lt;/em&gt; appear on the screen.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m telling you all of this because the devil is in the details&amp;#8212;so bear with me a bit longer.&lt;/p&gt;


	&lt;p&gt;You know how the C and C++ languages have a preprocessor?  This preprocessor handles all the &lt;code&gt;#include&lt;/code&gt; and &lt;code&gt;#define&lt;/code&gt; statements and then hands the resulting text off to the true compiler.  Well, the wiki parser works the same way!  Literals and &lt;code&gt;!define&lt;/code&gt; variables are processed first, by a different pass of the parser.  Then all the rest of the wiki widgets are parsed by the true parser.  The reason that we had to do this is even more devilishly detailed; so I&amp;#8217;ll spare you.  Suffice it to say that the reasons we need that preprocessor are similar to the reasons that C and C++ need it.&lt;/p&gt;


	&lt;p&gt;What does the preprocessor do with a literal?  It converts it into a special widget.  That widget looks like this: &lt;code&gt;!lit?23?&lt;/code&gt;  What does that mean?  It means replace me with the contents of literal #23.  You see, when FitNesse sees &lt;code&gt;!- FitNesse-!&lt;/code&gt; it replaces it with &lt;code&gt;!lit?nn?&lt;/code&gt; and squirrels &lt;code&gt;FitNesse&lt;/code&gt; away in literal slot &lt;em&gt;nn&lt;/em&gt;.  During the second pass, that &lt;code&gt;!lit?nn?&lt;/code&gt; is replaced with the contents of literal slot &lt;em&gt;nn&lt;/em&gt;.  Simple, right?&lt;/p&gt;


	&lt;p&gt;OK, now back to &lt;span class=&quot;caps&quot;&gt;SLIM&lt;/span&gt; table processing.  There I was, in Norway, teaching a class during the day and coding Slim at night, and everything was going just great.  And then, during one of my tests, I happened to put a literal into one of the test tables.  This is perfectly normal, I didn&amp;#8217;t want some camel case phrase turned into a link.  But this perfectly normal gesture made a unit test fail for a very strange reason.  I got this wonderful message from junit: &lt;code&gt;expected MyPage but was !lit?3?&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;I knew exactly what this meant.  It meant that the value &lt;code&gt;MyPage&lt;/code&gt; had been squirreled away by the first pass of the parser.  I also knew that I had utterly no reasonable way of getting at it.  So I did the only thing any sane programmer would do.  I wrote my own preprocessor and used it instead of the standard one.  This was &amp;#8220;safe&amp;#8221; since in the end I simply reconvert all the colorized tables back into wiki text and let the normal parser render it into &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;It was a bit of work, but I got it done at one am on a cold Norwegian night.  Tests passing, everything great!&lt;/p&gt;


	&lt;p&gt;Ah, but no.  By writing my own preprocessor, I broke the &lt;code&gt;!define&lt;/code&gt; variable processing &amp;#8211; subtly.  And when I found and fixed that I had re-broken literal processing &amp;#8211; subtly.&lt;/p&gt;


	&lt;p&gt;If you were following my tweets at the time you saw me twitter ever more frantically about literals.  It was the proverbial ball of Mercury.  Every time I put my thumb on it&lt;sup&gt;&lt;a href=&quot;http://blog.objectmentor.com/xml/atom/feed.xml#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; it would squirt away and take some new form.&lt;/p&gt;


	&lt;p&gt;I fell into a trap.  I call it the &lt;em&gt;fudge trap&lt;/em&gt;.  It goes like this:&lt;/p&gt;


	&lt;p&gt;&lt;span&gt;&lt;code&gt;forever do {&lt;/code&gt;&amp;#8220;I can make this work!  Just one more little fudge right &lt;em&gt;here&lt;/em&gt;!&amp;#8221;&lt;code&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;


	&lt;p&gt;I was in this trap for two months!  I was making progress, and getting lots of new features to work, but I was also running into strange little quirks and unexpected bizarre behaviors caused by the fudging I was doing.  So I&amp;#8217;d fudge a little more and then keep working.  But each little fudge added to the next until, eventually, I had a really nasty house of cards (or rather: pile of fudge) ready to topple every time I touched anything else.  I started to fear my own code&lt;sup&gt;&lt;a href=&quot;http://blog.objectmentor.com/xml/atom/feed.xml#fn2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.  It was time to stop!&lt;/p&gt;


	&lt;p&gt;I knew what I had to do.  I had to go back to my original architectural decision and make it the other way.  There was no escape from this.  The FitNesse parser was too coupled to the wiki-ness, and there was no sane way to repurpose it for test table processing.&lt;/p&gt;


	&lt;p&gt;I dreaded this.  It was such a big change.  I had built so much code in my house of fudge.  All of it would have to be changed or deleted.  And, worse, I needed to write an &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; parser.&lt;/p&gt;


	&lt;p&gt;I was lamenting to &lt;a href=&quot;http://www.8thlight.com/main&quot;&gt;Micah&lt;/a&gt; about this one day in late November, and he said: &amp;#8220;Dad, there are &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; parsers out there you know.&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;Uh&amp;#8230;&lt;/p&gt;


	&lt;p&gt;So I went to google and typed &lt;code&gt;Html Parser&lt;/code&gt;.  Duh.  There they were.  Lots and lots of shiny &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; parsers free for the using.&lt;/p&gt;


	&lt;p&gt;I picked &lt;a href=&quot;http://htmlparser.sourceforge.net&quot;&gt;one&lt;/a&gt; and started to fiddle with it.  It was &lt;em&gt;easy&lt;/em&gt; to use.&lt;/p&gt;


	&lt;p&gt;Now comes the good part.  I had not been a complete dolt.  Even when I was using the FitNesse parse tree, I ate my own dogfood and &lt;em&gt;wrapped&lt;/em&gt; it in an abstract interface.  No part of the Slim Table processing code actually &lt;em&gt;knew&lt;/em&gt; that it was dealing with a FitNesse parse tree.  It simply used the abstract interface to get its work done.&lt;/p&gt;


	&lt;p&gt;That meant that pulling out the wiki parser and putting in the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; parser was a matter of re-implementing the abstract interface with the output of the new parser (which happened to be another parse tree!).  This took me about a day.&lt;/p&gt;


	&lt;p&gt;There came a magic moment when I had &lt;em&gt;both&lt;/em&gt; the wiki text version of the parser, and the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; version of the parser working.  I could switch back and forth between the two by changing one word in one module.  When I got &lt;em&gt;all&lt;/em&gt; my tests passing with &lt;em&gt;both&lt;/em&gt; parsers, I knew I was done.  And then the fun &lt;em&gt;really&lt;/em&gt; began!&lt;/p&gt;


	&lt;p&gt;I &lt;span&gt;&lt;em&gt;deleted&lt;/em&gt;&lt;/span&gt; ever stitch of that wiki parse tree pile of fudge.  I tore it loose and rent it asunder.  It was gone, never to darken my door with it&amp;#8217;s fudge again.&lt;/p&gt;


	&lt;p&gt;It took me a day.  A day.  And the result is 400 fewer lines of code, and a set of Slim tables that actually work the way they are supposed to.&lt;/p&gt;


	&lt;p&gt;Moral #1: &amp;#8220;Fudge tastes good while you are eating it, but it makes you fat, slow, and dumb.&amp;#8221;&lt;/p&gt;


	&lt;p&gt;Moral #2: &amp;#8220;Eat the damned dog food. It&amp;#8217;ll save your posterior from your own maladroit decisions.&lt;/p&gt;


	&lt;p id=&quot;fn1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; I do not recommend that you actually put your thumb on any Mercury.  Never mind that I used to play with liquid Mercury as a child, sloshing it around from hand to hand and endlessly stirring it with my finger.  Wiser heads than I have determined that merely being in the same room with liquid Mercury can cause severe brain damage, genetic corruption, and birth defects in your children, grandchildren, and pets.&lt;/p&gt;


	&lt;p id=&quot;fn2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt; Fearing your own code is an indicator that you are headed for ruin.  This fear is followed by self-loathing, project-loathing, career-loathing, divorce, infanticide, and finally chicken farming.&lt;/p&gt;</content>
		<author>
			<name>Uncle Bob</name>
			<uri>http://blog.objectmentor.com</uri>
		</author>
		<source>
			<title type="html">Object Mentor Blog</title>
			<link rel="self" href="http://blog.objectmentor.com/xml/atom/feed.xml"/>
			<id>tag:blog.objectmentor.com,2005:Typo</id>
			<updated>2009-01-07T00:20:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Tests, Technical Debt, and Christmas Holidays</title>
		<link href="http://use.perl.org/~Ovid/journal/38189?from=rss"/>
		<id>http://use.perl.org/~Ovid/journal/38189?from=rss</id>
		<updated>2008-12-31T11:31:11+00:00</updated>
		<content type="html">&lt;p&gt;I'm just about done with my major cleanup of how our files are organized in our system.  So far the tests pass (&lt;a href=&quot;http://use.perl.org/~Ovid/journal/38138&quot;&gt;and the Heisenbug has mysteriously gone away&lt;/a&gt;).  When I'm done, I'll have moved 903 files (a combinations of 403 XML test fixtures and 490 Perl libraries) and have edited almost 1000 files.  It's taken almost a week to get this done and the only thing which has made it taken this long is that the full test suite takes over an hour to run right now :/&lt;/p&gt;&lt;p&gt;Still, having those tests means that I'm able to make a huge, sweeping reorganization of our system with little fear.  All xml fixtures are now organized into three simple directories (rather than the multiple ones they were randomly scattered across) and all of our core class have had their class names changed to be cleaner.  So why on earth would I &lt;em&gt;ever again&lt;/em&gt; want to work for a company which doesn't test?  I can't think of any reason, other than being brought in specifically to build their test system.&lt;/p&gt;&lt;p&gt;In other news, the latest Parrot doesn't pass its test on my system.  Bug reports might be forthcoming.&lt;/p&gt;&lt;p&gt; &lt;strong&gt;Update:&lt;/strong&gt;  I just needed a fresh checkout of Parrot.  I must have broken something internally.&lt;/p&gt;</content>
		<author>
			<name>Curtis &quot;Ovid&quot; Poe</name>
			<uri>http://use.perl.org/~Ovid/journal/</uri>
		</author>
		<source>
			<title type="html">Ovid's Journal</title>
			<subtitle type="html">Ovid's use Perl Journal</subtitle>
			<link rel="self" href="http://use.perl.org/~Ovid/journal/rss"/>
			<id>http://use.perl.org/~Ovid/journal/rss</id>
			<updated>2009-01-05T10:20:30+00:00</updated>
			<rights type="html">use Perl; is Copyright 1998-2006, Chris Nandor. Stories, comments, journals, and other submissions posted on use Perl; are Copyright their respective owners.</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">PHPUnit 3.4.0 - Alpha 1</title>
		<link href="http://sebastian-bergmann.de/archives/836-PHPUnit-3.4.0-Alpha-1.html"/>
		<id>http://sebastian-bergmann.de/archives/836-guid.html</id>
		<updated>2008-12-31T09:10:00+00:00</updated>
		<content type="html">&lt;p&gt;In an effort to end the year on a high note, I have released a first preview release of &lt;a href=&quot;http://www.phpunit.de/wiki/ChangeLog34&quot;&gt;PHPUnit 3.4&lt;/a&gt; today.&lt;/p&gt;&lt;p&gt;The highlights of this new release series include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Support for &lt;a href=&quot;http://www.phpunit.de/ticket/144&quot;&gt;optionally executing each test using a separate PHP process&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Support for &lt;a href=&quot;http://sebastian-bergmann.de/archives/826-Test-Dependencies-in-PHPUnit-3.4.html&quot;&gt;exploiting dependencies between tests to improve defect localization&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Support for mocking SOAP web services based on their WSDL specification&lt;/li&gt;&lt;li&gt;A rewrite of the code generator that is used by the mock object system&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The complete &lt;a href=&quot;http://www.phpunit.de/wiki/ChangeLog34&quot;&gt;ChangeLog&lt;/a&gt; is also available.&lt;/p&gt;&lt;p&gt;PHPUnit 3.4.0alpha1 is not feature-complete and should not be used in production.&lt;/p&gt;&lt;p&gt;Please have a look at the new features and test whether this new version of PHPUnit can run your test suite without problems.&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>2009-01-06T09:20:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">A Wish List for the Next Mainstream Programming Language</title>
		<link href="http://blog.objectmentor.com/articles/2008/12/29/a-wish-list-for-the-next-mainstream-programming-language"/>
		<id>urn:uuid:08858466-5200-453c-aa91-8efe4ed44032</id>
		<updated>2008-12-29T21:21:33+00:00</updated>
		<content type="html">&lt;p&gt;It&amp;#8217;s been fun watching the reactions to new features in C# 4.0.  Some people love them.  Others wonder, legitimately, where it is all going to end.  The argument for feature addition is simple: over time we find better ways of doing things and our languages, as tools, should allow us that flexibility.  The only downside to this strategy is that you end up with sprawling, complex languages over time – you never get to revisit the foundations.&lt;/p&gt;

&lt;p&gt;Fortunately, however, people design new languages all the time and some of them do eventually enter the mainstream.  We get a chance to start over and address foundational problems. And, that&amp;#8217;s nice because we can do better than Java and C# for mainstream development and I don’t think there is any way to mutate either language into a better foundation.&lt;/p&gt;

&lt;p&gt;
Before I launch into the wish list, however, I want to set the context.&lt;/p&gt;

&lt;p&gt;When I say “mainstream language” I am talking about languages which are in the Java/C#/VB market space – languages which are light on rocket science, seen as suitable for large-scale development, and don’t scare people.  So, I’m not going to suggest dynamic typing or (on the other side of the coin) tight Hindley-Milner type systems and lazy evaluation.  I love those approaches and I’m happy (in particular) that Ruby is gaining widespread acceptance, but I’m not going to fight that fight here.  In the immediate future, for whatever reason, there will be development shops which feel much more comfortable with traditional static typing &amp;#8211; the kind found in Java, C#, and VB.  Given that, the question becomes: what can we do to make that sort of language better?&lt;/p&gt;

&lt;p&gt;Here’s my list:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;i&gt;Immutability by Default&lt;/i&gt; &amp;#8211; Over the past few years, a rather broad consensus has emerged around the idea that code is easier to understand and maintain when it has less mutable state.  This isn’t a new idea; it’s been around for as long as functional programming, but our recent concerns with concurrency and our move toward multi-core computing just underscore the state problem.  A mainstream language should, at the very least, make mutable data something special.  References should be immutable by default and mutable state should be marked by a special keyword so that its use leaps out at you. It’s too late for the current crop of languages to make such a pervasive change, but the next mainstream language could.

&lt;li&gt;&lt;i&gt;Support for Components&lt;/i&gt; &amp;#8211;  In large-scale development, teams have to manage usage and dependency across an organization.  The notions of &lt;i&gt;public&lt;/i&gt;, &lt;i&gt;protected&lt;/i&gt;, and &lt;i&gt;private&lt;/i&gt; are too coarse as protection mechanisms, and we really need scopes larger than class, assembly, and package.  In the end, this sort of protection is a social issue, so we should have mechanisms which make use very easy within a team (3-10 people working together) and somewhat more manageable between teams.  It’s odd that language-based support for this work stopped with Ada and the Modula family of languages.  Java’s recent move toward support for modules seems to be an exception.

&lt;li&gt;&lt;i&gt;Support for Scoped and Explicit Metaprogramming&lt;/i&gt; – In the past, language designers avoided adding meta-programming support to their languages because they were scared it would be abused.  However, we’ve learned that without meta-programming support, people create yet another distinctive type of mess.  If there is a middle ground for mainstream languages it probably involves scoping the use of metaprogramming and making it far more detectable.  If, for instance, all of the code which modifies a given component had to be registered with some easily locatable component-specific construct, maintenance would be much easier.

&lt;li&gt;&lt;i&gt;Support for Testing&lt;/i&gt; – This one is only a matter of time, I think.  In the last 10 years we’ve seen an explosion of mocking tools and testing frameworks.  It’s not clear to me that we’ve reached any sort of consensus yet, but I suspect that at the very least we could add constructs to a language which make mocking and stubbing much easier.  It&amp;#8217;s also about time that languages attempt to solve the problems that dependency injection addresses.

&lt;li&gt;&lt;i&gt;Imposed I/O Separation&lt;/i&gt; – This is the controversial one.  The more I work with Haskell, the more I notice that there is a beneficial discipline that comes from factoring your program so that its points of contact with the outside world can not be mixed with the pieces doing the work.  When you first start to work that way, it feels like a straitjacket, but I think the benefit is apparent to anyone who has had to go on a spelunking expedition in an application to find and mock parts of the system which touch the outside world.  Is that discipline too much for a mainstream language?  I hope not.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;So, that’s my list.   There is no “grand language planning board” which decides these things.  We will move forward chaotically like ever other industry, but I  do hope that some of these features make it into the next mainstream programming language.&lt;/p&gt;</content>
		<author>
			<name>Michael Feathers</name>
			<uri>http://blog.objectmentor.com</uri>
		</author>
		<source>
			<title type="html">Object Mentor Blog</title>
			<link rel="self" href="http://blog.objectmentor.com/xml/atom/feed.xml"/>
			<id>tag:blog.objectmentor.com,2005:Typo</id>
			<updated>2009-01-07T00:20:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Syntax highlighting for Perl 6</title>
		<link href="http://www.szabgab.com/blog/2008/12/1230563859.html"/>
		<id>http://www.szabgab.com/blog/2008/12/1230563859.html</id>
		<updated>2008-12-29T17:17:39+00:00</updated>
		<content type="html">&lt;p&gt;
Following the &lt;a href=&quot;http://szabgab.com/blog/2008/12/1228898258.html&quot;&gt;Grant accepted for Integrating Padre with Parrot and Rakudo&lt;/a&gt; and &lt;a href=&quot;http://szabgab.com/blog/2008/12/1229032305.html&quot;&gt;Plans for Integrating Padre with Parrot and Rakudo&lt;/a&gt; I can 
already let you know that the first steps has been made. 
&lt;a href=&quot;http://padre.perlide.org/&quot;&gt;Padre&lt;/a&gt; is already capable 
to provide correct albeit slow syntax highlighting for Perl 6.
&lt;/p&gt;
&lt;p&gt;
Actually it was implemented by &lt;a href=&quot;http://use.perl.org/~azawawi/&quot;&gt;Ahmad M. Zawawi&lt;/a&gt;,
a neighbor of mine, who is also the maintainer of &lt;a href=&quot;http://cpan.uwinnipeg.ca/dist/Syntax-Highlight-Perl6&quot;&gt;Syntax::Highlight::Perl6&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
That's good news. I have not been playing with Perl 6 in many months
now as some time ago I decided that I'll start to write Perl 6 again
when I can get syntax highlighting in Padre and when I can run my
Perl 6 scripts from within Padre.
&lt;/p&gt;
&lt;p&gt;
That time has come so I've started to write some Perl 6 code but I need the
documentation to be handy. So we are now discussing it on the #padre IRC
channel on how to intgerate Padre with the existing Perl 6 documentation
and how to provide a real-world use case.
&lt;/p&gt;
&lt;p&gt;
I  would like to be able to press on F1 and get an explanation of the
element where my cursor is currently located. I'd like to get the
calltips directly from the Perl 6 documentation. As the Perl 6 
documentation can be linked to the tests implementing the specific
elements using the smartlinks in the test files we could open 
the specific test files for editing right from the documentation.
&lt;/p&gt;</content>
		<author>
			<name>Gábor Szabó</name>
			<uri>http://www.szabgab.com</uri>
		</author>
		<source>
			<title type="html">Blog of Gábor Szabó</title>
			<subtitle type="html">Gabor Szabo about Perl, automated testing, dynamic languages and everyting else</subtitle>
			<link rel="self" href="http://szabgab.com/blog/szabgab.rss"/>
			<id>http://szabgab.com/blog/szabgab.rss</id>
			<updated>2009-01-07T04:20:34+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Bring Your Own Ruler Internet Measuring Contest</title>
		<link href="http://use.perl.org/~chromatic/journal/38168?from=rss"/>
		<id>http://use.perl.org/~chromatic/journal/38168?from=rss</id>
		<updated>2008-12-27T10:41:11+00:00</updated>
		<content type="html">&lt;blockquote&gt;&lt;div&gt;&lt;p&gt; &lt;em&gt;Freshmeat indicates that, relative to Python and other languages, Perl isn't seeing as much code released.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt; &lt;/blockquote&gt;&lt;p&gt;-- &lt;a href=&quot;http://www.welton.it/davidw/&quot;&gt;David N. Welton&lt;/a&gt;, &lt;a href=&quot;http://journal.dedasys.com/2008/12/07/python-surpasses-perl&quot;&gt;Python &quot;Surpasses&quot; Perl?&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Given that CPAN and perl.org provides announcement services, project history, bug tracking, documentation hosting, smoke testing, and download mirroring and all you have to do is upload a tarball to PAUSE, I wonder instead why a Perl developer would make an announcement on Freshmeat.  I could likewise prove that there are no good writers on the Internet by surveying popular fan fiction sites, seeing as how that's exactly where they don't hang out.&lt;/p&gt;&lt;p&gt;I enjoy a good rant as much as anyone, but if you're going to ruin it with research, at least make a puzzle out of how you propped up your conclusions.&lt;/p&gt;</content>
		<author>
			<name>chromatic</name>
			<uri>http://use.perl.org/~chromatic/journal/</uri>
		</author>
		<source>
			<title type="html">chromatic's Journal</title>
			<subtitle type="html">chromatic's use Perl Journal</subtitle>
			<link rel="self" href="http://use.perl.org/~chromatic/journal/rss"/>
			<id>http://use.perl.org/~chromatic/journal/rss</id>
			<updated>2009-01-02T07:20:15+00:00</updated>
			<rights type="html">use Perl; is Copyright 1998-2006, Chris Nandor. Stories, comments, journals, and other submissions posted on use Perl; are Copyright their respective owners.</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">DB2 on Mac officially released</title>
		<link href="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~3/493524757/"/>
		<id>http://antoniocangiano.com/?p=463</id>
		<updated>2008-12-24T18:43:47+00:00</updated>
		<content type="html">&lt;p&gt;As pre-announced in my two &lt;a href=&quot;http://antoniocangiano.com/2008/12/12/db2-on-mac-to-ship-before-christmas/&quot;&gt;previous&lt;/a&gt; &lt;a href=&quot;http://antoniocangiano.com/2008/12/19/download-db2-on-mac/&quot;&gt;posts&lt;/a&gt;, DB2 for Mac OS X Leopard is finally &lt;a href=&quot;http://www.ibm.com/software/data/db2/express/download.html?S_CMP=ECDDWW01&amp;#038;S_TACT=ACDB201&quot;&gt;available for download&lt;/a&gt;. It&amp;#8217;s now official, DB2 on Mac is here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reflections on DB2 on Mac&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Several people, including myself, would happily ditch their virtual machines and start introducing DB2 into their native Mac development stacks. But this milestone represents much more than the immediate implications would have us believe. A few years ago, the idea of giving away DB2 for free would have been met with rejection. Yet, &lt;a href=&quot;http://www.ibm.com/software/data/db2/express/download.html?S_CMP=ECDDWW01&amp;#038;S_TACT=ACDB201&quot;&gt;DB2 Express-C&lt;/a&gt; came along, and unlike the other &amp;#8220;express&amp;#8221; databases, it&amp;#8217;s a true production-ready DB2 version that can be used free of charge.&lt;/p&gt;
&lt;p&gt;Likewise, the idea of having a DB2 version for Mac was unthinkable up to a few years ago. Yet today we finally have a copy of DB2 Express-C for Mac OS X that&amp;#8217;s &lt;a href=&quot;http://www.ibm.com/software/data/db2/express/download.html?S_CMP=ECDDWW01&amp;#038;S_TACT=ACDB201&quot;&gt;available for download&lt;/a&gt;. Aside from this being an acknowledgment of the growing importance of Mac as a development and business platform, I feel it underlines IBM&amp;#8217;s ability to change. The desire that a few of us mac addicts had, coupled with reasonable pressure from the community, was sufficient enough to make DB2 on Mac a reality. This matters and appeals to both the developer and the technical evangelist in me.&lt;/p&gt;
&lt;p&gt;In the &lt;a href=&quot;http://www.ibm.com/software/data/db2/express/download.html?S_CMP=ECDDWW01&amp;#038;S_TACT=ACDB201&quot;&gt;list of downloads&lt;/a&gt;, you&amp;#8217;ll notice that the Mac download is only 138 MB, versus the 412 MB of Linux&amp;#8217;s 64-bit. The reason for this difference is that DB2 Express-C for Mac currently ships in English only, and at this stage it doesn&amp;#8217;t include either DB2 Text Search or the Java based tools like the DB2 Control Center. This lighter package is, in my opinion, a welcome side effect of this brand new beta release.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Getting started with DB2 and Rails on Mac OS X&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Since the first download went live on Friday, a newer release that includes a guide for installing DB2 on Mac OS X was published and it incorporates a few changes that will make the lives of developers easier, as they approach building and using drivers (e.g. the ibm_db Ruby gem). If you downloaded this beta version over the weekend, do not worry: just grab - and execute - &lt;a href=&quot;http://antoniocangiano.com/files/fixlib.sh&quot;&gt;this shell script&lt;/a&gt; (e.g. &lt;code&gt;sudo fixlib.sh&lt;/code&gt;). If you are downloading DB2 on Mac now, you won&amp;#8217;t need this script of course.&lt;/p&gt;
&lt;p&gt;Once you&amp;#8217;ve downloaded DB2 for Mac OS X Leopard, please proceed to read &lt;a href=&quot;http://antoniocangiano.com/files/db2exc_guide_952_MAC_x86_64.pdf&quot;&gt;this PDF guide&lt;/a&gt;, which will tell you everything you need to know (and more) about installing DB2 on your Mac, as well as providing extra details. It&amp;#8217;s best not to skip over reading this document, as the installation on Mac OS X requires a few more steps than simply running the setup wizard.&lt;/p&gt;
&lt;p&gt;With DB2 installed and started (&lt;code&gt;db2start&lt;/code&gt;), and the SAMPLE database created (&lt;code&gt;db2sampl&lt;/code&gt;), you&amp;#8217;re ready to start playing with this power horse. For details about SAMPLE&amp;#8217;s structure you can read &lt;a href=&quot;http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=/com.ibm.db2.luw.apdv.samptop.doc/doc/r0001094.html&quot;&gt;this article&lt;/a&gt; in the InfoCenter.&lt;/p&gt;
&lt;p&gt;To run the DB2 console (known as the Command Line Processor or CLP for short), run:&lt;/p&gt;
&lt;pre&gt;$ db2&lt;/pre&gt;
&lt;p&gt;To connect to the SAMPLE database, from within the CLP run:&lt;/p&gt;
&lt;pre&gt;db2 =&gt; connect to sample&lt;/pre&gt;
&lt;p&gt;Unless you get an error, you should now be ready to query the database. For example, run the following query:&lt;/p&gt;
&lt;pre&gt;db2 =&gt; select count(*) from staff&lt;/pre&gt;
&lt;p&gt;Then to exit from the CLP, simply run:&lt;/p&gt;
&lt;pre&gt;db2 =&gt; quit&lt;/pre&gt;
&lt;p&gt;If this sanity test worked well you can proceed with installing the ibm_db gem (which includes the Ruby driver and the Rails adapter for DB2). To do so, run the following, adjusting the path to your own username of course:&lt;/p&gt;
&lt;pre&gt;
$ sudo -s
$ export IBM_DB_INCLUDE=/Users/acangiano/sqllib/include
$ export IBM_DB_LIB=/Users/acangiano/sqllib/lib32
$ export ARCHFLAGS=&quot;-arch i386&quot;
$ gem update --system
$ gem install ibm_db
$ exit
&lt;/pre&gt;
&lt;p&gt;The ibm_db gem will be installed on your system and is ready to be used. To verify that this is the case, run a small Ruby program with the following code:&lt;/p&gt;
&lt;pre class=&quot;highlight&quot;&gt;
require 'rubygems'
require 'ibm_db.bundle'

conn = IBM_DB.connect(&quot;sample&quot;,&quot;my_username&quot;, &quot;my_password&quot;)
if conn
 stmt = IBM_DB.exec(conn, &quot;select count(*) from staff&quot;)
 count = IBM_DB.fetch_array(stmt)[0]
 puts &quot;The staff table contains #{count} records.&quot;
else
  puts &quot;Connection error: #{IBM_DB.conn_errormsg}&quot;
end
&lt;/pre&gt;
&lt;p&gt;If everything is fine and dandy, you should see the message &amp;#8220;The staff table contains 35 records.&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Now that Ruby can talk with DB2, we can move on to Rails. Assuming you have Rails 2.2.x installed, run the following to create a sample bookshelf application:&lt;/p&gt;
&lt;pre&gt;$ rails books -d ibm_db&lt;/pre&gt;
&lt;p&gt;This generates a Rails application (as usual) with a config/database.yml file customized for DB2. You&amp;#8217;ll notice that unlike with MySQL, the database names are not books_development, books_production and books_test. The names are truncated by default due to the fact that DB2 currently only allows for database names that are up to 8 characters long. Feel free to change the development database in database.yml simply to &amp;#8216;books&amp;#8217;.&lt;/p&gt;
&lt;p&gt;As a Rails developer you may also be accustomed to running &lt;code&gt;rake db:create&lt;/code&gt; to automatically create the development database, yet this feature is not available for DB2 at this point, so instead you can create the database using the &lt;code&gt;db2&lt;/code&gt; command, as follows:&lt;/p&gt;
&lt;pre&gt;db2 create database books&lt;/pre&gt;
&lt;p&gt;DB2 allows you to specify all kinds of options for the creation of databases, but in its simplest form, the line above will work just fine.&lt;/p&gt;
&lt;p&gt;Once the development database has been created, you should be able to use Rails with DB2 as you normally would with other database management systems. For example, you could scaffold a resource as follows:&lt;/p&gt;
&lt;pre&gt;$ ruby script/generate scaffold Book title:string
 author:string isbn:string description:text loaned:boolean&lt;/pre&gt;
&lt;p&gt;Start the webserver with:&lt;/p&gt;
&lt;pre&gt;$ ruby script/server&lt;/pre&gt;
&lt;p&gt;And then visit http://localhost:3000/books to perform CRUD operations on book records.&lt;/p&gt;
&lt;p&gt;At this stage, the only caveats are that you&amp;#8217;ll have to use the &lt;code&gt;db2&lt;/code&gt; command, rather than &lt;code&gt;ruby script/dbconsole&lt;/code&gt;, and that you won&amp;#8217;t be able to use the &lt;code&gt;rename_column&lt;/code&gt; method in your migrations. On the plus side, you&amp;#8217;ll have the XML datatype (&lt;code&gt;t.xml&lt;/code&gt; in your sexy migrations) at your disposal, to natively store XML documents and retrieve them through XQuery and SQL/XML.&lt;/p&gt;
&lt;p&gt;I really hope that you&amp;#8217;ll enjoy DB2 on Mac! Don&amp;#8217;t be afraid to ask for help, if you need it, in the &lt;a href=&quot;http://www.ibm.com/developerworks/forums/forum.jspa?forumID=805&quot;&gt;DB2 Express-C forum&lt;/a&gt;. Oh and we are trying to get the word out there. Your help is highly appreciated. You can promote this story on &lt;a href=&quot;http://twitter.com/home&quot;&gt;Twitter&lt;/a&gt;, &lt;a href=&quot;http://news.ycombinator.com/item?id=408186&quot;&gt;Hacker News&lt;/a&gt;, &lt;a href=&quot;http://www.reddit.com/r/programming/comments/7li15/ibm_releases_mac_os_x_version_of_db2/&quot;&gt;Reddit&lt;/a&gt;, &lt;a href=&quot;http://www.dzone.com/links/db2_on_mac_officially_released.html&quot;&gt;DZone&lt;/a&gt;, StumbleUpon and &lt;a href=&quot;http://digg.com/apple/DB2_on_Mac_officially_released&quot;&gt;Digg&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;em&gt;Disclaimer: The opinions expressed in this post are mine and mine alone, and do not necessarily represents the opinions of my employer, IBM.&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=RmvzO&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=RmvzO&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=NjxYo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=NjxYo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=aYHzo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=aYHzo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=tF4oO&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=tF4oO&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=D4lRO&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=D4lRO&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=O6Rzo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=O6Rzo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/493524757&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Antonio Cangiano</name>
			<uri>http://antoniocangiano.com</uri>
		</author>
		<source>
			<title type="html">Zen and the Art of Programming</title>
			<subtitle type="html">By Antonio Cangiano, Software Engineer &amp;amp; Technical Evangelist at IBM</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/ZenAndTheArtOfRubyProgramming"/>
			<id>http://antoniocangiano.com/feed/atom/</id>
			<updated>2009-01-07T04:20:38+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Interview on Video</title>
		<link href="http://www.satisfice.com/blog/archives/138"/>
		<id>http://www.satisfice.com/blog/archives/138</id>
		<updated>2008-12-24T08:24:32+00:00</updated>
		<content type="html">&lt;p&gt;I gave an interview at the STAR West 2008 conference about agile testing. They&amp;#8217;ve just put it online. &lt;a href=&quot;http://www.youtube.com/watch?v=bgRBoOOY3A4&quot;&gt;Here it is!&lt;/a&gt; Once again I give answers that are too long. I&amp;#8217;ll never make it as soundbite artist.&lt;/p&gt;</content>
		<author>
			<name>james</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/atom"/>
			<id>http://www.satisfice.com/blog/feed/atom</id>
			<updated>2009-01-05T02:20:38+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">How We Used to Do Unit Testing</title>
		<link href="http://secretsofconsulting.blogspot.com/2008/12/how-we-used-to-do-unit-testing.html"/>
		<id>tag:blogger.com,1999:blog-25922407.post-5546585298377328379</id>
		<updated>2008-12-23T20:48:24+00:00</updated>
		<content type="html">Reader Charles sends a question I've frequently had when consulting with testing organizations who are weary of having code thrown at them &quot;over the wall.&quot;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Charles&lt;/h4&gt;From your experience in software, what are some good practices you have found for what is now known as &quot;Unit Test?&quot;&lt;br /&gt;&lt;br /&gt;I have mine, I want to see if we have similar experiences.&lt;br /&gt;&lt;br /&gt;I also have a motive, I get the opportunity to write our &quot;Unit Test Procedure&quot;, so I want to capture &quot;Good Practices&quot; that developers can use.&lt;br /&gt;&lt;br /&gt;Ack!--Unit Test Procedure!!! I wish we could have names like, &quot;Menu of Good Unit Test Practices, Choose One or More that Make Sense for your Unit, or Use and Add a New Practice to the Menu of Good Practices (Include Provenance or Example).&quot;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Jerry&lt;/h4&gt;&lt;br /&gt;&lt;h4&gt;Honor Unit Testing&lt;/h4&gt;&lt;br /&gt;1. Well, that's probably number one, the name and prestige you give to the process. If you belittle it, you will have poor results. If you reward it ... finish the sentence. I don't recall if we even had a name for it in the early days. It was just assumed that any pro would do a damn good job of this activity, not to be embarrassed by unit bugs found in integration test or system test--or god help us, in production.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Build Small and Simple&lt;/h4&gt;2. The next most important thing is to design to build in testable pieces. Small as possible, but no smaller. Cleanly structured, with no testing traps like hidden memory that might make the code not really reentrant.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Be Completely Open&lt;/h4&gt;3. Next is complete openness, getting as many eyes on it as you could get, but certainly not just one pair. &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Test First&lt;/h4&gt;4. Today what we did is called Test Before Code, or perhaps Test Before Design. Ideally, we sketched out a set of test cases before putting pencil to coding pad. (We didn't have terminals or PCs in those early days.) These were punched into cards and put in the permanent test case library.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Take Advantage of Individual Skills and Help Each Other&lt;/h4&gt;5. After that, I recall things breaking down into tactics favored by each individual. Generally, we unit tested each other's code, and anyone having trouble could and did call on anyone else to help out.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Don't Green Dot&lt;/h4&gt;I think if people did these things today, we'd be in a lot less trouble. I know because there are people who do these things today, and they tend to stay out of trouble. On the other hand, people who just throw code at a compile and say &quot;it's unit tested&quot; as soon as they see a green dot, tend to be in trouble all the time.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Comments welcome!&lt;/h3&gt;</content>
		<author>
			<name>Oregon Writers Network</name>
			<email>hardpretzel@earthlink.net</email>
			<uri>http://secretsofconsulting.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">The Secrets of 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; and &lt;a href=&quot;http://www.geraldmweinberg.com/Site/More_Secrets.html&quot;&gt;More Secrets of Consulting&lt;/a&gt;, as well as my work at &lt;a href=&quot;http://ayeconference.com/&quot;&gt;the AYE Conference&lt;/a&gt;

I invite all consultants to participate by asking questions and responding.</subtitle>
			<link rel="self" href="http://secretsofconsulting.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-25922407</id>
			<updated>2009-01-07T00:20:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">The Seductions of Scala, Part I</title>
		<link href="http://blog.objectmentor.com/articles/2008/08/03/the-seductions-of-scala-part-i"/>
		<id>urn:uuid:d4a4acbf-e300-4146-83c7-0536785997e1</id>
		<updated>2008-12-23T17:51:27+00:00</updated>
		<content type="html">&lt;p&gt;(Update 12/23/2008: Thanks to Apostolos Syropoulos for pointing out an earlier reference for the concept of &amp;#8220;traits&amp;#8221;).&lt;/p&gt;


	&lt;p&gt;Because of all the recent hoo-ha about &lt;a href=&quot;http://en.wikipedia.org/wiki/Functional_programming&quot;&gt;functional programming&lt;/a&gt; (&lt;em&gt;e.g.,&lt;/em&gt; as a &amp;#8220;cure&amp;#8221; for the &lt;a href=&quot;http://www.technologyreview.com/Infotech/17682/page1/&quot;&gt;multicore problem&lt;/a&gt;), I decided to cast aside my dysfunctional ways and learn one of the FP languages. The question was, which one?&lt;/p&gt;


	&lt;p&gt;My distinguished colleague, &lt;a href=&quot;http://www.objectmentor.com/omTeam/feathers_m.html&quot;&gt;Michael Feathers&lt;/a&gt;, has been on a &lt;a href=&quot;http://www.haskell.org/&quot;&gt;Haskell&lt;/a&gt; &lt;a href=&quot;http://twitter.com/mfeathers&quot;&gt;binge&lt;/a&gt; of late. Haskell is a pure functional language and is probably most interesting as the &amp;#8220;flagship language&amp;#8221; for academic exploration, rather than production use. (That was not meant as flame bait&amp;#8230;) It&amp;#8217;s hard to underestimate the influence Haskell has had on language design, including Java generics, .NET &lt;span class=&quot;caps&quot;&gt;LINQ&lt;/span&gt; and F#, &lt;em&gt;etc.&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;However, I decided to learn &lt;a href=&quot;http://www.scala-lang.org&quot;&gt;Scala&lt;/a&gt; first, because it is a &lt;span class=&quot;caps&quot;&gt;JVM&lt;/span&gt; language that combines object-oriented and functional programming in one language. At ~13 years of age, Java is a bit dated. Scala has the potential of &lt;a href=&quot;http://www.adam-bien.com/roller/abien/entry/java_net_javaone_which_programming&quot;&gt;replacing Java&lt;/a&gt; as the principle language of the &lt;span class=&quot;caps&quot;&gt;JVM&lt;/span&gt;, an extraordinary piece of engineering that is arguably now more valuable than the language itself. (Note: there is also a .NET version of Scala under development.)&lt;/p&gt;


	&lt;p&gt;Here are some of my observations, divided over three blog posts.&lt;/p&gt;


	&lt;p&gt;First, a few disclaimers. I am a Scala novice, so any flaws in my analysis reflect on me, not Scala! Also, this is by no means an exhaustive analysis of the pros and cons of Scala &lt;em&gt;vs.&lt;/em&gt; other options. Start with the &lt;a href=&quot;http://www.scala-lang.org&quot;&gt;Scala website&lt;/a&gt; for more complete information.&lt;/p&gt;


	&lt;h2&gt;A Better &lt;span class=&quot;caps&quot;&gt;OOP&lt;/span&gt; Language&lt;/h2&gt;


	&lt;p&gt;Scala works seamlessly with Java. You can invoke Java APIs, extend Java classes and implement Java interfaces. You can even invoke Scala code from Java, once you understand how certain &amp;#8220;Scala-isms&amp;#8221; are translated to Java constructs (&lt;code&gt;javap&lt;/code&gt; is your friend). Scala syntax is more succinct and removes a lot of tedious boilerplate from Java code.&lt;/p&gt;


	&lt;p&gt;For example, the following &lt;code&gt;Person&lt;/code&gt; class in Java:&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
class Person {
    private String firstName;
    private String lastName;
    private int    age;

    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName  = lastName;
        this.age       = age;
    }

    public void setFirstName(String firstName) { this.firstName = firstName; }
    public void String getFirstName() { return this.firstName; }
    public void setLastName(String lastName) { this.lastName = lastName; }
    public void String getLastName() { return this.lastName; }
    public void setAge(int age) { this.age = age; }
    public void int getAge() { return this.age; }
}
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;can be written in Scala thusly:&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
class Person(var firstName: String, var lastName: String, var age: Int)
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;Yes, that&amp;#8217;s it. The constructor is the argument list to the class, where each parameter is declared as a variable (&lt;code&gt;var&lt;/code&gt; keyword). It automatically generates the &lt;em&gt;equivalent&lt;/em&gt; of getter and setter methods, meaning they look like Ruby-style attribute accessors; the getter is &lt;code&gt;foo&lt;/code&gt; instead of &lt;code&gt;getFoo&lt;/code&gt; and the setter is &lt;code&gt;foo = &lt;/code&gt; instead of &lt;code&gt;setFoo&lt;/code&gt;. Actually, the setter function is really &lt;code&gt;foo_=&lt;/code&gt;, but Scala lets you use the &lt;code&gt;foo = &lt;/code&gt; &lt;em&gt;sugar&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;Lots of other well designed conventions allow the language to define almost everything as a method, yet support forms of syntactic sugar like the illusion of operator overloading, Ruby-like &lt;span class=&quot;caps&quot;&gt;DSL&lt;/span&gt;&amp;#8217;s, &lt;em&gt;etc.&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;You also get fewer semicolons, no requirements tying package and class definitions to the file system structure, type inference, multi-valued returns (tuples), and a better type and generics model.&lt;/p&gt;


	&lt;p&gt;One of the biggest deficiencies of Java is the lack of a complete &lt;em&gt;mixin&lt;/em&gt; model. Mixins are small, focused (think &lt;a href=&quot;http://www.objectmentor.com/resources/articles/srp.pdf&quot;&gt;Single Responsibility Principle&lt;/a&gt; ...) bits of state and behavior that can be added to classes (or objects) to extend them as needed. In a language like C++, you can use multiple inheritance for mixins. Because Java only supports single inheritance and interfaces, which can&amp;#8217;t have any state and behavior, implementing a mixin-based design has always required various hacks. &lt;a href=&quot;http://www.aosd.net&quot;&gt;Aspect-Oriented Programming&lt;/a&gt; is also one &lt;em&gt;partial&lt;/em&gt; solution to this problem.&lt;/p&gt;


	&lt;p&gt;The most exciting &lt;span class=&quot;caps&quot;&gt;OOP&lt;/span&gt; enhancement Scala brings is its support for  &lt;a href=&quot;http://www.scala-lang.org/intro/traits.html&quot;&gt;Traits&lt;/a&gt;, a concept first described &lt;a href=&quot;http://portal.acm.org/citation.cfm?doid=800210.806468&quot;&gt;here&lt;/a&gt; and more recently discussed &lt;a href=&quot;http://portal.acm.org/citation.cfm?id=1119479.1119483&quot;&gt;here&lt;/a&gt;. Traits support Mixins (and other design techniques) through composition rather than inheritance. You could think of traits as interfaces with implementations. They work a lot like Ruby modules.&lt;/p&gt;


	&lt;p&gt;Here is an example of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Observer_pattern&quot;&gt;Observer Pattern&lt;/a&gt; written as traits, where they are used to monitor changes to a bank account balance. First, here are reusable &lt;code&gt;Subject&lt;/code&gt; and &lt;code&gt;Observer&lt;/code&gt; traits.&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
trait Observer[S] {
    def receiveUpdate(subject: S);
}

trait Subject[S] { 
    this: S =&amp;gt;
    private var observers: List[Observer[S]] = Nil
    def addObserver(observer: Observer[S]) = observers = observer :: observers

    def notifyObservers() = observers.foreach(_.receiveUpdate(this))
}
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;In Scala, generics are declared with square brackets, &lt;code&gt;[...]&lt;/code&gt;, rather than angled brackets, &lt;code&gt;&amp;lt;...&amp;gt;&lt;/code&gt;. Method definitions begin with the &lt;code&gt;def&lt;/code&gt; keyword. The &lt;code&gt;Observer&lt;/code&gt; trait defines one abstract method, which is called by the &lt;code&gt;Subject&lt;/code&gt; to notify the observer of changes. The &lt;code&gt;Subject&lt;/code&gt; is passed to the &lt;code&gt;Observer&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;This trait looks exactly like a Java interface. In fact, that&amp;#8217;s how traits are represented in Java byte code. If the trait has state and behavior, like &lt;code&gt;Subject&lt;/code&gt;, the byte code representation involves additional elements.&lt;/p&gt;


	&lt;p&gt;The &lt;code&gt;Subject&lt;/code&gt; trait is more complex. The strange line, &lt;code&gt;this: S =&amp;gt; &lt;/code&gt;, is called a &lt;em&gt;self type&lt;/em&gt; declaration. It tells the compiler that whenever &lt;code&gt;this&lt;/code&gt; is referenced in the trait, treat its type as &lt;code&gt;S&lt;/code&gt;, rather than &lt;code&gt;Subject[S]&lt;/code&gt;. Without this declaration, the call to &lt;code&gt;receiveUpdate&lt;/code&gt; in the &lt;code&gt;notifyObservers&lt;/code&gt; method would not compile, because it would attempt to pass a &lt;code&gt;Subject[S]&lt;/code&gt; object, rather than a &lt;code&gt;S&lt;/code&gt; object. The self type declaration solves this problem.&lt;/p&gt;


	&lt;p&gt;The next line creates a private list of observers, initialized to &lt;code&gt;Nil&lt;/code&gt;, which is an empty list. Variable declarations are &lt;code&gt;name: type&lt;/code&gt;. Why didn&amp;#8217;t they follow Java conventions, &lt;em&gt;i.e.,&lt;/em&gt; &lt;code&gt;type name&lt;/code&gt;? Because this syntax makes the code easier to parse when &lt;em&gt;type inference&lt;/em&gt; is used, meaning where the explicit &lt;code&gt;:type&lt;/code&gt; is omitted and inferred.&lt;/p&gt;


	&lt;p&gt;In fact, I&amp;#8217;m using type inference for all the method declarations, because the compiler can figure out what each method returns, in my examples. In this case, they all return type &lt;code&gt;Unit&lt;/code&gt;, the equivalent of Java&amp;#8217;s &lt;code&gt;void&lt;/code&gt;. (The name &lt;code&gt;Unit&lt;/code&gt; is a common term in functional languages.)&lt;/p&gt;


	&lt;p&gt;The third line defines a method for adding a new observer to the list. Notice that concrete method definitions are of the form&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
def methodName(parameter: type, ...) = {
    method body
}  
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;In this case, because there is only one line, I dispensed with the &lt;code&gt;{...}&lt;/code&gt;. The equals sign before the body emphasizes the functional nature of scala, that all methods are objects, too. We&amp;#8217;ll revisit this in a moment and in the next post.&lt;/p&gt;


	&lt;p&gt;The method body prepends the new observer object to the existing list. Actually, a new list is created. The &lt;code&gt;::&lt;/code&gt; operator, called &amp;#8220;cons&amp;#8221;, &lt;em&gt;binds to the right&lt;/em&gt;. This &amp;#8220;operator&amp;#8221; is really a method call, which could actually be written like this, &lt;code&gt;observers.::(observer)&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;Our final method in &lt;code&gt;Subject&lt;/code&gt; is &lt;code&gt;notifyObservers&lt;/code&gt;. It iterates through observers and invokes the block &lt;code&gt;observer.receiveUpdate(this)&lt;/code&gt; on each observer. The &lt;code&gt;_&lt;/code&gt; evaluates to the current observer reference. For comparison, in Ruby, you would define this method like so:&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
def notifyObservers() 
    @observers.each { |o| o.receiveUpdate(self) }
end
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;Okay, let&amp;#8217;s look at how you would actually use these traits. First, our &amp;#8220;plain-old Scala object&amp;#8221; (POSO) &lt;code&gt;Account&lt;/code&gt;.&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
class Account(initialBalance: Double) {
    private var currentBalance = initialBalance
    def balance = currentBalance
    def deposit(amount: Double)  = currentBalance += amount
    def withdraw(amount: Double) = currentBalance -= amount
}
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;Hopefully, this is self explanatory, except for two things. First, recall that the whole class declaration is actually the constructor, which is why we have an &lt;code&gt;initialBalance: Double&lt;/code&gt; parameter on &lt;code&gt;Account&lt;/code&gt;. This looks strange to the Java-trained eye, but it actually works well and is another example of Scala&amp;#8217;s economy. (You can define multiple constructors, but I won&amp;#8217;t go into that here&amp;#8230;).&lt;/p&gt;


	&lt;p&gt;Second, note that I omitted the parentheses when I defined the &lt;code&gt;balance&lt;/code&gt; &amp;#8220;getter&amp;#8221; method. This supports the &lt;em&gt;uniform access principle&lt;/em&gt;. Clients will simply call &lt;code&gt;myAccount.balance&lt;/code&gt;, without parentheses and I could redefine &lt;code&gt;balance&lt;/code&gt; to be a &lt;code&gt;var&lt;/code&gt; or &lt;code&gt;val&lt;/code&gt; and the client code would not have to change!&lt;/p&gt;


	&lt;p&gt;Next, a subclass that supports observation.&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
class ObservedAccount(initialBalance: Double) extends Account(initialBalance) with Subject[Account] {
    override def deposit(amount: Double) = {
        super.deposit(amount)
        notifyObservers()
    }
    override def withdraw(amount: Double) = {
        super.withdraw(amount)
        notifyObservers()
    }
}
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;The &lt;code&gt;with&lt;/code&gt; keyword is how a trait is used, much the way that you &lt;code&gt;implement&lt;/code&gt; an interface in Java, but now you don&amp;#8217;t have to implement the interface&amp;#8217;s methods. We&amp;#8217;ve already done that.&lt;/p&gt;


	&lt;p&gt;Note that the expression, &lt;code&gt;ObservedAccount(initialBalance: Double) extends Account(initialBalance)&lt;/code&gt;, not only defines the (single) inheritance relationship, it also functions as the constructor&amp;#8217;s call to &lt;code&gt;super(initialBalance)&lt;/code&gt;, so that &lt;code&gt;Account&lt;/code&gt; is properly initialized.&lt;/p&gt;


	&lt;p&gt;Next, we have to override the &lt;code&gt;deposit&lt;/code&gt; and &lt;code&gt;withdraw&lt;/code&gt; methods, calling the parent methods and then invoking &lt;code&gt;notifyObservers&lt;/code&gt;. Anytime you override a concrete method, scala requires the &lt;code&gt;override&lt;/code&gt; keyword. This tells you unambiguously that you are overriding a method and the Scala compiler throws an error if you aren&amp;#8217;t actually overriding a method, &lt;em&gt;e.g.,&lt;/em&gt; because of a typo. Hence, the keyword is much more reliable (and hence useful&amp;#8230;) than Java&amp;#8217;s &lt;code&gt;@Override&lt;/code&gt; annotation.&lt;/p&gt;


	&lt;p&gt;Finally, here is an &lt;code&gt;Observer&lt;/code&gt; that prints to stdout when the balance changes.&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
class AccountReporter extends Observer[Account] {
    def receiveUpdate(account: Account) =
        println(&quot;Observed balance change: &quot;+account.balance)
}
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;Rather than use &lt;code&gt;with&lt;/code&gt;, I just extend the &lt;code&gt;Observer&lt;/code&gt; trait, because I don&amp;#8217;t have another parent class.&lt;/p&gt;


	&lt;p&gt;Here&amp;#8217;s some code to test what we&amp;#8217;ve done.&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
def changingBalance(account: Account) = {
    println(&quot;==== Starting balance: &quot; + account.balance)
    println(&quot;Depositing $10.0&quot;)
    account.deposit(10.0)
    println(&quot;new balance: &quot; + account.balance)
    println(&quot;Withdrawing $5.60&quot;)
    account.withdraw(5.6)
    println(&quot;new balance: &quot; + account.balance)
}

var a = new Account(0.0)
changingBalance(a)

var oa = new ObservedAccount(0.0)
changingBalance(oa)
oa.addObserver(new AccountReporter)
changingBalance(oa)
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;Which prints out:&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
==== Starting balance: 0.0
Depositing $10.0
new balance: 10.0
Withdrawing $5.60
new balance: 4.4
==== Starting balance: 0.0
Depositing $10.0
new balance: 10.0
Withdrawing $5.60
new balance: 4.4
==== Starting balance: 4.4
Depositing $10.0
Observed balance change: 14.4
new balance: 14.4
Withdrawing $5.60
Observed balance change: 8.8
new balance: 8.8
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;Note that we only observe the last transaction.&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.scala-lang.org/downloads/index.html&quot;&gt;Download Scala&lt;/a&gt; and try it out. Put all this code in one &lt;code&gt;observer.scala&lt;/code&gt; file, for example, and run the command:&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
scala observer.scala
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;h2&gt;But Wait, There&amp;#8217;s More!&lt;/h2&gt;


	&lt;p&gt;In the next post, I&amp;#8217;ll look at Scala&amp;#8217;s support for Functional Programming and why OO programmers should find it interesting. In the third post, I&amp;#8217;ll look at the specific case of concurrent programming in Scala and make some concluding observations of the pros and cons of Scala.&lt;/p&gt;


	&lt;p&gt;For now, here are some references for more information.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;The &lt;a href=&quot;http://www.scala-lang.org&quot;&gt;Scala website&lt;/a&gt;, for downloads, documentation, mailing lists, &lt;em&gt;etc.&lt;/em&gt;&lt;/li&gt;
		&lt;li&gt;Ted Neward&amp;#8217;s excellent &lt;a href=&quot;http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=scala+neward&quot;&gt;multipart introduction&lt;/a&gt; to Scala at &lt;a href=&quot;http://www.ibm.com/developerworks&quot;&gt;developerWorks&lt;/a&gt;.&lt;/li&gt;
		&lt;li&gt;The forthcoming &lt;a href=&quot;http://www.artima.com/shop/programming_in_scala&quot;&gt;Programming in Scala&lt;/a&gt; book.&lt;/li&gt;
	&lt;/ul&gt;</content>
		<author>
			<name>Dean Wampler</name>
			<uri>http://blog.objectmentor.com</uri>
		</author>
		<source>
			<title type="html">Object Mentor Blog</title>
			<link rel="self" href="http://blog.objectmentor.com/xml/atom/feed.xml"/>
			<id>tag:blog.objectmentor.com,2005:Typo</id>
			<updated>2009-01-07T00:20:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">“Tearing Down the Ivory Tower of Testing” at SQuAD 2009</title>
		<link href="http://tejasconsulting.com/blog/?p=157"/>
		<id>http://tejasconsulting.com/blog/?p=157</id>
		<updated>2008-12-23T15:51:37+00:00</updated>
		<content type="html">&lt;p&gt;I will be giving a keynote speech titled &amp;#8220;Tearing Down the Ivory Tower of Testing&amp;#8221; at the &lt;a href=&quot;http://www.squadco.com/conference.html&quot;&gt;SQuAD 2009 Conference&lt;/a&gt;, hosted by The Software Quality Association of Denver. The conference in March 11-12, 2009, in Denver Colorado. I know several people who are SQuAD members but I haven&amp;#8217;t been to one of their meetings before, so I&amp;#8217;m excited to be going.&lt;/p&gt;
&lt;p&gt;I will also be giving tutorials at the conference that will be announced later.&lt;/p&gt;</content>
		<author>
			<name>Danny R. Faught</name>
			<uri>http://tejasconsulting.com/blog</uri>
		</author>
		<source>
			<title type="html">Tejas Software Consulting Newsletter</title>
			<subtitle type="html">Commentary by Danny R. Faught</subtitle>
			<link rel="self" href="http://tejasconsulting.com/blog/?feed=rss2"/>
			<id>http://tejasconsulting.com/blog/?feed=rss2</id>
			<updated>2008-12-26T15:20:10+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Perl Hell</title>
		<link href="http://use.perl.org/~Ovid/journal/38138?from=rss"/>
		<id>http://use.perl.org/~Ovid/journal/38138?from=rss</id>
		<updated>2008-12-23T11:30:07+00:00</updated>
		<content type="html">&lt;p&gt;Here's what has me stumped today:&lt;/p&gt;&lt;blockquote&gt;&lt;div&gt;&lt;p&gt; &lt;tt&gt;#!/usr/bin/env perl&lt;br /&gt; &lt;br /&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt; &lt;br /&gt;use Test::Most 'no_plan';&lt;br /&gt;use Test::XML::XPath;&lt;br /&gt; &lt;br /&gt;my $xml = do { local $/; &amp;lt;DATA&amp;gt; };&lt;br /&gt; &lt;br /&gt;my @xpath = qw(&lt;br /&gt;&amp;nbsp; &amp;nbsp; /p:pips/p:version/p:segment_events/p:segment_event[@pid=&quot;p0000004&quot;]/p:ids/p:id &lt;br /&gt;  &amp;nbsp; &amp;nbsp; /p:pips/p:version/p:segment_events/p:segment_event[@pid=&quot;p0000004&quot;]/p:ids/p:id[1  ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; /p:pips/p:version/p:segment_events/p:segment_event[@pid=&quot;p0000004&quot;]/p:ids/p:id[2  ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; not(/p:pips/p:version/p:segment_events/p:segment_event[@pid=&quot;p0000004&quot;]/p:ids/p:  id[3])&lt;br /&gt;&amp;nbsp; &amp;nbsp; count(/p:pips/p:version/p:segment_events/p:segment_event[@pid=&quot;p0000004&quot;]/p:ids/  p:id)=2&lt;br /&gt;);&lt;br /&gt; &lt;br /&gt;for my $xpath (@xpath) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; like_xpath $xml, $xpath, 'whee!';&lt;br /&gt;}&lt;br /&gt;__DATA__&lt;br /&gt;# our XML&lt;/tt&gt;&lt;/p&gt;&lt;/div&gt; &lt;/blockquote&gt;&lt;p&gt;Know what it takes to get that to pass?  This:&lt;/p&gt;&lt;blockquote&gt;&lt;div&gt;&lt;p&gt; &lt;tt&gt;for my $xpath (@xpath) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; my $anything = undef;&lt;br /&gt;&amp;nbsp; &amp;nbsp; like_xpath $xml, $xpath, 'whee!';&lt;br /&gt;}&lt;/tt&gt;&lt;/p&gt;&lt;/div&gt; &lt;/blockquote&gt;&lt;p&gt;Or this:&lt;/p&gt;&lt;blockquote&gt;&lt;div&gt;&lt;p&gt; &lt;tt&gt;for my $xpath (@xpath) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; like_xpath $xml, $xpath, 'whee!';&lt;br /&gt;}&lt;br /&gt;ok 1;&lt;/tt&gt;&lt;/p&gt;&lt;/div&gt; &lt;/blockquote&gt;&lt;p&gt;Trying to reduce that to a minimal test case for a bug report has failed miserably.  It appears that &lt;em&gt;any&lt;/em&gt; sort of assignment anywhere in the &lt;tt&gt;like_xpath&lt;/tt&gt; code will cause these tests to pass and the mere act of moving the affected files to other directories also appears to make tests pass.  Running these tests under the debugger also makes them pass.  Printing out any affected variables makes these tests pass.  Hell, I suspect that breathing heavy would make these tests pass.&lt;/p&gt;&lt;p&gt;This is Perl 5.8.8 on Solaris.  Earlier this month, &lt;a href=&quot;http://www.mail-archive.com/london.pm@london.pm.org/msg16454.html&quot;&gt;Andy Wardley started a London.pm thread about this version of Perl segfaulting due to a comment&lt;/a&gt;.  Some people could reproduce his error and others couldn't.  Versions of Perl other than 5.8.8 seemed fine (and not all 5.8.8 seemed affected).  I'm beginning to suspect that 5.8.8 has a parser issue.  Since Perl's parsing is heuristic-based, this is a bugger (ha!) to track down.&lt;/p&gt;&lt;p&gt; &lt;strong&gt;Update&lt;/strong&gt;:  Pardon me, but F****************K!  As mentioned, any assignment of a variable in the &lt;tt&gt;like_xpath&lt;/tt&gt; code will fix this bug -- but only for my minimal test case.  One of our actual tests still fails roughly 1 out of 5 runs.  The XML returned is always the same, aside from timestamps which aren't in the xpath.  I'm going insane.&lt;/p&gt;</content>
		<author>
			<name>Curtis &quot;Ovid&quot; Poe</name>
			<uri>http://use.perl.org/~Ovid/journal/</uri>
		</author>
		<source>
			<title type="html">Ovid's Journal</title>
			<subtitle type="html">Ovid's use Perl Journal</subtitle>
			<link rel="self" href="http://use.perl.org/~Ovid/journal/rss"/>
			<id>http://use.perl.org/~Ovid/journal/rss</id>
			<updated>2009-01-05T10:20:30+00:00</updated>
			<rights type="html">use Perl; is Copyright 1998-2006, Chris Nandor. Stories, comments, journals, and other submissions posted on use Perl; are Copyright their respective owners.</rights>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Snowy day in New York</title>
		<link href="http://www.joelonsoftware.com/items/2008/12/19.html"/>
		<id>http://www.joelonsoftware.com/items/2008/12/19.html</id>
		<updated>2008-12-19T22:14:12+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span&gt;&lt;a href=&quot;http://www.joelonsoftware.com/items/2008/12/ie6.JPG&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.joelonsoftware.com/items/2008/12/ie6-thumbnail.JPG&quot; /&gt;&lt;/a&gt;&lt;/span&gt;I’ve been debugging the new site. The first problem: hopelessly messed up rendering on IE6. The best way to fix CSS problems with IE6 is to generate random mutations on the style sheet until it looks fixed. That’s really the only way to approach these kinds of things; CSS is nondeterministic, and many better minds than mine have gone completely stark raving mad trying to understand the rhyme and reason of IE6 rendering bugs.&lt;/p&gt;
&lt;p&gt;Once that was fixed, people who read this site in an RSS reader reported that included images with captions weren’t showing up correctly. To fix that one, I had to move the style information from the style sheet right into the tag, but only for the RSS feed. I think that should fix it for the most popular RSS readers (Bloglines and Google Reader) but many RSS readers strip out CSS aggressively and I can’t do anything about that.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href=&quot;http://www.joelonsoftware.com/items/2008/12/WaffleDay.jpg&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.joelonsoftware.com/items/2008/12/WaffleDay-thumbnail.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;Waffle Wednesday at Fog Creek&lt;/span&gt;&lt;/span&gt;To test the fixes, I’ve thrown in a picture of Waffle Wednesday, showing our fabulous director of QA attacking a waffle iron with PAM in the company kitchen.&lt;/p&gt;
&lt;p&gt;Finally—many readers noticed that the images appear slightly pixelated. This is a result of relying on the browser to scale images. In my testing, it seems that Firefox and Safari do a very nice job scaling the images and there’s no visible pixelation. Internet Explorer: not so much. If you use a better browser, you get better results.&lt;/p&gt;

&lt;p&gt;Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the &lt;a href=&quot;http://jobs.joelonsoftware.com/&quot;&gt;Joel on Softw