<?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>Rich Internet Applications (RIA) &#187; Groovy</title>
	<atom:link href="http://canoo.com/blog/category/groovy/feed/" rel="self" type="application/rss+xml" />
	<link>http://canoo.com/blog</link>
	<description></description>
	<lastBuildDate>Thu, 12 Aug 2010 11:50:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Slimmed Down Software &#8211; A Lean, Groovy Approach Part 3 &#8211; Create Knowledge</title>
		<link>http://canoo.com/blog/2010/08/12/slimmed-down-software-a-lean-groovy-approach-part-3-create-knowledge/</link>
		<comments>http://canoo.com/blog/2010/08/12/slimmed-down-software-a-lean-groovy-approach-part-3-create-knowledge/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 11:50:46 +0000</pubDate>
		<dc:creator>Hamlet</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=1459</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/08/12/slimmed-down-software-a-lean-groovy-approach-part-3-create-knowledge/";</script>This article originally appeared in the June 2010 edition of GroovyMag, the Groovy and Grails magazine. Parts 4 and 5 are currently available for download from the magazine&#8217;s site, and more will come each month. Enjoy!
The Groovy Programming Language advertises itself as an &#8220;agile and dynamic Language for the JVM&#8221;, but what does this mean [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/08/12/slimmed-down-software-a-lean-groovy-approach-part-3-create-knowledge/";</script><p>This article originally appeared in the June 2010 edition of <a href="http://groovymag.com/">GroovyMag</a>, the Groovy and Grails magazine. Parts 4 and 5 are currently available for download from the magazine&#8217;s site, and more will come each month. Enjoy!</p>
<p>The Groovy Programming Language advertises itself as an &#8220;agile and dynamic Language for the JVM&#8221;, but what does this mean exactly? This series of articles explains Lean Software Development, and shows how your choice of programming language can make your entire process remain nimble and adaptive. Each months article will cover one of the seven Lean Software Development principles and explain how Groovy and the associated ecosystem help eliminate waste, defer commitment, and build quality into your product.</p>
<p><strong>About this Series</strong><br />
Groovy is an agile programming language. In order to explain what this means, these articles are structured around the seven principles of Lean Software Development. The previous installments included a short introduction to Lean, explained how an expressive language can eliminate waste in unit testing, and showed how the easyb Behavior Driven Development framework and Groovy Builders can build quality into your life-cycle. In later months we&#8217;ll explore how a dynamic language lets you minimize coupling and defer commitment, and how metaprogamming allows you to deliver fast. You&#8217;ll see how Groovy&#8217;s Grapes module system, alongside modules like Groovy Web Services, streamline interactions between development and other groups like operations and QA (an important aspect of respecting people). Finally, we&#8217;ll look at optimizing the whole by applying Groovy to domains that cross department boundaries: how Gradle improves the build process and easyb serves as a collaboration mechanism between different organization roles. The series will end with a discussion on the best practices of mixing Java and Groovy.</p>
<p>Some of the code examples are basic while others are advanced. The articles explore why the features of Groovy are important rather than the mechanics of any one Groovy feature. Hopefully you&#8217;ll leave with some new ideas about how to use Groovy, how to convince your team that Groovy is worthwhile, or most importantly, how to increase your productivity.</p>
<p><strong>Lean Revisited</strong><br />
<a href="http://canoo.com/blog/2010/06/04/slimmed-down-software-a-lean-groovy-approach-part-1-eliminate-waste/">Part 1 of this series</a> contained a more indepth explanation of Lean, and I won&#8217;t repeat it here. But as a quick refresher here are the 7 lean principles along with a summary for those principles covered previously:<br />
1. Eliminate Waste &#8211; Reduce work in progress and half done work<br />
2. Build Quality In &#8211; Instead of settling for finding defects, optimize your process to create fewer defects<br />
3. Create Knowledge<br />
4. Defer commitment<br />
5. Deliver Fast<br />
6. Respect People<br />
7. Optimize the Whole</p>
<p><strong>Principle 3 &#8211; Create Knowledge</strong></p>
<p>I prefer the term &#8220;Software Engineer&#8221; to &#8220;Programmer&#8221; because it evokes a sense of professionalism, adherence to standards, and attention to quality that sometimes seems lacking in our industry. But &#8220;Engineer&#8221; also carries negative connotations when applied to software. As my co-worker Mike Mannion says, &#8220;Software development has less to do with conveyor-belt-fabrication (the image unfortunately most likely to be to be conjured up when we use the word engineering) than knowledge acquisition.&#8221; Indeed, Software development is a knowledge creating process. The mostbasic thing we do in our jobs is to discover what needs to be done in order to delight our customers. In fact, your product will benefit by finding ways to speed up this knowledge acquisition. Specifically, Lean provides two practices for this: short, frequent learning cycles and delayed commitment. Delayed commitment, postponing decisions until the last responsible moment, is covered in next month&#8217;s article. Today we&#8217;ll focus on shorting learning cycles. </p>
<p>So where does all this created knowledge reside? Large requirements and specification documents are enticing because they provide a wonderful illusion of certainty. They can be agreed upon in meetings, verified with checklists, cross referenced with traceability matrices, and then enforced by lawyers and courts when projects fail. Great software has as much to do with rock solid documentation as a great marriage has to do with a rock solid prenuptial agreement. No thanks, I say.</p>
<p>The software industry has clearly turned towards executable solutions for knowledge creation and retention, any plausible description for a marriage related &#8220;executable solution&#8221; leaves me feeling quite uneasy. Executable acceptance test frameworks abound: Fit, Fitnesse, and easyb, and new unit test frameworks appear every few weeks. The code you write, and the tests that accompany it are the most basic persistent form of system knowledge, and it is important that this knowledge be verified in an automated way.</p>
<p>The problem with traditional unit tests is that the test framework imposes so many particularities that the important knowledge of how your system must behave gets lost in a noise of subclassing, type definitions, and annotations. Wiki and spreadsheet based solutions like Fitnesse are a nice idea in theory, but I have not yet found customers willing to edit test data directly. Instead it is left to the developer to do it. To make traditional unit testing more friendly, some developers try to cut through this noise by using strange naming conventions and commenting their tests with standard comments, as in Listing 1.</p>
<p><pre><code>public void test_users_can_be_retrieved() {
&nbsp;&nbsp;&nbsp;&nbsp;// arrange
&nbsp;&nbsp;&nbsp;&nbsp;...
&nbsp;&nbsp;&nbsp;&nbsp;// act
&nbsp;&nbsp;&nbsp;&nbsp;...
&nbsp;&nbsp;&nbsp;&nbsp;// assert
&nbsp;&nbsp;&nbsp;&nbsp;...
}</code></pre></p>
<p>I&#8217;ve found word separating underscores in method names to bring no real value. You&#8217;re going to have to press the shift key one way or another, whether it be with underscores or camel case. The practice I do like is the arrange-act-assert pattern. This pattern originated with William Wake as a way to add clarifying structure to unit tests. The idea is to codify and standardize the way tests are written: First arrange all necessary preconditions and inputs, then act on the object or method under test, and finally assert that the expected results have occurred. Tests are easier to read because the setup and verification phase is clearly separated from the block exercising the system under test, and test smells like a too busy act phase or missing assert blocks rise quickly to the surface.</p>
<p>Encoding your tests with comments is an interesting idea, but in the end comments are not executed, grow stale, and become misleading. A better choice than using comments is to pick a testing framework that eliminates all this noise, one that natively supports the structure of unit tests. A testing framework like Spock.</p>
<p>Spock is an innovative framework, taking new directions on fixture setup, mocking, and data driven tests. The goal of Spock is to allow the developer to focus solely on the input and output of tests and then get out of the way. One type of test available in Spock is the data driven test, seen in Listing 2.</p>
<p><pre><code>def &quot;&quot;&quot;does the user service contain
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a known set of users?&quot;&quot;&quot;() {
&nbsp;&nbsp;&nbsp;&nbsp;setup:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def service = new UserService()
&nbsp;&nbsp;&nbsp;&nbsp;expect:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def user = service.get(username)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.firstName == firstname
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.lastName == lastname
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.id == userID
&nbsp;&nbsp;&nbsp;&nbsp;where:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username &lt;&lt; [&#039;user1&#039;, &#039;user2&#039;, &#039;user3&#039;]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstname &lt;&lt; [&#039;John&#039;, &#039;Jane&#039;, &#039;John&#039;]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastname &lt;&lt; [&#039;Doe&#039;, &#039;Doe&#039;, &#039;Smith&#039;]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userID &lt;&lt; [123456, 654321, 789987]
}</code></pre></p>
<p>Did you know that question marks and new line characters in methods names, like in Listing 2, are completely legal on the JVM? The Java language just doesn&#8217;t allow you to use them! While this is far from the main productivity boost from Spock, it does lead to some very nice looking JUnit reports. Figure 1 is our actual JUnit report from my current project. Seeing a space separated test name sure beats deciphering a camel case or underscore laden test name. </p>
<p><img src="http://canoo.com/blog/wp-content/uploads/2010/08/ss.png" alt="Spock Test Report" title="Spock Test Report" width="442" height="675" class="aligncenter size-full wp-image-1461" /></p>
<p>The value of Spock being built on top of JUnit should be obvious: your reports, builds, IDEs, and other tools continue to work as before. To the tools, Spock is just another unit test.</p>
<p>There are more interesting questions to ask about Listing 2, however. Reading the listing from top to bottom may be confusing. Are those &#8220;==&#8221; statements assertions, and how can they be made before the variables have been initialized? What does this test do exactly?</p>
<p>Spock shows the great power available behind Groovy. Those goto labels (setup, expect, and where) are some of the meaningful tags you are allowed to use within Spock, and these tags are enforced within the compiler. They are not goto labels at all but a vital part of a Spock test specification. Just as test fixtures can have setup and cleanup phases, so can individual test methods. Spock supports this idea natively at the compiler level. In-line comments and funny method names are replaced by first class support for testing.</p>
<p>Within the expect: phase, the statements including == are indeed assertions. You may write out the assert keyword longhand if you desire, but the point of an expect: block is to run assertions, so Spock lets you drop out this bit of ceremony from your tests.</p>
<p>Another surprising feature is that the expect block will be executed three times in this test: one time for each row in the dataset. So the first execution is with data user1, John, Doe, and 123456, the second execution receives the second &#8220;column&#8221; of the dataset and so on. Once you are used to Spock, the data tends to be read in vertical columns, since each column is input to the expect block. For testers weaned on JUnit the test might seem backwards, raising questions like &#8220;Why is the data the last piece of the test, shouldn&#8217;t that come first?&#8221; The short answer is, not if you want to create knowledge about your system. The important part of the system is how it behaves, how the UserService retrieves users. This information is front and center communicating to any future programmers on the project. The data that ensures this behavior comes later, and is usually less important than the assertions. The Arrange, Act, Assert pattern is required in imperative, sequential programming. Luckily, a strong language and an innovative framework let you focus more on knowledge creation than satisfying the semantics of your chosen compiler. </p>
<p>Data driven tests are just one of the options in Spock specifications. As you explore Spock you&#8217;ll find many of the BDD concepts available to use, as well as a unique solution to working effectively with mocking frameworks. Spock is built on JUnit, so it works without effort for popular build tools and IDEs, and the online documentation is superb (how often can you say that about an open source framework?). If you want to take tests as a form of knowledge creation, then Spock is definitely worth investigating.</p>
<p>The new 0.4 release of Spock contains another option for data driven tests as well: the data table. Previously, Listing 2 showed how lists can be used within Spock so that assertion blocks are automatically called several times with different data. The downside is that I sometimes find myself tilting my head as I try to read the vertical columns embedded in the lists. Similar to the data tables features in Scala&#8217;s Specs framework, Spock now allows you to embed pipe delimited data tables in your tests. Listing 3 is the same test as in Listing 2 but uses data tables instead of the Spock data<br />
driven format.</p>
<p><pre><code>def &quot;&quot;&quot;does the user service contain
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a known set of users?&quot;&quot;&quot;() {
&nbsp;&nbsp;&nbsp;&nbsp;setup:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def service = new UserService()
&nbsp;&nbsp;&nbsp;&nbsp;expect:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def user = service.get(username)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.firstName == fname
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.lastName == lname
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.id == id
&nbsp;&nbsp;&nbsp;&nbsp;where:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username| fname | lname | id
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;user1&#039; |&#039;John&#039; | &#039;Doe&#039; | 123456
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;user2&#039; | &#039;Jane&#039;| &#039;Doe&#039; | 654321
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;user3&#039; |&#039;John&#039; | &#039;Smith&#039;| 789987
}
</code></pre></p>
<p>The result is a much more readable dataset, neatly divided into rows and columns.</p>
<p>The test driven community has a great interest in improving the framework landscape. Unit tests have been heralded in the past as a way to capture information about the system being developed, but the JUnit and Java syntax combine to under-deliver on this promise. Finally, with both the Groovy language and frameworks like Spock, we are seeing unit tests come into their own in their ability to capture, express, and execute the workings of the system.</p>
<p><strong>Sidebar: Expressive vs. Terse</strong><br />
I&#8217;ve been very careful to call Groovy expressive instead of terse, which are two different things. Terse means showing less. Terse can mean anything from an abstraction to an abbreviation. Court stenography or writing shorthand is terse. All of the information is captured, but in as small amount of space as possible. And practically no one except the original author can make sense of it. Perl and regular expressions are terse.</p>
<p>Expressive is also about showing less, but expressive specifically means showing less of the inconsequential and more of the consequential. If something is important, then an expressive language shows it to you. If something isn&#8217;t important, then an expressive language should hide that detail.</p>
<p>Being expressive is an important part of staying DRY (Do Not Repeat Yourself). Everyone knows that DRY mandates that you do not say things twice: there should be a single source of knowledge for any fact. Hiding information, and terseness, often violates this. An expressive language helps you stay DRY by making sure knowledge is embedded in the system once without a lot of extra noise. Simple terseness and hiding information might leave you with zero sources of knowledge! Not a good place to be. Strive for expressive, and be wary of terse.</p>
<p><strong>Next Steps</strong><br />
An important part of creating knowledge is maintaining a culture of constant improvement: every team can benefit from a feedback cycle where you experiment with a new practice, reflect and learn from the experience, and then accept or reject the practice as part of your team culture. The annual, year end reviews common in many companies are the antithesis of this. They are self-improvement theater, where feedback comes months after events occur and the details of how to improve are lost behind closed door meetings, never to be heard from again. As an alternative, think short term. Treat each two week iteration as a chance to conduct an experiment. Try Spock for two weeks and then discuss the results as part of your iteration close. If the team doesn&#8217;t like it then stop using it and try easyb for two weeks.</p>
<p>If that doesn&#8217;t work then try something else. A two week commitment is much easier to sell to your teammates than a long term framework decision, and two weeks shouldn&#8217;t be long enough for even the worst decisions to irreparably harm a project. Week by week your team will improve as some of the experiments work and others fail. Just remember, an experiment or new practice should try to solve a specific problem for your team.</p>
<p><strong>Next Month: Defer Commitment</strong><br />
Deferring commitment is about your keeping options open. It may seem wise to make decisions early, and it does lead to the illusion of progress. But decisions can be costly to unmake, and oftentimes new information will become available that affects the choices you&#8217;re willing to make. Next month&#8217;s article explores how Groovy and dynamic languages allow you to make decisions when you are ready, investigating ways in which you can use Groovy&#8217;s optional typing to your advantage.</p>
<p><strong>Learn More</strong><br />
Spock is available through Maven and Google Code at http://code.google.com/p/spock/. The web has some nice Spock tutorials, the project lead has a blog at http://pniederw.wordpress.com/ and Parleys.com has a great 20 minute presentation from the 2009 Devoxx conference available to subscribers. For more information on the very cool mock objects available then you may wish to read my own post on the topic: http://canoo.com/blog/2010/04/20/spock-and-test-spies-a-logical-choice/ For books on agility, I still contend these three cannot be beat: </p>
<li>  Implementing Lean Software Development &#8211; Poppendieck	</li>
<li>  The Pragmatic Programmer &#8211; Hunt and Thomas</li>
<li>  Extreme Programming Explained, 2nd Edition &#8211; Beck and Anders</li>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://canoo.com/blog/2010/08/12/slimmed-down-software-a-lean-groovy-approach-part-3-create-knowledge/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://canoo.com/blog/2010/08/12/slimmed-down-software-a-lean-groovy-approach-part-3-create-knowledge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Post Mortem with Gilad Bracha</title>
		<link>http://canoo.com/blog/2010/05/07/java-post-mortem-with-gilad-bracha/</link>
		<comments>http://canoo.com/blog/2010/05/07/java-post-mortem-with-gilad-bracha/#comments</comments>
		<pubDate>Fri, 07 May 2010 07:10:52 +0000</pubDate>
		<dc:creator>Hamlet</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[JAX]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=1290</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/05/07/java-post-mortem-with-gilad-bracha/";</script>This year&#8217;s JAX.de conference hosted many great Java thought leaders, including one of my personal favorites Gilad Bracha. If anyone has the authority to critique Java and the Java platform then surely it is Gilad who spent years working for Sun on the language and platform tools. If you haven&#8217;t followed him recently, I recommend [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/05/07/java-post-mortem-with-gilad-bracha/";</script><div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">This year&#8217;s JAX.de conference hosted many great Java thought leaders, including one of my personal favorites Gilad Bracha. If anyone has the authority to critique Java and the Java platform then surely it is Gilad who spent years working for Sun on the language and platform tools. If you haven&#8217;t followed him recently, I recommend reading his papers on Pluggable Type Systems and Software as a Service.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Lucky for me, my &#8220;Code Generation on the JVM&#8221; talk was sandwiched between his &#8220;Java: A Post Mortem&#8221; and &#8220;Newspeak: A Principled, Dynamic Language&#8221;. It was surreal to see my name next to someone I&#8217;ve revered for many years, and I felt a bit like the rookie professional athlete who has to play his first game against someone they grew up watching on TV.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">As expected, his talks were good mix of humor, strong opinion, and thoughtful analysis. Here are my favorite bits:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">If you can&#8217;t abstract over it then it doesn&#8217;t belong there.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">An original sin of Java was constructors. They are static methods that commit to returning a concrete implementation. Remember the design mandate &#8220;program to interfaces&#8221;? Constuctors subvert this and gave rise to a cottage industry of Dependency Injection frameworks to get around the issue (as long as you consider VMWare a cottage industry!). You wouldn&#8217;t need DI if your language supported proper inversion of control in the first place. The next generation of languages hopefully won&#8217;t have this limitation.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Class initialization is absurd. There should be none.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Static state is bad, bad, bad and read Gilad&#8217;s great blog post if you aren&#8217;t persuaded. Without static state there is no need for class initialization. We&#8217;ve all heard that the JVM start up times are slow, but that is a bit of a myth. The problem is that through class initialization we&#8217;re asking the JVM to do millions of operations that could be avoided without static state. A Lambourgini isn&#8217;t slow, but it sure seems that way if you try to drive it to the Moon. Likewise the JVM.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Why should a high level language need a memory model in the first place?</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">The original Java memory model was incoherent, the revised memory model is understood by only five people in the world, and the actors for concurrency idea existed since the Gulati paper of 1970. Bracha&#8217;s point wasn&#8217;t that we need a better Java memory model, it is that we should have made a language that did not need to expose a memory model to the developers. As with many of the Java original sins, Threads were the wrong level of abstraction and something better like Actors should have been chosen.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Java is going to stay but it is going to stay where you don&#8217;t want to look</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Everyone wants to predict the demise of Java, don&#8217;t they? But few people offer a real, long-term alternative. There is enough risk with any of the other JVM languages to persude Enterprises that sticking with Java is the best choice. The evening&#8217;s speaker panel agreed (mostly) that the real successor to Java didn&#8217;t exist today. So where will the next big lanugage come from? Who can monetize a programming language? Microsoft has somehow done it with .NET, but show me the Oracle business plan that details how to get rich from writing a programming language. Or any other company for that matter. Here is my prediction: all this language innovation results in the best ideas making it into libraries and frameworks available for the Java language, and Java remains number one on our beloved TIOBE index, clunky syntax and all.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Webapps make you reboot. It is called &#8220;session expired&#8221;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Newspeak was funded to solve the problem of always on, always updated software. Quick question: what version of Google do you use? I&#8217;ve never in my life seen a version number at Google.com and that is a deployment success story. All software should work this way. I&#8217;m unclear how Newspeak is going to solve the session state problem but I&#8217;m also certain that I do &lt;i&gt;not&lt;/i&gt; fully grasp the Newspeak vision.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">If you want a static language you should look at Egyptian heiroglyphics because it hasn&#8217;t changed in a long time</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">And another quote from Brian Hurt: &#8220;Demand that you not have to learn something new to learn new languages, and then wonder why languages don&#8217;t improve much&#8221;. Newspeak is a bold change, and people are going to be very resistent. Incremental changes like Groovy are much easier to sell than big sweeping language changes. And an always changing language can hardly be adopted by the masses. I left the session wondering if Newspeak is an experiment meant to fuel language innovation or a real alternative as a mainstream programming language.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Complicated is not a sign that you&#8217;re clever. It is a sign that you failed.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Simple solutions can be achieved with a low number of non-overlapping concepts. If you need something more complicated then build it by composing the simpler pieces together. Special cases like primitive types are the road to ruin. Or the road to massive popularity and success as is the case with Java. In my humble opinion: success is an accident, much better to aim for happiness.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Language development has moved away from professional language writer and into the hands of hobbiest developers</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">As a hobbiest developer working on the Groovy language, I have averaged a mere 2-3 hours a week of work over the last 12 months. The good news: I&#8217;m clearing my schedule after the GR8 Conference to work on Groovy&#8217;s GEP-4. The bad news, I am and will remain a non-professional hobbiest developer hacking on a language in my spare time. Life couldn&#8217;t be better.</div>
<p>This year&#8217;s <a href="http://jax.de">JAX.de</a> conference hosted many great Java thought leaders, including one of my personal favorites <a href="http://bracha.org">Gilad Bracha</a>. If anyone has the authority to critique Java and the Java platform then surely it is Gilad who spent years working for Sun on the language and platform tools. If you haven&#8217;t followed him recently, I recommend reading his <a href="http://bracha.org/Site/Papers.html">papers</a> on <a href="http://bracha.org/pluggableTypesPosition.pdf">Pluggable Type Systems</a> and <a href="http://bracha.org/objectsAsSoftwareServices.pdf">Objects as Software Services</a>. Lucky for me, my &#8220;<a href="http://entwickler.com/konferenzen/ext_scripts/v2/php/sessions-popup.php?module=jax2010&amp;id=13700">Code Generation on the JVM</a>&#8221; talk was sandwiched between his &#8220;Java: A Post Mortem&#8221; and &#8220;<a href="http://newspeaklanguage.org/">Newspeak</a>: A Principled, Dynamic Language&#8221;. It was surreal to see my name next to someone I&#8217;ve revered for many years, and I felt a bit like the rookie professional athlete who has to play his first game against someone they grew up watching on TV.</p>
<p>As expected, his talks were good mix of humor, strong opinion, and thoughtful analysis. Here are my favorite bits:</p>
<p><strong>If you can&#8217;t abstract over it then it doesn&#8217;t belong there.<br />
</strong>An original sin of Java was constructors. They are static methods that commit to returning a concrete implementation. Remember the design mandate &#8220;program to interfaces&#8221;? Constuctors subvert this and gave rise to a cottage industry of Dependency Injection frameworks to get around the issue (as long as you consider VMWare a cottage industry!). You wouldn&#8217;t need DI if your language supported proper inversion of control in the first place. The next generation of languages hopefully won&#8217;t have this limitation.</p>
<p><strong>Class initialization is absurd. There should be none.<br />
</strong>Static state is bad, bad, bad and read Gilad&#8217;s great blog post if you aren&#8217;t persuaded. Without static state there is no need for class initialization. We&#8217;ve all heard that the JVM start up times are slow, but that is a bit of a myth. The problem is that through class initialization we&#8217;re asking the JVM to do millions of operations that could be avoided without static state. A Lambourgini isn&#8217;t slow, but it sure seems that way if you try to drive it to the Moon. Likewise the JVM.</p>
<p><strong>Why should a high level language need a memory model in the first place?<br />
</strong>The original Java memory model was incoherent, the revised memory model is understood by only five people in the world, and the actors for concurrency idea existed since the Gulati paper of 1970. Bracha&#8217;s point wasn&#8217;t that we need a better Java memory model, it is that we should have made a language that did not need to expose a memory model to the developers. As with many of the Java original sins, Threads were the wrong level of abstraction and something better like Actors should have been chosen.</p>
<p><strong>Java is going to stay but it is going to stay where you don&#8217;t want to look<br />
</strong>Everyone wants to predict the demise of Java, don&#8217;t they? But few people offer a real, long-term alternative. There is enough risk with any of the other JVM languages to persude Enterprises that sticking with Java is the best choice. The evening&#8217;s speaker panel agreed (mostly) that the real successor to Java didn&#8217;t exist today. So where will the next big lanugage come from? Who can monetize a programming language? Microsoft has somehow done it with .NET, but show me the Oracle business plan that details how to get rich from writing a programming language. Or any other company for that matter. Here is my prediction: all this language innovation results in the best ideas making it into libraries and frameworks available for the Java language, and Java remains number one on our beloved <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">TIOBE</a> index, clunky syntax and all.</p>
<p><strong>Webapps make you reboot. It is called &#8220;session expired&#8221;<br />
</strong>Newspeak was funded to solve the problem of always on, always updated software. Quick question: what version of Google do you use? I&#8217;ve never in my life seen a version number at Google.com and that is a deployment success story. All software should work this way. I&#8217;m unclear how Newspeak is going to solve the session state problem but I&#8217;m also certain that I do &lt;i&gt;not&lt;/i&gt; fully grasp the Newspeak vision.</p>
<p><strong>If you want a static language you should look at Egyptian heiroglyphics because it hasn&#8217;t changed in a long time<br />
</strong>And another quote from <a href="http://enfranchisedmind.com/blog/">Brian Hurt</a>: &#8220;Demand that you not have to learn something new to learn new languages, and then wonder why languages don&#8217;t improve much&#8221;. Newspeak is a bold change, and people are going to be very resistent. Incremental changes like Groovy are much easier to sell than big sweeping language changes. And an always changing language can hardly be adopted by the masses. I left the session wondering if Newspeak is an experiment meant to fuel language innovation or a real alternative as a mainstream programming language.</p>
<p><strong>Complicated is not a sign that you&#8217;re clever. It is a sign that you failed.<br />
</strong>Simple solutions can be achieved with a low number of non-overlapping concepts. If you need something more complicated then build it by composing the simpler pieces together. Special cases like primitive types are the road to ruin. Or the road to massive popularity and success as is the case with Java. In my humble opinion: success is an accident, much better to aim for happiness.</p>
<p><strong>Language development has moved away from professional language writer and into the hands of hobbiest developers<br />
</strong>As a hobbiest developer working on the Groovy language, I have averaged a mere 2-3 hours a week of work over the last 12 months. The good news: I&#8217;m clearing my schedule after the <a href="http://gr8conf.org/">GR8 Conference</a> to work on <a href="http://docs.codehaus.org/display/GroovyJSR/GEP+4+-+AstBuilder+AST+Templates">Groovy&#8217;s GEP-4</a>. The bad news, I am and will remain a non-professional hobbiest developer hacking on a language in my spare time. Life couldn&#8217;t be better.</p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://canoo.com/blog/2010/05/07/java-post-mortem-with-gilad-bracha/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://canoo.com/blog/2010/05/07/java-post-mortem-with-gilad-bracha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Canoo Hosts Hackergarten, Open Source Benefits</title>
		<link>http://canoo.com/blog/2010/04/26/canoo-hosts-hackergarten-open-source-benefits/</link>
		<comments>http://canoo.com/blog/2010/04/26/canoo-hosts-hackergarten-open-source-benefits/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 13:29:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Hackergarten]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=1145</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/04/26/canoo-hosts-hackergarten-open-source-benefits/";</script>A few weeks ago on a Friday evening, Canoo opened its doors to the public and hosted a new programming user group called Hackergarten. The goal of the group is different from other user groups: instead of learning from listening to a presentation they want to learn by writing code. In their own words:
Our goal [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/04/26/canoo-hosts-hackergarten-open-source-benefits/";</script><p>A few weeks ago on a Friday evening, Canoo opened its doors to the public and hosted a new programming user group called <a href="http://hackergarten.net/">Hackergarten</a>. The goal of the group is different from other user groups: instead of learning from listening to a presentation they want to learn by writing code. In their own words:</p>
<blockquote><p>Our goal is to create something that others can use; whether it be working software, improved documentation, or better educational materials. Our intent is to end each meeting with a patch or similar contribution submitted to an open and public project.</p></blockquote>
<p>We&#8217;re excited to say that their contribution to the <a href="http://www.gradle.org">Gradle</a> build system was accepted last week! The next release of Gradle 0.9 contains an &#8220;Announce&#8221; plugin that can notify you and your customers of build events using Twitter, Snarl, or the Ubuntu notification system. You can notify yourself of local build failures or notify your customers of successful formal build releases. It was a long Friday night, but the group of over 10 developers are all happy to see their work accepted. As the group sponsor, Canoo is happy to have kept them caffeinated and well fed.</p>
<p>The next Hackergarten is this Friday, 30 April 2010. The group plans to write some <a href="http://griffon.codehaus.org/">Griffon plugins</a>, a desktop application framework written in Java and Groovy. The Griffon Project Lead (and Canoo employee)<a href="http://www.jroller.com/aalmiray/">Andres Almiray</a> will be present to help guide the group. If you are anywhere near the Basel area this Friday, then please stop by Canoo and come join the fun. Don&#8217;t worry if you&#8217;ve never seen Groovy or Griffon before, the point is to learn new skills and meet new people.</p>
<p>You can find out more information on the Hackergarten <a href="http://groups.google.com/group/hackergarten/">mailing list</a> or follow <a href="http://twitter.com/Hackergarten">@Hackergarten</a> to stay up to date.</p>
<p>Come join the fun. Here&#8217;s what people are saying about the last event:</p>
<p><span style="color: #ffffff;">.</span></p>
<p><img class="size-full wp-image-1148 alignright" style="margin-top: 5px; margin-bottom: 5px; margin-left: 20px; margin-right: 20px;" title="etienne" src="http://canoo.com/blog/wp-content/uploads/2010/04/etienne.jpg" alt="etienne" width="108" height="108" /><em> </em></p>
<blockquote>
<p style="text-align: left; "><em>The first Hackergarten was a great event, not only because there was free pizza, but primarily because it was a true team event with everyone actively contributing. Submitting a patch for a new Gradle plugin at the end of the night was our goal which we reached successfully. I look forward to learning more about Griffon at the next Hackergarten.</em></p>
<p style="text-align: left; ">Etienne Stuber</p>
</blockquote>
<p style="text-align: left; "><span style="color: #ffffff;">.</span></p>
<p style="text-align: left; "><img class="size-full wp-image-1160 alignright" style="margin-top: 5px; margin-bottom: 5px; margin-left: 20px; margin-right: 20px;" title="alberto" src="http://canoo.com/blog/wp-content/uploads/2010/04/alberto.jpg" alt="alberto" width="108" height="108" /></p>
<blockquote></blockquote>
<blockquote><p><em>I learned how easy and powerful Gradle is. The fact: with a little group and in a little time, we wrote a worth-making contribution to an open source project. Did I have fun? Definitely, it was like meeting with friends but for a beer but enjoying coding at the same time. In the future I am interested in writing Grails or Griffon plugins</em>.</p>
<p>Alberto Mijares</p></blockquote>
<p><span style="color: #ffffff;">.</span></p>
<p><img class="alignright" style="margin-top: 5px; margin-bottom: 5px; margin-left: 40px; margin-right: 20px;" title="Christophe" src="http://canoo.com/images/people/christoph_sperle.jpg" alt="" width="86" height="71" /></p>
<blockquote></blockquote>
<blockquote><p><em>At Hackergarten I learned about the Pomodoro technique and how to use groovy closures to do exception handling in a smart way. And yes, I had a lot of fun! For future events I am interested in anything with new technologies but especially with testing different approaches on how to program in teams</em>.</p>
<p>Christoph Sperle</p></blockquote>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://canoo.com/blog/2010/04/26/canoo-hosts-hackergarten-open-source-benefits/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://canoo.com/blog/2010/04/26/canoo-hosts-hackergarten-open-source-benefits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spock and Test Spies: A Logical Choice</title>
		<link>http://canoo.com/blog/2010/04/20/spock-and-test-spies-a-logical-choice/</link>
		<comments>http://canoo.com/blog/2010/04/20/spock-and-test-spies-a-logical-choice/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 15:30:27 +0000</pubDate>
		<dc:creator>Hamlet</dc:creator>
				<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=1047</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/04/20/spock-and-test-spies-a-logical-choice/";</script>Here at Canoo many of us are preparing to spend the next three days in the Alps at a bi-annual retreat called &#8220;Code Camp&#8221;, where we stay up all night hacking with technologies and on projects that don&#8217;t always fit within our normal projects. This is my first time going, but I hear from the [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/04/20/spock-and-test-spies-a-logical-choice/";</script><p>Here at <a href="http://www.canoo.com">Canoo</a> many of us are preparing to spend the next three days in the Alps at a bi-annual retreat called &#8220;Code Camp&#8221;, where we stay up all night hacking with technologies and on projects that don&#8217;t always fit within our normal projects. This is my first time going, but I hear from the old timers that it is three days of a Spartan like existence focused on replacing sleep with marathon coding sessions, and where anyone causing a build failure is kicked into the Well of Souls with a scream of &#8220;FOR SPARTA!&#8221;. I am&#8230; nervous. </p>
<p>Those who know me should not be surprised at my technology stack: Groovy for the language, <a href="http://www.gradle.org">Gradle</a> for the build, and <a href="http://http://code.google.com/p/spock/">Spock</a> for the unit tests. In preparation for the big event, I dropped Spock into our project, converted all the unit tests to Spock specifications, and then converted all the hand rolled mocks to <a href="http://code.google.com/p/spock/wiki/Interactions">Spock Interactions</a>. (Why these aren&#8217;t called &#8220;Spock Mocks&#8221; or simply &#8220;Smocks&#8221; I do not know). </p>
<p><strong>First Reactions</strong><br />
First, the Spock framework does some crazy language tricks that aren&#8217;t supported in Java or Groovy&#8230; and it does so in a statically typed way. Almost all my mocking code has the same IDE completion and navigation the Java solutions have. Pretty amazing stuff given the level of metaprogramming that is going on in the implementation. Optional static typing in Groovy is a very important feature, especially for tool support.</p>
<p>Secondly, did you know the JVM supports long, punctuated, multi-line method names? Check out this <a href="http://meetspock.appspot.com/script/10001">example</a>: </p>
<p><pre><code>class Whoa extends spock.lang.Specification {
&nbsp;&nbsp;def &quot;&quot;&quot;Did you know that the JVM
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allows really long method names
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that span multiple lines and
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contain punctuation?&quot;&quot;&quot;() {
 
&nbsp;&nbsp;&nbsp;&nbsp;expect:
&nbsp;&nbsp;&nbsp;&nbsp;your_mind_is_blown
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;where:
&nbsp;&nbsp;&nbsp;&nbsp;your_mind_is_blown = true
&nbsp;&nbsp;}
}&nbsp;&nbsp;&nbsp;&nbsp;
</code></pre><br />
These long method names are a feature of Spock, not Groovy. Some features of Groovy will not work if you try this in GroovyTestCase, such as using closures. Let&#8217;s move on to the mocking and spying code. </p>
<p><strong>Spying </strong><br />
I wrote a post many moons ago about the difference between <a href="http://hamletdarcy.blogspot.com/2007/10/mocks-and-stubs-arent-spies.html">stubs, spies, and mocks</a>. Spying on indirect output of a test is much more important to me than full blown mocking, and I feel extensive mocking is a design smell. So far, I&#8217;ve been impressed with the Spock&#8217;s ability to analyze test objects after the fact to determine what was and was not called on them. For instance, here is a simple Spock spec asserting that the mouseClicked was indeed called once:<br />
<pre><code>def &quot;Simple Spy Method&quot;() {

&nbsp;&nbsp;&nbsp;&nbsp;setup:
&nbsp;&nbsp;&nbsp;&nbsp;MouseListener listener = Mock()

&nbsp;&nbsp;&nbsp;&nbsp;when:
&nbsp;&nbsp;&nbsp;&nbsp;listener.mouseClicked MOUSE_EVENT_1

&nbsp;&nbsp;&nbsp;&nbsp;then:
&nbsp;&nbsp;&nbsp;&nbsp;1 * listener.mouseClicked(MOUSE_EVENT_1) // once
}</code></pre><br />
Mocks are created with the Mock() method in the setup: phase, the system is tested in the when: phase, and the system is verified in the then: phase. Anything in then: is considered an assertion. </p>
<p>The assertion line reads in English, &#8220;expect one time that mouseClicked was invoked&#8221;. If mouseClicked is not called by the test then the test fails. If mouseClicked is called more then once then the test failes. If it is called with the wrong parameter&#8230; yes, it fails. Any number is supported, not just one, and ranges are supported as well in the same syntax:<br />
<pre><code>3 * listener.mouseClicked(MOUSE_EVENT_1)&nbsp;&nbsp;// exactly 3 times
(2.._) * listener.mouseClicked(_)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // at least n times
(_..3) * listener.mouseExited(_)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// at most n times
</code></pre><br />
The range (2.._) means 2 to anything, or at least 2 times. (_..3) means from anything to 3, or at most 3 times. The little _ is the wildcard. But what is it doing as a method parameter? I&#8217;ll explain that in one second&#8230; first check out how regular expressions can be used to specify interactions:<br />
<pre><code>0 * listener./mouse(Pressed|Released)/(_)&nbsp;&nbsp;// never with regex
</code></pre><br />
This says, &#8220;make sure neither mousePressed nor mouseReleased were invoked in this specification. Your excitement for this feature will depend on your excitement for Regexs in general. </p>
<p><strong>Method Constraints</strong><br />
Spock reinvents <a href="http://code.google.com/p/hamcrest/">Matchers</a>, doing away with the verbose syntax. The previous examples used equality in the matches:<br />
<pre><code>1 * listener.mouseClicked(MOUSE_EVENT_1)
</code></pre><br />
This is going to perform an equals() comparison on the argument to make sure it matches exactly. You also briefly saw the _ constraint, meaning match anything at all no matter what:<br />
<pre><code>1 * listener.mouseEntered(_)
</code></pre><br />
And there is also the wildcard with type constraint, which will match anything with the specified class:<br />
<pre><code>1 * listener.mousePressed(_ as MouseEvent)
</code></pre><br />
You can even get fancy with custom constraints, where you can easily specify in a closure the details of your match. That sure beats implementing IArgumentMatcher!<br />
<pre><code>1 * listener.mouseReleased( { it.source.getClass() == JLabel } ) 
</code></pre><br />
Negatives work as well, such as &#8220;not null&#8221; or &#8220;not an instance&#8221;:<br />
<pre><code>1 * listener.mouseExited(!null) 
1 * listener.mouseClicked(!MOUSE_EVENT_3) 
</code></pre><br />
There are a lot of options, and there are no subclasses or interfaces to implement. Everything is a one liner without a lot of DSL daisy chaining of method calls. I like it, and I&#8217;m excited to use it heavily up at camp next week. </p>
<p><strong>Target Constraints</strong><br />
Matchers, or constraints, aren&#8217;t just for parameters in Spock. I have never seen this before, but you can add an expectation on the left hand side of mocks, not just the right hand side. In effect, there is a way to say, &#8220;expect that method X was invoked on any of my mock objects in scope, I don&#8217;t care which one&#8221;. In this example, there are 2 mouse listeners in scope, and mouseClicked is randomly invoked on only one of them. The assertion makes sure that at least one was invoked:<br />
<pre><code>def &quot;Target constraint Example&quot;() {

&nbsp;&nbsp;&nbsp;&nbsp;setup:
&nbsp;&nbsp;&nbsp;&nbsp;def listeners = [Mock(MouseListener), Mock(MouseListener)]

&nbsp;&nbsp;&nbsp;&nbsp;when:
&nbsp;&nbsp;&nbsp;&nbsp;def x = new Random().nextInt()
&nbsp;&nbsp;&nbsp;&nbsp;listeners[x % 2].mouseClicked MOUSE_EVENT_1

&nbsp;&nbsp;&nbsp;&nbsp;then:
&nbsp;&nbsp;&nbsp;&nbsp;1 * _.mouseClicked(_)
}
</code></pre><br />
Admittedly, I do not have a real use for this today. But it is unique, I have never seen it before. </p>
<p><strong>Failures Accumulate</strong></p>
<p>One last point to mention&#8230; failures in expectations accumulate. No exception is thrown until the end of the method, at which point all failures are reported in a batch. For instance, assume that the following expectations are run, and all of them fail:<br />
<pre><code>then:
2 * listener.mouseClicked(_)
3 * listener.mouseClicked(_)
4 * listener.mouseClicked(_)
</code></pre><br />
The resulting error message reports all failures, not just the first one:<br />
<pre><code>Too few invocations for:

2 * listener.mouseClicked(_)&nbsp;&nbsp; (1 invocation)
3 * listener.mouseClicked(_)&nbsp;&nbsp; (0 invocations)
4 * listener.mouseClicked(_)&nbsp;&nbsp; (0 invocations)
</code></pre></p>
<p>Great stuff. You can try out Spock in the <a href="http://meetspock.appspot.com/">SpockConsole</a>, and you can see some photos from out last Code Camp on <a href="http://www.flickr.com/photos/canoo/sets/72157622668055248/">Flickr</a>. And watch this space for future posts after we are all finished. Thanks!</p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://canoo.com/blog/2010/04/20/spock-and-test-spies-a-logical-choice/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://canoo.com/blog/2010/04/20/spock-and-test-spies-a-logical-choice/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Interview with Hamlet D&#8217;Arcy</title>
		<link>http://canoo.com/blog/2010/04/15/interview-with-hamlet-darcy/</link>
		<comments>http://canoo.com/blog/2010/04/15/interview-with-hamlet-darcy/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 07:42:52 +0000</pubDate>
		<dc:creator>Felix Schrape</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Interview]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[hamlet]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=1020</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/04/15/interview-with-hamlet-darcy/";</script>Canoo Software Engineer Hamlet D&#8217;Arcy was interviewed for the GR8 conference about his professional background and his conference contribution as well as Groovy and the Canoo Hackergarten.
Here&#8217;s the link to the interview! And here are some pictures of Hamlet during Canoo Day 2010:
  
var dzone_style="2";//]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/04/15/interview-with-hamlet-darcy/";</script><p>Canoo Software Engineer Hamlet D&#8217;Arcy was interviewed for the GR8 conference about his professional background and his conference contribution as well as <a href="http://groovymag.com/" target="_blank">Groovy</a> and the <a href="http://hackergarten.net/" target="_blank">Canoo Hackergarten</a>.</p>
<p><a href="http://www.gr8conf.org/blog/2010/04/15/70" target="_blank">Here&#8217;s the link to the interview</a>! And here are some pictures of Hamlet during Canoo Day 2010:</p>
<p><img class="alignnone size-medium wp-image-1021" title="DSC_0750" src="http://canoo.com/blog/wp-content/uploads/2010/04/4520260415_b5934c9745_b-199x300.jpg" alt="DSC_0750" width="199" height="300" /> <img class="alignnone size-medium wp-image-1022" title="DSC_0772" src="http://canoo.com/blog/wp-content/uploads/2010/04/4520896696_5cf1a3e7fc_b-199x300.jpg" alt="DSC_0772" width="199" height="300" /> <img class="alignnone size-medium wp-image-1023" title="DSC_0777" src="http://canoo.com/blog/wp-content/uploads/2010/04/4520897276_d4e9d27b8a_b-199x300.jpg" alt="DSC_0777" width="199" height="300" /></p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://canoo.com/blog/2010/04/15/interview-with-hamlet-darcy/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://canoo.com/blog/2010/04/15/interview-with-hamlet-darcy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Which JVM language is for you?</title>
		<link>http://canoo.com/blog/2010/03/18/which-jvm-language-is-for-you/</link>
		<comments>http://canoo.com/blog/2010/03/18/which-jvm-language-is-for-you/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 08:42:25 +0000</pubDate>
		<dc:creator>Felix Schrape</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Interview]]></category>
		<category><![CDATA[JAX]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=990</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/03/18/which-jvm-language-is-for-you/";</script>Enjoy a new video of Canoo Fellow Dierk König in action:
In this discussion, panel members Dierk König, Guillaume Laforge (Groovy), Charles Nutter (JRuby), Stefan Tilkov (Clojure) and Ted Neward (Scala) discuss with the audience the pros and cons of the popular JVM-based lanauges Scala, Groovy, JRuby and Clojure in order to attempt to reach a [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/03/18/which-jvm-language-is-for-you/";</script><p><strong>Enjoy a new video of Canoo Fellow Dierk König in action</strong>:</p>
<div id="attachment_991" class="wp-caption alignnone" style="width: 310px"><a href="http://skillsmatter.com/podcast/ajax-ria/scala-groovy-jruby-clojure-which-jvm-language-is-for-you/zx-486"><img class="size-full wp-image-991" title="Video" src="http://canoo.com/blog/wp-content/uploads/2010/03/Bild-1.png" alt="&quot;Scala, Groovy, JRuby, Clojure - Which JVM language is for you?&quot;" width="300" height="254" /></a><p class="wp-caption-text">&quot;Scala, Groovy, JRuby, Clojure - Which JVM language is for you?&quot;</p></div>
<p>In this <a href="http://skillsmatter.com/podcast/ajax-ria/scala-groovy-jruby-clojure-which-jvm-language-is-for-you/zx-486" target="_blank">discussion</a>, panel members Dierk König, Guillaume Laforge (Groovy), Charles Nutter (JRuby), Stefan Tilkov (Clojure) and Ted Neward (Scala) discuss with the audience the pros and cons of the popular JVM-based lanauges Scala, Groovy, JRuby and Clojure in order to attempt to reach a verdict of rank. The panellists try to logically wade through arguments based on the key concepts of each language along with their primary applications and try to resolve clichéd comparisons such as performance.</p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://canoo.com/blog/2010/03/18/which-jvm-language-is-for-you/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://canoo.com/blog/2010/03/18/which-jvm-language-is-for-you/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dierk König interviewed: &#8220;The future of Groovy++ is within your Grasp&#8221;</title>
		<link>http://canoo.com/blog/2010/02/12/dierk-konig-interviewed-on-groovy/</link>
		<comments>http://canoo.com/blog/2010/02/12/dierk-konig-interviewed-on-groovy/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 13:31:41 +0000</pubDate>
		<dc:creator>Felix Schrape</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Interview]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=982</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/02/12/dierk-konig-interviewed-on-groovy/";</script>

JAXenter interviewed Canoo Fellow Dierk König on Groovy++. Read the Interview in German or join the Groovy++ Group dedicated to discussions of experimental statically typed compiler for Groovy programming language!
Update: As from now, the interview is also available in English! By the way: What is &#8220;Groovy++&#8221;?
Dierk König: Groovy + + is an extension of Groovy, [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/02/12/dierk-konig-interviewed-on-groovy/";</script><p><img class="alignnone size-full wp-image-983" title="spaceball" src="http://canoo.com/blog/wp-content/uploads/2010/02/spaceball.gif" alt="spaceball" width="1" height="1" /></p>
<p><img class="alignnone size-full wp-image-985" title="2564811356_ae6514497f" src="http://canoo.com/blog/wp-content/uploads/2010/02/2564811356_ae6514497f.jpg" alt="2564811356_ae6514497f" width="500" height="333" /></p>
<p>JAXenter interviewed Canoo Fellow Dierk König on Groovy++. <a href="http://it-republik.de/jaxenter/news/Die-Zukunft-von-Groovy%2B%2B-ist-zum-Greifen-nah.-053877.html" target="_blank">Read the Interview in German</a> or join the <a href="http://groups.google.com/group/groovyplusplus/" target="_blank">Groovy++ Group</a> dedicated to discussions of experimental statically typed compiler for Groovy programming language!</p>
<p><em>Update</em>: As from now, <a href="http://jaxenter.com/The-future-of-Groovy-is-within-your-Grasp-10239.html" target="_blank">the interview is also available in English</a>! By the way: What is &#8220;Groovy++&#8221;?</p>
<p><strong>Dierk König</strong>: Groovy + + is an extension of Groovy, which makes Groovy code pretty much as fast as native Java. In addition, you get static type checking plus type inference, yielding the benefits of compile-time safety but without the noise. To use the language extension, you only need one additional jar file in the classpath. Then you can annotate the required code parts &#8211; classes for example &#8211; with @Typed. The rest happens automatically. This approach takes advantage of Groovy&#8217;s ability to hook into the compilation step with AST Transformations. The name &#8220;Groovy + +&#8221; indicates that it is still Groovy, and therefore encompasses the entire beauty of the language syntax while exceeding the standard characteristics. <a href="http://jaxenter.com/The-future-of-Groovy-is-within-your-Grasp-10239.html" target="_blank">Read on!</a></p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://canoo.com/blog/2010/02/12/dierk-konig-interviewed-on-groovy/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://canoo.com/blog/2010/02/12/dierk-konig-interviewed-on-groovy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Canoo Fellow Dierk König about Pros and Cons of Language Diversity</title>
		<link>http://canoo.com/blog/2010/01/25/canoo-fellow-dierk-konig-about-pros-and-cons-of-language-diversity/</link>
		<comments>http://canoo.com/blog/2010/01/25/canoo-fellow-dierk-konig-about-pros-and-cons-of-language-diversity/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 08:43:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java RIA]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[SaaS]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[Dierk König]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=943</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/01/25/canoo-fellow-dierk-konig-about-pros-and-cons-of-language-diversity/";</script>Watch an interesting interview (in German) with Dierk König about the actual language diversity in the Java community — Groovy, Scala, Clojure, JRuby and all the rest of them! If you are interested in this topic, we also recommend to take a look on the schedule of the Java Language Days 2010 (moderated by Dierk König and Markus [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/01/25/canoo-fellow-dierk-konig-about-pros-and-cons-of-language-diversity/";</script><p><a href="http://it-republik.de/jaxenter/news/JAX-TV-Dierk-Koenig-ueber-Pro-und-Contra-der-Sprachenvielfalt-053492.html" target="_blank">Watch an interesting interview</a> (in German) with Dierk König about the actual language diversity in the Java community — Groovy, Scala, Clojure, JRuby and all the rest of them! If you are interested in this topic, we also recommend to take a look on the schedule of the <a href="http://it-republik.de/konferenzen/jax2010/specialdays/">Java Language Days 2010</a> (moderated by Dierk König and Markus Völter (<a href="http://www.itemis.com/">itemis</a>).</p>
<p><a href="http://it-republik.de/jaxenter/news/JAX-TV-Dierk-Koenig-ueber-Pro-und-Contra-der-Sprachenvielfalt-053492.html" target="_blank"><img class="alignnone size-full wp-image-944" title="Dierk König interviewed" src="http://canoo.com/blog/wp-content/uploads/2010/01/Bild-2.png" alt="Dierk König interviewed" width="544" height="309" /></a></p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://canoo.com/blog/2010/01/25/canoo-fellow-dierk-konig-about-pros-and-cons-of-language-diversity/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://canoo.com/blog/2010/01/25/canoo-fellow-dierk-konig-about-pros-and-cons-of-language-diversity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Significant Software Development Developments 2009</title>
		<link>http://canoo.com/blog/2010/01/14/significant-software-development-developments-2009/</link>
		<comments>http://canoo.com/blog/2010/01/14/significant-software-development-developments-2009/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 09:34:49 +0000</pubDate>
		<dc:creator>Felix Schrape</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java RIA]]></category>
		<category><![CDATA[JavaOne]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=888</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/01/14/significant-software-development-developments-2009/";</script>Recently, Dustin Marx postet his top ten of the most &#8220;Software Development Developments of 2009&#8220;. Here is a short summary as a basis for further discussion:
Mergers and Acquisitions: SpringSource acquiring Cloud Foundry, SpringSource itself being acquired by VMware; Oracle&#8217;s acquisition of Virtual Iron and GoldenGate, Microsoft&#8217;s acquiring of Interactive Supercomputing, Google&#8217;s acquisitions of companies such as [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2010/01/14/significant-software-development-developments-2009/";</script><p>Recently, <a href="http://marxsoftware.blogspot.com/">Dustin Marx</a> postet his top ten of the most &#8220;<a href="http://www.javaworld.com/community/?q=node/3869">Software Development Developments of 2009</a>&#8220;. Here is a short summary as a basis for further discussion:</p>
<div style="font-weight: normal;"><strong>Mergers and Acquisitions</strong>: <em>SpringSource </em>acquiring <em>Cloud Foundry,</em> <em>SpringSource</em> itself being acquired by <em>VMware</em>; <em>Oracle</em>&#8217;s acquisition of <em>Virtual Iron</em> and <em>GoldenGate</em>, <em>Microsoft</em>&#8217;s acquiring of <em>Interactive Supercomputing</em>, <em>Google</em>&#8217;s acquisitions of companies such as <em>reCAPTCHA</em> and <em>Teracent</em>, etc.</div>
<p><span style="font-weight: normal;"><strong>Changing Landscape of Software Development Conferences</strong>: <em>Colorado Software Summit</em> and <em>SDWest</em> and <em>SD Best Practices</em> terminated their long-running tradition in 2009. There is speculation that <em>JavaOne 2009</em> may have been the last.</span></p>
<p><span style="font-weight: normal;"><strong>Java IDE Wars</strong>: <em>IntelliJ IDEA</em> has been the only one of the four leading Java IDEs that has not been available without charge. In 2009, the availability of an open source community edition of <em>IntelliJ IDEA</em> potentially changed the Java IDE landscape.</span></p>
<p><span style="font-weight: normal;"><strong>Groovy</strong>: <em>Groovy</em> claims to be &#8220;the most popular and successful dynamic language for the JVM&#8221;. According to Marx, this certainly seems to be the case (he mentions the high number of books on <em>Groovy</em> (and <em>Grails</em>) and the existence of a <em>DZone</em> area dedicated to Groovy (<a href="http://groovy.dzone.com/">Groovy Zone</a>) for evidence.</span></p>
<p><span style="font-weight: normal;"><strong>Java EE 6</strong>: Marx defines the December release of <em>Java EE 6</em> as a significant development in the enterprise space.</span></p>
<p><span style="font-weight: normal;"><strong>Oracle buys Sun</strong>: According to Marx, even developers who do not use <em>Sun</em> or <em>Oracle </em>products are likely to be at least indirectly affected by this acquisition because it will almost certainly affect the entire software development competitive landscape.</span></p>
<p><span style="font-weight: normal;"><br />
</span></p>
<p>Also included in the ranking were topics as:</p>
<ul>
<li><strong>Programming Environments for Mobile Devices</strong></li>
<li><strong>Bing Search Engine</strong></li>
<li><strong>Scala</strong></li>
<li><strong>Java SE 7 News</strong></li>
<li><strong>Cloud Computing</strong></li>
<li><strong>Google Chrome OS</strong></li>
</ul>
<p>If you are interested in Marx&#8217; full review of 2009, please read his blog entry at <a href="http://www.javaworld.com/community/?q=node/3869">JW Blogs</a>. He also cited other annual reviews from <a href="http://java.dzone.com/articles/java-2009-retrospective">JavaLobby</a> and <a href="http://www.computerworld.com/s/article/9142626/Software_development_s_winners_and_losers_2009_edition">Computerworld</a>. <strong>So what are last year&#8217;s most significant developments in software development from your point of view?</strong></p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://canoo.com/blog/2010/01/14/significant-software-development-developments-2009/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://canoo.com/blog/2010/01/14/significant-software-development-developments-2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Groovy &amp; Grails eXchange 2009: Dierk König on Code kata</title>
		<link>http://canoo.com/blog/2009/12/10/groovy-grails-exchange-2009-dierk-konig-on-code-kata/</link>
		<comments>http://canoo.com/blog/2009/12/10/groovy-grails-exchange-2009-dierk-konig-on-code-kata/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 15:21:13 +0000</pubDate>
		<dc:creator>Felix Schrape</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Technical Concepts]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=859</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2009/12/10/groovy-grails-exchange-2009-dierk-konig-on-code-kata/";</script>While preparing the second edition of &#8220;Groovy in Action&#8221;, Canoo Fellow Dierk König once again worked systematically through the language and came across a number of new features that slipped by his attention when they were added. His talk (from Groovy &#038; Grails eXchange 2009, London) presents those features in a workshop-like manner with demos, [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://canoo.com/blog/2009/12/10/groovy-grails-exchange-2009-dierk-konig-on-code-kata/";</script><p>While preparing the second edition of &#8220;Groovy in Action&#8221;, Canoo Fellow Dierk König once again worked systematically through the language and came across a number of new features that slipped by his attention when they were added. His talk (from <a href="http://www.grails-exchange.com/">Groovy &#038; Grails eXchange 2009</a>, London) presents those features in a workshop-like manner with demos, live coding and lots of interaction with the audience. <a href="http://skillsmatter.com/podcast/java-jee/code-kata-improving-your-groovy-kung-fu-workshop">Watch the video on Skills Matter</a>!</p>
<p><span style="color: #ffffff;">.</span></p>
<div id="attachment_860" class="wp-caption alignnone" style="width: 310px"><img class="size-medium wp-image-860" title="Dierk and James" src="http://canoo.com/blog/wp-content/uploads/2009/12/3688354826_64d896118c-300x199.jpg" alt="Dierk with James Gosling during Jazoon 2009" width="300" height="199" /><p class="wp-caption-text">Dierk with James Gosling during Jazoon 2009</p></div>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://canoo.com/blog/2009/12/10/groovy-grails-exchange-2009-dierk-konig-on-code-kata/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://canoo.com/blog/2009/12/10/groovy-grails-exchange-2009-dierk-konig-on-code-kata/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
