views:

705

answers:

13

This is a rather general question about how best to further yourself as a programmer both professionally and personally.

As good Pragmatic Programmers, we have been taught that continual learning and self-improvement are things that we should consider a natural part of our lives as technologists. Part of this process is keeping abreast with the latest developments and changes in the technology, languages and frameworks that surround us.

Time is unfortunately a finite resource, limiting our ability and scope about what we can learn and to what degree.

My question is therefore: Is it better to develop a broad range of skills with a large variety of languages and frameworks - but never being able to call yourself expert in any, or is it preferable to develop a very focused set of skills but to the level of a zen-master?

As a further sub-topic, is it better to learn similar/related languages (C/C++/C#), which you can grok very quickly. Or take the time to learn a more disparate selection?

I'm thinking of this in both the context of personal development, and ability to further a career. Obviously you can argue that a greater perspective of different languages and frameworks will make you a better overall thinker, but what about a better overall earner?

+10  A: 

This career development question seems somewhat related:
Should developers be specialists or generalists?

Jonik
Oops - missed this. Thanks.
Ali Parr
+1  A: 

Lets answer that with a question....when you pull your back/dislocate your shoulder, do you go to a chiropractor/specialist or to your physician?

In other words it is nice to know a lot of everything but if you want to advance or get some decent pay you need to become an expert in at least one of the skills

SQLMenace
+1  A: 

I think your success is based on something more external than either of those two strategies. The passion you apply to one programming language or ten will be the ultimate test of your potential. An exposure to more programming ideas and paradigms will make you more well rounded, but when it comes to making a good living, the passion you have and the risks you are willing to take will make the difference.

jjclarkson
+2  A: 

Tough question. I often find myself contemplating this very issue and I honestly think it depends on where you work, or plan to work. I often envy programmers here on SO who work for development companies and can really focus deeply on a few disciplines. However, working for a non-profit where budgets are always a concern and we never have enough manpower, my career has benefited from being able to be somewhat of a chameleon.

Dana
+1  A: 

My response would be to question what you want out of a career... Do you want to go into management (or into Business Analysis or a similar 'softer' role) or do you want to remain purely technical?

Clearly one suggests going broader, and the other going deeper.

But in either case, don't go too broad nor too deep. 'Jack of trades/master of none' is just as bad as being a very narrow-fielded genius.

CJM
An interesting perspective - thanks.
Ali Parr
+2  A: 

I don't think there is a right answer - there are plenty of successful people in both categories. To be a success, you need to understand the basic principles of a number of fields, as these are used throughout your career even if you specialize later. These fundamentals are really important.

Specialization is not necessarily the route to better pay, but being good at something is, and you can be good at being able to apply your general knowledge to solve a large number of problems quickly and robustly.

Miles D
A nice answer - thank you.
Ali Parr
+1  A: 
  1. Your skills need to have value (for you, for your employer)
  2. You have to be flexible (ie learn fast)

Thats all you need. The rest depend on your domain.

Łukasz Lew
+1  A: 

Actually, to be the best, you have to know one technology very-very deeply but know just a little about all the other things out there. Unfortunately, it's hard to achieve because you either interested in new stuff and therefore would jump from framework to framework without staying in for long because you just can't unless it's perfect, or, as most developers out there, just isn't interested in anything that didn't move you career forward and bring you more money in which case you will be staying with one language forever.

vava
+13  A: 

If your knowledge is broad, go deeper.

If it is deep, go broader.

You don't want to be one of those guys who know a little bit about many things, but not enough to really understand what is going on. And you don't want to be one of those guys who only know one thing, and have no idea of anything else. Both are career killers.

Treb
+6  A: 

A lot of developers miss one of the most valuable necessities of longevity and that is domain specificity.

After contracting for years in Corporate IT, I finally had the opportunity to work for a company that developed and shipped software. My domain knowledge in Finance helped me get my foot in the door and my other skills and enthusiasm made me a success.

Breaking into software companies that actually ship software is not easy, unless start at the bottom, so I decided that I would focus on companies like this in the future. Now, I am in a company that doesn't ship software, but which uses it's software to provide a service that makes them money; it's not exactly software as a service (SaaS) since it's telecom, but it still feels like a company that ships software, with a bit less of the pressure.

Pitfall: When I started my career I gave my projects everything and left nothing for myself. I burned out and I did not have the breadth of skills that I really wanted either.

The Best: I used to think I was one of the best, but natural talent only goes so far. Specialization can make you feel and appear to be awesome, and that works well for most people. But even then, the best programmers, long term, are the ones that basically still feel like programming is a hobby that they get paid to do, because they still have interest in other technologies (or digging deeper into their specialization) at the end of the normal work day.

Programmers are at their best when they are having fun, I believe. So, if you are committed to this career, then spend time connecting the dots between languages and architectures in your spare time and then figure out what motivates you. Are you motivated by being a part of the coolest projects, making tons of money, solving problems in new ways, inventing alternatives or extensions to existing solutions?

EnocNRoll
+3  A: 

Personally I see far too few people who go deep. This leads to a lot of poorly thought out software because no one one the team really is an expert in anything.

However, from a career perspective, unless you go really, really deep (and become an internationally known expert) it can be much easier to get a job if you go broad (this is why so few developers go deep) because many companies don't appreciate that the person with in-depth knowldge really can save them money over the people who only ever look at the top layer of things and since those with true expertise are justifiably more expensive, many companies will not consider them. So the person who is the true expert is going to have less but better job oppportunities and because of this may have to relocate to where the jobs are that can't be done at all unless you have deep knowledge.

Another problem is that things change so fast, that it is becooming more and more difficult to go deep. Just as you learn one technology, it is replaced by something else. That was one nice side effect of SQL Server going 5 years without an upgrade; the people who used it had a chance to go really deep into it because things were not continually changing.

Personally I think the best strategy is to go deep first in some mainstream technology and then broaden. If you go deep first, you will know more of what to look for in the next thing you learn. Subsequently you will end up with deeper knowldge in everything you learn.

HLGEM
Great answer, thank you. Wish I could +2
Ali Parr
I really appreciate the perspective on how going deep is not a very versatile thing to do. I think the reality is that most "deep" programmers become experts by necessity rather than by choice. It might also be worth distinguishing between experts and specialists.
EnocNRoll
A: 

I don't like the term "Jack of all trades, master of none". You'll be a junior developer for life with this philosophy. I adhere more closely to the "Jack of many trades, master of one (maybe 2)" philosophy.

Go deep in the area that interests you, then broaden out in a way that reinforces your specialization.

For example, you might start with Java. Then you may realize that you need some database knowledge, so you pick up JDBC and SQL. As the industry shifted towards internet web applications, you might learn about compatible technologies such as JSP and JSF/Tapestry.

A: 

Both. Have a broad knowledge of the industry, know enough about various technologies to be able to make decisions, and be able to pick up other things quickly when you need to. Also learn one or two technologies deeply. Don't make technology your only interest, either; you may focus on it, but branch out. Get into music, food, literature, history, etc. The same thing applies for domain knowledge. Go deep in banking or whatever, but keep up on major developments in bioinformatics, GIS, and so forth.

Adam Jaskiewicz