<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>The Art of Software Development</title>
	<atom:link href="http://sinnema313.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://sinnema313.wordpress.com</link>
	<description>Musings on the Art and Craft of Creating Software</description>
	<lastBuildDate>Thu, 05 Nov 2009 18:37:50 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='sinnema313.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/6e30c944cda253733b63c57c5e0820a9?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>The Art of Software Development</title>
		<link>http://sinnema313.wordpress.com</link>
	</image>
			<item>
		<title>Ubuntu 9.10 &amp; Eclipse 3.5</title>
		<link>http://sinnema313.wordpress.com/2009/11/05/ubuntu-9-10-eclipse-3-5/</link>
		<comments>http://sinnema313.wordpress.com/2009/11/05/ubuntu-9-10-eclipse-3-5/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 18:37:50 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=882</guid>
		<description><![CDATA[I recently upgraded Ubuntu to its latest version (9.10, Karmic Koala) and it works great so far. Except for Eclipse.
I ran Eclipse 3.5 (Galileo), and apparently SWT in that version does something wrong in communicating with GTK. The end result is that buttons don&#8217;t react to mouse clicks anymore. Rather annoying. Luckily, there is a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=882&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I recently upgraded Ubuntu to its latest version (<a href="http://www.ubuntu.com/products/whatisubuntu/910features">9.10, Karmic Koala</a>) and it works great so far. Except for <a href="http://eclipse.org/">Eclipse</a>.</p>
<p>I ran Eclipse 3.5 (<a href="http://www.eclipse.org/galileo/">Galileo</a>), and apparently <a href="http://www.eclipse.org/swt/">SWT </a>in that version does something wrong in communicating with <a href="http://www.gtk.org/">GTK</a>. The end result is that buttons don&#8217;t react to mouse clicks anymore. Rather annoying. Luckily, there is a <a href="https://bugs.launchpad.net/ubuntu/+source/eclipse/+bug/443004/comments/13">solution </a>available. Alternatively, you can use the latest <a href="http://download.eclipse.org/eclipse/downloads/drops/S-3.6M3-200910301201/index.php">Eclipse 3.6 (Helios)</a> milestone.</p>
<p>But that wasn&#8217;t the end of it. Eclipse would now perform extremely slowly on a variety of tasks. It turns out that this is caused by Eclipse now running on the <a href="http://gcc.gnu.org/java/">GCJ</a> Virtual Machine. I simply uninstalled everything with &#8220;gcj&#8221; in its name using <a href="http://www.nongnu.org/synaptic/">Synaptic </a>and all was well again.</p>
Posted in Uncategorized Tagged: eclipse, ubuntu <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/882/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/882/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/882/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/882/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/882/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/882/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/882/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/882/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/882/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/882/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=882&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/11/05/ubuntu-9-10-eclipse-3-5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
		<item>
		<title>JavaFX for GNU/Linux has arrived</title>
		<link>http://sinnema313.wordpress.com/2009/05/31/javafx-for-gnulinux-has-arrived/</link>
		<comments>http://sinnema313.wordpress.com/2009/05/31/javafx-for-gnulinux-has-arrived/#comments</comments>
		<pubDate>Sun, 31 May 2009 20:36:35 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Environment]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[javafx]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=868</guid>
		<description><![CDATA[Finally, the time has come: JavaFX is now supported on both GNU/Linux and Solaris.
It&#8217;s not really advertised, though, so h Here&#8217;s how to get it:

Go to the JavaFX website.
Click the Download now button. Yes, the one that reads JavaFX 1.1 SDK.
Click the JavaFX 1.1.1 1.2 SDK option, and click Download.
You&#8217;ll be prompted to download javafx_sdk-1_2-linux-i586.sh. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=868&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Finally, the time has come: JavaFX is now supported on both GNU/Linux and Solaris.</p>
<p><del datetime="2009-06-02T20:47:54+00:00">It&#8217;s not really advertised, though, so h</del> Here&#8217;s how to get it:</p>
<ul>
<li>Go to the <a href="http://javafx.com/">JavaFX website</a>.</li>
<li>Click the <code>Download now</code> button. <del datetime="2009-06-02T20:46:43+00:00">Yes, the one that reads <code>JavaFX 1.1 SDK</code>.</del></li>
<li>Click the <code>JavaFX <del datetime="2009-06-02T20:46:43+00:00">1.1.1</del> 1.2 SDK</code> option, and click <code>Download</code>.</li>
<li>You&#8217;ll be prompted to download <code>javafx_sdk-1_2-linux-i586.sh</code>. Save it somewhere convenient.</li>
<li>Make the downloaded file executable with <code>chmod + x</code></li>
<li>Run the shell script with <code>./javafx_sdk-1_2-linux-i586.sh</code></li>
<li>Page through the annoying legal stuff by pressing <code>Space</code> repeatedly. At the end, type <code>yes</code>.</li>
<li>You now have a <code>javafx-sdk1.2</code> directory that you can play with.</li>
</ul>
<p>Enjoy!</p>
<p>Oh, and in case you have some JavaFX code from pre-1.2 versions, here&#8217;s <a href="http://steveonjava.com/2009/05/31/javafx-1-2-top-10/">how to migrate</a> it.</p>
<p><strong>Update</strong>: There is also a <a href="http://kenai.com/projects/eplugin2/pages/Home">new Eclipse plugin</a>. Binaries only, the <a href="http://twitter.com/njbartlett/status/2007982710">source will have to wait</a> until it gets transferred to eclipse.org.</p>
Posted in Environment Tagged: eclipse, gnu/linux, javafx <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/868/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/868/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/868/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/868/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/868/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/868/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/868/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/868/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/868/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/868/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=868&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/05/31/javafx-for-gnulinux-has-arrived/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
		<item>
		<title>Supporting multiple versions of a data model</title>
		<link>http://sinnema313.wordpress.com/2009/05/31/supporting-multiple-versions-of-a-data-model/</link>
		<comments>http://sinnema313.wordpress.com/2009/05/31/supporting-multiple-versions-of-a-data-model/#comments</comments>
		<pubDate>Sun, 31 May 2009 14:46:27 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[data model]]></category>
		<category><![CDATA[dependency injection]]></category>
		<category><![CDATA[factory]]></category>
		<category><![CDATA[s1000d]]></category>
		<category><![CDATA[versioning]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=833</guid>
		<description><![CDATA[As an application evolves, its data model often does too. If you control both, this usually isn&#8217;t a problem. However, sometimes your power to change the data model is restricted. This happens, for instance, when the data model is published, and others may depend on it. An extreme case of this is when the data [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=833&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>As an application evolves, its data model often does too. If you control both, this usually isn&#8217;t a problem. However, sometimes your power to change the data model is restricted. This happens, for instance, when the data model is <a href="http://martinfowler.com/bliki/PublishedInterface.html">published</a>, and others may depend on it. An extreme case of this is when the data model is defined by another organization as, for example, with <a href="http://www.s1000d.org/Pages/Home.aspx">S1000D</a>.</p>
<p>Having no absolute control over the data model isn&#8217;t much of a problem if you can leave one version behind completely, and move on to the next. But often you won&#8217;t be so lucky. I know I&#8217;m not: we need to support both S1000D 3.0 and 4.0.</p>
<p>There&#8217;s different ways in which you can support multiple data model versions. The one I&#8217;m concerned with here, is when your application needs to support multiple data models at the <em>same time with the same code</em>. That leaves out alternatives like having multiple branches of your code for the different data model versions.</p>
<p>One trick that can come to the rescue here is the <a href="http://c2.com/xp/OnceAndOnlyOnce.html">Once And Only Once</a> rule (also called the <a href="http://c2.com/cgi/wiki?DontRepeatYourself">DRY</a> principle). When applied to creating instances, this leads to the <a href="http://en.wikipedia.org/wiki/Factory_Pattern">Factory pattern</a>. If you have all your instances created by a factory, then there&#8217;s only one place where you need to decide which class (e.g. the 3.0 or 4.0 version) to instantiate. If those decisions are similar for all the classes in your model, then you could even extract them into a common base class for your factories.</p>
<p>Most of the time, the different versions of the data model will share a lot of similarities. It is tempting to extract those into a common base class. For example, in S1000D there is a type called <a href="http://www.s1000d.org/Getting%20Started/Pages/AboutS1000D.aspx">descriptive data module</a>, and you could derive <code>DescriptiveDataModule30</code> and <code>DescriptiveDataModule40</code> from <code>DecriptiveDataModule</code>.</p>
<p>But when the objects in your data model have inheritance relationships themselves, that can get ugly very fast. For instance, a descriptive data module is one of many kinds of data modules, and these data modules share a lot of characteristics. So in code, <code>DescriptiveDataModule</code> would descend from <code>DataModule</code>, and both would have aspects that differ in the 3.0 and 4.0 versions. This spells trouble.</p>
<p>Therefore, it is usually better to use <a href="http://en.wikipedia.org/wiki/Object_composition">composition</a> instead. So <code>DataModule</code> would have a reference to a <code>DataModuleIssue</code> (where &#8220;issue&#8221; is used in the sense of the various issues of the S1000D specification, i.e. what I&#8217;ve been calling &#8220;versions&#8221; so far), which the <code>DescriptiveDataModule</code> would inherit. The factory would <a href="http://en.wikipedia.org/wiki/Dependency_injection">inject</a> either a <code>DescriptiveDataModuleIssue30</code> or a <code>DescriptiveDataModuleIssue40</code> into the <code>DescriptiveDataModule</code>, where <code>DescriptiveDataModuleIssue30</code> would descend from <code>DataModuleIssue30</code>, and <code>DescriptiveDataModuleIssue40</code> from <code>DataModuleIssue40</code>.</p>
<p>The idea is to make the <code>Issue</code> classes very bare, dealing only with the stuff that differs between issues, so there is no need for a common base class (although both do implement the same interface). The things that are the same in all issues, go into the core model objects (<code>DescriptiveDataModule</code> and <code>DataModule</code> in our example).</p>
Posted in Code, Design Tagged: data model, dependency injection, factory, s1000d, versioning <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/833/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/833/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/833/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/833/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/833/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/833/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/833/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/833/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/833/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/833/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=833&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/05/31/supporting-multiple-versions-of-a-data-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
		<item>
		<title>Kanban</title>
		<link>http://sinnema313.wordpress.com/2009/05/27/kanban/</link>
		<comments>http://sinnema313.wordpress.com/2009/05/27/kanban/#comments</comments>
		<pubDate>Wed, 27 May 2009 21:30:45 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Environment]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[kanban]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=794</guid>
		<description><![CDATA[Lately, I&#8217;ve seen a lot of discussions on Kanban. For those of you who, like me, want to know what all that fuss is about, I collected a couple of links that I will try to merge into a coherent whole below.
So what exactly is Kanban? Literally, it means &#8220;visual card&#8221;, but that&#8217;s not very [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=794&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Lately, I&#8217;ve seen a lot of discussions on <em>Kanban</em>. For those of you who, like me, want to know what all that fuss is about, I collected a couple of links that I will try to merge into a coherent whole below.</p>
<p>So what exactly <em>is</em> Kanban? Literally, it means <a href="http://availagility.files.wordpress.com/2008/10/kenji-kanban-2.jpg">&#8220;visual card&#8221;</a>, but that&#8217;s not very helpful. This <a href="http://www.agileproductdesign.com/blog/2009/kanban_over_simplified.html">introduction</a> explains that Kanban revolves around a board that visualizes the software development flow.</p>
<p>In fact, <a href="http://availagility.wordpress.com/2008/10/28/kanban-flow-and-cadence/">flow</a> is a very important concept here. Kanban is a <em>pull</em> system, in which <a href="http://jania.pe.kr/aw/moin.cgi/MinimumMarketableFeature">Minimal Marketable Features</a> (MMFs) flow through the development stages when there is capacity available. This contrasts with most <a href="http://agilemanifesto.org/">Agile</a> methods that <em>push</em> work items into iterations. Also, note that for most Agile methods, those work items (e.g. <a href="http://en.wikipedia.org/wiki/User_story">User Stories</a>) would be smaller than MMFs.</p>
<p>The other big point is that Kanban limits <em>Work In Progress</em> (i.e. the number of MMFs per development stage). This naturally exposes the bottleneck(s) in the flow.<br />
<img src="http://availagility.files.wordpress.com/2008/10/limits-kanban.png?w=300&amp;h=125" alt="Kanban limits WIP" /></p>
<p>This leads us nicely to the <a href="http://www.agilemanagement.net/Articles/Weblog/GoalsforusingKanban.html">main reason to use Kanban</a>: to improve your software development process. Other Agile methods deal with process improvement as well, but <a href="http://www.crisp.se/henrik.kniberg/Kanban-vs-Scrum.pdf">Kanban is different from e.g. Scrum</a>.</p>
<p>So, if all this sounds cool and you want to give Kanban a shot, then apparently this is how you should <a href="http://www.agilemanagement.net/Articles/Weblog/HowtoStartwithKanban.html">get started.</a> If you do, then you may see <a href="http://silkandspinach.net/2009/06/05/initial-observations-on-kanban-introduction/">these effects</a>. Also, make sure to get into a <a href="http://blog.mattwynne.net/2009/05/27/kanban-state-of-mind/">Kanban state of mind</a>.</p>
<p><strong>Update</strong>: here is a <a href="http://www.targetprocess.com/blog/2009/05/lean-and-kanban-software-development.html">great compilation of Kanban resources</a>.</p>
Posted in Environment Tagged: agile, kanban <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/794/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/794/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/794/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/794/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/794/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=794&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/05/27/kanban/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>

		<media:content url="http://availagility.files.wordpress.com/2008/10/limits-kanban.png?w=300&#38;h=125" medium="image">
			<media:title type="html">Kanban limits WIP</media:title>
		</media:content>
	</item>
		<item>
		<title>Replacing the word &#8220;test&#8221;</title>
		<link>http://sinnema313.wordpress.com/2009/05/20/replacing-the-word-test/</link>
		<comments>http://sinnema313.wordpress.com/2009/05/20/replacing-the-word-test/#comments</comments>
		<pubDate>Wed, 20 May 2009 07:17:07 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Test]]></category>
		<category><![CDATA[check]]></category>
		<category><![CDATA[explore]]></category>
		<category><![CDATA[falsify]]></category>
		<category><![CDATA[verify]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=785</guid>
		<description><![CDATA[Elisabeth Hendrickson wants to get rid of the word &#8220;test&#8221;, as it can mean two different things, which she labels &#8220;Check&#8221; and &#8220;Explore&#8221;.
I very much agree with the fact that there are two entirely different aspects to testing. &#8220;Checking&#8221; is when you get a warm fuzzy feeling when the bar gets green. You perform an [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=785&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://testobsessed.com">Elisabeth Hendrickson</a> wants to <a href="http://twitter.com/testobsessed/status/1838117297">get rid of the word &#8220;test&#8221;</a>, as it can mean two different things, which she labels &#8220;Check&#8221; and &#8220;Explore&#8221;.</p>
<p>I very much agree with the fact that there are two entirely different aspects to testing. &#8220;Checking&#8221; is when you get a warm fuzzy feeling when the bar gets green. You perform an experiment and if you get a positive result then you know that all is well.</p>
<p>&#8220;Exploring&#8221; is different in that you don&#8217;t get a warm fuzzy feeling on &#8220;green&#8221;. In other words, if the experiment produces a positive result, you&#8217;re <strong>not</strong> done yet. You need to look further, until you find a negative result. Only then will you have learned something. And if you spend some time exploring, and find no problems, then there&#8217;s always that nagging feeling: is there really nothing to find, or did I just not look hard enough?</p>
<p>So it seems I agree with Elisabeth. Then why this blog post?</p>
<p>Like Elisabeth, I think that words matter. She&#8217;s right to want to replace the word &#8220;test&#8221;. I just disagree with the replacements. &#8220;Check&#8221; has <a href="http://dictionary.reference.com/browse/check">way too many meanings</a>, and the <a href="http://dictionary.reference.com/browse/explore">definitions of &#8220;explore&#8221;</a> don&#8217;t seem to catch what is meant well enough for my taste.</p>
<p>So I&#8217;d like to propose an alternative from the world of science: <a href="http://dictionary.reference.com/browse/verify">&#8220;verify&#8221;</a> and <a href="http://dictionary.reference.com/browse/falsify">&#8220;falsify&#8221;</a>. Automated tests verify that the software behaves as expected, while exploratory testing falsifies both the expectations and the completeness of the test suite.</p>
<p>What do you think?</p>
Posted in Test Tagged: check, explore, falsify, Test, verify <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/785/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/785/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/785/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/785/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/785/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/785/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/785/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/785/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/785/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/785/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=785&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/05/20/replacing-the-word-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
		<item>
		<title>Pre-OSGi modularity with Macker</title>
		<link>http://sinnema313.wordpress.com/2009/04/17/pre-osgi-modularity-with-macker/</link>
		<comments>http://sinnema313.wordpress.com/2009/04/17/pre-osgi-modularity-with-macker/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 08:31:33 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Debug]]></category>
		<category><![CDATA[Environment]]></category>
		<category><![CDATA[macker]]></category>
		<category><![CDATA[modularity]]></category>
		<category><![CDATA[osgi]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=776</guid>
		<description><![CDATA[OSGi is gaining a lot of traction lately. But what if you have a very large application? Migration can be a lot of work.
I would like to point to a simple tool we use that might help out a bit here. It&#8217;s called Macker and 
it&#8217;s meant to model the architectural ideals programmers always dream [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=776&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://www.osgi.org/Main/HomePage">OSGi</a> is gaining a lot of traction lately. But what if you have a very large application? Migration can be a lot of work.</p>
<p>I would like to point to a simple tool we use that might help out a bit here. It&#8217;s called <a href="http://innig.net/macker/index.html">Macker</a> and </p>
<blockquote><p>it&#8217;s meant to model the architectural ideals programmers always dream up for their projects, and then break &#8212; it helps keep code clean and consistent.</p></blockquote>
<p>Macker is open source (<a href="http://www.gnu.org/copyleft/gpl.html">GPL</a>). It&#8217;s current version is 0.4 and has been for a long time. That doesn&#8217;t mean it&#8217;s immature or abandoned, however. It&#8217;s author had a lot more features planned, hence the 0.4. But what&#8217;s already available is enough to give it a serious look.</p>
<p>So, what does Macker do, exactly? It enforces rules about your architecture. For example, suppose you have a product with a public API. You could create a rule file with an <code>&lt;access-rule&gt;</code> that the API must be self-contained:</p>
<pre class="brush: xml;">
  &lt;message&gt;The API should be self-contained&lt;/message&gt;
  &lt;deny&gt;
    &lt;from pattern=&quot;api&quot; /&gt;
  &lt;/deny&gt;
  &lt;allow&gt;
    &lt;from pattern=&quot;api&quot; /&gt;
    &lt;to pattern=&quot;api&quot; /&gt;
  &lt;/allow&gt;
  &lt;allow&gt;
   &lt;from pattern=&quot;api&quot; /&gt;
    &lt;to pattern=&quot;jre&quot; /&gt;
  &lt;/allow&gt;
</pre>
<p>These rules can be very explicit about what is and what isn&#8217;t allowed. There are several ways to specify them, but I&#8217;ve found it easiest to use patterns, like in the example above, since they can have symbolic names. Here&#8217;s an example:</p>
<pre class="brush: xml;">
&lt;pattern name=&quot;api&quot;&gt;
  &lt;include class=&quot;com.acme.api.**&quot;/&gt;
&lt;/pattern&gt;
</pre>
<p>Where the <code>**</code> denotes every class in the <code>com.acme.api</code> package, or any of its sub-packages. See the <a href="http://innig.net/macker/guide/index.html">Macker user guide</a> for more information about <a href="http://innig.net/macker/guide/regex.html">supported regular expressions</a>.</p>
<p>Macker comes with an <a href="http://innig.net/macker/guide/ant.html">Ant task</a>, so you can enforce your architecture from your build. Maybe not as good as OSGi, but it sure helps with keeping your code the way you intended it.</p>
Posted in Debug, Environment Tagged: macker, modularity, osgi <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/776/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/776/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/776/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/776/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/776/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/776/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/776/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/776/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/776/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/776/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=776&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/04/17/pre-osgi-modularity-with-macker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
		<item>
		<title>Writing Maintainable and Secure Java Applications using an XQuery Builder</title>
		<link>http://sinnema313.wordpress.com/2009/03/08/writing-maintainable-and-secure-java-applications-using-an-xquery-builder/</link>
		<comments>http://sinnema313.wordpress.com/2009/03/08/writing-maintainable-and-secure-java-applications-using-an-xquery-builder/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 08:00:31 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[builder pattern]]></category>
		<category><![CDATA[xquery]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=708</guid>
		<description><![CDATA[So you&#8217;re developing this cool Java application where you access XML data using XQuery. Easy enough with a powerful XML database like xDB, right? Well, yes and no   This document addresses some of the issues you may encounter.
The naive approach
The easiest way to execute XQuery statements, is to embed them into your Java [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=708&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>So you&#8217;re developing this cool Java application where you access XML data using <a href="http://www.w3.org/TR/xquery/">XQuery</a>. Easy enough with a powerful XML database like <a href="http://netherlands.emc.com/products/detail/software/documentum-xdb.htm">xDB</a>, right? Well, yes and no <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  This document addresses some of the issues you may encounter.</p>
<p><strong>The naive approach</strong></p>
<p>The easiest way to execute XQuery statements, is to embed them into your Java code:</p>
<pre class="brush: java;">
executeXQuery(&quot;for $a in document('/content/repository)&quot;
    + &quot; where $a//html/head/title = 'Using XQuery'&quot;
    + &quot; return $a&quot;);
</pre>
<p>where <code>executeXQuery()</code> executes the XQuery against your XML database.</p>
<p>Most of your XQuery statements won&#8217;t be static like this example. Rather, you&#8217;d get some input from your end user:</p>
<pre class="brush: java;">
    final String title = getInputFromEndUser();
    final String xquery
        = &quot;for $a in document('/content/repository)&quot;
        + &quot; where $a//html/head/title = '&quot;
        + title
        + &quot;' return $a&quot;;
    executeQuery(xquery);
</pre>
<p><strong>Problems with the naive approach</strong></p>
<p>This approach has some problems, though. First of all, the last XQuery is vulnerable to an XQuery Injection attack. This is the same as a <a href="http://en.wikipedia.org/wiki/SQL_injection">SQL Injection</a> attack, but based on XQuery instead of SQL. Like with SQL programming, you can use variables to work around this issue:</p>
<pre class="brush: java;">
final String title = getInputFromEndUser();
final String xquery
    = &quot;declare variable $title external;&quot;
    + &quot;for $a in document('/content/repository)&quot;
    + &quot; where $a//html/head/title = $title&quot;
    + &quot; return $a&quot;;
executeQuery(xquery, title);
</pre>
<p>where <code>executeXQuery()</code> now accepts a variable number of arguments after the XQuery statement that are values for the externally declared variables.</p>
<p>But there are still some maintainability issues with this code. For starters, see the argument to the <code>document()</code> function. This depends on the particular database layout for your application. If you&#8217;ll ever need to change it, you&#8217;ll likely need to update hundreds of XQuery statements. You could, of course, extract this into a constant.</p>
<p>But there is more. Your XQueries are likely to go beyond the basic XQuery specification, for instance to search on meta-data. In xDB, that would read something like this:</p>
<pre class="brush: java;">
final String title = getInputFromEndUser();
final String xquery
    = &quot;declare variable $title external;&quot;
    + &quot;for $a in document('/content/repository)&quot;
    + &quot; where xhive:metadata($a, 'Title') = $title&quot;
    + &quot; return $a&quot;;
executeQuery(xquery, title);
</pre>
<p>You&#8217;ve now added a dependency on a specific implementation, which is never a good idea, since it basically generates a self-inflicted <a href="http://en.wikipedia.org/wiki/Vendor_lock-in">vendor lock-in</a>.</p>
<p>Of course, you could extract the vendor-specific parts as well, but by now I hope you begin to see the mess you&#8217;ll end up with.</p>
<p>Worse, since you embed the XQuery statement as a <code>String</code> in your Java code, any typos you make in this unreadable statement can only be found at runtime, since the Java compiler doesn&#8217;t understand XQuery.</p>
<p><strong>XQuery Builder to the rescue</strong></p>
<p>Let&#8217;s take a step back here and look at what we&#8217;re trying to achieve. We want to construct an object (an XQuery statement), that we want to use later on (execute it against our XML database). This is a recurring pattern, called the <a href="http://en.wikipedia.org/wiki/Builder_pattern">Builder Pattern</a>. So we need an XQuery Builder.</p>
<p>Now, the XQuery standard is complex enough that I don&#8217;t recommend spending a lot of time coming up with the perfect XQuery Builder. Instead, you should take it slow, and only implement what you <a href="http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It">really need</a>.</p>
<p>The best way to do that is using <a href="http://en.wikipedia.org/wiki/Test-Driven_Development">Test-Driven Development</a> (TDD). I like to think that&#8217;s always the case, but even if you disagree, there are good reasons why it is the best approach in this scenario.</p>
<p>You&#8217;ll evolve the XQuery Builder over time, adding capabilities as needed, so you need a good suite of unit tests to ensure you didn&#8217;t break anything. Also, TDD focuses first and foremost on the API that you want to realize, making it easier to come up with a clean design.</p>
<p>Speaking of a clean design, the Builder Pattern lends itself very much to the use of a <a href="http://en.wikipedia.org/wiki/Fluent_interface">fluent interface</a>, since you want to be able to express the XQuery in code as much as possible as you would in a string. Here&#8217;s an example of the sort of thing we&#8217;re trying to achieve:</p>
<pre class="brush: java;">
    final String xquery = builder
        .where().metaData(&quot;Title&quot;).isEqualTo(title)
        .and().uri().startsWith(prefix)
        .orderBy().uri()
        .returns().id()
        .build();
</pre>
<p>Let&#8217;s take a look at how the XQuery Builder approach solves the problems we identified earlier.</p>
<p>First the security issue. The example above doesn&#8217;t explicitly mention external variables, but that doesn&#8217;t mean that they aren&#8217;t used. If your code needs security, the XQuery Builder can provide it. If you&#8217;re absolutely sure that your application only runs in a trusted environment, you can leave it out. If you later discover that your environment isn&#8217;t as secure as you thought, you can add support for external variables in the XQuery Builder and be done with it. No need to change hundreds of XQuery statements!</p>
<p>Next, notice that the example didn&#8217;t mention where to look for documents. The XQuery Builder is the <a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself">only place</a> where the repository layout is specified, so that it is easy to update.</p>
<p>There is also nothing vendor specific in the example above. The <code>metaData()</code> clause handles that, again in one place.</p>
<p>Arguably the biggest benefit of the XQuery Builder, however, is that it gives you (some) compile time checking of your XQuery statements. For example, if you were to write <code>builder.hwere()</code>, the Java compiler would tell you about it right away.</p>
<p>You can take this as far as you think is useful. For instance, notice the <code>uri()</code> method in the example. Apparently, this application uses URIs on objects a lot, so it made sense to make it easy to use them. The same apparently didn&#8217;t hold for the <code>Title</code> meta-data field. By developing your own XQuery Builder, you get to decide the API that makes sense for your application.</p>
<p><strong>Creating an XQuery Builder</strong></p>
<p>So, how hard is it to create such an XQuery Builder? That depends on how far you want to go. But the beginnings are simple.</p>
<p>Start out with this <a href="http://junit.sourceforge.net/doc/cookbook/cookbook.htm">JUnit 4</a> test:</p>
<pre class="brush: java;">
import static org.junit.Assert.assertEquals;

import org.junit.Before;
import org.junit.Test;

public class XQueryBuilderTest {

  private XQueryBuilder builder;

  @Before
  public void init() {
    builder = new XQueryBuilder();
  }

  @Test
  public void all() {
    assertEquals(&quot;XQuery&quot;,
        &quot;for $a in document('/content/repository')\n&quot;
            + &quot;return $a&quot;,
        builder.build());
  }

}
</pre>
<p>which forces us to write this code to make it compile:</p>
<pre class="brush: java;">
public class XQueryBuilder {

  public String build() {
    return null;
  }

}
</pre>
<p>The test obviously fails. For now just <a href="http://en.wikipedia.org/wiki/Test-driven_development#Development_style">fake it</a> by returning <code>"for $a in document('/content/repository')\nreturn $a"</code>.</p>
<p>This first step may seem a bit silly to those not used to TDD, but it is essentially just a way to get set up. In TDD, you don&#8217;t want to write code without a failing test, so always try to get a failing test as fast as possible.</p>
<p>Now, for something a bit more interesting. Let&#8217;s test that the XQuery can return IDs of documents, since we&#8217;ll need that very often:</p>
<pre class="brush: java;">
@Test
public void returnId() {
  assertEquals(&quot;XQuery&quot;,
      &quot;for $a in document('/content/repository')\n&quot;
          + &quot;return xhive:metadata($a,'id')&quot;,
      builder.returns().id().build());
}
</pre>
<p>In fact, that&#8217;s a special case of returning some meta-data, so we&#8217;ll tackle the simpler case first:</p>
<pre class="brush: java;">
@Test
public void returnMetaData() {
  assertEquals(&quot;XQuery&quot;,
      &quot;for $a in document('/content/repository')\n&quot;
          + &quot;return xhive:metadata($a,'foo')&quot;,
      builder.returns().metaData(&quot;foo&quot;).build());
}
</pre>
<p>For this to compile, we need a <code>returns()</code> method in <code>XQueryBuilder</code>:</p>
<pre class="brush: java;">
public class XQueryBuilder {

  private final Return returns = new Return(this);

  public String build() {
    final StringBuilder result = new StringBuilder();
    result.append(
        &quot;for $a in document('/content/repository')\n&quot;);
    result.append(returns);
    return result.toString();
  }

  public Return returns() {
    return returns;
  }

}
</pre>
<p>Note that we can&#8217;t use the more natural term <code>return</code>, since that is a reserved word in Java. Here&#8217;s the <code>Return</code> class:</p>
<pre class="brush: java;">
public class Return {

  private final XQueryBuilder builder;
  private MetaDataReturnClause clause;

  public Return(final XQueryBuilder builder) {
    this.builder = builder;
  }

  public Return metaData(final String name) {
    return setClause(new MetaDataReturnClause(name));
  }

  private Return setClause(
      final MetaDataReturnClause clause) {
    this.clause = clause;
    return this;
  }

  @Override
  public String toString() {
    final StringBuilder result = new StringBuilder(
        &quot;return &quot;);
    if (clause == null) {
      result.append(&quot;$a&quot;);
    } else {
      result.append(clause);
    }
    return result.toString();
  }

  public String build() {
    return builder.build();
  }

}
</pre>
<p>And here&#8217;s the <code>MetaDataReturnClause</code>:</p>
<pre class="brush: java;">
public class MetaDataReturnClause {

  private final String name;

  public MetaDataReturnClause(final String name) {
    this.name = name;
  }

  @Override
  public String toString() {
    return &quot;xhive:metadata($a,'&quot; + name + &quot;')&quot;;
  }

}
</pre>
<p>So implementing the ID is easy:</p>
<pre class="brush: java;">
public class Return {

  public Return id() {
    return setClause(new IdReturnClause());
  }

  // ...
}
</pre>
<pre class="brush: java;">
public class IdReturnClause
    extends MetaDataReturnClause {

  public IdReturnClause() {
    super(&quot;id&quot;);
  }

}
</pre>
<p>By now you probably spotted some duplication. First the tests:</p>
<pre class="brush: java;">
  @Test
  public void all() {
    assertXQuery(&quot;return $a&quot;, builder.build());
  }

  @Test
  public void returnMetaData() {
    assertXQuery(&quot;return xhive:metadata($a,'foo')&quot;,
        builder.returns().metaData(&quot;foo&quot;).build());
  }

  @Test
  public void returnId() {
    assertXQuery(&quot;return xhive:metadata($a,'id')&quot;,
        builder.returns().id().build());
  }

  private void assertXQuery(final String expected,
      final String actual) {
    assertEquals(&quot;XQuery&quot;,
        &quot;for $a in document('/content/repository')\n&quot;
        + expected, actual);
  }
</pre>
<p>Yes, it&#8217;s just as important to keep your tests clean as it is for your code! Speaking of which, there are a lot of places where this <code>$a</code> thingie comes up. Let&#8217;s extract it:</p>
<pre class="brush: java;">
public class XQueryBuilder {

  public String build() {
    final StringBuilder result = new StringBuilder();
    result.append(&quot;for &quot;).append(getContext())
       .append(&quot; in document('/content/repository')\n&quot;);
    result.append(returns);
    return result.toString();
  }

  public String getContext() {
    return &quot;$a&quot;;
  }

  // ...
}
</pre>
<p>So that the <code>Return</code> class can use it:</p>
<pre class="brush: java;">
public class Return {

  private final XQueryBuilder builder;
  private MetaDataReturnClause clause;

  public Return(final XQueryBuilder builder) {
    this.builder = builder;
  }

  public Return metaData(final String name) {
    return setClause(new MetaDataReturnClause(this,
        name));
  }

  public Return id() {
    return setClause(new IdReturnClause(this));
  }

  private Return setClause(
      final MetaDataReturnClause clause) {
    this.clause = clause;
    return this;
  }

  @Override
  public String toString() {
    final StringBuilder result = new StringBuilder();
    result.append(&quot;return &quot;);
    if (clause == null) {
      result.append(builder.getContext());
    } else {
      result.append(clause);
    }
    return result.toString();
  }

  public String build() {
    return builder.build();
  }

  public XQueryBuilder getBuilder() {
    return builder;
  }

}
</pre>
<p>And the <code>MetaDataReturnClause</code> as well:</p>
<pre class="brush: java;">
public class MetaDataReturnClause {

  private final String name;
  private final Return returns;
  private XQueryBuilder builder;

  public MetaDataReturnClause(final Return returns,
      final String name) {
    this.returns = returns;
    this.name = name;
  }

  @Override
  public String toString() {
    return &quot;xhive:metadata(&quot;
        + returns.getBuilder().getContext()
        + &quot;,'&quot; + name + &quot;')&quot;;
  }

}
</pre>
<p>You can probably see the <code>getContext()</code> method gaining traction when considering recursive XQueries. As always, keeping your design clean makes it easier to enhance later.</p>
<p>So there you have your basic XQuery Builder. From these humble beginnings, it&#8217;s easy to add more functionality. For example, suppose we want to return not just the ID, but also the URI of an object. First we add support for URIs in the <code>return</code> clause, since we anticipate we&#8217;ll it need often:</p>
<pre class="brush: java;">
  @Test
  public void returnUri() {
    assertXQuery(&quot;return xhive:metadata($a,'uri')&quot;,
        builder.returns().uri().build());
  }
</pre>
<p>Which is implemented along the same lines as before:</p>
<pre class="brush: java;">
public class Return {

  public Return uri() {
    return setClause(new UriReturnClause(this));
  }

  // ...

}
</pre>
<p>With a new class <code>UriReturnClause</code>:</p>
<pre class="brush: java;">
public class UriReturnClause
    extends MetaDataReturnClause {

  public UriReturnClause(final Return returns) {
    super(returns, &quot;uri&quot;);
  }

}
</pre>
<p>Next, we need to be able to return multiple items:</p>
<pre class="brush: java;">
  @Test
  public void returnIdAndUri() {
    assertXQuery(&quot;return (xhive:metadata($a,'id'), &quot;
        + &quot;xhive:metadata($a,'uri'))&quot;,
        builder.returns().id().and().uri().build());
  }
</pre>
<p>The <code>and()</code> method is just syntactic sugar to make the code easy to read:</p>
<pre class="brush: java;">
  public Return and() {
    return this;
  }
</pre>
<p>To pass the test, we need to change the <code>clause</code> instance variable to a list:</p>
<pre class="brush: java;">
public class Return {

  private final List clauses = new ArrayList();

  public Return metaData(final String name) {
    return addClause(new MetaDataReturnClause(this,
        name));
  }

  private Return addClause(
      final MetaDataReturnClause clause) {
    clauses.add(clause);
    return this;
  }

  @Override
  public String toString() {
    final StringBuilder result = new StringBuilder();
    result.append(&quot;return &quot;);
    if (clauses.isEmpty()) {
      result.append(builder.getContext());
    } else {
      if (clauses.size() &gt; 1) {
        result.append('(');
      }
      String prefix = &quot;&quot;;
      for (final MetaDataReturnClause clause : clauses) {
        result.append(prefix).append(clause);
        prefix = &quot;, &quot;;
      }
      if (clauses.size() &gt; 1) {
        result.append(')');
      }
    }
    return result.toString();
  }

  // ...

}
</pre>
<p>Adding support for the <code>where</code> and <code>orderBy</code> clauses follows the same approach as for <code>return</code> and is left as an exercise for the reader <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>In doing so, you will probably encounter some duplication for e.g. meta-data handling between the <code>where</code>, <code>orderBy</code> and <code>return</code> clauses, which you can extract into e.g. <code>XQueryBuilder.getMetaDataClause()</code>.</p>
<p>Have fun writing your <code>XQueryBuilder</code> based Java applications!</p>
Posted in Code, Design Tagged: builder pattern, xquery <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/708/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/708/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/708/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/708/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/708/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/708/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/708/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/708/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/708/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/708/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=708&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/03/08/writing-maintainable-and-secure-java-applications-using-an-xquery-builder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
		<item>
		<title>The Registry Pattern</title>
		<link>http://sinnema313.wordpress.com/2009/03/01/the-registry-pattern/</link>
		<comments>http://sinnema313.wordpress.com/2009/03/01/the-registry-pattern/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 14:48:56 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[registry pattern]]></category>
		<category><![CDATA[xp studio]]></category>
		<category><![CDATA[xpml]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=678</guid>
		<description><![CDATA[eXtreme Programming Markup Language (XPML) uses several XML documents that are interrelated. For example, releases refer to iterations, which refer to user stories, which might refer to use cases. These objects are referenced by name in the XML documents, and any code that deals with them needs to translate these names into real object references.
This [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=678&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://xpstudio.sourceforge.net/xpml.html">eXtreme Programming Markup Language</a> (XPML) uses several XML documents that are interrelated. For example, <a href="http://xpstudio.sourceforge.net/xpml/release.xsd">releases</a> refer to <a href="http://xpstudio.sourceforge.net/xpml/iteration.xsd">iterations</a>, which refer to <a href="http://xpstudio.sourceforge.net/xpml/user-story.xsd">user stories</a>, which might refer to <a href="http://xpstudio.sourceforge.net/xpml/use-case.xsd">use cases</a>. These objects are referenced by name in the XML documents, and any code that deals with them needs to translate these names into real object references.</p>
<p>This is the situation that the <a href="http://www.mindspring.com/~mgrand/pattern_synopses3.htm#Registry">Registry Pattern</a> describes:</p>
<blockquote><p>Objects need to contact another object, knowing only the object’s name or the name of the service it provides, but not how to contact it. Provide a service that takes the name of an object, service or role and returns a remote proxy that encapsulates the knowledge of how to contact the named object.</p></blockquote>
<p>It&#8217;s the same basic publish/find model that forms the basis of a <a href="http://en.wikipedia.org/wiki/Service-oriented_architecture">Service Oriented Architecture</a> (SOA) and for the <a href="http://www.osgi.org/About/Technology#Framework">services layer in OSGi</a>.</p>
<p>In <a href="http://xpstudio.sourceforge.net/">XP Studio</a>, the named objects of interest are the planning objects, e.g. releases, iterations, and such:</p>
<pre class="brush: java;">
public interface PlanningObject {

  /**
   * @return The object's name
   */
  String getName();

  /**
   * Set the object's name.
   * @param name The name to set
   */
  void setName(String name);

  // ...
}
</pre>
<p>Any code that needs to reference such a planning object, can use the registry:</p>
<pre class="brush: java;">
public class Registry {

  private static Registry instance;

  private final Map registry = new HashMap();

  public static synchronized Registry getInstance() {
    if (instance == null) {
      instance = new Registry();
    }
    return instance;
  }

  public synchronized Reference getReference(
      final String name) {
    final Reference result;
    if (isRegistered(name)) {
      result = registry.get(name);
    } else {
      result = new Reference(name);
      registry.put(name, result);
    }
    return result;
  }

  private boolean isRegistered(final String name) {
    return registry.containsKey(name);
  }

  public synchronized void register(
      final PlanningObject object) {
    final Reference reference = getReference(
        object.getName());
    if (!reference.hasObject()
        || reference.getObject() != object) {
      reference.setObject(object);
    }
  }

  public synchronized void unregister(
      final PlanningObject object) {
    if (isRegistered(object.getName())) {
      final Reference reference = getReference(
          object.getName());
      if (reference.hasObject()) {
        reference.setObject(null);
      }
    }
  }

}
</pre>
<p>Note that the actual code uses Java5 generics, but WordPress&#8217; source code formatter can&#8217;t handle that.</p>
<p>The planning objects use the registry to register themselves:</p>
<pre class="brush: java;">
public class PlanningObjectImpl
    implements PlanningObject {

  private String name = &quot;&quot;;

  public PlanningObjectImpl(final String name) {
    setName(name);
  }

  public String getName() {
    return name;
  }

  public final void setName(final String name) {
    if (!this.name.equals(name)) {
      Registry.getInstance().unregister(this);
      this.name = name;
      Registry.getInstance().register(this);
    }
  }

  // ...
}
</pre>
<p>Now any client code can get references to the planning objects:</p>
<pre class="brush: java;">
public class Reference {

  private PlanningObject object;
  private final String name;

  public Reference(final String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public boolean hasObject() {
    return object != null;
  }

  public PlanningObject getObject() {
    return object;
  }

  public void setObject(final PlanningObject object) {
    this.object = object;
  }

}
</pre>
<p>One example of using references is with user stories, which may depend on other user stories:</p>
<pre class="brush: java;">
public class UserStoryImpl extends PlanningObjectImpl
    implements UserStory {

  private final Set dependsOn = new HashSet();

  public UserStoryImpl(final String name) {
    super(name);
  }

  public void addDependsOn(final String userStoryName) {
    dependsOn.add(Registry.getInstance().getReference(
        userStoryName));
  }

  public Set getDependsOn() {
    final Set result = new HashSet();
    for (final Reference reference : dependsOn) {
      if (reference.hasObject()) {
        result.add((UserStory) reference.getObject());
      }
    }
    return result;
  }

  // ...

}
</pre>
<p>That&#8217;s the basic registry pattern implementation.</p>
<p>The actual code in XP Studio employs some enhancements. One of them is the use of <a href="http://en.wikipedia.org/wiki/Namespace">namespaces</a> so that objects in different projects can use the same name.</p>
<p>Another neat trick is to override the <code>equals()</code> method of both <code>PlanningObjectImpl</code> and <code>Reference</code> to make sure that references and the objects they refer to are regarded as the same, which can greatly simplify some code.</p>
Posted in Code, Design Tagged: registry pattern, xp studio, xpml <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/678/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=678&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/03/01/the-registry-pattern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
		<item>
		<title>The Art of Pair Programming</title>
		<link>http://sinnema313.wordpress.com/2009/02/22/the-art-of-pair-programming/</link>
		<comments>http://sinnema313.wordpress.com/2009/02/22/the-art-of-pair-programming/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 07:59:56 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Environment]]></category>
		<category><![CDATA[eXtreme Programming]]></category>
		<category><![CDATA[pair programming]]></category>
		<category><![CDATA[test driven development]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=638</guid>
		<description><![CDATA[Pair programming (PP) is one of the eXtreme Programming (XP) practices. When doing pair programming, two programmers share a mouse and keyboard while they write code. One of the two, the driver, types, while the other, the navigator, reviews the code, and thinks ahead. The two persons switch roles often. This is another example of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=638&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://en.wikipedia.org/wiki/Pair_programming">Pair programming</a> (PP) is one of the <a href="http://en.wikipedia.org/wiki/Extreme_programming">eXtreme Programming</a> (XP) practices. When doing pair programming, two programmers share a mouse and keyboard while they write code. One of the two, the <em>driver</em>, types, while the other, the <em>navigator</em>, reviews the code, and thinks ahead. The two persons switch roles often. This is another example of XP &#8216;turning the knobs to 10&#8242;: if reviewing code is good, then we should do it all the time.</p>
<p>There is a good <a href="http://www.nomachetejuggling.com/2009/02/21/i-love-pair-programming/">post on PP</a> by Rod Hilton. He starts out with</p>
<blockquote><p>When I first heard I’d be pairing at the new job, I was a bit apprehensive and skeptical.</p></blockquote>
<p>I can relate to that. At a former company I worked for, I introduced XP. I had just read <a href="http://www.amazon.com/Extreme-Programming-Explained-Embrace-Change/dp/0321278658/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1235283668&amp;sr=8-1">XP Explained: Embrace Change</a> and thought it could improve our software development process. But pair programming was the one practice I was apprehensive about. The thought of someone watching over your shoulder all day made me feel uneasy. Yet the book made it clear that PP is a foundational practice, so I tried to keep an open mind.</p>
<p>I shouldn&#8217;t have worried. Rod explains that PP has nothing to do with &#8220;looking over a shoulder&#8221;:</p>
<blockquote><p>The way pair programming works in practice is quite a bit different than I imagined it. [...] When doing <a href="http://en.wikipedia.org/wiki/Test-driven_development">Test-Driven Development</a>, one of the things we do is called “ping-pong pairing”. So the other developer will write a test, then make it compile but fail. Then he passes the keyboard to me. I implement the feature just enough to make the test pass, then I write another failing test and pass it back.</p></blockquote>
<p>I didn&#8217;t know about ping-pong pairing when we started out doing XP. In fact, Rod&#8217;s post introduced it to me. It seems like a really good technique, and I&#8217;d love to try it out.</p>
<p>Also, the &#8220;all day&#8221; part is a misconception:</p>
<blockquote><p>In reality, you don’t sit down at a desk with another person and work all day with them. You pair up for tasks. [...] When the task is done and code is checked in, the pair breaks up. Generally tasks only have 2 hour estimates (sometimes less) so you’re only pairing for the two hours. Then you pair up with someone else to work on another task. [...] We take breaks often because getting away from the code for a few minutes helps keep a fresh perspective when you come back to the task.</p></blockquote>
<p>When I did XP, we paired up for about three hours at a time. We all came in on different times, so PP time generally started at about 9:30 AM, and lasted till lunch. Then we&#8217;d switch pairs. Since some of us started early, they also left early (<a href="http://www.xprogramming.com/xpmag/whatisxp.htm#sustainable">Sustainable Pace</a>), so there was another session of about three hours in the afternoon.</p>
<p>Pairing for about six hours a day is really enough. PP is pretty intense! There is no chance to let your mind wander off a bit, to look out of the window for more than a couple of seconds or to read e-mail. You have to stay focused all the time.</p>
<p><strong>Advantages</strong></p>
<p>So why bother at all with PP? Rod explains:</p>
<blockquote><p>I see pairing work so well every day that I consider my career prior to my current job to have consisted mostly of wasting time. [...] When you have a second person working with you, you find that you try harder to code well. You’re far, far less likely to be willing to apply duct tape to a problem, because someone else is working with you and he or she is more likely to object to the duct tape.</p></blockquote>
<p>We all know the feeling, I guess. You know that you&#8217;re taking a shortcut, that there is a better way. But that would take more effort. When you&#8217;re pairing, your partner &#8220;keeps you honest&#8221;. You don&#8217;t want to look like a slouch, so you don&#8217;t even consider the shortcut.</p>
<p>This makes a big difference. In fact, while I consider myself a pretty good programmer, I must admit that the code I wrote when pairing was of considerable higher quality than the code written solo. And that is true even when pairing with someone that I knew for sure was a lesser programmer than me!</p>
<p>The &#8220;keeping you honest&#8221; thingie is one reason for this. &#8220;Two brains think of more than one&#8221; is another. The interplay between the driver and navigator is a subtle one. When you, as a driver, see the navigator&#8217;s eyes go blank, you know you&#8217;re code is not as clear as it could be. And you fix it. You either stop to explain, at which point the navigator will likely suggest an improvement (like a better name for a class to better express its purpose), or you switch roles and let the navigator write better code.</p>
<p><strong>Disadvantages</strong></p>
<p>So why isn&#8217;t everybody pairing? What&#8217;s the catch?</p>
<p>Well, there are downsides. Rod mentions one:</p>
<blockquote><p>Hygiene can be a serious problem. If one person smells, it’s rough to sit with them. I find myself going back to my desk often and the code suffers for it. If you’re pairing, take a shower, and hold your farts for your next bathroom trip. Just do it, you filthy pig.</p></blockquote>
<p>I haven&#8217;t dealt with this problem much. One guy I paired with was a smoker, so whenever he came back from a smoke outside, I&#8217;d smell the smoke. I didn&#8217;t like it, but so what. We all have our faults. Pair programming is a partnership, and like in any partnership, you need to give and take a bit <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  PP takes some time to <a href="http://www.amazon.com/Pair-Programming-Illuminated-Laurie-Williams/dp/0201745763">get good at</a>, but the basics skills should have been <a href="http://collaboration.csc.ncsu.edu/laurie/Papers/Kindergarten.PDF">acquired at Kindergarten</a>.</p>
<p>Rod also mentions productivity:</p>
<blockquote><p>there’s no denying that you’re producing fewer lines of code per day since only half your team is coding at any one point. I don’t consider that a bad thing, though (if you have two solutions that equally solve a problem, the solution with fewer lines of code is the superior one) because the QUALITY of the code that IS produced is so, so, so much higher.</p></blockquote>
<p>This is an important point to stress. <strong>Pair programming seems wasteful, but it&#8217;s really not.</strong> The limiting factor when programming is not the speed with which you type, but the number of bugs you <strong>don&#8217;t</strong> introduce. There hasn&#8217;t been much scientific research into this, but there is one nice <a href="http://collaboration.csc.ncsu.edu/laurie/Papers/XPSardinia.PDF">experiment</a> by Alistair Cockburn and Laurie Williams that finds that PP takes 15% more time, but produces 15% less bugs, while yielding a significantly simpler design. My experiences confirm this.</p>
<p>The long term benefits of these advantages cannot be overestimated. Each bug takes away future coding time, since it needs to be fixed. And more complex designs slow you down as well, because it requires more time to understand the code you&#8217;re working on, and increases the chances of introducing bugs because of misunderstandings.</p>
<p>Of course, there will always be nay-sayers. Most of them haven&#8217;t actually tried PP, because &#8220;that could never work&#8221;. Well, if you don&#8217;t want to learn, then don&#8217;t, but don&#8217;t bother me. If you did give PP a try and failed to get good results, I must press you to <a href="http://agilefocus.com/2009/01/21-ways-to-hate-pair-programming/">check whether you did PP properly</a>. If you think you did and still didn&#8217;t like PP, then please leave a comment explaining why.</p>
Posted in Environment Tagged: eXtreme Programming, pair programming, test driven development <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/638/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/638/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/638/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/638/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/638/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/638/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/638/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/638/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/638/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/638/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=638&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/02/22/the-art-of-pair-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
		<item>
		<title>Create a better software development team</title>
		<link>http://sinnema313.wordpress.com/2009/02/17/create-a-better-software-development-team/</link>
		<comments>http://sinnema313.wordpress.com/2009/02/17/create-a-better-software-development-team/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 09:22:59 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Environment]]></category>
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=634</guid>
		<description><![CDATA[If you&#8217;re an agile team wanting to build better software, then check out abetterteam, &#8220;Because it takes an awesome team to build awesome software&#8220;.
Posted in Environment Tagged: agile      <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=634&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>If you&#8217;re an agile team wanting to build better software, then check out <a href="http://www.abetterteam.org/">a<strong>better</strong>team</a>, &#8220;<em>Because it takes an awesome team to build awesome software</em>&#8220;.</p>
Posted in Environment Tagged: agile <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/634/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=634&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/02/17/create-a-better-software-development-team/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
		<item>
		<title>&#8220;Refactoring is a law of nature&#8221;</title>
		<link>http://sinnema313.wordpress.com/2009/02/14/refactoring-is-a-law-of-nature/</link>
		<comments>http://sinnema313.wordpress.com/2009/02/14/refactoring-is-a-law-of-nature/#comments</comments>
		<pubDate>Sat, 14 Feb 2009 13:37:59 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=630</guid>
		<description><![CDATA[Ron Jeffries, one of the three founders of eXtreme Programming, and one of original signatories of the Agile Manifesto states:

We must evolve the infrastructure. It’s not a rule, it’s worse. It’s essentially a law of nature.

Please read his whole excellent post to understand why. And then, if you haven&#8217;t already, read Martin Fowler&#8217;s book  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=630&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Ron Jeffries, one of the three founders of <a href="http://www.xprogramming.com/">eXtreme Programming</a>, and one of original signatories of the <a href="http://agilemanifesto.org/">Agile Manifesto</a> states:</p>
<blockquote><p>
We must evolve the infrastructure. It’s not a rule, it’s worse. It’s essentially a law of nature.
</p></blockquote>
<p>Please read his <a href="http://xprogramming.com/blog/2009/02/06/why-is-refactoring-a-must/">whole excellent post</a> to understand why. And then, if you haven&#8217;t already, read <a href="http://martinfowler.com/">Martin Fowler</a>&#8217;s book  <a href="http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1234618538&amp;sr=8-1">Refactoring</a> and start applying it.</p>
Posted in Code, Design Tagged: refactoring <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/630/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/630/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/630/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/630/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/630/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/630/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/630/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/630/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/630/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/630/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=630&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/02/14/refactoring-is-a-law-of-nature/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
		<item>
		<title>Off Topic &#8211; After Forever Quits</title>
		<link>http://sinnema313.wordpress.com/2009/02/13/off-topic-after-forever-quits/</link>
		<comments>http://sinnema313.wordpress.com/2009/02/13/off-topic-after-forever-quits/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 11:00:09 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Off Topic]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=624</guid>
		<description><![CDATA[Only today I found out the sad, sad news that one of my favorite bands, After Forever, decided to quit.

Posted in Off Topic       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=624&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Only today I found out the sad, sad news that one of my favorite bands, <a href="http://afterforever.com/newsdetail.aspx?id=107">After Forever, decided to quit</a>.</p>
<p><img src="http://www.afterforever.com/UserFiles/Image/AfterForever100607_067small.jpg" alt="(" /></p>
Posted in Off Topic  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/624/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=624&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/02/13/off-topic-after-forever-quits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>

		<media:content url="http://www.afterforever.com/UserFiles/Image/AfterForever100607_067small.jpg" medium="image">
			<media:title type="html">(</media:title>
		</media:content>
	</item>
		<item>
		<title>Introducing XP Studio</title>
		<link>http://sinnema313.wordpress.com/2009/02/07/introducing-xp-studio/</link>
		<comments>http://sinnema313.wordpress.com/2009/02/07/introducing-xp-studio/#comments</comments>
		<pubDate>Sat, 07 Feb 2009 16:08:54 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Environment]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[xp studio]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=610</guid>
		<description><![CDATA[At my organization, we use a lot of the tricks from the Agile toolbox, like unit tests (although most of us are not doing TDD), refactoring, continuous integration, collective code ownership. We also write black box tests using Selenium and HtmlUnit, but since the developers think them up and implement them, not the customers, we [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=610&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>At my organization, we use a lot of the tricks from the Agile toolbox, like <a href="http://en.wikipedia.org/wiki/Unit_test">unit tests</a> (although most of us are not doing <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a>), <a href="http://en.wikipedia.org/wiki/Refactoring">refactoring</a>, <a href="http://en.wikipedia.org/wiki/Continuous_integration">continuous integration</a>, <a href="http://en.wikipedia.org/wiki/Extreme_Programming_Practices#Collective_code_ownership">collective code ownership</a>. We also write black box tests using <a href="http://seleniumhq.org/">Selenium</a> and <a href="http://htmlunit.sourceforge.net/">HtmlUnit</a>, but since the developers think them up and implement them, not the customers, we can&#8217;t really call them <a href="http://en.wikipedia.org/wiki/Acceptance_test">acceptance tests</a>.</p>
<p>If you look at this list, you probably notice that these are all technical practices. What has been lacking so far are the more management oriented ones. But my team has now embarked on a journey to incorporate some of those.</p>
<p>We&#8217;re using <a href="http://en.wikipedia.org/wiki/User_story">user stories</a> to define functionality, and deliver them in <a href="http://en.wikipedia.org/wiki/Iterative#Project_management">iterations</a>. Since we&#8217;re building a product, not doing a project, our product manager plays the <a href="http://www.xprogramming.com/xpmag/whatisxp.htm#whole">customer</a> role.</p>
<p>The <a href="http://en.wikipedia.org/wiki/Planning_game#Planning_game">planning game</a> wasn&#8217;t easy, since it was all so new for us. But the first iteration delivered all planned stories, the first ever deadline that the team made! Although it is far too early to declare victory, the start is promising indeed.</p>
<p>We do face some challenges, however. Our customer is in Kentucky, USA, while the development team is in <a href="http://www.rotterdam.info/uk/">The Netherlands</a>. Also, I work from home about half of the time. So we&#8217;re definitely not a co-located team. This means we have to invest more in communication. We use e-mail, <a href="http://www.amsn-project.net/index.php">instant messaging</a> and <a href="http://www.webex.com/">conference calls</a> to stay in touch.</p>
<p>The distributed nature of our team makes capturing user stories on <a href="http://en.wikipedia.org/wiki/Index_card">index cards</a> difficult. Since we&#8217;re pretty <a href="http://www.w3.org/XML/">XML</a> focused (our department is the R&amp;D department for XML in our company), we decided to capture the stories in XML instead and store them in our <a href="http://subversion.tigris.org/">source source repository</a>.</p>
<p>I know that many in the Agile community don&#8217;t like this formalization (<a href="http://agilemanifesto.org/">Individuals and interactions over processes and tools</a>), but it does have advantages. The biggest one in my book, after making distributed development possible, is that it opens up a whole lot of possibilities for automation. Remember <a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X">Ubiquitous Automation</a>?</p>
<p>This was the stimulus I needed to breathe some new life in one of those open source projects I participated in, but neglected lately: <a href="http://xpstudio.sourceforge.net/">XP Studio</a>. Check it out and let me know what you think.</p>
Posted in Environment Tagged: agile, xp studio <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/610/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/610/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/610/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/610/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/610/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/610/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/610/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/610/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/610/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/610/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=610&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/02/07/introducing-xp-studio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
		<item>
		<title>Planning poker</title>
		<link>http://sinnema313.wordpress.com/2009/01/13/planning-poker/</link>
		<comments>http://sinnema313.wordpress.com/2009/01/13/planning-poker/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 19:19:29 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Environment]]></category>
		<category><![CDATA[estimate]]></category>
		<category><![CDATA[planning poker]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=604</guid>
		<description><![CDATA[We had some fun today with planning poker. Wikipedia defines it as
&#8230; a consensus-based estimation technique for estimating, mostly used to estimate effort or relative size of tasks in software development. It is a variation of the Wideband Delphi method. It is most commonly used in agile software development, in particular the Extreme Programming methodology.
Our [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=604&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>We had some fun today with <strong>planning poker</strong>. <a href="http://en.wikipedia.org/wiki/Planning_poker">Wikipedia</a> defines it as</p>
<blockquote><p>&#8230; a consensus-based estimation technique for estimating, mostly used to estimate effort or relative size of tasks in software development. It is a variation of the <a href="http://en.wikipedia.org/wiki/Wideband_Delphi">Wideband Delphi</a> method. It is most commonly used in agile software development, in particular the Extreme Programming methodology.</p></blockquote>
<p>Our process was a little different than standard: we worked on defining the stories on our Wiki in the days leading up to the planning poker game, so that we didn&#8217;t have many discussions prior to estimating each feature. But we did have some very good discussions when we saw big deviations in people&#8217;s estimates.</p>
<p>Sometimes people assumed that stuff was included in the story that was actually in a different story, leading to much higher estimates. Sometimes people forgot about tasks, leading to lower estimates. But as a team, we think we have come up with some good estimates. We will see how they hold up in real life <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>To actually play the planning poker game, you&#8217;d normally need a deck of cards with values. However, being a distributed team today (I worked from home), we resorted to <a href="http://planningpoker.com">planningpoker.com</a>. It&#8217;s really simple to use and actually fun. Our discussions took place in IM, and although that&#8217;s not optimal, it was good enough. So all in all a good experience.</p>
<p><strong>Update:</strong> You can also use this site to reach consensus on a story&#8217;s risk. For that, agree on a mapping between the planning poker cards and the allowed values for risk. For instance, if you assign risk a value of low, medium, or high, you could pick 0=low, 5=medium, 100=high.</p>
Posted in Environment Tagged: estimate, planning poker <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/604/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/604/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/604/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/604/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/604/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/604/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/604/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/604/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/604/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/604/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=604&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/01/13/planning-poker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
		<item>
		<title>JavaFX plugin for Eclipse patched</title>
		<link>http://sinnema313.wordpress.com/2009/01/06/javafx-plugin-for-eclipse-patched/</link>
		<comments>http://sinnema313.wordpress.com/2009/01/06/javafx-plugin-for-eclipse-patched/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 21:43:46 +0000</pubDate>
		<dc:creator>sinnema313</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[javafx]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://sinnema313.wordpress.com/?p=572</guid>
		<description><![CDATA[A while ago I wrote about how the JavaFX Eclipse plugin has some shortcomings. Luckily, the plugin is released under an Open Source license (BSD). Therefore, the source is available, and anyone can fix problems and supply patches.
So I decided to do just that, and checked out the code from the Subversion repository. I followed [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=572&subd=sinnema313&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>A while ago I wrote about how the <a href="http://kenai.com/projects/eplugin/">JavaFX Eclipse plugin</a> has some <a href="http://sinnema313.wordpress.com/2008/12/11/javafx-plugin-for-eclipse/">shortcomings</a>. Luckily, the plugin is released under an <a href="http://www.opensource.org/docs/osd">Open Source</a> license (<a href="http://www.opensource.org/licenses/bsd-license.php">BSD</a>). Therefore, the source is <a href="http://kenai.com/projects/eplugin/sources/subversion/show">available</a>, and anyone can fix problems and <a href="http://kenai.com/bugzilla/buglist.cgi?product=eplugin">supply patches</a>.</p>
<p>So I decided to do just that, and checked out the code from the <a href="http://subversion.tigris.org/">Subversion</a> repository. I followed the <a href="http://kenai.com/projects/eplugin/pages/BuildFromSources">steps</a> described in the Wiki to get the project compiled.</p>
<p>The first thing I ran into, is that the <a href="http://kenai.com/bugzilla/show_bug.cgi?id=104">default target didn&#8217;t exist</a>. That was easy enough to fix.</p>
<p>Next, it bothered me that I needed to provide several properties on the command line. For instance I needed to specify <code>-DeclipseDir=/opt/eclipse</code> every time. So I <a href="http://kenai.com/bugzilla/show_bug.cgi?id=105">patched</a> the build to get this location from the environment variable <code>ECLIPSE_HOME</code> which I set in my <code>.profile</code>.</p>
<p>The same goes for the location of the JavaFX SDK. I <a href="http://kenai.com/bugzilla/show_bug.cgi?id=107">introduced</a> a <code>JAVAFX_HOME</code> environment variable to store that location. With these three modifications I could finally issue a build with just a simple <code>ant</code>.</p>
<p>With the build working it was time to tackle one of the problems I encountered during my usage of the plug-in. I figured it would be easy to fix the issue where <a href="http://kenai.com/bugzilla/show_bug.cgi?id=109">compilation errors use up three lines</a> in the <code>Problems</code> view, so that&#8217;s where I started. Based on information in the book <a href="http://www.amazon.com/Eclipse-Building-Commercial-Quality-Plug-ins-2nd/dp/032142672X/ref=sr_1_2?ie=UTF8&amp;s=books&amp;qid=1231275351&amp;sr=8-2">Eclipse, Building Commercial-Quality Plug-ins</a>, I knew I had to look for <a href="http://help.eclipse.org/stable/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/resources/IMarker.html"><code>IMarker</code></a>. There was only one such place in the code, so the problem was easily fixed. Progress at last!</p>
<p>I took a look at the other issues that were reported against the plug-in. There might be easier ones than the ones I experienced <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Indeed, someone noticed that the <a href="http://kenai.com/bugzilla/show_bug.cgi?id=98">JavaFX perspective missed an icon</a>. At first I couldn&#8217;t reproduce it, but that was because I was starting the plug-in from Eclipse. The official distribution did show the problem. Luckily, the bug reporter also found the cause: the icon used wasn&#8217;t part of the jar. A simple addition to <code>build.properties</code> fixed that.</p>
<p>Five patches already! I was feeling pretty good about myself <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Next, someone wanted help with <a href="http://kenai.com/bugzilla/show_bug.cgi?id=99"><code>import</code> statements</a>. That was a lot trickier, but probably also a lot more valuable. Having looked at the <code>IMarker</code> code before, I naturally wanted to add a <a href="http://help.eclipse.org/stable/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/wrkAdv_markerresolution.htm">marker resolution</a>.</p>
<p>This turned out to be a lot more work than I anticipated, but I managed to get something working. There were some glitches, and it probably needed a lot more testing for corner cases, but I could add a missing import statement based on the class name. Because I felt that this code wasn&#8217;t ready for prime time yet, I didn&#8217;t supply a patch, though.</p>
<p>This patching frenzy took place during the holidays. I got no response from Sun during that time, but I guess that was to be expected, given the time of year. So I decided to wait until some time into the new year to see what would happen.</p>
<p>Monday January 5 went by without news, but this morning I started to receive a stream of email notifications about issue tracker updates. Several of my patches were being accepted, and then I even received notification that I was given commit access! Such are the wonders of Open Source&#8230;</p>
Posted in Code Tagged: eclipse, javafx, open source, subversion <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sinnema313.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sinnema313.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sinnema313.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sinnema313.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sinnema313.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sinnema313.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sinnema313.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sinnema313.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sinnema313.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sinnema313.wordpress.com/572/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sinnema313.wordpress.com&blog=3802920&post=572&subd=sinnema313&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sinnema313.wordpress.com/2009/01/06/javafx-plugin-for-eclipse-patched/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7654bfdb2b650b7d68b569c06a6b390d?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">sinnema313</media:title>
		</media:content>
	</item>
	</channel>
</rss>