Since we have limited time each day to learn new languages, language features, and APIs, we must decide where to focus our learning efforts.
When first approaching a new language, the learning path is fairly obvious. Climbing up the learning path, most of us start to feel comfortable with a language when can develop in it the kinds of applications we're interested in. But it is just at that point that many of us reach a plateau: while we maintain a desire to learn more, we also invest less and less time mastering new language features and techniques.
That should make perfect sense when placed in the context of motivation. We typically learn a new language (spoken or artificial) because we anticipate some payoff from the invested time and effort. The best learning experiences are those that offer some payoff early in the process, such as the joy observing "Hello, World!" appear on the console for the first time.
New JSRs, new language features slated for each subsequent JDK release, and the multitude of open-source projects that in some way relate to our work, all vie for our desire to learn and use those new technologies. In addition, for each of the past few years, interest in languages other than Java has been on the rise in the Java community.
Given that the time we can devote to that learning is limited, where do you think the biggest payoffs in learning about new Java features lie? Or do you believe that mastering other languages can yield a bigger payoff at the present than more learning about Java could? To put it in another way: What's on your Java (or non-Java) learning list?
I think that even when the examples were manufactured it was helpful for me to force myself to use a State pattern or Strategy pattern in a program just to see how it worked. What was much more useful, however, was to have a copy of Michael Feather's "Working effectively with legacy code" by my side when attempting to make a monolithic application testable. Thats probabvly the most useful Refactoring book I have seen, because it breaks down the work into atomic, realistic fragments and illustrates how to get from A to E when it simply doesn't seem possible. Kerievsky's "Refactoring to Patterns" is also pretty useful.
I have found this more valuable than learning ne wlanguage features.
I believe Java annotations are one of the most powerful features introduced. The number of applications of annotations are far from limited and it is the onus of the community to tap its full power. From being handy for developing neat frameworks for development and customization of enterprise applications to being applied in design pattern mining experiments, annotations can serve a wide variety of purposes. So we should be pro-active in mastering this feature so as to inventing more applications.
The second on the list is learning to make effective and neat use of functional programming features. One can pick a language like Scala to begin with. As most Java developers are not well versed with functional patterns, it is high time we master this powerful feature.
Apart from this, I believe we should try and dig into the java.lang.XML, ie XML literals in Java. We as developers, who have felt the pain of writing large pieces of code for even simple XML operations, are in a better position to give good suggestions and feedback in order to arrive at a very clean implementation.
> Apart from this, I believe we should try and dig into the > java.lang.XML, ie XML literals in Java. We as developers, > who have felt the pain of writing large pieces of code for > even simple XML operations, are in a better position to > give good suggestions and feedback in order to arrive at a > very clean implementation.
I think XML literals are one of the worst ideas to come about in recent times. If the first version of JAXB hadn't been such a misguided debacle we probably wouldn't be in this situation. XML literals is just a step towards the COBOL-ization of Java.
Java reading- any book covering 6.0 (and 5.0) new features as I naturally encounter a need to use them. Java 2D. New Concurrency libs. XML and Java. Performance tuning. Puzzlers Traps and Pitfalls. NIO.
Meta-Java activities with known Big Payoff Patterns books. Manning's IntelliJ book (be a Power User of your IDE) Search for OS projects relevant to my programming.
Non-Java learning Linear algebra Information Retrieval (IR) Codd's Relational Model Algorithms Graphing Semantic Web
There seems to be a convergence of thought recently that the JVM is distinct from Java, and that the _JVM_ may be the home for new innovation. Cases in point: Groovy and JRuby.
I have only started working with Groovy but it has been fruitful due to the synergy between its dynamic typing and the friendly confines of the Java-syntax and especially libraries.
IMHO, this is the space that pays off re: limited learning resources. It is a new, energetic effort that leverages what we already know. In fact, as a troubleshooting tool, Groovy has paid off in spades for me already.
I'll take this innovation, or even new frameworks, over the diminishing returns of esoteric language features. e.g. Generics are hideous and the debate doesn't interest me. Similarly, a debate on the approach to closures in Java is truly academic when I can be _writing_ closures in another language -- esp. one where they seem to "just fit".
ps. Honourable mentions to Hadoop and the Google Web Toolkit, in terms of wishing I had 34 hours in a day.