tags:

views:

676

answers:

13

A while back I had an intern (we call them co-ops in Canada) ask me if he thought he should learn Java (his first programming language) more deeply first, or to start learning something new. I was a little stumped at what to tell him. On the one hand I believe that learning different kinds of languages helps immensely (functional, object oriented, system, compiled, interpreted, etc.). However I also believe that there is no excuse for not knowing deeply the technology you use every day. In his program he was primarily working with Java, and was mainly concerned with something that would help him immediately - in his studies and to help him get a job.

I think I blathered something about learning a new language every year and learning Java better, then I loaned him my copy of "The Pragmatic Programmer".

What would you have said?

+1  A: 

Depth first, till he is adept, but no longer. Then divert, as a priority.

He does not know where his job is coming from.

Aydya
A: 

I would have said that you should gain enough depth to feel comfortable in a language before moving to the next one. Once you have become a good programmer at one language it is much easier to learn another one.

Chris Boran
+1  A: 

Handing him a copy of the Pragmatic Programmer was definitely a good move. I would probably recommend learning a single language deeply, especially it is their first and so the concepts are new as well.

Having said that once someone feels comfortable with the concepts, the language and the framework, it is always a good idea to broaden your horizons. Not only does it give you a broader set of skills and technologies but also it gives you new ways of approaching things is your existing languages. I found this especially true of functional programming.

I believe timing is the most important thing, as both are viable ways of expanding knowledge, though it can be risky to broaden too early.

marcj
A: 

I'd say what I tend to say to questions like these: it depends on one's interests, capabilities, goals and time constraints.

A great programmer needs experience in many languages. But not everyone can, or wants to, be a great programmer.

Artelius
+10  A: 

I would generally say to gain knowledge organically, i.e. as you work. I don't think it's POSSIBLE to gain truly valuable "deep" knowledge unless you are challenged with it; while it's possible to challenge oneself to gain that knowledge, it's much more common to gain it through work experience. And the knowledge gained that way is much deeper and better ingrained; to some extent, without the practical knowledge and experience of implementation that comes from needing to do something professionally, any knowledge learned is shallow.

McWafflestix
Great answer...!
Thomas Hansen
+1  A: 

Breadth first.

My opinion is one should learn as many different approaches as possible and then go into depth when situation demands it (a new project, thesis, ...). It is important to know what tools are available to choose the right one for the task.

supermedo
+1  A: 

You need to be proficient in the the language before you move on. You don't have to be a expert, but you do need to understand and be able to use all of the major features of the language. Once you understand "programming", learning other languages will let you see what if functionality and what is simply syntax.

Jim C
+4  A: 

Don't pick one approach or the other; just get started. If you want more depth on a topic, go deep. If you feel like branching out to other languages, do it. Just keep learning new things!

When I graduated from engineering, our dean gave a very interesting speech about the nature of our education. The short version is this: 90% of the specific information we were taught would be useless to us in practice. The critical skill we had learned was the ability to apply whatever knowledge was available to us in order to solve a given problem.

So, as long as you continue to find new, interesting, and challenging problems to solve, it doesn't matter how you learn the specifics, it is that critical skill that you will be building upon.

e.James
A: 

I would have asked how well on a scale of 1-10 does he think he knows Java and then give him a little quiz about some of the uglier parts involving it. If he gives a high number like 7 or 8 then give him some hard questions that usually don't get answered until you need to know it kind of thing. On the other hand if he picks a low number then I'd suggest sticking with Java to get down the basics of both the language and general programming, by which I mean being able to create classses to solve various simple problems as well as try something a bit bigger like some Open Source project.

One idea is to get enough depth to have some parts for a portfolio and then move on to other langguages as there should be a basis of programming in one language before moving on and possibly being really confused on how various languages are used, e.g. why is Perl used here or Ruby used there, etc.

JB King
+2  A: 

If it's strictly a question of the language, then I'd say stick with one language and learn it more deeply. But within that language, I'd say to focus on breadth. Depth comes with experience, whereas breadth is something you have to seek out.

To put it another way, you can always get better at something, but you have to know how to do the thing first. A good bit of breadth is simply knowing that you can do X, Y, and Z with Java. So learning how to do those things in a very basic way is a necessity. You can get better at them down the road when you need to, but first you need to know you can do them.

Kyralessa
+1  A: 

I've gotten really deep knowledge of programming languages on the job for the most part. You have to work with it often and deeply to see all the strange glitches; you have to debug other people's code to see other approaches...

I usually concentrate on the language I'm working in, but try to keep a low-level understanding of the others I come across that have features I'm not familiar with.

Bill K
+1  A: 

The language is irrelevant, you have to learn programming, the ability to express human notions in machine language, to algorithmize, to think on abstract level, then comes paradigms like object oriented, procedural or functional programming.

miceuz
+1  A: 

try www.javablackbelt.com to broaden your programming skills. it's free, it's fun, it's powerful.