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

<channel>
	<title>Mumblings of an Old Man</title>
	<atom:link href="http://crabbake.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://crabbake.wordpress.com</link>
	<description>Half baked ideas on Java and Agile Management</description>
	<lastBuildDate>Thu, 29 Oct 2009 21:02:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='crabbake.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Mumblings of an Old Man</title>
		<link>http://crabbake.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://crabbake.wordpress.com/osd.xml" title="Mumblings of an Old Man" />
	<atom:link rel='hub' href='http://crabbake.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Spring Security 3.0 and JSR-286 Liferay Portlet</title>
		<link>http://crabbake.wordpress.com/2009/10/22/spring-security-3-0-and-jsr-286-liferay-portlet/</link>
		<comments>http://crabbake.wordpress.com/2009/10/22/spring-security-3-0-and-jsr-286-liferay-portlet/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 19:55:26 +0000</pubDate>
		<dc:creator>crabbake</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[application development]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[portlet]]></category>
		<category><![CDATA[liferay]]></category>
		<category><![CDATA[spring security]]></category>
		<category><![CDATA[jsr-286]]></category>

		<guid isPermaLink="false">http://crabbake.wordpress.com/?p=37</guid>
		<description><![CDATA[Overview My current project is using Liferay 5.2.3 as a Portal container and Spring Security 3 to secure portlets. We are not using Liferay&#8217;s built-in permission systems as we expect to deliver our portlets on many different portal platforms. Therefore we decided to use Spring Security, specifically the 3.0 version, as Spring 3 supports the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=37&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>Overview</h2>
<p>My current project is using Liferay 5.2.3 as a Portal container and Spring Security 3 to secure portlets.  We are not using Liferay&#8217;s built-in permission systems as we expect to deliver our portlets on many different portal platforms.  Therefore we decided to use Spring Security, specifically the 3.0 version, as Spring 3 supports the JSR-286 specification.</p>
<p>In the RC1 version of Spring Security 3.0 (SS3), the Portlet jar was dropped that was available in v2.0.5 (spring-security-portlet-2.0.x.jar).  That leaves us with a dilemma when it comes to securing portlets using SS3.  To implement security in a portlet in a JSR-168 context one would have to re-implement everything in the portlet jar to use an interceptor based way of adding an Authentication to the SecurityContext.</p>
<p>Rather than taking that path, Spring 3 supports JSR-286 portlet specification which allows for portlet filters.  Since a common way to implement security is through security filters, a portlet filter method seems like a viable alternative.  There is one main issue with using portlet filters in that Spring cannot be used to create or inject dependencies into the portlet filter.  (Maybe it can but I wasn’t able to get it to work).</p>
<p>Thus, I’ve created a PortletSecurityFilter filter that more or less follows the SS3 security process used in the Servlet side implementation (AbstractAuthenticationProcessingFilter).</p>
<p>What&#8217;s the point of doing this?  Well, we need to deploy our portlet to multiple portal containers.  Thus, if we use SS3 we can easily control our portlet roles and not have to rely on the portal implementation.</p>
<h2>Process</h2>
<p>The whole point of this exercise is to push an Authentication into the SecurityContext for SS3 to use later when verifying Role information.  We’ll create a PortletSecurityFilter to accomplish this push.</p>
<p>Warning, many might think of this as a hack to fool SS3.  If you’re okay with that then keep reading.</p>
<h2>Portlet Lifecycle Location</h2>
<p>The first question is in what portlet lifecycle should the filter live?  That depends but the best location is during the Action Phase.  Adding the filter at this point sets the SecurityContext early enough for both the Action and Render phases meaning SS3 will work for both annotation driven security as well as jsp rendering security.</p>
<h2>PortletSecurityFilter</h2>
<p>Below is the code for the PortletSecurityFilter.  Note that you will have to implement your own AuthenticationDetailsSource and AuthenticationManager for this to work.  You’ll notice this also throws the Authentication token onto the PortletSession for use in later requests.</p>
<pre>package com.your.package.name;

import java.io.IOException;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletSession;
import javax.portlet.filter.ActionFilter;
import javax.portlet.filter.FilterChain;
import javax.portlet.filter.FilterConfig;
import javax.portlet.filter.PortletFilter;

import org.apache.log4j.Logger;
import org.springframework.security.authentication.AuthenticationDetailsSource;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;

/**
 * Implements security behavior for Spring Security 3.0.  Adds an <tt>Authentication</tt> to the
 * <tt>SecurityContext</tt> and to the <tt>PortletSession</tt>.  Spring Security picks up the
 * <tt>Authentication</tt> when it meets annotated methods with the @Secured annotation.
 */
public class PortletSecurityFilter implements PortletFilter, ActionFilter {

    private static Logger logger = Logger.getLogger(PortletSecurityFilter.class);
    private static final String SECURITY_TOKEN = "SECURITY_TOKEN";

    private AuthenticationDetailsSource authenticationDetailsSource = new PortletAuthenticationDetailsSource();
    private AuthenticationManager authenticationManager = new PortletAuthenticationManager();

    @Override
    /**
     * Follow the Spring Security method for an AuthenticationFilter.
     * @see AbstractAuthenticationProcessingFilter
     */
    public void doFilter(ActionRequest request, ActionResponse response, FilterChain chain) throws IOException, PortletException {
	if(request.getUserPrincipal() == null) {
	    // If no UserPrincipal from Portal stop the chain here.
	    return;
	}
	Authentication auth = (Authentication) request.getPortletSession().getAttribute(SECURITY_TOKEN);
	if(auth == null) {
	    PreAuthenticatedAuthenticationToken authToken = new PreAuthenticatedAuthenticationToken(request.getUserPrincipal(), request.getRemoteUser());
	    setDetails(request, authToken);
	    auth = authenticationManager.authenticate(authToken);
	}

        if(auth.isAuthenticated()) {
	    successfulAuthentication(request, response, auth);
	    chain.doFilter(request, response);
	    return;
        }
    }

    /**
     * Default behavior for successful authentication.
     *
     *	Sets the successful Authentication object on the {@link  SecurityContextHolder}
     *	Sets the Authentication onto the PortletSession
     *
     *
     * @see AbstractAuthenticationProcessingFilter
     * @param authResult the object returned from the  <tt>attemptAuthentication</tt> method.
     */
    protected void successfulAuthentication(ActionRequest request, ActionResponse response,
            Authentication authResult) throws IOException, PortletException {

        if (logger.isDebugEnabled()) {
            logger.debug("Authentication success. Updating SecurityContextHolder to contain: " + authResult);
        }
        SecurityContextHolder.getContext().setAuthentication(authResult);

	PortletSession session = request.getPortletSession();
	session.setAttribute(SECURITY_TOKEN, authResult);
    }

    /**
     * Implementation of setDetails.
     *
     * @see UsernamePasswordAuthenticationFilter
     * @param request that an authentication request is being created for
     * @param authRequest the authentication request object that should have its details set
     */
    protected void setDetails(ActionRequest request, PreAuthenticatedAuthenticationToken authRequest) {
        authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
    }

    @Override
    public void destroy() {
	System.out.println("Action filter destroy.");
    }

    @Override
    public void init(FilterConfig arg0) throws PortletException {
	System.out.println("Action filter init.");
    }
}
</pre>
<h2>portlet.xml</h2>
<p>The next step is to add this portlet filter to the portlet.xml file.  After you have declared your portlets, insert the following filter declaration:</p>
<div class="code" style="font-family:monospace;">&lt;filter&gt;</p>
<p>&lt;filter-name&gt;PortletSecurityFilter&lt;/filter-name&gt;<br />
&lt;filter-class&gt;<br />
<span style="text-decoration:underline;">com.your.package.name</span>.PortletSecurityFilter<br />
&lt;/filter-class&gt;<br />
&lt;lifecycle&gt;ACTION_PHASE&lt;/lifecycle&gt;<br />
&lt;init-param&gt;<br />
&lt;name&gt;message&lt;/name&gt;<br />
&lt;value&gt;Security Filter&lt;/value&gt;<br />
&lt;/init-param&gt;<br />
&lt;/filter&gt;<br />
&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;PortletSecurityFilter&lt;/filter-name&gt;<br />
&lt;portlet-name&gt;your-portlet&lt;/portlet-name&gt;<br />
&lt;/filter-mapping&gt;</p>
</div>
<h2>Spring Security 3.0 Configuration</h2>
<p>We have to enable SS3 by creating an applicationContext-security.xml file.  Basically, all we really have to do is enable secure annotations so if you don’t want to create a new file than just throw this into your current applicationContext.xml:</p>
<pre>
&lt;?xml version=<em>"1.0"</em> encoding=<em>"UTF-8"</em>?&gt;
&lt;beans xmlns=<em>"http://www.springframework.org/schema/beans"</em>
xmlns:xsi=<em>"http://www.w3.org/2001/XMLSchema-instance"</em>
xmlns:security=<em>"http://www.springframework.org/schema/security"</em>
xsi:schemaLocation=<em>"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd</em>
<em> http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"</em>

&gt;
&lt;security:global-method-security secured-annotations=<em>"enabled"</em>/&gt;
&lt;security:authentication-manager alias=<em>"authenticationManager"</em> /&gt;

&lt;/beans&gt;
</pre>
<h2>web.xml</h2>
<p>Finally, if you added a new applicationContext than you’ll need to add that to your web.xml as a new contextConfigLocation.  That path will depend on where you put the file but one path might be:</p>
<p>/WEB-INF/context/applicationContext-security.xml</p>
<h2>Add Security</h2>
<p>Now all you need to do is add @Secured notations to your protected services or &lt;security:authorize&gt; tags to your jsp.  Assuming you created an AuthenticationManager that added the proper GrantedAuthorities than your security should now work.</p>
<p>I did this with Liferay portal v5.2.3 and successfully secured my portlet outside of Liferay.  Of course Liferay provides you with methods to expose your portlet permissions and administer them through Liferay control panel but we did not want to use that method.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/crabbake.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/crabbake.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/crabbake.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/crabbake.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/crabbake.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/crabbake.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/crabbake.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/crabbake.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/crabbake.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/crabbake.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/crabbake.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/crabbake.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/crabbake.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/crabbake.wordpress.com/37/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=37&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://crabbake.wordpress.com/2009/10/22/spring-security-3-0-and-jsr-286-liferay-portlet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ab9ceffe69f96914f86014d47009e011?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">crabbake</media:title>
		</media:content>
	</item>
		<item>
		<title>Agile Quality Analyst</title>
		<link>http://crabbake.wordpress.com/2009/10/22/agile-quality-analyst/</link>
		<comments>http://crabbake.wordpress.com/2009/10/22/agile-quality-analyst/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 19:01:06 +0000</pubDate>
		<dc:creator>crabbake</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[application development]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[IT management]]></category>
		<category><![CDATA[qa]]></category>
		<category><![CDATA[quality analyst]]></category>
		<category><![CDATA[quality assurance]]></category>

		<guid isPermaLink="false">http://crabbake.wordpress.com/?p=30</guid>
		<description><![CDATA[Finally, the differences in the QA role for an Agile environment. The Quality Analyst (QA) role in an Agile environment has significant importance.  In Agile, the QA is part of the development team and included from the start of the project.  QA is expected to be as up-to-date on requirements and system state as any [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=30&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Finally, the differences in the QA role for an Agile environment.</p>
<p>The Quality Analyst (QA) role in an Agile environment has significant importance.  In Agile, the QA is part of the development team and included from the start of the project.  QA is expected to be as up-to-date on requirements and system state as any developer.  QA is also continuously reviewing completed tasks and stories to near real-time feedback.  If there is one concept in Agile it is fast and continuous feedback on all fronts, QA is essential for this to become reality.</p>
<p>When running a mixed Agile/Waterfall development environment it can be difficult to engage the QA resources at the correct moment.  Generally QA is accustomed to having some large period of time, say six weeks, at the end of development where they test the entire system.  The argument for this type of testing is that at this point the code is “locked down” and thus they can test the system in peace (not pieces) without worrying about pesky developers changing things on them.  While this is a fine notion, it rarely happens and development often runs over the QA cycle.  Or, more importantly, QA finds issues that simply must be fixed.  In standard QA parlance, the QA team should start their testing from scratch after the changes are made to the code.</p>
<h2>Agile QA</h2>
<p>Agile has the idea of production ready functionality at the end of every iteration.  To do that, QA must be involved at the iteration level and be testing functionality as it develops.  If done correctly, at the end of the iteration the stories and components are ready to deploy to production.  Thus, unless major changes occur, these items only need regression testing from this point forward.</p>
<h2>Embedded QA</h2>
<p>Since QA is part of the development team, they are often co-located with the development team as well.  This gives the QA person a significant advantage, they are present when requirements changes are taking place and can express their opinions in real-time rather than after the fact.  The QA person can also help refine requirements by providing the customer’s view of the application.</p>
<h2>Automated Testing</h2>
<p>Once components are production ready, automated test scripts are created to compile a full suite of regression tests.  These automated tests combined with the developers Unit and Integration tests help ensure that any changes made during the current and future iterations do not adversely affect the previously tested code.</p>
<h2>Deployment to Production</h2>
<p>As with any project, the final push to production is often a hectic and hurried endeavor.  QA is usually under pressure to certify that the application works.  While Agile projects are sometimes (but hopefully not) just as frenzied, the existence of thoroughly tested components, automated QA test and development unit tests help ease the burden on the QA team.  While a full system test is still advisable before deploying to production, since QA has been involved from the beginning and is aware of all requirements modifications that have occurred throughout the life of the project, this task is not as onerous as in non-Agile environments.  There is not a lot of back and forth between QA, development and BAs about requirements changes that were not adequately documented.</p>
<p>Often times the true QA cycle, where code is “frozen”, can be cut down to one to two weeks as the QA team feels very comfortable with where the application is at when the cycle begins.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/crabbake.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/crabbake.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/crabbake.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/crabbake.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/crabbake.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/crabbake.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/crabbake.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/crabbake.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/crabbake.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/crabbake.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/crabbake.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/crabbake.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/crabbake.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/crabbake.wordpress.com/30/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=30&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://crabbake.wordpress.com/2009/10/22/agile-quality-analyst/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ab9ceffe69f96914f86014d47009e011?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">crabbake</media:title>
		</media:content>
	</item>
		<item>
		<title>Agile Business Analyst</title>
		<link>http://crabbake.wordpress.com/2009/07/23/agile-business-analyst/</link>
		<comments>http://crabbake.wordpress.com/2009/07/23/agile-business-analyst/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 21:47:57 +0000</pubDate>
		<dc:creator>crabbake</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[business analyst]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[IT management]]></category>

		<guid isPermaLink="false">http://crabbake.wordpress.com/2009/07/23/agile-business-analyst/</guid>
		<description><![CDATA[This post is meant to highlight the differences in the BA role in an Agile environment. The Business Analyst role changes significantly in the Agile process.  Rather than doing all the requirements gathering up front and handing off the document to development, the BA becomes an essential part of the Agile team.  Often times this [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=29&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This post is meant to highlight the differences in the BA role in an Agile environment.</p>
<p>The Business Analyst role changes significantly in the Agile process.  Rather than doing all the requirements gathering up front and handing off the document to development, the BA becomes an essential part of the Agile team.  Often times this role is called the on-site customer or subject matter expert.</p>
<p>While the concept is great, the reality is that likely the BA has more than just this project on their plate and cannot devote 100% of their time to the project once it has begun.  This is fine as once the main portion of the requirements have been specified, the BA workload goes down but gets far more important.  While in the requirements gathering phase, if the BA has to take time to do other tasks, no one is really affected by the lost time.  If however, during the development phase the BA becomes unavailable, the project can be severely affected.</p>
<h2>Availability is the Key</h2>
<p>The BA can work on other issues if s/he is available to answer questions and make decisions in real-time for the project in progress.  The other main deliverable is requirements for the upcoming iteration.  As long as these two responsibilities are maintained, the development team will not notice that the BA is working more than one project.</p>
<h2>Drive the Sports Car</h2>
<p>Another new notion to BAs who wind up on Agile projects is the ability to control the direction of the project while it is in progress.</p>
<p>In the waterfall world, the project was much like launching a rocket, the BA loaded the payload with requirements, set the fuse, and blasted off the development.  Then they stepped back and either admired their great work hitting its target directly at some predetermined point in the future, or more likely they saw their rocket swerve off course and blow up in the ocean.  There was little to no control over the project and they didn’t even believe it was necessary.</p>
<p>With Agile, it is akin to stepping behind the wheel of sports car, in the right hands the car can perform wonders, in the wrong hands you still fly off the road, down a cliff, and crash into the ocean.  However, given proper fuel at appropriate times, gently nudged in the correct direction while accelerating quickly (but controlled), soon you’re cruising at 150 MPH and can make minute adjustments to keep you on the right track.</p>
<h2>BA Role</h2>
<p>What does all this mean for the BA role?  Essentially the BA is responsible for requirements and business decisions.  Requirements are tracked through the ALM system and should be in place a few days before iteration planning begins.  The BA also prioritizes requirements by their business value so the development team knows what is most important.  The BA should always be ahead of the development team and always available for questions.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/crabbake.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/crabbake.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/crabbake.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/crabbake.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/crabbake.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/crabbake.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/crabbake.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/crabbake.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/crabbake.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/crabbake.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/crabbake.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/crabbake.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/crabbake.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/crabbake.wordpress.com/29/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=29&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://crabbake.wordpress.com/2009/07/23/agile-business-analyst/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ab9ceffe69f96914f86014d47009e011?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">crabbake</media:title>
		</media:content>
	</item>
		<item>
		<title>Agile Project Manager Role</title>
		<link>http://crabbake.wordpress.com/2009/07/14/agile-project-manager-role/</link>
		<comments>http://crabbake.wordpress.com/2009/07/14/agile-project-manager-role/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 18:23:58 +0000</pubDate>
		<dc:creator>crabbake</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[IT management]]></category>
		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://crabbake.wordpress.com/?p=26</guid>
		<description><![CDATA[I recently was asked to describe the Agile Project Manager role to management.  This is what came out. The Project Manager (PM) role in an Agile environment is significantly different than in other development environments.  In most environments the PM role is a team leader who has control over all aspects of the development process.  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=26&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently was asked to describe the Agile Project Manager role to management.  This is what came out.</p>
<p>The Project Manager (PM) role in an Agile environment is significantly different than in other development environments.  In most environments the PM role is a team leader who has control over all aspects of the development process.  Sorry to say that on an Agile project the PM is no longer the team leader but is a team member.  This is actually a good thing as the PM has a much more significant role than before in that their job is to ensure the team has a smooth road ahead of them and deflect any destabilizing forces.  No more will you have to file a report explaining why developer X took three hours to complete a task when the estimate was two hours.  No longer will you waste everyone’s time trying to “motivate” developers to work “smarter” while they look at you as if you were a crazy ranting lunatic.  Instead, the developers are self-motivated and inherently work productively.  They oftentimes will needle you as to what value you delivered today.</p>
<p>A quick review would likely help the PM acclimate to their new role.  For starters, since developers self-manage the tasks they work on, it is impossible to schedule individual developers to individual tasks.  So project plans simply become high level timeframes and milestones rather than highly detailed resource management schedules that are never realized.  Also, since all the work tasks are not known up front, it is again impossible to create a meaningful detailed project plan.</p>
<p>Now that all your time has been freed up from updating a project plan with what actually happened (backward looking) it is time to start looking forward and determining what problems will occur in the immediate, near-term and long-term timeframes that can be “managed” away.</p>
<p>The first problem is to ensure an adequate, properly prioritized flow of requirements (stories) to the development team at the appropriate times.  Ideally, within an iteration based development team, enough stories to fill an iteration (plus a few extra) should be ready at least a couple days before the iteration begins.  It is your role to ensure that the requirements meetings take place, that prioritizations are in place and communicated, and that the ALM system is updated with the stories before iteration planning begins.</p>
<p>The second problem is usually around deployment and testing environments.  These usually require a large amount of time that occupies a developer in ensuring that environments are configured correctly, fixing issues and meeting with infrastructure engineers to ensure the development team’s needs are met.  The PM should take over the management of this process and only involve the development team when technical questions need answers.  Here is a where a traditional project plan can be helpful since infrastructure is usually more of a linear, step by step process.</p>
<p>The third problem is really an abstraction of the second problem, dealing with outside group integrations.  Since it is unlikely that outside groups are working in an Agile fashion, they will likely require project plans and many meetings to perform integrations with the new development project.  Again, the PM can take over the interactions with outside groups, supply project plans and ensure that the outside group’s timeframe matches the agile project’s timeframe.  Exact timeframe matchups are unlikely but getting within a few days (or weeks)  is usually possible.</p>
<p>The final problem may actually be the largest problem and that is managing the project scope.  Since no large planning effort occurred up front, it often seems simple to add new requirements and pile on functionality.  The PM needs to act as a gateway through which work not related to the project fails to pass through.  Similarly, the PM must ensure that changes to requirements are adequately estimated and prioritized, and that if new requirements are prioritized into a release, than an equal amount of existing requirements are prioritized out of a release (or some other accommodation made).</p>
<p>Remember, the PM role is no longer where are you at today and how does that affect the schedule for I am the supreme leader of the team, but instead it is how have I contributed to team today and what problems are out on the horizon that need to be planned for now to minimize their risks.  If the PM does their job correctly, the development team will run like clockwork, iteration to iteration on to deployment of releases and won’t even mind that the PM is there.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/crabbake.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/crabbake.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/crabbake.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/crabbake.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/crabbake.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/crabbake.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/crabbake.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/crabbake.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/crabbake.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/crabbake.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/crabbake.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/crabbake.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/crabbake.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/crabbake.wordpress.com/26/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=26&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://crabbake.wordpress.com/2009/07/14/agile-project-manager-role/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ab9ceffe69f96914f86014d47009e011?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">crabbake</media:title>
		</media:content>
	</item>
		<item>
		<title>Don&#8217;t mess with conventions in Grails</title>
		<link>http://crabbake.wordpress.com/2009/05/01/dont-mess-with-conventions-in-grails/</link>
		<comments>http://crabbake.wordpress.com/2009/05/01/dont-mess-with-conventions-in-grails/#comments</comments>
		<pubDate>Fri, 01 May 2009 14:41:37 +0000</pubDate>
		<dc:creator>crabbake</dc:creator>
				<category><![CDATA[Grails and Groovy]]></category>

		<guid isPermaLink="false">http://crabbake.wordpress.com/?p=23</guid>
		<description><![CDATA[We&#8217;ve been slowly ramping up on Grails and have learned not to mess with the conventions.  I was trying to create a thread and did not put it into the services directory.  Therefore, no access to dynamically injected objects such as &#8220;log&#8221;.  Also don&#8217;t get autowiring for services.  To fix this, you have to move [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=23&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve been slowly ramping up on Grails and have learned not to mess with the conventions.  I was trying to create a thread and did not put it into the services directory.  Therefore, no access to dynamically injected objects such as &#8220;log&#8221;.  Also don&#8217;t get autowiring for services.  To fix this, you have to move the class to the services directory and end the class name with Service.  Just being in the services directory is not enough.</p>
<p>Any way to tell grails to treat individual classes as a &#8220;Service&#8221;?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/crabbake.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/crabbake.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/crabbake.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/crabbake.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/crabbake.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/crabbake.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/crabbake.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/crabbake.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/crabbake.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/crabbake.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/crabbake.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/crabbake.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/crabbake.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/crabbake.wordpress.com/23/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=23&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://crabbake.wordpress.com/2009/05/01/dont-mess-with-conventions-in-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ab9ceffe69f96914f86014d47009e011?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">crabbake</media:title>
		</media:content>
	</item>
		<item>
		<title>Eclipse and Tomcat 6 Context error</title>
		<link>http://crabbake.wordpress.com/2009/04/27/eclipse-and-tomcat-6-context-error/</link>
		<comments>http://crabbake.wordpress.com/2009/04/27/eclipse-and-tomcat-6-context-error/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 21:49:38 +0000</pubDate>
		<dc:creator>crabbake</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[context]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[org.eclipse.jst.j2ee.server]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://crabbake.wordpress.com/?p=16</guid>
		<description><![CDATA[After spending half a day trying to figure out why Eclipse 3.4 Ganymede and Tomcat 6.0.18 were not working well together, finally the easy answer. If you receive this message when Tomcat starts through Eclipse: WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property &#8216;source&#8217; to &#8216;org.eclipse.jst.j2ee.server:YOURAPPXXXXX&#8217; did not find a matching property. Then follow the simple steps to fix [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=16&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>After spending half a day trying to figure out why Eclipse 3.4 Ganymede and Tomcat 6.0.18 were not working well together, finally the easy answer.</p>
<p>If you receive this message when Tomcat starts through Eclipse:</p>
<p>WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property &#8216;source&#8217; to &#8216;org.eclipse.jst.j2ee.server:YOURAPPXXXXX&#8217; did not find a matching property.</p>
<p>Then follow the simple steps to fix it.</p>
<ol>
<li>Double click on your Tomcat from the Servers view to open the Tomcat editor window.</li>
<li>Under Server Options on the lower left, click the checkbox for <em>Publish module contexts to separate XML files</em></li>
<li>Save and restart.</li>
<li>Hopefully this fixes your problem.</li>
</ol>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/crabbake.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/crabbake.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/crabbake.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/crabbake.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/crabbake.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/crabbake.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/crabbake.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/crabbake.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/crabbake.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/crabbake.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/crabbake.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/crabbake.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/crabbake.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/crabbake.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=16&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://crabbake.wordpress.com/2009/04/27/eclipse-and-tomcat-6-context-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ab9ceffe69f96914f86014d47009e011?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">crabbake</media:title>
		</media:content>
	</item>
		<item>
		<title>Conformance vs. Performance</title>
		<link>http://crabbake.wordpress.com/2009/04/16/10/</link>
		<comments>http://crabbake.wordpress.com/2009/04/16/10/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 15:54:59 +0000</pubDate>
		<dc:creator>crabbake</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[application development]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[IT management]]></category>

		<guid isPermaLink="false">http://crabbake.wordpress.com/?p=10</guid>
		<description><![CDATA[I&#8217;m currently decompressing from a year+ spent directing development teams within a very large health insurance company.  While we tried pretty hard to be Agile, the weight of poorly designed and loosely followed processes eventually had their way and made developing and delivering business value a depressing endeavor. Upon reflection, it came down to one [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=10&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m currently decompressing from a year+ spent directing development teams within a very large health insurance company.  While we tried pretty hard to be Agile, the weight of poorly designed and loosely followed processes eventually had their way and made developing and delivering business value a depressing endeavor.</p>
<p>Upon reflection, it came down to one thing, the development groups that attempted to conform to the Universal (Waterfall) process basically got nowhere and had large numbers of developers creating very little besides documentation.   Conformance with the process led to poor performance.</p>
<p>My group bypassed the process and treated it more like an interface, we delivered all the required documents in the process to the minimum possible acceptable level.  We also insisted that the product/business groups participate in the development process by coming to the daily standup and spending some time in the dev lab.  Our group was acknowledged throughout the division as having high performance.</p>
<p>My conversation with my manager about the way my team works at my review:</p>
<p>Manger:  Your group can continue to use its development process as long as you conform to the Universal process.</p>
<p>Me: We are conforming to the Universal process, we delivered all the required documents necessary to deploy the application to production.</p>
<p>Manger: That&#8217;s true, but you didn&#8217;t conform to the process.</p>
<p>Me: I can&#8217;t conform to the process and continue to use our Agile processes, they&#8217;re incompatible.</p>
<p>Manager: Than you&#8217;d better learn to conform to the Universal process.</p>
<p>Me:  You just said I could continue to use our Agile processes, but we can&#8217;t do that if we have to wait months for perfect requirements and then be unable to communicate with our business partners.</p>
<p>Manager:  It will be in your best interest.</p>
<p>Me:  I understand.</p>
<p>So what I realized was upper level management didn&#8217;t care much for performance if it didn&#8217;t follow their development process.  I can understand that theorhetically, but everyone knew we were under the gun to deliver a massive project by 1/1/09 that if it failed the company was likely to lose a Fortune 50 client.  Using the Universal process would never have worked and everyone looked the other way while we cranked out the app.  Then on judgement day you get knocked for not following the process.</p>
<p>Advice:  if you want to further your career as a manager in a large company, conform to the processes and use your excuses that no one else delivered for the reason your team didn&#8217;t perform.  All those people got promotions this year.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/crabbake.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/crabbake.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/crabbake.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/crabbake.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/crabbake.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/crabbake.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/crabbake.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/crabbake.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/crabbake.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/crabbake.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/crabbake.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/crabbake.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/crabbake.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/crabbake.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=10&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://crabbake.wordpress.com/2009/04/16/10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ab9ceffe69f96914f86014d47009e011?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">crabbake</media:title>
		</media:content>
	</item>
		<item>
		<title>Coming up to speed on grails in 3 days</title>
		<link>http://crabbake.wordpress.com/2009/04/15/coming-up-to-speed-on-grails-in-3-days/</link>
		<comments>http://crabbake.wordpress.com/2009/04/15/coming-up-to-speed-on-grails-in-3-days/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 21:56:01 +0000</pubDate>
		<dc:creator>crabbake</dc:creator>
				<category><![CDATA[Grails and Groovy]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://crabbake.wordpress.com/?p=6</guid>
		<description><![CDATA[Having done little but work on Java EE apps for the past nine years, I recently found myself leading a team of Java developers creating a Grails messaging application.   Steps for experienced Java developers to get up to speed on Grails in 3 days: Day 1: 1) Find a Grails book such as this [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=6&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Having done little but work on Java EE apps for the past nine years, I recently found myself leading a team of Java developers creating a Grails messaging application.  </p>
<p>Steps for experienced Java developers to get up to speed on Grails in 3 days:</p>
<p>Day 1:</p>
<p>1) Find a Grails book such as this free online book (http://www.infoq.com/minibooks/grails) or the one I used(http://www.amazon.com/Definitive-Grails-Second-Experts-Development/dp/1590599950/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1239831441&amp;sr=1-1).</p>
<p>2) Follow the directions to get Grails installed on your system.  I&#8217;m assuming you already have a Java workspace built out likely using Eclipse or IntelliJ.</p>
<p>3) Realize that Grails is built on Groovy, a scripting language, and its purpose is to either generate your code for you or generate it dynamically at runtime.</p>
<p>Day 2:</p>
<p>1) Start running through the book, you should probably be able to work through all the relevant examples to building a web application in about a day.</p>
<p>2) Came to the realization that you could have all your domain validation embedded in the domain object extremely easily.  Cool, something I&#8217;ve always wanted.  </p>
<p>Day 3:</p>
<p>1) Start writing your own app.</p>
<p>2) Get your head around conventions being the way everything is done.  Learning the conventions and getting used to them is the hardest part.</p>
<p>3) Be amazed by how fast you can build out a domain and CRUD view/edit screens.</p>
<p>Now it&#8217;s really that simple.  Maybe later this week we&#8217;ll see how difficult it is if you want to make customizations to all this generated code.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/crabbake.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/crabbake.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/crabbake.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/crabbake.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/crabbake.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/crabbake.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/crabbake.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/crabbake.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/crabbake.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/crabbake.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/crabbake.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/crabbake.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/crabbake.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/crabbake.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=crabbake.wordpress.com&amp;blog=7308517&amp;post=6&amp;subd=crabbake&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://crabbake.wordpress.com/2009/04/15/coming-up-to-speed-on-grails-in-3-days/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ab9ceffe69f96914f86014d47009e011?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">crabbake</media:title>
		</media:content>
	</item>
	</channel>
</rss>
