Googlier.com News Article Search
Googlier.com Precious Metals Exchange Smart Contracts
Googlier.com Document Services





          The Hard Work of Making Java Easy      
http://test.arachna.com/roller/spidaman/entry/the_hard_work_of_making

The Java backlash that began a few years ago was mostly a J2EE backlash, not against the Java language per se. Too many people took the blueprints too seriously, too literally or just too damned religiously. Too many applications that didn't need EJBs were using them, letting the container manage low level application plumbing invited slow and buggy behaviors that were painful to debug. The backlash has made a lot Perl/Python/PHP enthusiasts express self-righteous vindication and have helped morph the J2EE backlash into a broader Java backlash. Geez, even IBM is getting all spun up on PHP, whodathunk? But I think the dismissal of Java is premature. None of the P languages or Java are without hazards. These days a lot of developers are over the blueprint kool-aid and are standardizing on a simplified and productive stack:

  • Spring Framework
  • Apache (httpd and Tomcat)
  • SQL (MySQL or PostgreSQL)
  • Hibernate (optionally)
However, there is still a rapid development gap. I've heard Java called a "high ceremony" language. Where you can often prototype a lot of functionality in a modest amount of code with the P languages, you end up writing a lot more code to do the same things in Java. On the other hand, the run time errors, sorcerers and hackers adherent to the P languages are at least as guilty of the same brand of excessive zealotry as the blueprint adherents. The practical heresy demands recognizing that you can get it really wrong in just about any programming language. As far as the high ceremony, Java and J2EE are guilty as charged. As if to punish Sun, the developer community has innovated just fine without advance posturing within Sun's prescribed processes (the good news there: many within Sun seem to realize that they can't carry on as a cathedral and, in fact, are embracing the bazaar, bravo!). Spring and Hibernate each offer a degree of code simplification but require a bit of XML-hell. Even though the XML is way simpler to maintain than say, struts-config.xml and EJB deployment descriptors, you've reduced your compile-time safety code maintenance but increased your runtime hazards with more XML. Xdoclet or JSR-175 annotations can simplify a lot of the XML configulation required for Struts and Hibernate but then you might end up in another kind of hell: annotation hell. Choose your hell well!

To really bring rapid development and prototyping to a Java environment, there a lot options to look at such as dynamic JVM languages:

Jython
By most accounts, a mature but quirky Python for the JVM
JRuby
An immature but progressing Ruby for the JVM
Groovy
A failed experiment or work in progress, depending on who you talk to
Ruby on Rails doesn't run on JRuby (supposedly, it's coming). Grails (the artist formerly known as Groovy on Rails) is on v0.1, I'm not holding my breath. What about getting the simple life "convention-over-configuration" in Java? You get some of it simply by using Maven; organize your code to the Maven convention and compiling, testing and packaging your application just works. Eclipse provides so much developer support for Java already, using Maven and Eclipse together is great way to keep a lot of the high ceremony out of your way. But for application development, there are a few rails-alike frameworks for Java that I'm still interested in trying: rife and trails.

I expect in the months ahead to be writing applications with plugin support and that the big win for the dynamic JVM languages for me will be in easing the rapid development of plugins. In other words, I probably wouldn't write an end to end application with them but given a set of interfaces for extension points that can be automatically tested, writing the extensions in JRuby or Groovy sounds compelling.

I actually haven't had time and opportunity to substantially try half the things I've mentioned thus far. Surveying the number of tools, languages and frameworks it's clear that there are a lot of things to consider and that a lot people are concerned with (and working hard on) bringing the down the high ceremony of Java. I'll still be using P languages in the future, too. Down the road, I suspect virtual machines (JVM? parrot? mono/CLR?) will make a lot of these issues fade away and the questions at hand will be around when to use closures and when to use objects, when to annotate and when to externally declare, when to explicitly type or auto-type and so forth. The languages will be incidental as they support shared constructs and virtual machines.

                   




Array ( [a] => 76 [the] => 38 [and] => 29 [href] => 26 [http] => 25 [of] => 21 [to] => 20 [tag] => 20 [Java] => 16 [com] => 14 [in] => 13 [for] => 11 [technorati] => 10 [org] => 10 [that] => 10 [p] => 10 [rel] => 10 [lot] => 10 [nbsp] => 10 [on] => 9 [are] => 9 [li] => 8 [as] => 8 [languages] => 8 [code] => 7 [or] => 7 [but] => 6 [em] => 6 [your] => 6 [dt] => 6 [is] => 6 [dd] => 6 [The] => 6 [title] => 6 [be] => 6 [with] => 5 [there] => 5 [when] => 5 [you] => 5 [I] => 5 [JVM] => 5 [just] => 5 [backlash] => 5 [java] => 5 [P] => 4 [end] => 4 [can] => 4 [ceremony] => 4 [application] => 4 [high] => 4 [will] => 4 [development] => 4 [hell] => 4 [using] => 4 [EE] => 4 [too] => 4 [J] => 4 [still] => 3 [writing] => 3 [www] => 3 [programming] => 3 [up] => 3 [language] => 3 [Spring] => 3 [maven] => 3 [jruby] => 3 [rubyonrails] => 3 [springframework] => 3 [Maven] => 3 [eclipse] => 3 [html] => 3 [rapid] => 3 [jython] => 3 [XML] => 3 [support] => 3 [JRuby] => 3 [way] => 3 [things] => 3 [applications] => 3 [at] => 3 [many] => 3 [Groovy] => 3 [groovy] => 3 [Hibernate] => 3 [more] => 2 [I'm] => 2 [virtual] => 2 [machines] => 2 [I've] => 2 [use] => 2 [Framework] => 2 [same] => 2 [Sun] => 2 [other] => 2 [frameworks] => 2 [it's] => 2 [Rails] => 2 [Ruby] => 2 [net] => 2 [Eclipse] => 2 [dl] => 2 [dynamic] => 2 [ul] => 2 [so] => 2 [say] => 2 [annotations] => 2 [trails] => 2 [hand] => 2 [they] => 2 [within] => 2 [developer] => 2 [far] => 2 [As] => 2 [about] => 2 [really] => 2 [it] => 2 [get] => 2 [guilty] => 2 [time] => 2 [run] => 2 [annotation] => 2 [xdoclet] => 2 [has] => 2 [thread] => 2 [Too] => 2 [few] => 2 [Python] => 2 [PHP] => 2 [without] => 2 [hazards] => 2 [getting] => 2 [people] => 2 [But] => 2 [not] => 2 [were] => 2 [them] => 2 [blueprints] => 2 [news] => 2 [blueprint] => 2 [organize] => 1 [Academic] => 1 [by] => 1 [Is] => 1 [packaging] => 1 [works] => 1 [convention] => 1 [testing] => 1 [apache] => 1 [provides] => 1 [Crap] => 1 [compiling] => 1 [standardizing] => 1 [id] => 1 [interested] => 1 [months] => 1 [expect] => 1 [dev] => 1 [https] => 1 [rife] => 1 [rifers] => 1 [trying] => 1 [rails-alike] => 1 [much] => 1 [out] => 1 [keep] => 1 [great] => 1 [together] => 1 [already] => 1 [tss] => 1 [some] => 1 [simply] => 1 [What] => 1 [You] => 1 [sun] => 1 [progress] => 1 [work] => 1 [experiment] => 1 [failed] => 1 [A] => 1 [codehaus] => 1 [took] => 1 [progressing] => 1 [who] => 1 [immature] => 1 [An] => 1 [reference] => 1 [sourceforge] => 1 [Guidelines] => 1 [quirky] => 1 [mature] => 1 [depending] => 1 [talk] => 1 [convention-over-configuration] => 1 [v] => 1 [life] => 1 [simple] => 1 [theserverside] => 1 [breath] => 1 [my] => 1 [holding] => 1 [against] => 1 [known] => 1 [se] => 1 [formerly] => 1 [artist] => 1 [Grails] => 1 [grails] => 1 [coming] => 1 [per] => 1 [supposedly] => 1 [doesn't] => 1 [ahead] => 1 [mostly] => 1 [plugin] => 1 [CLR] => 1 [around] => 1 [questions] => 1 [away] => 1 [fade] => 1 [issues] => 1 [these] => 1 [make] => 1 [mono] => 1 [closures] => 1 [parrot] => 1 [ago] => 1 [was] => 1 [suspect] => 1 [road] => 1 [Down] => 1 [future] => 1 [years] => 1 [objects] => 1 [down] => 1 [forth] => 1 [Work] => 1 [Making] => 1 [Easy] => 1 [began] => 1 [constructs] => 1 [shared] => 1 [incidental] => 1 [auto-type] => 1 [annotate] => 1 [variables] => 1 [auto] => 1 [brian] => 1 [slesinsky] => 1 [type] => 1 [explicitly] => 1 [declare] => 1 [externally] => 1 [I'll] => 1 [bringing] => 1 [big] => 1 [wouldn't] => 1 [points] => 1 [extension] => 1 [interfaces] => 1 [set] => 1 [given] => 1 [an] => 1 [write] => 1 [probably] => 1 [tested] => 1 [words] => 1 [In] => 1 [plugins] => 1 [easing] => 1 [most] => 1 [me] => 1 [win] => 1 [automatically] => 1 [extensions] => 1 [hard] => 1 [thus] => 1 [working] => 1 [concerned] => 1 [consider] => 1 [clear] => 1 [tools] => 1 [number] => 1 [Surveying] => 1 [mentioned] => 1 [sounds] => 1 [half] => 1 [try] => 1 [substantially] => 1 [opportunity] => 1 [had] => 1 [haven't] => 1 [actually] => 1 [compelling] => 1 [accounts] => 1 [literally] => 1 [By] => 1 [brand] => 1 [recognizing] => 1 [demands] => 1 [heresy] => 1 [practical] => 1 [adherents] => 1 [zealotry] => 1 [excessive] => 1 [express] => 1 [wrong] => 1 [self-righteous] => 1 [least] => 1 [vindication] => 1 [adherent] => 1 [hackers] => 1 [sorcerers] => 1 [errors] => 1 [enthusiasts] => 1 [Perl] => 1 [helped] => 1 [fine] => 1 [good] => 1 [processes] => 1 [prescribed] => 1 [Sun's] => 1 [buggy] => 1 [posturing] => 1 [advance] => 1 [innovated] => 1 [any] => 1 [community] => 1 [behaviors] => 1 [painful] => 1 [punish] => 1 [if] => 1 [charged] => 1 [debug] => 1 [made] => 1 [have] => 1 [morph] => 1 [realize] => 1 [SQL] => 1 [None] => 1 [These] => 1 [However] => 1 [optionally] => 1 [days] => 1 [PostgreSQL] => 1 [MySQL] => 1 [Tomcat] => 1 [premature] => 1 [httpd] => 1 [Apache] => 1 [developers] => 1 [over] => 1 [kool-aid] => 1 [stack] => 1 [productive] => 1 [gap] => 1 [heard] => 1 [into] => 1 [amount] => 1 [On] => 1 [broader] => 1 [Geez] => 1 [do] => 1 [even] => 1 [IBM] => 1 [all] => 1 [modest] => 1 [called] => 1 [spun] => 1 [functionality] => 1 [prototype] => 1 [often] => 1 [whodathunk] => 1 [Where] => 1 [think] => 1 [dismissal] => 1 [seem] => 1 [slow] => 1 [Patterns] => 1 [simplify] => 1 [kind] => 1 [another] => 1 [might] => 1 [then] => 1 [Struts] => 1 [required] => 1 [configulation] => 1 [JSR-] => 1 [radio] => 1 [Xdoclet] => 1 [runtime] => 1 [increased] => 1 [maintenance] => 1 [safety] => 1 [compile-time] => 1 [EJBs] => 1 [need] => 1 [javaranch] => 1 [you've] => 1 [look] => 1 [Jython] => 1 [end-to-end] => 1 [seriously] => 1 [simplified] => 1 [damned] => 1 [religiously] => 1 [such] => 1 [options] => 1 [val] => 1 [environment] => 1 [prototyping] => 1 [bring] => 1 [To] => 1 [well] => 1 [Choose] => 1 [syndrome] => 1 [didn't] => 1 [reduced] => 1 [descriptors] => 1 [can't] => 1 [hibernate] => 1 [Hard] => 1 [degree] => 1 [offer] => 1 [each] => 1 [NET] => 1 [Persistence] => 1 [Relational] => 1 [plumbing] => 1 [require] => 1 [invited] => 1 [bravo] => 1 [bazaar] => 1 [embracing] => 1 [fact] => 1 [cathedral] => 1 [carry] => 1 [level] => 1 [bit] => 1 [deployment] => 1 [though] => 1 [EJB] => 1 [xml] => 1 [struts-config] => 1 [than] => 1 [maintain] => 1 [simpler] => 1 [letting] => 1 [Even] => 1 [beust] => 1 [XML-hell] => 1 [no] => 1 [container] => 1 [manage] => 1 [AOP] => 1 [low] => 1 [archives] => 1 [weblog] => 1 [simplification] => 1 )

© Googlier LLC, 2019