SlideShare a Scribd company logo
Adopting Grails


Klaus Baumecker
   Hewlett-Packard
About me
Klaus Baumecker
Software Architect & Technologist @
       Hewlett-Packard, Böblingen, Germany


Professional Software Developer since 1992


Java Programmer since 12+ years
Using Groovy & Grails since 3+ years




2
Introduction
We started using Grails in production 2 years ago.
We used Grails already for in-house projects (version 1.0.x)


The following episodes show


        … what we’ve learned and
        … a few best practices derived from it.




3
Context
•   Large product suite for IT-Management in HP Software
•   Two teams developing the next release of a product
    – One   using classic JEE approach
    – Other   using Grails

•   Both web-apps share a common data model based on POJOs and
    Hibernate mapping files
•   All web-apps run inside a JBoss application server
•   Continuous integration builds based on maven
•   Time-boxed development cycles
•   Agile approach with features and stories (SCRUM like)




4
Episode 1 – GORM Constraints
The Grails web-app uses GORM constraints to enforce rules on the
domain classes
There was and (and still is) a general attempt to reduce footprint by
moving common web-app libraries into shared lib space
   therefore the shared domain model (incl. hibernate mapping) became
    a shared library (among others like apache-commons-*, etc)



                           GORM constraints work fine in
                           development (run-app), but are
                           ignored while running production
                           code inside JBoss



5
Episode 1
            GORM constraints were part of the Grails source
            code (src/groovy/…)

            They were loaded by the web-app class loader

            Domain classes and mapping file have been
            loaded by the shared class loader (and loaded
            before the constraints)

            The shared class loader cannot access classes
            within the web-app (only the other way around)

            GORM constraints are ignored!

             Extract constraints and move to shared lib
            space

6
Episode 2 – Flex UI
Demand for graphical editor has led to Flex based UIs.
Communication was XML based.
Then we’ve seen too many Flex timeouts. So we moved to faster
communication with Blaze-DS using the BlazeDS grails-plugin.
We mapped domain classes to Flex classes (Blaze feature).
Better performance now, but…



                         After a round-trip of a data object
                         (grails - flex - grails) we got empty
                         fields in the received object. Although
                         there were properly set before and
                         not modified in the UI.

7
Episode 2


        Our POJO based domain classes have some
        protected fields (public getter, private setter).

        No problem for hibernate.

        Blaze-DS uses commons-bean utilities for mapping
        from/to POJOs and ignores asymmetric fields.

         Need DTO and some tool to define mapping. We
          use Dozer (dozer.org)




8
Grails with BlazeDS or not?
Motivation: Optimization (High performance data transfer)!...But
sometimes you really need
    –a   different rendering strategy (partial vs. all at once)
    –a   fix for your slow performing back end (Flex timeouts)


Use cases
    – Event   Browser for IT-Mgmt:
     •   Large list of IT events to be viewed by an operator (> 20000 events)
     •   Interactive operations on events (e.g. filtering, dynamic updates from the server)

    – More    advanced client/server communication (pub/sub, push)



Main issues
    – Another    layer in your communication
    – No   controller level (Blaze works on services directly)  breaks Grails paradigm
     •   Same with other communication extensions directly working on services (remoting plugin).
     •   Some security plugins do not work as expected
9
Generalizing the Controller layer
•   Grails services w/
    controller semantics        Controller
                                                                                          Other
                                Layer                HTTP          BlazeDS    Remoting
•   Avoiding redundant          (transport spec.)                                        Access

    authorization


                                Services                                Business
                                Layer (atomic ops,                       Service
                                caller neutral)
          Grails       Grails
                                                                       Transaction
         Controller   Service



                                Business Logic                Business           Business
                                Layer (optional)            Logic Services     Logic Service




    10
Episode 3 – Design your web services
We’re using XML for most of our UI/backend communication.
Our backend provides web services for UI and automation tools.
The Flex guy says: Add a special attribute to the XML to make my
rendering easier.
Architect says: Don’t fiddle with the automation interface!




                        How to setup my web services to
                        fit the needs for UI and
                        automation?



11
Episode 3


        Flex = Rich UI  Treat your UI as another
        automation client.

        Don’t allow UI specifics to show up in the XML. If
        you don’t, you’ll end up in maintaining parallel XML
        flows.

        My recommendation for XML generation
        • gsp.xml
        • Plain XML code is easy to read and maintain
        • No DTO required (as in BlazeDS or JAXB). Map
          domain data to XML inside the gsp.



12
Episode 4 – Meta Programming
Due to a change of the architecture some domain classes are no longer
stored in our DB. They stored with a different technique (out of our
control).
GORM methods are no longer available.
Store and retrieval is replaced by new a persistence API incl. new DAOs


                      We still have many consumers of
                      the (original) classes all over the
                      place.

                      How to minimize refactoring?




13
Episode 4

        Enhance the meta-class of the old classes by the
        missing GORM functions (get(..), simple finders).

        Meta-class methods map to the new API.

        Existing code remains unchanged.

        But do this with care!

        Comment your code and explain it in your tech
        meeting.




14
Episode 5 – Developer Support
Programmers with strong Java background often feel lost with reduced
IDE support.


They miss(ed) code completion, static analysis, compile errors, etc.




                       How can we reduce the whining
                       and complaining, while moving
                       them into the Groovy/Grails
                       world?




15
Episode 5


        Get a good IDE.

        Spent effort in installing analysis tools into your
        build. E.g. run CodeNarc analysis.

        Write your own CodeNarc rules according to your
        internal regulations and needs

        Own rule brought some safety back: “Finding
        dynamic variable”.




16
Episode 6 – Modularization with Plugins
Each web-app developed services which became useful in the other
web-app.


Inter-web-app communication is easy to set-up but not really a solution
     – Architecture,   security, etc.
     – E.g.   RMI



Reusing a Grails service inside a Java web-app is not straight-forward.


                                        How can we leverage functionality
                                        across multiple web-apps, keep good
                                        architecture and independent web-app
                                        development in two teams?

17
Episode 6
        Grails-ify the Java web-app. Now you have two
        Grails apps.

        Extract shared services into additional Grails
        plugin(s).

        Create a new umbrella Grails app that loads the two
        main web-apps as plugins.

        The two Grails apps consume the extracted services
        plugins.

        Each of the main web-apps run independently (run-
        app) to keep lightweight development for each team.



18
From applications to plugins
•    Refactor your beans from resources.groovy to a resource location, e.g.
     src/java/myBeans.groovy
     – Watch     out:
       •   Before: “beans = {“
       •   After: “beans {”

•    For each web-app :
     – Refer    to the new beans file within resources.groovy

•    Merging beans in the umbrella app
     – Refer    to the new beans files from the underlying web-apps
     – Wire   beans between web-apps (optional)

•    Add plugin descriptor
•    Adjust URL mapping
•    Merge other resources (e.g. files under web-app/)
     – Requires      extra scripting
19
From applications to plugins (con’t)
beans = {
                                  resource.groovy
                                                    umbrella
    loadBeans(‘/beans2.groovy’)                     web-app
    loadBeans(‘/beans1.groovy’)                      (grails)
}




                                    web-app 1
                                                                     web-app 2
                                  (java, spring,
                                                                    (pure grails)
                                    grailsified)
                                                                         resource.groovy
                                resource.groovy
beans = {                                                          src/java/beans2.groovy
    loadBeans(‘/beans1.groovy’)
}

       src/java/beans1.groovy
beans {
    <your beans here>                               plugin
}                                                    plugin
                                                         plugin
                                                       plugin
                                                        (shared
20
                                                       services)
Summary & Best Practices
•    Clearly articulate the benefits of the framework
     – Not    just cool stuff

•    Reduce emotion (they know what you think anyway)
•    Create a local community
     – find   the people that think like you

•    Use the external community and help others using it
     – Mailing-lists,   IRC, etc.

•    Provide tools
     – IDE,    static analysis, plugins

•    Find situations/cases in which Groovy/Grails really makes a difference
     – E.g
         grails run-app vs. classical web-app redeploy cycle with heavy app servers is a
      huge time saver

•    Stay close to the Grails sweet-spot as long as possible
     – E.g.   Groovy domain model vs. Java domain model
21
Summary & Best Practices (cont’d)
•    Be available
     – Provide   help when necessary
     – Don’t   let the team swim alone

•    Offer/Initiate code reviews/pair-programming
•    Maintain a catalog of design principles and guidelines
     – HowTo(s)

     – Coding guidelines (e.g. use of types, inheritance vs. composition, controller and
      services responsibilities, XML generation strategies, Java vs. Groovy coding etc.)

•    Ideas:
     – Use   the create-* scripts to introduce own templates for controllers and services
     – Provide   own scripts for lab-specific tools




22
Thank You!




       Questions?




                    23

More Related Content

KEY
Developing Mobile HTML5 Apps with Grails
PDF
GR8Conf 2009: Groovy in Fiance Case Study by Jonathan Felch
PDF
GR8Conf 2011: Grails, how to plug in
PDF
Modularizing your Grails Application with Private Plugins - SpringOne 2GX 2012
PDF
Grails Plugin Best Practices
PDF
My "Perfect" Toolchain Setup for Grails Projects
PDF
Using Magnolia in a Microservices Architecture
PDF
Java 9 Modularity in Action
Developing Mobile HTML5 Apps with Grails
GR8Conf 2009: Groovy in Fiance Case Study by Jonathan Felch
GR8Conf 2011: Grails, how to plug in
Modularizing your Grails Application with Private Plugins - SpringOne 2GX 2012
Grails Plugin Best Practices
My "Perfect" Toolchain Setup for Grails Projects
Using Magnolia in a Microservices Architecture
Java 9 Modularity in Action

What's hot (19)

PDF
Spring Boot on Amazon Web Services with Spring Cloud AWS
PDF
The Making of the Oracle R2DBC Driver and How to Take Your Code from Synchron...
PDF
Micronaut: Changing the Micro Future
PPTX
Java modules using project jigsaw@jdk 9
PPTX
Why jakarta ee matters (ConFoo 2021)
PDF
Red Hat Agile integration Workshop Labs
PDF
Introducing Workflow Architectures Using Grails - Greach 2015
PDF
Refactor your Java EE application using Microservices and Containers - Arun G...
PPT
Developing modular Java applications
PDF
Building Grails Plugins - Tips And Tricks
PDF
Application Architectures in Grails
PDF
Modular Java applications with OSGi on Apache Karaf
PPTX
Faster java ee builds with gradle [con4921]
PDF
Micronaut Launchpad
KEY
Scala & Lift (JEEConf 2012)
PPTX
Java EE 8 Update
PDF
Enabling White-Box Reuse in a Pure Composition Language
PDF
Developing Plug-Ins for NetBeans
PDF
Java Modularity: the Year After
Spring Boot on Amazon Web Services with Spring Cloud AWS
The Making of the Oracle R2DBC Driver and How to Take Your Code from Synchron...
Micronaut: Changing the Micro Future
Java modules using project jigsaw@jdk 9
Why jakarta ee matters (ConFoo 2021)
Red Hat Agile integration Workshop Labs
Introducing Workflow Architectures Using Grails - Greach 2015
Refactor your Java EE application using Microservices and Containers - Arun G...
Developing modular Java applications
Building Grails Plugins - Tips And Tricks
Application Architectures in Grails
Modular Java applications with OSGi on Apache Karaf
Faster java ee builds with gradle [con4921]
Micronaut Launchpad
Scala & Lift (JEEConf 2012)
Java EE 8 Update
Enabling White-Box Reuse in a Pure Composition Language
Developing Plug-Ins for NetBeans
Java Modularity: the Year After
Ad

Viewers also liked (6)

PDF
GR8Conf 2011: CodeNarc and GMetrics
PDF
Idiomatic spock
PDF
GR8Conf 2011: Grails 1.4 Update by Peter Ledbrook
PDF
Mum, I want to be a Groovy full-stack developer
PDF
Metaprogramming with Groovy
PDF
Creating and testing REST contracts with Accurest Gradle
GR8Conf 2011: CodeNarc and GMetrics
Idiomatic spock
GR8Conf 2011: Grails 1.4 Update by Peter Ledbrook
Mum, I want to be a Groovy full-stack developer
Metaprogramming with Groovy
Creating and testing REST contracts with Accurest Gradle
Ad

Similar to GR8Conf 2011: Adopting Grails (20)

PPTX
Introduction to Grails 2013
PDF
Cut your Grails application to pieces - build feature plugins
PDF
Grails & the World of Tomorrow
PDF
Grails and the World of Tomorrow
PPT
Introduction To Grails
KEY
groovy & grails - lecture 9
PDF
Groovy & Grails for Spring/Java developers
PPT
Fast web development using groovy on grails
PPTX
Grails Advanced
PDF
Tomas Grails
PDF
Grails 101
PDF
Groovy - Grails as a modern scripting language for Web applications
PDF
Grails 101
PDF
Java Tech & Tools | Grails in the Java Enterprise | Peter Ledbrook
POT
intoduction to Grails Framework
PPT
Groovygrails
PPT
Use Cases of #Grails in #WebApplications
PDF
Web Frameworks of the Future
PDF
Naked Objects and Groovy Grails
PDF
Java Edge.2009.Grails.Web.Dev.Made.Easy
Introduction to Grails 2013
Cut your Grails application to pieces - build feature plugins
Grails & the World of Tomorrow
Grails and the World of Tomorrow
Introduction To Grails
groovy & grails - lecture 9
Groovy & Grails for Spring/Java developers
Fast web development using groovy on grails
Grails Advanced
Tomas Grails
Grails 101
Groovy - Grails as a modern scripting language for Web applications
Grails 101
Java Tech & Tools | Grails in the Java Enterprise | Peter Ledbrook
intoduction to Grails Framework
Groovygrails
Use Cases of #Grails in #WebApplications
Web Frameworks of the Future
Naked Objects and Groovy Grails
Java Edge.2009.Grails.Web.Dev.Made.Easy

More from GR8Conf (20)

PDF
DevOps Enabling Your Team
PDF
Scraping with Geb
PDF
How to create a conference android app with Groovy and Android
PDF
Ratpack On the Docks
PDF
Groovy Powered Clean Code
PDF
Performance tuning Grails applications
PDF
Ratpack and Grails 3
PDF
Grails & DevOps: continuous integration and delivery in the cloud
PDF
Functional testing your Grails app with GEB
PDF
Deploying, Scaling, and Running Grails on AWS and VPC
PDF
The Grails introduction workshop
PDF
The Groovy Ecosystem Revisited
PDF
Groovy 3 and the new Groovy Meta Object Protocol in examples
PDF
Integration using Apache Camel and Groovy
PDF
CRaSH the shell for the Java Virtual Machine
PDF
Grooscript gr8conf
PDF
CRaSH the shell for the Java Virtual Machine
PPTX
Jan reher may 2013
PDF
Good Form - complex web forms made Groovy
PDF
Spring 4-groovy
DevOps Enabling Your Team
Scraping with Geb
How to create a conference android app with Groovy and Android
Ratpack On the Docks
Groovy Powered Clean Code
Performance tuning Grails applications
Ratpack and Grails 3
Grails & DevOps: continuous integration and delivery in the cloud
Functional testing your Grails app with GEB
Deploying, Scaling, and Running Grails on AWS and VPC
The Grails introduction workshop
The Groovy Ecosystem Revisited
Groovy 3 and the new Groovy Meta Object Protocol in examples
Integration using Apache Camel and Groovy
CRaSH the shell for the Java Virtual Machine
Grooscript gr8conf
CRaSH the shell for the Java Virtual Machine
Jan reher may 2013
Good Form - complex web forms made Groovy
Spring 4-groovy

Recently uploaded (20)

PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Empathic Computing: Creating Shared Understanding
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Advanced Soft Computing BINUS July 2025.pdf
PDF
GamePlan Trading System Review: Professional Trader's Honest Take
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
Cloud computing and distributed systems.
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
[발표본] 너의 과제는 클라우드에 있어_KTDS_김동현_20250524.pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
“AI and Expert System Decision Support & Business Intelligence Systems”
Machine learning based COVID-19 study performance prediction
Understanding_Digital_Forensics_Presentation.pptx
Mobile App Security Testing_ A Comprehensive Guide.pdf
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
MYSQL Presentation for SQL database connectivity
Empathic Computing: Creating Shared Understanding
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Reach Out and Touch Someone: Haptics and Empathic Computing
Advanced Soft Computing BINUS July 2025.pdf
GamePlan Trading System Review: Professional Trader's Honest Take
Dropbox Q2 2025 Financial Results & Investor Presentation
NewMind AI Weekly Chronicles - August'25 Week I
Cloud computing and distributed systems.
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
[발표본] 너의 과제는 클라우드에 있어_KTDS_김동현_20250524.pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Unlocking AI with Model Context Protocol (MCP)
Chapter 3 Spatial Domain Image Processing.pdf
The Rise and Fall of 3GPP – Time for a Sabbatical?

GR8Conf 2011: Adopting Grails

  • 2. About me Klaus Baumecker Software Architect & Technologist @ Hewlett-Packard, Böblingen, Germany Professional Software Developer since 1992 Java Programmer since 12+ years Using Groovy & Grails since 3+ years 2
  • 3. Introduction We started using Grails in production 2 years ago. We used Grails already for in-house projects (version 1.0.x) The following episodes show … what we’ve learned and … a few best practices derived from it. 3
  • 4. Context • Large product suite for IT-Management in HP Software • Two teams developing the next release of a product – One using classic JEE approach – Other using Grails • Both web-apps share a common data model based on POJOs and Hibernate mapping files • All web-apps run inside a JBoss application server • Continuous integration builds based on maven • Time-boxed development cycles • Agile approach with features and stories (SCRUM like) 4
  • 5. Episode 1 – GORM Constraints The Grails web-app uses GORM constraints to enforce rules on the domain classes There was and (and still is) a general attempt to reduce footprint by moving common web-app libraries into shared lib space  therefore the shared domain model (incl. hibernate mapping) became a shared library (among others like apache-commons-*, etc) GORM constraints work fine in development (run-app), but are ignored while running production code inside JBoss 5
  • 6. Episode 1 GORM constraints were part of the Grails source code (src/groovy/…) They were loaded by the web-app class loader Domain classes and mapping file have been loaded by the shared class loader (and loaded before the constraints) The shared class loader cannot access classes within the web-app (only the other way around) GORM constraints are ignored!  Extract constraints and move to shared lib space 6
  • 7. Episode 2 – Flex UI Demand for graphical editor has led to Flex based UIs. Communication was XML based. Then we’ve seen too many Flex timeouts. So we moved to faster communication with Blaze-DS using the BlazeDS grails-plugin. We mapped domain classes to Flex classes (Blaze feature). Better performance now, but… After a round-trip of a data object (grails - flex - grails) we got empty fields in the received object. Although there were properly set before and not modified in the UI. 7
  • 8. Episode 2 Our POJO based domain classes have some protected fields (public getter, private setter). No problem for hibernate. Blaze-DS uses commons-bean utilities for mapping from/to POJOs and ignores asymmetric fields.  Need DTO and some tool to define mapping. We use Dozer (dozer.org) 8
  • 9. Grails with BlazeDS or not? Motivation: Optimization (High performance data transfer)!...But sometimes you really need –a different rendering strategy (partial vs. all at once) –a fix for your slow performing back end (Flex timeouts) Use cases – Event Browser for IT-Mgmt: • Large list of IT events to be viewed by an operator (> 20000 events) • Interactive operations on events (e.g. filtering, dynamic updates from the server) – More advanced client/server communication (pub/sub, push) Main issues – Another layer in your communication – No controller level (Blaze works on services directly)  breaks Grails paradigm • Same with other communication extensions directly working on services (remoting plugin). • Some security plugins do not work as expected 9
  • 10. Generalizing the Controller layer • Grails services w/ controller semantics Controller Other Layer HTTP BlazeDS Remoting • Avoiding redundant (transport spec.) Access authorization Services Business Layer (atomic ops, Service caller neutral) Grails Grails Transaction Controller Service Business Logic Business Business Layer (optional) Logic Services Logic Service 10
  • 11. Episode 3 – Design your web services We’re using XML for most of our UI/backend communication. Our backend provides web services for UI and automation tools. The Flex guy says: Add a special attribute to the XML to make my rendering easier. Architect says: Don’t fiddle with the automation interface! How to setup my web services to fit the needs for UI and automation? 11
  • 12. Episode 3 Flex = Rich UI  Treat your UI as another automation client. Don’t allow UI specifics to show up in the XML. If you don’t, you’ll end up in maintaining parallel XML flows. My recommendation for XML generation • gsp.xml • Plain XML code is easy to read and maintain • No DTO required (as in BlazeDS or JAXB). Map domain data to XML inside the gsp. 12
  • 13. Episode 4 – Meta Programming Due to a change of the architecture some domain classes are no longer stored in our DB. They stored with a different technique (out of our control). GORM methods are no longer available. Store and retrieval is replaced by new a persistence API incl. new DAOs We still have many consumers of the (original) classes all over the place. How to minimize refactoring? 13
  • 14. Episode 4 Enhance the meta-class of the old classes by the missing GORM functions (get(..), simple finders). Meta-class methods map to the new API. Existing code remains unchanged. But do this with care! Comment your code and explain it in your tech meeting. 14
  • 15. Episode 5 – Developer Support Programmers with strong Java background often feel lost with reduced IDE support. They miss(ed) code completion, static analysis, compile errors, etc. How can we reduce the whining and complaining, while moving them into the Groovy/Grails world? 15
  • 16. Episode 5 Get a good IDE. Spent effort in installing analysis tools into your build. E.g. run CodeNarc analysis. Write your own CodeNarc rules according to your internal regulations and needs Own rule brought some safety back: “Finding dynamic variable”. 16
  • 17. Episode 6 – Modularization with Plugins Each web-app developed services which became useful in the other web-app. Inter-web-app communication is easy to set-up but not really a solution – Architecture, security, etc. – E.g. RMI Reusing a Grails service inside a Java web-app is not straight-forward. How can we leverage functionality across multiple web-apps, keep good architecture and independent web-app development in two teams? 17
  • 18. Episode 6 Grails-ify the Java web-app. Now you have two Grails apps. Extract shared services into additional Grails plugin(s). Create a new umbrella Grails app that loads the two main web-apps as plugins. The two Grails apps consume the extracted services plugins. Each of the main web-apps run independently (run- app) to keep lightweight development for each team. 18
  • 19. From applications to plugins • Refactor your beans from resources.groovy to a resource location, e.g. src/java/myBeans.groovy – Watch out: • Before: “beans = {“ • After: “beans {” • For each web-app : – Refer to the new beans file within resources.groovy • Merging beans in the umbrella app – Refer to the new beans files from the underlying web-apps – Wire beans between web-apps (optional) • Add plugin descriptor • Adjust URL mapping • Merge other resources (e.g. files under web-app/) – Requires extra scripting 19
  • 20. From applications to plugins (con’t) beans = { resource.groovy umbrella loadBeans(‘/beans2.groovy’) web-app loadBeans(‘/beans1.groovy’) (grails) } web-app 1 web-app 2 (java, spring, (pure grails) grailsified) resource.groovy resource.groovy beans = { src/java/beans2.groovy loadBeans(‘/beans1.groovy’) } src/java/beans1.groovy beans { <your beans here> plugin } plugin plugin plugin (shared 20 services)
  • 21. Summary & Best Practices • Clearly articulate the benefits of the framework – Not just cool stuff • Reduce emotion (they know what you think anyway) • Create a local community – find the people that think like you • Use the external community and help others using it – Mailing-lists, IRC, etc. • Provide tools – IDE, static analysis, plugins • Find situations/cases in which Groovy/Grails really makes a difference – E.g grails run-app vs. classical web-app redeploy cycle with heavy app servers is a huge time saver • Stay close to the Grails sweet-spot as long as possible – E.g. Groovy domain model vs. Java domain model 21
  • 22. Summary & Best Practices (cont’d) • Be available – Provide help when necessary – Don’t let the team swim alone • Offer/Initiate code reviews/pair-programming • Maintain a catalog of design principles and guidelines – HowTo(s) – Coding guidelines (e.g. use of types, inheritance vs. composition, controller and services responsibilities, XML generation strategies, Java vs. Groovy coding etc.) • Ideas: – Use the create-* scripts to introduce own templates for controllers and services – Provide own scripts for lab-specific tools 22
  • 23. Thank You! Questions? 23