I’m teaching programming to my youngest brother. Although he is seventeen years old and has been using a computer for a considerable time, his only experience beyond the common user realm is developing some animations and simples games with Flash.
I chose Smalltalk as our starting language as I believe it’s perfect both for beginners (for the matter, I also believe it’s perfect for professionals): it’s purely object-oriented, has a simple syntax, and the image-based environment favors a fast edit-run-debug cycle without requiring beginning programmers to understand intermediate stages like compiling when they still don’t need to. The language is also very linear and the basic concepts — objects, messages and classes — can be quickly understood. I’m using both Squeak and VisualWorks as our Smalltalk environments as they fit different niches: Squeak can be used to best explain basic concepts given its explicit educational features, and VisualWorks is better integrated to the platforms it runs one making it a more familiar environment.
Building on the basic concepts, we created some simple “programs.” Firstly, we created a program to find the divisors of a number. Then we used it to created another program to find if a number is prime, using the knowledge acquired in the first program. Obviously, we used a very simple approach to build those programs, as I only wished to explain how languages work, and how to think algorithmically.
Amusingly enough, my brother’s biggest problem so far has been the fact that almost all languages are strongly English-based. Smalltalk more so, as it’s tries to stay as close to a natural language as it can. So, my brother has to struggle a bit to remember the spelling of the messages he is using.
On the other hand, my problems is to know how to explain and administer the right amount of knowledge at the proper time. I’m trying to describe the basic concepts without going too much into implementation details. Again, Smalltalk helps as it hides the common distinctions between different programming constructs as loops and branching — everything can be expressed in terms of message sending between the objects that make a program. Even so, I’m a little lost. I don’t know how far I can go. For instance, how do I explain Boolean logic? We have already used the concepts, but I didn’t make them explicit.
In short, my brother is a better student than I am a professor
I can remember how I learned the concepts in the high school, but I don’t remember how I was taught. I fell in love with programming in the first day, and decide to ignore the classes and learn by myself. And after you learn the concepts, learning a new language is only a matter of understand the syntactic and semantic differences of the new language. The basic comprehension is there; one only need to apply it to the new language. The hard task is to pass those concepts to another person. Well, at least we are having a lot of fun.
Anyway, if you have any pointers to good teaching material, or even tips and personal experiences, please let me know. Any help is appreciated.