views:

1010

answers:

10

The Pragmatic Programmer gives a very popular advice: learn a new language every year. The main reason behind this advice is that when you learn a new language, you learn a new way to think.

And in the book Pragmatic Thinking and Learning, it shows the levels of competence from Novice to Expert.

  • Novice: Has little experience with the skill under examination; must follow the rules to be effective.

  • Advanced Beginner: Has no conceptual understanding of the problem domain, but can start to break away from scripted behavior.

  • Competent: Has the big picture and can start troubleshooting

  • Proficient: Can predict what's likely to happen and can reflect on practices to self-correct.

  • Expert: Has such a thorough understanding that she works from intuition rather than rules.

My questions are

1) How deep do you learn that new language ? Do you try to become Competent ? The reason I ask this is because normally it takes more than a year to be Proficient or to be an Expert in a new language along with the libraries, frameworks, tools.

2) And after you've learned that new language ? Do you keep up with the changes ? Is there time to keep up ?

For example :

  • Year 1 : Learn Language 1
  • Year 2 : Learn Language 2, Keep up with Language 1
  • Year 3 : Learn Language 3, Keep up with Language 1 & 2
  • Year 4 : Learn Language 4, Keep up with Language 1 & 2 & 3
  • and so on
+6  A: 

I wouldn't say a year makes you an expert at all.

Its all relative to be honest. The more you use something the better you get. The past year or so I've been pretty heavy in C# so feel very comfortable with it. My C++ has gone a little 'rusty' because of this. However if I was to go back to using C++ soon after I'd be back up to speed.

I don't really see how anyone can claim to be 'experts' of a language. You can be very good at a particular one, and skilled with its libraries but practice makes perfect at the end of the day.

Finglas
A: 

Competent level, and no need to keep up, if you do not use it for real work.

If after 1-2-3 years, the language/framework has changes so much, that your Competent level can not help you to remember, threat it as a new language and start over.

Sunny
+35  A: 

Don't waste time "keeping up".

You can't know everything. Indeed, some of us can't seem to know very much at all. Instead of learning huge amounts of stuff, you need to learn how to optimize your memory space.

Memory fades -- plan on that -- optimize around it.

  1. Focus on finding the core concepts and making sure you understand them. I haven't used SNOBOL since the 70's, but I still retain a few core concepts.

  2. Since trivia will fade first, plan on never learning language trivia. Learn how to look stuff up. Manage your browser bookmarks to optimize finding language trivia. This is a good thing.

  3. Get the big picture early. No one can know the entire Python library (or Java Library or .Net), but they can know the overview of the principle sections and locate a package that's likely to be useful. Concepts and Search will help you.

  4. Learn how to read Reference Manuals quickly. Learn how to spot exceptions and features quickly. You can't struggle with every nuance, but you can look them up again.

  5. Be sure to have a "standard problem" you can solve in each new language. You don't want to (a) learn the problem and (b) learn the technology at the same time. [Almost all real-world programming projects do this, and it's a mistake.] Focus on the technology by solving a standard problem.

Also, be clear that we're surrounded by many, many languages. Full-blown programming languages are not one-per-year. Languages like CSS or XML count in your yearly quota. In my case, I'm mastering ReStructuredText this year.

S.Lott
This is in keeping with the spirit of "learning new ways to think".
steamer25
+1 that was well said!
James
In addition to what steamer25 said, I would recommend not learning similar languages every time. It's worth it to make dramatic changes since you get in to the habit of the same syntax. It's the paradigm shift that helps.
Nazadus
I like the "don't keep up" attitude. Learn a language to learn how to approach a problem from a different point of view, and keep on going (or adopt the language if it's better than what you had).
David Thornley
What kind of problem do you suggest?
Janusz
My standard problem is documented here: http://homepage.mac.com/s_lott/books/oodesign.html#book-oodesign
S.Lott
+1  A: 

After I learn something, I decide whether it's worth keeping up on and if it's not, I move on. For example, I keep my C# skills, well, sharp, and I'm learning Ruby on Rails, but PHP was not interesting or useful to me so I haven't kept up on it.

I have a list of languages I'd like to learn, and a separate list of languages I'd like to master. F# is on the former list, Ruby is on the latter. Hopefully the concepts I learn in both languages will help me in whatever it is that I decide to keep doing.

At the end of the day, you can't know everything, but you don't have to forget it all either.

Robert S.
+2  A: 
  • Year 1 : Learn Language 1
  • Year 2 : Learn Language 2, Keep up with Language 1
  • Year 3 : Learn Language 3, Keep up with Language 1 & 2
  • Year 4 : Learn Language 4, Keep up with Language 1 & 2 & 3
  • and so on

First of all, I'd say that beginners do not need to lear new languages every year. They first should learn the basics of programming.

For those who are ready for this, I think you only need to learn as much as it is needed to understand the benefits of the language and how problems are solved using it. Then you can understand how to apply those methods for your everyday work.

If you find that new language is much better (PHP -> Python in my case) than what you used up to that point, it's a double-win :) In either case, the cycle continues, you just have to choose a "right" next language.

Armandas
One of the worst things a newbie can do is become a newbie in two languages.
sal
"I know just enough to be dangerous" == "I'm dangerous, fire me now."
S.Lott
+1  A: 

I think it's smarter to spend your time focused on an area of programming, not trying to get into all of the areas.

For example, I've wanted to learn C -- but each time I look at it I think "Well, this is nice, but what am I ever going to use this for?" (since I'm strictly web development)

But on the other hand I take time learn programming in Flash/Silverlight, study a little about web protocols, tinker with PHP, etc...

I'm not suggesting that you don't learn things outside your comfort zone, but I also think just knowing a lot of languages you have no intent on using is wasting your time.

Hugoware
Which means that all you're ever exposed to is Flash, Silverlight, PHP, and the like. This means that your thinking is probably limited to the ideas behind these. If you learn different sorts of languages, you'll have a wider understanding of what you're doing. I would certainly recommend knowing what's going on a level or two down, because of Joel's Law of Leaky Abstractions, and C will give you much of that.
David Thornley
And how would knowing lower level languages help me become a better web developer? How much assembler is really going to come in handy for me? Leaky Abstraction only makes sense when it is in the same domain you're programming in. Using WebForms without knowing HTML is Leaky Abstraction. Using WebForms and not knowing how to manually write bytes to a hard drive in C is hardly Leaky Abstraction -- if that's how you even do it :)
Hugoware
A: 

I focus on learning languages at a shallow level initially to determine whether or not they'll fit the bill for projects I work on. Some languages are like the seldom-used torx screwdriver in the toolbox. It's necessary sometimes but not typically. I'll remember that language X or library Y had something that made it appropriate in certain situations and pull it out if I need to but otherwise, it'll not get a lot of use.

When I find one that is appropriate, I'll dig deep as I use it for projects. Ultimately, you don't want to be a one-language developer. You don't want to try to solve problem X with language Y simply because you don't know anything else. That's where the survey of languages is useful.

I think you can get a good idea about what a language can do without investing every waking hour learning it. Then, when the customer says they need a programming solution developed, you can look at what you know and pull out the right tool for the job. A screwdriver is great for certain jobs and can be used, in a pinch, to pry something open, but a crowbar works better. Same thing with languages.

It's better to be a jack of multiple languages rather than the expert in one.

itsmatt
So when you would use Groovy, when Ruby and when Scala? Last time I checked they are almost the same. What is the best language for RegEx?
01
A: 

I'd say don't "keep up". Keep learning and after a few languages you will realize that the syntax / styles of various languages really aren't so important... those are the things that are easy to look up.

I had the good fortune to pair with a developer who was almost 60, and he was constantly forgetting the syntax of the languages we were programming in, which was a bit alarming at the very beginning.

However, it soon became clear that he was still extremely effective. He described his ideas at a high level, free from the nuts and bolts of the implementation.

He was expert at predicting and fixing problems, even in a framework that he and I had both never used before, simply because he was experienced enough that he knew (in general) what must be going on under the covers of that framework.

It was a great experienced and really reinforced the fact that being a "Java pro" or a "php guru" is really not what you want a strive to be.

TM
A: 

When I need a test tool or some sort of way to make test data I will try out a new language to make it.

I used to have a coworker who would write the same sort of test tool over and over in all sorts of different languages.

Maestro1024
A: 

I feel there is a different alternative. Learn librarys, tools and metodologies related to your field of knowledge. For example:

Period 1: Learn Java
Period 2: Learn J2EE and database access.
Period 3: Learn Ant, Maven, patterns, metodologies
Period 4: Learn Spring / Struts and Hibernate
...

Knowing lots of languages may not be valued in your company. Being an expert in something will be better for your pocket. Al least during first years.

borjab