Advanced Java - whats YOUR opinion?

by Paul Browne

I been asked to spec an 'Advanced Java' training course. The list (below) contains a couple of ideas of what should be on such a course but 'Advanced Java' means different things to different people. Over the many years you've spent with Java, you've specialised - partly out of what interests you, and partly out of the work that's been available.

So the question is: What do you think an Advanced Java training course should contain?.

I'll narrow it down it bit - it's got to be stuff that's mainstream or almost mainstream (however much I'd like to cover JavaSpaces). It's not dogmatic - i.e. it's not the 'Enterprise Java and nothing else' that was common a couple of years back. But it does have to be of interest / of a level for people coding Java for 3 years or more , and who want to push their skills to the next level. (I also suspect that I'm going to learn as much from them on this course).

Just as important, why do you think [insert topic here] should be included on the course? Leave a comment.

Current Menu of Topics (Full Course description here)

(this list is an early draft , so I'm prepared for some glaring omissions!)

  • Aspect Orientated programming
  • Spring Framework
  • Hibernate
  • Ruby , JRuby and other scripting languages in the JVM
  • Java and .Net (C# , VB.net) interoperability
  • Struts 2 Web Toolkit
  • Agile Programming , Junit and Fitnesse
  • Java , Web and Ajax
  • Business Rules and Rule Engines
  • Workflow and Business Process Engineering Language (BPEL)
  • Search in Java Applications - using Google and Apache Lucene
  • Enterprise Service Bus
  • Service Orientated Architecture.
  • Eclipse Advanced features (also WSAD - IBM / JBoss IDE)
  • JDeveloper Advanced Features
  • JMS & Messaging
  • Introduction to Architecture and design patterns
  • JSF - Java Server Faces and Oracle ADF , Apache MyFaces
  • Apache Tomcat and Jboss
    Advanced Features.
  • Google Web Toolkit
  • Maintaining older systems
  • Refactoring
  • Agents
  • Web Services
  • What's new in Java 5
  • What's new in EJB 3
  • Key Java Open Source Projects
  • Server side Java for Mobile Solutions


What am I missing? What should I delete? Let me know.

Paul , Technology in Plain English

41 Comments

Trond Andersen
2007-03-06 10:22:18
I think if you're focus isn't enterprise Java - why is it almost only enterprise products/APIs in the list?


I think an advanced Java course should be a course for those who programmed Java for some years. Gotten to know the language, but maybe not gone into all details.


So I think my starting point would have been Joshua Bloch's books: Effective Java and the Puzzler book. Learn the in and out of the language. Proper use of generics, how to write good JavaDoc, maybe unit testing, annotations. If any enterprise features - focus on the parts which is included in JSE - like JDBC, Web Services. Run PMD and FindBugs on source code and give input on good design. Example on really good APIs and the bad ones. Now THATS an advanced Java course.


2007-03-06 10:23:07
At the level of core language features, the following are rarely adequately covered:


1) Implementing generics
2) The relationship between class loaders and namespaces as described in Liang and Bracha's paper
3) Annotations

skormos
2007-03-06 10:52:13
I tend to agree with Mr. Anderson here. You look at some of these topics, and they certainly are not relevant in the context of a language discussion, many even exclude programmers who are not familiar or not interested in some of these technologies.


If you set up the course to provide a basis where people can springboard to other frameworks and APIs (Spring, JMS, Struts), by gving them an understanding of advanced concepts in the language itself, it would be more beneficial.


Things like Refactoring, Design Patterns (as it pertains to Java), generics (as previously mentioned), classloaders, advanced algorithms in java (hashtables, sorting, etc). These topics set people up to understand JMS, Spring, Hibernate, etc. and let people more fend for themselves.

Ricardo Cisternas
2007-03-06 11:43:01
I agree with the other posters. It is most important to focus a class on Advanced Java on attributes that are relevant to the language itself, its evolution and how to take best advantage of its features instead of concentrating on the API or technology du jour (How many competing ways can you think of to do competent O/R mapping in Java? Which one will prevail?).


Besides annotations, generics, class loaders and now scripting which are all part of the Java platform, I would suggest devoting some time to garbage collection strategies and other memory management issues. A section to AOP seems a given as a natural extension to the language even though Sun has not provided official support yet.


Markus Kohler
2007-03-06 14:37:24
Hi,
I would add Performance.
Which tool to use for which type of performance problem is something that a lot of developers are not that familiar with.
Writing high performance code can be difficult.


Regards,
Markus

Peter Kelley
2007-03-06 14:55:31
You mention other JVM scripting languages but no mention of Groovy and Grails specifically. I think that these two technologies deserve a mention and they can lead in to a discussion of Spring and Hibernate which they use under the covers.


I also think that you might want to mention continuous integration tools like Cruise Control.

Fernando
2007-03-06 15:01:07

I think you should either change the title of the course, or create a different list of topics.



For "Advanced Java" I'd expect topics about the Java language and the Java platform, like:



  • Classloaders

  • Concurrency (threading, locking, deadlocks, java.util.concurrent package, memory model)

  • Performace (Profiling)

  • Debugging/Monitoring

  • Object Serialization in depth (many implications here that many developers ignore)

  • Object identity (hashcode, equals, practical implications on collections and ORM)

  • Java Security

  • Bytecode generation (code "instrumentation")

  • ...


Keith Weinberg
2007-03-06 16:31:56
You should cover dynamic proxies and reflection. They are the underpinnings of many of the topics you have listed and truly are "advanced Java" topics.


JNDI interfacing with LDAP is pertinent.


Java Security and JAAS might also be appropriate.


Swing (maybe with Netbeans' Matisse GUI editor since you have other editors there) is a rite of passage for advanced developers, including issues with Event Handling and Threading.


Finally, you may want to add "What's new in Java 6" to the list since you are already considering adding in scripting language support.

Michael
2007-03-06 21:10:23
Fernando is right on. Most of the stuff mentioned in your laundry list has nothing to do with Java programming. It's like comparing math and applied math. Your list is applied Java. It is not advanced Java. Fernando's list is much better. Throw in reflection and introspection while you're at it. I'd also throw a deep dig into the java.util package since most people don't really understand the datastructures in there and misuse them terribly.
Stephen Downey
2007-03-07 01:40:03
I agree with Fernado's list and would also add reflection to it. Trond mentioned Joshua Bloch's book Effective Java, this has to be the best Java book I have ever bought.


I would also do a refresher on inheritance and other basic Object Orientated concepts. I have worked with people in the past that can write Java code but don't understand the basics concepts of overriding methods and inheritance.

Jonathan O'Connor
2007-03-07 01:43:10
Paul,
I would add Proxies and Java byte code enhancement with libraries like Javassist. You also need to talk about testing, including mock objects.


Looking at your topics, you have the following sections:
Java language features
JEE features
Various frameworks
IDEs and toolsets
Other languages


If I were you, I'd drop the last two topics.


Concentrate on tools that improve the process of creating code:
e.g. Quality checkers like FindBugs and PMD, Code Coverage tools like Clover and Emma, Profilers, Debuggers, Continuous Integration and testing.

igor
2007-03-07 01:57:06
swing apa framework ?
igor
2007-03-07 01:57:59
swing
Bernard Sumption
2007-03-07 02:06:26

I think that the exact content (which will to an extent be dictated by the client) is actually less important than the style. Far too many "Advanced" talks and seminars go too slowly for good programmers. Let's use AOP as an example. In a 1 hour workshop I would want:



  • No introduction - assume that if people don't already know roughly what AOP does then they smart enough to pick it up as you go along.

  • A 15 minute hard-core introduction to the theory: present a single good example of a cross-cutting concern, design an aspect-oriented solution with UML diagrams of how aspects and classes relate.

  • A 15 minute lightning tour of the Eclipse AspectJ Development Tools as the instructor writes the classes and aspects described in the introduction and runs the finished example.

  • The remaining half hour doing a programming assignment, with the instructor available for Q&A. Any required files or eclipse projects should already be loaded on the machines in the classroom.


The trick is not to piss off your advanced programmers. If the technology you're teaching is relevant, people ought to get it immediately; if you spend the first half hour justifying why AOP is great, people will fall asleep and you'll never get them back. If you worry that this might leave some people behind you can have a separate introductory AOP course for people with no exposure to it at all, or managers/architects who want to know about the costs and benefits.

Michael B
2007-03-07 02:34:41
I agree with most of the above that you should keep it vanilla, stuff like Hibernate Spring EJB are covered in other seminars. It shouldn't be a free for all scratch the surface frenzy.


Perhaps if you would look at advanced classes of those topics and look at what kind of generic java concepts you need for them. If you make a list of those concepts you probably end up with something like fernando's list. I would avoid tossing to many genetic Software Engineering concepts in there(or rather avoid focusing on them specifically) as people expect a java class.


Regarding the first list, I would look at something about Dynamic Component Support(OSGi and JSR mess?) it seems to going find it's way into Java SE and will impact us all. Stuff like JNI is also missing from the list. (yes, there does seem to be life outside the jvm)

Tim O'Brien
2007-03-07 06:54:13
Paul, how dare you list Ruby and JRuby you should be ashamed of yourself! I could read the "Ruby Agenda" all over this post, you are shameless.


:-)


Teaching is very tough because you always think that a given course or class should include more. I'd suggest that you narrow down your web focus-areas. Focus on one framework either Struts 2 or Spring MVC. If you were going to teach someone something meaningful about everything on that list, I think it would take the greater part of a decade.


Roque Martinez
2007-03-07 08:58:30
Paul;
I agree with most of the posts here, there should be a focus on the advance topics such as Patterns, Generics, class loading to name a few. After many interviews, many of the "senior" developers can code but they do not undersand why they write a class certain way. I think java developers need to understand why stringBuffer is better than using ""+"".


Thanks
Rocky

Paul Browne
2007-03-07 12:32:24
Thanks to everybody for their comments - you've given me a lot to think of. Several people left comments on similar topics , so here's my thoughts (and take it that I could still be wrong).



  • Advanced Java v Applied Java apologies for the confusion. The course should be more correctly called 'Applied Java' with the focus on getting things done. That said , some of the more elegant / advanced features mentioned (e.g. Generics, Javadoc, Classloaders, Object Serialisation and Identity) are worthy of a mention.

  • Swing (or your UI toolkit of choice) I would see either as part of a basic Java course (e.g. just enough to get some visual samples running when learning Java features) or worthy of a 5 day course in itself.

  • Concentrate on the Core as commented, there is too much stuff here, with most likely areas to drop being IDE specific stuff (better for a mentoring session) and other scripting langages (how do you agree which one to use? do we have enough time to cover?). Final call will probably be with the people attending the course.

  • Course Format two good , but contradictory suggestions were (i) go in at the deep end , assume that students can keep up and (ii) teach the advanced basics (e.g. Inheritence) that people should know, but too often don't. All depends on the group of people on the day , I suppose.

  • The phrase Laundry List was used , and it's probably accurate. Taking all the suggestions of libraries to cover (Spring , Hibernate, AspectJ , Web Services, JMS etc etc), some hard decisions are going to have to be made about what is included. At least I have feedback from the 'experts' (that's you the OnJava reader) so the final course reflects more than just my own (faulty) opinions


Once again , thanks , and I think the course will be better for your contributions.

Darren Gilroy
2007-03-07 22:24:20
I would delete things like Hibernate, Web Services, JSF, Ruby, Struts, Eclipse, JDeveloper, GWT, etc, etc. I would hope to see topics like concurrency, memory usage, serialization, debugging with multiple threads, using generics, understanding custom class loaders and bytecode generation and especially being able to profile an existing application for performance.
Darren Wang
2007-03-08 03:10:37
I think the list is not focus on the topic of "advanced Java".
Chris Nappin
2007-03-08 05:45:34
Um, how many weeks long is this course going to take to deliver? It would take months to cover that content in enough detail to be worthwhile!
Aniket
2007-03-08 23:30:38
I agree with Fernando
Ewan
2007-03-09 04:35:36
I agree with Fernando but I think concurrency is too far down his list - should be at the top :)
Paul Browne
2007-03-09 06:34:07
Chris - you're right about the duration of the course.


Advanced (applied Java) will have areas of interest to different people - the intention is to offer a menu and concentrate of what people want.


Paul

Paul
2007-03-09 07:14:34
How about Ant?


Alternatives to JSP? (e.g. Velocity). Code generation techniques are useful.


Also, how about good coding techniques as opposed to advanced technologies; anything from Joshua Bloch's 'Effective Java' would be a good starting place.

Max Roux
2007-03-09 09:06:53
I believe that an 'Advanced Java' course should include the Concurrency API's. To live up to their potential the new multi-core processors are going to require threading on a scale that most 'experienced' Java professionals have never encountered before.
S.E. Morris
2007-03-09 09:18:16
Threads. Seriously! You'd be surprised at how many seasoned programmers get by with only a vague grasps of writing thread safe code, inter-thread communication, and the new Concurrency library. And it's not as if threads are a peripheral topic in Java -- they are right at the core of the language and most of its APIs.
David Bolsover
2007-03-09 14:06:09
Eclipse and JDeveloper but not Netbeans.
Hibernate but not JDO.


The list seems to have more to do with current trends, fashions and third party tools/API than real Java language features.


To me advanced means Generics, Threading, Unit Testing, Classloader etc.

Pete
2007-03-09 19:44:54
- Java, Swing and Vista. How should a developer build a quality vista interface? What controls should be used?
daniel
2007-03-10 07:21:52
I would also include a section (or subsection) on monitoring, management, and JMX. But maybe that enters in your section on
"What's new in Java 5 and Java 6" ?

2007-03-10 09:48:40
It's easy to tell that the author has written many articles on Java but probably never much code. All the keywords that should go on a resume are here, but what is missing is the issues that senior engineers face everyday w.r.t memory optimization, performance, scalability and reliability.


There is of course a mention of "Introduction to Architecture and design patterns" in an "Advanced" Java training course!! Maybe this should just be a Java tools course.


An advanced Java training course should more about the cross-cutting programming methodologies and (some) tools used in Java - on servers, clients, mobile devices, etc... rather than only about tools used to achieve a various tasks.

Paul Browne
2007-03-10 12:56:33
@anonymous - 'sigh'. You could at least checked my profile before making an uninformed comment.


Everybody else (who were brave enough to leave your name) - thanks for your suggestions.


J.T. Wenting
2007-03-11 13:33:02
eliminate everything that's dependent on products that aren't part of the Sun standard distribution.
All those things are not "advanced Java", they're applications of programming techniques. Showing them as examples might be nice, but not as part of the curiculum.


Advanced Java would contain things like concurrency (beyond the basics of synchronising methods and blocks), IO (again, beyond the basics of using a file or socket), etc. etc.
JMS might fit in there as well, and JMX.
Architecture and design patterns have a place, but IMO are a subject for their own course (which might be a prerequisite for this one, or a followup).


And yes, I know that removes pretty much 70% of your topics ;)
But it makes your curiculum far more attractive to potential customers. As it is it looks like a grabbag of "hot" buzzwords taken at random from the results of a quick search of Monsterboard for what's asked of potential employees.


It's also utterly useless, unless you plan to make this a curiculum taking several months fulltime, in which case you'll not get paying customers.
And if you place this in front of university or highschool students the time between them learning it and applying it in a paying job will be so long that all that knowledge about specific open source projects will have become completely and utterly outdated.


For paying customers (usually their employers paying) anything longer than a week (2 at most) is too long because it's simply too expensive to miss a person (or more than one) for that long.
And for companies too the curiculum is way too broad.
We for example don't use most of the technologies mentioned so why pay to have our people trained up on them (and that to a very shallow level given the amount of time that could be spent on each topic)?
We have for example a project using Hibernate, we have a project using Spring, we have a project using Struts, we have a project using Ajax, and a project using C#.
But none of those projects uses more than one of those technologies...


If we want to give someone training, we look for a really in-depth course on a specific topic. That probably means going to Interface21 for a Spring course, to Sun or IBM for a Java course, to RedHat for a JBoss course, etc. etc.
We're not interested in having people able to spout an array of buzzwords, we want people to actually be able to use the technology when they get back and help others in the company use it better as well.


sjtai
2007-03-12 21:03:25
Add: Swing
Add: Profiling
Add: Writing simple and efficient code
Markus
2007-03-14 02:45:20
I see it like Trond Andersen. You can write a book for each of your posted topics on its own.
Take topics like these from the books "Harcore Java" or "Effective Java" plus a little Refactoring (less for Refactor then for good design in the first place).
Rajesh Chandra
2007-03-15 11:24:03
I think the confusion here is the word "Advanced Java" and your proposed list. The list you provided had nothing to do with a Java programmer who wants to know advanced topics in the language and how the java binary is being configured to run.


In plain words, as a 6-year java programmer(if you consider I am qualified for advanced level:) ), I would expect the following:
1) Extending the knowledge of JVM.
2) Class injection
3) Inside Java binary(such as class structure, how it is organized etc.)


The above are the ones that comes to my mind immediately.


One could argue, the specification by Sun is enough, but IMHO it should be detailed with lot of usable examples to reach every Java programmer.


Thank you.


Regards,
Rajesh

George Jempty
2007-03-15 12:49:01
AOP #1? This is nothing but a workaround of Java's statically compiled nature. If you believe you need AOP you're programming in the wrong language. With Lua for instance, where OO is not built-in but is easy enough to implement, it is also trivial to implement the functionality that AOP gives you.
Simon
2007-03-22 02:15:58
I don't see any value in spending time on Ajax. It seems hugely off-topic for a Java course - any Java course, not just this one. I'd hate to think it was included just because it's a current buzzword.
Mike
2007-05-06 18:31:02
web server hosting
Dev
2007-09-27 05:34:56
Advanced Java seems to be complexed.
Animesh
2007-11-07 01:53:53
Well all said, argued and flattered, can we have an updated list of ADVANCED JAVA CONCEPTS.
Also i would like to know what is the possible age/No of years required to get to know all the listed topics for the same.
I hope i am able to learn all of Java Stuff before i lie down in my grave :)