It's tempting for us, as programmers, to consider Python an easier language to learn than C. I'm not so sure. Python is simple for programmers to learn because it uses a large number of common programmery things: lists, hash tables, classes, modules, etc. Things that beginners won't have a clue about. C doesn't have any of these.
Sure, it takes a while for you to wrap your head around pointers. But it also takes a while for you to wrap your head around inheritance. By virtue of being a smaller language, C has less of these things to wrap your head around.
If you need a dynamic array, you have to build it yourself from what you already know. Instead of having to learn yet another opaque concept, you're reinforcing your knowledge of pointers and dynamic memory allocation. Double benefit!
And once you know C, it can give you a boost towards learning other languages - most of them are implemented using C! If I don't understand something, I can always look at the source to see how it works. Since they're implemented in C, many languages tend to map easily to C concepts.
The same cannot be said about going the other way. A Ruby programmer learning C has to unlearn all the assumptions and niceties Ruby has spoiled them with. How much of Ruby is going to be applicable to C?
Python might not be an easier language to learn than C, but it certainly an easier language to be productive in. Unless your student is highly motivated you will need more exciting examples than writing your own dynamic array to keep him going. Building things that actually do something useful is nearly impossible for a beginner using C, but definitely within reach if you leverage Python's huge libraries.
As long as you want to teach someone programming and not computer science I think a high level language is much better suited.
I just think when you're learning how to use lists and hash tables, you're learning how to abstract, decompose, solve problems, which is the 'science' part... when you're learning about pointers, also, but the emphasis is more learning about the 'computer' part .
If you want to do 'computer science' or engineering, eventually you have to learn both.
But for a beginner, who might end up just casually coding as part of another discipline, or wants to understand computers as part of a liberal arts education and never goes past the first language, I think the higher level abstractions are a better place to start. (And the languages are a little gentler)
There's so much existing C code in the world powering almost everything we do that you just have to know C in order to get a thorough understanding of computing.
C is to computer science as latin is to medicine. All medical doctors need to know a little bit of latin
Sure, it takes a while for you to wrap your head around pointers. But it also takes a while for you to wrap your head around inheritance. By virtue of being a smaller language, C has less of these things to wrap your head around.
If you need a dynamic array, you have to build it yourself from what you already know. Instead of having to learn yet another opaque concept, you're reinforcing your knowledge of pointers and dynamic memory allocation. Double benefit!
And once you know C, it can give you a boost towards learning other languages - most of them are implemented using C! If I don't understand something, I can always look at the source to see how it works. Since they're implemented in C, many languages tend to map easily to C concepts.
The same cannot be said about going the other way. A Ruby programmer learning C has to unlearn all the assumptions and niceties Ruby has spoiled them with. How much of Ruby is going to be applicable to C?