views:

174

answers:

4

What are the key technologies, design patterns, architecture that a mid-level (4-6 years) java developer should know?

When I seem have start having a grasp of the Java landscape, I turn over another stone and it opens up a whole new area that I haven't experienced. I've recently read through "Java Concurrency In Practice" and it's changed my perspective of multi-threaded application (and programming in general)

It is often hard to figure out how you rank compare to your peers and where you should be. What are the skills that developers should have at certain points in their career? What's the best way to keep up with changing technologies? How do you do it?

Books that I've found very useful:
Effective Java by Joshua Bloch
Java Concurrency In Practice
Java(TM) Puzzlers: Traps, Pitfalls, and Corner Cases

+1  A: 

Java is big. My must haves:

Has meta programming skills through the reflect package.
Has knowledge of the JNI -knows how to get out of the sandbox.
Can code a MVC design pattern.
Knows how the Java compiler works and can optimize code accordingly.
Can debug a program loading and running in a VM.
Can design and code a J2ME-J2EE interaction program with concurrency and data persistence.

slipbull
Debug a VM? Don't you mean debugging a program running in a remote VM?
Thorbjørn Ravn Andersen
All this seems very specific to application. Do others agree with this? Is JNI/J2ME-J2EE necessary for all mid level java developers?
Tazzy531
Thanks, edited accordingly.
slipbull
A: 

You should definitively master the servlet specification since that is what almost all web frameworks build on.

A thorough understanding of multithreading issues, and concurrent programming is probably the next big hurdle we need to learn.

Thorbjørn Ravn Andersen
+5  A: 

I find that one of the most important things is to be able to write code that can be maintained. This is more often than not what separates a Senior programmer from a Junior one.

Good use of design patters, good separation of concerns, and the ability to define sharp interfaces between system components are a must.

Other important skill is debugging. You can learn a lot about how a person works by looking at how they debug code.

From the comments received in this answer, that relate to this answer: Unit testing is important, in the sense that you must have enough experience to write classes than can be unit tested. That is where the concepts of dependency injection and sharp interfaces come to play. A well-written class is, in general, a class that can be tested easily.

API knowledge and corner cases are not so important. When you are in the front lines for a long time, you learn these things automatically. You see patterns, common ways in which libraries are written. So you normally are able to pick up new APIs quickly.

Mario Ortegón
I'd add Dependency Injection to this list, along with unit testing, but otherwise a good answer
matt b
I can recommend Code Complete 2, by Steve McConnell. It has a chapter on very nut and bold of the programming craft. And all the advice seems to focus on readability.
extraneon
+2  A: 
  • At least in the J2EE world, having worked with enough frameworks that they have some sense of what's out there and don't feel the need to reinvent the wheel, but also enough to be able to generalize the pattern of their useage.

  • A good solid understanding of database structures, normal form, etcetc, and familiarity with the pros and cons of a few different ORM strategies.

  • Can put together a well organized project along with a clean and well scripted build setup (including unit tests).

  • Reasonable knowledge of at least one other language.

Steve B.