jack of all trades, master of none!!

I have a question that What should be the approach of Software engineer? Learning everything but only useful part or Learning one thing but completely? For example if I am learning Java the I should be a master of Java or I should learn it for learning technologies built up using Java ?

I strongly believe that we cannot be masters of atleast one technology unless we spend many years working on it because technology is vast. Usually the approach I follow is, if you are strong in OO concepts then you can really get into any technology and learn easily. Do not focus on syntax of technology. Ofcourse remembering syntax also plays vital role but not worth spending few years just for it. Try to learn whenever and whatever necessary.

Learn one technology very good. Off course in principle all programming languages are based on the same idea, and you should understand for example the idea of OOP through Java, which could benefit you programming any OOP language. But, if you are programming, for being up speed, you should know the details, pit falls and bug traps of that one technology. Otherwise your boss complains that you are slow. Since he understands nothing of technology, he will not understand your problem. And if you work like hell and won't chat with your team mates, and not go to the company outing because you have enough to do at home too, he will blame your social skills for everything, and then you're hung. I've been there, I've programmed in C++, Pascal, C#, Java, Visual Basic in one year for one employer, and he then complained..I can still ...ah better not write that down.

But while you're programming in one language, try to get knowledge of general aspects you can use in all environments like OOP, Unit Testing, regex, Design Patterns. Then if you loose your java job, and apply for a C# job, you can still manage.