views:

453

answers:

16

I was reading The Pragmatic Programmer last night and it recommends learning a whole host of languages as you go through your career - even if you'll never use them. I'd always thought this would be a good idea, but the book has given me enough impetus to think about it seriously.

It also mentions (words to the effect of) "learn object oriented design and you'll code pure C programs differently".

I could go and (re)learn Java, but it seems perhaps an easy option given it's a language that follows a lot of the same principles as C#. I will probably still (re)learn Java at some point, but I'm quite interested first of all in what languages would be sufficiently different in their pattern of thinking that I would learn a different perspective - or just a whole different way of thinking about how to code a program.

Functional programming perhaps? Any suggestions are welcome, but please try and provide a short reasoning as to why they might be interesting and "new" from a C# user's perspective.

+5  A: 

Try to learn another paradigm.

I'd suggest Lisp for functional programming for historical reasons or Erlang for a more "commercial" language, and Prolog for declarative (a.k.a logical) programming.

It will give you a different way to see things. There are a lot of programmers that keep getting surprised by the possibilities of functional programming (ability to prove a function right, easy parallel integration no side effects ,etc) as well as the possibilities of declarative programming for certain task that are just now well suited for imperative programming (patter recognition for example, or rule based systems)

Jorge Córdoba
+15  A: 

I suggest learning F#. You are already familiar with the .NET Framework so you don't have to deal with it. You can focus on the language and learn functional programming ideas.

Most likely, if you switch back to C#, you'll see yourself doing many stuff in functional style and will be more productive in that language too.

Mehrdad Afshari
+6  A: 

F# is a good option. But also, dynamic languages - like maybe Javascript. Also, less C-centric things like Lisp or XSL.

Get really good at them.

Cheeso
+19  A: 

Functional paradigm - Scheme, Haskell, Erlang, F#

Scripting - Perl, Python, Ruby

Also one of those APL variants like J, K or Q

Dare I mention C? A lot of people learning programming today have very little exposure to the metal, and C helps you see the light.

rep_movsd
Oh! So *that's* why F# looks so friggin' weird to me. Didn't realize it was another one of them functional types ;)
Mark
Don't forget lua!
RCIX
Note that F# is a multi-paradigm language. I'd recommend some basic Haskell first before learning F# - or else you could end up learning the syntax but not really learning how to think in function terms.
FinnNk
+3  A: 

Try C. It is good to learn how to deal with pointers and manual memory management, especially when coming from a "memory managed" world such as .NET or Java. This will give you a great perspective of "how things works" internally within a software program.

Or you could do like me: I'm a C# programmer but in my free time I write code in Z80 assembler. Anyway this is maybe a bit too freak. :-)

Konamiman
+3  A: 

I haven't tried it yet, but F# seems to be a good language to learn. It is functional but allow imperative style too. It also leverages the .NET framework and libraries, so a lot of your existing knowledge can be reused. Maybe I should try it myself soon...

Mark Byers
+5  A: 

Try the introduction to functional programming series on Channel 9 - Erik Meijer talks about the fundamentals and covers Haskell.

http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/

Matt Breckon
+7  A: 

Functional programming, definitely. A new paradigm lets you see your existing knowledge and experience in a new light, something that another imperative language can never do to such an extent.

If you want to stick to .NET, try F#. For something completely new, I'd recommend Haskell; there is a huge amount of beginner's information, and the community is wonderful and incredibly helpful.

Thomas
A: 

C#/.net or Java doesn't matter much, the basic concepts are identical, even if there are some features (some only compiler magic, some more deep such as generics) which differ.

Get used to functional programming, specialized languages such as XSLT, XQuery, T-SQL, PL/SQL, OCL etc. to get confronted with more different concepts and approaches. The SQL dialectrs for instance require you to think is set based operations to get efficient code. XSL transformations are working on structured data. Not one tool fits all requirements.

Lucero
+11  A: 

May I suggest that you look out of the development box and look at other software aspects?

Most programmers avoid learning and dealing with issues of user psychology and usability at all costs. Most ignore anything related to graphical design which is a pity.

Since I got interested in UI and graphical design, I found it to be a revelation. You just can't look at software your create with the same eyes any more. You begin to think on a different level.

Developer Art
A: 

Apoligies as this is a little off topic but as you mentioned pattern of thinking giving you a different perspective, if you dont already own it i would recommend you buy the book:

Head First Design Patterns

Its an excellent way to find out about design patterns, as well an interested discussion around object-oriented design. Well worth the purchase.

kevchadders
+3  A: 

Head exploding is a form of broadening your mind right? If so, try Objective-C.

rein
lol, true though.
RCIX
+5  A: 

Any functional language for the mindset - it's rewiring your brain to be abel to think differently about thesame problem, which quite often makes the solution easier.

Assembler to understand the giants we are shoulderstanding.

peterchen
+2  A: 

i wonder no one has said it already, c++ / c! this will teach you the underlying basics of things that you use every day.

Orentet
Adam Luchjenbroers
A: 

If I were taking the time you are taking: The ability to write assembly or D well is what I would take on next.

If I were you years ago, and in retrospect: C++ templates in depth, while not strictly a 'language', is worthy enough to say it has been the most revolutionary language in changing my perspective of programming. Start with Alexandrescu's Modern C++ design, then build several programs with your new knowledge, or try to improve existing classic libraries, for starters. There's a ton to learn.

Justin
A: 
  1. Functional Language - Scheme, Haskell
  2. Dynamic language - Ruby , Python
  3. Prototype based OOp Language - Javascript
  4. Logic programming language - Prolog
Tinku
....And yes if you have multithreading in mind then Erlang as well
Tinku