<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>john_smart's blog</title>
  <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/blog/17"/>
  <link rel="self" type="application/atom+xml" href="http://www.javaworld.com/community/blog/17/atom/feed"/>
  <id>http://www.javaworld.com/community/blog/17/atom/feed</id>
  <updated>2009-01-12T13:23:42-05:00</updated>
  <entry>
    <title>Live Online Maven courses in Australia/New Zealand and Asia</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/3933" />
    <id>http://www.javaworld.com/community/node/3933</id>
    <published>2010-01-18T18:29:46-05:00</published>
    <updated>2010-01-18T14:27:25-05:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p><em>"No matter whether you are just adopting Maven and Nexus in your development infrastructure or have been using it for a while, you can benefit from having your team trained by Maven experts."</em></p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p><em>"No matter whether you are just adopting Maven and Nexus in your development infrastructure or have been using it for a while, you can benefit from having your team trained by Maven experts."</em></p>
<p>Over the past six months, the new <a href="http://www.sonatype.com/services/training" rel="nofollow">new virtual-classroom  Maven training courses</a> have proved to be tremendously popular. Delivered in real-time by Sonatype instructors in two four-hour sessions, they offer a great way to get your team up to speed with Maven. And starting on the 27th of January, I will be running these courses in collaboration with Sonatype at a time better suited to Australia, New Zealand, and Asia.</p>
<p>There are two modules available:</p>
<p><a href="http://www.sonatype.com/training/mvn101_maven_mechanics" rel="nofollow">MVN-101 Maven Mechanics</a></p>
<p>This course of two half-day sessions is ideal for programmers who work with Maven projects and need to understand how to work with an existing Maven build. This class is also appropriate for Maven users who are interested in Maven fundamentals. It comprehensively covers Maven installation and configuration, explains the motivation behind Maven and gives an overview of related development tools. You will leave this Maven tutorial equipped with a full understanding of the Maven Project Object Model (POM) and a firm grasp of the underlying fundamentals of this development kit including:</p>
<ul>
<li>The Maven lifecycle</li>
<li>Maven plugins and goals</li>
<li>Dependency Management</li>
<li>Multi-module Maven projects</li>
<li>The contents of the Project Object Model (POM)</li>
</ul>
</p>
<p>This course is scheduled for January 27 and 29,2010 from 10:00 am to 2:00 pm Tokyo Time. That's 12pm-4pm in Sydney, 2pm-6pm in Auckland, and 9am-1pm in Singapore.
</p>
<p>So <a href="http://store.sonatype.com/training/mvn-201-development-infrastructure-design" rel="nofollow">Enroll Now!</a><br />
<a href="http://www.sonatype.com/training/mvn201_development_infrastructure_design" rel="nofollow">MVN-201 Designing Development Infrastructure</a></p>
<p>This course follows on from MVN-101 course and covers more advanced build automation topics. This course is ideal for Development Infrastructure Engineers who are responsible for maintaining enterprise development infrastructure, or anyone wanting a more complete understanding of Maven. It includes topics such as:</p>
<ul>
<li>Advanced multimodule project architecture</li>
<li>Configuring your build with profiles and properties</li>
<li>Enforcing standards with the Enforcer plugin</li>
<li>Maven Reporting</li>
<li>Scripting in Maven</li>
<li>Installing and configuring a repository manager (Nexus)</li>
<li>Installing and configuring a continuous integration server (Hudson)</li>
</ul>
</p>
<p>This course is scheduled for February 3 and 5,2010 from 10:00 am to 2:00 pm Tokyo Time. That's 12pm-4pm in Sydney, 2pm-6pm in Auckland, and 9am-1pm in Singapore.
</p>
<p><a href="http://store.sonatype.com/training/mvn-201-development-infrastructure-design" rel="nofollow">Enroll now!</a>
</p>
<p>We can also run these courses in a special session exclusively for your team members, tailored to your specific requirement - <a href="http://www.wakaleo.com/about-us/contact-us" rel="nofollow">just ask</a> for details.
</p>
    ]]></content>
  </entry>
  <entry>
    <title>A new Java Power Tools Newsletter is out: Web application testing strategies with Selenium</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/3929" />
    <id>http://www.javaworld.com/community/node/3929</id>
    <published>2010-01-17T14:04:19-05:00</published>
    <updated>2010-01-17T14:05:42-05:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p>In&nbsp;<a href="http://us1.campaign-archive.com/?u=8a43ccdb821548b314780e0f3&amp;id=d80178a6f2" rel="nofollow" rel="nofollow">this issue</a>&nbsp;we will be looking at how automated web testing fits into the larger picture. In particular, we will look at how you can use Selenium in different ways for different types of testing.&nbsp;<a href="http://us1.campaign-archive.com/?u=8a43ccdb821548b314780e0f3&amp;id=d80178a6f2" rel="nofollow" rel="nofollow">Read more here</a></p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>In&nbsp;<a href="http://us1.campaign-archive.com/?u=8a43ccdb821548b314780e0f3&amp;id=d80178a6f2" rel="nofollow">this issue</a>&nbsp;we will be looking at how automated web testing fits into the larger picture. In particular, we will look at how you can use Selenium in different ways for different types of testing.&nbsp;<a href="http://us1.campaign-archive.com/?u=8a43ccdb821548b314780e0f3&amp;id=d80178a6f2" rel="nofollow">Read more here</a></p>
    ]]></content>
  </entry>
  <entry>
    <title>Java Power Tools Training in London and Paris - don&#039;t miss out! </title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/3882" />
    <id>http://www.javaworld.com/community/node/3882</id>
    <published>2010-01-02T17:20:41-05:00</published>
    <updated>2010-01-02T18:16:53-05:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p>This February, in collaboration with <a href="http://skillsmatter.com" rel="nofollow" rel="nofollow">Skills Matter</a>, I will be in Europe to deliver the <a href="http://skillsmatter.com/course/java-jee/java-power-tools-bootcamp/wd-534" rel="nofollow" rel="nofollow">Java Power Tools Bootcamp</a> in London and Paris. The London session is scheduled for February 15, and the Paris session is scheduled for February 22.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>This February, in collaboration with <a href="http://skillsmatter.com" rel="nofollow">Skills Matter</a>, I will be in Europe to deliver the <a href="http://skillsmatter.com/course/java-jee/java-power-tools-bootcamp/wd-534" rel="nofollow">Java Power Tools Bootcamp</a> in London and Paris. The London session is scheduled for February 15, and the Paris session is scheduled for February 22.</p>
<p>The <a href="http://skillsmatter.com/course/java-jee/java-power-tools-bootcamp/wd-534" rel="nofollow">Java Power Tools Bootcamp</a> is an intense, comprehensive 5-day workshop covering best-of-breed Java development, code quality and build automation tools and techniques build around tools like Maven, Hudson, Nexus and Sonar.
</p>
</p>
<p>These workshops are a great way to give your Java development practices a boost and introduce some kick-ass tools, techniques and tricks into your daily development routine. They are a practical, hands-on, and in-depth, covering <strong>build automation</strong> techniques with <strong>Maven</strong> and <strong>Nexus</strong>, <strong>automated release and deployment</strong> strategies with <strong>Cargo</strong>,&amp;<strong>Nexus</strong> and <strong>Hudson</strong>, <strong>unit, integration and web testing</strong> techniques with tools like <strong>JUnit 4.7</strong>, <strong>Selenium</strong>, <strong>Infinitest</strong>,  <strong>easyb, </strong> <strong>code coverage</strong> and <strong>code quality</strong> with tools like <strong>Cobertura</strong>, <strong>Checkstyle</strong>, <strong>Findbugs</strong> and <strong>Sonar</strong>, advanced <strong>Continuous Integration</strong> techniques with <strong>Hudson</strong>and more!</p>
<p>Better still, the course is agile - few other courses dynamically adapt the  content and level of the modules to suit your particular needs the way this one does!</p>
<p>I've been getting very positive feedback about the course, both from newer developers and from more experienced ones. I got several comments along the lines of <em>&quot;One of the best and most useful courses I have attended&quot;</em>. Many developers appreciate the global view they get of current Java Best Practices: <em>&quot;This was a great all round introduction to best practices for development process optimization. I found all of the content very helpful and easy to understand&quot;</em>. Others liked the global picture, and the way the course covers not only what tools exist, but when they are appropriate: <em>&quot;Gives a very good overall view of the Java development environment. Not just how to write Java code but the 'business end' - how to build, test, deploy, manage and monitor.&quot;</em></p>
<p><a href="http://skillsmatter.com/" rel="nofollow">Skills Matter</a> are doing a great deal on the<br />
<a href="http://skillsmatter.com/course/java-jee/java-power-tools-bootcamp/wd-534" rel="nofollow">London course</a>, which is going for &pound;1950.00 (instead of the normal price of &pound;2495) if booked before the 10th of January. So what are you waiting for? <a href="http://skillsmatter.com/course/java-jee/java-power-tools-bootcamp/wd-534" rel="nofollow">Book now!</a>
</p>
    ]]></content>
  </entry>
  <entry>
    <title>A new Java Power Tools Newsletter is out!</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/3422" />
    <id>http://www.javaworld.com/community/node/3422</id>
    <published>2009-09-15T00:10:38-04:00</published>
    <updated>2009-09-15T00:15:05-04:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p>A new <a target="_blank" href="http://us1.campaign-archive.com/?u=8a43ccdb821548b314780e0f3&amp;id=4b3400eff7&amp;e=4267f52aba" rel="nofollow" rel="nofollow">Java Power Tools Newsletter</a> is out! In this issue, we study the theory and practice of Mock Objects, including the subtle differences between mocks and stubs, and a simple case study using <a target="_blank" href="http://mockito.org" rel="nofollow" rel="nofollow">Mockito</a>, the new kid on the block of Mock Objects frameworks for Java. <a target="_blank" href="http://us1.campaign-archive.com/?u=8a43ccdb821548b314780e0f3&amp;id=4b3400eff7&amp;e=4267f52aba" rel="nofollow" rel="nofollow">Check it out</a>!</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>A new <a target="_blank" href="http://us1.campaign-archive.com/?u=8a43ccdb821548b314780e0f3&amp;id=4b3400eff7&amp;e=4267f52aba" rel="nofollow">Java Power Tools Newsletter</a> is out! In this issue, we study the theory and practice of Mock Objects, including the subtle differences between mocks and stubs, and a simple case study using <a target="_blank" href="http://mockito.org" rel="nofollow">Mockito</a>, the new kid on the block of Mock Objects frameworks for Java. <a target="_blank" href="http://us1.campaign-archive.com/?u=8a43ccdb821548b314780e0f3&amp;id=4b3400eff7&amp;e=4267f52aba" rel="nofollow">Check it out</a>!</p>
    ]]></content>
  </entry>
  <entry>
    <title>The second Java Power Tools Newsletter is out!</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/3305" />
    <id>http://www.javaworld.com/community/node/3305</id>
    <published>2009-08-13T03:48:21-04:00</published>
    <updated>2009-08-13T03:48:22-04:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><!--paging_filter-->The second <a href="http://us1.campaign-archive.com/?u=8a43ccdb821548b314780e0f3&id=d8085e0231">Java Power Tools Newsletter</a> is out! This time, the topic under discussion is Java Web Frameworks: Automated web tests are a great way to automate smoke and regression tests, and can also be effectively used in a TDD or BDD approach to designing your overall screen behaviour and screen flow. In this issue, we will compare several web testing frameworks that can be used with Java: <strong>Selenium</strong>, <strong>HTMLUnit</strong>,  <strong>WebDriver</strong> and <strong>JWebUnit</strong>.    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter-->The second <a href="http://us1.campaign-archive.com/?u=8a43ccdb821548b314780e0f3&id=d8085e0231">Java Power Tools Newsletter</a> is out! This time, the topic under discussion is Java Web Frameworks: Automated web tests are a great way to automate smoke and regression tests, and can also be effectively used in a TDD or BDD approach to designing your overall screen behaviour and screen flow. In this issue, we will compare several web testing frameworks that can be used with Java: <strong>Selenium</strong>, <strong>HTMLUnit</strong>,  <strong>WebDriver</strong> and <strong>JWebUnit</strong>. <a href="http://us1.campaign-archive.com/?u=8a43ccdb821548b314780e0f3&id=d8085e0231">Check it out here</a>!    ]]></content>
  </entry>
  <entry>
    <title>Installing Sonar in a linux environment</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/3099" />
    <id>http://www.javaworld.com/community/node/3099</id>
    <published>2009-06-21T23:42:32-04:00</published>
    <updated>2009-06-21T23:47:28-04:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><!--paging_filter--><p>Anyone who has read many of my blog entries or articles will know that I'm a great fan of code quality metrics. By code quality metrics, I am referring to coding standards, best practices, complexity, but also to other associated statistics such as the number of unit tests run and the level of code coverage. Code Quality management is an important part of any project, but sometimes it can be difficult to get a global picture. Any given metric, such as code coverage or code complexity, can be difficult to interpret in isolation. This is where Sonar comes into the picture.
</p>    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>Anyone who has read many of my blog entries or articles will know that I'm a great fan of code quality metrics. By code quality metrics, I am referring to coding standards, best practices, complexity, but also to other associated statistics such as the number of unit tests run and the level of code coverage. Code Quality management is an important part of any project, but sometimes it can be difficult to get a global picture. Any given metric, such as code coverage or code complexity, can be difficult to interpret in isolation. This is where Sonar comes into the picture.
</p>
<p>
If you are serious about Code Quality management, you should know about Sonar. <a href="http://sonar.codehaus.org/">Sonar</a> is a one-stop shop for code quality metrics. If you are using Maven to generate code quality metrics with tools like Checkstyle, PMD, FindBugs, Cobertura, and/or Clover, forget the standard Maven reports - use Sonar instead! Sonar gives you a dynamic view of both snapshot and historical data coming from all of these tools.
</p>
<p>
In this article, I go through the basic steps involved in setting up your very own Sonar server in a Linux-type environment (it works for Mac OS too, of course), based on my own experience of installing Sonar on a new build server running on CentOS. It's not too hard. First, download Sonar from the <a href="http://sonar.codehaus.org/downloads/">Sonar web site</a>:
<pre>
<div class="codeblock"><code>$ wget <a href="http://dist.sonar.codehaus.org/sonar-1.9.2.zip" title="http://dist.sonar.codehaus.org/sonar-1.9.2.zip">http://dist.sonar.codehaus.org/sonar-1.9.2.zip</a><br />$ unzip sonar-1.9.2.zip<br />$ mv sonar-1.9.2 /usr/local</code></div>
</pre>
</p>
<p>
I like to create a symbolic link to applications like this to make upgrades easier:
<pre><code>$ ln -s /usr/local/sonar-1.9.2/ /usr/local/sonar</code></pre>
</p>
<p>
Sonar works with Maven, so you need Maven (2.0.7 is the minimum supported version - it also works fine with Maven 2.1.0). You will also need JDK 5 or higher.
</p>
<p>
The basic architecture behind Sonar works at two levels. First, your Maven project generates XML metrics, about test results, code quality, code coverage, and so forth. The Maven Sonar plugin takes this data and sends it to your local Sonar server, where it is processed and incorporated into the Sonar database. You can then go to the Sonar site to view your project's code quality metrics.
</p>
<p>
Sonar stores its data in a real database, so you will need one available. Although it comes with a built-in Derby database, you shouldn't really use this for anything else than testing. For production use, go to the trouble of setting up a dedicated database for Sonar. Sonar works fine with MySQL, Oracle and Postgres. I set up a local MySQL database for this purpose. Here's how they recommend creating the Sonar database in the documentation:
<pre>
<div class="codeblock"><code>mysql&gt; CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;<br />mysql&gt; grant all privileges on sonar.\* to &#039;sonar&#039;@&#039;localhost&#039; identified by &#039;t0ps3cr3t&#039;;<br />mysql&gt; flush privileges;</code></div>
</pre>
</p>
<p>
You also need to modify the conf/sonar.properties file to use the correct database. For example, if you are using MySQL, you need to comment out the lines referring to Derby and uncomment (and modify as required) the following lines:
<pre>
<div class="codeblock"><code>...<br /># MySql<br /># uncomment the 3 following lines to use MySQL<br />sonar.jdbc.url:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8<br />sonar.jdbc.driverClassName:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.mysql.jdbc.Driver<br />sonar.jdbc.validationQuery:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select 1<br />sonar.jdbc.user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sonar<br />sonar.jdbc.password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t0ps3cr3t</code></div></pre>
</p>
<p>
You can start the Sonar server using the sonar.sh script in the OS-specific subdirectory of the bin directory in your Sonar installation, e.g.
<pre>
<div class="codeblock"><code># /usr/local/sonar/bin/linux-x86-64/sonar.sh start</code></div></pre>
But that's a little boring. Let's implement the Sonar server as a Linux service, so that it will restart cleanly if the server reboots. The existing sonar.sh script is a good place to start. Copy the appropriate script into the <code>/etc/init.d</code> directory, e.g:
<pre><code># cp bin/linux-x86-64/sonar.sh /etc/init.d/sonar</code>
</pre>
</p>
<p>
Now modify the <code>/etc/init.d/sonar</code> file. Add a SONAR_HOME variable pointing to the Sonar installation directory, and a PLATFORM variable matching your platform-specific directory name.
<pre>
<div class="codeblock"><code>SONAR_HOME=/usr/local/sonar<br />PLATFORM=linux-x86-64</code></div></pre>
</p>
<p>
Next, replace the WRAPPER_CMD and WRAPPER_CONF variables with the following values:
<pre>
<div class="codeblock"><code>WRAPPER_CMD=&quot;${SONAR_HOME}/bin/${PLATFORM}/wrapper&quot;<br />WRAPPER_CONF=&quot;${SONAR_HOME}/conf/wrapper.conf&quot;</code></div></pre>
</p>
<p>
Finally, change the PIDDIR variable to "/var/run":
<pre>
<div class="codeblock"><code>PIDDIR=&quot;/var/run&quot;</code></div></pre>
</p>
<p>
Now you need to set this up as a service. On Ubuntu or Debian, for example, you might use <b>update-rc.d</b>. On Redhat, Fedora or CentOS, you would use <b>chkconfig</b>
<pre>
<div class="codeblock"><code># chkconfig --add sonar</code></div></pre>
</p>
<p>
You can now start up the Sonar server as you would any other service:
<pre>
<div class="codeblock"><code>#/etc/init.d/sonar start</code></div></pre>
</p>
<p>
You can now go to the Sonar web page. By default, you will find it on <a href="http://localhost:9000/" title="http://localhost:9000/">http://localhost:9000/</a>, though you can modify the port and web context in the sonar.properties file if required. 
</p>
<p>
Once your server is up and running, you need to configure your Maven projects to send data to Sonar. This is done using the Maven Sonar plugin. 
</p>
<p>
However, a better approach is to get your CI server to provide the data for you. The key to having good code quality metrics is to have produce them automatically and regularly. A Continuous Integration server is a perfect candidate for the job. For example, you can set up a build job to run a special code metrics build job every night, and send the data to Sonar.
</p>
<p>
Better still, if you are using <a href="https://hudson.dev.java.net">Hudson</a>, you can use the <a href="http://sonar.codehaus.org/a-new-hudson-plugin-for-a-closer-integration-with-sonar/">Hudson Sonar plugin</a>. The beauty of this plugin is that it lets you integrate Sonar into your Maven projects without changing a line of code. All you need to do is set up the Sonar configuration in Manage Hudson screen. Hudson needs to know how to provide data to the Sonar database, so you need to provide the JDBC connection details.
</p>
<img alt="sonar-hudson-config.png" src="http://weblogs.java.net/blog/johnsmart/archive/sonar-hudson-config.png" width="800" />
<p>Next, create a special Sonar build job for each of the projects you want to monitor. Since Sonar treats historical data in 24 hour slices, you only really need to run the code quality metrics on a nightly basis, at least for Sonar. This job just needs to generate the code quality metrics data - you don't need to invoke the Maven Sonar plugin directly. The Hudson Sonar plugin will do this for you - just tick the "Sonar" checkbox further down the screen.
</p>

<img alt="sonar-hudson-job.png" src="http://weblogs.java.net/blog/johnsmart/archive/sonar-hudson-job.png" width="800" />
<p>...</p>
<img alt="activating-sonar.png" src="http://weblogs.java.net/blog/johnsmart/archive/activating-sonar.png" width="800" />
<p>Now you should have a Sonar site up and running, complete with (at least) one project. From now on, Sonar will start collecting metrics, and in no time (well, a few days) you will start to have historical data as well as a snapshot of your current project quality metrics. You might also check out the <a href="http://docs.codehaus.org/display/SONAR/Sonar+in+a+nutshell">documentation</a> to see what you can do in Sonar.</p>
<p>For anyone interested in learning more about integrating Sonar into a nice open source Java development stack build around tools such Maven, Hudson, Checkstyle, PMD, FindBugs, Cobertura, and so on, come along to one of the <a href="http://www.wakaleo.com/training/java-power-tools-bootcamp"><b>Java Power Tools Bootcamps</b></a>! Starting from the <a href="http://skillsmatter.com/course/java-jee/java-power-tools-bootcamp">London</a> bootcamp, but also in the other sessions, I will be including a brand-new module on Sonar and how to integrate it into your development stack.</p>    ]]></content>
  </entry>
  <entry>
    <title>JavaOne - my personal favorite sessions</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/3059" />
    <id>http://www.javaworld.com/community/node/3059</id>
    <published>2009-06-10T23:35:24-04:00</published>
    <updated>2009-06-10T23:35:24-04:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p>
As usual, JavaOne was a great networking opportunity, and I caught up with old friends, made new ones, and met up with people I had only ever known virtually. This year I was giving a session myself, so I didn't get to as many sessions as I would have liked to. However, I did attend a few gems. Here are some of them:
</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>
As usual, JavaOne was a great networking opportunity, and I caught up with old friends, made new ones, and met up with people I had only ever known virtually. This year I was giving a session myself, so I didn't get to as many sessions as I would have liked to. However, I did attend a few gems. Here are some of them:
</p>
<p>
Neil Ford talked about a variety of unit testing tools in <a href="http://www28.cplan.com/cc230/sessions_catalog.jsp?ilc=230-1&amp;ilg=english&amp;isort=&amp;isort_type=&amp;is=yes&amp;icriteria1=+&amp;icriteria2=+&amp;icriteria8=&amp;icriteria3=&amp;icriteria9=TS-4964&amp;icriteria4=+&amp;icriteria7=+" rel="nofollow">Unit Testing That Sucks Less: Small Things Make a Big Difference"&gt;</a>, going from JUnit-based techniques such as Hamcrest asserts, <a href="http://mockrunner.sourceforge.net/" rel="nofollow">MockRunner</a>, and Groovy as a unit-testing language, through to more exotic tools such as <a href="http://www.infinitest.org/web/guest/home" rel="nofollow">Infinitest</a> (which seems to have made a lot of progress since I last looked at it), <a href="http://jester.sourceforge.net/" rel="nofollow">Jester</a>, and the intriguingly-named <a href="http://code.google.com/p/spock/" rel="nofollow">Spock</a> (an interesting BDD Groovy-based framework with a very concise and expressive DSL).</p>
<p>
Dave Klein spoke about <a href="http://www28.cplan.com/cc230/sessions_catalog.jsp?ilc=230-1&amp;ilg=english&amp;isort=&amp;isort_type=&amp;is=yes&amp;icriteria1=+&amp;icriteria2=+&amp;icriteria8=&amp;icriteria3=Klein&amp;icriteria9=&amp;icriteria4=+&amp;icriteria7=+" rel="nofollow">Grails Integration Strategies</a>, presenting an excellent case for the use of Grails in a broader enterprise context, and not just for small isolated and/or internal web applications. He showed a number of useful tricks such as how to configure a Grails app to talk to EJBs, to use JNDI resources, and to access legacy databases.</p>
<p>I also caught an interesting session from the guys at LinkedIn called <a href="http://www28.cplan.com/cc230/sessions_catalog.jsp?ilc=230-1&amp;ilg=english&amp;isort=&amp;isort_type=&amp;is=yes&amp;icriteria1=+&amp;icriteria2=+&amp;icriteria8=&amp;icriteria3=&amp;icriteria9=TS-4696&amp;icriteria4=+&amp;icriteria7=+" rel="nofollow">JDBC? We Don’t Need No Stinkin' JDBC: How LinkedIn Scaled with memcached, SOA, and a Bit of SQL</a>, which was about scaling apps using a combination of BASE and ACID. Although this mixture would usually produce only salty water, the folks at LinkedIn have managed to use a comibination of fast ACID updates when really required, and slower updates when you can get away with it to design a very highly scalable architecture.</p>
<p>And the Groovy/Grails BOF was a lot of fun.</p>
<p>Would have liked to have heard Kosuke on Hudson, but unfortunately I was giving my own presentation at that time - too bad!</p>
<p>Anyway, another great JavaOne - looking forward to catching up with everyone at some of the other upcoming conferences (I'm thinking Agile2009 and Groovy, in particular), or at JavaOne next year!</p>
<p>If anyone wants to catch me in London, I will be over that way between the 6th and 10th of July for the first London session of the <a href="http://skillsmatter.com/course/java-jee/java-power-tools-bootcamp" rel="nofollow">Java Power Tools Bootcamp</a>, that I am running with the folks from <a href="http://skillsmatter.com/" rel="nofollow">Skills Matter</a>. There are still a few places left for this session, so if you want to come up to speed with the latest all-round development lifecycle tools and techniques, and learn how to set up a development infrastructure and build environment that kicks butt, <a href="http://skillsmatter.com/course/java-jee/java-power-tools-bootcamp" rel="nofollow">come along!</a>. On the 6th, I will also be speaking at the Skills Matter In-The-Brain evening session (6:30 - 8:00pm).
</p>
    ]]></content>
  </entry>
  <entry>
    <title>Java Power Tools is going to the UK!</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/2518" />
    <id>http://www.javaworld.com/community/node/2518</id>
    <published>2009-02-26T13:26:41-05:00</published>
    <updated>2009-02-26T13:26:41-05:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p>This year, <a href="http://www.wakaleo.com" rel="nofollow" rel="nofollow">Wakaleo</a> is teaming up with <a href="http://skillsmatter.com" rel="nofollow" rel="nofollow">SkillsMatter</a> to bring the <a href="http://skillsmatter.com/course/java-jee/java-power-tools-bootcamp" rel="nofollow" rel="nofollow">Java Power Tools Bootcamps</a> to the UK and Europe. The first course is in London</a> from the 6th to the 10th of July.
</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>This year, <a href="http://www.wakaleo.com" rel="nofollow">Wakaleo</a> is teaming up with <a href="http://skillsmatter.com" rel="nofollow">SkillsMatter</a> to bring the <a href="http://skillsmatter.com/course/java-jee/java-power-tools-bootcamp" rel="nofollow">Java Power Tools Bootcamps</a> to the UK and Europe. The first course is in London</a> from the 6th to the 10th of July.
</p>
<p>There are lots of tools, techniques and practices that you can use to speed up your development process, at all levels. But sometimes it's hard to know what tools exist, or how best to use them. And it can be frustrating and slow going if you have to discover all the tips yourself.
</p>
<p>The 2009 Java Power Tools bootcamps are a great way to improve your development skills in a range of areas that will come in useful no matter what Java technologies you use. They are an all-round in-depth tutorial on development tools and practices right across the development life cycle: from build scripting and build automation, unit, integration and functional testing, right through to automated deployment. At each stage, we look at how you can speed up your development using the latest in Java tools and best practices.</p>
</p>
<p>
We look at how to use Maven to streamline and standardize your development process, and waste less time with low-level build scripting.<br />
We study code quality metrics and code coverage tools, and look at the best ways to use these tools to improve your code and train your team. We look at a range of testing tools and techniques, including the latest JUnit 4 features, and other testing tools such as SoapUI, Selenium, easyb and testing with Groovy. We look at how to use these techniques with new projects, but also with legacy ones. And we look at how to use Continuous Integration to bind the whole development process together, acting as a communications hub for your development team and automating everything from snapshot builds to staging and production releases.
</p>
<p>I've been getting very positive feedback about the course, both from newer developers and from more experienced ones. I got several comments along the lines of <em>"One of the best and most useful courses I have attended"</em>. Many developers appreciate the global view they get of current Java Best Practices: <em>"This was a great all round introduction to best practices for development process optimization. I found all of the content very helpful and easy to understand.</em>. Others liked the global picture, and the way the course covers not only what tools exist, but when they are appropriate: <em>"Gives a very good overall view of the Java development environment. Not just how to write Java code but the 'business end' - how to build, test, deploy, manage and monitor."</em>
</p>
<p>I discuss some of the innovations in the 2009 bootcamps in more detail <a href="http://weblogs.java.net/blog/johnsmart/archive/2009/01/whats_new_in_th_1.html" rel="nofollow">here</a>.
</p>
<p>So sign up for the first course this year in <a href="http://skillsmatter.com/course/java-jee/java-power-tools-bootcamp" rel="nofollow">London</a> from the 6th to the 10th of July! And for those down under, there is still time to book on the upcoming Java Power Tools Bootcamps in <a href="sydney-march-23-27-2009" rel="nofollow">Sydney</a>, <a href="http://www.wakaleo.com/training/java-power-tools-bootcamp/wellington-30-march-3-april-2009" rel="nofollow">Wellington</a> and <a href="http://www.wakaleo.com/training/java-power-tools-bootcamp/melbourne-20-24-april-2009" rel="nofollow">Melbourne</a>.
</p>
    ]]></content>
  </entry>
  <entry>
    <title>The 2009 Continuous Integration poll - new and improved!</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/2483" />
    <id>http://www.javaworld.com/community/node/2483</id>
    <published>2009-02-21T14:13:33-05:00</published>
    <updated>2009-02-21T14:13:45-05:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p>Last week, I put the <a href="http://www.wakaleo.com/resources/polls" rel="nofollow" rel="nofollow">2009 Continuous Integration poll</a> online. However, at one point, I started to notice some major irregularities in the voting patterns - in short, some unscrupulous voters where apparently attempting to skew the results in their favour.  This poll is intended to be an informal survey of real CI usage patterns, to help users learn what tools other people are using in the industry, and certainly not a commerical tool for vendors. As a result, I have reset the counters and upgraded the poll to a more secure system.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>Last week, I put the <a href="http://www.wakaleo.com/resources/polls" rel="nofollow">2009 Continuous Integration poll</a> online. However, at one point, I started to notice some major irregularities in the voting patterns - in short, some unscrupulous voters where apparently attempting to skew the results in their favour.  This poll is intended to be an informal survey of real CI usage patterns, to help users learn what tools other people are using in the industry, and certainly not a commerical tool for vendors. As a result, I have reset the counters and upgraded the poll to a more secure system. Now, you can also vote for more than one tool (many organizations that I work with <em>do</em> have more than one CI tool in production at once). My apologies for those who have already voted - please vote again and make your vote count! And for everybody else - come along and <a href="http://www.wakaleo.com/resources/polls" rel="nofollow">cast your vote</a>!</p>
    ]]></content>
  </entry>
  <entry>
    <title>What Continuous Integration Server are you using in 2009?</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/2469" />
    <id>http://www.javaworld.com/community/node/2469</id>
    <published>2009-02-19T02:43:46-05:00</published>
    <updated>2009-02-21T14:04:49-05:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p><strong>(Probably) more representative than an African election! With all the scientific rigour of an 8th grade science lab! Guaranteed to accurately represent the opinions of at least 100% of the people who voted! It's the <a href="http://www.wakaleo.com/resources/polls" rel="nofollow" rel="nofollow">2009 Wakaleo Continuous Integration poll</a>!</strong></p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p><strong>(Probably) more representative than an African election! With all the scientific rigour of an 8th grade science lab! Guaranteed to accurately represent the opinions of at least 100% of the people who voted! It's the <a href="http://www.wakaleo.com/resources/polls" rel="nofollow">2009 Wakaleo Continuous Integration poll</a>!</strong></p>
<p>Last year, <a href="https://hudson.dev.java.net/" rel="nofollow">Hudson</a> was the clear winner, with 230 out of the 584 votes. Coming in second and third were <a href="cruisecontrol.sourceforge.net/ " rel="nofollow">CruiseControl</a> and <a href="http://continuum.apache.org" rel="nofollow">Continuum</a>. Of the commercial tools, <a href="http://www.jetbrains.com/teamcity/" rel="nofollow">TeamCity</a> and <a href="http://www.atlassian.com/software/bamboo/" rel="nofollow">Bamboo</a> led the pack.</p>
<p>This year, CI tools are evolving across the board. Hudson still seems to have a very bright future, with an ever-increasing number of plugins and a very wide user base. Commercial tools are starting to play an increasing role in the market. <a href="http://www.atlassian.com/software/bamboo/" rel="nofollow">Bamboo</a> offers in-depth build metrics and unrivalled integration with the Atlassian tools such as JIRA and Clover. <a href="http://studios.thoughtworks.com/cruise" rel="nofollow">Cruise</a>, from Thoughtworks, attempts to tackle the problem of release automation front-on. And tools like <a href="http://www.jetbrains.com/teamcity/" rel="nofollow">TeamCity</a> and <a href="http://zutubi.com/products/pulse/" rel="nofollow">Pulse</a> propose innovative "private builds" and (for the former) very close IntelliJ integration. </p>
<p>So, come along and vote for your favorite CI tool in the <a href="http://www.wakaleo.com/resources/polls" rel="nofollow">2009 Wakaleo Continuous Integration poll</a>!</p>
    ]]></content>
  </entry>
  <entry>
    <title>Wakaleo Consulting to contribute 33% of upcoming Java Power Tools Bootcamp profits for bushfire victims</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/2448" />
    <id>http://www.javaworld.com/community/node/2448</id>
    <published>2009-02-15T16:32:24-05:00</published>
    <updated>2009-02-15T16:51:20-05:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p>In February 2009, a series of <a href="http://en.wikipedia.org/wiki/2009_Victorian_bushfires" rel="nofollow" rel="nofollow">bushfires</a> devastated many towns in Victoria, Australia, killing hundreds and leaving thousands homeless. These fires constitute the worst natural disaster in Australia's history.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>In February 2009, a series of <a href="http://en.wikipedia.org/wiki/2009_Victorian_bushfires" rel="nofollow">bushfires</a> devastated many towns in Victoria, Australia, killing hundreds and leaving thousands homeless. These fires constitute the worst natural disaster in Australia's history.</p>
<p>Wakaleo Consulting is based in New Zealand, but has many valued friends in Melbourne and Victoria, and in Australia in general. All Wakaleo staff extend their deep sympathy, compassion and prayers to victims of these bushfires.</p>
<p>Alongside many other members of the Australian and New Zealand business communities, Wakaleo Consulting is keen to do what it can to help those in need. As a result, Wakaleo Consulting will be contributing 33% of the profits made from the <a href="http://www.wakaleo.com/training/java-power-tools-bootcamp/sydney-march-23-27-2009" rel="nofollow">Sydney</a>, <a href="http://www.wakaleo.com/training/java-power-tools-bootcamp/wellington-30-march-3-april-2009" rel="nofollow">Wellington</a> and <a href="http://www.wakaleo.com/training/java-power-tools-bootcamp/melbourne-20-24-april-2009" rel="nofollow">Melbourne</a> <a href="http://www.wakaleo.com/training/java-power-tools-bootcamp" rel="nofollow">Java Power Tools Boot Camp</a> training sessions to the Australian Red Cross <a href="https://www.redcross.org.au/Donations/onlineDonations.asp" rel="nofollow">Victorian Bushfire Appeal</a>.</p>
<p>Learn more about the Victoria bushfires, and the Victorian Bushfire Appeal, <a href="https://www.redcross.org.au/Donations/onlineDonations.asp" rel="nofollow">here</a>.</p>
    ]]></content>
  </entry>
  <entry>
    <title>Background Unit Testing: New evolutions in unit testing and IDE integration</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/2364" />
    <id>http://www.javaworld.com/community/node/2364</id>
    <published>2009-02-01T19:32:04-05:00</published>
    <updated>2009-02-01T20:51:25-05:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p>An emerging innovation in unit testing is the idea of Continuous Unit Testing, or having your unit tests run in the background whenever you modify your code. In this approach, whenever you save your code, the appropriate unit tests are executed in the background. This avoids the problem of committing changes with broken tests just because you forgot to run the appropriate tests before committing. The trick, of course, is knowing what the appropriate tests are - you don't want have to wait for all your your tests to run every time you save a change.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>An emerging innovation in unit testing is the idea of Continuous Unit Testing, or having your unit tests run in the background whenever you modify your code. In this approach, whenever you save your code, the appropriate unit tests are executed in the background. This avoids the problem of committing changes with broken tests just because you forgot to run the appropriate tests before committing. The trick, of course, is knowing what the appropriate tests are - you don't want have to wait for all your your tests to run every time you save a change. You want to focus on the tests that are most likely to be affected by your code changes. I'm sure this sort of thing will be a standard IDE feature in a couple of years.</p>
<p>For now, however, it isn't, and you need to resort to third-party tools. I am aware of two emerging tools that try to achieve this. The first is <a href="http://www.junitmax.com/junitmax/subscribe.html" rel="nofollow">JUnitMax</a>, from <a href="http://en.wikipedia.org/wiki/Kent_Beck" rel="nofollow">Kent Beck</a>, one of the pioneers of XP and TDD. The second is <a>Infinitest</a>. Infinitest is free and open source, whereas JUnitMax is available for a modest subscription fee ($2US per month at this stage). I don't think this is a big deal, though it may well put some people off from trying, which would be a shame. Both tools are pretty green, with little in the way of documentation (there is a decent introduction to JUnixMax <a href="http://www.threeriversinstitute.org/blog/?p=8" rel="nofollow">here</a>).</p>
<p>Infinitest is interesting in that it is supposed to work both with Eclipse and IntelliJ, whereas JUnitMax is purely an Eclipse plugin. Infinitest is actually a separate Java application, that you run from within Eclipse via a Java Application run configuration. The integration with the IDE is therefore far from seamless, though there is a step-by-step tutorial of what you are supposed to do in Eclipse. Unfortunately, when I ran it on a module in my multi-module Maven project, it didn't manage to find any unit tests to run. </p>
<p>JUnitMax comes as an Eclipse plugin, so installing it into Eclipse is more straight-forward. To try it out, I installed the plug-in and made a few trivial changes to one of my unit tests. When I saved the test case, sure enough, JUnitMax kicked off some unit tests in the background, and found an error that I wasn't expecting! JUnixMax runs discreetly in the background, and only makes a fuss if it discovers any failing tests. In this case, unit test errors appear like compilation errors, in the margin of the source code. This is very cool - unit test failures are considered on the same level as compilation errors in the IDE, which is a great visibility boost. It is also a great productivity booster - you don't need to remember to run your unit tests after each change, and you don't have to wait (and possibly be side-tracked) while your unit tests are running. As you would expect, the failing unit tests are also flagged in the project view, so you are less likely to miss test failures, even in unexpected places.</p>
<p>Ensuring that your unit tests stay up to scratch is great, but what is really useful is the ability to run the unit tests relating to a particular application class whenever you change the class. So I modified an application class, introducing an error. Sure enough, within a few seconds, a red marker appeared on the corresponding unit test class. As I mentioned earlier, the tricky thing here is knowing what tests to run, so that you can know about failed test as fast as possible. </p>
<p>JUnitMax uses some clever heuristics to guess which tests need to be run first, and to run the fastest tests first. At the end of the day, all of your unit tests are executed in the background whenever you make a change. This is an approximate process, but it seems to work OK. A more accurate technique would require code coverage metrics that back-track to figure out what unit tests run each line of code. This is much harder. <a href="http://www.atlassian.com/software/clover/" rel="nofollow">Clover</a> can do this, but not in real time. If you integrate Clover with Maven, for example, you can get Maven to run a sub-set of the unit tests based on what code has been changed and what tests execute that code. This is an excellent way to speed up the build process, but it isn't at the stage where you can integrate it smoothly into your IDE yet, as you do with JUnitMax. A perfect JUnitMax would combine these two technologies, so that only the relevant tests are run each time. But, for now, it's a promising start.</p>
    ]]></content>
  </entry>
  <entry>
    <title>Making Agile Real in Chicago this August</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/2297" />
    <id>http://www.javaworld.com/community/node/2297</id>
    <published>2009-01-21T20:10:26-05:00</published>
    <updated>2009-01-21T20:10:26-05:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p>
One conference that I'm really looking forward to this year is <a href="http://agile2009.agilealliance.org/" rel="nofollow" rel="nofollow">Agile 2009</a>, which takes place in Chicago, August 24 to 28, and is run by the <a href="http://www.agilealliance.com/" rel="nofollow" rel="nofollow">Agile Alliance</a> group.  The number of stages and topics covered is absolutely amazing, and there is a very    I'm helping out <a href="http://agile2009.agilealliance.org/user/1828" rel="nofollow" rel="nofollow">Michael H&uuml;ttermann</a> with the <a href="http://agile2009.agilealliance.org/tools" rel="nofollow" rel="nofollow">Tools for Agility</a> stage, and have submitted a few talks.
</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>
One conference that I'm really looking forward to this year is <a href="http://agile2009.agilealliance.org/" rel="nofollow">Agile 2009</a>, which takes place in Chicago, August 24 to 28, and is run by the <a href="http://www.agilealliance.com/" rel="nofollow">Agile Alliance</a> group.  The number of stages and topics covered is absolutely amazing, and there is a very    I'm helping out <a href="http://agile2009.agilealliance.org/user/1828" rel="nofollow">Michael H&uuml;ttermann</a> with the <a href="http://agile2009.agilealliance.org/tools" rel="nofollow">Tools for Agility</a> stage, and have submitted a few talks.
</p>
<p>One of the cool things about this conference is its emphasis on real-world, first-hand experience - there will be a lot of User Experience stories and hands-on workshops, which is often what you really need to get started with Agile. It's also a great way to find-tune your techniques if you are already familiar with Agile.</p>
<p>Judging by the submissions so far, it's going to be a very exciting conference! It's also not to late to submit your own talks - check out the <a href="http://agile2009.agilealliance.org/stages" rel="nofollow">stages</a> and see if any topics come to mind! This conference has to have some of the best speaker benefits of any conference I've been to - not only is entry free for speakers, but accommodation is paid for, and on top of that some speakers even get paid (see <a href="http://agile2009.agilealliance.org/speakercompensation" rel="nofollow">Speaker Compensation</a>).
</p>
    ]]></content>
  </entry>
  <entry>
    <title>Capital investement for developers - keep yourself marketable!</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/2286" />
    <id>http://www.javaworld.com/community/node/2286</id>
    <published>2009-01-19T13:32:16-05:00</published>
    <updated>2009-01-19T13:32:16-05:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p>
In Economics theory, you learn about <a href="http://en.wikipedia.org/wiki/Capital_investment" rel="nofollow" rel="nofollow">capital investment</a>. This is investing in more modern infrastructure, more productive factories or tools, and so forth, that let people produce more goods (and/or better quality goods) with the same amount of effort. Countries or businesses that fail to sufficiently invest in capital assets eventually fall behind ones that do, as they are simply less productive.
</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>
In Economics theory, you learn about <a href="http://en.wikipedia.org/wiki/Capital_investment" rel="nofollow">capital investment</a>. This is investing in more modern infrastructure, more productive factories or tools, and so forth, that let people produce more goods (and/or better quality goods) with the same amount of effort. Countries or businesses that fail to sufficiently invest in capital assets eventually fall behind ones that do, as they are simply less productive.
</p>
<p>
Software developers need to invest in their own productivity as well, in their own way. A developer skilled in an out-of-date technology, but ignorant of modern evolutions, may find his or her marketability limited in the future. On the other hand, a developer with up-to-date, well-honed skills will have a much brighter future, and be more likely to cope with hard times.
</p>
<p>
A software developer may choose to invest his or her time in training or research in a particular technology or technique. This is in general a wise move. The developer will expect to get some return on his or her investment over time. But, from a corporate point of view, this may comes at a cost if the investment is done on company time, in lost billable time, and in some cases in additional training or consulting fees. For a company, a developer's know-how is the equivalent of the investor's assets, and the company will also expect to get some return on investment in terms of improved productivity. So the choice of <em>where</em> to invest your time is just as important as the choice of where to invest your savings. Choose carefully! Playing around with an obscure web framework may be fun, but will it be useful in a year's time? If the company is paying, management will expect to know what return to expect on their investment in a particular new technology or practice. Nevertheless, in core technologies and practices, training and research is almost always pay off quickly.
</p>
<p>
In business, the value of an asset general decreases over time (in accounting, this is known as <a href="http://en.wikipedia.org/wiki/Depreciation" rel="nofollow">depreciation</a>). For an accountant (and for you if you need to sell or replace it), your PC is worth less today than it was this time last year. For the same amount of money, you can have a more powerful model, or you can buy the equivalent for less.
</p>
<p>Technical know-how can also lose value over time. For one thing, if you don't use it, you loose it - practice is essential to keeping your skills honed. In addition, modern software technology and techniques evolves at a frightening rate, which can be a bit of a shock for new Java developers coming from the more stable world of mainframes, for example. So, to keep pace, you need to keep up-to-date.
</p>
<p>
There are many ways a developer can invest in know-how. These include:</p>
<ul>
<li>Training: Face-to-face training, either in the form of public or on-site courses, is probably the most time-effective way to get started with a new technology, or to get up to speed with the latest evolutions or more advanced features of a technology that you already use. Face-to-face training is concentrated and focused, avoiding the distractions of the office environment. Discussion with the trainer and with other students </li>
<li>Mentoring: In many cases, an initial training course on a particular technology or set of techniques needs to be followed up by some mentoring activity for best effect. Those things that seemed obvious in the course aren't so simple to apply back in the office. Sometimes a helping hand in the first few months can ensure that everyone stays on the rails and that the time invested in the training in the first place does not go to waste.</li>
<li>Internal presentations: This is a great way to share knowledge on a particular subject within a team. Give each team member a research topic, with the aim of giving an hour-long talk by one team member once a month, or even every week or two. I've seen teams where this is done to good effect.</li>
<li>Personal research time: Many enlightened IT companies let staff spend time on job-related but not necessarily billable activities (think Google's "20% project"). This is a great way to do in-depth practical research in a particular area of interest - sometimes it even comes in useful ;-). Selling this one to your manager can be a bit tricky, depending on your enterprise culture, but it is worth a try. For example, often times you will find yourself bogged down in development - you have a nagging feeling that you would be more productive, if you automated certain parts of your work, or used more effective testing techniques, or rewrote a core library to be more flexible. But the day-to-day operational pressure doesn't give you the time to do this. With a day a week, free from the pressure of doing billible work, you can do wonders with this sort of problem.</li>
<li>Read a book: Surprisingly (at least, for me) few developers read technical reading matter outside of the office. But this is nevertheless a great way to learn about new techniques. Check out the DZone <a href="http://books.dzone.com/" rel="nofollow">Book Zone</a>, and the book reviews by the likes of <a href="http://java.dzone.com/articles/the-top-5-books-i-read-2008" rel="nofollow">Meera Subbarao</a> for some ideas. However, as with many things, if you don't apply what you learn, chances are you'll forget most of it rather quickly.</li>
<li>Attend conferences: This is often where you learn about the cutting-edge stuff you'd never think of investigating otherwise, and it's great for networking as well!</li>
<li>Give a talk at your local JUG: Do a bit of research on a topic that interests you, and share it with your local <a href="http://community.java.net/jugs/listing.csp" rel="nofollow">Java Users Group</a>. Java User Groups are full of cool people (hey, they're just like you!), and won't be critical if you're presentation isn't as polished as it could be. If your don't think you're up to a full-length presentation, talk to your JUG leader about a tidbits session, where several members give short talks (20 minutes or so) about a variety of topics.</li>
</ul>
</p>
<p>There are plenty of ways that you can keep your skills honed, and they don't necessarily require heavy investments of time or money. The key to maintain a regular personal R&amp;D activity going to keep your skills honed. When appropriate, for example at the start of a major project, or for specific needs, you can invest in more expensive options such as face-to-face training or external mentoring services. But, as an ongoing activity, the other techniques described here will help keep you up to date and optimize your marketability. Good luck!
</p>
    ]]></content>
  </entry>
  <entry>
    <title>What&#039;s new in the 2009 Java Power Tools Bootcamps</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/2242" />
    <id>http://www.javaworld.com/community/node/2242</id>
    <published>2009-01-12T13:23:42-05:00</published>
    <updated>2009-01-12T13:23:42-05:00</updated>
    <author>
      <name>john_smart</name>
    </author>
    <summary type="html"><![CDATA[<!--paging_filter--><p>Last year, I had a lot of fun delivering the <a href="http://www.wakaleo.com/training" rel="nofollow" rel="nofollow">Java Power Tools Bootcamps</a> in all sorts of different places, for all sorts of different organisations, and got a lot of very positive feedback. But people often wanted more. So this coming year, I'll be running them again, but in an expanded and updated form.
</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>Last year, I had a lot of fun delivering the <a href="http://www.wakaleo.com/training" rel="nofollow">Java Power Tools Bootcamps</a> in all sorts of different places, for all sorts of different organisations, and got a lot of very positive feedback. But people often wanted more. So this coming year, I'll be running them again, but in an expanded and updated form.
</p>
<p>
The 2008 Java Power Tools bootcamps were tailored for organisations trying to get started with techniques like build automation, TDD and CI. The basic course is quite flexible, however, and the content and level of detail varies from session to session depending on the requirements and preferences of the students. The course is great for shops that still have little or no (or possibly out-of-date) built automation strategies in place (and there are more organisations of this type out there than you might think!). But I've also given the course to organisations and students who are more familiar with the basic concepts and many of the techniques, but who want to get up to speed in other areas (such as Maven 2, BDD, or distributed CI strategies), or who want to get a well-rounded picture of the state of the art in build automation, TDD, BDD, CI, and so forth.
</p>
<p>
One of the great things about the new 5-day format is that it gives more time to cover more advanced topics such as automated release and deployment strategies with <a href="http://maven.apache.org" rel="nofollow">Maven 2</a>, <a href="http://nexus.sonatype.org/" rel="nofollow">Nexus</a> and <a href="https://hudson.dev.java.net/" rel="nofollow">Hudson</a>, advanced multi-module Maven projects, distributed builds, and more advanced TDD and BDD testing strategies.
</p>
<p>Another innovation is the variable-speed labs. The labs start off with fairly simple exercises, and become progressively more complicated and more real-world-like. This lets people do the labs at their own pace. The more advanced exercises are optional, so people can take them home to do after the course if they don't have time during the workshops. At the same time more advanced students get some more realistic exercises to get their teeth into. For example, a lot of time is spent on Test-Driven Development and Behaviour-Driven Development. Labs in this area are often very simple - indeed, they have to start off this way so that people can come to grips with the basic concepts. However, it is nice to see how they apply to cases closer to those you find in the real world. So some of the advanced exercises (and course material) covers things like TDD with web applications, TDD with databases and TDD with legacy code.
</p>
<p>
In the new version of the Bootcamps, we also cover unit and integration testing in <a href="http://groovy.codehaus.org/" rel="nofollow">Groovy</a> and <a href="http://www.joltawards.com/finalists.html" rel="nofollow">JOLT-Award finalist</a> <a href="easyb.org" rel="nofollow">easyb</a> in a fair bit of detail, including web testing (<a href="http://seleniumhq.org/" rel="nofollow">Selenium</a>), database testing (<a href="http://www.dbunit.org/" rel="nofollow">dbunit</a>) using Groovy and easyb, and web service testing using <a href="http://www.soapui.org/" rel="nofollow">SoapUI</a>. We also talk about <a href="http://sonar.codehaus.org/" rel="nofollow">Sonar</a>, a great tool for consolidating code quality metrics in one place.
</p>
<p>
We also cover more advanced CI integration strategies, including scaling CI, using CI with multiple SCM branches, automating deployment to different environments, co-ordinating releases with CI, integrating with tools like trac and JIRA, and so on.
</p>
<p>
I'm really looking forward to this season of bootcamps - I think it will be a lot of fun, and give enough time to both cover the basics and still get into some of the more advanced topics, or, for more advanced students, skim over the basics and concentrate on the advanced material in detail.
</p>
<p>For anyone interested, the course is going to cities in Australia and New Zealand, but also the states (San Francisco in June) and to the UK and Europe (dates currently being organized - stay tuned!). We also do on-site courses, which can be customized somewhat to your particular needs. Check out the details <a href="http://www.wakaleo.com/training" rel="nofollow">here</a>.
</p>
    ]]></content>
  </entry>
</feed>

