<?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/"
	>

<channel>
	<title>ThotSpots &#187; Software Development</title>
	<atom:link href="http://www.thotspots.com/category/blog/dev/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thotspots.com</link>
	<description>Agile Software Development</description>
	<lastBuildDate>Wed, 09 Sep 2009 18:13:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Demystifying Domain-Specific-Languages (DSL)</title>
		<link>http://www.thotspots.com/demystifying-domain-specific-languages-dsl/</link>
		<comments>http://www.thotspots.com/demystifying-domain-specific-languages-dsl/#comments</comments>
		<pubDate>Mon, 04 May 2009 01:45:47 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=194</guid>
		<description><![CDATA[Groovy supports creating Domain Specific Languages.  A DSL is simply a mini programming language tailored to a specific situation or domain.  The idea is to hide the characteristics of the underlying programming language as much as possible (in this case, Groovy/Java), and let the vocabulary of the application domain shine through.
DSLs are nothing [...]]]></description>
			<content:encoded><![CDATA[<p>Groovy supports creating Domain Specific Languages.  A DSL is simply a mini programming language tailored to a specific situation or domain.  The idea is to hide the characteristics of the underlying programming language as much as possible (in this case, Groovy/Java), and let the vocabulary of the application domain shine through.</p>
<p>DSLs are nothing new.  Just by encapsulating the concepts of a domain in classes (&#8221;domain objects&#8221;) and by defining the methods on those classes that act on them (&#8221;actions&#8221; and &#8220;messages&#8221;), you create a DSL of sorts.  You see this a lot in unit testing.  As a body of unit tests evolves, common SetUp and TearDown code is often extracted to avoid duplication.  As the extracted classes and methods grow and evolve, a DSL emerges. For an excellent example of this, see <a href="http://www.amazon.com/gp/product/0132350882?ie=UTF8&amp;tag=thotspots-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0132350882">Clean Code: A Handbook of Agile Software Craftsmanship</a><img style="border:none !important; margin:0px !important;" src="http://www.assoc-amazon.com/e/ir?t=thotspots-20&amp;l=as2&amp;o=1&amp;a=0132350882" border="0" alt="" width="1" height="1" /> by Robert Martin.</p>
<p>Groovy accomplishes the creation of DSLs in a number of ways:<br />
<span id="more-194"></span></p>
<ol>
<li><strong>Optional Syntax:</strong> In Groovy, much of the syntax is optional:  semicolons at the end of statements when they are the only statement on the line, parenthesis around arguments in a method call, etc.  Dropping away such &#8220;noise&#8221; is one way that the user can then focus on the domain at hand.</li>
<li><strong>Missing-Method Methods:</strong> In Java, if you call a method that does not exist, you get a compiler error.  In Groovy, it waits until runtime to decide if it&#8217;s a problem, giving the class with the missing method a chance to make up a method on the spot.  This is done with a special &#8220;missing-method method.&#8221;  For example, this is how GORM allows you to make up method calls like findByPersonAndJobTitle().  There&#8217;s a missing-method method that knows how to parse out the name, &#8220;findByPersonAndJobTitle&#8221;  see that it&#8217;s comprised of pieces it understands (a find action and two field names) and thereby construct the logic to perform that action.</li>
<li><strong>Operator overloading:</strong> Groovy allows you to define methods that correspond to the various operators, like plus() for the + sign.  This means your DSL could allow for expression like &#8220;car = chassis + 4 * tires&#8221; and &#8220;truck = (cab + 6 * tires) + (trailer + 4 * tires) + (trolley + 4 * tires) + (trailer + 4 * tires)&#8221;</li>
<li><strong>Named Parameters:</strong> Grails has the ability to emulate named-parameters (which means that having to know the order in which to pass parameters is no longer a concern).  This is done by defining the method to accept a single map as a parameter.  Then, in the call, a map is created on the fly with hard-coded keys that look like parameter names, and expressions that are the corresponding arguments.  Leave out the optional square brackets that normally enclose a map constant, and wallah! Named parameters:</li>
<li><strong>Closures:</strong> Groovy&#8217;s strong support for Closures means it&#8217;s easy to define custom control structures</li>
<li><strong>Categories, MetaClasses, and GroovyObject:</strong> Without going into details, these are some of the core facilities in Groovy that make it a dynamic &#8220;scripting&#8221; language and so suitable for expressing DSLs</li>
</ol>
<p><strong>Builders:</strong><br />
The most common use of DSLs in Grails is the idiomatic &#8220;builder.&#8221;  This is for when there is a distinct hierarchy, or tree-structure to the elements of the domain.  There are pre-defined builders for Swing, XML, HTTP, Hibernate Criteria, HTML, ANT, and the Constraints builder in Grails that drives the validation mechanism, just to name a few.  It&#8217;s easy to create your own builders as well.</p>
<p>With the groovy.xml.MarkupBuilder(), for example, instead of having to write your own XML&#8230;</p>
<pre>&lt;stocks&gt;
  &lt;stock symbol='JAVA'&gt;
    &lt;quote day='Mon' price="53.125" /&gt;
    &lt;quote day='Tue' price="54.5" /&gt;
    &lt;quote day='Wed' price="51.75" /&gt;
  &lt;/stock&gt;
  &lt;stock symbol='MSFT' /&gt;
  &lt;stock symbol='IBM' /&gt;
&lt;/stocks&gt;</pre>
<p>You can express the information like this:</p>
<pre>builder.stocks {
    stock(symbol: 'JAVA') {
        quote(day: 'Mon', price: 53.125)
        quote(day: 'Tue', price: 54.5)
        quote(day: 'Wed', price: 51.75)
    }
    stock(symbol: 'MSFT')
    stock(symbol: 'IBM' )
}</pre>
<p>At first glance, it might seem like you&#8217;re just trading one arbitrary syntax for another: parenthesis, braces, colons and commas, rather than angle-brackets, equal signs, and  matched-up start and end tags.  However, this is merely a dumbed-down example.  The benefits of using a builder are enormous:</p>
<p>For one thing, the Builder syntax is universal.  Once you know who to write XML markup using Builder syntax, you also know how to write HTML markup, Swing forms, Grails criteria, and all of the other pre-defined builders mentioned above, and more .</p>
<p>Also, since Builder syntax is built on top of Groovy, Groovy code can be intermixed with the DSL code.  For example, we can use each-loops to build the XML markup from a &#8220;tickerInfo&#8221; object:</p>
<pre>builder.stocks {
    tickerInfo.each {ticker -&gt;
        stock(symbol: ticker.symbol) {
            ticker.dailyQuotes.each{
                quote(day: it.day, price: it.price)
            }
        }
    }
}</pre>
<p>DSLs are a key reason for the success of Grails.  Taking advantage of Groovy&#8217;s DSL support is a prime example of how much thought has gone into the architecture Grails with it&#8217;s prime directive to be as idiomatic-Grails as possible.</p>
<p>We&#8217;ve only just scratched the surface of what DSLs are and how they are supported in Groovy.  Here is some recommended further reading:</p>
<ul>
<li><a href="http://docs.codehaus.org/display/GROOVY/Writing+Domain-Specific+Languages" target="_blank">docs.codehaus.org/display/GROOVY/Writing+Domain-Specific+Languages</a></li>
<li><a href="http://docs.codehaus.org/display/GROOVY/How+Builders+Work" target="_blank">How Builders Work</a></li>
<li><a href="http://www.amazon.com/gp/product/0132350882?ie=UTF8&amp;tag=thotspots-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0132350882">Clean Code: A Handbook of Agile Software Craftsmanship</a><img style="border:none !important; margin:0px !important;" src="http://www.assoc-amazon.com/e/ir?t=thotspots-20&amp;l=as2&amp;o=1&amp;a=0132350882" border="0" alt="" width="1" height="1" /> by Robert Martin</li>
</ul>
<p><strong>Related articles:</strong></p>
<ul>
<li><a href="http://www.thotspots.com/clean-code-book/" target="_blank">A brief review of <em>Clean Code</em></a></li>
<li><a href="http://www.thotspots.com/everythings-groovy/" target="_blank">Everything&#8217;s Groovy</a></li>
<li><a href="http://www.thotspots.com/ides-for-groovygrails/" target="_blank">IDEs for Groovy/Grails</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/demystifying-domain-specific-languages-dsl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrum and XP Books for Getting Started</title>
		<link>http://www.thotspots.com/scrum-and-xp-books-for-getting-started/</link>
		<comments>http://www.thotspots.com/scrum-and-xp-books-for-getting-started/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 05:49:50 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[Agile development]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/scrum-and-xp-books-for-getting-started/</guid>
		<description><![CDATA[For any programmer who wants to learn the particulars of Scrum (short of attending a Scrum training seminar, that is), if you are already somewhat familiar with agile practices like XP, then probably the best place to start is with Ken Schwaber&#8217;s second book, Agile Project Management with Scrum.
Schwaber&#8217;s first book, Agile Software Development with [...]]]></description>
			<content:encoded><![CDATA[<p>For any programmer who wants to learn the particulars of Scrum (short of attending a Scrum training seminar, that is), if you are already somewhat familiar with agile practices like XP, then probably the best place to start is with Ken Schwaber&#8217;s second book, <a href="http://www.amazon.com/gp/product/073561993X?ie=UTF8&#038;tag=thotspots-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=073561993X">Agile Project Management with Scrum</a><img src="http://www.assoc-amazon.com/e/ir?t=thotspots-20&#038;l=as2&#038;o=1&#038;a=073561993X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.</p>
<p>Schwaber&#8217;s first book, <a href="http://www.amazon.com/gp/product/0130676349?ie=UTF8&#038;tag=thotspots-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0130676349">Agile Software Development with Scrum</a><img src="http://www.assoc-amazon.com/e/ir?t=thotspots-20&#038;l=as2&#038;o=1&#038;a=0130676349" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, is more of a reference book than a how-to.  It describes what Scrum is, but not so much the nuances of how to use it. <span id="more-164"></span> The second book includes a reference section in the back that pretty much recaps the first book.  So, start there.  If a pass through the reference section makes sense to you, then proceed directly with the second book.  Otherwise, pick up the first book as well and use it to get up to speed.</p>
<p>If you are not yet up to speed on XP, the quintessential tome, <a href="http://www.amazon.com/gp/product/0321278658?ie=UTF8&#038;tag=thotspots-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0321278658">Extreme Programming Explained: Embrace Change (2nd Edition)</a><img src="http://www.assoc-amazon.com/e/ir?t=thotspots-20&#038;l=as2&#038;o=1&#038;a=0321278658" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> by Kent Beck, is still the best starting place.  I&#8217;d recommend reading that before reading up on Scrum.  As you do, just keep in mind that Scrum essentially replaces and expands upon the XP &#8220;planning game.&#8221;  Don&#8217;t skip reading about the planning game.  Just understand that if you have questions about how the planning game works in the real world, hold those questions until you get to Scrum.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/scrum-and-xp-books-for-getting-started/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Clean Code&#8221; &#8212; Crafting On Principles</title>
		<link>http://www.thotspots.com/clean-code-book/</link>
		<comments>http://www.thotspots.com/clean-code-book/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 21:26:00 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[complexity]]></category>
		<category><![CDATA[design principles]]></category>
		<category><![CDATA[naming conventions]]></category>
		<category><![CDATA[Robert Martin]]></category>
		<category><![CDATA[simplicity]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=109</guid>
		<description><![CDATA[I&#8217;ve been reading &#8220;Clean Code: A Handbook of Agile Software Craftsmanship&#8221; by Robert Martin.  This is no ordinary book on writing better software.  It&#8217;s not just a rehash of &#8220;Code Complete&#8221; or &#8220;The Pragmatic Programmer.&#8221;  Those are both fine books, but &#8220;Clean Code&#8221; is different.  So, please don&#8217;t think that if [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been reading &#8220;<a href="http://www.amazon.com/gp/product/0132350882?ie=UTF8&#038;tag=thotspots-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0132350882">Clean Code: A Handbook of Agile Software Craftsmanship</a><img src="http://www.assoc-amazon.com/e/ir?t=thotspots-20&#038;l=as2&#038;o=1&#038;a=0132350882" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />&#8221; by Robert Martin.  This is no ordinary book on writing better software.  It&#8217;s not just a rehash of &#8220;Code Complete&#8221; or &#8220;The Pragmatic Programmer.&#8221;  Those are both fine books, but &#8220;Clean Code&#8221; is different.  So, please don&#8217;t think that if you&#8217;ve read one, you&#8217;ve read them all.</p>
<p>In Clean Code, Martin doesn&#8217;t just name the best practices we should all be following.  He explains the reasoning behind each one and gives names to the concepts.  Just as the idea of software design patterns revolutionized the way we think and talk about software architecture, Martin&#8217;s exploration of day-to-day coding habits gives us a smarter way to think and talk about that.</p>
<p>Case in point: Clean Code kicks off with the practice of giving your objects meaningful names.  One aspect of this is that good names do not require anyone who might read your code in the future to have to perform any &#8220;mental mappings.&#8221;  Here&#8217;s an example of this that I came across just the other day.<span id="more-109"></span></p>
<pre>var ld = new LoginData();</pre>
<p>Look carefully, that&#8217;s a lower-case <span style="font-family: courier new,courier,monospaced">L</span>.  At first glance, it looks like a capital <span style="font-family: courier new,courier,monospaced">I</span>, as in &#8220;ID,&#8221; as in &#8220;identifier.&#8221;  I don&#8217;t know how long I spent confused about how a class constructor could be returning an identifier when reading through this code for first time.  Maybe ten or fifteen seconds?  Time in which I was completely distracted from understanding the rest of the code, having pushed that problem onto the stack, as it were, in order to first solve this mini-problem.</p>
<p>Even without the <span style="font-family: courier new,courier,monospaced">I</span> vs. <span style="font-family: courier new,courier,monospaced">L</span> confusion, using an abbreviated variable name meant that whenever I came across it, I had to keep reminding myself that it stood for an instance of LoginData.  That may not seem like a big deal, but we humans only have so much stack space before we run out of short-term memory.  When a program is full of one- and two-letter variable names that must be continually translated mentally, it leaves no room for thinking about the actual problem that the program is trying to solve.</p>
<p>All of this could have been avoided if the name was spelled out to begin with, so I changed it (using the automated rename refactoring tool in my IDE):</p>
<pre>var loginData = new LoginData();</pre>
<p>&#8220;One difference between a smart programmer and a professional programmer is that the professional programmer understands that clarity is king.  Professionals use their powers for good and write code that others can understand.&#8221; ~ Robert (Uncle Bob) Martin</p>
<p>Martin could have just said, &#8220;don&#8217;t use abbreviations in variables names, because you&#8217;ll make the reader translate it in his head every time he reads it,&#8221; and that would have been terrific advice alone.  But what he really gives you is a deep understanding of the key principles involved, so that you won&#8217;t need to memorize a bunch of arbitrary coding standards in order to write cleaner code.  Instead, you&#8217;ll be armed with a few simple, understandable principles to guide you, with clean code being the natural outcome.</p>
<p>Clean Code is a must-read for everyone in the software profession &#8212; from college freshmen on up to CTOs &#8212; especially anyone who finds himself out of work in this economy (or worried about the possibility).  Learning to write clean code, and thus to write more valuable code, is probably the single most effective thing you can do for yourself. Programmers are expensive resources.  The work we produce is costly.  It&#8217;s up to us to treat it with the respect it deserves, to try and make it as valuable as possible, and to maintain that value as long as possible.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/clean-code-book/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Everything&#8217;s Groovy</title>
		<link>http://www.thotspots.com/everythings-groovy/</link>
		<comments>http://www.thotspots.com/everythings-groovy/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 09:21:20 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Architecture and Design]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[web frameworks]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=97</guid>
		<description><![CDATA[One of the major benefits of using Grails as a web platform is how almost everything can be written in a single language &#8212; Groovy.  No more switching gears between language constructs.  Everything&#8217;s Groovy.
Groovy is most definitely the star of the Grails show.  Every decision that went into formulating Grails started with, &#8220;What&#8217;s the [...]]]></description>
			<content:encoded><![CDATA[<p>One of the major benefits of using Grails as a web platform is how almost everything can be written in a single language &#8212; Groovy.  No more switching gears between language constructs.  Everything&#8217;s Groovy.</p>
<p><span id="more-97"></span>Groovy is most definitely the star of the Grails show.  Every decision that went into formulating Grails started with, &#8220;What&#8217;s the Groovy take on this? How can we best take advantage of the innate ability of Groovy to solve this?&#8221;  This attitude makes for a framework that&#8217;s powerful, yet minimal and consistent.</p>
<p>This attitude also goes beyond the Web framework.  Groovy can be used end-to-end from inside the web server pages to the outer build scripts and even your shell scripts.  In the Java world, before Grails came along, one would have to work in seven different languages to build a web app.  Grails potentially reduces that to three:</p>
<table border="1" cellspacing="1" cellpadding="1" width="90%" align="center">
<tbody>
<tr align="left" valign="top">
<th>Aspect<br/>&nbsp;</th>
<th>Any other Java Web Framework (e.g. JSP/Struts)</th>
<th>Grails Way</th>
</tr>
<tr align="left" valign="top">
<td>Business Logic</td>
<td>Java</td>
<td>Groovy</td>
</tr>
<tr align="left" valign="top">
<td>Web Pages</td>
<td>An arbitrary expression language such as EL or OGNL</td>
<td>Groovy</td>
</tr>
<tr align="left" valign="top">
<td>Data Access</td>
<td>Hibernate HQL, SQL, or Java</td>
<td>Groovy (GORM)</td>
</tr>
<tr align="left" valign="top">
<td>Client-Side Scripting</td>
<td>JavaScript</td>
<td>JavaScript</td>
</tr>
<tr align="left" valign="top">
<td>Style Sheets</td>
<td>CSS</td>
<td>CSS</td>
</tr>
<tr align="left" valign="top">
<td>Build Scripts</td>
<td>XML (Ant)</td>
<td>Groovy (GANT)</td>
</tr>
<tr align="left" valign="top">
<td>Shell Scripts</td>
<td>Linux bash scripts or Windows batch files</td>
<td>Groovy (shebang)</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/everythings-groovy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuring a Grails App for Logging</title>
		<link>http://www.thotspots.com/configuring-a-grails-app-for-logging/</link>
		<comments>http://www.thotspots.com/configuring-a-grails-app-for-logging/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 21:26:46 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[log4j]]></category>
		<category><![CDATA[logging]]></category>

		<guid isPermaLink="false">http://www.maximsc.com/configuring-a-grails-app-for-logging/</guid>
		<description><![CDATA[For any standard Grails app, the error log is called stacktrace.log by default.  On some servers, it ends up in the config folder (rather than the logs folder) by default, so it&#8217;s hard to find.  Also, with a fixed name, all apps running on the same server would share the same log.  [...]]]></description>
			<content:encoded><![CDATA[<p>For any standard Grails app, the error log is called stacktrace.log by default.  On some servers, it ends up in the config folder (rather than the logs folder) by default, so it&#8217;s hard to find.  Also, with a fixed name, all apps running on the same server would share the same log.  So, for any new Grails app, be sure to open Config.groovy and change<span id="more-49"></span></p>
<pre>
appender.'errors.File'="stacktrace.log"</pre>
<p>to</p>
<pre>
appender.'errors.File'="../logs/${appName}-errors.log"</pre>
<p><strong>Determining What is Logged</strong><br />
Config.groovy also determines what is logged.  The default logging level is error.  For some packages, you&#8217;ll want to change the logging level to warn or info.  Your choices are, in order: FATAL, ERROR, WARN, INFO, DEBUG.</p>
<p>Grails automatically generates a log4j.properties files from what&#8217;s in Config.groovy and places it in the /WEB-INF/classes folder.  The log4j.properties file can be tweaked in place as you attempt to debug a particular problem, but just remember that it gets reset every time the app is deployed.  So, permanent changes need to go in Config.groovy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/configuring-a-grails-app-for-logging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IDE&#8217;s for Groovy/Grails</title>
		<link>http://www.thotspots.com/ides-for-groovygrails/</link>
		<comments>http://www.thotspots.com/ides-for-groovygrails/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 22:00:21 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IntelliJ]]></category>

		<guid isPermaLink="false">http://www.maximsc.com/ides-for-groovygrails/</guid>
		<description><![CDATA[First choice: JetBrains IDEA 7.0 (with 8.0 coming shortly).  Possibly a good second choice: NetBeans 6.5 (new).  Last resort remains: Eclipse.
I used to be a big fan of Eclipse, but the Groovy/Grails support in Eclipse is sorely lacking.  Three months ago I splurged on a copy of JetBrains IDEA 7.0 (http://www.jetbrains.com/idea/index.html) and haven&#8217;t regretted it [...]]]></description>
			<content:encoded><![CDATA[<p>First choice: JetBrains IDEA 7.0 (with 8.0 coming shortly).  Possibly a good second choice: NetBeans 6.5 (new).  Last resort remains: Eclipse.</p>
<p><span id="more-48"></span>I used to be a big fan of Eclipse, but the Groovy/Grails support in Eclipse is sorely lacking.  Three months ago I splurged on a copy of JetBrains IDEA 7.0 (<a href="http://www.jetbrains.com/idea/index.html">http://www.jetbrains.com/idea/index.html</a>) and haven&#8217;t regretted it one bit.  I&#8217;m sitting on 7.0 build 7860 (&#8221;Selena&#8221;).  Since then they&#8217;ve released 7.0.4 (build 7941) and a preview of 8.0 milestone 1, but neither seem to have anything I need, so I&#8217;m sitting tight.  I am, however, anxiously awaiting 8.0 milestone 2,  which promises more Grails refactorings and support for Grails 1.0.3. (My projects are still on 1.0.2.)</p>
<p>I just saw an announcement that NetBeans 6.5 (free open source, <a href="http://www.netbeans.org/community/releases/65/">http://www.netbeans.org/community/releases/65/</a>) is in beta test and that it includes Grails/Groovy support.  For anyone doing Grails work who can&#8217;t afford IDEA, I suggest you check it out.  If you do, I&#8217;d like to hear from you.  Let&#8217;s compare notes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/ides-for-groovygrails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Doin&#8217; Our Part for Grails</title>
		<link>http://www.thotspots.com/doin-our-part-for-grails/</link>
		<comments>http://www.thotspots.com/doin-our-part-for-grails/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 05:08:31 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Jasper Reports]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://www.maximsc.com/doin-our-part-for-grails/</guid>
		<description><![CDATA[We&#8217;ve started contributing back to the Grails open source project.  First up: furthering the cause towards an initial release of a jQuery plugin (http://www.grails.org/jQuery+Plugin).  Also, the next release of the Jasper Reports plugin (http://www.grails.org/Jasper+Plugin) should make life easier.
]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve started contributing back to the Grails open source project.  First up: furthering the cause towards an initial release of a <strong>jQuery plugin</strong> (<a href="http://www.grails.org/jQuery+Plugin#" title="jQuery Plugin for Grails">http://www.grails.org/jQuery+Plugin</a>).  Also, the next release of the <strong>Jasper Reports plugin</strong> (<a href="http://www.grails.org/Jasper+Plugin" title="Jasper Reports plugin for Grails">http://www.grails.org/Jasper+Plugin</a>) should make life easier.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/doin-our-part-for-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grails: Ready for Prime Time</title>
		<link>http://www.thotspots.com/grails-ready-for-prime-time/</link>
		<comments>http://www.thotspots.com/grails-ready-for-prime-time/#comments</comments>
		<pubDate>Wed, 19 Mar 2008 21:25:16 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://www.maximsc.com/grails-ready-for-prime-time/</guid>
		<description><![CDATA[I am currently leading the charge for our clients with Java-based web applications to adopt Grails (i.e. Groovy on Rails).  Grails (www.grails.org) has recently achieved its official 1.0 release, just behind the 1.5 release of Groovy.  We&#8217;re seeing a 10-fold increase in productivity by using GSP (Groovy Server Pages) over JSP (Java Server [...]]]></description>
			<content:encoded><![CDATA[<p>I am currently leading the charge for our clients with Java-based web applications to adopt Grails (i.e. Groovy on Rails).  Grails (<a href="http://www.grails.org" target="_blank">www.grails.org</a>) has recently achieved its official 1.0 release, just behind the 1.5 release of Groovy.  We&#8217;re seeing a 10-fold increase in productivity by using GSP (Groovy Server Pages) over JSP (Java Server Pages), and that factor is only going to improve with practice, and as Grails moves beyond 1.0.<br />
<span id="more-46"></span><br />
The biggest hurdles we&#8217;ve have to overcome with Grails have all had to do with writing Grails apps against an existing database schema.  Anyone starting completely from scratch, allowing Grails to define the schema, won&#8217;t have any trouble at all.  For anyone who is about to go through what we did with a legacy schema, I&#8217;ll be writing up my notes shortly.  Look for them to be posted on our companion blog, <a href="http://www.codejacked.com" target="_blank">www.codejacked.com</a>.</p>
<p>Getting started with Grails requires two efforts: learning how Groovy extends Java, generally, and learning how Grails then takes advantage of Groovy for rapidly developing web pages.  For the former, I highly recommend the brand new book, <em>Groovy Recipes</em> by Scott Davis (Pragmatic Bookshelf).  Chapter three exactly and concisely explains what an experienced Java programmer needs to know to get started with Groovy.</p>
<p>After that, <em>The Definitive Guide to Grails</em> by Graeme Keith Rocher is probably where you&#8217;ll turn.  Be aware, though, that a second edition is pending, and you&#8217;ll want to update your copy when it comes out, so budget accordingly.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/grails-ready-for-prime-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is Extreme Programming (XP)?</title>
		<link>http://www.thotspots.com/what-is-extreme-programming-xp/</link>
		<comments>http://www.thotspots.com/what-is-extreme-programming-xp/#comments</comments>
		<pubDate>Tue, 14 Aug 2007 01:47:43 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[Agile development]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[design principles]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://www.maximsc.com/what-is-extreme-programming-xp/</guid>
		<description><![CDATA[The other day, I was asked for the &#8220;elevator pitch&#8221; on XP, so I dug out this description from an old posting on another of my sites.
It&#8217;s taking best practices to the extreme&#8230;

Long iterations become short iterations with early experience
Long, irregular meetings become frequent stand up meetings
Back-end testing becomes unit testing
Specification artifacts become stories and [...]]]></description>
			<content:encoded><![CDATA[<p>The other day, I was asked for the &#8220;elevator pitch&#8221; on XP, so I dug out this description from an old posting on another of my sites.</p>
<h3>It&#8217;s taking best practices to the extreme&#8230;</h3>
<ul>
<li>Long iterations become short iterations with early experience</li>
<li>Long, irregular meetings become frequent stand up meetings</li>
<li>Back-end testing becomes unit testing</li>
<li>Specification artifacts become stories and a full-time customer (proxy)</li>
<li>Enforced deadlines become developer-derived estimates</li>
<li>Code reviews become pair programming</li>
</ul>
<p><span id="more-42"></span></p>
<h3>The XP Values</h3>
<ul>
<li>Communication</li>
<li>Feedback</li>
<li>Simplicity</li>
<li>Courage</li>
</ul>
<h3>The Tenets of Extreme Programming &amp; Refactoring</h3>
<ul>
<li>Establish a guiding vision, or &#8220;metaphor,&#8221; and then design as you go, with no big, up-front design.</li>
<li>Do the simplest thing that works, at first, and then refactor as needed.</li>
<li>No &#8220;Spec Gen&#8221; (speculative generality). Rely on refactoring to add features only as they actually become required.</li>
<li>No speculative performance tuning.  Rely on refactoring to introduce performance tuning later.</li>
<li>Code in small iterations and fast release cycles.</li>
<li>Put unit and functional testing at the core of the project goal posts, not as an optional add-on.  In fact, write the tests before you write the code to be tested.  You cannot rely on refactoring without a complete baseline of unit tests.</li>
<li>Do not refactor and add functionality at the same time.  Alternate between them.</li>
<li>Coding standards should have buy-in by all team members and call for the least amount of work possible.</li>
<li>Work directly with an on-site customer and/or user and make them a part of the programming team.</li>
<li>The customer determines the priorities, not the developers.</li>
<li>Developers provide the estimates, not the customer.</li>
<li>&#8220;Spikes&#8221; are written when preliminary research is required to provide a confident estimate.</li>
<li>The entire development team has collective ownership of the entire project.  It is not portioned-out code to individual experts.</li>
<li>Program in pairs to assure quality and stay on track.</li>
<li>Use stand-up meetings to stay on track.</li>
<li>Stick to a 40-hour workweek, sleep well and lead a balanced, healthy lifestyle.</li>
</ul>
<h3>Getting Started</h3>
<ol>
<li>Kent Beck&#8217;s &#8220;Extreme Programming Explained&#8221; (second edition) is the seminal work in the field.  It&#8217;s an easy read and it paints a good overall picture.</li>
<li>Martin Fowler&#8217;s &#8220;Refactoring: Improving the Design of Existing Code&#8221; is a must-read.  The first 100 pages describes refactoring (and a bit about test-driven development).  The remaining pages are a catalog of refactorings &#8212; essentially a cookbook of step-by-step recipes.</li>
<li>Robert Martin&#8217;s &#8220;Agile Software Development&#8221; has also been recommended as a good starting point, though it&#8217;s not primarily about XP.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/what-is-extreme-programming-xp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Top 5 Ways to Keep a Software Development Project On Track</title>
		<link>http://www.thotspots.com/top-5-ways-to-keep-a-software-development-project-on-track/</link>
		<comments>http://www.thotspots.com/top-5-ways-to-keep-a-software-development-project-on-track/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 15:46:42 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[stand-up meetings]]></category>
		<category><![CDATA[use-cases]]></category>

		<guid isPermaLink="false">http://www.maximsc.com/top-5-ways-to-keep-a-software-development-project-on-track/</guid>
		<description><![CDATA[If the three most important attributes in real estate are location, location, location, then the five most important attributes of good project management are communication, communication, communication, communication, communication.
1. Maintain a written glossary of domain terminology.  It&#8217;s amazing how often the developers and the customers think they&#8217;re talking the same language, but they&#8217;re not. [...]]]></description>
			<content:encoded><![CDATA[<p>If the three most important attributes in real estate are location, location, location, then the five most important attributes of good project management are communication, communication, communication, communication, communication.</p>
<p>1. <strong>Maintain a written glossary of domain terminology.</strong>  It&#8217;s amazing how often the developers and the customers think they&#8217;re talking the same language, but they&#8217;re not.  Misunderstandings like this are a common source of &#8220;assumption errors,&#8221; which are a leading cause of wasted effort.<span id="more-37"></span></p>
<p>2. <strong>Maintain</strong><strong> a written &#8220;Scope In/Out&#8221; sheet.</strong>  Be explicit about what&#8217;s in scope for this project (for this phase of the project) and what&#8217;s out of scope.Â  Jealously guard the scope.Â   Do it in writing.</p>
<p>3. <strong>Make sure everybody who generates and consumes time estimate numbers looks at them the same way. </strong> Don&#8217;t let an optimistic estimate be taken for realistic or pessimistic one.  Beware of using +/- ranges.  They are meaningless when talking about software development.  Much better is to use degrees of resolution (No confidence/WAG -&gt; Low confidence -&gt; Med confidence -&gt; High confidence).  Do a work-breakdown analysis on any large task, recursively, until it is the sum of 2-day or smaller chunks.  Any estimate that&#8217;s longer than 2-days without a breakdown to back it up cannot be trusted.</p>
<p>4. <strong>Create written Use-Cases/Scenarios to communicate user-interaction requirements</strong> &#8212; especially when it comes to describing exceptions to the rule (things like handling the sale of alcohol or tobacco, processing returned merchandise that&#8217;s saleable vs. damaged, the difference between 50% off vs. buy-one-get-one-free, etc.).  The Use Case is an amazingly powerful tool for eliciting requirements from a non-technical customer.  To start, you have to write the scenarios yourself and get the customers to sign-off, but once they see where you&#8217;re going with them, they&#8217;ll start writing their own in the first place.</p>
<p>5. <strong>Hold daily scrums (stand-up meetings). </strong> Each team member should cover three things: (1) What they did since the previous stand-up meeting, (2) What they plan to do before the next stand-up meeting, (3) Any perceived impediments to getting it done.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/top-5-ways-to-keep-a-software-development-project-on-track/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

