Skip to content

Instantly share code, notes, and snippets.

@amirrajan
Last active December 24, 2015 14:59
Show Gist options
  • Save amirrajan/6816606 to your computer and use it in GitHub Desktop.
Save amirrajan/6816606 to your computer and use it in GitHub Desktop.
Language observations, subject to change.

#So you want to learn another language?

Hurray! Someone sent you here or you found this some how! Here are my tips for learning a new language.

##Disclaimer

This text is a work in progress, please comment and contribute as you see fit. These are my opinons on language progression based on personal experience, not hard fast rules. If you have any tips to help others please share in the comments or fork this gist and add your own opinions.

##Here is a list of languages

  • C#: primarily OO, primarily static. Multi-paradigm: functional (but not as good as F#) and dynamic (but not as good as Ruby)
  • Ruby: primarily OO, dynamic. Multi-paradigm: functional (more so than C#, but not as good as F#)
  • F#: primarily functional, primarily static. Multi-paradigm: OO (dare I say as good as C#)
  • Scala: Scala is to Java as F# is to C# (mostly)
  • Clojure: strictly functional, dynamic, recently got opt-in static
  • Haskell: strictly functional, strictly static
  • Javascript: object oriented with first class functions, dynamic/prototypical. Multi-paradigm: makes me sad if you apply C# style OO to JS (see comments for clarification https://gist.github.com/amirrajan/6816606#comment-922012)
  • Erlang: non-strict functional (with optional types) in the small, but Kay-ish OO in the large. Joe Armstrong, the inventor of Erlang calls it a "Concurrency Oriented" language. Also, Elixir is a new dialect (quite promising IMHO) (see comments for clarifications https://gist.github.com/amirrajan/6816606#comment-922018)

##Hey! Language X isn't listed! And it's Awesome!

Write it in the comments/fork this gist, send a tweet to @amirrajan and I'll add to the list.

##I disagree with these approaches (and/or) langauge explanations!

Leave a comment and help others, fork this gist and give your perspective. The more the merrier!

##Be Nice with your comments

##So where to start???

Here are some recommendations on where to start. Again, this is my personal opinion, please feel free to leave a comment on this gist for others to benefit from. Also, take your time with this, you won't get proficient over night (I'm still learning too).

###Baseline

It may help to baseline in your preferred language.

Implement the following coding problems in the language of your choice:

Prime Factors: http://amirrajan.net/meta/2013/10/06/TDD-the-wombo-combo-of-software-dev/#getstarted

Mancala: https://gist.github.com/amirrajan/2153731

Conway's Game of Life: http://en.wikipedia.org/wiki/Conway's_Game_of_Life

##I'm a C# dev, where do I start?

  • Do the Baseline Section

  • Think dynamically in C#:

Watch this video: http://vimeo.com/43659055

Read this wiki/blog entry: https://github.com/amirrajan/Oak/wiki/gemini-deep-dive

  • Do the Baselines in the following order and languages: Ruby, JavaScript (using NodeJS), F#, Clojure

  • Baseline again in C# (how does it feel?), try other languages in the list!

##I'm a Ruby dev, where do I start?

  • Do the Baseline Section in Ruby

  • Do the Baselines in the following order and languages: JavaScript (using NodeJS), Clojure, ObjectiveC or C# (Mono), Scala

  • Baseline again in Ruby (how does it feel?), try other languages in the list!

##I'm a JavaScript dev, where do I start?

  • Do the Baseline Section in Javascript

  • Do the Baselines in the following order and languages: Ruby, Clojure, ObjectiveC or C# (Mono), Scala

  • Baseline again in JavaScript (how does it feel?), try other languages in the list!

##I'm a Java dev, where do I start?

  • Do the Baseline Section in Java

  • Do the Baselines in the following order and languages: ObjectiveC or C# (Mono), Scala, JavaScript (using NodeJS), Ruby, Clojure

  • Baseline again in Java (how does it feel?), try other languages in the list!

##With regards to language learning order

I tried to order the languages in such a way so that it eases you into newer languages. As Björn Rochel (@BjRo) has stated in the comments, you may feel comfortable in deviating from the orders perscribed above.

##My primary language isn't here!

I can only speak to language I've worked with. If you can provide any tips, please comment and let me know via twitter: @amirrajan and I'll update as best I can.

@BjRo
Copy link

BjRo commented Oct 6, 2013

The only remark I would have is regarding the 'Where to start?' sections and the ordering of the different languages.

I think there's room for alternative paths, focussing on different aspects or personal preferences. For instance one learning path might lead from Java over Ruby to Erlang, building and extending more on more on the Kay-ish message passing idea.

Another way might lead from Java over Scala to Clojure or Erlang, focussing more on functional concepts (Or C# -> F# -> Haskell).

What I like about those paths, is that it allows you to somewhat build upon your existing knowledge step by step, making it easier to leave the comfort zone one step at a time. It's just less scary for some people, you don't have the feeling of standing in front of a giant mountain with no clue how to conquer it :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment