views:

466

answers:

12

This article got me thinking.

Languages are split in to about 6 groups in the article:

  • The Cs
  • Virtual Machine Languages
  • Languages Formerly Known as “Scripting”
  • Functional Straight Jackets
  • Lisps
  • JavaScript

I would like to know if it is better for a programmer to be very proficient in one of this groups or be semi-proficient in all of them? I read a lot of programming books and articles, of course, but I find myself jumping between languages a lot, should I just stick to one language until I know it like the back of my hand, then move on to another one? Or, should I keep doing what I am doing, and continue acting like a kid in a candy store, grabbing handfuls of everything?

+4  A: 

I can't say I agree with your grouping of languages. I see only two real groups:-

  1. Imperative
  2. Not imperative

A programmer skilled at solving problems well in an imperative language will be able use any imperative language with only little exposure.

Switching to something goal driven or functional takes a new way of thinking and thats much harder. XSL is good example of language imperative thinkers often struggle with at first.

AnthonyWJones
Learning SQL is also a good example of moving from imperative to declarative language. Although it's technically a imperative language these days, you need to start thinking declarative to be able to produce good SQL code.
jandersson
@AWJ: SQL, LISP, regular expressions, and many DSL's are also examples of declarative languages. I would also say that Makefiles and Antfiles are partially declarative. Yes, a lot of programmers accustomed to imperative programming have trouble with these.
Bill Karwin
Although imperative/not imperative is one way to look at it, there is a lot of variations in these groups. Prolog vs Haskell and Assembly vs C#.
Jules
There are major differences within different languages(of your same subgroup) that can make or break a language for various projects.
J.J.
+4  A: 

Although, it's beneficial to know a variety of languages, I'd suggest that you become very comfortable in one language. After you have gained enough experience, you will find yourself picking up other languages much quicker and at a greater proficiency. The idea should not be to get relatively good in many languages, but exceedingly good at concepts and algorithms in one language so that you can carry on that knowledge and expertise to other languages, when needed. "Jack of all trades and master of none" doesn't make much sense to me in programming.

Epitaph
Except that you will gain knowledge and expertise by working in other languages, provided of course you don't do everything in the manner of your favorite language. If you learn Lisp well, for example, you'll be a better Java/C#/C++/VB/Snobol programmer.
David Thornley
A: 

I think having a quick glance and doing some simple programming experiments in many languages can be quite entertaining and helpful, but you should soon get a feeling which you prefer or need (for work, for example) the most. Typically this will be a handful of programming languages for different needs, for example some web/script languages and some "real" languages like Java/C.

You can then stick with your favorites, but should always keep looking at other or new languages and their (dis)advantages.

schnaader
+3  A: 

What's wrong with being "expert" in one and having a good knowledge others?

As a web developer, that's actually a prerequisite. I need to know the following like the back of my hand:

  • Mark-up languages (HTML, XML, YAML, etc)
  • Back-end languages (Python, PHP, ASP.NET, SQL)
  • Client-side scripting (JavaScript and ActionScript)

While I'd not go as far to claim myself Master of all of those "languages", I'd definitely say you'd have to be far more than semi-proficient in almost all of them just to do your job.

Oli
+3  A: 

You should learn a new language every now and then. Particularly one that is different from the ones you already know. This expands your horizons and gives you more mental tools for solving problems.

Whether any of those languages are going to be a practical solution for your day-to-day programming tasks is less important. It's fine to stick to one or two languages for work or hobby projects. Learning that or those languages really well will help you be productive and to finish projects faster.

Lars Wirzenius
+1 every new language that I learned improved my skills, and changed (improved) my techniques, even when I was using the languages that I already knew.
oefe
+2  A: 

Whatever it takes to get the job at hand done.

If you master one, you'll be at least able to get around in all the rest after a little bit of study...your job path will determine if you should specialize or get a broad background.

bigwoody
+4  A: 

It's important to understand the strengths and weaknesses of the various languages and to get a good overview of the features and the concepts that make them unique or different from other languages.

It's not so important to memorize every last detail of the syntax and libraries. That is what reference books and internet forums like this are for.

For instance understanding how JavaScript objects work and how it implements closures, template based inheritance, etc is far more important than having a detailed knowledge of the methods of the Math and Date objects.

Noel Walters
+1  A: 

To answer your question one one needs to know why you're learning these languages. Presumably you want to find a job or change the world. I recommend looking at job listings and seeing whats in demand. Be aware of whatever technologies are listed and how they are used, then focus where your natural interest lies.

Frank Schwieterman
A: 

The only downside I've seen so far in learning other languages is that if you happen to be working in a less powerful one, you might get depressed that things are unnecessarily difficult. Apart from that, understanding more concepts is always useful.

The grouping of languages seems arbitrary and non-uniform. (Why not have "The MLs" as another group?) The discriminators commonly used are typing systems and functional capabilities. Ruby is multiparadigm with dynamic typing. F# provides strong typing with inference (so it's syntax-light enough for scripting), OO, functional as well as imperative capabilities.

So, understanding what different types of languages can offer is a great thing, as it will help you to move towards tools that allow multiple styles and more expressiveness, rather than get sucked in by a one-trick pony.

MichaelGG
A: 

I think this depends on whether you want to be a specialist or a generalist as each has their place as being highly valued to some extent.

Generalist advantages:

  1. Can handle end-to-end development of simple systems, i.e. the one man army.
  2. Can play multiple roles, e.g. administrator, analyst and developer.
  3. Has broad knowledge of a variety of approaches to issues.

Specialist advantages:

  1. Knows one technology or part of the Software Development Life Cycle well.
  2. Can optimize code within a specific language for a given environment.

Where each can charge a high rate lies in understanding the expertise they bring to the table.

JB King
A: 

Learning multiple languages eventually gives you the ability to see them more as dialects of the same language.

sharkin
A: 

I've read over the answers given and most have merit -- so, here's my opinion and hopefully not a rant. :)

Number one, the big question is what do YOU want to do? What type of programming are you interested in? Web based, scientific big iron number crunching, embedded, industrial control, mobile apps, you get the idea. This choice will often help narrow the field of languages (maybe even making the decision for you) and changing here means possibly changing your target choice.

There is so much activity in the language arena these days if you try to stay up on them all (heck, or even a few of the most active ones) you will never write the first useful line of code, let alone finish an application. In all likelihood your chosen language will have some sort of morph before you get to the end of any reasonably sized app anyway.

As previously mentioned, being a good programmer is really about how you think; the actual language is a secondary consideration -- (so here goes with the meat of my opinion, lol) ... aside from the causal perusal of languages and how they address issues, my opinion is to chose a language, or group of related as in the case of C#, T-SQL, HTML, etc., and get really good to the point where you can think about the problem and not about the details of the language -- as it would be at this stage your creativity and energy is channeled directly at the problem to be solved.

just my 2 cents ...

Borzio