[racket] Where to learn advanced programming skills?

From: Norman Gray (norman at astro.gla.ac.uk)
Date: Mon Jul 22 04:44:00 EDT 2013

Neil and Ben, greetings,

On 2013 Jul 22, at 05:20, Neil Van Dyke <neil at neilvandyke.org> wrote:

> Also, when you're getting programming experience, my suggestion is *not* to do it as rote practice, like trying to master just the mechanics of playing a particular piece on a musical instrument.  Instead, I suggest doing programming as experiments in method, like a creative performer or an innovative composer, and pick up experience with the rote mechanics along the way.  You will wind up with mistakes, but you will learn from them, and you will also wind up with wins you would not have if you did not experiment. Programming has a lot less material available to learn via books than, say, medicine does, and you can experiment without killing any patients (just delete the patient's file, quietly, and no one need know).  This is all hand-wavy, but I think it's a way to think about programming that results in a greater mental toolbox.  It beats treating programming like a clerical skill, or pretending that programming is understood by anyone better than it is.

Very much so.

My own practice with respect to new languages, and unfamiliar concepts within them, is to dabble enough to get the point -- what is the bit of special sauce which that language or concept brings -- but not go much further.  That way, when I come across a problem which could benefit from that magic I can (i) recognise that, and (ii) go into the documentation properly, with a concrete problem to solve.  This presumes, of course, that the context is friendly -- in terms of collaborators, time and risk -- to the idea of experiments.

I've been dying to find a problem which _needs_ Haskell for a few years now; and it was a year or so ago that I discovered Racket 'units' were exactly what I needed for puzzle within a project then (before that I was aware of them but thought 'what's the point?'; after running into this problem, I read their documentation properly, with a particular goal in mind).

Another example: I popped up earlier in this thread with the request for an example of monads in Racket.  Like you, Ben, I've 'read the book' (in this case a rather abstract/formal description of monads). and understood it in formal terms.  When I've fully digested Matthias's and Joe's excellent examples, I anticipate that I will 'get' monads and their application, but I won't at that point start working through exercises or search my code for places where I can retro-fit monads, and nor will I feel able to teach anyone else about them.  But before long, I expect to run into some problem where I want to use something like global state; I'll think about make-parameter, and then I'll think '...or, hmmm, a monad', and at _that_ point, I will be Enlightened.

A book I can recommend in this context is "Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages" (Bruce A. Tate, Pragmatic Programmers, 2010; <http://pragprog.com/book/btlang/seven-languages-in-seven-weeks>).  That leads you through the dabbling in seven very different languages (namely Clojure, Haskell, Io, Prolog, Scala, Erlang, and Ruby).  The chapters on Scala and Ruby left me cold, the minimal Haskell there I already knew, Prolog will probably remain a curiosity for me (though who knows), Erlang is now on my looking-for-a-problem list, Clojure I learned properly for a project last year, and Io I considered and rejected for a project a couple of months ago.

We're all still learning how to learn.

All the best,


Norman Gray  :  http://nxg.me.uk
SUPA School of Physics and Astronomy, University of Glasgow, UK

Posted on the users mailing list.