Hi, I’m Matt Stine, and I have technology ADD…

Yes, it’s true. I came to the realization that there is such a thing as TADD…technology attention deficit disorder. Ironically, I came to this realization while reading a sample chapter from the upcoming book from the Prags, Pomodoro Technique Illustrated: Can You Focus – Really Focus – for 25 Minutes? You see, it’s Pragmatic Programmer Writing Month (follow the trail that begins here), and I finally set aside an hour today to begin writing. At present, I just can’t make up my mind what book topic I want to focus on. I have the following in mind:

  • Polyglot Programming
  • Agile Testing Strategies
  • Groovy/Grails Automated Testing
  • Functional Programming in a JVM World
  • Or, perhaps, a topic that hasn’t churned up from my R-mode brain yet…

So, I have decided that I want to write an article detailing my development of http://www.duckduckgoosedesigns.com in Grails, an article that I hope will appear in an upcoming issue of Groovymag. It seemed like a good idea – write on something that I know very well and that I think could be helpful to others. Not only that, but it just might prime the writing pump for a bigger work like, maybe, a book! So, as I started writing, it occurred to me that I needed to let WebDevPub know that the entire source code for the online store was available at GitHub, so I jumped into the article submission site and added a note. This reminded me that I had not yet applied license headers to my source files, so I jumped into IDEA to use the Copyright Plugin to do so. It was at this point that I figured out that the Copyright Plugin does not support Groovy or GSP files, so I decided it would be a good idea to write a Grails script that would automatically do this. In the process, I decided to jump over to TweetDeck and let the world know of my intentions. It was at this point that I realized I had not yet followed @praglife on Twitter, so I fired that off. Realizing I wasn’t quite sure of the @praglife Twitter handle, I jumped over to the blog, and while looking for it noticed the news item about the Pomodoro book. I clicked on it and downloaded the sample chapter on interruptions. While scanning through and reading about internal interruptions, I realized that I was in the middle of one. My simple task – to focus on writing an article, had been interrupted by a stream of internal interruptions that led me to reading about internal interruptions. I have TADD. I’m out of denial, so what’s the next step? ;-)

Thoughts so far on #springone2gx

It’s now Wednesday night, day 2.5 of SpringOne/2GX in New Orleans, LA. Normally I like to blog about each session that I attend when I make it to SpringOne, but as this has been my first year here as a speaker, I’ve spent practically all of my free time tweaking my presentation and demos. So, I wanted to summarize my reflections thus far before I forget them.

First of all, my talk went off fantastically. I presented Case Study: SRM 2.0 – A next generation shared resource management system built on SpringSource dm Server, which summarized our experiences using OSGi and SpringSource dm Server as the foundation for the enterprise application that we’re about to release into production. There was a small but very enthusiastic crowd, and I fielded quite a few questions both during the talk and immediately following. I was very encouraged to see nothing but green in the evaluation bucket at the back of the room, and this tweet was the icing on the cake.

Second, I’ve been extremely impressed with the venue. After attending the last two years in Hollywood, Florida, I can’t help but think that this move was one of the best that was made. The Roosevelt Hotel is very charming, and the banquet staff here is top notch. I’ve attended quite a few conferences, and the food here is definitely some of the best I’ve ever had. Not only that, but there is an entirely different energy level here in New Orleans – just hearing the live jazz piping into my hotel room every night from the French Quarter below is very nice.

Third, the combination of SpringOne and 2GX, the Groovy and Grails conference, into one event has topped my expectations. Being able to bounce back and forth between two of my favorite technologies has been awesome. Getting the latest scoop on Spring 3.0 and diving into Griffon during the same morning was great. Not only that, but getting to interact with my tweeps from SpringSource and the G3 community during the same week has been a blast. My only regret is that I didn’t have my talk more finalized before the event so that I could spend more time with the hallway conversations.

Quick reviews of the sessions that I’ve attended thus far:

  • What’s New in Spring 3.0 (Arjen Poutsma) – This was a great overview of the new and notable in Spring 3.0. I was very excited to see just how simple and powerful the REST support that is now built directly into Spring MVC will be. The only letdown was that Arjen didn’t dye his hair this year.
  • Intro to Griffon: Grails for RIAs (Danno Ferrin) – This was my first opportunity to hear a full blown talk on Griffon. Danno did a fantastic job walking us through how to use Griffon to develop a simple weather dashboard widget. I absolutely can’t wait to write my first Griffon app. Now that my session is done, I may start tonight!
  • Grails Internals (Jeff Brown) – Jeff Brown is live coding at its best. I love his ZERO slides approach, and I learned quite a bit about the different metaprogramming aspects used to deliver Grails functionality. I’m more than inspired to contribute to plugins at a higher level now.
  • MOPing up Groovy (Venkat Subramaniam) – Whether you’re interested in the topic or not, one must attend AT LEAST one Venkat talk whenever he’s in the same town as you. This talk was mostly focused around the metaprogramming topics that Venkat covered in Programming Groovy, but seasoned with Venkat’s unique blend of off the cuff humor. From no one else will you hear, “We don’t want to duplicate code…at least not in public.”
  • Grails for the Enterprise (Robert Fischer) – I must admit, I didn’t really NEED to go to this talk. I was mainly interested in checking out Robert as a speaker and hearing his strategies for driving Grails adoption. I liked his approach, and I really enjoyed his live coding session at the back end of the talk. He has quite a bit of energy and created a very rich interaction with the crowd.
  • Functional Groovy (Hamlet D’Arcy) – This was by far the best session of the conference for me thus far. Hamlet walked us through the 10 commandments of functional programming using Groovy as the syntax for exploration, sprinkled in a healthy amount of The Little Schemer, explained that using a non-functional language to learn functional programming was like learning OO in Cobol, and found a way to tie in Zen and the Art of Motorcycle Maintenance, Plato, Aristotle, elephants, and ducks.
  • What’s new in dm Server 2.0 (Ben Hale) – Ben walked us through the new and notable in dm Server 2.0. A great app server has gotten even better!

So there you have it. I’m looking forward to a nice relaxing day tomorrow (now that I don’t have demos and slides to tweak all day) and a quick flight home to rejoin my wife and kids. See you tomorrow Grant and the girls!

Making Java “Groovier” with LambdaJ

I spent the better part of yesterday tracing my way through the codebase for a large-scale enterprise application that my team is building right now, and I happened upon the following piece of code:

//...imports excluded for clarity
public class BusinessActivityBinMetaClassHelper {
//...
   public static List<Long> getSrmMetaClassIdListJava(List<BusinessActivityBinMetaClass> businessActivityBinMetaClassList) {
      List<Long> srmMetaClassIdList = new ArrayList<Long?();

      if(businessActivityBinMetaClassList != null) {
         for(BusinessActivityBinMetaClass businessActivityBinMetaClass : businessActivityBinMetaClassList) {
             if(businessActivityBinMetaClass.getSrmMetaClass() != null && businessActivityBinMetaClass.getSrmMetaClass().getSrmMetaClassId() != null) {
               srmMetaClassIdList.add
                  (businessActivityBinMetaClass.getSrmMetaClass().getSrmMetaClassId());
            }
         }
      }

      return srmMetaClassIdList;
   }
//...
}

As I read this code, I thought “This just SCREAMS a need for Groovy’s closure iterators.” So, last night I quickly hacked out fully-equivalent Groovy version of the code:

class GroovyExample {

   static def getSrmMetaClassIdListGroovy(def businessActivityBinMetaClassList) {
      businessActivityBinMetaClassList?.collect { it?.srmMetaClass?.srmMetaClassId }.findAll { it != null } ?: new ArrayList<Long>();
   }
}

Whew! Much nicer. What did we get out of this? Well…

  • Groovy’s dynamic typing cleaned up all of the unnecessary type declarations – the only static typing is where we return an empty ArrayList of Longs if the argument to our method is null (a bit of odd behavior, but required to make this code equivalent to the parent Java code.
  • We were saved 4 painful null checks by the use of Groovy’s null safe dereferencing operator (?.) and the simplified ternary operator otherwise affectionately known as the “Elvis Operator” (?:).
  • Using Groovy’s collect method, we were able to transform the original list into a list containing Long values by passing in a closure that pulls out the property value of interest.
  • Because we’re using null safe dereferencing, we are actually inserting nulls into our list if any of the dereferencing fails. Therefore, Groovy’s findAll Collection filtering method comes to the rescue. We simply provide it with a closure that returns true for all of the values we want to keep – in this case, “it != null.”
  • Perhaps most importantly, we’ve shorted our code from 11 lines (including whitespace lines for clarity) to ONE LINE that much more clearly expresses the intent of the code.

Great – why don’t we just rewrite the entire application is Groovy? Well, hold on just a minute. At the time we started this application, as much as some of us loved Groovy, we just didn’t have enough Groovy mindshare to go there yet. On top of that, we were already experimenting with several new architectural ideas and technologies, and Groovy would have added yet one more risk to the puzzle. I say all this to acknowledge that sometimes you just can’t move to another language for one reason or another, regardless of how attractive its features may be.

But let’s take a queue from the Pragmatic Programmer and explore the LOTY (Language of the Year) concept one more time. One of the reasons that you’re encouraged to learn new languages is to change the way you program in your main language. You may learn Groovy, Scala, Clojure, Ruby, etc., etc., etc. and never use them in your day job – and yet the experience of coding in a new language with new constructs and idioms will necessarily change the way you THINK about programming in every other language.

So, let’s think about the possibility of coding something that is much more similar to the Groovy version and yet stick with regular Java code. Fortunately, there are several libraries out there that bring much of the flavor and power of Groovy’s closure iterators to Java. I’d like to focus in on one of them, LambdaJ (http://code.google.com/p/lambdaj/).

LambdaJ provides constructs that allow us to “…manipulate collections in a pseudo-functional and statically typed way.” Let’s take a look at this example implementing using LambdaJ:

//...some imports excluded for clarity
import ch.lambdaj.function.convert.Converter
import static ch.lambdaj.Lambda.*
import static org.hamcrest.Matchers.*

public class BusinessActivityBinMetaClassHelper {
//...
   public static List<Long> getSrmMetaClassIdListJava(List<BusinessActivityBinMetaClass> businessActivityBinMetaClassList) {
      return (businessActivityBinMetaClassList != null) ? filter(notNullValue(),convert(businessActivityBinMetaClassList, new IdExtractor())) : new ArrayList<Long>();
   }

   class IdExtractor implements Converter<BusinessActivityBinMetaClass,Long> {
	Long convert(BusinessActivityBinMetaClass from) {
	   if (from.getSrmMetaClass() != null && from.getSrmMetaClass().getSrmMetaClassId() != null) {
	      return from.getSrmMetaClass().getSrmMetaClassId();
	   }
   }
}

Not quite as nice as the Groovy code – we got A LOT out of the null-safe dereference and Elvis operators. However, our overall intent is still a bit clearer. Let’s analyze:

  • First we need to implement one of LambdaJ’s Converters. A Converter is nothing more than a generic Interface that defines one method: T convert(F from), where F is the type we’re converting from and T is the type we’re converting to. In this case, we want to convert an object of type BusinessActivityBinMetaClass to an object of type Long. Our implementation determines how this conversion takes place, in this case by extracting the id property from its child.
  • Next, after statically importing the methods of ch.lambdaj.Lambda, we call the convert method, passing it our List and our newly implemented Converter. This gives us the equivalent of Groovy’s collect method, with the Converter taking the place of the closure.
  • We’re still shoving nulls into our List with this implementation, so we further filter our list using LambdaJ’s “filter” method, passing it the list returned by “filter,” and a Hamcrest matcher that returns only notNullValue()’s.
  • Finally, we use our old friend the ternary operator to return the empty ArrayList of Long values if our method argument is null.

If you don’t count the Converter implementation, we’ve gotten ourselves down to 2 lines of code (1 if you don’t mind long lines). In this case I implemented IdExtractor as a named inner class – you could do this with an anonymous inner class and it would look a lot more like a closure, but the added noise of all of the null checking made the undesirable for me. Perhaps if your code has less noise (or guarantees that values aren’t null), that would be a better approach.

Another alternative is to make IdExtractor a top-level class that, if general enough, could be reused throughout the codebase. The benefit of this is that you now have a nice code unit rather than a battery of static methods in a utility class, and unit testing becomes much more clean and elegant.

So, we’ve still made some progress and made our code a bit more Groovy. I encourage you to explore LambdaJ’s feature set and see how it might make your code a bit more concise with clearer intent. And just to stir up a little controversy, look what would have happened in Java 7 had the null safe dereference and Elvis operator’s made the Project Coin cut:

//...some imports excluded for clarity
import ch.lambdaj.function.convert.Converter
import static ch.lambdaj.Lambda.*
import static org.hamcrest.Matchers.*

public class BusinessActivityBinMetaClassHelper {
//...
   public static List<Long> getSrmMetaClassIdListLambdaJ(List<BusinessActivityBinMetaClass> businessActivityBinMetaClassList) {
      return filter(notNullValue(),convert(businessActivityBinMetaClassList,
         new Converter<BusinessActivityBinMetaClass,Long> {
            Long apply(BusinessActivityBinMetaClass from) { return from?.getSrmMetaClass()?.getSrmMetaClassId()}
         })) ?: new ArrayList<Long>();
   }
}

Nice, huh? ;-)

Test Driven Development Worked for Me!

Our team got to spend a few days with Jared Richardson this week, talking tech leadership, agile, and automated testing. At some point during the opening day’s discussion, I related the story of how I initially got into Test Driven Development (TDD) and how it seriously ramped up my productivity and decreased my defect count.

In early 2003, we were slowly dragging through development of the first version of our Shared Resource Management system. At the time our development model looked a little something like this:

1) Code until you run into an unimplemented dependency;
2) Repeat until one of the dependencies is checked in;
3) Big Bang Integration!
4) Debug, debug, debug…
5) Repeat until something pseudo-demoable is ready.

As you might imagine, this wasn’t a very productive way to work, but unfortunately it was all most of us knew. At the time I thought we really needed to improve on our testing so that we could eliminate a lot of the defects that at the time I didn’t realize were being caused by our development model. I asked my boss if I could start a QA effort and not too much later found the XP/Agile Universe conference that was held in August 2003. It was my hope that we could learn about how to properly test/QA our software there as there seemed to be a lot of talks about this “TDD” thing. I got approval to attend, and while down there I was immersed in this new culture of Extreme Programming (XP) and Agile.

At one point I ventured into a room that was setup like what many of us would call a SCRUM/Team room today, where a group of folks were all coding away on a system and making its “Fit” tests pass. I quickly paired up with a gentleman and we went to work. At some point Brian Marick came over and asked what we were working on. I fumbled through a description of the requirement and he then asked, “Well, where’s your test?” I said that we didn’t have one, and he then said something that at the time was very profound to me, “Well, you can’t write any code until you have a failing test!”

I spent most of my time waiting in the airport to return to Memphis reading Uncle Bob’s “Agile Software Development: Principles, Patterns, and Practices.” Needless to say, I was fired up.

When I returned to work in the following weeks, I essentially tried two different tactics in parallel to share what I learned with my team.

First, I practiced what Jared calls “2×4 Development,” or, beating your team in the shins with a 2×4 until they start doing TDD, pair programming, continuous integration, etc. I even delivered my own version of the agile manifesto to the entire department, and the most profound comments I got out of that were “I can’t ever imagine us paying two developers to sit at the same computer and work on the same code,” and “Well, who’s going to test the test code?!?!”

Needless to say, this didn’t work very well. My second tactic was much more guerrilla in nature. I told the guy that I was working with that I didn’t care what he did with the rest of his time, as long as he checked in his interfaces before he started to code. Now I had something to mock! I then proceeded to TDD all of my code. I advertised my productivity in terms of test cases passing with a little counter on my whiteboard. Development was fun again, as I could get instant feedback on how my code was working and I knew that it was interacting properly with its dependencies. Sure enough, when those big bang integrations happened, my code rarely seemed to be the source of the defects, and I quickly found myself getting pulled into other parts of the code to help develop since I had already gotten my typical assignment finished!

We delivered the section of the system that I developed using TDD much faster than any part that I had worked on up to that point (no hard numbers, but I have a pretty good memory of that time), and in addition, I wrote the CLEANEST code I had ever written up to that point.

So, while Jared wouldn’t recommend you try TDD if the rest of your team isn’t on board – you’re never going to get someone who doesn’t care about tests to fix one that they broke – this guerrilla tactic worked well for me and got me some recognition as a guy who could write good clean code fast! If I could go back to that point, I think I would have tried Defect Driven Testing first or in addition to my GTDD.

So, how are you getting your team test infected?

Isabella featured on Totally Tots

meet_bella

Isabella, my second oldest daughter, just made the cutoff to be featured on one of the very popular “Mommy Blogs” out there, Totally Tots. Way to go Bella!

#JavaOne Brain Dump Resources from Memphis JUG Meeting

I promised that I would post the links I mentioned in my talk last night at the Memphis JUG…here they are:

General Session Replays: http://java.sun.com/javaone/2009/general_sessions.jsp

BlogTalkRadio: http://www.blogtalkradio.com/JavaOne

JavaOne Minute: http://channelsun.sun.com/video/channel-you/javaone+minute/23867338001

Technical Sessions 2008-2009: http://developers.sun.com/learning/javaoneonline/ (Must be SDN Member – FREE!)

The Da Vinci Machine Project: http://openjdk.java.net/projects/mlvm/

Groovy: http://groovy.codehaus.org

Java.net Community Corner: http://wiki.java.net/bin/view/Javaone/CommunityCorner

JUGS Community: http://community.java.net/jugs/

Scala: http://scala-lang.org

SpringSource: http://www.springsource.com

JUG-USA: https://jug-usa.dev.java.net/

OpenSolaris: http://opensolaris.org

Neal Ford: http://nealford.com (Can download his slides here)

Findbugs: http://findbugs.sourceforge.net

Grails: http://grails.org

Grails Podcast: http://www.grailspodcast.com

JavaFX: http://javafx.com

Griffon: http://griffon.codehaus.org

Java Store: http://store.java.com

Jython: http://jython.org

Clojure: http://clojure.org

JRuby: http://jruby.codehaus.org

Sun Cloud: http://cloud.sun.com

Project Kenai: http://kenai.com

Zembly: http://zembly.com

NetBeans: http://netbeans.org

Book Review: Career 2.0 – Take Control of Your Life

I’ve finally published my review of the EXCELLENT book by Jared Richardson and Matthew Bass at DZone. Check it out here: http://books.dzone.com/reviews/career-20-take-control-your.

#JavaOne 2009 Return of the Puzzlers: Schlock and Awe

For several years now, Neal Gafter (Microsoft) and Joshua Block (Google), have made a habit of presenting various incarnations of this technical session, focused on what they call “Java Puzzlers.” Java Puzzlers are nothing more than short Java programs with curious behavior. It is a somewhat interactive session, with each puzzler’s code listing followed by a four possible choices (A,B,C,D) to answer the question: “What does it print?” Neal and Joshua “require” that every attendee vote for their answer. After the vote, they reveal the correct answer and how to fix the problem. At the end of each problem presentation is the most important part, which is the Java programming principle that is illuminated by the puzzler. These are important tools to carry with you as you go forth a develop your Java code.

The following is a listing of the problem titles that were presented:

  1. Life’s Persistent Questions
  2. Instruments of Torture
  3. Iterator Titillator
  4. Searching for the One
  5. Cogito Ergo Sum
  6. Thread Friendly
  7. When Words Collide

I’m going to spend my time focused on the last puzzler, as it was the one for which I was ABSOLUTELY CERTAIN that I knew the correct answer. Here’s the code listing:

public class PrintWords {
  public static void main(String[] args) {
    System.out.println(
      Words.FIRST + " " + Words.SECOND + " " + Words.THIRD);
  }
}

public class Words { // Compile PrintWords against this version
  public static final String FIRST  = "the";
  public static final String SECOND = null;
  public static final String THIRD  = "set";
}

public class Words { // Run against this version
  public static final String FIRST  = "physics";
  public static final String SECOND = "chemistry";
  public static final String THIRD  = "biology";
}

So here’s the problem. We have two versions of class “Words.” We compile class “PrintWords” against the first version and we then run the class against the second version. What does it print out? I used my trusty “seasoned Java programmer” knowledge to assert that the program would print “the null set.” Why? Well, any seasoned Java programmer realizes that static final variables (or “constant variables” – what a curious concept) are inlined by the compiler. So it’s quite obvious that “the” would be inlined wherever FIRST appears, null would be inlined wherever SECOND appears, and “set” would be inlined wherever THIRD appears.

Imagine my frustration when Josh and Neil announced that the program would in fact print “the chemistry set.” As it turns out, null cannot be inlined! It is not a constant variable. So when we run our Java program, the JVM smartly picks up the non-null value of SECOND that is is able to find in the new version of Words.

Simply because this one got me, I wanted to highlight it for my readers. The “moral” of this story is that only primitives and strings can be constant, and that null is not a constant. One should use a constant field ONLY if its value will NEVER change. For final fields whose value may change, they suggest the use of an ident() method:

// Returns its argument
private static String ident(String s) {
  return s;
}

// None of these fields are constant variables
public class Words {
  public static final String FIRST  = ident("the");
  public static final String SECOND = ident(null);
}

The compile will not inline the call to ident.

Want more? Pick up a copy of Neal and Josh’s book, Java Puzzlers: Traps, Pitfalls, and Corner Cases!

JUG-USA Meeting with James Gosling at #JavaOne

James Gosling On Wednesday morning, JUG-USA was fortunate enough to get about 45 minutes with the “Father of Java” himself, James Gosling. Each year at JavaOne, Sun distributes registration discount codes to interested JUG’s. The JUG with the most registrations using their code gets this meeting. JUG-USA’s founding allowed us to use a bit of strength in numbers to wrestle this crown from the bigger European JUG’s for the first time that I know of.

The session was setup as an informal Q&A. I took furious notes on several of the questions that were most interesting to me, and I’ll do my best to collate them into something intelligible here. Note that where I use quotes it’s mostly to set off his answers…please don’t take them as direct, but as paraphrases.

The first couple of questions surrounded web buzz. James sees Web 2.0 as “hype for folks who want to sell their books.” When asked about the semantic web, he says his feelings are mostly positive, but maybe its an answer searching for a question. He feels that some parts of it will never perform.

When asked about Scala, I was pleased to hear him say, “I like Scala a lot. They’re doing some pretty nice stuff.” He talked about how functional languages lend themselves to proving properties of programs, which can then lead to automatic decomposition onto multiprocessor systems. He wishes that the Scala guys would focus more on this aspect. He also said that he fears that Scala is almost going down the Perl route of making things “too concise” and that it’s still awfully hard for many programmers to “get” the functional stuff.

The next question was a rather predictable one – “James, now that you have the benefit of 14 years of experience with the Java language, is there anything you would have done differently?” Funny thing was the first thing out of his mouth was that the current AWT event model would have been one of the first things to go. Generics and closures were things he quickly mentioned that he wanted to have done, but he also said that there was quite a bit of arguing within the Java team about polishing for years vs. shipping the language. James said he felt like there was a certain window of opportunity out there that they needed to ship the language within to be successful (and it looks like they hit it). Continuing on down the list, James mentioned Eiffel-style precondtions and postconditions and type inferencing. He explained that the entire type system was designed to make C programmers comfortable, and at the time that was clearly the right decision. He state that at this point, the C/C++ comfort factor counts for nothing, and remarked that the casting syntax in Java is just “dumb.” A follow-up question surrounded whether or not primitives should be a part of the language. James called this a hard problem, asserting that a “uniform type model can lead to bumpy behavior or bad performance.” He said that the Scala specification gets around this with a dual object hierarchy (I need to look this up to see what he means.). He continued to talk about the definition of equality vs. identity, explaining that primitives can’t have identity; in fact, they may never exist except as a figment of the compilers imagination, optimized away (my notes are fuzzy on this…when I get the recording I’ll clean this up).

The next question surrounded a statement that one attendee of the recent Google I/O conference heard, that threads are “deprecated” as a concurrency model. James immediately retorted that concurrency has very many ideas around it, and that it has been an active Ph.D. thesis generator for 30+ years. He mentioned competing models such as Actors in Scala and Erlang, and Communicating Sequential Processes (CSP) process algebra from Occam. He asserted that with CSP most people typically don’t “think that way very well. People with Math degrees think it’s cool, but everybody else is kind of like…huh?” He stated that no data sharing between threads makes a lot of problems go away, but that often times casting problems that way can be intractable. A big quotable: “All of the different threading paradigms feel to me like whack-a-mole.” He closed the concurrency question by mentioning Guy Steele’s work on Fortress, where they are doing automatic decomposition from functional constructs into multiple threads of execution, making all of this issue transparent to the programmer.

Since this is getting pretty long, I’ll mention that James says he knows that Larry Ellison, Oracle CEO (and Sun “suitor”) has downloaded JavaFX and personally written apps with it, saying it is “pretty darn tasty!” (Again, don’t take this as quoted…it’s definitely paraphrased).

Other quotables: “Android – it’s hard to know what to think about it. It seems like a corner hobby project, chaos looking for a place to happen.”

“The exception system was DESIGNED to be a complete PITA.”

All-in-all, a great time was had by all. Thanks James for your time, it was definitely fascinating hearing your thoughts on so may different areas of the Java landscape.

JUG-USA with James Gosling

More connecting at #JavaOne 2009

I happened to catch Guillaume LaForge’s tweet this morning about a “Groovy lunch” at JavaOne today. After our JUG-USA meeting with James Gosling(blog entry on this one to come), I made my way over to the “cafeteria” and found Guillaume, James Williams (of the Griffon team), and John Smart in exactly the location that Guillaume specified. We were shortly joined by Grails in Action (a.k.a. San Gria) co-author Glen Smith. Topics ranged from things we can do better with Groovy/Grails testing, the differences between the Groovy and other dynamic/scripting language communities, Groovy’s victory in the ScriptBowl, and none other than the differences in public transportation between the southeastern US and the Bay Area. I had a great time guys and will see you at the BOF.

I also finally got the chance to meet Dick Wall of the Java Posse. Dick is just as great in person as he has sounded for the past couple of years on the podcast. Unfortunately our chat was ever so brief, focused around the language features Dick would like to see in future versions of Scala. We were quickly ushered over to the Java.net “presentation area” to participate in Josh Marinacci’s JavaFX Q&A. Was also good meeting him and seeing the cool new UI controls in FX.

Follow

Get every new post delivered to your Inbox.