> The #1 thing I told him to do is start by programming small, useless programs
I couldn't disagree more. Seeing useful results on day 1 is a major motivator. Doing purely theoretical tasks for the sake of understanding is mind-numbingly boring. You only need to get into the details after you see the way to just get it working. I think this is why weakly typed, high-level scripting languages are so good at starting out with. Learning pointer arithmetic in C as a first exercise never made anyone want to program more.