Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

By now I work with asp.net and C#. I have done a decent work in Java as well. I am planning my career in such a way I should be language-agnostic someday. What are the things that I need to learn?

First would OOP paradigms as its speaks about the Class design. Are there any others?

share|improve this question
2  
+1 Great question. –  sunpech Sep 7 '10 at 14:55
2  
Are you trying to: avoid being labeled, have job flexibility, or on some vision quest? –  JeffO Sep 30 '10 at 15:04
2  
@Jeff Yes! to avoid being labeled and not to fight that my language is THE BEST ;) –  Tech Jerk Oct 1 '10 at 4:51
    
I'd be more likely to hire a guy with a strong opinion that didn't agree with mine. Because then he could write the Java. –  Erik Reppen Jun 14 '13 at 6:30
    
If you did that recruiters would skip over your resume. –  gonzobrains Mar 15 at 20:38
add comment

4 Answers

up vote 54 down vote accepted

To be language agnostic you need to have experience in all of the common styles and types of languages.

  • An imperative language (You tell it what to do, step by step. Eg - C)
  • A declarative language (You tell it your goal, it figures out what to do. Eg - SQL/HTML/Prolog)

Also:

  • A functional language (Functions are key, avoiding state and side effects are the goals. Eg - Haskell/OCaml/Lisp/F#)
  • An object oriented language (Architecture where objects encapsulate related data and the methods that act on them). Eg - Java/C#)

Some typing styles:

  • A statically typed language (Data types are defined and checked at compile time. Eg - C#)
  • A dynamically typed language (Data types are checked at runtime. Eg - Python/Javascript)
    Experience of strong vs. weak typing is also useful.

Some different runtime styles:

Lower level stuff:

  • Something fairly low level (Eg - C)
  • Some dialect of assembly (Eg - NASM)

On top of that I would say you need experience of some concurrent programming and something event driven. You should probably also make sure you know something about the various domains such as web programming (client & server), rich client development/desktop, games. You might also want to learn about embedded programming, or dedicated hardware (like games consoles), and mobile development is becoming an increasingly relevant domain.

Others have also mentioned that it's worth getting some experience of Generic programming and Meta programming approaches.

When you learn these paradigms avoid just learning the syntax and writing in your old style. I've seen many C# devs write JavaScript as if it's statically typed. Don't do this, try to learn the language paradigms and embrace them.

If you've done all of this, the differences between languages will become largely syntactical so switching will become a fairly simple exercise of learning some new syntax.

Don't forget though that modern programming is almost always dependant on a framework, so familiarising yourself with the common and popular frameworks for each language you learn is also critical. Knowing C# is irrelevant without .net.

share|improve this answer
5  
How is HTML declarative in the given sense? "Goal -> Action"? It doesn't do anything really. –  Felix Dombek Dec 23 '10 at 14:42
1  
A great declarative language that I can only recommend looking into is Prolog. It's different from anything else -- no functions (but relations that work either way around), no explicit control flow (the interpreter solves everything for you), just one great data structure (terms, nothing else is needed.) It's incredibly fast in what it does, doing millions of unifications and inferences per second -- and the time needed to develop something is about as short as in Python compared to C/C++. –  Felix Dombek Dec 23 '10 at 14:50
1  
@Felix: HTML, goal = "I want a label and a text box". Action = The layout & graphics engines figures out how to draw them. The details are down to the individual browsers. You only define what you want not how to do it. See here. I agree though, It's not really a "language" as such. Prolog is a better example, I'll update. –  Simon P Stevens Dec 23 '10 at 15:17
1  
+1 For a good list of types, language choices are a little away from the paradigm in places, but overall excellent. –  Orbling Dec 23 '10 at 15:38
1  
By the way, you should add "Different domains/levels of abstraction" : web, interactive web, desktop tools, desktop games, persistant games are not built the same way as constraints and distance to the hardware is different, making the languages choice (or even existence) more obvious to the one wanting to understand what is it to be agnostic. –  Klaim Dec 23 '10 at 15:49
show 10 more comments

Reading your question and some of the answers one can have the impression that you equal "language agnosticism" with "knowing every paradigm on earth".

I'm not sure whether knowing every paradigm that exists or knowing an assorted range of languages, spanning several paradigms and types of languages makes you "language agnostic".

It's like saying that having practiced all religions makes yourself religiously agnostic.

I think a language agnostic person regarding programming languages should be someone that doesn't know how to program in any language at all or doesn't care what language he/she is asked to programm with.

That said, some people say a true programmer can program in any language given access to that language's documentation.

If that is what you mean by "language agnostic" then almost any experienced programmer can program in any language he/she gets forced to work with, given access to the language documentation.

Maybe you want to be "language polytheist".

I myself am competent in several language paradigms but I'd prefer OOP when it aplies. So I guess I'm not agnostic.

You will hardly find anyone who doesn't prefer a certain paradigm or language given the liberty to choose.

share|improve this answer
add comment

It's not just the languages, Java itself has so many different modes that you could spend years just learning them all. You could learn:

  • J2EE features like Messaging and Persistence and the various servers
  • jsp and Apache-oriented toolkits
  • ant, maven and other build systems (Languages themselves).
  • The whole Groovy/Grails world
  • all the apache commons APIs
  • testing systems (Mocking, JUnit)
  • GUI builders like Swing, GWT...

And a hundred things I'm missing--JUST within java.

If you spend years covering the breadth (learning every language) you'll have trouble gaining the depth to work effectively in any one of them.

I'm not saying that learning a new language is EVER a problem, you shouold be actively doing so! I try to pick my next job based on what I can learn (what I haven't done yet), but I don't often pick a random language and learn it any more--Last time I tried that was with Scala and I left somewhat humbled...

share|improve this answer
    
To "the whole Groovy/Grails world" you could add ", the whole Scala/Play!2 world, the whole JRuby/Rails world, and the whole Clojure/Noir world". –  Vorg van Geir Apr 3 '13 at 14:37
    
I agree, wrote that a while ago and was just pulling things off the top of my head--although I'd probably just pick one of the web frameworks and go with it. –  Bill K Apr 3 '13 at 15:36
add comment

I don't think you can become truly language agnostic. I find that I "think" in my current language (at the moment C#).

However, having said that, I think you might be able to separate the design from the code by trying to think in pseudo code rather than a specific language, and actually write it down in this format. This could help you concentrate on the design and architecture decisions rather than the implementation in your current language. The drawback with that - as Simon points out - is that the language and framework you ultimately use will inevitably influence the design. So as your design develops it will become increasingly tied to the language & framework.

share|improve this answer
    
+1 for "You can't be truly language agnostic". But I don't quite agree with your second paragraph. I do think it's important to design for the language & framework you are going to use. –  Simon P Stevens Sep 7 '10 at 11:32
    
@Simon - you've got a good point about designing for the framework. I'll update the answer. –  ChrisF Sep 7 '10 at 11:36
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.