<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.2" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Test Early</title>
	<link>http://www.testearly.com</link>
	<description>Thought Leaders in helping development teams optimizing Agile software production</description>
	<pubDate>Wed, 06 May 2009 13:47:54 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.2</generator>
	<language>en</language>
			<item>
		<title>Jump into Groovy and Grails</title>
		<link>http://www.testearly.com/2009/03/23/jump-into-groovy-and-grails/</link>
		<comments>http://www.testearly.com/2009/03/23/jump-into-groovy-and-grails/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 13:04:17 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
		
	<category>Developer Testing</category>
	<category>News</category>
	<category>Training</category>
	<category>/Duvall</category>
		<guid isPermaLink="false">http://www.testearly.com/2009/03/23/jump-into-groovy-and-grails/</guid>
		<description><![CDATA[My friend Andy Glover will be leading a two-day training class in Reston, VA on April 2nd and 3rd, 2009. If you haven&#8217;t attended any of Andy&#8217;s training sessions, you&#8217;re missing out. Having worked with Andy for several years, I can tell you first hand that he&#8217;s got unique combination of depth and breadth in [...]]]></description>
			<content:encoded><![CDATA[<p>My friend <a href="http://www.linkedin.com/in/ajglover">Andy Glover</a> will be leading a <a href="http://thirstyhead.com/course/details/jump_groovy">two-day training class</a> in Reston, VA on April 2nd and 3rd, 2009. If you haven&#8217;t attended any of <a href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=32">Andy&#8217;s training sessions</a>, you&#8217;re missing out. Having worked with Andy for several years, I can tell you first hand that he&#8217;s got unique combination of depth and breadth in technical skills&#8230;while making the material he&#8217;s covering extremely interesting. The two-day course contains <strong>16 hands-on labs</strong>, so you&#8217;re not just walking out with a bunch of theory. Therefore, if you want to get up to speed with Groovy and Grails in a short amount of time, I highly recommend you <a href="http://thirstyhead.com/schedule/show/11">register for this course</a>. </p>
<p><img src="http://docs.rubyrake.org/articles/groovy/images/groovy-logo-big.png" alt="Groovy logo" width="220" align="right"/> </p>
<blockquote><p><a href="http://groovy.codehaus.org/">Groovy</a> is a dynamic language that runs on the Java platform. It makes programming easier and more powerful, while taking advantage of everything that&#8217;s been built up around Java. <a href="http://www.grails.org/">Grails</a> is a framework, built on Groovy, to help you quickly develop web-based applications. </p></blockquote>
                        <p><center>Test Early is sponsored by <a href="http://www.stelligent.com">Stelligent</a> | <a href="http://www.stelligent.com/index.php?option=com_content&task=view&id=8&Itemid=39">Stelligent is hiring experts like you!</a></center></p>                                ]]></content:encoded>
			<wfw:commentRSS>http://www.testearly.com/2009/03/23/jump-into-groovy-and-grails/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Screencast on using Hudson Continuous Integration</title>
		<link>http://www.testearly.com/2009/03/17/screencast-on-using-hudson-continuous-integration/</link>
		<comments>http://www.testearly.com/2009/03/17/screencast-on-using-hudson-continuous-integration/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 12:31:58 +0000</pubDate>
		<dc:creator>TestEarly</dc:creator>
		
	<category>Continuous Integration</category>
	<category>Publications</category>
	<category>Screencast</category>
	<category>/Duvall</category>
		<guid isPermaLink="false">http://www.testearly.com/2009/03/17/screencast-on-using-hudson-continuous-integration/</guid>
		<description><![CDATA[The Integrate Button website (from Paul Duvall&#8217;s book on Continuous Integration) recently published a screencast on using the Hudson Continuous Integration server - along with Subversion, Ant, HSQL and other tools. Click the image below to get started.
 
The screencast demonstrates the following steps:

Checkout source files from the Subversion repository - locally
Run the automated build [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://integratebutton.com/use-ci-server.html">Integrate Button</a> website (from <a href="http://www.testearly.com/category/duvall/">Paul Duvall&#8217;s</a> book on <a href="http://www.amazon.com/gp/product/0321336380/?tag=integratecom-20">Continuous Integration</a>) recently published a <a href="http://integratebutton.com/use-ci-server.html">screencast</a> on using the <a href="https://hudson.dev.java.net/">Hudson Continuous Integration server</a> - along with Subversion, Ant, HSQL and other tools. Click the image below to get started.</p>
<p><a href="http://integratebutton.com/use-ci-server.html" title="Screencast on Hudson Continuous Integration server"><img src="http://www.testearly.com/images/ci-book-cover.jpg" alt="Continuous Integration Hudson screencast" title="Continuous Integration Hudson screencast" width="220" height="275" align="center"/></a> </p>
<p>The screencast demonstrates the following steps:</p>
<ul>
<li>Checkout source files from the <a href="http://code.google.com/p/brewery-ci/">Subversion repository</a> - locally</li>
<li>Run the automated build locally</li>
<li>Commit files to Subversion</li>
<li>Download, install and configure Hudson - from Hudson website or from IntegrateButton scripts</li>
<li>Make a code change (with error) and checkin files</li>
<li>Get notified of error, automatically, via Hudson</li>
<li>Fix code errors, commit change and see results in Hudson</li>
</ul>
                        <p><center>Test Early is sponsored by <a href="http://www.stelligent.com">Stelligent</a> | <a href="http://www.stelligent.com/index.php?option=com_content&task=view&id=8&Itemid=39">Stelligent is hiring experts like you!</a></center></p>                                ]]></content:encoded>
			<wfw:commentRSS>http://www.testearly.com/2009/03/17/screencast-on-using-hudson-continuous-integration/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>5 easy questions for Paul Duvall</title>
		<link>http://www.testearly.com/2009/02/28/5-easy-questions-for-paul-duvall/</link>
		<comments>http://www.testearly.com/2009/02/28/5-easy-questions-for-paul-duvall/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 15:35:28 +0000</pubDate>
		<dc:creator>TestEarly</dc:creator>
		
	<category>News</category>
	<category>Interview</category>
	<category>/Duvall</category>
		<guid isPermaLink="false">http://www.testearly.com/2009/02/28/5-easy-questions-for-paul-duvall/</guid>
		<description><![CDATA[Jurgen Appelo  who writes a blog on Understanding Development &#038; Management asked Stelligent CEO Paul Duvall to answer 5 easy questions about his toughest challenge, software development and other interesting topics. His answers join a list of software luminaries such as Steve McConnell, Grady Booch, Mike Cohn, Ron Jeffries, Mary Poppendieck and Alistair Cockburn.
 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.noop.nl/about-the-author.html">Jurgen Appelo</a>  who writes a blog on <a href="http://www.noop.nl/">Understanding Development &#038; Management</a> asked Stelligent CEO <a href="http://www.testearly.com/category/duvall/">Paul Duvall</a> to answer <a href="http://www.noop.nl/2009/02/5-easy-questions-for-paul-duvall.html">5 easy questions</a> about his toughest challenge, software development and other interesting topics. His answers join a list of software luminaries such as Steve McConnell, Grady Booch, Mike Cohn, Ron Jeffries, Mary Poppendieck and Alistair Cockburn.</p>
                        <p><center>Test Early is sponsored by <a href="http://www.stelligent.com">Stelligent</a> | <a href="http://www.stelligent.com/index.php?option=com_content&task=view&id=8&Itemid=39">Stelligent is hiring experts like you!</a></center></p>                                ]]></content:encoded>
			<wfw:commentRSS>http://www.testearly.com/2009/02/28/5-easy-questions-for-paul-duvall/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>If it&#8217;s not in the System, it doesn&#8217;t exist</title>
		<link>http://www.testearly.com/2009/02/11/if-its-not-in-the-system-it-doesnt-exist/</link>
		<comments>http://www.testearly.com/2009/02/11/if-its-not-in-the-system-it-doesnt-exist/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 00:10:04 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
		
	<category>Developer Testing</category>
	<category>Continuous Integration</category>
	<category>Business Perspectives</category>
	<category>/Duvall</category>
		<guid isPermaLink="false">http://www.testearly.com/2009/02/11/if-its-not-in-the-system-it-doesnt-exist/</guid>
		<description><![CDATA[I like repeatable processes. To me, it&#8217;s a waste of time to do the same thing more than once. I&#8217;m also reminded of this when I start repeating answers to the same questions. When considering knowledge companies, virtually everything valuable to us are our people and  information, not physical assets. As I said in [...]]]></description>
			<content:encoded><![CDATA[<p>I like repeatable processes. To me, it&#8217;s a waste of time to do the same thing more than once. I&#8217;m also reminded of this when I start repeating answers to the same questions. When considering knowledge companies, virtually everything valuable to us are our <em>people</em> and  <em>information</em>, not physical assets. As I said in <a href="http://www.testearly.com/2007/08/17/fire-your-best-peoplereward-the-lazy-ones/">&#8220;Fire your Best People&#8230;&#8221;</a>, if information is locked inside someone&#8217;s head, they are a <em>less</em> valuable resource. It&#8217;s all about <strong>sharing</strong>: files, knowledge, pertinent information from emails and so on. If the asset only exists on one person&#8217;s machine, or worse: their head, and is relevant to others, your company has a problem. </p>
<p><img src="http://www.testearly.com/images/library-istock.jpg" alt="My Library of Information" width="320" align="right"/></p>
<p>When considering software, if <em>all</em> of the assets necessary to create <a href="http://www.testearly.com/2008/02/04/continuous-production-production-ready-softwareany-time/"><em>working</em> software</a> haven&#8217;t been committed to the version-control repository, the software doesn&#8217;t exist. Sounds simple doesn&#8217;t it? Then, why do so many projects and companies fail to follow this simple rule? If I was cynical, I might think it&#8217;s because some think that by harboring this information, they can essentially hold the organization &#8220;hostage&#8221; - and increasing job security. In my experience, this is no longer the primary reason in the organizations I&#8217;ve seen (although there are always a few exceptions). I think the main problem is <strong>leadership</strong>. It takes discipline for each person in an organization to ask themselves after they&#8217;ve sent instructions on how to do something in an email&#8230;</p>
<blockquote><p>Is this something I want to keep permanent for all current and future employees?</p></blockquote>
<p>Other examples include: </p>
<ul>
<li>Realizing that a configuration file used to deploy the software should be checked into the version-control system so that the software can be built in any target environment, not just on their machine.</li>
<li>The workaround for that strange bug in your Content Management System should be posted to the Wiki</li>
<li>That pointing to a file in a version-control repository may be preferred over sending email attachments with every change .</li>
<li>The email that documented the steps that Human Resources performs when a new employee starts with the company, should be published to the company&#8217;s Intranet .</li>
</ul>
<p>Here are some possible tools where you might capture these assets: </p>
<ul>
<li>Version-control repository</li>
<li>Corporate Intranet</li>
<li>Hosted Wiki</li>
<li>Electronic Corporate bulletin board</li>
<li>Company blog</li>
</ul>
<p>Leaders in knowledge organizations understand their most vital assets are their people and the information produced by these people. When people leave, you need to have a way to continue to leverage this knowledge. Leaders understand that this philosophy of sharing information must be institutionalized. Just remember&#8230;</p>
<blockquote><p>
<strong>If it&#8217;s not in the System, it doesn&#8217;t exist </strong></p></blockquote>
                        <p><center>Test Early is sponsored by <a href="http://www.stelligent.com">Stelligent</a> | <a href="http://www.stelligent.com/index.php?option=com_content&task=view&id=8&Itemid=39">Stelligent is hiring experts like you!</a></center></p>                                ]]></content:encoded>
			<wfw:commentRSS>http://www.testearly.com/2009/02/11/if-its-not-in-the-system-it-doesnt-exist/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Hands-free database migration</title>
		<link>http://www.testearly.com/2008/11/11/hands-free-database-migration/</link>
		<comments>http://www.testearly.com/2008/11/11/hands-free-database-migration/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 21:41:12 +0000</pubDate>
		<dc:creator>TestEarly</dc:creator>
		
	<category>Build Management</category>
	<category>Continuous Integration</category>
	<category>Publications</category>
	<category>/Duvall</category>
		<guid isPermaLink="false">http://www.testearly.com/2008/11/11/hands-free-database-migration/</guid>
		<description><![CDATA[It can be a significant burden to manually apply upgrades to an existing database. Moreover, it&#8217;s often an error-laden activity.  IBM developerWorks&#8217; recently published an article on this topic for Paul Duvall&#8217;s (Stelligent CTO) popular Automation for the people series called Hands-free database migration.
Databases are often out of sync with the applications they support, [...]]]></description>
			<content:encoded><![CDATA[<p>It can be a significant burden to manually apply upgrades to an existing database. Moreover, it&#8217;s often an error-laden activity.  IBM developerWorks&#8217; recently published an article on this topic for <a href="http://www.testearly.com/category/duvall/">Paul Duvall&#8217;s</a> (Stelligent CTO) popular <em>Automation for the people</em> series called <a href="http://www.ibm.com/developerworks/opensource/library/j-ap08058/index.html">Hands-free database migration</a>.</p>
<blockquote><p>Databases are often out of sync with the applications they support, and getting the database and data into a known state is a significant challenge to manage. Learn how the open source LiquiBase database-migration tool can reduce the pain of managing the constant of change with databases and applications.</p></blockquote>
                        <p><center>Test Early is sponsored by <a href="http://www.stelligent.com">Stelligent</a> | <a href="http://www.stelligent.com/index.php?option=com_content&task=view&id=8&Itemid=39">Stelligent is hiring experts like you!</a></center></p>                                ]]></content:encoded>
			<wfw:commentRSS>http://www.testearly.com/2008/11/11/hands-free-database-migration/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Is easyb Easy?</title>
		<link>http://www.testearly.com/2008/09/24/is-easyb-easy/</link>
		<comments>http://www.testearly.com/2008/09/24/is-easyb-easy/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 12:14:27 +0000</pubDate>
		<dc:creator>webmaster</dc:creator>
		
	<category>Developer Testing</category>
	<category>/Duvall</category>
		<guid isPermaLink="false">http://www.testearly.com/2008/09/24/is-easyb-easy/</guid>
		<description><![CDATA[Last week, JavaLobby published an article about easyb called “Is easyb Easy?”.  
Yes, that&#8217;s exactly what you will find out by reading this article. easyb is a BDD framework for the Java platform written by Andrew Glover. This article goes in detail about how to write a
1. Scenarios within Stories
2. Run these Stories from [...]]]></description>
			<content:encoded><![CDATA[<p><img  style="PADDING-LEFT: 1.0em; PADDING-RIGHT: 1.5em; PADDING-TOP: 1.5em; FLOAT: RIGHT; PADDING-BOTTOM: 1.5em" id="image370" width="250" height="170" src="http://www.testearly.com/wp-content/uploads/2008/09/easyb.jpg" alt="easyb-image" />Last week, <a href="http://java.dzone.com/articles/is-easyb-easy">JavaLobby</a> published an article about easyb called <a href="http://java.dzone.com/articles/is-easyb-easy">“Is easyb Easy?”</a>.  </p>
<p>Yes, that&#8217;s exactly what you will find out by reading this article. <a href="http://www.easyb.org/">easyb</a> is a BDD framework for the Java platform written by <strong>Andrew Glover</strong>. This article goes in detail about how to write a</p>
<p>1. Scenarios within Stories<br />
2. Run these Stories from Ant<br />
3. Generate a report.</p>
<p>Check out the article to find out what the verdict was. Also, give it a try and let us know your verdict as well. </p>
                        <p><center>Test Early is sponsored by <a href="http://www.stelligent.com">Stelligent</a> | <a href="http://www.stelligent.com/index.php?option=com_content&task=view&id=8&Itemid=39">Stelligent is hiring experts like you!</a></center></p>                                ]]></content:encoded>
			<wfw:commentRSS>http://www.testearly.com/2008/09/24/is-easyb-easy/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>But I don&#8217;t like to learn new things</title>
		<link>http://www.testearly.com/2008/09/23/but-i-dont-like-to-learn-new-things/</link>
		<comments>http://www.testearly.com/2008/09/23/but-i-dont-like-to-learn-new-things/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 19:39:39 +0000</pubDate>
		<dc:creator>JohnB</dc:creator>
		
	<category>Developer Testing</category>
		<guid isPermaLink="false">http://www.testearly.com/2008/09/23/but-i-dont-like-to-learn-new-things/</guid>
		<description><![CDATA[http://wondermark.com/d/445.html

                        Test Early is sponsored by Stelligent &#124; Stelligent is hiring experts like you!                   [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wondermark.com/d/445.html">http://wondermark.com/d/445.html<br />
</a></p>
                        <p><center>Test Early is sponsored by <a href="http://www.stelligent.com">Stelligent</a> | <a href="http://www.stelligent.com/index.php?option=com_content&task=view&id=8&Itemid=39">Stelligent is hiring experts like you!</a></center></p>                                ]]></content:encoded>
			<wfw:commentRSS>http://www.testearly.com/2008/09/23/but-i-dont-like-to-learn-new-things/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Ant or Gant?</title>
		<link>http://www.testearly.com/2008/09/23/ant-or-gant/</link>
		<comments>http://www.testearly.com/2008/09/23/ant-or-gant/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 12:02:16 +0000</pubDate>
		<dc:creator>webmaster</dc:creator>
		
	<category>Developer Testing</category>
	<category>Build Management</category>
	<category>Tutorial</category>
	<category>Agile</category>
	<category>/Duvall</category>
		<guid isPermaLink="false">http://www.testearly.com/2008/09/23/ant-or-gant/</guid>
		<description><![CDATA[Yes, this is exactly what I am frequently asked by my clients and many developers. It isn&#8217;t easy to answer this question. There are several  projects using Ant. Should you run away from Ant just because there is a new cool tool out there called Gant? Should you switch to Gant just because you [...]]]></description>
			<content:encoded><![CDATA[<p><img style="PADDING-LEFT: 1.0em; PADDING-RIGHT: 1.5em; PADDING-TOP: 1.5em; FLOAT: RIGHT; PADDING-BOTTOM: 1.5em" id="image368" src="http://www.testearly.com/wp-content/uploads/2008/09/gant.jpg" alt="gant-image" />Yes, this is exactly what I am frequently asked by my clients and many developers. It isn&#8217;t easy to answer this question. There are several  projects using Ant. Should you run away from Ant just because there is a new cool tool out there called Gant? Should you switch to Gant just because you dislike XML? Not at all. Let&#8217;s take a closer look and see what might make you switch to Gant.</p>
<p><strong>When to choose Gant?</strong></p>
<p><strong>1. Complicated Build Files.</strong> If your ant build files are becoming too complicated, and hard to manage, it&#8217;s time to see if using Gant can help. Let me explain what I mean by complicated build files. If you have too much of conditional logic within your build files, say something similar on the lines shown below in Listing 1:</p>
<p><strong>Code Listing 1:</strong></p>
<pre>

    &lt;if&gt;
      &lt;isset property=&quot;sqlserver&quot;/&gt;
      &lt;then&gt;
        &lt;do something here/&gt;
      &lt;/then&gt;
    &lt;/if&gt;
    &lt;if&gt;
      &lt;isset property=&quot;oracle&quot;/&gt;
      &lt;then&gt;
        &lt;do something else here/&gt;
      &lt;/then&gt;
    &lt;/if&gt;
    &lt;if&gt;
      &lt;isset property=&quot;derby&quot;/&gt;
      &lt;then&gt;
       &lt;do something for derby here/&gt;
      &lt;/then&gt;
    &lt;/if&gt;
    &lt;if&gt;
      &lt;isset property=&quot;db2&quot;/&gt;
      &lt;then&gt;
        &lt;do something for db2 here/&gt;
      &lt;/then&gt;
    &lt;/if&gt;
</pre>
<p>Or even something like this where you might be supporting deployment to different application servers based on some property in your build.properties or by the user as shown in listing 2.</p>
<p><strong>Code Listing 2:</strong></p>
<pre>
    &lt;if&gt;
      &lt;isset property=&quot;server.jboss4&quot;/&gt;
      &lt;then&gt;
        &lt;deploy to JBoss 4/&gt;
      &lt;/then&gt;
      &lt;elseif&gt;
        &lt;isset property=&quot;server.weblogic10&quot;/&gt;
        &lt;then&gt;
	&lt;deploy to web logic/&gt;
        &lt;/then&gt;
      &lt;/elseif&gt;
      &lt;elseif&gt;
        &lt;isset property=&quot;server.glassfish&quot;/&gt;
        &lt;then&gt;
          &lt;deploy to GlassFish/&gt;
        &lt;/then&gt;
      &lt;/elseif&gt;
      &lt;elseif&gt;
        &lt;isset property=&quot;server.someother version&quot;/&gt;
        &lt;then&gt;
          &lt;deploy to this some other version/&gt;
        &lt;/then&gt;
      &lt;/elseif&gt;
    &lt;/if&gt;
</pre>
<p>Things get out of hand  when you have conditional logic as shown above in your build scripts. The listings I have are just the skeleton, imagine what happens when we start adding the actual deployment logic for all these application servers. It doesn&#8217;t matter how you refactor this, it is still going to be very complicated. Trust me, I have written build scripts which were several thousand lines, and refactoring them was not a trivial task.</p>
<p><strong>2. Custom Ant Tasks. </strong>I myself am guilty of writing many of these. There are many situations which arise in projects where we create custom ant tasks. It is simple once you know how to write one, and than for every complicated task you need to perform, you involuntarily will start writing custom ant tasks. </p>
<p>Anyone writing a custom ant task will:<br />
a. Create a new class that extends Ant’s org.apache.tools.ant.Task class.<br />
b. For each attribute, write a setter method.<br />
c. Write an execute()method that does what you want this task to do.</p>
<p>There isn&#8217;t anything wrong in doing the above, but imagine each time you want to make a small change you will have to make changes within your Java source code, compile, test, re-package.</p>
<p><strong>3. Scripting. </strong>You can extend Ant further by not writing custom ant tasks, but by using small snippets of code written in an interpreted language like <strong>JRuby</strong>, <strong>BeanShell</strong>, or <strong>Groovy</strong>. These code snippets can be placed within your build files or in separate text files. If you are using Groovy&#8217;s Ant task, your build file might look something like this: </p>
<pre>
 &lt;groovy classpathref=&quot;build.classpath&quot;&gt;
  import some.package
  import another.package
  def fullpath = &quot;${.basedir}/${defaulttargetdir}&quot;
   def somefile = new SomeFile(projectName:&quot;${pname}&quot;,
     buildLabel:&quot;${label}&quot;, buildTime:&quot;${new Date()}&quot;)
   def xml = &quot;${fullpath}/dashboard.xml&quot;
   new File(path).write(somefile.generateReport())
   ant.xslt(in:path,
    out:&quot;${properties.defaulttargetdir}/some.html&quot;,
    style:&quot;${properties.defaulttargetdir}/lib/report-style.xsl&quot;)
 &lt;/groovy&gt;
</pre>
<p>Imagine having several lines of XML in your build files which have many of these small snippets of scripts. I myself don&#8217;t like mixing and matching build files with code snippets. If you have a team where everyone is in the same page, everything works fine. What if a team member has no clue about any of the Scripting languages? He/She will have no clue how to make minor changes when things go badly. If you have all the above or even one of the above three cases, you seriously need to consider using Gant. To quote Aristotle:</p>
<blockquote><p>
For the things we have to learn before we can do them, we learn by doing them.
</p></blockquote>
<p>So, lets see how easy it is to learn Gant and see how things can improve.</p>
<p>This part covers some very basics of Gant. The next part, will dive deeper into Gant by using it with a sample project to build our application, and we will also see how to use it with our CI Server.</p>
<p><strong>What&#8217;s Gant?</strong></p>
<p>Gant is a build tool that uses both Groovy and Ant. With Gant, you describe your build process using Groovy scripts. Stated simply, Gant allows you to specify the build logic using Groovy instead of XML. The next thing you may ask is &#8221; Is Gant a competitor to Ant?&#8221;. Let me quote from the Gant web site to make things more clear here :</p>
<blockquote><p>
Whilst it might be seen as a competitor to Ant, Gant uses Ant tasks for many of the actions, so Gant is really an alternative way of doing builds using Ant, but using a programming language rather than XML to specify the build rules.
</p></blockquote>
<p><strong>Download and Install Gant.<br />
</strong><br />
In order for Gant to work, you should have <a href="http://groovy.codehaus.org/Download">Groovy</a> installed. You can download and follow the installation instructions for Groovy <a href="http://groovy.codehaus.org/Download">here</a>.<br />
As I said earlier also, in order to use Gant, you should have knowledge of Groovy as well. If you have never written Groovy code before, there are many interesting books on Groovy like:</p>
<p>a. <a href="http://www.manning.com/koenig/">Groovy in Action</a></p>
<p>b. <a href="http://www.pragprog.com/titles/sdgrvr/groovy-recipes">Groovy Recipes</a></p>
<p>c. <a href="http://refcardz.dzone.com/refcardz/groovy">Groovy Refcardz</a></p>
<p>You can also read the getting started guide on the <a href="http://groovy.codehaus.org/Getting+Started+Guide">Groovy web site</a>, which should give you a good starting point.</p>
<p>Download the latest version of Gant from <a href="http://gant.codehaus.org/">here</a>.  Gant is currently at version <strong>1.4.0</strong>. Unzip it to a folder. If you already have your <strong>GROOVY_HOME</strong> set, that&#8217;s all you need to use Gant.</p>
<p><strong>Getting Started.</strong> </p>
<p>Open a console, and type <strong>gant</strong>. You should see a message as shown below:</p>
<blockquote><p>
meera-subbaraos-macbook-9:~ meerasubbarao$ gant<br />
Cannot open file build.gant<br />
meera-subbaraos-macbook-9:~ meerasubbarao$
</p></blockquote>
<p>You are all set at this point to use Gant in your projects.</p>
<p><strong>Help Information:</strong> Open a console, and type gant -h. This will provide you with all the necessary help information you need as shown below:</p>
<blockquote><p>
meera-subbaraos-macbook-9:CodeMetricsProject meerasubbarao$ gant -h<br />
usage: gant [option]* [target]*<br />
 -c,&#8211;usecache                Whether to cache the generated class and</p>
<p>                              perform modified checks on the file before re-compilation.<br />
 -n,&#8211;dry-run                 Do not actually action any tasks.<br />
 -C,&#8211;cachedir <cache-file>   The directory where to cache generated<br />
                              classes to.<br />
 -D <name>=<value>            Define <name> to have value <value>.<br />
                              Creates a variable named <name> for use in the scripts and a property<br />
                              named <name> for the Ant tasks.<br />
 -L,&#8211;lib<br />
<path>              Add a directory to search for jars and<br />
                              classes.<br />
 -P,&#8211;classpath<br />
<path>        Specify a path to search for jars and<br />
                              classes.<br />
 -T,&#8211;targets                 Print out a list of the possible targets.<br />
 -V,&#8211;version                 Print the version number and exit.<br />
 -d,&#8211;debug                   Print debug levels of information.<br />
 -f,&#8211;file <build-file>       Use the named build file instead of the<br />
                              default, build.gant.<br />
 -h,&#8211;help                    Print out this message.<br />
 -l,&#8211;gantlib<br />
<library>       A directory that contains classes to be used<br />
                              as extra Gant modules,<br />
 -p,&#8211;projecthelp             Print out a list of the possible targets.<br />
 -q,&#8211;quiet                   Do not print out much when executing.<br />
 -s,&#8211;silent                  Print out nothing when executing.<br />
 -v,&#8211;verbose                 Print lots of extra information.
</p></blockquote>
<p>Create a new file called build.gant at the root of your project. <img id="image367" src="http://www.testearly.com/wp-content/uploads/2008/09/gant-project.jpg" alt="gant-project" /></p>
<p>Did a similarity between Ant and Gant strike you here? Ant build files are usually called build.xml, and they are created as a common practice within the root of your project folder as well. </p>
<p>If you have written or even modified Ant build files, you will know that it contains one <strong>project element</strong>, which in turn contains a <strong>name</strong>,the <strong>default target</strong> and the <strong>base directory</strong>.  </p>
<p><strong>Code Listing 4:</strong></p>
<pre>
&lt;project name=&quot;GantSamples&quot; basedir=&quot;.&quot; default=&quot;compile&quot;&gt;
</pre>
<p>So for example, <strong>sayHello</strong> target in Ant would look something like this:</p>
<pre>
&lt;target name=&quot;sayHello&quot; description=&quot;Saying Hello&quot;&gt;
	&lt;echo message=&quot;Hello from Stelligent&quot;/&gt;
&lt;/target&gt;
</pre>
<p>Lets create the sayHello target, and also see how to set it as the default target in Gant as well.</p>
<p>A Gant target has a name and a description:</p>
<p><strong>Code Listing 5:</strong><br />
<code>target ( target-name : target-description ) {<br />
groovy code sequence<br />
}</code></p>
<p>The above sayHello target in Gant would translate as shown below:<br />
<code>target(sayHello:"Saying hello"){<br />
 Ant.echo(message:"Hello from Stelligent")<br />
}</code><br />
Now, open a command window and type <strong>gant</strong> at the root of the project where the <strong>build.gant</strong> file exists. You should be able to see a output like:</p>
<blockquote><p>
meera-subbaraos-macbook-9:CodeMetricsProject meerasubbarao$ gant<br />
Target default does not exist.
</p></blockquote>
<p>Gant is complaining that we haven&#8217;t set a Default target. Lets see how to do the same:</p>
<p><strong>Default target: </strong>Within Ant, you define the default target from within the project element as seen in Listing 4. The default target is the target called if no target is specified from the command line. There however is no project tag within Gant. There are two ways of specifying the default target as shown below</p>
<p>1. You simply create a target whose name is default.<br />
<code>target ( 'default' , 'The default target.' ) { aTarget ( ) </code><br />
2. or even simply:<br />
<code>setDefaultTarget ( aTarget ) </code></p>
<p>In order to get our sayHello target working, we need to add one of the above scirpts to our build.gant file.</p>
<p><strong>Code Listing 6:</strong><br />
<code>    setDefaultTarget(sayHello)<br />
     or<br />
    target ("default": "The default target." ) {<br />
    sayHello ( )<br />
    }  </code></p>
<p>Complete listing of build.gant:<br />
<code>target(sayHello:"Saying hello"){<br />
 Ant.echo(message:"Hello from Stelligent")<br />
}<br />
/*<br />
target ("default": "The default target." ) {<br />
sayHello ( )<br />
}<br />
*/<br />
setDefaultTarget(sayHello)</code></p>
<p>And you should be able to see: </p>
<blockquote><p>
meera-subbaraos-macbook-9:CodeMetricsProject meerasubbarao$ gant<br />
     [echo] Hello from Stelligent<br />
meera-subbaraos-macbook-9:CodeMetricsProject meerasubbarao$
</p></blockquote>
<p>That was easy! If you have build files and it is becoming unmanageable by your team, there is a tool out there which can convert your Ant scripts to Gant scripts as well. I haven&#8217;t used it, but you can try it <a href="http://gant.codehaus.org/ant2gant+script">here</a>.</p>
<p>In this part of the series, we learned when to move over from Ant to Gant, downloaded and installed Gant, and finally wrote a simple gant build file. In the next part of this series, we will see Gant in Action within a simple Java project.</p>
<p>And as always, keep us posted here if you are encountering any problems getting started with Gant. Stay tuned. </p>
                        <p><center>Test Early is sponsored by <a href="http://www.stelligent.com">Stelligent</a> | <a href="http://www.stelligent.com/index.php?option=com_content&task=view&id=8&Itemid=39">Stelligent is hiring experts like you!</a></center></p>                                ]]></content:encoded>
			<wfw:commentRSS>http://www.testearly.com/2008/09/23/ant-or-gant/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Roy Osherove on TDD</title>
		<link>http://www.testearly.com/2008/09/22/roy-osherove-on-tdd/</link>
		<comments>http://www.testearly.com/2008/09/22/roy-osherove-on-tdd/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 16:48:48 +0000</pubDate>
		<dc:creator>webmaster</dc:creator>
		
	<category>Developer Testing</category>
	<category>/Duvall</category>
		<guid isPermaLink="false">http://www.testearly.com/2008/09/22/roy-osherove-on-tdd/</guid>
		<description><![CDATA[Roy has some provocative thoughts on TDD and getting developers to write unit tests.  I don&#8217;t agree with all of them, but it&#8217;s worth a read.
Some of his interesting points:

99% of the developers out there aren’t ready for the “testability” message
Don&#8217;t call them &#8216;mocks&#8217; or &#8217;stubs&#8217; - say things like &#8216;we need to isolate this [...]]]></description>
			<content:encoded><![CDATA[<p>Roy has some provocative thoughts on TDD and <a target="_blank" href="http://feeds.feedburner.com/~r/Iserializable/~3/398093130/goodbye-mocks-farewell-stubs.aspx">getting developers to write unit tests</a>.  I don&#8217;t agree with all of them, but it&#8217;s worth a read.<br />
Some of his interesting points:</p>
<ul>
<li>99% of the developers out there aren’t ready for the “testability” message</li>
<li>Don&#8217;t call them &#8216;mocks&#8217; or &#8217;stubs&#8217; - say things like &#8216;we need to isolate this class&#8217;</li>
<li>Unit Testing has a very high learning curve, and all the tools are making that learning curve higher</li>
<li>Try to avoid record/replay style testing</li>
<li>Don&#8217;t advocate &#8216;one true way&#8217; to do unit testing.  Accept other approaches that are different from your preferred approach.</li>
</ul>
<p>I suggest you read the whole thing.
</p>
                        <p><center>Test Early is sponsored by <a href="http://www.stelligent.com">Stelligent</a> | <a href="http://www.stelligent.com/index.php?option=com_content&task=view&id=8&Itemid=39">Stelligent is hiring experts like you!</a></center></p>                                ]]></content:encoded>
			<wfw:commentRSS>http://www.testearly.com/2008/09/22/roy-osherove-on-tdd/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Javadoc or Doxygen?</title>
		<link>http://www.testearly.com/2008/09/10/javadoc-or-doxygen/</link>
		<comments>http://www.testearly.com/2008/09/10/javadoc-or-doxygen/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 14:43:17 +0000</pubDate>
		<dc:creator>webmaster</dc:creator>
		
	<category>Developer Testing</category>
	<category>Continuous Integration</category>
	<category>Tutorial</category>
	<category>Agile</category>
	<category>/Duvall</category>
		<guid isPermaLink="false">http://www.testearly.com/2008/09/10/javadoc-or-doxygen/</guid>
		<description><![CDATA[In the last two articles, &#8220;UML Diagrams within Javadocs&#8221; and &#8220;Visual Documentation of Ant Dependencies in 3 Simple Steps&#8221;  we saw how easy and valuable it was to automate technical documentation. By using open source tools, we were easily able to provide good technical documentation within a few minutes, and at no cost at [...]]]></description>
			<content:encoded><![CDATA[<p>In the last two articles, &#8220;<a href="http://www.testearly.com/2008/08/21/uml-diagrams-within-javadocs/">UML Diagrams within Javadocs</a>&#8221; and &#8220;<a href="http://www.testearly.com/2008/07/25/visual-documentation-of-ant-dependencies-in-3-simple-steps/">Visual Documentation of Ant Dependencies in 3 Simple Steps</a>&#8221;  we saw how easy and valuable it was to automate technical documentation. By using open source tools, we were easily able to provide good technical documentation within a few minutes, and at no cost at all. We were also able to keep this up-to date by adding additional tasks to our Ant build files, and run them from our CI Server(Hudson in our case) on commit and nightly builds, and also publish the results.</p>
<p>In this article, I will be showing you how to use yet another tool called <a href="http://www.stack.nl/~dimitri/doxygen/index.html">Dxoygen</a> for generating technical documentation based on your source code. We all have used Javadoc and have been using it for a long time, right? So, you may ask what&#8217;s the need to have another tool which produces the same HTML documentation? <a href="http://www.stack.nl/~dimitri/doxygen/index.html">Doxygen</a> has a slight edge over Javadoc and here are a few reasons why you should consider using the same:</p>
<p>1. With Javadoc you have to remember all the HTML tags, you need to embed within your code comments. However, with Doxygen code comments are much more concise and polished, without the need for any HTML.</p>
<p>2. Doxygen can also generate a variety of diagrams, we will take a look at some of them later.</p>
<p>3. Doxygen also provides a structured view on the source code. As I mentioned in 2 above in the form of various diagrams, cross-referenced and syntax highlighted code.</p>
<p>4. You get all the above benefits even if the code does not have any comments at all. </p>
<p>5. Last but not the least, Doxygen is a documentation system not for just Java but also for various other languages like  C++, C, Java, Objective-C, Python, IDL (Corba and Microsoft flavors), Fortran, VHDL, PHP, C#.</p>
<p>So, without wasting further time, lets see what we need to get started with Doxygen.</p>
<p><strong>Step 1. Download, Install <a href="http://www.stack.nl/~dimitri/doxygen/index.html">Doxygen</a></strong></p>
<p>Download the binary distribution for Doxygen for the operating system you are using. I downloaded the binary distribution for Mac OS X called Doxygen-1.5.6.dmg. Installation is very simple, just drag the doxygen icon from this folder to the Applications folder, or wherever you want to keep it; as shown below. I dropped it within my Applications folder. Just be sure to remember where you dragged it. To uninstall, just delete the file. It is completely self-contained.<br />
<img id="image357" src="http://www.testearly.com/wp-content/uploads/2008/09/disk-image.thumbnail.jpg" alt="doxygen-setup" /></p>
<p><strong>Step 2: Configure Doxygen. </strong><br />
To generate documentation using Doxygen, you will need a configuration file called the Doxyfile. You can generate this file in two ways; either by using the Doxygen wizard or by using the command line option. Lets see how to use both these options to generate the configuration file:</p>
<p>a. Command line.<br />
Open a command window and type the following as shown below:<br />
<img id="image358" src="http://www.testearly.com/wp-content/uploads/2008/09/doxygen-console.jpg" alt="doxygen-console" /></p>
<p>You should be able to locate the configuration file created within your default user folder. The file looks like this:</p>
<blockquote><p>
# Doxyfile 1.5.6</p>
<p># This file describes the settings to be used by the documentation system<br />
# doxygen (www.doxygen.org) for a project<br />
#<br />
# All text after a hash (#) is considered a comment and will be ignored<br />
# The format is:<br />
#       TAG = value [value, &#8230;]<br />
# For lists items can also be appended using:<br />
#       TAG += value [value, &#8230;]<br />
# Values that contain spaces should be placed between quotes (&#8221; &#8220;)</p>
<p>#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
# Project related configuration options<br />
#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p># This tag specifies the encoding used for all characters in the config file<br />
# that follow. The default is UTF-8 which is also the encoding used for all<br />
# text before the first occurrence of this tag. Doxygen uses libiconv (or the<br />
# iconv built into libc) for the transcoding. See<br />
# http://www.gnu.org/software/libiconv for the list of possible encodings.</p>
<p>DOXYFILE_ENCODING      = UTF-8</p>
<p># The PROJECT_NAME tag is a single word (or a sequence of words surrounded<br />
# by quotes) that should identify the project.</p>
<p>PROJECT_NAME           = </p>
<p># The PROJECT_NUMBER tag can be used to enter a project or revision number.<br />
# This could be handy for archiving the generated documentation or<br />
# if some version control system is used.</p>
<p>PROJECT_NUMBER         =
</p></blockquote>
<p><strong>b. Wizard Option.</strong><br />
 Launch the  Doxygen application, and you should be able to create the configuration file using the wizard approach as shown below.<br />
<img id="image359" src="http://www.testearly.com/wp-content/uploads/2008/09/doxygen-gui.jpg" alt="doxygen-wizard" /><br />
The user interface is quite intuitive so I am going to skip explaining this in detail.<br />
The wizard approach was the one I used to get the initial settings for the configuration file, which you can always modify later.</p>
<p>A few options in my Doxygen configuration file are as follows:</p>
<blockquote><p>
# Doxyfile 1.5.6</p>
<p>#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
# Project related configuration options<br />
#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
DOXYFILE_ENCODING      = UTF-8<br />
PROJECT_NAME           = PetStore<br />
PROJECT_NUMBER         = 1.0<br />
#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
# Build related configuration options<br />
#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
EXTRACT_ALL            = NO<br />
EXTRACT_PRIVATE        = NO<br />
EXTRACT_STATIC         = NO<br />
EXTRACT_LOCAL_CLASSES  = YES<br />
#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
# configuration options related to the HTML output<br />
#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
GENERATE_HTML          = YES<br />
HTML_OUTPUT            = html<br />
HTML_FILE_EXTENSION    = .html<br />
GENERATE_TREEVIEW      = YES
</p></blockquote>
<p><strong>Step 3. Doxygen and Ant.</strong></p>
<p>In order to use Doxygen, we need an Ant task. There is already an Ant task written for Doxygen which you can download from <a href="http://ant-doxygen.blogspot.com/">here</a>.<br />
As always, since using Mac, when I downloaded the binaries and tried to use them, I got the ever famous error message :</p>
<blockquote><p>
java.lang.UnsupportedClassVersionError: Bad version number in .class file
</p></blockquote>
<p>So, had to do download the source, compile, and jar it up. Copy this library to your projects folder. So, lets start making changes to our build file.</p>
<p><strong>3.a: Lets define the Doxygen task:</strong></p>
<p>&lt;taskdef name=&quot;doxygen&quot; classname=&quot;org.doxygen.tools.DoxygenTask&quot; classpath=&quot;lib/ant_doxygen.jar&quot; /&gt;</p>
<p><strong>3.b: To generate HTML documentation:</strong></p>
<p>&lt;target name=&quot;generate-doxygen-docs&quot;&gt;<br />
	  &lt;taskdef name=&quot;doxygen&quot; classname=&quot;org.doxygen.tools.DoxygenTask&quot;<br />
	    classpath=&quot;lib/ant_doxygen.jar&quot; /&gt;<br />
	  &lt;doxygen configFilename=&quot;reports/Doxyfile&quot;&gt;<br />
	  &lt;property name=&quot;INPUT&quot; value=&quot;${srcdir}&quot; /&gt;<br />
	  &lt;property name=&quot;RECURSIVE&quot; value=&quot;yes&quot; /&gt;<br />
	  &lt;/doxygen&gt;<br />
	&lt;/target&gt;</p>
<p><strong>3.c: Lets combine them in a target and run the same:</strong></p>
<blockquote><p>
  [doxygen] Exec: /Applications/Doxygen.app reports/Doxyfile </p>
<p>BUILD FAILED<br />
/CodeMetricsProject/build.xml:91: Doxygen not found on the PATH.</p>
<p>Total time: 7 seconds</p>
</blockquote>
<p><strong>3.d: So, to launch Doxygen not in the path</strong>, we make changes to the doxygen task as shown below:</p>
<p>&lt;doxygen doxygenPath=&quot;/Applications/Doxygen.app/Contents/Resources/doxygen&quot; configFilename=&quot;reports/Doxyfile&quot;&gt;</p>
<p>Lets run the target again and see if it fixed things. Yes indeed.</p>
<blockquote><p>
generate-doxygen-docs:<br />
  [doxygen] Exec: /Applications/Doxygen.app/Contents/Resources/doxygen reports/Doxyfile </p>
<p>BUILD SUCCESSFUL<br />
Total time: 8 seconds
</p></blockquote>
<p><strong>4. Integrate with Hudson.</strong></p>
<p><strong>4.a Hudson Job and Ant Target.</strong><br />
Once you have an Ant target working, calling this from your CI server is trivial. Within Hudson, select your Job, click on configure and add this new target to be called when running the build.<br />
<img id="image360" src="http://www.testearly.com/wp-content/uploads/2008/09/hudson-ant.jpg" alt="hudson-ant" /></p>
<p><strong>4.b Publish the Reports.</strong><br />
<img id="image361" src="http://www.testearly.com/wp-content/uploads/2008/09/hudson-reports.jpg" alt="hudson-reports" /></p>
<p><strong>4. c: Sample Reports.</strong></p>
<p>Force a build, and take a detailed look at the reports generated by Doxygen as shown below:</p>
<p><img id="image362" src="http://www.testearly.com/wp-content/uploads/2008/09/main-page.jpg" alt="main-page" /></p>
<p><img id="image363" src="http://www.testearly.com/wp-content/uploads/2008/09/report-page1.jpg" alt="Report-Page1" /></p>
<p><img id="image364" src="http://www.testearly.com/wp-content/uploads/2008/09/doxygen-pic4.jpg" alt="Report-Page2" /></p>
<p>I have given you a brief overview of Doxygen in this article, how to configure the same, and use it effectively to generate technical documentation on a continuous basis; either on commit builds or nightly builds. The Doxygen web site has lots of information on how to use it with other programming languages and also has tutorials in languages other than English as well. </p>
<p>As always, if you are having trouble getting Doxygen to work, leave a comment or check out the Doxygen web site. </p>
                        <p><center>Test Early is sponsored by <a href="http://www.stelligent.com">Stelligent</a> | <a href="http://www.stelligent.com/index.php?option=com_content&task=view&id=8&Itemid=39">Stelligent is hiring experts like you!</a></center></p>                                ]]></content:encoded>
			<wfw:commentRSS>http://www.testearly.com/2008/09/10/javadoc-or-doxygen/feed/</wfw:commentRSS>
		</item>
	</channel>
</rss>
