Alan Kay would disagree, and he's got some experience teaching programming to children. See my answer to your post's sibling.
Why is it far more important that people get an understanding of simple procedural logic first? (And what is it exactly? I've had a 'procedural' feeling when seeing:
- assembly code
- structured programming (Algol 60 and descendants)
- even some kinds of logic programming)
I don't have my computer around, so replying with a throwawy account. Wall of text!
> While there are many oddities, I think Python lets you ignore them
Yes, thankfully. But libraries that will make programming interesting for children usually have a rather sophisticated design, including an object-oriented interface. Pygame is slightly too complex for my taste and installing it on Windows is a pain (not Python's fault). I've tried Pyglet on that platform, despite its hard API, and am I right now comparing two students, one on each framework (although the Pygame one uses pgrun).
Once they've used Python as a means to get a game displayed, it seems easier to teach Python's useful minutiae as it helps them code. Not enough experience to assert this with certainty though.
> Then, once you do want to introduce objects, I think Python's class system can be kept simple enough to begin with, and the parts that are inherently tricky (like self) have equivalently tricky parts in most other languages anyway.
Python's OOP really has more complexity than needed. Smalltalk does objects simpler. Alan Kay used it to teach programming to children (the seventies version, the public '82 version had more stuff, meant for adults.) Children can learn to program _starting_ with OOP, not structured programming, but Python (or Java, or...) will not help you there. It seems to expect its user to understand OOP in terms of structured programming, which a practicing programmer certainly can, but a child with limited abstract thought?
Interestingly, Alan Kay was a lisper, which brings me to...
> I don't know a lot about Smalltalk, but Scheme is an interesting idea for a first language.
Can't be sure without trying it, but probably. The scheme community has projects in teaching CS through game programming, with at least one scheme dialect for games and accompanying IDE where images are first-class objects, displayed in the code.
> I think a course teaching programming that goes into async IO, needs to discuss 'global' (something I've still used only twice in 5 years of Python), talks about decorators, etc, is doing something seriously wrong.
I can see how it came out that way, but I don't teach async IO to children; I try to teach some Python to colleagues from time to time.
As for 'global', was your programming activity the one of a beginner? When you have someone that successfully wrote a single script with variables and control structures, you will want them to start writing functions to complete the introduction to structured programming. You will want to make them reuse the existing state, and once they discover the limitations of it, slowly introduce local variables, scoping rules and so on. My students often have the right reasoning at this stage but forget 'global', _repeatedly_ (that's the important part -- hint of a bad UI), which means I have to explain scoping rules, which seem to them like unnecessary wanking at this point.
Guido's attention to newbie-friendliness is obvious, but Python is old and has accumulated cruft, and its developers have blind spots. Zed Shaw listed some of them. Also don't forget that a professional in IT has developed a thick skin when it comes to complexity, or less charitably, learned helplessness in the face of shitty design. Where we think a system's idiosyncrasies are mere details (or worse, the right way to do things), an innocent mind will refuse to engage.
Why is it far more important that people get an understanding of simple procedural logic first? (And what is it exactly? I've had a 'procedural' feeling when seeing: - assembly code - structured programming (Algol 60 and descendants) - even some kinds of logic programming)