[racket] Where to learn advanced programming skills?

From: Neil Van Dyke (neil at neilvandyke.org)
Date: Mon Jul 22 00:20:04 EDT 2013

Ben Duan wrote at 07/21/2013 10:25 PM:
> In this mailing list, I can always find some concepts which are not 
> familiar to me. For example `monad' and `parameterize'. I don't know 
> how to learn about these kind of advanced programming skills 
> systematically. So I'm asking for your suggestions on where I can go next.

"Monad" is a concept from pure functional programming that is almost 
never used in Racket (although people have implemented monads using 
Scheme and Racket).  If and when you decide you want to learn pure 
functional programming, I suspect you'd take a detour from Racket at 
that time, and spend at least a couple months working through a book and 
language designed specifically for functional programming, like Haskell.

"Parameterize" is both a generic term you'll find in discussions of many 
languages, and "parameterize" is also the name of a special syntactic 
form in Racket that has very narrow meaning, compared to the generic 
meaning.  Here's one practical view of Racket parameters, being 
imprecise with terminology... A Racket parameter, in the sense of 
"make-parameter" and "parameterize" (you can look them up in the 
searchable Racket documentation) is a way to implement a mutable 
variable that is global and/or has dynamically-scoped bindings.  Changes 
to these variables can be scoped dynamically within a "parameterize" 
context, and also scoped within threads.  Use parameters for mutable 
global state that you don't want to keep passing around as arguments 
between procedures, and for thread-specific state that you don't want to 
keep passing around.  Use "parameterize" when you want to establish a 
new dynamic scope for a mutable variable, such as for thread-local 
state, or if you with to temporarily override a value within the same 

> I have read some commonly recommended books like:

You've read a lot already.  I don't know how much practical programming 
experience you have, but this reminds me to make a suggestion for anyone 
reading this email who is learning programming and doing a lot of reading...

If someone has access to a computer, then my suggestion at this point is 
make sure that they are spending more time practicing programming than 
they are spending on reading.

By reading books and doing problem sets only, and reasoning about 
programming in their head atop that, then someone might be able to 
understand programming theory as a mathematician might.  But if they 
want intuition and insight into how to build and evolve sustainable 
systems in the real world, then I'm not aware of any substitute for 
practical experience in programming.

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.

Neil V.

Posted on the users mailing list.